UNPKG

@pkme/widget-bridge

Version:

TypeScript React bridge client for Secret City Games widget integration across Framer, Figma, and web platforms

84 lines (73 loc) 2.33 kB
/** * @pkme/widget-bridge - Main Module (CommonJS) */ const { bridge } = require('./bridge.js'); // Import React hooks const reactHooks = require('./react.js'); module.exports = { bridge, BridgeError: class BridgeError extends Error { constructor(message, code) { super(message); this.name = 'BridgeError'; this.code = code; } }, MESSAGE_TYPES: { SAVE_GLOBAL: 'data/saveGlobal', SAVE_ITEM: 'data/saveItem', SUBSCRIBE: 'data/subscribe', UNSUBSCRIBE: 'data/unsubscribe', GLOBAL_UPDATED: 'data/globalUpdated', ITEM_UPDATED: 'data/itemUpdated', ITEM_DELETED: 'data/itemDeleted', NAVIGATE: 'navigation/navigate', BACK: 'navigation/back', GET_CURRENT: 'navigation/getCurrent', READY: 'app/ready', CARD_COMPLETED: 'app/cardCompleted', NAVIGATE_TO_NEXT_CARD: 'app/navigateToNextCard' }, // Utility functions navigateToNextCard: async function(params = {}) { await bridge.complete({ completed: true, ...params }); if (params.nextCardId) { await bridge.navigate('/games/' + bridge.context?.gameId + '/cards/' + params.nextCardId, params); } }, completeCard: async function(completionData = {}) { const dataToSave = { completed: true, completedAt: Date.now(), ...completionData }; await bridge.setItem(dataToSave); await bridge.setGlobal({ cardCompletion: dataToSave }); await bridge.send('app/cardCompleted', dataToSave); if (completionData.nextCardId) { await this.navigateToNextCard({ completed: true, ...completionData }); } }, navigateToCard: async function(cardId, cardData = {}) { await bridge.navigate('/games/' + bridge.context?.gameId + '/cards/' + cardId, { nextCardId: cardId, ...cardData }); }, savePuzzleProgress: async function(progress, additionalData = {}) { await bridge.setItem({ progress, timestamp: Date.now(), ...additionalData }); }, updateGlobalGameState: async function(updates) { await bridge.setGlobal(updates); }, // Re-export React hooks for Framer compatibility useBridge: reactHooks.useBridge, useBridgeData: reactHooks.useBridgeData, useGlobalData: reactHooks.useGlobalData, useItemData: reactHooks.useItemData, useNavigation: reactHooks.useNavigation };