import { i18next } from '@tencentcloud/uikit-base-component-react'; import { buildChatOfflinePushInfo } from './utils'; import type { OfflinePushInfoConfig, OfflinePushInfoContext, ChatOfflinePushInfo, ChatOfflinePushInfoStaticConfig, CallOfflinePushInfo, } from './types'; // Module-level config storage (singleton pattern, no re-render needed) let offlinePushConfig: OfflinePushInfoConfig | null = null; /** * Hook for managing offline push info configuration and generation * Internal use only - users access via useMessageInputState */ export function useOfflinePushInfo() { /** * Set or clear offline push configuration * @param config - Config object with chatOfflinePushInfo and/or callOfflinePushInfo, null to disable */ function setOfflinePushInfo(config: OfflinePushInfoConfig | null): void { offlinePushConfig = config; } /** * Create offlinePushInfo for CHAT scene based on current config * @param context - Message context (conversation, messageType, payload) * @returns Generated offlinePushInfo or undefined if not configured */ function createChatOfflinePushInfo(context: OfflinePushInfoContext): ChatOfflinePushInfo | undefined { // Not configured - return undefined (opt-in) if (!offlinePushConfig?.chatOfflinePushInfo) { return undefined; } // Static config mode - auto-generate title/desc/extension const chatConfig = offlinePushConfig.chatOfflinePushInfo as ChatOfflinePushInfoStaticConfig; const t = (key: string) => i18next.t(key); return buildChatOfflinePushInfo( context.conversation, context.messageType, context.payload || {}, t, chatConfig.androidInfo, chatConfig.apnsInfo, ); } /** * Get offlinePushInfo for CALL scene * @returns CallOfflinePushInfo or undefined if not configured */ function createCallOfflinePushInfo(): CallOfflinePushInfo | undefined { return offlinePushConfig?.callOfflinePushInfo; } /** * Check if offline push is enabled * @returns true if config is set */ function isEnabled(): boolean { return offlinePushConfig !== null; } return { setOfflinePushInfo, createChatOfflinePushInfo, createCallOfflinePushInfo, isEnabled, }; }