mirror of
https://github.com/zimplexing/OrionTV.git
synced 2026-02-04 03:36:29 +08:00
- Add targetPage field to remoteControlStore for message routing - Update settings page to filter messages by target page - Update search page to filter messages and pass target context - Add clearMessage method to prevent duplicate message handling - Ensure remote input only affects intended target page
71 lines
2.2 KiB
TypeScript
71 lines
2.2 KiB
TypeScript
import { create } from 'zustand';
|
|
import { remoteControlService } from '@/services/remoteControlService';
|
|
|
|
interface RemoteControlState {
|
|
isServerRunning: boolean;
|
|
serverUrl: string | null;
|
|
error: string | null;
|
|
startServer: () => Promise<void>;
|
|
stopServer: () => void;
|
|
isModalVisible: boolean;
|
|
showModal: (targetPage?: string) => void;
|
|
hideModal: () => void;
|
|
lastMessage: string | null;
|
|
targetPage: string | null;
|
|
setMessage: (message: string, targetPage?: string) => void;
|
|
clearMessage: () => void;
|
|
}
|
|
|
|
export const useRemoteControlStore = create<RemoteControlState>((set, get) => ({
|
|
isServerRunning: false,
|
|
serverUrl: null,
|
|
error: null,
|
|
isModalVisible: false,
|
|
lastMessage: null,
|
|
targetPage: null,
|
|
|
|
startServer: async () => {
|
|
if (get().isServerRunning) {
|
|
return;
|
|
}
|
|
remoteControlService.init({
|
|
onMessage: (message: string) => {
|
|
console.log('[RemoteControlStore] Received message:', message);
|
|
const currentState = get();
|
|
// Use the current targetPage from the store
|
|
set({ lastMessage: message, targetPage: currentState.targetPage });
|
|
},
|
|
onHandshake: () => {
|
|
console.log('[RemoteControlStore] Handshake successful');
|
|
set({ isModalVisible: false })
|
|
},
|
|
});
|
|
try {
|
|
const url = await remoteControlService.startServer();
|
|
console.log(`[RemoteControlStore] Server started, URL: ${url}`);
|
|
set({ isServerRunning: true, serverUrl: url, error: null });
|
|
} catch {
|
|
const errorMessage = '启动失败,请强制退应用后重试。';
|
|
console.info('[RemoteControlStore] Failed to start server:', errorMessage);
|
|
set({ error: errorMessage });
|
|
}
|
|
},
|
|
|
|
stopServer: () => {
|
|
if (get().isServerRunning) {
|
|
remoteControlService.stopServer();
|
|
set({ isServerRunning: false, serverUrl: null });
|
|
}
|
|
},
|
|
|
|
showModal: (targetPage?: string) => set({ isModalVisible: true, targetPage }),
|
|
hideModal: () => set({ isModalVisible: false, targetPage: null }),
|
|
|
|
setMessage: (message: string, targetPage?: string) => {
|
|
set({ lastMessage: `${message}_${Date.now()}`, targetPage });
|
|
},
|
|
|
|
clearMessage: () => {
|
|
set({ lastMessage: null, targetPage: null });
|
|
},
|
|
})); |