@solveo-ai/react-native 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +96 -0
- package/dist/index.d.mts +23 -6
- package/dist/index.d.ts +23 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +11 -5
- package/src/hooks/usePushNotifications.ts +27 -10
package/README.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
React Native SDK for the Solveo AI platform. Build AI-powered chat experiences in your mobile apps.
|
|
4
4
|
|
|
5
|
+
**Supports both React Native CLI and Expo projects.**
|
|
6
|
+
|
|
5
7
|
## Installation
|
|
6
8
|
|
|
7
9
|
```bash
|
|
@@ -10,6 +12,57 @@ npm install @solveo-ai/react-native @solveo-ai/sdk-core
|
|
|
10
12
|
yarn add @solveo-ai/react-native @solveo-ai/sdk-core
|
|
11
13
|
```
|
|
12
14
|
|
|
15
|
+
### React Native CLI Setup
|
|
16
|
+
|
|
17
|
+
For projects created with `react-native init` or Expo Dev Clients:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# Install Firebase for push notifications
|
|
21
|
+
npm install @react-native-firebase/app @react-native-firebase/messaging
|
|
22
|
+
|
|
23
|
+
# Install AsyncStorage (already bundled with this SDK)
|
|
24
|
+
npm install @react-native-async-storage/async-storage
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Firebase Configuration:**
|
|
28
|
+
|
|
29
|
+
1. **Android:**
|
|
30
|
+
- Download `google-services.json` from Firebase Console
|
|
31
|
+
- Place it in `android/app/`
|
|
32
|
+
- Add the Google Services plugin to `android/app/build.gradle`:
|
|
33
|
+
```gradle
|
|
34
|
+
apply plugin: 'com.google.gms.google-services'
|
|
35
|
+
```
|
|
36
|
+
- Add classpath to `android/build.gradle`:
|
|
37
|
+
```gradle
|
|
38
|
+
classpath 'com.google.gms:google-services:4.3.15'
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
2. **iOS:**
|
|
42
|
+
- Download `GoogleService-Info.plist` from Firebase Console
|
|
43
|
+
- Place it in your Xcode project
|
|
44
|
+
- Enable "Push Notifications" capability in Xcode
|
|
45
|
+
- Add to `ios/YourProject/AppDelegate.m`:
|
|
46
|
+
```objc
|
|
47
|
+
#import <Firebase.h>
|
|
48
|
+
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
|
|
49
|
+
[FIRApp configure];
|
|
50
|
+
[UNUserNotificationCenter currentNotificationCenter].delegate = self;
|
|
51
|
+
[application registerForRemoteNotifications];
|
|
52
|
+
return YES;
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Expo Setup
|
|
57
|
+
|
|
58
|
+
For Expo projects (including Expo Go):
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
npx expo install expo-notifications
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**Note:** For push notifications in production, you'll need to configure [Expo Application Services (EAS)](https://docs.expo.dev/push-notifications/overview/).
|
|
65
|
+
|
|
13
66
|
## Quick Start
|
|
14
67
|
|
|
15
68
|
```tsx
|
|
@@ -47,6 +100,49 @@ function ChatScreen() {
|
|
|
47
100
|
}
|
|
48
101
|
```
|
|
49
102
|
|
|
103
|
+
## Push Notifications
|
|
104
|
+
|
|
105
|
+
The SDK automatically detects which push notification system is available and uses the appropriate one.
|
|
106
|
+
|
|
107
|
+
### Setup for React Native CLI
|
|
108
|
+
|
|
109
|
+
Follow the Firebase configuration steps above, then use the `usePushNotifications` hook:
|
|
110
|
+
|
|
111
|
+
```tsx
|
|
112
|
+
import { usePushNotifications } from '@solveo-ai/react-native';
|
|
113
|
+
|
|
114
|
+
function ChatScreen() {
|
|
115
|
+
const { registerDevice } = usePushNotifications({
|
|
116
|
+
mode: 'widget',
|
|
117
|
+
conversationId: 'your-conversation-id',
|
|
118
|
+
autoRegister: true,
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
// Device will automatically register when permission is granted
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Setup for Expo
|
|
126
|
+
|
|
127
|
+
```tsx
|
|
128
|
+
import { usePushNotifications } from '@solveo-ai/react-native';
|
|
129
|
+
|
|
130
|
+
function ChatScreen() {
|
|
131
|
+
const { requestPermission, registerDevice } = usePushNotifications({
|
|
132
|
+
mode: 'widget',
|
|
133
|
+
conversationId: 'your-conversation-id',
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
useEffect(() => {
|
|
137
|
+
requestPermission().then(granted => {
|
|
138
|
+
if (granted) {
|
|
139
|
+
registerDevice();
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
}, [requestPermission, registerDevice]);
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
50
146
|
## Development
|
|
51
147
|
|
|
52
148
|
From the repo root (monorepo), install and build:
|
package/dist/index.d.mts
CHANGED
|
@@ -99,18 +99,35 @@ interface UsePushNotificationsOptions {
|
|
|
99
99
|
* Supports both customer (widget) and agent (dashboard) modes.
|
|
100
100
|
* Handles permissions, registration, and notification events.
|
|
101
101
|
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
102
|
+
* Works with both React Native CLI and Expo projects. Automatically detects
|
|
103
|
+
* which push notification system is available:
|
|
104
|
+
* - React Native CLI: Uses @react-native-firebase/messaging
|
|
105
|
+
* - Expo: Uses expo-notifications
|
|
106
|
+
*
|
|
107
|
+
* SETUP INSTRUCTIONS FOR REACT NATIVE CLI:
|
|
108
|
+
* 1. Install Firebase dependencies:
|
|
104
109
|
* npm install @react-native-firebase/app @react-native-firebase/messaging
|
|
105
|
-
* (or expo-notifications for Expo projects)
|
|
106
110
|
*
|
|
107
|
-
* 2. Configure Firebase
|
|
111
|
+
* 2. Configure Firebase:
|
|
108
112
|
* - Android: Add google-services.json to android/app/
|
|
113
|
+
* Apply plugin in android/app/build.gradle: apply plugin: 'com.google.gms.google-services'
|
|
109
114
|
* - iOS: Add GoogleService-Info.plist to ios/ and configure APNs
|
|
115
|
+
* Add FirebaseAppDelegate methods in AppDelegate.m
|
|
110
116
|
*
|
|
111
117
|
* 3. Add permissions to manifests:
|
|
112
|
-
* - Android: INTERNET, VIBRATE, RECEIVE_BOOT_COMPLETED
|
|
113
|
-
* - iOS: User Notifications capability
|
|
118
|
+
* - Android: INTERNET, VIBRATE, RECEIVE_BOOT_COMPLETED in AndroidManifest.xml
|
|
119
|
+
* - iOS: User Notifications capability in Xcode
|
|
120
|
+
*
|
|
121
|
+
* 4. For iOS, register for remote notifications in AppDelegate:
|
|
122
|
+
* - [UNUserNotificationCenter currentNotificationCenter].delegate = self;
|
|
123
|
+
* - [application registerForRemoteNotifications];
|
|
124
|
+
*
|
|
125
|
+
* SETUP INSTRUCTIONS FOR EXPO:
|
|
126
|
+
* 1. Install expo-notifications:
|
|
127
|
+
* npx expo install expo-notifications
|
|
128
|
+
*
|
|
129
|
+
* 2. Configure in app.config.js:
|
|
130
|
+
* Add appropriate configuration for notifications
|
|
114
131
|
*/
|
|
115
132
|
declare function usePushNotifications(options?: UsePushNotificationsOptions): {
|
|
116
133
|
requestPermission: () => Promise<boolean>;
|
package/dist/index.d.ts
CHANGED
|
@@ -99,18 +99,35 @@ interface UsePushNotificationsOptions {
|
|
|
99
99
|
* Supports both customer (widget) and agent (dashboard) modes.
|
|
100
100
|
* Handles permissions, registration, and notification events.
|
|
101
101
|
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
102
|
+
* Works with both React Native CLI and Expo projects. Automatically detects
|
|
103
|
+
* which push notification system is available:
|
|
104
|
+
* - React Native CLI: Uses @react-native-firebase/messaging
|
|
105
|
+
* - Expo: Uses expo-notifications
|
|
106
|
+
*
|
|
107
|
+
* SETUP INSTRUCTIONS FOR REACT NATIVE CLI:
|
|
108
|
+
* 1. Install Firebase dependencies:
|
|
104
109
|
* npm install @react-native-firebase/app @react-native-firebase/messaging
|
|
105
|
-
* (or expo-notifications for Expo projects)
|
|
106
110
|
*
|
|
107
|
-
* 2. Configure Firebase
|
|
111
|
+
* 2. Configure Firebase:
|
|
108
112
|
* - Android: Add google-services.json to android/app/
|
|
113
|
+
* Apply plugin in android/app/build.gradle: apply plugin: 'com.google.gms.google-services'
|
|
109
114
|
* - iOS: Add GoogleService-Info.plist to ios/ and configure APNs
|
|
115
|
+
* Add FirebaseAppDelegate methods in AppDelegate.m
|
|
110
116
|
*
|
|
111
117
|
* 3. Add permissions to manifests:
|
|
112
|
-
* - Android: INTERNET, VIBRATE, RECEIVE_BOOT_COMPLETED
|
|
113
|
-
* - iOS: User Notifications capability
|
|
118
|
+
* - Android: INTERNET, VIBRATE, RECEIVE_BOOT_COMPLETED in AndroidManifest.xml
|
|
119
|
+
* - iOS: User Notifications capability in Xcode
|
|
120
|
+
*
|
|
121
|
+
* 4. For iOS, register for remote notifications in AppDelegate:
|
|
122
|
+
* - [UNUserNotificationCenter currentNotificationCenter].delegate = self;
|
|
123
|
+
* - [application registerForRemoteNotifications];
|
|
124
|
+
*
|
|
125
|
+
* SETUP INSTRUCTIONS FOR EXPO:
|
|
126
|
+
* 1. Install expo-notifications:
|
|
127
|
+
* npx expo install expo-notifications
|
|
128
|
+
*
|
|
129
|
+
* 2. Configure in app.config.js:
|
|
130
|
+
* Add appropriate configuration for notifications
|
|
114
131
|
*/
|
|
115
132
|
declare function usePushNotifications(options?: UsePushNotificationsOptions): {
|
|
116
133
|
requestPermission: () => Promise<boolean>;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/SolveoProvider.tsx","../src/utils/storage.ts","../src/hooks/useChat.ts","../src/hooks/useRealtime.ts","../src/hooks/useEscalation.ts","../src/hooks/useWidgetConfig.ts","../src/hooks/usePushNotifications.ts","../src/hooks/useAttachments.ts","../src/hooks/useAgents.ts","../src/hooks/useConversations.ts","../src/hooks/useAnalytics.ts"],"names":["createContext","useMemo","SolveoSDK","useState","createCustomerSocket","CustomerSocketManager","createAgentSocket","AgentSocketManager","createStreamingSocket","useEffect","React","useContext","AsyncStorage","useCallback","Platform"],"mappings":"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","file":"index.js","sourcesContent":["import React, { createContext, useContext, useMemo, ReactNode, useEffect, useState } from 'react';\nimport {\n SolveoSDK,\n type SolveoClientConfig,\n createCustomerSocket,\n createAgentSocket,\n createStreamingSocket,\n CustomerSocketManager,\n AgentSocketManager,\n StreamingSocket,\n type Socket,\n} from '@solveo-ai/sdk-core';\n\n// ============================================================================\n// Context Types\n// ============================================================================\n\nexport interface SolveoContextValue {\n sdk: SolveoSDK;\n config: SolveoProviderConfig;\n // Customer socket (for widget mode)\n customerSocket: Socket | null;\n customerSocketManager: CustomerSocketManager | null;\n // Agent socket (for management mode)\n agentSocket: Socket | null;\n agentSocketManager: AgentSocketManager | null;\n // Streaming socket (for AI responses)\n streamingSocket: StreamingSocket | null;\n // Connection helpers\n connectCustomerSocket: (conversationId: string) => void;\n disconnectCustomerSocket: () => void;\n connectAgentSocket: (token: string) => void;\n disconnectAgentSocket: () => void;\n connectStreamingSocket: (conversationId: string) => void;\n disconnectStreamingSocket: () => void;\n}\n\nconst SolveoContext = createContext<SolveoContextValue | null>(null);\n\n// ============================================================================\n// Provider Props\n// ============================================================================\n\nexport interface SolveoProviderConfig extends Omit<SolveoClientConfig, 'platform'> {\n // User identity (optional)\n user?: {\n email?: string;\n name?: string;\n id?: string;\n };\n // Auto-connect options\n autoConnectCustomer?: boolean;\n autoConnectAgent?: boolean;\n conversationId?: string; // For auto-connecting customer socket\n // Error handler\n onError?: (error: Error) => void;\n}\n\nexport interface SolveoProviderProps {\n children: ReactNode;\n config: SolveoProviderConfig;\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\nexport function SolveoProvider({ children, config }: SolveoProviderProps) {\n const sdk = useMemo(\n () =>\n new SolveoSDK({\n ...config,\n platform: 'react-native',\n }),\n [config.apiUrl, config.apiKey, config.token, config.widgetId]\n );\n\n // Socket states\n const [customerSocket, setCustomerSocket] = useState<Socket | null>(null);\n const [customerSocketManager, setCustomerSocketManager] = useState<CustomerSocketManager | null>(null);\n const [agentSocket, setAgentSocket] = useState<Socket | null>(null);\n const [agentSocketManager, setAgentSocketManager] = useState<AgentSocketManager | null>(null);\n const [streamingSocket, setStreamingSocket] = useState<StreamingSocket | null>(null);\n\n // Connect customer socket\n const connectCustomerSocket = (conversationId: string) => {\n if (customerSocket) {\n customerSocket.disconnect();\n }\n\n const socket = createCustomerSocket(config.apiUrl, conversationId);\n const manager = new CustomerSocketManager(socket);\n\n setCustomerSocket(socket);\n setCustomerSocketManager(manager);\n\n socket.connect();\n };\n\n // Disconnect customer socket\n const disconnectCustomerSocket = () => {\n if (customerSocket) {\n customerSocket.disconnect();\n setCustomerSocket(null);\n setCustomerSocketManager(null);\n }\n };\n\n // Connect agent socket\n const connectAgentSocket = (token: string) => {\n if (agentSocket) {\n agentSocket.disconnect();\n }\n\n const socket = createAgentSocket(config.apiUrl, token);\n const manager = new AgentSocketManager(socket);\n\n setAgentSocket(socket);\n setAgentSocketManager(manager);\n\n socket.connect();\n };\n\n // Disconnect agent socket\n const disconnectAgentSocket = () => {\n if (agentSocket) {\n agentSocket.disconnect();\n setAgentSocket(null);\n setAgentSocketManager(null);\n }\n };\n\n // Connect streaming socket\n const connectStreamingSocket = (conversationId: string) => {\n if (streamingSocket) {\n streamingSocket.disconnect();\n }\n\n const socket = createStreamingSocket(config.apiUrl, conversationId);\n setStreamingSocket(socket);\n\n socket.connect();\n };\n\n // Disconnect streaming socket\n const disconnectStreamingSocket = () => {\n if (streamingSocket) {\n streamingSocket.disconnect();\n setStreamingSocket(null);\n }\n };\n\n // Auto-connect on mount\n useEffect(() => {\n if (config.autoConnectCustomer && config.conversationId) {\n connectCustomerSocket(config.conversationId);\n }\n\n if (config.autoConnectAgent && config.token) {\n connectAgentSocket(config.token);\n }\n\n // Cleanup on unmount\n return () => {\n disconnectCustomerSocket();\n disconnectAgentSocket();\n disconnectStreamingSocket();\n };\n }, [config.autoConnectCustomer, config.autoConnectAgent, config.conversationId, config.token]);\n\n const value: SolveoContextValue = {\n sdk,\n config,\n customerSocket,\n customerSocketManager,\n agentSocket,\n agentSocketManager,\n streamingSocket,\n connectCustomerSocket,\n disconnectCustomerSocket,\n connectAgentSocket,\n disconnectAgentSocket,\n connectStreamingSocket,\n disconnectStreamingSocket,\n };\n\n return <SolveoContext.Provider value={value}>{children}</SolveoContext.Provider>;\n}\n\n// ============================================================================\n// Hook to use Solveo context\n// ============================================================================\n\nexport function useSolveo(): SolveoContextValue {\n const context = useContext(SolveoContext);\n if (!context) {\n throw new Error('useSolveo must be used within a SolveoProvider');\n }\n return context;\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\n\nconst STORAGE_KEYS = {\n CONVERSATION_ID: '@solveo/conversation_id',\n MESSAGES: '@solveo/messages',\n USER_IDENTITY: '@solveo/user_identity',\n WIDGET_CONFIG: '@solveo/widget_config',\n};\n\nexport const storage = {\n async getConversationId(): Promise<string | null> {\n return AsyncStorage.getItem(STORAGE_KEYS.CONVERSATION_ID);\n },\n\n async setConversationId(id: string): Promise<void> {\n await AsyncStorage.setItem(STORAGE_KEYS.CONVERSATION_ID, id);\n },\n\n async clearConversationId(): Promise<void> {\n await AsyncStorage.removeItem(STORAGE_KEYS.CONVERSATION_ID);\n },\n\n async getMessages(conversationId: string): Promise<any[]> {\n const data = await AsyncStorage.getItem(`${STORAGE_KEYS.MESSAGES}_${conversationId}`);\n return data ? JSON.parse(data) : [];\n },\n\n async setMessages(conversationId: string, messages: any[]): Promise<void> {\n await AsyncStorage.setItem(`${STORAGE_KEYS.MESSAGES}_${conversationId}`, JSON.stringify(messages));\n },\n\n async getUserIdentity(): Promise<{ email?: string; name?: string } | null> {\n const data = await AsyncStorage.getItem(STORAGE_KEYS.USER_IDENTITY);\n return data ? JSON.parse(data) : null;\n },\n\n async setUserIdentity(identity: { email?: string; name?: string }): Promise<void> {\n await AsyncStorage.setItem(STORAGE_KEYS.USER_IDENTITY, JSON.stringify(identity));\n },\n\n async getWidgetConfig(widgetId: string): Promise<any | null> {\n const data = await AsyncStorage.getItem(`${STORAGE_KEYS.WIDGET_CONFIG}_${widgetId}`);\n return data ? JSON.parse(data) : null;\n },\n\n async setWidgetConfig(widgetId: string, config: any): Promise<void> {\n await AsyncStorage.setItem(`${STORAGE_KEYS.WIDGET_CONFIG}_${widgetId}`, JSON.stringify(config));\n },\n};\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport { storage } from '../utils/storage';\nimport type { Message, Conversation } from '@solveo-ai/sdk-core';\n\nexport interface UseChatOptions {\n widgetId?: string;\n agentId?: string;\n persistConversation?: boolean;\n}\n\nexport function useChat(options: UseChatOptions = {}) {\n const { sdk, config, streamingSocket, connectStreamingSocket } = useSolveo();\n const [conversation, setConversation] = useState<Conversation | null>(null);\n const [messages, setMessages] = useState<Message[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isStreaming, setIsStreaming] = useState(false);\n const [streamingContent, setStreamingContent] = useState('');\n const [error, setError] = useState<Error | null>(null);\n\n // Load persisted conversation\n useEffect(() => {\n if (options.persistConversation) {\n loadPersistedConversation();\n }\n }, [options.persistConversation]);\n\n // Setup streaming socket listeners\n useEffect(() => {\n if (!streamingSocket || !conversation) return;\n\n const handleMessage = (msg: any) => {\n if (msg.type === 'agent_typing') {\n setIsStreaming(true);\n setStreamingContent('');\n } else if (msg.type === 'agent_message_chunk') {\n setStreamingContent((prev) => prev + (msg.content || ''));\n } else if (msg.type === 'agent_message_complete') {\n setIsStreaming(false);\n if (msg.message_id) {\n loadMessages(conversation.id);\n }\n }\n };\n\n const handleError = (err: any) => {\n setError(new Error(err.message || 'Streaming error'));\n setIsStreaming(false);\n };\n\n streamingSocket.on('message', handleMessage);\n streamingSocket.on('error', handleError);\n\n return () => {\n streamingSocket.off('message', handleMessage);\n streamingSocket.off('error', handleError);\n };\n }, [streamingSocket, conversation]);\n\n const loadPersistedConversation = async () => {\n try {\n const convId = await storage.getConversationId();\n if (convId) {\n const conv = await sdk.widgetConversations.get(convId);\n setConversation(conv);\n await loadMessages(convId);\n }\n } catch (err: any) {\n console.error('Failed to load persisted conversation:', err);\n }\n };\n\n const createConversation = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const identity = await storage.getUserIdentity();\n const conv = await sdk.widgetConversations.create({\n widget_id: options.widgetId || config.widgetId,\n agent_id: options.agentId,\n customer_email: identity?.email || config.user?.email,\n customer_name: identity?.name || config.user?.name,\n });\n setConversation(conv);\n if (options.persistConversation) {\n await storage.setConversationId(conv.id);\n }\n connectStreamingSocket(conv.id);\n return conv;\n } catch (err: any) {\n setError(err);\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, [sdk, options, config]);\n\n const loadMessages = useCallback(async (conversationId: string) => {\n try {\n const msgs = await sdk.widgetMessages.list(conversationId);\n setMessages(msgs);\n if (options.persistConversation) {\n await storage.setMessages(conversationId, msgs);\n }\n } catch (err: any) {\n setError(err);\n }\n }, [sdk, options]);\n\n const sendMessage = useCallback(async (content: string) => {\n if (!conversation) {\n throw new Error('No active conversation');\n }\n setIsLoading(true);\n setError(null);\n try {\n if (streamingSocket?.isConnected()) {\n streamingSocket.sendMessage(content);\n } else {\n const response = await sdk.widgetMessages.send(conversation.id, { content });\n setMessages((prev) => [...prev, response.message, response.ai_response!].filter(Boolean));\n }\n } catch (err: any) {\n setError(err);\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, [conversation, streamingSocket, sdk]);\n\n const submitFeedback = useCallback(async (messageId: string, rating: 'THUMBS_UP' | 'THUMBS_DOWN') => {\n if (!conversation) return;\n try {\n await sdk.widgetMessages.submitFeedback(conversation.id, messageId, rating);\n } catch (err: any) {\n setError(err);\n }\n }, [conversation, sdk]);\n\n return {\n conversation,\n messages,\n isLoading,\n isStreaming,\n streamingContent,\n error,\n createConversation,\n sendMessage,\n loadMessages,\n submitFeedback,\n };\n}\n","import { useState, useEffect } from 'react';\nimport { useSolveo } from '../SolveoProvider';\n\nexport function useRealtime() {\n const { customerSocketManager } = useSolveo();\n const [isConnected, setIsConnected] = useState(false);\n const [agentTyping, setAgentTyping] = useState(false);\n const [queuePosition, setQueuePosition] = useState<number | null>(null);\n const [estimatedWait, setEstimatedWait] = useState<number | null>(null);\n\n useEffect(() => {\n if (!customerSocketManager) return;\n\n const socket = customerSocketManager.getSocket();\n\n socket.on('connect', () => setIsConnected(true));\n socket.on('disconnect', () => setIsConnected(false));\n\n customerSocketManager.onAgentTyping(() => {\n setAgentTyping(true);\n setTimeout(() => setAgentTyping(false), 3000);\n });\n\n customerSocketManager.onQueueUpdate((data) => {\n setQueuePosition(data.queue_position);\n setEstimatedWait(data.estimated_wait);\n });\n\n return () => {\n socket.off('connect');\n socket.off('disconnect');\n };\n }, [customerSocketManager]);\n\n return {\n isConnected,\n agentTyping,\n queuePosition,\n estimatedWait,\n };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport type { HumanAgent } from '@solveo-ai/sdk-core';\n\nexport function useEscalation() {\n const { customerSocketManager, connectCustomerSocket, disconnectCustomerSocket } = useSolveo();\n const [escalationId, setEscalationId] = useState<string | null>(null);\n const [assignedAgent, setAssignedAgent] = useState<HumanAgent | null>(null);\n const [status, setStatus] = useState<'idle' | 'requesting' | 'queued' | 'active' | 'resolved'>('idle');\n\n useEffect(() => {\n if (!customerSocketManager) return;\n\n customerSocketManager.onAgentConnected((data) => {\n setEscalationId(data.escalation_id);\n setAssignedAgent({\n name: data.agent_name,\n avatar_url: data.agent_avatar,\n } as HumanAgent);\n setStatus('active');\n });\n\n customerSocketManager.onQueueUpdate((data) => {\n setStatus('queued');\n });\n\n customerSocketManager.onEscalationResolved(() => {\n setStatus('resolved');\n });\n\n customerSocketManager.onHandedBack(() => {\n setStatus('idle');\n setEscalationId(null);\n setAssignedAgent(null);\n });\n }, [customerSocketManager]);\n\n const requestHuman = useCallback((conversationId: string) => {\n connectCustomerSocket(conversationId);\n if (customerSocketManager) {\n customerSocketManager.requestHuman();\n setStatus('requesting');\n }\n }, [customerSocketManager, connectCustomerSocket]);\n\n const endChat = useCallback(() => {\n if (escalationId && customerSocketManager) {\n customerSocketManager.endChat(escalationId);\n disconnectCustomerSocket();\n setStatus('idle');\n setEscalationId(null);\n setAssignedAgent(null);\n }\n }, [escalationId, customerSocketManager, disconnectCustomerSocket]);\n\n const submitCSAT = useCallback((rating: number) => {\n if (escalationId && customerSocketManager) {\n customerSocketManager.submitCSAT(escalationId, rating);\n }\n }, [escalationId, customerSocketManager]);\n\n return {\n escalationId,\n assignedAgent,\n status,\n requestHuman,\n endChat,\n submitCSAT,\n };\n}\n","import { useState, useEffect } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport { storage } from '../utils/storage';\nimport type { Widget, WidgetConfig } from '@solveo-ai/sdk-core';\n\nexport function useWidgetConfig(widgetId?: string) {\n const { sdk, config } = useSolveo();\n const effectiveWidgetId = widgetId || config.widgetId;\n const [widget, setWidget] = useState<Widget | null>(null);\n const [widgetConfig, setWidgetConfig] = useState<WidgetConfig | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (effectiveWidgetId) {\n loadConfig();\n }\n }, [effectiveWidgetId]);\n\n const loadConfig = async () => {\n if (!effectiveWidgetId) return;\n \n setIsLoading(true);\n setError(null);\n try {\n // Try cache first\n const cached = await storage.getWidgetConfig(effectiveWidgetId);\n if (cached) {\n setWidget(cached);\n setWidgetConfig(cached.config);\n }\n\n // Fetch fresh config\n const w = await sdk.widgetConfig.getConfig(effectiveWidgetId);\n setWidget(w);\n setWidgetConfig(w.config);\n await storage.setWidgetConfig(effectiveWidgetId, w);\n } catch (err: any) {\n setError(err);\n } finally {\n setIsLoading(false);\n }\n };\n\n return {\n widget,\n widgetConfig,\n isLoading,\n error,\n reload: loadConfig,\n };\n}\n","import { useState, useCallback, useEffect } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport { Platform } from 'react-native';\nimport type { Device } from '@solveo-ai/sdk-core';\n\n/**\n * Push notification event handlers\n */\nexport interface PushNotificationHandlers {\n onNotificationReceived?: (notification: any) => void;\n onNotificationTapped?: (notification: any) => void;\n}\n\n/**\n * Push notification state\n */\nexport interface PushNotificationState {\n device: Device | null;\n isRegistered: boolean;\n isInitialized: boolean;\n permissionStatus: 'granted' | 'denied' | 'undetermined';\n}\n\n/**\n * Hook options\n */\nexport interface UsePushNotificationsOptions {\n mode?: 'widget' | 'agent'; // 'widget' for customer-facing, 'agent' for dashboard\n conversationId?: string; // Required for widget mode\n autoRegister?: boolean; // Auto-register if permission granted\n handlers?: PushNotificationHandlers;\n}\n\n/**\n * Enhanced Push Notifications Hook for React Native\n * \n * Supports both customer (widget) and agent (dashboard) modes.\n * Handles permissions, registration, and notification events.\n * \n * SETUP INSTRUCTIONS:\n * 1. Install peer dependencies:\n * npm install @react-native-firebase/app @react-native-firebase/messaging\n * (or expo-notifications for Expo projects)\n * \n * 2. Configure Firebase/APNs:\n * - Android: Add google-services.json to android/app/\n * - iOS: Add GoogleService-Info.plist to ios/ and configure APNs\n * \n * 3. Add permissions to manifests:\n * - Android: INTERNET, VIBRATE, RECEIVE_BOOT_COMPLETED\n * - iOS: User Notifications capability\n */\nexport function usePushNotifications(options: UsePushNotificationsOptions = {}) {\n const { sdk } = useSolveo();\n const {\n mode = 'widget',\n conversationId,\n autoRegister = false,\n handlers,\n } = options;\n\n const [state, setState] = useState<PushNotificationState>({\n device: null,\n isRegistered: false,\n isInitialized: false,\n permissionStatus: 'undetermined',\n });\n\n /**\n * Request notification permission from the OS\n */\n const requestPermission = useCallback(async (): Promise<boolean> => {\n try {\n // Try to import Firebase Messaging\n const messaging = await import('@react-native-firebase/messaging').then(m => m.default);\n \n const authStatus = await messaging().requestPermission();\n const enabled =\n authStatus === messaging.AuthorizationStatus.AUTHORIZED ||\n authStatus === messaging.AuthorizationStatus.PROVISIONAL;\n\n setState(prev => ({\n ...prev,\n permissionStatus: enabled ? 'granted' : 'denied',\n }));\n\n return enabled;\n } catch (error) {\n console.error('Failed to request permission (Firebase Messaging not installed?):', error);\n \n // Fallback: Try expo-notifications if Firebase not available\n try {\n const Notifications = await import('expo-notifications');\n const { status } = await Notifications.requestPermissionsAsync();\n const granted = status === 'granted';\n \n setState(prev => ({\n ...prev,\n permissionStatus: granted ? 'granted' : 'denied',\n }));\n \n return granted;\n } catch (expoError) {\n console.error('Failed to request permission (Expo Notifications not installed?):', expoError);\n setState(prev => ({ ...prev, permissionStatus: 'denied' }));\n return false;\n }\n }\n }, []);\n\n /**\n * Get FCM token from device\n */\n const getToken = useCallback(async (): Promise<string | null> => {\n try {\n // Try Firebase Messaging first\n const messaging = await import('@react-native-firebase/messaging').then(m => m.default);\n const token = await messaging().getToken();\n return token;\n } catch (error) {\n console.error('Failed to get FCM token:', error);\n \n // Fallback to Expo push token\n try {\n const Notifications = await import('expo-notifications');\n const token = await Notifications.getExpoPushTokenAsync();\n return token.data;\n } catch (expoError) {\n console.error('Failed to get Expo push token:', expoError);\n return null;\n }\n }\n }, []);\n\n /**\n * Register device for push notifications (customer/widget mode)\n */\n const registerDevice = useCallback(\n async (convId?: string, pushToken?: string, bundleId?: string): Promise<Device | null> => {\n if (mode !== 'widget') {\n console.warn('registerDevice is only for widget mode. Use registerAgentDevice for agent mode.');\n return null;\n }\n\n const targetConversationId = convId || conversationId;\n if (!targetConversationId) {\n console.error('conversationId is required for widget mode registration');\n return null;\n }\n\n try {\n const token = pushToken || (await getToken());\n if (!token) {\n throw new Error('Failed to get push token');\n }\n\n const platform = Platform.OS === 'ios' ? 'IOS' : 'ANDROID';\n const device = await sdk.widgetDevices.register({\n conversation_id: targetConversationId,\n platform,\n push_token: token,\n bundle_id: bundleId,\n });\n\n setState(prev => ({ ...prev, device, isRegistered: true }));\n return device;\n } catch (error) {\n console.error('Failed to register device:', error);\n throw error;\n }\n },\n [sdk, conversationId, mode, getToken]\n );\n\n /**\n * Register device for push notifications (agent/dashboard mode)\n */\n const registerAgentDevice = useCallback(\n async (pushToken?: string, deviceName?: string): Promise<any> => {\n if (mode !== 'agent') {\n console.warn('registerAgentDevice is only for agent mode. Use registerDevice for widget mode.');\n return null;\n }\n\n try {\n const token = pushToken || (await getToken());\n if (!token) {\n throw new Error('Failed to get push token');\n }\n\n const platform = Platform.OS === 'ios' ? 'IOS' : 'ANDROID';\n \n // Call authenticated endpoint for agent device registration\n const response = await sdk.client.post('/user-devices', {\n platform,\n push_token: token,\n device_name: deviceName || `${Platform.OS} Device`,\n }) as { data: Device };\n\n setState(prev => ({\n ...prev,\n device: response.data,\n isRegistered: true,\n }));\n\n return response.data;\n } catch (error) {\n console.error('Failed to register agent device:', error);\n throw error;\n }\n },\n [sdk, mode, getToken]\n );\n\n /**\n * Unregister device from push notifications\n */\n const unregisterDevice = useCallback(async () => {\n if (!state.device) {\n return;\n }\n\n try {\n if (mode === 'widget') {\n await sdk.widgetDevices.unregister(state.device.id);\n } else {\n await sdk.client.delete(`/user-devices/${state.device.id}`);\n }\n \n setState(prev => ({\n ...prev,\n device: null,\n isRegistered: false,\n }));\n } catch (error) {\n console.error('Failed to unregister device:', error);\n throw error;\n }\n }, [sdk, state.device, mode]);\n\n /**\n * Setup foreground notification handler\n */\n useEffect(() => {\n if (!handlers?.onNotificationReceived) {\n return;\n }\n\n let unsubscribe: (() => void) | undefined;\n\n const setupForegroundHandler = async () => {\n try {\n // Try Firebase Messaging\n const messaging = await import('@react-native-firebase/messaging').then(m => m.default);\n \n unsubscribe = messaging().onMessage(async remoteMessage => {\n console.log('Foreground notification received:', remoteMessage);\n handlers.onNotificationReceived?.(remoteMessage);\n });\n } catch (error) {\n // Fallback to Expo\n try {\n const Notifications = await import('expo-notifications');\n \n const subscription = Notifications.addNotificationReceivedListener(notification => {\n console.log('Foreground notification received (Expo):', notification);\n handlers.onNotificationReceived?.(notification);\n });\n \n unsubscribe = () => subscription.remove();\n } catch (expoError) {\n console.error('Failed to setup foreground handler:', expoError);\n }\n }\n };\n\n setupForegroundHandler();\n\n return () => {\n unsubscribe?.();\n };\n }, [handlers?.onNotificationReceived]);\n\n /**\n * Setup notification tap handler\n */\n useEffect(() => {\n if (!handlers?.onNotificationTapped) {\n return;\n }\n\n let unsubscribe: (() => void) | undefined;\n\n const setupTapHandler = async () => {\n try {\n // Try Firebase Messaging\n const messaging = await import('@react-native-firebase/messaging').then(m => m.default);\n \n // Handle notification opened app from quit state\n messaging()\n .getInitialNotification()\n .then(remoteMessage => {\n if (remoteMessage) {\n console.log('Notification opened app from quit state:', remoteMessage);\n handlers.onNotificationTapped?.(remoteMessage);\n }\n });\n\n // Handle notification opened app from background state\n unsubscribe = messaging().onNotificationOpenedApp(remoteMessage => {\n console.log('Notification opened app from background:', remoteMessage);\n handlers.onNotificationTapped?.(remoteMessage);\n });\n } catch (error) {\n // Fallback to Expo\n try {\n const Notifications = await import('expo-notifications');\n \n const subscription = Notifications.addNotificationResponseReceivedListener(response => {\n console.log('Notification tapped (Expo):', response);\n handlers.onNotificationTapped?.(response.notification);\n });\n \n unsubscribe = () => subscription.remove();\n } catch (expoError) {\n console.error('Failed to setup tap handler:', expoError);\n }\n }\n };\n\n setupTapHandler();\n\n return () => {\n unsubscribe?.();\n };\n }, [handlers?.onNotificationTapped]);\n\n /**\n * Handle token refresh\n */\n useEffect(() => {\n let unsubscribe: (() => void) | undefined;\n\n const setupTokenRefreshHandler = async () => {\n try {\n const messaging = await import('@react-native-firebase/messaging').then(m => m.default);\n \n unsubscribe = messaging().onTokenRefresh(async newToken => {\n console.log('FCM token refreshed:', newToken);\n \n // Re-register with new token\n if (state.isRegistered) {\n if (mode === 'widget' && conversationId) {\n await registerDevice(conversationId, newToken);\n } else if (mode === 'agent') {\n await registerAgentDevice(newToken);\n }\n }\n });\n } catch (error) {\n console.error('Failed to setup token refresh handler:', error);\n }\n };\n\n setupTokenRefreshHandler();\n\n return () => {\n unsubscribe?.();\n };\n }, [state.isRegistered, mode, conversationId, registerDevice, registerAgentDevice]);\n\n /**\n * Check permission status on mount\n */\n useEffect(() => {\n const checkPermission = async () => {\n try {\n const messaging = await import('@react-native-firebase/messaging').then(m => m.default);\n const authStatus = await messaging().hasPermission();\n const granted =\n authStatus === messaging.AuthorizationStatus.AUTHORIZED ||\n authStatus === messaging.AuthorizationStatus.PROVISIONAL;\n\n setState(prev => ({\n ...prev,\n permissionStatus: granted ? 'granted' : authStatus === messaging.AuthorizationStatus.NOT_DETERMINED ? 'undetermined' : 'denied',\n isInitialized: true,\n }));\n\n // Auto-register if permission granted and autoRegister enabled\n if (granted && autoRegister && !state.isRegistered) {\n if (mode === 'widget' && conversationId) {\n await registerDevice();\n } else if (mode === 'agent') {\n await registerAgentDevice();\n }\n }\n } catch (error) {\n console.error('Failed to check permission:', error);\n setState(prev => ({ ...prev, isInitialized: true }));\n }\n };\n\n checkPermission();\n }, [autoRegister, mode, conversationId, registerDevice, registerAgentDevice]);\n\n return {\n ...state,\n requestPermission,\n registerDevice,\n registerAgentDevice,\n unregisterDevice,\n };\n}\n","import { useState, useCallback } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport type { MessageAttachment } from '@solveo-ai/sdk-core';\n\nexport function useAttachments(conversationId?: string) {\n const { sdk } = useSolveo();\n const [uploading, setUploading] = useState(false);\n const [uploadProgress, setUploadProgress] = useState(0);\n\n const uploadAttachment = useCallback(async (\n file: { uri: string; type?: string; name?: string },\n attachmentType: 'IMAGE' | 'AUDIO' | 'VIDEO' | 'DOCUMENT' | 'VOICE_NOTE'\n ): Promise<MessageAttachment> => {\n if (!conversationId) {\n throw new Error('No conversation ID provided');\n }\n\n setUploading(true);\n setUploadProgress(0);\n\n try {\n // Convert file URI to blob (platform-specific)\n const response = await fetch(file.uri);\n const blob = await response.blob();\n\n const attachment = await sdk.widgetAttachments.upload(conversationId, blob, attachmentType);\n setUploadProgress(100);\n return attachment;\n } catch (error) {\n console.error('Failed to upload attachment:', error);\n throw error;\n } finally {\n setUploading(false);\n setUploadProgress(0);\n }\n }, [sdk, conversationId]);\n\n return {\n uploading,\n uploadProgress,\n uploadAttachment,\n };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport type { Agent, AgentCreateRequest, AgentUpdateRequest } from '@solveo-ai/sdk-core';\n\nexport function useAgents(accountId?: string) {\n const { sdk } = useSolveo();\n const [agents, setAgents] = useState<Agent[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const loadAgents = useCallback(async () => {\n if (!accountId) return;\n setIsLoading(true);\n try {\n const data = await sdk.agents.list(accountId);\n setAgents(data);\n } catch (err: any) {\n setError(err);\n } finally {\n setIsLoading(false);\n }\n }, [sdk, accountId]);\n\n useEffect(() => {\n if (accountId) {\n loadAgents();\n }\n }, [accountId]);\n\n const createAgent = useCallback(async (data: AgentCreateRequest) => {\n if (!accountId) throw new Error('No account ID');\n const agent = await sdk.agents.create(accountId, data);\n setAgents((prev) => [...prev, agent]);\n return agent;\n }, [sdk, accountId]);\n\n const updateAgent = useCallback(async (id: string, data: AgentUpdateRequest) => {\n const agent = await sdk.agents.update(id, data);\n setAgents((prev) => prev.map((a) => (a.id === id ? agent : a)));\n return agent;\n }, [sdk]);\n\n const deleteAgent = useCallback(async (id: string) => {\n await sdk.agents.delete(id);\n setAgents((prev) => prev.filter((a) => a.id !== id));\n }, [sdk]);\n\n return {\n agents,\n isLoading,\n error,\n createAgent,\n updateAgent,\n deleteAgent,\n reload: loadAgents,\n };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport type { Conversation } from '@solveo-ai/sdk-core';\n\nexport function useConversations(accountId?: string) {\n const { sdk } = useSolveo();\n const [conversations, setConversations] = useState<Conversation[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const loadConversations = useCallback(async () => {\n if (!accountId) return;\n setIsLoading(true);\n try {\n const data = await sdk.conversations.list(accountId);\n setConversations(data);\n } catch (err: any) {\n setError(err);\n } finally {\n setIsLoading(false);\n }\n }, [sdk, accountId]);\n\n useEffect(() => {\n if (accountId) {\n loadConversations();\n }\n }, [accountId]);\n\n const resolveConversation = useCallback(async (id: string) => {\n await sdk.conversations.resolve(id);\n setConversations((prev) => prev.map((c) => (c.id === id ? { ...c, status: 'RESOLVED' as const } : c)));\n }, [sdk]);\n\n return {\n conversations,\n isLoading,\n error,\n resolveConversation,\n reload: loadConversations,\n };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport type {\n ConversationMetrics,\n SentimentDistribution,\n FeedbackStats,\n TokenUsageMetrics,\n} from '@solveo-ai/sdk-core';\n\nexport function useAnalytics(accountId?: string, days = 30) {\n const { sdk } = useSolveo();\n const [metrics, setMetrics] = useState<ConversationMetrics | null>(null);\n const [sentiment, setSentiment] = useState<SentimentDistribution | null>(null);\n const [feedback, setFeedback] = useState<FeedbackStats | null>(null);\n const [tokenUsage, setTokenUsage] = useState<TokenUsageMetrics | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const loadAnalytics = useCallback(async () => {\n if (!accountId) return;\n setIsLoading(true);\n try {\n const [m, s, f, t] = await Promise.all([\n sdk.analytics.getMetrics(accountId, days),\n sdk.analytics.getSentiment(accountId, days),\n sdk.analytics.getFeedback(accountId, days),\n sdk.analytics.getTokenUsage(accountId, days),\n ]);\n setMetrics(m);\n setSentiment(s);\n setFeedback(f);\n setTokenUsage(t);\n } catch (err: any) {\n setError(err);\n } finally {\n setIsLoading(false);\n }\n }, [sdk, accountId, days]);\n\n useEffect(() => {\n if (accountId) {\n loadAnalytics();\n }\n }, [accountId, days]);\n\n return {\n metrics,\n sentiment,\n feedback,\n tokenUsage,\n isLoading,\n error,\n reload: loadAnalytics,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/SolveoProvider.tsx","../src/utils/storage.ts","../src/hooks/useChat.ts","../src/hooks/useRealtime.ts","../src/hooks/useEscalation.ts","../src/hooks/useWidgetConfig.ts","../src/hooks/usePushNotifications.ts","../src/hooks/useAttachments.ts","../src/hooks/useAgents.ts","../src/hooks/useConversations.ts","../src/hooks/useAnalytics.ts"],"names":["createContext","useMemo","SolveoSDK","useState","createCustomerSocket","CustomerSocketManager","createAgentSocket","AgentSocketManager","createStreamingSocket","useEffect","React","useContext","AsyncStorage","useCallback","Platform"],"mappings":"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","file":"index.js","sourcesContent":["import React, { createContext, useContext, useMemo, ReactNode, useEffect, useState } from 'react';\nimport {\n SolveoSDK,\n type SolveoClientConfig,\n createCustomerSocket,\n createAgentSocket,\n createStreamingSocket,\n CustomerSocketManager,\n AgentSocketManager,\n StreamingSocket,\n type Socket,\n} from '@solveo-ai/sdk-core';\n\n// ============================================================================\n// Context Types\n// ============================================================================\n\nexport interface SolveoContextValue {\n sdk: SolveoSDK;\n config: SolveoProviderConfig;\n // Customer socket (for widget mode)\n customerSocket: Socket | null;\n customerSocketManager: CustomerSocketManager | null;\n // Agent socket (for management mode)\n agentSocket: Socket | null;\n agentSocketManager: AgentSocketManager | null;\n // Streaming socket (for AI responses)\n streamingSocket: StreamingSocket | null;\n // Connection helpers\n connectCustomerSocket: (conversationId: string) => void;\n disconnectCustomerSocket: () => void;\n connectAgentSocket: (token: string) => void;\n disconnectAgentSocket: () => void;\n connectStreamingSocket: (conversationId: string) => void;\n disconnectStreamingSocket: () => void;\n}\n\nconst SolveoContext = createContext<SolveoContextValue | null>(null);\n\n// ============================================================================\n// Provider Props\n// ============================================================================\n\nexport interface SolveoProviderConfig extends Omit<SolveoClientConfig, 'platform'> {\n // User identity (optional)\n user?: {\n email?: string;\n name?: string;\n id?: string;\n };\n // Auto-connect options\n autoConnectCustomer?: boolean;\n autoConnectAgent?: boolean;\n conversationId?: string; // For auto-connecting customer socket\n // Error handler\n onError?: (error: Error) => void;\n}\n\nexport interface SolveoProviderProps {\n children: ReactNode;\n config: SolveoProviderConfig;\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\nexport function SolveoProvider({ children, config }: SolveoProviderProps) {\n const sdk = useMemo(\n () =>\n new SolveoSDK({\n ...config,\n platform: 'react-native',\n }),\n [config.apiUrl, config.apiKey, config.token, config.widgetId]\n );\n\n // Socket states\n const [customerSocket, setCustomerSocket] = useState<Socket | null>(null);\n const [customerSocketManager, setCustomerSocketManager] = useState<CustomerSocketManager | null>(null);\n const [agentSocket, setAgentSocket] = useState<Socket | null>(null);\n const [agentSocketManager, setAgentSocketManager] = useState<AgentSocketManager | null>(null);\n const [streamingSocket, setStreamingSocket] = useState<StreamingSocket | null>(null);\n\n // Connect customer socket\n const connectCustomerSocket = (conversationId: string) => {\n if (customerSocket) {\n customerSocket.disconnect();\n }\n\n const socket = createCustomerSocket(config.apiUrl, conversationId);\n const manager = new CustomerSocketManager(socket);\n\n setCustomerSocket(socket);\n setCustomerSocketManager(manager);\n\n socket.connect();\n };\n\n // Disconnect customer socket\n const disconnectCustomerSocket = () => {\n if (customerSocket) {\n customerSocket.disconnect();\n setCustomerSocket(null);\n setCustomerSocketManager(null);\n }\n };\n\n // Connect agent socket\n const connectAgentSocket = (token: string) => {\n if (agentSocket) {\n agentSocket.disconnect();\n }\n\n const socket = createAgentSocket(config.apiUrl, token);\n const manager = new AgentSocketManager(socket);\n\n setAgentSocket(socket);\n setAgentSocketManager(manager);\n\n socket.connect();\n };\n\n // Disconnect agent socket\n const disconnectAgentSocket = () => {\n if (agentSocket) {\n agentSocket.disconnect();\n setAgentSocket(null);\n setAgentSocketManager(null);\n }\n };\n\n // Connect streaming socket\n const connectStreamingSocket = (conversationId: string) => {\n if (streamingSocket) {\n streamingSocket.disconnect();\n }\n\n const socket = createStreamingSocket(config.apiUrl, conversationId);\n setStreamingSocket(socket);\n\n socket.connect();\n };\n\n // Disconnect streaming socket\n const disconnectStreamingSocket = () => {\n if (streamingSocket) {\n streamingSocket.disconnect();\n setStreamingSocket(null);\n }\n };\n\n // Auto-connect on mount\n useEffect(() => {\n if (config.autoConnectCustomer && config.conversationId) {\n connectCustomerSocket(config.conversationId);\n }\n\n if (config.autoConnectAgent && config.token) {\n connectAgentSocket(config.token);\n }\n\n // Cleanup on unmount\n return () => {\n disconnectCustomerSocket();\n disconnectAgentSocket();\n disconnectStreamingSocket();\n };\n }, [config.autoConnectCustomer, config.autoConnectAgent, config.conversationId, config.token]);\n\n const value: SolveoContextValue = {\n sdk,\n config,\n customerSocket,\n customerSocketManager,\n agentSocket,\n agentSocketManager,\n streamingSocket,\n connectCustomerSocket,\n disconnectCustomerSocket,\n connectAgentSocket,\n disconnectAgentSocket,\n connectStreamingSocket,\n disconnectStreamingSocket,\n };\n\n return <SolveoContext.Provider value={value}>{children}</SolveoContext.Provider>;\n}\n\n// ============================================================================\n// Hook to use Solveo context\n// ============================================================================\n\nexport function useSolveo(): SolveoContextValue {\n const context = useContext(SolveoContext);\n if (!context) {\n throw new Error('useSolveo must be used within a SolveoProvider');\n }\n return context;\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\n\nconst STORAGE_KEYS = {\n CONVERSATION_ID: '@solveo/conversation_id',\n MESSAGES: '@solveo/messages',\n USER_IDENTITY: '@solveo/user_identity',\n WIDGET_CONFIG: '@solveo/widget_config',\n};\n\nexport const storage = {\n async getConversationId(): Promise<string | null> {\n return AsyncStorage.getItem(STORAGE_KEYS.CONVERSATION_ID);\n },\n\n async setConversationId(id: string): Promise<void> {\n await AsyncStorage.setItem(STORAGE_KEYS.CONVERSATION_ID, id);\n },\n\n async clearConversationId(): Promise<void> {\n await AsyncStorage.removeItem(STORAGE_KEYS.CONVERSATION_ID);\n },\n\n async getMessages(conversationId: string): Promise<any[]> {\n const data = await AsyncStorage.getItem(`${STORAGE_KEYS.MESSAGES}_${conversationId}`);\n return data ? JSON.parse(data) : [];\n },\n\n async setMessages(conversationId: string, messages: any[]): Promise<void> {\n await AsyncStorage.setItem(`${STORAGE_KEYS.MESSAGES}_${conversationId}`, JSON.stringify(messages));\n },\n\n async getUserIdentity(): Promise<{ email?: string; name?: string } | null> {\n const data = await AsyncStorage.getItem(STORAGE_KEYS.USER_IDENTITY);\n return data ? JSON.parse(data) : null;\n },\n\n async setUserIdentity(identity: { email?: string; name?: string }): Promise<void> {\n await AsyncStorage.setItem(STORAGE_KEYS.USER_IDENTITY, JSON.stringify(identity));\n },\n\n async getWidgetConfig(widgetId: string): Promise<any | null> {\n const data = await AsyncStorage.getItem(`${STORAGE_KEYS.WIDGET_CONFIG}_${widgetId}`);\n return data ? JSON.parse(data) : null;\n },\n\n async setWidgetConfig(widgetId: string, config: any): Promise<void> {\n await AsyncStorage.setItem(`${STORAGE_KEYS.WIDGET_CONFIG}_${widgetId}`, JSON.stringify(config));\n },\n};\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport { storage } from '../utils/storage';\nimport type { Message, Conversation } from '@solveo-ai/sdk-core';\n\nexport interface UseChatOptions {\n widgetId?: string;\n agentId?: string;\n persistConversation?: boolean;\n}\n\nexport function useChat(options: UseChatOptions = {}) {\n const { sdk, config, streamingSocket, connectStreamingSocket } = useSolveo();\n const [conversation, setConversation] = useState<Conversation | null>(null);\n const [messages, setMessages] = useState<Message[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isStreaming, setIsStreaming] = useState(false);\n const [streamingContent, setStreamingContent] = useState('');\n const [error, setError] = useState<Error | null>(null);\n\n // Load persisted conversation\n useEffect(() => {\n if (options.persistConversation) {\n loadPersistedConversation();\n }\n }, [options.persistConversation]);\n\n // Setup streaming socket listeners\n useEffect(() => {\n if (!streamingSocket || !conversation) return;\n\n const handleMessage = (msg: any) => {\n if (msg.type === 'agent_typing') {\n setIsStreaming(true);\n setStreamingContent('');\n } else if (msg.type === 'agent_message_chunk') {\n setStreamingContent((prev) => prev + (msg.content || ''));\n } else if (msg.type === 'agent_message_complete') {\n setIsStreaming(false);\n if (msg.message_id) {\n loadMessages(conversation.id);\n }\n }\n };\n\n const handleError = (err: any) => {\n setError(new Error(err.message || 'Streaming error'));\n setIsStreaming(false);\n };\n\n streamingSocket.on('message', handleMessage);\n streamingSocket.on('error', handleError);\n\n return () => {\n streamingSocket.off('message', handleMessage);\n streamingSocket.off('error', handleError);\n };\n }, [streamingSocket, conversation]);\n\n const loadPersistedConversation = async () => {\n try {\n const convId = await storage.getConversationId();\n if (convId) {\n const conv = await sdk.widgetConversations.get(convId);\n setConversation(conv);\n await loadMessages(convId);\n }\n } catch (err: any) {\n console.error('Failed to load persisted conversation:', err);\n }\n };\n\n const createConversation = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const identity = await storage.getUserIdentity();\n const conv = await sdk.widgetConversations.create({\n widget_id: options.widgetId || config.widgetId,\n agent_id: options.agentId,\n customer_email: identity?.email || config.user?.email,\n customer_name: identity?.name || config.user?.name,\n });\n setConversation(conv);\n if (options.persistConversation) {\n await storage.setConversationId(conv.id);\n }\n connectStreamingSocket(conv.id);\n return conv;\n } catch (err: any) {\n setError(err);\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, [sdk, options, config]);\n\n const loadMessages = useCallback(async (conversationId: string) => {\n try {\n const msgs = await sdk.widgetMessages.list(conversationId);\n setMessages(msgs);\n if (options.persistConversation) {\n await storage.setMessages(conversationId, msgs);\n }\n } catch (err: any) {\n setError(err);\n }\n }, [sdk, options]);\n\n const sendMessage = useCallback(async (content: string) => {\n if (!conversation) {\n throw new Error('No active conversation');\n }\n setIsLoading(true);\n setError(null);\n try {\n if (streamingSocket?.isConnected()) {\n streamingSocket.sendMessage(content);\n } else {\n const response = await sdk.widgetMessages.send(conversation.id, { content });\n setMessages((prev) => [...prev, response.message, response.ai_response!].filter(Boolean));\n }\n } catch (err: any) {\n setError(err);\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, [conversation, streamingSocket, sdk]);\n\n const submitFeedback = useCallback(async (messageId: string, rating: 'THUMBS_UP' | 'THUMBS_DOWN') => {\n if (!conversation) return;\n try {\n await sdk.widgetMessages.submitFeedback(conversation.id, messageId, rating);\n } catch (err: any) {\n setError(err);\n }\n }, [conversation, sdk]);\n\n return {\n conversation,\n messages,\n isLoading,\n isStreaming,\n streamingContent,\n error,\n createConversation,\n sendMessage,\n loadMessages,\n submitFeedback,\n };\n}\n","import { useState, useEffect } from 'react';\nimport { useSolveo } from '../SolveoProvider';\n\nexport function useRealtime() {\n const { customerSocketManager } = useSolveo();\n const [isConnected, setIsConnected] = useState(false);\n const [agentTyping, setAgentTyping] = useState(false);\n const [queuePosition, setQueuePosition] = useState<number | null>(null);\n const [estimatedWait, setEstimatedWait] = useState<number | null>(null);\n\n useEffect(() => {\n if (!customerSocketManager) return;\n\n const socket = customerSocketManager.getSocket();\n\n socket.on('connect', () => setIsConnected(true));\n socket.on('disconnect', () => setIsConnected(false));\n\n customerSocketManager.onAgentTyping(() => {\n setAgentTyping(true);\n setTimeout(() => setAgentTyping(false), 3000);\n });\n\n customerSocketManager.onQueueUpdate((data) => {\n setQueuePosition(data.queue_position);\n setEstimatedWait(data.estimated_wait);\n });\n\n return () => {\n socket.off('connect');\n socket.off('disconnect');\n };\n }, [customerSocketManager]);\n\n return {\n isConnected,\n agentTyping,\n queuePosition,\n estimatedWait,\n };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport type { HumanAgent } from '@solveo-ai/sdk-core';\n\nexport function useEscalation() {\n const { customerSocketManager, connectCustomerSocket, disconnectCustomerSocket } = useSolveo();\n const [escalationId, setEscalationId] = useState<string | null>(null);\n const [assignedAgent, setAssignedAgent] = useState<HumanAgent | null>(null);\n const [status, setStatus] = useState<'idle' | 'requesting' | 'queued' | 'active' | 'resolved'>('idle');\n\n useEffect(() => {\n if (!customerSocketManager) return;\n\n customerSocketManager.onAgentConnected((data) => {\n setEscalationId(data.escalation_id);\n setAssignedAgent({\n name: data.agent_name,\n avatar_url: data.agent_avatar,\n } as HumanAgent);\n setStatus('active');\n });\n\n customerSocketManager.onQueueUpdate((data) => {\n setStatus('queued');\n });\n\n customerSocketManager.onEscalationResolved(() => {\n setStatus('resolved');\n });\n\n customerSocketManager.onHandedBack(() => {\n setStatus('idle');\n setEscalationId(null);\n setAssignedAgent(null);\n });\n }, [customerSocketManager]);\n\n const requestHuman = useCallback((conversationId: string) => {\n connectCustomerSocket(conversationId);\n if (customerSocketManager) {\n customerSocketManager.requestHuman();\n setStatus('requesting');\n }\n }, [customerSocketManager, connectCustomerSocket]);\n\n const endChat = useCallback(() => {\n if (escalationId && customerSocketManager) {\n customerSocketManager.endChat(escalationId);\n disconnectCustomerSocket();\n setStatus('idle');\n setEscalationId(null);\n setAssignedAgent(null);\n }\n }, [escalationId, customerSocketManager, disconnectCustomerSocket]);\n\n const submitCSAT = useCallback((rating: number) => {\n if (escalationId && customerSocketManager) {\n customerSocketManager.submitCSAT(escalationId, rating);\n }\n }, [escalationId, customerSocketManager]);\n\n return {\n escalationId,\n assignedAgent,\n status,\n requestHuman,\n endChat,\n submitCSAT,\n };\n}\n","import { useState, useEffect } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport { storage } from '../utils/storage';\nimport type { Widget, WidgetConfig } from '@solveo-ai/sdk-core';\n\nexport function useWidgetConfig(widgetId?: string) {\n const { sdk, config } = useSolveo();\n const effectiveWidgetId = widgetId || config.widgetId;\n const [widget, setWidget] = useState<Widget | null>(null);\n const [widgetConfig, setWidgetConfig] = useState<WidgetConfig | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (effectiveWidgetId) {\n loadConfig();\n }\n }, [effectiveWidgetId]);\n\n const loadConfig = async () => {\n if (!effectiveWidgetId) return;\n \n setIsLoading(true);\n setError(null);\n try {\n // Try cache first\n const cached = await storage.getWidgetConfig(effectiveWidgetId);\n if (cached) {\n setWidget(cached);\n setWidgetConfig(cached.config);\n }\n\n // Fetch fresh config\n const w = await sdk.widgetConfig.getConfig(effectiveWidgetId);\n setWidget(w);\n setWidgetConfig(w.config);\n await storage.setWidgetConfig(effectiveWidgetId, w);\n } catch (err: any) {\n setError(err);\n } finally {\n setIsLoading(false);\n }\n };\n\n return {\n widget,\n widgetConfig,\n isLoading,\n error,\n reload: loadConfig,\n };\n}\n","import { useState, useCallback, useEffect } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport { Platform } from 'react-native';\nimport type { Device } from '@solveo-ai/sdk-core';\n\n/**\n * Push notification event handlers\n */\nexport interface PushNotificationHandlers {\n onNotificationReceived?: (notification: any) => void;\n onNotificationTapped?: (notification: any) => void;\n}\n\n/**\n * Push notification state\n */\nexport interface PushNotificationState {\n device: Device | null;\n isRegistered: boolean;\n isInitialized: boolean;\n permissionStatus: 'granted' | 'denied' | 'undetermined';\n}\n\n/**\n * Hook options\n */\nexport interface UsePushNotificationsOptions {\n mode?: 'widget' | 'agent'; // 'widget' for customer-facing, 'agent' for dashboard\n conversationId?: string; // Required for widget mode\n autoRegister?: boolean; // Auto-register if permission granted\n handlers?: PushNotificationHandlers;\n}\n\n/**\n * Enhanced Push Notifications Hook for React Native\n *\n * Supports both customer (widget) and agent (dashboard) modes.\n * Handles permissions, registration, and notification events.\n *\n * Works with both React Native CLI and Expo projects. Automatically detects\n * which push notification system is available:\n * - React Native CLI: Uses @react-native-firebase/messaging\n * - Expo: Uses expo-notifications\n *\n * SETUP INSTRUCTIONS FOR REACT NATIVE CLI:\n * 1. Install Firebase dependencies:\n * npm install @react-native-firebase/app @react-native-firebase/messaging\n *\n * 2. Configure Firebase:\n * - Android: Add google-services.json to android/app/\n * Apply plugin in android/app/build.gradle: apply plugin: 'com.google.gms.google-services'\n * - iOS: Add GoogleService-Info.plist to ios/ and configure APNs\n * Add FirebaseAppDelegate methods in AppDelegate.m\n *\n * 3. Add permissions to manifests:\n * - Android: INTERNET, VIBRATE, RECEIVE_BOOT_COMPLETED in AndroidManifest.xml\n * - iOS: User Notifications capability in Xcode\n *\n * 4. For iOS, register for remote notifications in AppDelegate:\n * - [UNUserNotificationCenter currentNotificationCenter].delegate = self;\n * - [application registerForRemoteNotifications];\n *\n * SETUP INSTRUCTIONS FOR EXPO:\n * 1. Install expo-notifications:\n * npx expo install expo-notifications\n *\n * 2. Configure in app.config.js:\n * Add appropriate configuration for notifications\n */\nexport function usePushNotifications(options: UsePushNotificationsOptions = {}) {\n const { sdk } = useSolveo();\n const {\n mode = 'widget',\n conversationId,\n autoRegister = false,\n handlers,\n } = options;\n\n const [state, setState] = useState<PushNotificationState>({\n device: null,\n isRegistered: false,\n isInitialized: false,\n permissionStatus: 'undetermined',\n });\n\n /**\n * Request notification permission from the OS\n */\n const requestPermission = useCallback(async (): Promise<boolean> => {\n try {\n // Try to import Firebase Messaging\n const messaging = await import('@react-native-firebase/messaging').then(m => m.default);\n \n const authStatus = await messaging().requestPermission();\n const enabled =\n authStatus === messaging.AuthorizationStatus.AUTHORIZED ||\n authStatus === messaging.AuthorizationStatus.PROVISIONAL;\n\n setState(prev => ({\n ...prev,\n permissionStatus: enabled ? 'granted' : 'denied',\n }));\n\n return enabled;\n } catch (error) {\n console.error('Failed to request permission (Firebase Messaging not installed?):', error);\n \n // Fallback: Try expo-notifications if Firebase not available\n try {\n const Notifications = await import('expo-notifications');\n const { status } = await Notifications.requestPermissionsAsync();\n const granted = status === 'granted';\n \n setState(prev => ({\n ...prev,\n permissionStatus: granted ? 'granted' : 'denied',\n }));\n \n return granted;\n } catch (expoError) {\n console.error('Failed to request permission (Expo Notifications not installed?):', expoError);\n setState(prev => ({ ...prev, permissionStatus: 'denied' }));\n return false;\n }\n }\n }, []);\n\n /**\n * Get FCM token from device\n */\n const getToken = useCallback(async (): Promise<string | null> => {\n try {\n // Try Firebase Messaging first\n const messaging = await import('@react-native-firebase/messaging').then(m => m.default);\n const token = await messaging().getToken();\n return token;\n } catch (error) {\n console.error('Failed to get FCM token:', error);\n \n // Fallback to Expo push token\n try {\n const Notifications = await import('expo-notifications');\n const token = await Notifications.getExpoPushTokenAsync();\n return token.data;\n } catch (expoError) {\n console.error('Failed to get Expo push token:', expoError);\n return null;\n }\n }\n }, []);\n\n /**\n * Register device for push notifications (customer/widget mode)\n */\n const registerDevice = useCallback(\n async (convId?: string, pushToken?: string, bundleId?: string): Promise<Device | null> => {\n if (mode !== 'widget') {\n console.warn('registerDevice is only for widget mode. Use registerAgentDevice for agent mode.');\n return null;\n }\n\n const targetConversationId = convId || conversationId;\n if (!targetConversationId) {\n console.error('conversationId is required for widget mode registration');\n return null;\n }\n\n try {\n const token = pushToken || (await getToken());\n if (!token) {\n throw new Error('Failed to get push token');\n }\n\n const platform = Platform.OS === 'ios' ? 'IOS' : 'ANDROID';\n const device = await sdk.widgetDevices.register({\n conversation_id: targetConversationId,\n platform,\n push_token: token,\n bundle_id: bundleId,\n });\n\n setState(prev => ({ ...prev, device, isRegistered: true }));\n return device;\n } catch (error) {\n console.error('Failed to register device:', error);\n throw error;\n }\n },\n [sdk, conversationId, mode, getToken]\n );\n\n /**\n * Register device for push notifications (agent/dashboard mode)\n */\n const registerAgentDevice = useCallback(\n async (pushToken?: string, deviceName?: string): Promise<any> => {\n if (mode !== 'agent') {\n console.warn('registerAgentDevice is only for agent mode. Use registerDevice for widget mode.');\n return null;\n }\n\n try {\n const token = pushToken || (await getToken());\n if (!token) {\n throw new Error('Failed to get push token');\n }\n\n const platform = Platform.OS === 'ios' ? 'IOS' : 'ANDROID';\n \n // Call authenticated endpoint for agent device registration\n const response = await sdk.client.post('/user-devices', {\n platform,\n push_token: token,\n device_name: deviceName || `${Platform.OS} Device`,\n }) as { data: Device };\n\n setState(prev => ({\n ...prev,\n device: response.data,\n isRegistered: true,\n }));\n\n return response.data;\n } catch (error) {\n console.error('Failed to register agent device:', error);\n throw error;\n }\n },\n [sdk, mode, getToken]\n );\n\n /**\n * Unregister device from push notifications\n */\n const unregisterDevice = useCallback(async () => {\n if (!state.device) {\n return;\n }\n\n try {\n if (mode === 'widget') {\n await sdk.widgetDevices.unregister(state.device.id);\n } else {\n await sdk.client.delete(`/user-devices/${state.device.id}`);\n }\n \n setState(prev => ({\n ...prev,\n device: null,\n isRegistered: false,\n }));\n } catch (error) {\n console.error('Failed to unregister device:', error);\n throw error;\n }\n }, [sdk, state.device, mode]);\n\n /**\n * Setup foreground notification handler\n */\n useEffect(() => {\n if (!handlers?.onNotificationReceived) {\n return;\n }\n\n let unsubscribe: (() => void) | undefined;\n\n const setupForegroundHandler = async () => {\n try {\n // Try Firebase Messaging\n const messaging = await import('@react-native-firebase/messaging').then(m => m.default);\n \n unsubscribe = messaging().onMessage(async remoteMessage => {\n console.log('Foreground notification received:', remoteMessage);\n handlers.onNotificationReceived?.(remoteMessage);\n });\n } catch (error) {\n // Fallback to Expo\n try {\n const Notifications = await import('expo-notifications');\n \n const subscription = Notifications.addNotificationReceivedListener(notification => {\n console.log('Foreground notification received (Expo):', notification);\n handlers.onNotificationReceived?.(notification);\n });\n \n unsubscribe = () => subscription.remove();\n } catch (expoError) {\n console.error('Failed to setup foreground handler:', expoError);\n }\n }\n };\n\n setupForegroundHandler();\n\n return () => {\n unsubscribe?.();\n };\n }, [handlers?.onNotificationReceived]);\n\n /**\n * Setup notification tap handler\n */\n useEffect(() => {\n if (!handlers?.onNotificationTapped) {\n return;\n }\n\n let unsubscribe: (() => void) | undefined;\n\n const setupTapHandler = async () => {\n try {\n // Try Firebase Messaging\n const messaging = await import('@react-native-firebase/messaging').then(m => m.default);\n \n // Handle notification opened app from quit state\n messaging()\n .getInitialNotification()\n .then(remoteMessage => {\n if (remoteMessage) {\n console.log('Notification opened app from quit state:', remoteMessage);\n handlers.onNotificationTapped?.(remoteMessage);\n }\n });\n\n // Handle notification opened app from background state\n unsubscribe = messaging().onNotificationOpenedApp(remoteMessage => {\n console.log('Notification opened app from background:', remoteMessage);\n handlers.onNotificationTapped?.(remoteMessage);\n });\n } catch (error) {\n // Fallback to Expo\n try {\n const Notifications = await import('expo-notifications');\n \n const subscription = Notifications.addNotificationResponseReceivedListener(response => {\n console.log('Notification tapped (Expo):', response);\n handlers.onNotificationTapped?.(response.notification);\n });\n \n unsubscribe = () => subscription.remove();\n } catch (expoError) {\n console.error('Failed to setup tap handler:', expoError);\n }\n }\n };\n\n setupTapHandler();\n\n return () => {\n unsubscribe?.();\n };\n }, [handlers?.onNotificationTapped]);\n\n /**\n * Handle token refresh\n */\n useEffect(() => {\n let unsubscribe: (() => void) | undefined;\n\n const setupTokenRefreshHandler = async () => {\n try {\n const messaging = await import('@react-native-firebase/messaging').then(m => m.default);\n \n unsubscribe = messaging().onTokenRefresh(async newToken => {\n console.log('FCM token refreshed:', newToken);\n \n // Re-register with new token\n if (state.isRegistered) {\n if (mode === 'widget' && conversationId) {\n await registerDevice(conversationId, newToken);\n } else if (mode === 'agent') {\n await registerAgentDevice(newToken);\n }\n }\n });\n } catch (error) {\n console.error('Failed to setup token refresh handler:', error);\n }\n };\n\n setupTokenRefreshHandler();\n\n return () => {\n unsubscribe?.();\n };\n }, [state.isRegistered, mode, conversationId, registerDevice, registerAgentDevice]);\n\n /**\n * Check permission status on mount\n */\n useEffect(() => {\n const checkPermission = async () => {\n try {\n const messaging = await import('@react-native-firebase/messaging').then(m => m.default);\n const authStatus = await messaging().hasPermission();\n const granted =\n authStatus === messaging.AuthorizationStatus.AUTHORIZED ||\n authStatus === messaging.AuthorizationStatus.PROVISIONAL;\n\n setState(prev => ({\n ...prev,\n permissionStatus: granted ? 'granted' : authStatus === messaging.AuthorizationStatus.NOT_DETERMINED ? 'undetermined' : 'denied',\n isInitialized: true,\n }));\n\n // Auto-register if permission granted and autoRegister enabled\n if (granted && autoRegister && !state.isRegistered) {\n if (mode === 'widget' && conversationId) {\n await registerDevice();\n } else if (mode === 'agent') {\n await registerAgentDevice();\n }\n }\n } catch (error) {\n console.error('Failed to check permission:', error);\n setState(prev => ({ ...prev, isInitialized: true }));\n }\n };\n\n checkPermission();\n }, [autoRegister, mode, conversationId, registerDevice, registerAgentDevice]);\n\n return {\n ...state,\n requestPermission,\n registerDevice,\n registerAgentDevice,\n unregisterDevice,\n };\n}\n","import { useState, useCallback } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport type { MessageAttachment } from '@solveo-ai/sdk-core';\n\nexport function useAttachments(conversationId?: string) {\n const { sdk } = useSolveo();\n const [uploading, setUploading] = useState(false);\n const [uploadProgress, setUploadProgress] = useState(0);\n\n const uploadAttachment = useCallback(async (\n file: { uri: string; type?: string; name?: string },\n attachmentType: 'IMAGE' | 'AUDIO' | 'VIDEO' | 'DOCUMENT' | 'VOICE_NOTE'\n ): Promise<MessageAttachment> => {\n if (!conversationId) {\n throw new Error('No conversation ID provided');\n }\n\n setUploading(true);\n setUploadProgress(0);\n\n try {\n // Convert file URI to blob (platform-specific)\n const response = await fetch(file.uri);\n const blob = await response.blob();\n\n const attachment = await sdk.widgetAttachments.upload(conversationId, blob, attachmentType);\n setUploadProgress(100);\n return attachment;\n } catch (error) {\n console.error('Failed to upload attachment:', error);\n throw error;\n } finally {\n setUploading(false);\n setUploadProgress(0);\n }\n }, [sdk, conversationId]);\n\n return {\n uploading,\n uploadProgress,\n uploadAttachment,\n };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport type { Agent, AgentCreateRequest, AgentUpdateRequest } from '@solveo-ai/sdk-core';\n\nexport function useAgents(accountId?: string) {\n const { sdk } = useSolveo();\n const [agents, setAgents] = useState<Agent[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const loadAgents = useCallback(async () => {\n if (!accountId) return;\n setIsLoading(true);\n try {\n const data = await sdk.agents.list(accountId);\n setAgents(data);\n } catch (err: any) {\n setError(err);\n } finally {\n setIsLoading(false);\n }\n }, [sdk, accountId]);\n\n useEffect(() => {\n if (accountId) {\n loadAgents();\n }\n }, [accountId]);\n\n const createAgent = useCallback(async (data: AgentCreateRequest) => {\n if (!accountId) throw new Error('No account ID');\n const agent = await sdk.agents.create(accountId, data);\n setAgents((prev) => [...prev, agent]);\n return agent;\n }, [sdk, accountId]);\n\n const updateAgent = useCallback(async (id: string, data: AgentUpdateRequest) => {\n const agent = await sdk.agents.update(id, data);\n setAgents((prev) => prev.map((a) => (a.id === id ? agent : a)));\n return agent;\n }, [sdk]);\n\n const deleteAgent = useCallback(async (id: string) => {\n await sdk.agents.delete(id);\n setAgents((prev) => prev.filter((a) => a.id !== id));\n }, [sdk]);\n\n return {\n agents,\n isLoading,\n error,\n createAgent,\n updateAgent,\n deleteAgent,\n reload: loadAgents,\n };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport type { Conversation } from '@solveo-ai/sdk-core';\n\nexport function useConversations(accountId?: string) {\n const { sdk } = useSolveo();\n const [conversations, setConversations] = useState<Conversation[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const loadConversations = useCallback(async () => {\n if (!accountId) return;\n setIsLoading(true);\n try {\n const data = await sdk.conversations.list(accountId);\n setConversations(data);\n } catch (err: any) {\n setError(err);\n } finally {\n setIsLoading(false);\n }\n }, [sdk, accountId]);\n\n useEffect(() => {\n if (accountId) {\n loadConversations();\n }\n }, [accountId]);\n\n const resolveConversation = useCallback(async (id: string) => {\n await sdk.conversations.resolve(id);\n setConversations((prev) => prev.map((c) => (c.id === id ? { ...c, status: 'RESOLVED' as const } : c)));\n }, [sdk]);\n\n return {\n conversations,\n isLoading,\n error,\n resolveConversation,\n reload: loadConversations,\n };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport type {\n ConversationMetrics,\n SentimentDistribution,\n FeedbackStats,\n TokenUsageMetrics,\n} from '@solveo-ai/sdk-core';\n\nexport function useAnalytics(accountId?: string, days = 30) {\n const { sdk } = useSolveo();\n const [metrics, setMetrics] = useState<ConversationMetrics | null>(null);\n const [sentiment, setSentiment] = useState<SentimentDistribution | null>(null);\n const [feedback, setFeedback] = useState<FeedbackStats | null>(null);\n const [tokenUsage, setTokenUsage] = useState<TokenUsageMetrics | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const loadAnalytics = useCallback(async () => {\n if (!accountId) return;\n setIsLoading(true);\n try {\n const [m, s, f, t] = await Promise.all([\n sdk.analytics.getMetrics(accountId, days),\n sdk.analytics.getSentiment(accountId, days),\n sdk.analytics.getFeedback(accountId, days),\n sdk.analytics.getTokenUsage(accountId, days),\n ]);\n setMetrics(m);\n setSentiment(s);\n setFeedback(f);\n setTokenUsage(t);\n } catch (err: any) {\n setError(err);\n } finally {\n setIsLoading(false);\n }\n }, [sdk, accountId, days]);\n\n useEffect(() => {\n if (accountId) {\n loadAnalytics();\n }\n }, [accountId, days]);\n\n return {\n metrics,\n sentiment,\n feedback,\n tokenUsage,\n isLoading,\n error,\n reload: loadAnalytics,\n };\n}\n"]}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/SolveoProvider.tsx","../src/utils/storage.ts","../src/hooks/useChat.ts","../src/hooks/useRealtime.ts","../src/hooks/useEscalation.ts","../src/hooks/useWidgetConfig.ts","../src/hooks/usePushNotifications.ts","../src/hooks/useAttachments.ts","../src/hooks/useAgents.ts","../src/hooks/useConversations.ts","../src/hooks/useAnalytics.ts"],"names":["useState","useEffect","useCallback"],"mappings":"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","file":"index.mjs","sourcesContent":["import React, { createContext, useContext, useMemo, ReactNode, useEffect, useState } from 'react';\nimport {\n SolveoSDK,\n type SolveoClientConfig,\n createCustomerSocket,\n createAgentSocket,\n createStreamingSocket,\n CustomerSocketManager,\n AgentSocketManager,\n StreamingSocket,\n type Socket,\n} from '@solveo-ai/sdk-core';\n\n// ============================================================================\n// Context Types\n// ============================================================================\n\nexport interface SolveoContextValue {\n sdk: SolveoSDK;\n config: SolveoProviderConfig;\n // Customer socket (for widget mode)\n customerSocket: Socket | null;\n customerSocketManager: CustomerSocketManager | null;\n // Agent socket (for management mode)\n agentSocket: Socket | null;\n agentSocketManager: AgentSocketManager | null;\n // Streaming socket (for AI responses)\n streamingSocket: StreamingSocket | null;\n // Connection helpers\n connectCustomerSocket: (conversationId: string) => void;\n disconnectCustomerSocket: () => void;\n connectAgentSocket: (token: string) => void;\n disconnectAgentSocket: () => void;\n connectStreamingSocket: (conversationId: string) => void;\n disconnectStreamingSocket: () => void;\n}\n\nconst SolveoContext = createContext<SolveoContextValue | null>(null);\n\n// ============================================================================\n// Provider Props\n// ============================================================================\n\nexport interface SolveoProviderConfig extends Omit<SolveoClientConfig, 'platform'> {\n // User identity (optional)\n user?: {\n email?: string;\n name?: string;\n id?: string;\n };\n // Auto-connect options\n autoConnectCustomer?: boolean;\n autoConnectAgent?: boolean;\n conversationId?: string; // For auto-connecting customer socket\n // Error handler\n onError?: (error: Error) => void;\n}\n\nexport interface SolveoProviderProps {\n children: ReactNode;\n config: SolveoProviderConfig;\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\nexport function SolveoProvider({ children, config }: SolveoProviderProps) {\n const sdk = useMemo(\n () =>\n new SolveoSDK({\n ...config,\n platform: 'react-native',\n }),\n [config.apiUrl, config.apiKey, config.token, config.widgetId]\n );\n\n // Socket states\n const [customerSocket, setCustomerSocket] = useState<Socket | null>(null);\n const [customerSocketManager, setCustomerSocketManager] = useState<CustomerSocketManager | null>(null);\n const [agentSocket, setAgentSocket] = useState<Socket | null>(null);\n const [agentSocketManager, setAgentSocketManager] = useState<AgentSocketManager | null>(null);\n const [streamingSocket, setStreamingSocket] = useState<StreamingSocket | null>(null);\n\n // Connect customer socket\n const connectCustomerSocket = (conversationId: string) => {\n if (customerSocket) {\n customerSocket.disconnect();\n }\n\n const socket = createCustomerSocket(config.apiUrl, conversationId);\n const manager = new CustomerSocketManager(socket);\n\n setCustomerSocket(socket);\n setCustomerSocketManager(manager);\n\n socket.connect();\n };\n\n // Disconnect customer socket\n const disconnectCustomerSocket = () => {\n if (customerSocket) {\n customerSocket.disconnect();\n setCustomerSocket(null);\n setCustomerSocketManager(null);\n }\n };\n\n // Connect agent socket\n const connectAgentSocket = (token: string) => {\n if (agentSocket) {\n agentSocket.disconnect();\n }\n\n const socket = createAgentSocket(config.apiUrl, token);\n const manager = new AgentSocketManager(socket);\n\n setAgentSocket(socket);\n setAgentSocketManager(manager);\n\n socket.connect();\n };\n\n // Disconnect agent socket\n const disconnectAgentSocket = () => {\n if (agentSocket) {\n agentSocket.disconnect();\n setAgentSocket(null);\n setAgentSocketManager(null);\n }\n };\n\n // Connect streaming socket\n const connectStreamingSocket = (conversationId: string) => {\n if (streamingSocket) {\n streamingSocket.disconnect();\n }\n\n const socket = createStreamingSocket(config.apiUrl, conversationId);\n setStreamingSocket(socket);\n\n socket.connect();\n };\n\n // Disconnect streaming socket\n const disconnectStreamingSocket = () => {\n if (streamingSocket) {\n streamingSocket.disconnect();\n setStreamingSocket(null);\n }\n };\n\n // Auto-connect on mount\n useEffect(() => {\n if (config.autoConnectCustomer && config.conversationId) {\n connectCustomerSocket(config.conversationId);\n }\n\n if (config.autoConnectAgent && config.token) {\n connectAgentSocket(config.token);\n }\n\n // Cleanup on unmount\n return () => {\n disconnectCustomerSocket();\n disconnectAgentSocket();\n disconnectStreamingSocket();\n };\n }, [config.autoConnectCustomer, config.autoConnectAgent, config.conversationId, config.token]);\n\n const value: SolveoContextValue = {\n sdk,\n config,\n customerSocket,\n customerSocketManager,\n agentSocket,\n agentSocketManager,\n streamingSocket,\n connectCustomerSocket,\n disconnectCustomerSocket,\n connectAgentSocket,\n disconnectAgentSocket,\n connectStreamingSocket,\n disconnectStreamingSocket,\n };\n\n return <SolveoContext.Provider value={value}>{children}</SolveoContext.Provider>;\n}\n\n// ============================================================================\n// Hook to use Solveo context\n// ============================================================================\n\nexport function useSolveo(): SolveoContextValue {\n const context = useContext(SolveoContext);\n if (!context) {\n throw new Error('useSolveo must be used within a SolveoProvider');\n }\n return context;\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\n\nconst STORAGE_KEYS = {\n CONVERSATION_ID: '@solveo/conversation_id',\n MESSAGES: '@solveo/messages',\n USER_IDENTITY: '@solveo/user_identity',\n WIDGET_CONFIG: '@solveo/widget_config',\n};\n\nexport const storage = {\n async getConversationId(): Promise<string | null> {\n return AsyncStorage.getItem(STORAGE_KEYS.CONVERSATION_ID);\n },\n\n async setConversationId(id: string): Promise<void> {\n await AsyncStorage.setItem(STORAGE_KEYS.CONVERSATION_ID, id);\n },\n\n async clearConversationId(): Promise<void> {\n await AsyncStorage.removeItem(STORAGE_KEYS.CONVERSATION_ID);\n },\n\n async getMessages(conversationId: string): Promise<any[]> {\n const data = await AsyncStorage.getItem(`${STORAGE_KEYS.MESSAGES}_${conversationId}`);\n return data ? JSON.parse(data) : [];\n },\n\n async setMessages(conversationId: string, messages: any[]): Promise<void> {\n await AsyncStorage.setItem(`${STORAGE_KEYS.MESSAGES}_${conversationId}`, JSON.stringify(messages));\n },\n\n async getUserIdentity(): Promise<{ email?: string; name?: string } | null> {\n const data = await AsyncStorage.getItem(STORAGE_KEYS.USER_IDENTITY);\n return data ? JSON.parse(data) : null;\n },\n\n async setUserIdentity(identity: { email?: string; name?: string }): Promise<void> {\n await AsyncStorage.setItem(STORAGE_KEYS.USER_IDENTITY, JSON.stringify(identity));\n },\n\n async getWidgetConfig(widgetId: string): Promise<any | null> {\n const data = await AsyncStorage.getItem(`${STORAGE_KEYS.WIDGET_CONFIG}_${widgetId}`);\n return data ? JSON.parse(data) : null;\n },\n\n async setWidgetConfig(widgetId: string, config: any): Promise<void> {\n await AsyncStorage.setItem(`${STORAGE_KEYS.WIDGET_CONFIG}_${widgetId}`, JSON.stringify(config));\n },\n};\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport { storage } from '../utils/storage';\nimport type { Message, Conversation } from '@solveo-ai/sdk-core';\n\nexport interface UseChatOptions {\n widgetId?: string;\n agentId?: string;\n persistConversation?: boolean;\n}\n\nexport function useChat(options: UseChatOptions = {}) {\n const { sdk, config, streamingSocket, connectStreamingSocket } = useSolveo();\n const [conversation, setConversation] = useState<Conversation | null>(null);\n const [messages, setMessages] = useState<Message[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isStreaming, setIsStreaming] = useState(false);\n const [streamingContent, setStreamingContent] = useState('');\n const [error, setError] = useState<Error | null>(null);\n\n // Load persisted conversation\n useEffect(() => {\n if (options.persistConversation) {\n loadPersistedConversation();\n }\n }, [options.persistConversation]);\n\n // Setup streaming socket listeners\n useEffect(() => {\n if (!streamingSocket || !conversation) return;\n\n const handleMessage = (msg: any) => {\n if (msg.type === 'agent_typing') {\n setIsStreaming(true);\n setStreamingContent('');\n } else if (msg.type === 'agent_message_chunk') {\n setStreamingContent((prev) => prev + (msg.content || ''));\n } else if (msg.type === 'agent_message_complete') {\n setIsStreaming(false);\n if (msg.message_id) {\n loadMessages(conversation.id);\n }\n }\n };\n\n const handleError = (err: any) => {\n setError(new Error(err.message || 'Streaming error'));\n setIsStreaming(false);\n };\n\n streamingSocket.on('message', handleMessage);\n streamingSocket.on('error', handleError);\n\n return () => {\n streamingSocket.off('message', handleMessage);\n streamingSocket.off('error', handleError);\n };\n }, [streamingSocket, conversation]);\n\n const loadPersistedConversation = async () => {\n try {\n const convId = await storage.getConversationId();\n if (convId) {\n const conv = await sdk.widgetConversations.get(convId);\n setConversation(conv);\n await loadMessages(convId);\n }\n } catch (err: any) {\n console.error('Failed to load persisted conversation:', err);\n }\n };\n\n const createConversation = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const identity = await storage.getUserIdentity();\n const conv = await sdk.widgetConversations.create({\n widget_id: options.widgetId || config.widgetId,\n agent_id: options.agentId,\n customer_email: identity?.email || config.user?.email,\n customer_name: identity?.name || config.user?.name,\n });\n setConversation(conv);\n if (options.persistConversation) {\n await storage.setConversationId(conv.id);\n }\n connectStreamingSocket(conv.id);\n return conv;\n } catch (err: any) {\n setError(err);\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, [sdk, options, config]);\n\n const loadMessages = useCallback(async (conversationId: string) => {\n try {\n const msgs = await sdk.widgetMessages.list(conversationId);\n setMessages(msgs);\n if (options.persistConversation) {\n await storage.setMessages(conversationId, msgs);\n }\n } catch (err: any) {\n setError(err);\n }\n }, [sdk, options]);\n\n const sendMessage = useCallback(async (content: string) => {\n if (!conversation) {\n throw new Error('No active conversation');\n }\n setIsLoading(true);\n setError(null);\n try {\n if (streamingSocket?.isConnected()) {\n streamingSocket.sendMessage(content);\n } else {\n const response = await sdk.widgetMessages.send(conversation.id, { content });\n setMessages((prev) => [...prev, response.message, response.ai_response!].filter(Boolean));\n }\n } catch (err: any) {\n setError(err);\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, [conversation, streamingSocket, sdk]);\n\n const submitFeedback = useCallback(async (messageId: string, rating: 'THUMBS_UP' | 'THUMBS_DOWN') => {\n if (!conversation) return;\n try {\n await sdk.widgetMessages.submitFeedback(conversation.id, messageId, rating);\n } catch (err: any) {\n setError(err);\n }\n }, [conversation, sdk]);\n\n return {\n conversation,\n messages,\n isLoading,\n isStreaming,\n streamingContent,\n error,\n createConversation,\n sendMessage,\n loadMessages,\n submitFeedback,\n };\n}\n","import { useState, useEffect } from 'react';\nimport { useSolveo } from '../SolveoProvider';\n\nexport function useRealtime() {\n const { customerSocketManager } = useSolveo();\n const [isConnected, setIsConnected] = useState(false);\n const [agentTyping, setAgentTyping] = useState(false);\n const [queuePosition, setQueuePosition] = useState<number | null>(null);\n const [estimatedWait, setEstimatedWait] = useState<number | null>(null);\n\n useEffect(() => {\n if (!customerSocketManager) return;\n\n const socket = customerSocketManager.getSocket();\n\n socket.on('connect', () => setIsConnected(true));\n socket.on('disconnect', () => setIsConnected(false));\n\n customerSocketManager.onAgentTyping(() => {\n setAgentTyping(true);\n setTimeout(() => setAgentTyping(false), 3000);\n });\n\n customerSocketManager.onQueueUpdate((data) => {\n setQueuePosition(data.queue_position);\n setEstimatedWait(data.estimated_wait);\n });\n\n return () => {\n socket.off('connect');\n socket.off('disconnect');\n };\n }, [customerSocketManager]);\n\n return {\n isConnected,\n agentTyping,\n queuePosition,\n estimatedWait,\n };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport type { HumanAgent } from '@solveo-ai/sdk-core';\n\nexport function useEscalation() {\n const { customerSocketManager, connectCustomerSocket, disconnectCustomerSocket } = useSolveo();\n const [escalationId, setEscalationId] = useState<string | null>(null);\n const [assignedAgent, setAssignedAgent] = useState<HumanAgent | null>(null);\n const [status, setStatus] = useState<'idle' | 'requesting' | 'queued' | 'active' | 'resolved'>('idle');\n\n useEffect(() => {\n if (!customerSocketManager) return;\n\n customerSocketManager.onAgentConnected((data) => {\n setEscalationId(data.escalation_id);\n setAssignedAgent({\n name: data.agent_name,\n avatar_url: data.agent_avatar,\n } as HumanAgent);\n setStatus('active');\n });\n\n customerSocketManager.onQueueUpdate((data) => {\n setStatus('queued');\n });\n\n customerSocketManager.onEscalationResolved(() => {\n setStatus('resolved');\n });\n\n customerSocketManager.onHandedBack(() => {\n setStatus('idle');\n setEscalationId(null);\n setAssignedAgent(null);\n });\n }, [customerSocketManager]);\n\n const requestHuman = useCallback((conversationId: string) => {\n connectCustomerSocket(conversationId);\n if (customerSocketManager) {\n customerSocketManager.requestHuman();\n setStatus('requesting');\n }\n }, [customerSocketManager, connectCustomerSocket]);\n\n const endChat = useCallback(() => {\n if (escalationId && customerSocketManager) {\n customerSocketManager.endChat(escalationId);\n disconnectCustomerSocket();\n setStatus('idle');\n setEscalationId(null);\n setAssignedAgent(null);\n }\n }, [escalationId, customerSocketManager, disconnectCustomerSocket]);\n\n const submitCSAT = useCallback((rating: number) => {\n if (escalationId && customerSocketManager) {\n customerSocketManager.submitCSAT(escalationId, rating);\n }\n }, [escalationId, customerSocketManager]);\n\n return {\n escalationId,\n assignedAgent,\n status,\n requestHuman,\n endChat,\n submitCSAT,\n };\n}\n","import { useState, useEffect } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport { storage } from '../utils/storage';\nimport type { Widget, WidgetConfig } from '@solveo-ai/sdk-core';\n\nexport function useWidgetConfig(widgetId?: string) {\n const { sdk, config } = useSolveo();\n const effectiveWidgetId = widgetId || config.widgetId;\n const [widget, setWidget] = useState<Widget | null>(null);\n const [widgetConfig, setWidgetConfig] = useState<WidgetConfig | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (effectiveWidgetId) {\n loadConfig();\n }\n }, [effectiveWidgetId]);\n\n const loadConfig = async () => {\n if (!effectiveWidgetId) return;\n \n setIsLoading(true);\n setError(null);\n try {\n // Try cache first\n const cached = await storage.getWidgetConfig(effectiveWidgetId);\n if (cached) {\n setWidget(cached);\n setWidgetConfig(cached.config);\n }\n\n // Fetch fresh config\n const w = await sdk.widgetConfig.getConfig(effectiveWidgetId);\n setWidget(w);\n setWidgetConfig(w.config);\n await storage.setWidgetConfig(effectiveWidgetId, w);\n } catch (err: any) {\n setError(err);\n } finally {\n setIsLoading(false);\n }\n };\n\n return {\n widget,\n widgetConfig,\n isLoading,\n error,\n reload: loadConfig,\n };\n}\n","import { useState, useCallback, useEffect } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport { Platform } from 'react-native';\nimport type { Device } from '@solveo-ai/sdk-core';\n\n/**\n * Push notification event handlers\n */\nexport interface PushNotificationHandlers {\n onNotificationReceived?: (notification: any) => void;\n onNotificationTapped?: (notification: any) => void;\n}\n\n/**\n * Push notification state\n */\nexport interface PushNotificationState {\n device: Device | null;\n isRegistered: boolean;\n isInitialized: boolean;\n permissionStatus: 'granted' | 'denied' | 'undetermined';\n}\n\n/**\n * Hook options\n */\nexport interface UsePushNotificationsOptions {\n mode?: 'widget' | 'agent'; // 'widget' for customer-facing, 'agent' for dashboard\n conversationId?: string; // Required for widget mode\n autoRegister?: boolean; // Auto-register if permission granted\n handlers?: PushNotificationHandlers;\n}\n\n/**\n * Enhanced Push Notifications Hook for React Native\n * \n * Supports both customer (widget) and agent (dashboard) modes.\n * Handles permissions, registration, and notification events.\n * \n * SETUP INSTRUCTIONS:\n * 1. Install peer dependencies:\n * npm install @react-native-firebase/app @react-native-firebase/messaging\n * (or expo-notifications for Expo projects)\n * \n * 2. Configure Firebase/APNs:\n * - Android: Add google-services.json to android/app/\n * - iOS: Add GoogleService-Info.plist to ios/ and configure APNs\n * \n * 3. Add permissions to manifests:\n * - Android: INTERNET, VIBRATE, RECEIVE_BOOT_COMPLETED\n * - iOS: User Notifications capability\n */\nexport function usePushNotifications(options: UsePushNotificationsOptions = {}) {\n const { sdk } = useSolveo();\n const {\n mode = 'widget',\n conversationId,\n autoRegister = false,\n handlers,\n } = options;\n\n const [state, setState] = useState<PushNotificationState>({\n device: null,\n isRegistered: false,\n isInitialized: false,\n permissionStatus: 'undetermined',\n });\n\n /**\n * Request notification permission from the OS\n */\n const requestPermission = useCallback(async (): Promise<boolean> => {\n try {\n // Try to import Firebase Messaging\n const messaging = await import('@react-native-firebase/messaging').then(m => m.default);\n \n const authStatus = await messaging().requestPermission();\n const enabled =\n authStatus === messaging.AuthorizationStatus.AUTHORIZED ||\n authStatus === messaging.AuthorizationStatus.PROVISIONAL;\n\n setState(prev => ({\n ...prev,\n permissionStatus: enabled ? 'granted' : 'denied',\n }));\n\n return enabled;\n } catch (error) {\n console.error('Failed to request permission (Firebase Messaging not installed?):', error);\n \n // Fallback: Try expo-notifications if Firebase not available\n try {\n const Notifications = await import('expo-notifications');\n const { status } = await Notifications.requestPermissionsAsync();\n const granted = status === 'granted';\n \n setState(prev => ({\n ...prev,\n permissionStatus: granted ? 'granted' : 'denied',\n }));\n \n return granted;\n } catch (expoError) {\n console.error('Failed to request permission (Expo Notifications not installed?):', expoError);\n setState(prev => ({ ...prev, permissionStatus: 'denied' }));\n return false;\n }\n }\n }, []);\n\n /**\n * Get FCM token from device\n */\n const getToken = useCallback(async (): Promise<string | null> => {\n try {\n // Try Firebase Messaging first\n const messaging = await import('@react-native-firebase/messaging').then(m => m.default);\n const token = await messaging().getToken();\n return token;\n } catch (error) {\n console.error('Failed to get FCM token:', error);\n \n // Fallback to Expo push token\n try {\n const Notifications = await import('expo-notifications');\n const token = await Notifications.getExpoPushTokenAsync();\n return token.data;\n } catch (expoError) {\n console.error('Failed to get Expo push token:', expoError);\n return null;\n }\n }\n }, []);\n\n /**\n * Register device for push notifications (customer/widget mode)\n */\n const registerDevice = useCallback(\n async (convId?: string, pushToken?: string, bundleId?: string): Promise<Device | null> => {\n if (mode !== 'widget') {\n console.warn('registerDevice is only for widget mode. Use registerAgentDevice for agent mode.');\n return null;\n }\n\n const targetConversationId = convId || conversationId;\n if (!targetConversationId) {\n console.error('conversationId is required for widget mode registration');\n return null;\n }\n\n try {\n const token = pushToken || (await getToken());\n if (!token) {\n throw new Error('Failed to get push token');\n }\n\n const platform = Platform.OS === 'ios' ? 'IOS' : 'ANDROID';\n const device = await sdk.widgetDevices.register({\n conversation_id: targetConversationId,\n platform,\n push_token: token,\n bundle_id: bundleId,\n });\n\n setState(prev => ({ ...prev, device, isRegistered: true }));\n return device;\n } catch (error) {\n console.error('Failed to register device:', error);\n throw error;\n }\n },\n [sdk, conversationId, mode, getToken]\n );\n\n /**\n * Register device for push notifications (agent/dashboard mode)\n */\n const registerAgentDevice = useCallback(\n async (pushToken?: string, deviceName?: string): Promise<any> => {\n if (mode !== 'agent') {\n console.warn('registerAgentDevice is only for agent mode. Use registerDevice for widget mode.');\n return null;\n }\n\n try {\n const token = pushToken || (await getToken());\n if (!token) {\n throw new Error('Failed to get push token');\n }\n\n const platform = Platform.OS === 'ios' ? 'IOS' : 'ANDROID';\n \n // Call authenticated endpoint for agent device registration\n const response = await sdk.client.post('/user-devices', {\n platform,\n push_token: token,\n device_name: deviceName || `${Platform.OS} Device`,\n }) as { data: Device };\n\n setState(prev => ({\n ...prev,\n device: response.data,\n isRegistered: true,\n }));\n\n return response.data;\n } catch (error) {\n console.error('Failed to register agent device:', error);\n throw error;\n }\n },\n [sdk, mode, getToken]\n );\n\n /**\n * Unregister device from push notifications\n */\n const unregisterDevice = useCallback(async () => {\n if (!state.device) {\n return;\n }\n\n try {\n if (mode === 'widget') {\n await sdk.widgetDevices.unregister(state.device.id);\n } else {\n await sdk.client.delete(`/user-devices/${state.device.id}`);\n }\n \n setState(prev => ({\n ...prev,\n device: null,\n isRegistered: false,\n }));\n } catch (error) {\n console.error('Failed to unregister device:', error);\n throw error;\n }\n }, [sdk, state.device, mode]);\n\n /**\n * Setup foreground notification handler\n */\n useEffect(() => {\n if (!handlers?.onNotificationReceived) {\n return;\n }\n\n let unsubscribe: (() => void) | undefined;\n\n const setupForegroundHandler = async () => {\n try {\n // Try Firebase Messaging\n const messaging = await import('@react-native-firebase/messaging').then(m => m.default);\n \n unsubscribe = messaging().onMessage(async remoteMessage => {\n console.log('Foreground notification received:', remoteMessage);\n handlers.onNotificationReceived?.(remoteMessage);\n });\n } catch (error) {\n // Fallback to Expo\n try {\n const Notifications = await import('expo-notifications');\n \n const subscription = Notifications.addNotificationReceivedListener(notification => {\n console.log('Foreground notification received (Expo):', notification);\n handlers.onNotificationReceived?.(notification);\n });\n \n unsubscribe = () => subscription.remove();\n } catch (expoError) {\n console.error('Failed to setup foreground handler:', expoError);\n }\n }\n };\n\n setupForegroundHandler();\n\n return () => {\n unsubscribe?.();\n };\n }, [handlers?.onNotificationReceived]);\n\n /**\n * Setup notification tap handler\n */\n useEffect(() => {\n if (!handlers?.onNotificationTapped) {\n return;\n }\n\n let unsubscribe: (() => void) | undefined;\n\n const setupTapHandler = async () => {\n try {\n // Try Firebase Messaging\n const messaging = await import('@react-native-firebase/messaging').then(m => m.default);\n \n // Handle notification opened app from quit state\n messaging()\n .getInitialNotification()\n .then(remoteMessage => {\n if (remoteMessage) {\n console.log('Notification opened app from quit state:', remoteMessage);\n handlers.onNotificationTapped?.(remoteMessage);\n }\n });\n\n // Handle notification opened app from background state\n unsubscribe = messaging().onNotificationOpenedApp(remoteMessage => {\n console.log('Notification opened app from background:', remoteMessage);\n handlers.onNotificationTapped?.(remoteMessage);\n });\n } catch (error) {\n // Fallback to Expo\n try {\n const Notifications = await import('expo-notifications');\n \n const subscription = Notifications.addNotificationResponseReceivedListener(response => {\n console.log('Notification tapped (Expo):', response);\n handlers.onNotificationTapped?.(response.notification);\n });\n \n unsubscribe = () => subscription.remove();\n } catch (expoError) {\n console.error('Failed to setup tap handler:', expoError);\n }\n }\n };\n\n setupTapHandler();\n\n return () => {\n unsubscribe?.();\n };\n }, [handlers?.onNotificationTapped]);\n\n /**\n * Handle token refresh\n */\n useEffect(() => {\n let unsubscribe: (() => void) | undefined;\n\n const setupTokenRefreshHandler = async () => {\n try {\n const messaging = await import('@react-native-firebase/messaging').then(m => m.default);\n \n unsubscribe = messaging().onTokenRefresh(async newToken => {\n console.log('FCM token refreshed:', newToken);\n \n // Re-register with new token\n if (state.isRegistered) {\n if (mode === 'widget' && conversationId) {\n await registerDevice(conversationId, newToken);\n } else if (mode === 'agent') {\n await registerAgentDevice(newToken);\n }\n }\n });\n } catch (error) {\n console.error('Failed to setup token refresh handler:', error);\n }\n };\n\n setupTokenRefreshHandler();\n\n return () => {\n unsubscribe?.();\n };\n }, [state.isRegistered, mode, conversationId, registerDevice, registerAgentDevice]);\n\n /**\n * Check permission status on mount\n */\n useEffect(() => {\n const checkPermission = async () => {\n try {\n const messaging = await import('@react-native-firebase/messaging').then(m => m.default);\n const authStatus = await messaging().hasPermission();\n const granted =\n authStatus === messaging.AuthorizationStatus.AUTHORIZED ||\n authStatus === messaging.AuthorizationStatus.PROVISIONAL;\n\n setState(prev => ({\n ...prev,\n permissionStatus: granted ? 'granted' : authStatus === messaging.AuthorizationStatus.NOT_DETERMINED ? 'undetermined' : 'denied',\n isInitialized: true,\n }));\n\n // Auto-register if permission granted and autoRegister enabled\n if (granted && autoRegister && !state.isRegistered) {\n if (mode === 'widget' && conversationId) {\n await registerDevice();\n } else if (mode === 'agent') {\n await registerAgentDevice();\n }\n }\n } catch (error) {\n console.error('Failed to check permission:', error);\n setState(prev => ({ ...prev, isInitialized: true }));\n }\n };\n\n checkPermission();\n }, [autoRegister, mode, conversationId, registerDevice, registerAgentDevice]);\n\n return {\n ...state,\n requestPermission,\n registerDevice,\n registerAgentDevice,\n unregisterDevice,\n };\n}\n","import { useState, useCallback } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport type { MessageAttachment } from '@solveo-ai/sdk-core';\n\nexport function useAttachments(conversationId?: string) {\n const { sdk } = useSolveo();\n const [uploading, setUploading] = useState(false);\n const [uploadProgress, setUploadProgress] = useState(0);\n\n const uploadAttachment = useCallback(async (\n file: { uri: string; type?: string; name?: string },\n attachmentType: 'IMAGE' | 'AUDIO' | 'VIDEO' | 'DOCUMENT' | 'VOICE_NOTE'\n ): Promise<MessageAttachment> => {\n if (!conversationId) {\n throw new Error('No conversation ID provided');\n }\n\n setUploading(true);\n setUploadProgress(0);\n\n try {\n // Convert file URI to blob (platform-specific)\n const response = await fetch(file.uri);\n const blob = await response.blob();\n\n const attachment = await sdk.widgetAttachments.upload(conversationId, blob, attachmentType);\n setUploadProgress(100);\n return attachment;\n } catch (error) {\n console.error('Failed to upload attachment:', error);\n throw error;\n } finally {\n setUploading(false);\n setUploadProgress(0);\n }\n }, [sdk, conversationId]);\n\n return {\n uploading,\n uploadProgress,\n uploadAttachment,\n };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport type { Agent, AgentCreateRequest, AgentUpdateRequest } from '@solveo-ai/sdk-core';\n\nexport function useAgents(accountId?: string) {\n const { sdk } = useSolveo();\n const [agents, setAgents] = useState<Agent[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const loadAgents = useCallback(async () => {\n if (!accountId) return;\n setIsLoading(true);\n try {\n const data = await sdk.agents.list(accountId);\n setAgents(data);\n } catch (err: any) {\n setError(err);\n } finally {\n setIsLoading(false);\n }\n }, [sdk, accountId]);\n\n useEffect(() => {\n if (accountId) {\n loadAgents();\n }\n }, [accountId]);\n\n const createAgent = useCallback(async (data: AgentCreateRequest) => {\n if (!accountId) throw new Error('No account ID');\n const agent = await sdk.agents.create(accountId, data);\n setAgents((prev) => [...prev, agent]);\n return agent;\n }, [sdk, accountId]);\n\n const updateAgent = useCallback(async (id: string, data: AgentUpdateRequest) => {\n const agent = await sdk.agents.update(id, data);\n setAgents((prev) => prev.map((a) => (a.id === id ? agent : a)));\n return agent;\n }, [sdk]);\n\n const deleteAgent = useCallback(async (id: string) => {\n await sdk.agents.delete(id);\n setAgents((prev) => prev.filter((a) => a.id !== id));\n }, [sdk]);\n\n return {\n agents,\n isLoading,\n error,\n createAgent,\n updateAgent,\n deleteAgent,\n reload: loadAgents,\n };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport type { Conversation } from '@solveo-ai/sdk-core';\n\nexport function useConversations(accountId?: string) {\n const { sdk } = useSolveo();\n const [conversations, setConversations] = useState<Conversation[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const loadConversations = useCallback(async () => {\n if (!accountId) return;\n setIsLoading(true);\n try {\n const data = await sdk.conversations.list(accountId);\n setConversations(data);\n } catch (err: any) {\n setError(err);\n } finally {\n setIsLoading(false);\n }\n }, [sdk, accountId]);\n\n useEffect(() => {\n if (accountId) {\n loadConversations();\n }\n }, [accountId]);\n\n const resolveConversation = useCallback(async (id: string) => {\n await sdk.conversations.resolve(id);\n setConversations((prev) => prev.map((c) => (c.id === id ? { ...c, status: 'RESOLVED' as const } : c)));\n }, [sdk]);\n\n return {\n conversations,\n isLoading,\n error,\n resolveConversation,\n reload: loadConversations,\n };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport type {\n ConversationMetrics,\n SentimentDistribution,\n FeedbackStats,\n TokenUsageMetrics,\n} from '@solveo-ai/sdk-core';\n\nexport function useAnalytics(accountId?: string, days = 30) {\n const { sdk } = useSolveo();\n const [metrics, setMetrics] = useState<ConversationMetrics | null>(null);\n const [sentiment, setSentiment] = useState<SentimentDistribution | null>(null);\n const [feedback, setFeedback] = useState<FeedbackStats | null>(null);\n const [tokenUsage, setTokenUsage] = useState<TokenUsageMetrics | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const loadAnalytics = useCallback(async () => {\n if (!accountId) return;\n setIsLoading(true);\n try {\n const [m, s, f, t] = await Promise.all([\n sdk.analytics.getMetrics(accountId, days),\n sdk.analytics.getSentiment(accountId, days),\n sdk.analytics.getFeedback(accountId, days),\n sdk.analytics.getTokenUsage(accountId, days),\n ]);\n setMetrics(m);\n setSentiment(s);\n setFeedback(f);\n setTokenUsage(t);\n } catch (err: any) {\n setError(err);\n } finally {\n setIsLoading(false);\n }\n }, [sdk, accountId, days]);\n\n useEffect(() => {\n if (accountId) {\n loadAnalytics();\n }\n }, [accountId, days]);\n\n return {\n metrics,\n sentiment,\n feedback,\n tokenUsage,\n isLoading,\n error,\n reload: loadAnalytics,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/SolveoProvider.tsx","../src/utils/storage.ts","../src/hooks/useChat.ts","../src/hooks/useRealtime.ts","../src/hooks/useEscalation.ts","../src/hooks/useWidgetConfig.ts","../src/hooks/usePushNotifications.ts","../src/hooks/useAttachments.ts","../src/hooks/useAgents.ts","../src/hooks/useConversations.ts","../src/hooks/useAnalytics.ts"],"names":["useState","useEffect","useCallback"],"mappings":"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","file":"index.mjs","sourcesContent":["import React, { createContext, useContext, useMemo, ReactNode, useEffect, useState } from 'react';\nimport {\n SolveoSDK,\n type SolveoClientConfig,\n createCustomerSocket,\n createAgentSocket,\n createStreamingSocket,\n CustomerSocketManager,\n AgentSocketManager,\n StreamingSocket,\n type Socket,\n} from '@solveo-ai/sdk-core';\n\n// ============================================================================\n// Context Types\n// ============================================================================\n\nexport interface SolveoContextValue {\n sdk: SolveoSDK;\n config: SolveoProviderConfig;\n // Customer socket (for widget mode)\n customerSocket: Socket | null;\n customerSocketManager: CustomerSocketManager | null;\n // Agent socket (for management mode)\n agentSocket: Socket | null;\n agentSocketManager: AgentSocketManager | null;\n // Streaming socket (for AI responses)\n streamingSocket: StreamingSocket | null;\n // Connection helpers\n connectCustomerSocket: (conversationId: string) => void;\n disconnectCustomerSocket: () => void;\n connectAgentSocket: (token: string) => void;\n disconnectAgentSocket: () => void;\n connectStreamingSocket: (conversationId: string) => void;\n disconnectStreamingSocket: () => void;\n}\n\nconst SolveoContext = createContext<SolveoContextValue | null>(null);\n\n// ============================================================================\n// Provider Props\n// ============================================================================\n\nexport interface SolveoProviderConfig extends Omit<SolveoClientConfig, 'platform'> {\n // User identity (optional)\n user?: {\n email?: string;\n name?: string;\n id?: string;\n };\n // Auto-connect options\n autoConnectCustomer?: boolean;\n autoConnectAgent?: boolean;\n conversationId?: string; // For auto-connecting customer socket\n // Error handler\n onError?: (error: Error) => void;\n}\n\nexport interface SolveoProviderProps {\n children: ReactNode;\n config: SolveoProviderConfig;\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\nexport function SolveoProvider({ children, config }: SolveoProviderProps) {\n const sdk = useMemo(\n () =>\n new SolveoSDK({\n ...config,\n platform: 'react-native',\n }),\n [config.apiUrl, config.apiKey, config.token, config.widgetId]\n );\n\n // Socket states\n const [customerSocket, setCustomerSocket] = useState<Socket | null>(null);\n const [customerSocketManager, setCustomerSocketManager] = useState<CustomerSocketManager | null>(null);\n const [agentSocket, setAgentSocket] = useState<Socket | null>(null);\n const [agentSocketManager, setAgentSocketManager] = useState<AgentSocketManager | null>(null);\n const [streamingSocket, setStreamingSocket] = useState<StreamingSocket | null>(null);\n\n // Connect customer socket\n const connectCustomerSocket = (conversationId: string) => {\n if (customerSocket) {\n customerSocket.disconnect();\n }\n\n const socket = createCustomerSocket(config.apiUrl, conversationId);\n const manager = new CustomerSocketManager(socket);\n\n setCustomerSocket(socket);\n setCustomerSocketManager(manager);\n\n socket.connect();\n };\n\n // Disconnect customer socket\n const disconnectCustomerSocket = () => {\n if (customerSocket) {\n customerSocket.disconnect();\n setCustomerSocket(null);\n setCustomerSocketManager(null);\n }\n };\n\n // Connect agent socket\n const connectAgentSocket = (token: string) => {\n if (agentSocket) {\n agentSocket.disconnect();\n }\n\n const socket = createAgentSocket(config.apiUrl, token);\n const manager = new AgentSocketManager(socket);\n\n setAgentSocket(socket);\n setAgentSocketManager(manager);\n\n socket.connect();\n };\n\n // Disconnect agent socket\n const disconnectAgentSocket = () => {\n if (agentSocket) {\n agentSocket.disconnect();\n setAgentSocket(null);\n setAgentSocketManager(null);\n }\n };\n\n // Connect streaming socket\n const connectStreamingSocket = (conversationId: string) => {\n if (streamingSocket) {\n streamingSocket.disconnect();\n }\n\n const socket = createStreamingSocket(config.apiUrl, conversationId);\n setStreamingSocket(socket);\n\n socket.connect();\n };\n\n // Disconnect streaming socket\n const disconnectStreamingSocket = () => {\n if (streamingSocket) {\n streamingSocket.disconnect();\n setStreamingSocket(null);\n }\n };\n\n // Auto-connect on mount\n useEffect(() => {\n if (config.autoConnectCustomer && config.conversationId) {\n connectCustomerSocket(config.conversationId);\n }\n\n if (config.autoConnectAgent && config.token) {\n connectAgentSocket(config.token);\n }\n\n // Cleanup on unmount\n return () => {\n disconnectCustomerSocket();\n disconnectAgentSocket();\n disconnectStreamingSocket();\n };\n }, [config.autoConnectCustomer, config.autoConnectAgent, config.conversationId, config.token]);\n\n const value: SolveoContextValue = {\n sdk,\n config,\n customerSocket,\n customerSocketManager,\n agentSocket,\n agentSocketManager,\n streamingSocket,\n connectCustomerSocket,\n disconnectCustomerSocket,\n connectAgentSocket,\n disconnectAgentSocket,\n connectStreamingSocket,\n disconnectStreamingSocket,\n };\n\n return <SolveoContext.Provider value={value}>{children}</SolveoContext.Provider>;\n}\n\n// ============================================================================\n// Hook to use Solveo context\n// ============================================================================\n\nexport function useSolveo(): SolveoContextValue {\n const context = useContext(SolveoContext);\n if (!context) {\n throw new Error('useSolveo must be used within a SolveoProvider');\n }\n return context;\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\n\nconst STORAGE_KEYS = {\n CONVERSATION_ID: '@solveo/conversation_id',\n MESSAGES: '@solveo/messages',\n USER_IDENTITY: '@solveo/user_identity',\n WIDGET_CONFIG: '@solveo/widget_config',\n};\n\nexport const storage = {\n async getConversationId(): Promise<string | null> {\n return AsyncStorage.getItem(STORAGE_KEYS.CONVERSATION_ID);\n },\n\n async setConversationId(id: string): Promise<void> {\n await AsyncStorage.setItem(STORAGE_KEYS.CONVERSATION_ID, id);\n },\n\n async clearConversationId(): Promise<void> {\n await AsyncStorage.removeItem(STORAGE_KEYS.CONVERSATION_ID);\n },\n\n async getMessages(conversationId: string): Promise<any[]> {\n const data = await AsyncStorage.getItem(`${STORAGE_KEYS.MESSAGES}_${conversationId}`);\n return data ? JSON.parse(data) : [];\n },\n\n async setMessages(conversationId: string, messages: any[]): Promise<void> {\n await AsyncStorage.setItem(`${STORAGE_KEYS.MESSAGES}_${conversationId}`, JSON.stringify(messages));\n },\n\n async getUserIdentity(): Promise<{ email?: string; name?: string } | null> {\n const data = await AsyncStorage.getItem(STORAGE_KEYS.USER_IDENTITY);\n return data ? JSON.parse(data) : null;\n },\n\n async setUserIdentity(identity: { email?: string; name?: string }): Promise<void> {\n await AsyncStorage.setItem(STORAGE_KEYS.USER_IDENTITY, JSON.stringify(identity));\n },\n\n async getWidgetConfig(widgetId: string): Promise<any | null> {\n const data = await AsyncStorage.getItem(`${STORAGE_KEYS.WIDGET_CONFIG}_${widgetId}`);\n return data ? JSON.parse(data) : null;\n },\n\n async setWidgetConfig(widgetId: string, config: any): Promise<void> {\n await AsyncStorage.setItem(`${STORAGE_KEYS.WIDGET_CONFIG}_${widgetId}`, JSON.stringify(config));\n },\n};\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport { storage } from '../utils/storage';\nimport type { Message, Conversation } from '@solveo-ai/sdk-core';\n\nexport interface UseChatOptions {\n widgetId?: string;\n agentId?: string;\n persistConversation?: boolean;\n}\n\nexport function useChat(options: UseChatOptions = {}) {\n const { sdk, config, streamingSocket, connectStreamingSocket } = useSolveo();\n const [conversation, setConversation] = useState<Conversation | null>(null);\n const [messages, setMessages] = useState<Message[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isStreaming, setIsStreaming] = useState(false);\n const [streamingContent, setStreamingContent] = useState('');\n const [error, setError] = useState<Error | null>(null);\n\n // Load persisted conversation\n useEffect(() => {\n if (options.persistConversation) {\n loadPersistedConversation();\n }\n }, [options.persistConversation]);\n\n // Setup streaming socket listeners\n useEffect(() => {\n if (!streamingSocket || !conversation) return;\n\n const handleMessage = (msg: any) => {\n if (msg.type === 'agent_typing') {\n setIsStreaming(true);\n setStreamingContent('');\n } else if (msg.type === 'agent_message_chunk') {\n setStreamingContent((prev) => prev + (msg.content || ''));\n } else if (msg.type === 'agent_message_complete') {\n setIsStreaming(false);\n if (msg.message_id) {\n loadMessages(conversation.id);\n }\n }\n };\n\n const handleError = (err: any) => {\n setError(new Error(err.message || 'Streaming error'));\n setIsStreaming(false);\n };\n\n streamingSocket.on('message', handleMessage);\n streamingSocket.on('error', handleError);\n\n return () => {\n streamingSocket.off('message', handleMessage);\n streamingSocket.off('error', handleError);\n };\n }, [streamingSocket, conversation]);\n\n const loadPersistedConversation = async () => {\n try {\n const convId = await storage.getConversationId();\n if (convId) {\n const conv = await sdk.widgetConversations.get(convId);\n setConversation(conv);\n await loadMessages(convId);\n }\n } catch (err: any) {\n console.error('Failed to load persisted conversation:', err);\n }\n };\n\n const createConversation = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const identity = await storage.getUserIdentity();\n const conv = await sdk.widgetConversations.create({\n widget_id: options.widgetId || config.widgetId,\n agent_id: options.agentId,\n customer_email: identity?.email || config.user?.email,\n customer_name: identity?.name || config.user?.name,\n });\n setConversation(conv);\n if (options.persistConversation) {\n await storage.setConversationId(conv.id);\n }\n connectStreamingSocket(conv.id);\n return conv;\n } catch (err: any) {\n setError(err);\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, [sdk, options, config]);\n\n const loadMessages = useCallback(async (conversationId: string) => {\n try {\n const msgs = await sdk.widgetMessages.list(conversationId);\n setMessages(msgs);\n if (options.persistConversation) {\n await storage.setMessages(conversationId, msgs);\n }\n } catch (err: any) {\n setError(err);\n }\n }, [sdk, options]);\n\n const sendMessage = useCallback(async (content: string) => {\n if (!conversation) {\n throw new Error('No active conversation');\n }\n setIsLoading(true);\n setError(null);\n try {\n if (streamingSocket?.isConnected()) {\n streamingSocket.sendMessage(content);\n } else {\n const response = await sdk.widgetMessages.send(conversation.id, { content });\n setMessages((prev) => [...prev, response.message, response.ai_response!].filter(Boolean));\n }\n } catch (err: any) {\n setError(err);\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, [conversation, streamingSocket, sdk]);\n\n const submitFeedback = useCallback(async (messageId: string, rating: 'THUMBS_UP' | 'THUMBS_DOWN') => {\n if (!conversation) return;\n try {\n await sdk.widgetMessages.submitFeedback(conversation.id, messageId, rating);\n } catch (err: any) {\n setError(err);\n }\n }, [conversation, sdk]);\n\n return {\n conversation,\n messages,\n isLoading,\n isStreaming,\n streamingContent,\n error,\n createConversation,\n sendMessage,\n loadMessages,\n submitFeedback,\n };\n}\n","import { useState, useEffect } from 'react';\nimport { useSolveo } from '../SolveoProvider';\n\nexport function useRealtime() {\n const { customerSocketManager } = useSolveo();\n const [isConnected, setIsConnected] = useState(false);\n const [agentTyping, setAgentTyping] = useState(false);\n const [queuePosition, setQueuePosition] = useState<number | null>(null);\n const [estimatedWait, setEstimatedWait] = useState<number | null>(null);\n\n useEffect(() => {\n if (!customerSocketManager) return;\n\n const socket = customerSocketManager.getSocket();\n\n socket.on('connect', () => setIsConnected(true));\n socket.on('disconnect', () => setIsConnected(false));\n\n customerSocketManager.onAgentTyping(() => {\n setAgentTyping(true);\n setTimeout(() => setAgentTyping(false), 3000);\n });\n\n customerSocketManager.onQueueUpdate((data) => {\n setQueuePosition(data.queue_position);\n setEstimatedWait(data.estimated_wait);\n });\n\n return () => {\n socket.off('connect');\n socket.off('disconnect');\n };\n }, [customerSocketManager]);\n\n return {\n isConnected,\n agentTyping,\n queuePosition,\n estimatedWait,\n };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport type { HumanAgent } from '@solveo-ai/sdk-core';\n\nexport function useEscalation() {\n const { customerSocketManager, connectCustomerSocket, disconnectCustomerSocket } = useSolveo();\n const [escalationId, setEscalationId] = useState<string | null>(null);\n const [assignedAgent, setAssignedAgent] = useState<HumanAgent | null>(null);\n const [status, setStatus] = useState<'idle' | 'requesting' | 'queued' | 'active' | 'resolved'>('idle');\n\n useEffect(() => {\n if (!customerSocketManager) return;\n\n customerSocketManager.onAgentConnected((data) => {\n setEscalationId(data.escalation_id);\n setAssignedAgent({\n name: data.agent_name,\n avatar_url: data.agent_avatar,\n } as HumanAgent);\n setStatus('active');\n });\n\n customerSocketManager.onQueueUpdate((data) => {\n setStatus('queued');\n });\n\n customerSocketManager.onEscalationResolved(() => {\n setStatus('resolved');\n });\n\n customerSocketManager.onHandedBack(() => {\n setStatus('idle');\n setEscalationId(null);\n setAssignedAgent(null);\n });\n }, [customerSocketManager]);\n\n const requestHuman = useCallback((conversationId: string) => {\n connectCustomerSocket(conversationId);\n if (customerSocketManager) {\n customerSocketManager.requestHuman();\n setStatus('requesting');\n }\n }, [customerSocketManager, connectCustomerSocket]);\n\n const endChat = useCallback(() => {\n if (escalationId && customerSocketManager) {\n customerSocketManager.endChat(escalationId);\n disconnectCustomerSocket();\n setStatus('idle');\n setEscalationId(null);\n setAssignedAgent(null);\n }\n }, [escalationId, customerSocketManager, disconnectCustomerSocket]);\n\n const submitCSAT = useCallback((rating: number) => {\n if (escalationId && customerSocketManager) {\n customerSocketManager.submitCSAT(escalationId, rating);\n }\n }, [escalationId, customerSocketManager]);\n\n return {\n escalationId,\n assignedAgent,\n status,\n requestHuman,\n endChat,\n submitCSAT,\n };\n}\n","import { useState, useEffect } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport { storage } from '../utils/storage';\nimport type { Widget, WidgetConfig } from '@solveo-ai/sdk-core';\n\nexport function useWidgetConfig(widgetId?: string) {\n const { sdk, config } = useSolveo();\n const effectiveWidgetId = widgetId || config.widgetId;\n const [widget, setWidget] = useState<Widget | null>(null);\n const [widgetConfig, setWidgetConfig] = useState<WidgetConfig | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (effectiveWidgetId) {\n loadConfig();\n }\n }, [effectiveWidgetId]);\n\n const loadConfig = async () => {\n if (!effectiveWidgetId) return;\n \n setIsLoading(true);\n setError(null);\n try {\n // Try cache first\n const cached = await storage.getWidgetConfig(effectiveWidgetId);\n if (cached) {\n setWidget(cached);\n setWidgetConfig(cached.config);\n }\n\n // Fetch fresh config\n const w = await sdk.widgetConfig.getConfig(effectiveWidgetId);\n setWidget(w);\n setWidgetConfig(w.config);\n await storage.setWidgetConfig(effectiveWidgetId, w);\n } catch (err: any) {\n setError(err);\n } finally {\n setIsLoading(false);\n }\n };\n\n return {\n widget,\n widgetConfig,\n isLoading,\n error,\n reload: loadConfig,\n };\n}\n","import { useState, useCallback, useEffect } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport { Platform } from 'react-native';\nimport type { Device } from '@solveo-ai/sdk-core';\n\n/**\n * Push notification event handlers\n */\nexport interface PushNotificationHandlers {\n onNotificationReceived?: (notification: any) => void;\n onNotificationTapped?: (notification: any) => void;\n}\n\n/**\n * Push notification state\n */\nexport interface PushNotificationState {\n device: Device | null;\n isRegistered: boolean;\n isInitialized: boolean;\n permissionStatus: 'granted' | 'denied' | 'undetermined';\n}\n\n/**\n * Hook options\n */\nexport interface UsePushNotificationsOptions {\n mode?: 'widget' | 'agent'; // 'widget' for customer-facing, 'agent' for dashboard\n conversationId?: string; // Required for widget mode\n autoRegister?: boolean; // Auto-register if permission granted\n handlers?: PushNotificationHandlers;\n}\n\n/**\n * Enhanced Push Notifications Hook for React Native\n *\n * Supports both customer (widget) and agent (dashboard) modes.\n * Handles permissions, registration, and notification events.\n *\n * Works with both React Native CLI and Expo projects. Automatically detects\n * which push notification system is available:\n * - React Native CLI: Uses @react-native-firebase/messaging\n * - Expo: Uses expo-notifications\n *\n * SETUP INSTRUCTIONS FOR REACT NATIVE CLI:\n * 1. Install Firebase dependencies:\n * npm install @react-native-firebase/app @react-native-firebase/messaging\n *\n * 2. Configure Firebase:\n * - Android: Add google-services.json to android/app/\n * Apply plugin in android/app/build.gradle: apply plugin: 'com.google.gms.google-services'\n * - iOS: Add GoogleService-Info.plist to ios/ and configure APNs\n * Add FirebaseAppDelegate methods in AppDelegate.m\n *\n * 3. Add permissions to manifests:\n * - Android: INTERNET, VIBRATE, RECEIVE_BOOT_COMPLETED in AndroidManifest.xml\n * - iOS: User Notifications capability in Xcode\n *\n * 4. For iOS, register for remote notifications in AppDelegate:\n * - [UNUserNotificationCenter currentNotificationCenter].delegate = self;\n * - [application registerForRemoteNotifications];\n *\n * SETUP INSTRUCTIONS FOR EXPO:\n * 1. Install expo-notifications:\n * npx expo install expo-notifications\n *\n * 2. Configure in app.config.js:\n * Add appropriate configuration for notifications\n */\nexport function usePushNotifications(options: UsePushNotificationsOptions = {}) {\n const { sdk } = useSolveo();\n const {\n mode = 'widget',\n conversationId,\n autoRegister = false,\n handlers,\n } = options;\n\n const [state, setState] = useState<PushNotificationState>({\n device: null,\n isRegistered: false,\n isInitialized: false,\n permissionStatus: 'undetermined',\n });\n\n /**\n * Request notification permission from the OS\n */\n const requestPermission = useCallback(async (): Promise<boolean> => {\n try {\n // Try to import Firebase Messaging\n const messaging = await import('@react-native-firebase/messaging').then(m => m.default);\n \n const authStatus = await messaging().requestPermission();\n const enabled =\n authStatus === messaging.AuthorizationStatus.AUTHORIZED ||\n authStatus === messaging.AuthorizationStatus.PROVISIONAL;\n\n setState(prev => ({\n ...prev,\n permissionStatus: enabled ? 'granted' : 'denied',\n }));\n\n return enabled;\n } catch (error) {\n console.error('Failed to request permission (Firebase Messaging not installed?):', error);\n \n // Fallback: Try expo-notifications if Firebase not available\n try {\n const Notifications = await import('expo-notifications');\n const { status } = await Notifications.requestPermissionsAsync();\n const granted = status === 'granted';\n \n setState(prev => ({\n ...prev,\n permissionStatus: granted ? 'granted' : 'denied',\n }));\n \n return granted;\n } catch (expoError) {\n console.error('Failed to request permission (Expo Notifications not installed?):', expoError);\n setState(prev => ({ ...prev, permissionStatus: 'denied' }));\n return false;\n }\n }\n }, []);\n\n /**\n * Get FCM token from device\n */\n const getToken = useCallback(async (): Promise<string | null> => {\n try {\n // Try Firebase Messaging first\n const messaging = await import('@react-native-firebase/messaging').then(m => m.default);\n const token = await messaging().getToken();\n return token;\n } catch (error) {\n console.error('Failed to get FCM token:', error);\n \n // Fallback to Expo push token\n try {\n const Notifications = await import('expo-notifications');\n const token = await Notifications.getExpoPushTokenAsync();\n return token.data;\n } catch (expoError) {\n console.error('Failed to get Expo push token:', expoError);\n return null;\n }\n }\n }, []);\n\n /**\n * Register device for push notifications (customer/widget mode)\n */\n const registerDevice = useCallback(\n async (convId?: string, pushToken?: string, bundleId?: string): Promise<Device | null> => {\n if (mode !== 'widget') {\n console.warn('registerDevice is only for widget mode. Use registerAgentDevice for agent mode.');\n return null;\n }\n\n const targetConversationId = convId || conversationId;\n if (!targetConversationId) {\n console.error('conversationId is required for widget mode registration');\n return null;\n }\n\n try {\n const token = pushToken || (await getToken());\n if (!token) {\n throw new Error('Failed to get push token');\n }\n\n const platform = Platform.OS === 'ios' ? 'IOS' : 'ANDROID';\n const device = await sdk.widgetDevices.register({\n conversation_id: targetConversationId,\n platform,\n push_token: token,\n bundle_id: bundleId,\n });\n\n setState(prev => ({ ...prev, device, isRegistered: true }));\n return device;\n } catch (error) {\n console.error('Failed to register device:', error);\n throw error;\n }\n },\n [sdk, conversationId, mode, getToken]\n );\n\n /**\n * Register device for push notifications (agent/dashboard mode)\n */\n const registerAgentDevice = useCallback(\n async (pushToken?: string, deviceName?: string): Promise<any> => {\n if (mode !== 'agent') {\n console.warn('registerAgentDevice is only for agent mode. Use registerDevice for widget mode.');\n return null;\n }\n\n try {\n const token = pushToken || (await getToken());\n if (!token) {\n throw new Error('Failed to get push token');\n }\n\n const platform = Platform.OS === 'ios' ? 'IOS' : 'ANDROID';\n \n // Call authenticated endpoint for agent device registration\n const response = await sdk.client.post('/user-devices', {\n platform,\n push_token: token,\n device_name: deviceName || `${Platform.OS} Device`,\n }) as { data: Device };\n\n setState(prev => ({\n ...prev,\n device: response.data,\n isRegistered: true,\n }));\n\n return response.data;\n } catch (error) {\n console.error('Failed to register agent device:', error);\n throw error;\n }\n },\n [sdk, mode, getToken]\n );\n\n /**\n * Unregister device from push notifications\n */\n const unregisterDevice = useCallback(async () => {\n if (!state.device) {\n return;\n }\n\n try {\n if (mode === 'widget') {\n await sdk.widgetDevices.unregister(state.device.id);\n } else {\n await sdk.client.delete(`/user-devices/${state.device.id}`);\n }\n \n setState(prev => ({\n ...prev,\n device: null,\n isRegistered: false,\n }));\n } catch (error) {\n console.error('Failed to unregister device:', error);\n throw error;\n }\n }, [sdk, state.device, mode]);\n\n /**\n * Setup foreground notification handler\n */\n useEffect(() => {\n if (!handlers?.onNotificationReceived) {\n return;\n }\n\n let unsubscribe: (() => void) | undefined;\n\n const setupForegroundHandler = async () => {\n try {\n // Try Firebase Messaging\n const messaging = await import('@react-native-firebase/messaging').then(m => m.default);\n \n unsubscribe = messaging().onMessage(async remoteMessage => {\n console.log('Foreground notification received:', remoteMessage);\n handlers.onNotificationReceived?.(remoteMessage);\n });\n } catch (error) {\n // Fallback to Expo\n try {\n const Notifications = await import('expo-notifications');\n \n const subscription = Notifications.addNotificationReceivedListener(notification => {\n console.log('Foreground notification received (Expo):', notification);\n handlers.onNotificationReceived?.(notification);\n });\n \n unsubscribe = () => subscription.remove();\n } catch (expoError) {\n console.error('Failed to setup foreground handler:', expoError);\n }\n }\n };\n\n setupForegroundHandler();\n\n return () => {\n unsubscribe?.();\n };\n }, [handlers?.onNotificationReceived]);\n\n /**\n * Setup notification tap handler\n */\n useEffect(() => {\n if (!handlers?.onNotificationTapped) {\n return;\n }\n\n let unsubscribe: (() => void) | undefined;\n\n const setupTapHandler = async () => {\n try {\n // Try Firebase Messaging\n const messaging = await import('@react-native-firebase/messaging').then(m => m.default);\n \n // Handle notification opened app from quit state\n messaging()\n .getInitialNotification()\n .then(remoteMessage => {\n if (remoteMessage) {\n console.log('Notification opened app from quit state:', remoteMessage);\n handlers.onNotificationTapped?.(remoteMessage);\n }\n });\n\n // Handle notification opened app from background state\n unsubscribe = messaging().onNotificationOpenedApp(remoteMessage => {\n console.log('Notification opened app from background:', remoteMessage);\n handlers.onNotificationTapped?.(remoteMessage);\n });\n } catch (error) {\n // Fallback to Expo\n try {\n const Notifications = await import('expo-notifications');\n \n const subscription = Notifications.addNotificationResponseReceivedListener(response => {\n console.log('Notification tapped (Expo):', response);\n handlers.onNotificationTapped?.(response.notification);\n });\n \n unsubscribe = () => subscription.remove();\n } catch (expoError) {\n console.error('Failed to setup tap handler:', expoError);\n }\n }\n };\n\n setupTapHandler();\n\n return () => {\n unsubscribe?.();\n };\n }, [handlers?.onNotificationTapped]);\n\n /**\n * Handle token refresh\n */\n useEffect(() => {\n let unsubscribe: (() => void) | undefined;\n\n const setupTokenRefreshHandler = async () => {\n try {\n const messaging = await import('@react-native-firebase/messaging').then(m => m.default);\n \n unsubscribe = messaging().onTokenRefresh(async newToken => {\n console.log('FCM token refreshed:', newToken);\n \n // Re-register with new token\n if (state.isRegistered) {\n if (mode === 'widget' && conversationId) {\n await registerDevice(conversationId, newToken);\n } else if (mode === 'agent') {\n await registerAgentDevice(newToken);\n }\n }\n });\n } catch (error) {\n console.error('Failed to setup token refresh handler:', error);\n }\n };\n\n setupTokenRefreshHandler();\n\n return () => {\n unsubscribe?.();\n };\n }, [state.isRegistered, mode, conversationId, registerDevice, registerAgentDevice]);\n\n /**\n * Check permission status on mount\n */\n useEffect(() => {\n const checkPermission = async () => {\n try {\n const messaging = await import('@react-native-firebase/messaging').then(m => m.default);\n const authStatus = await messaging().hasPermission();\n const granted =\n authStatus === messaging.AuthorizationStatus.AUTHORIZED ||\n authStatus === messaging.AuthorizationStatus.PROVISIONAL;\n\n setState(prev => ({\n ...prev,\n permissionStatus: granted ? 'granted' : authStatus === messaging.AuthorizationStatus.NOT_DETERMINED ? 'undetermined' : 'denied',\n isInitialized: true,\n }));\n\n // Auto-register if permission granted and autoRegister enabled\n if (granted && autoRegister && !state.isRegistered) {\n if (mode === 'widget' && conversationId) {\n await registerDevice();\n } else if (mode === 'agent') {\n await registerAgentDevice();\n }\n }\n } catch (error) {\n console.error('Failed to check permission:', error);\n setState(prev => ({ ...prev, isInitialized: true }));\n }\n };\n\n checkPermission();\n }, [autoRegister, mode, conversationId, registerDevice, registerAgentDevice]);\n\n return {\n ...state,\n requestPermission,\n registerDevice,\n registerAgentDevice,\n unregisterDevice,\n };\n}\n","import { useState, useCallback } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport type { MessageAttachment } from '@solveo-ai/sdk-core';\n\nexport function useAttachments(conversationId?: string) {\n const { sdk } = useSolveo();\n const [uploading, setUploading] = useState(false);\n const [uploadProgress, setUploadProgress] = useState(0);\n\n const uploadAttachment = useCallback(async (\n file: { uri: string; type?: string; name?: string },\n attachmentType: 'IMAGE' | 'AUDIO' | 'VIDEO' | 'DOCUMENT' | 'VOICE_NOTE'\n ): Promise<MessageAttachment> => {\n if (!conversationId) {\n throw new Error('No conversation ID provided');\n }\n\n setUploading(true);\n setUploadProgress(0);\n\n try {\n // Convert file URI to blob (platform-specific)\n const response = await fetch(file.uri);\n const blob = await response.blob();\n\n const attachment = await sdk.widgetAttachments.upload(conversationId, blob, attachmentType);\n setUploadProgress(100);\n return attachment;\n } catch (error) {\n console.error('Failed to upload attachment:', error);\n throw error;\n } finally {\n setUploading(false);\n setUploadProgress(0);\n }\n }, [sdk, conversationId]);\n\n return {\n uploading,\n uploadProgress,\n uploadAttachment,\n };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport type { Agent, AgentCreateRequest, AgentUpdateRequest } from '@solveo-ai/sdk-core';\n\nexport function useAgents(accountId?: string) {\n const { sdk } = useSolveo();\n const [agents, setAgents] = useState<Agent[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const loadAgents = useCallback(async () => {\n if (!accountId) return;\n setIsLoading(true);\n try {\n const data = await sdk.agents.list(accountId);\n setAgents(data);\n } catch (err: any) {\n setError(err);\n } finally {\n setIsLoading(false);\n }\n }, [sdk, accountId]);\n\n useEffect(() => {\n if (accountId) {\n loadAgents();\n }\n }, [accountId]);\n\n const createAgent = useCallback(async (data: AgentCreateRequest) => {\n if (!accountId) throw new Error('No account ID');\n const agent = await sdk.agents.create(accountId, data);\n setAgents((prev) => [...prev, agent]);\n return agent;\n }, [sdk, accountId]);\n\n const updateAgent = useCallback(async (id: string, data: AgentUpdateRequest) => {\n const agent = await sdk.agents.update(id, data);\n setAgents((prev) => prev.map((a) => (a.id === id ? agent : a)));\n return agent;\n }, [sdk]);\n\n const deleteAgent = useCallback(async (id: string) => {\n await sdk.agents.delete(id);\n setAgents((prev) => prev.filter((a) => a.id !== id));\n }, [sdk]);\n\n return {\n agents,\n isLoading,\n error,\n createAgent,\n updateAgent,\n deleteAgent,\n reload: loadAgents,\n };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport type { Conversation } from '@solveo-ai/sdk-core';\n\nexport function useConversations(accountId?: string) {\n const { sdk } = useSolveo();\n const [conversations, setConversations] = useState<Conversation[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const loadConversations = useCallback(async () => {\n if (!accountId) return;\n setIsLoading(true);\n try {\n const data = await sdk.conversations.list(accountId);\n setConversations(data);\n } catch (err: any) {\n setError(err);\n } finally {\n setIsLoading(false);\n }\n }, [sdk, accountId]);\n\n useEffect(() => {\n if (accountId) {\n loadConversations();\n }\n }, [accountId]);\n\n const resolveConversation = useCallback(async (id: string) => {\n await sdk.conversations.resolve(id);\n setConversations((prev) => prev.map((c) => (c.id === id ? { ...c, status: 'RESOLVED' as const } : c)));\n }, [sdk]);\n\n return {\n conversations,\n isLoading,\n error,\n resolveConversation,\n reload: loadConversations,\n };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSolveo } from '../SolveoProvider';\nimport type {\n ConversationMetrics,\n SentimentDistribution,\n FeedbackStats,\n TokenUsageMetrics,\n} from '@solveo-ai/sdk-core';\n\nexport function useAnalytics(accountId?: string, days = 30) {\n const { sdk } = useSolveo();\n const [metrics, setMetrics] = useState<ConversationMetrics | null>(null);\n const [sentiment, setSentiment] = useState<SentimentDistribution | null>(null);\n const [feedback, setFeedback] = useState<FeedbackStats | null>(null);\n const [tokenUsage, setTokenUsage] = useState<TokenUsageMetrics | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const loadAnalytics = useCallback(async () => {\n if (!accountId) return;\n setIsLoading(true);\n try {\n const [m, s, f, t] = await Promise.all([\n sdk.analytics.getMetrics(accountId, days),\n sdk.analytics.getSentiment(accountId, days),\n sdk.analytics.getFeedback(accountId, days),\n sdk.analytics.getTokenUsage(accountId, days),\n ]);\n setMetrics(m);\n setSentiment(s);\n setFeedback(f);\n setTokenUsage(t);\n } catch (err: any) {\n setError(err);\n } finally {\n setIsLoading(false);\n }\n }, [sdk, accountId, days]);\n\n useEffect(() => {\n if (accountId) {\n loadAnalytics();\n }\n }, [accountId, days]);\n\n return {\n metrics,\n sentiment,\n feedback,\n tokenUsage,\n isLoading,\n error,\n reload: loadAnalytics,\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@solveo-ai/react-native",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "React Native SDK for Solveo AI platform",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -38,12 +38,16 @@
|
|
|
38
38
|
"peerDependencies": {
|
|
39
39
|
"@solveo-ai/sdk-core": "^0.1.3",
|
|
40
40
|
"react": ">=18.0.0",
|
|
41
|
-
"react-native": ">=0.72.0"
|
|
41
|
+
"react-native": ">=0.72.0",
|
|
42
|
+
"@react-native-firebase/messaging": ">=20.0.0"
|
|
43
|
+
},
|
|
44
|
+
"peerDependenciesMeta": {
|
|
45
|
+
"@react-native-firebase/messaging": {
|
|
46
|
+
"optional": true
|
|
47
|
+
}
|
|
42
48
|
},
|
|
43
49
|
"dependencies": {
|
|
44
|
-
"@react-native-async-storage/async-storage": "^2.1.0"
|
|
45
|
-
"@react-native-firebase/messaging": "^23.8.6",
|
|
46
|
-
"expo-notifications": "^0.32.16"
|
|
50
|
+
"@react-native-async-storage/async-storage": "^2.1.0"
|
|
47
51
|
},
|
|
48
52
|
"devDependencies": {
|
|
49
53
|
"@types/react": "^18.2.0",
|
|
@@ -54,6 +58,8 @@
|
|
|
54
58
|
"typescript": "^5.0.0"
|
|
55
59
|
},
|
|
56
60
|
"optionalDependencies": {
|
|
61
|
+
"@react-native-firebase/messaging": "^23.8.6",
|
|
62
|
+
"expo-notifications": "^0.32.16",
|
|
57
63
|
"expo-av": "^15.0.0",
|
|
58
64
|
"expo-file-system": "^18.0.0",
|
|
59
65
|
"expo-image-picker": "^16.0.0",
|
|
@@ -33,22 +33,39 @@ export interface UsePushNotificationsOptions {
|
|
|
33
33
|
|
|
34
34
|
/**
|
|
35
35
|
* Enhanced Push Notifications Hook for React Native
|
|
36
|
-
*
|
|
36
|
+
*
|
|
37
37
|
* Supports both customer (widget) and agent (dashboard) modes.
|
|
38
38
|
* Handles permissions, registration, and notification events.
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
39
|
+
*
|
|
40
|
+
* Works with both React Native CLI and Expo projects. Automatically detects
|
|
41
|
+
* which push notification system is available:
|
|
42
|
+
* - React Native CLI: Uses @react-native-firebase/messaging
|
|
43
|
+
* - Expo: Uses expo-notifications
|
|
44
|
+
*
|
|
45
|
+
* SETUP INSTRUCTIONS FOR REACT NATIVE CLI:
|
|
46
|
+
* 1. Install Firebase dependencies:
|
|
42
47
|
* npm install @react-native-firebase/app @react-native-firebase/messaging
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
* 2. Configure Firebase/APNs:
|
|
48
|
+
*
|
|
49
|
+
* 2. Configure Firebase:
|
|
46
50
|
* - Android: Add google-services.json to android/app/
|
|
51
|
+
* Apply plugin in android/app/build.gradle: apply plugin: 'com.google.gms.google-services'
|
|
47
52
|
* - iOS: Add GoogleService-Info.plist to ios/ and configure APNs
|
|
48
|
-
*
|
|
53
|
+
* Add FirebaseAppDelegate methods in AppDelegate.m
|
|
54
|
+
*
|
|
49
55
|
* 3. Add permissions to manifests:
|
|
50
|
-
* - Android: INTERNET, VIBRATE, RECEIVE_BOOT_COMPLETED
|
|
51
|
-
* - iOS: User Notifications capability
|
|
56
|
+
* - Android: INTERNET, VIBRATE, RECEIVE_BOOT_COMPLETED in AndroidManifest.xml
|
|
57
|
+
* - iOS: User Notifications capability in Xcode
|
|
58
|
+
*
|
|
59
|
+
* 4. For iOS, register for remote notifications in AppDelegate:
|
|
60
|
+
* - [UNUserNotificationCenter currentNotificationCenter].delegate = self;
|
|
61
|
+
* - [application registerForRemoteNotifications];
|
|
62
|
+
*
|
|
63
|
+
* SETUP INSTRUCTIONS FOR EXPO:
|
|
64
|
+
* 1. Install expo-notifications:
|
|
65
|
+
* npx expo install expo-notifications
|
|
66
|
+
*
|
|
67
|
+
* 2. Configure in app.config.js:
|
|
68
|
+
* Add appropriate configuration for notifications
|
|
52
69
|
*/
|
|
53
70
|
export function usePushNotifications(options: UsePushNotificationsOptions = {}) {
|
|
54
71
|
const { sdk } = useSolveo();
|