@@ -11,6 +11,7 @@ import {
1111 Database ,
1212 Eye ,
1313 EyeOff ,
14+ ExternalLink ,
1415 Gauge ,
1516 HardDrive ,
1617 Info ,
@@ -41,7 +42,7 @@ import {
4142 useRef ,
4243 useState
4344} from 'react' ;
44- import { bilirecRequest } from '@/lib/api' ;
45+ import { bilirecRequest , openLiveRoom } from '@/lib/api' ;
4546import ConfigurationCenter from '@/components/ConfigurationCenter' ;
4647import RecordingLibrary from '@/components/RecordingLibrary' ;
4748import UpdateCenter from '@/components/UpdateCenter' ;
@@ -153,14 +154,16 @@ function RoomCard({
153154 onAction,
154155 onDelete,
155156 onHistory,
156- onConfigure
157+ onConfigure,
158+ onWatch
157159} : {
158160 room : Room ;
159161 busy : boolean ;
160162 onAction : ( room : Room , action : 'start' | 'stop' | 'split' | 'refresh' ) => void ;
161163 onDelete : ( room : Room ) => void ;
162164 onHistory : ( room : Room ) => void ;
163165 onConfigure : ( room : Room ) => void ;
166+ onWatch : ( room : Room ) => void ;
164167} ) {
165168 const status = room . recording ? 'recording' : room . streaming ? 'live' : 'offline' ;
166169 const statusLabel = room . recording ? '录制中' : room . streaming ? '直播中' : '离线' ;
@@ -272,6 +275,15 @@ function RoomCard({
272275 < Settings2 size = { 15 } />
273276 设置
274277 </ button >
278+ < button
279+ className = "room-action action-watch"
280+ type = "button"
281+ onClick = { ( ) => onWatch ( room ) }
282+ title = { `在线观看 ${ room . name || room . roomId } ` }
283+ >
284+ < ExternalLink size = { 15 } />
285+ 观看
286+ </ button >
275287 { room . recording ? (
276288 < >
277289 < button
@@ -649,6 +661,19 @@ export default function Dashboard() {
649661 } ) ;
650662 } ;
651663
664+ const watchLiveRoom = async ( room : Room ) => {
665+ const url = `https://live.bilibili.com/${ room . roomId } ` ;
666+ try {
667+ if ( '__TAURI_INTERNALS__' in window ) {
668+ await openLiveRoom ( room . roomId ) ;
669+ } else {
670+ window . open ( url , '_blank' , 'noopener,noreferrer' ) ;
671+ }
672+ } catch ( error ) {
673+ pushToast ( error instanceof Error ? error . message : '无法打开直播间' , 'error' ) ;
674+ }
675+ } ;
676+
652677 const executeConfirmed = async ( ) => {
653678 if ( ! confirmState ) return ;
654679 setConfirmBusy ( true ) ;
@@ -970,6 +995,7 @@ export default function Dashboard() {
970995 onDelete = { requestDeleteRoom }
971996 onHistory = { ( selectedRoom ) => openLibrary ( selectedRoom . roomId ) }
972997 onConfigure = { ( selectedRoom ) => openConfigCenter ( selectedRoom . roomId ) }
998+ onWatch = { ( selectedRoom ) => void watchLiveRoom ( selectedRoom ) }
973999 />
9741000 ) ) }
9751001
0 commit comments