| |
| |
| |
| |
| |
|
|
| import { create } from 'zustand'; |
|
|
| interface WidgetIframeState { |
| |
| sendMessageByScene: Record<string, (type: string, payload: Record<string, unknown>) => void>; |
| |
| activeSceneId: string | null; |
| |
| registerIframe: ( |
| sceneId: string, |
| callback: ((type: string, payload: Record<string, unknown>) => void) | null, |
| ) => void; |
| |
| setActiveScene: (sceneId: string | null) => void; |
| |
| getSendMessage: ( |
| sceneId?: string, |
| ) => ((type: string, payload: Record<string, unknown>) => void) | null; |
| } |
|
|
| export const useWidgetIframeStore = create<WidgetIframeState>((set, get) => ({ |
| sendMessageByScene: {}, |
| activeSceneId: null, |
| registerIframe: (sceneId, callback) => |
| set((state) => { |
| if (callback === null) { |
| |
| const updated = { ...state.sendMessageByScene }; |
| delete updated[sceneId]; |
| return { sendMessageByScene: updated }; |
| } |
| |
| return { |
| sendMessageByScene: { ...state.sendMessageByScene, [sceneId]: callback }, |
| }; |
| }), |
| setActiveScene: (sceneId) => set({ activeSceneId: sceneId }), |
| getSendMessage: (sceneId) => { |
| const state = get(); |
| const targetId = sceneId ?? state.activeSceneId; |
| if (!targetId) return null; |
| return state.sendMessageByScene[targetId] ?? null; |
| }, |
| })); |
|
|