@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 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
- * SETUP INSTRUCTIONS:
103
- * 1. Install peer dependencies:
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/APNs:
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
- * SETUP INSTRUCTIONS:
103
- * 1. Install peer dependencies:
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/APNs:
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":";;;;;;;;;;;;;AAqCA,IAAM,aAAA,GAAgBA,oBAAyC,IAAI,CAAA;AA8B5D,SAAS,cAAA,CAAe,EAAE,QAAA,EAAU,MAAA,EAAO,EAAwB;AACxE,EAAA,MAAM,GAAA,GAAMC,aAAA;AAAA,IACV,MACE,IAAIC,iBAAA,CAAU;AAAA,MACZ,GAAG,MAAA;AAAA,MACH,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,IACH,CAAC,OAAO,MAAA,EAAQ,MAAA,CAAO,QAAQ,MAAA,CAAO,KAAA,EAAO,OAAO,QAAQ;AAAA,GAC9D;AAGA,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIC,eAAwB,IAAI,CAAA;AACxE,EAAA,MAAM,CAAC,qBAAA,EAAuB,wBAAwB,CAAA,GAAIA,eAAuC,IAAI,CAAA;AACrG,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAIA,eAAoC,IAAI,CAAA;AAC5F,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,eAAiC,IAAI,CAAA;AAGnF,EAAA,MAAM,qBAAA,GAAwB,CAAC,cAAA,KAA2B;AACxD,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,cAAA,CAAe,UAAA,EAAW;AAAA,IAC5B;AAEA,IAAA,MAAM,MAAA,GAASC,4BAAA,CAAqB,MAAA,CAAO,MAAA,EAAQ,cAAc,CAAA;AACjE,IAAA,MAAM,OAAA,GAAU,IAAIC,6BAAA,CAAsB,MAAM,CAAA;AAEhD,IAAA,iBAAA,CAAkB,MAAM,CAAA;AACxB,IAAA,wBAAA,CAAyB,OAAO,CAAA;AAEhC,IAAA,MAAA,CAAO,OAAA,EAAQ;AAAA,EACjB,CAAA;AAGA,EAAA,MAAM,2BAA2B,MAAM;AACrC,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,cAAA,CAAe,UAAA,EAAW;AAC1B,MAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,MAAA,wBAAA,CAAyB,IAAI,CAAA;AAAA,IAC/B;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAkB;AAC5C,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,WAAA,CAAY,UAAA,EAAW;AAAA,IACzB;AAEA,IAAA,MAAM,MAAA,GAASC,yBAAA,CAAkB,MAAA,CAAO,MAAA,EAAQ,KAAK,CAAA;AACrD,IAAA,MAAM,OAAA,GAAU,IAAIC,0BAAA,CAAmB,MAAM,CAAA;AAE7C,IAAA,cAAA,CAAe,MAAM,CAAA;AACrB,IAAA,qBAAA,CAAsB,OAAO,CAAA;AAE7B,IAAA,MAAA,CAAO,OAAA,EAAQ;AAAA,EACjB,CAAA;AAGA,EAAA,MAAM,wBAAwB,MAAM;AAClC,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,WAAA,CAAY,UAAA,EAAW;AACvB,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,qBAAA,CAAsB,IAAI,CAAA;AAAA,IAC5B;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,sBAAA,GAAyB,CAAC,cAAA,KAA2B;AACzD,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,eAAA,CAAgB,UAAA,EAAW;AAAA,IAC7B;AAEA,IAAA,MAAM,MAAA,GAASC,6BAAA,CAAsB,MAAA,CAAO,MAAA,EAAQ,cAAc,CAAA;AAClE,IAAA,kBAAA,CAAmB,MAAM,CAAA;AAEzB,IAAA,MAAA,CAAO,OAAA,EAAQ;AAAA,EACjB,CAAA;AAGA,EAAA,MAAM,4BAA4B,MAAM;AACtC,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,eAAA,CAAgB,UAAA,EAAW;AAC3B,MAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,IACzB;AAAA,EACF,CAAA;AAGA,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,MAAA,CAAO,mBAAA,IAAuB,MAAA,CAAO,cAAA,EAAgB;AACvD,MAAA,qBAAA,CAAsB,OAAO,cAAc,CAAA;AAAA,IAC7C;AAEA,IAAA,IAAI,MAAA,CAAO,gBAAA,IAAoB,MAAA,CAAO,KAAA,EAAO;AAC3C,MAAA,kBAAA,CAAmB,OAAO,KAAK,CAAA;AAAA,IACjC;AAGA,IAAA,OAAO,MAAM;AACX,MAAA,wBAAA,EAAyB;AACzB,MAAA,qBAAA,EAAsB;AACtB,MAAA,yBAAA,EAA0B;AAAA,IAC5B,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,CAAO,mBAAA,EAAqB,MAAA,CAAO,kBAAkB,MAAA,CAAO,cAAA,EAAgB,MAAA,CAAO,KAAK,CAAC,CAAA;AAE7F,EAAA,MAAM,KAAA,GAA4B;AAAA,IAChC,GAAA;AAAA,IACA,MAAA;AAAA,IACA,cAAA;AAAA,IACA,qBAAA;AAAA,IACA,WAAA;AAAA,IACA,kBAAA;AAAA,IACA,eAAA;AAAA,IACA,qBAAA;AAAA,IACA,wBAAA;AAAA,IACA,kBAAA;AAAA,IACA,qBAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBAAOC,sBAAA,CAAA,aAAA,CAAC,aAAA,CAAc,QAAA,EAAd,EAAuB,SAAe,QAAS,CAAA;AACzD;AAMO,SAAS,SAAA,GAAgC;AAC9C,EAAA,MAAM,OAAA,GAAUC,iBAAW,aAAa,CAAA;AACxC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,EAClE;AACA,EAAA,OAAO,OAAA;AACT;ACrMA,IAAM,YAAA,GAAe;AAAA,EACnB,eAAA,EAAiB,yBAAA;AAAA,EACjB,QAAA,EAAU,kBAAA;AAAA,EACV,aAAA,EAAe,uBAAA;AAAA,EACf,aAAA,EAAe;AACjB,CAAA;AAEO,IAAM,OAAA,GAAU;AAAA,EACrB,MAAM,iBAAA,GAA4C;AAChD,IAAA,OAAOC,6BAAA,CAAa,OAAA,CAAQ,YAAA,CAAa,eAAe,CAAA;AAAA,EAC1D,CAAA;AAAA,EAEA,MAAM,kBAAkB,EAAA,EAA2B;AACjD,IAAA,MAAMA,6BAAA,CAAa,OAAA,CAAQ,YAAA,CAAa,eAAA,EAAiB,EAAE,CAAA;AAAA,EAC7D,CAAA;AAAA,EAEA,MAAM,mBAAA,GAAqC;AACzC,IAAA,MAAMA,6BAAA,CAAa,UAAA,CAAW,YAAA,CAAa,eAAe,CAAA;AAAA,EAC5D,CAAA;AAAA,EAEA,MAAM,YAAY,cAAA,EAAwC;AACxD,IAAA,MAAM,IAAA,GAAO,MAAMA,6BAAA,CAAa,OAAA,CAAQ,GAAG,YAAA,CAAa,QAAQ,CAAA,CAAA,EAAI,cAAc,CAAA,CAAE,CAAA;AACpF,IAAA,OAAO,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,IAAI,EAAC;AAAA,EACpC,CAAA;AAAA,EAEA,MAAM,WAAA,CAAY,cAAA,EAAwB,QAAA,EAAgC;AACxE,IAAA,MAAMA,6BAAA,CAAa,OAAA,CAAQ,CAAA,EAAG,YAAA,CAAa,QAAQ,CAAA,CAAA,EAAI,cAAc,CAAA,CAAA,EAAI,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,EACnG,CAAA;AAAA,EAEA,MAAM,eAAA,GAAqE;AACzE,IAAA,MAAM,IAAA,GAAO,MAAMA,6BAAA,CAAa,OAAA,CAAQ,aAAa,aAAa,CAAA;AAClE,IAAA,OAAO,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAAA,EACnC,CAAA;AAAA,EAEA,MAAM,gBAAgB,QAAA,EAA4D;AAChF,IAAA,MAAMA,8BAAa,OAAA,CAAQ,YAAA,CAAa,eAAe,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,EACjF,CAAA;AAAA,EAEA,MAAM,gBAAgB,QAAA,EAAuC;AAC3D,IAAA,MAAM,IAAA,GAAO,MAAMA,6BAAA,CAAa,OAAA,CAAQ,GAAG,YAAA,CAAa,aAAa,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE,CAAA;AACnF,IAAA,OAAO,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAAA,EACnC,CAAA;AAAA,EAEA,MAAM,eAAA,CAAgB,QAAA,EAAkB,MAAA,EAA4B;AAClE,IAAA,MAAMA,6BAAA,CAAa,OAAA,CAAQ,CAAA,EAAG,YAAA,CAAa,aAAa,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAAA,EAChG;AACF;;;ACrCO,SAAS,OAAA,CAAQ,OAAA,GAA0B,EAAC,EAAG;AACpD,EAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAQ,eAAA,EAAiB,sBAAA,KAA2B,SAAA,EAAU;AAC3E,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIT,eAA8B,IAAI,CAAA;AAC1E,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,cAAAA,CAAoB,EAAE,CAAA;AACtD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,eAAS,EAAE,CAAA;AAC3D,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AAGrD,EAAAM,gBAAU,MAAM;AACd,IAAA,IAAI,QAAQ,mBAAA,EAAqB;AAC/B,MAAA,yBAAA,EAA0B;AAAA,IAC5B;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,CAAQ,mBAAmB,CAAC,CAAA;AAGhC,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,eAAA,IAAmB,CAAC,YAAA,EAAc;AAEvC,IAAA,MAAM,aAAA,GAAgB,CAAC,GAAA,KAAa;AAClC,MAAA,IAAI,GAAA,CAAI,SAAS,cAAA,EAAgB;AAC/B,QAAA,cAAA,CAAe,IAAI,CAAA;AACnB,QAAA,mBAAA,CAAoB,EAAE,CAAA;AAAA,MACxB,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,qBAAA,EAAuB;AAC7C,QAAA,mBAAA,CAAoB,CAAC,IAAA,KAAS,IAAA,IAAQ,GAAA,CAAI,WAAW,EAAA,CAAG,CAAA;AAAA,MAC1D,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,wBAAA,EAA0B;AAChD,QAAA,cAAA,CAAe,KAAK,CAAA;AACpB,QAAA,IAAI,IAAI,UAAA,EAAY;AAClB,UAAA,YAAA,CAAa,aAAa,EAAE,CAAA;AAAA,QAC9B;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,WAAA,GAAc,CAAC,GAAA,KAAa;AAChC,MAAA,QAAA,CAAS,IAAI,KAAA,CAAM,GAAA,CAAI,OAAA,IAAW,iBAAiB,CAAC,CAAA;AACpD,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB,CAAA;AAEA,IAAA,eAAA,CAAgB,EAAA,CAAG,WAAW,aAAa,CAAA;AAC3C,IAAA,eAAA,CAAgB,EAAA,CAAG,SAAS,WAAW,CAAA;AAEvC,IAAA,OAAO,MAAM;AACX,MAAA,eAAA,CAAgB,GAAA,CAAI,WAAW,aAAa,CAAA;AAC5C,MAAA,eAAA,CAAgB,GAAA,CAAI,SAAS,WAAW,CAAA;AAAA,IAC1C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,eAAA,EAAiB,YAAY,CAAC,CAAA;AAElC,EAAA,MAAM,4BAA4B,YAAY;AAC5C,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,iBAAA,EAAkB;AAC/C,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,mBAAA,CAAoB,IAAI,MAAM,CAAA;AACrD,QAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,QAAA,MAAM,aAAa,MAAM,CAAA;AAAA,MAC3B;AAAA,IACF,SAAS,GAAA,EAAU;AACjB,MAAA,OAAA,CAAQ,KAAA,CAAM,0CAA0C,GAAG,CAAA;AAAA,IAC7D;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqBI,kBAAY,YAAY;AACjD,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,eAAA,EAAgB;AAC/C,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,mBAAA,CAAoB,MAAA,CAAO;AAAA,QAChD,SAAA,EAAW,OAAA,CAAQ,QAAA,IAAY,MAAA,CAAO,QAAA;AAAA,QACtC,UAAU,OAAA,CAAQ,OAAA;AAAA,QAClB,cAAA,EAAgB,QAAA,EAAU,KAAA,IAAS,MAAA,CAAO,IAAA,EAAM,KAAA;AAAA,QAChD,aAAA,EAAe,QAAA,EAAU,IAAA,IAAQ,MAAA,CAAO,IAAA,EAAM;AAAA,OAC/C,CAAA;AACD,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,IAAI,QAAQ,mBAAA,EAAqB;AAC/B,QAAA,MAAM,OAAA,CAAQ,iBAAA,CAAkB,IAAA,CAAK,EAAE,CAAA;AAAA,MACzC;AACA,MAAA,sBAAA,CAAuB,KAAK,EAAE,CAAA;AAC9B,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,GAAA,EAAU;AACjB,MAAA,QAAA,CAAS,GAAG,CAAA;AACZ,MAAA,MAAM,GAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,OAAA,EAAS,MAAM,CAAC,CAAA;AAEzB,EAAA,MAAM,YAAA,GAAeA,iBAAA,CAAY,OAAO,cAAA,KAA2B;AACjE,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,cAAA,CAAe,KAAK,cAAc,CAAA;AACzD,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,IAAI,QAAQ,mBAAA,EAAqB;AAC/B,QAAA,MAAM,OAAA,CAAQ,WAAA,CAAY,cAAA,EAAgB,IAAI,CAAA;AAAA,MAChD;AAAA,IACF,SAAS,GAAA,EAAU;AACjB,MAAA,QAAA,CAAS,GAAG,CAAA;AAAA,IACd;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,OAAO,CAAC,CAAA;AAEjB,EAAA,MAAM,WAAA,GAAcA,iBAAA,CAAY,OAAO,OAAA,KAAoB;AACzD,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,IAC1C;AACA,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,IAAI,eAAA,EAAiB,aAAY,EAAG;AAClC,QAAA,eAAA,CAAgB,YAAY,OAAO,CAAA;AAAA,MACrC,CAAA,MAAO;AACL,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,cAAA,CAAe,KAAK,YAAA,CAAa,EAAA,EAAI,EAAE,OAAA,EAAS,CAAA;AAC3E,QAAA,WAAA,CAAY,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,QAAA,CAAS,OAAA,EAAS,QAAA,CAAS,WAAY,CAAA,CAAE,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,MAC1F;AAAA,IACF,SAAS,GAAA,EAAU;AACjB,MAAA,QAAA,CAAS,GAAG,CAAA;AACZ,MAAA,MAAM,GAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,eAAA,EAAiB,GAAG,CAAC,CAAA;AAEvC,EAAA,MAAM,cAAA,GAAiBA,iBAAA,CAAY,OAAO,SAAA,EAAmB,MAAA,KAAwC;AACnG,IAAA,IAAI,CAAC,YAAA,EAAc;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,IAAI,cAAA,CAAe,cAAA,CAAe,YAAA,CAAa,EAAA,EAAI,WAAW,MAAM,CAAA;AAAA,IAC5E,SAAS,GAAA,EAAU;AACjB,MAAA,QAAA,CAAS,GAAG,CAAA;AAAA,IACd;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,GAAG,CAAC,CAAA;AAEtB,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,KAAA;AAAA,IACA,kBAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF;ACpJO,SAAS,WAAA,GAAc;AAC5B,EAAA,MAAM,EAAE,qBAAA,EAAsB,GAAI,SAAA,EAAU;AAC5C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIV,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtE,EAAAM,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,qBAAA,EAAuB;AAE5B,IAAA,MAAM,MAAA,GAAS,sBAAsB,SAAA,EAAU;AAE/C,IAAA,MAAA,CAAO,EAAA,CAAG,SAAA,EAAW,MAAM,cAAA,CAAe,IAAI,CAAC,CAAA;AAC/C,IAAA,MAAA,CAAO,EAAA,CAAG,YAAA,EAAc,MAAM,cAAA,CAAe,KAAK,CAAC,CAAA;AAEnD,IAAA,qBAAA,CAAsB,cAAc,MAAM;AACxC,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,UAAA,CAAW,MAAM,cAAA,CAAe,KAAK,CAAA,EAAG,GAAI,CAAA;AAAA,IAC9C,CAAC,CAAA;AAED,IAAA,qBAAA,CAAsB,aAAA,CAAc,CAAC,IAAA,KAAS;AAC5C,MAAA,gBAAA,CAAiB,KAAK,cAAc,CAAA;AACpC,MAAA,gBAAA,CAAiB,KAAK,cAAc,CAAA;AAAA,IACtC,CAAC,CAAA;AAED,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,IAAI,SAAS,CAAA;AACpB,MAAA,MAAA,CAAO,IAAI,YAAY,CAAA;AAAA,IACzB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,qBAAqB,CAAC,CAAA;AAE1B,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;ACpCO,SAAS,aAAA,GAAgB;AAC9B,EAAA,MAAM,EAAE,qBAAA,EAAuB,qBAAA,EAAuB,wBAAA,KAA6B,SAAA,EAAU;AAC7F,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIN,eAAwB,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAA4B,IAAI,CAAA;AAC1E,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAmE,MAAM,CAAA;AAErG,EAAAM,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,qBAAA,EAAuB;AAE5B,IAAA,qBAAA,CAAsB,gBAAA,CAAiB,CAAC,IAAA,KAAS;AAC/C,MAAA,eAAA,CAAgB,KAAK,aAAa,CAAA;AAClC,MAAA,gBAAA,CAAiB;AAAA,QACf,MAAM,IAAA,CAAK,UAAA;AAAA,QACX,YAAY,IAAA,CAAK;AAAA,OACJ,CAAA;AACf,MAAA,SAAA,CAAU,QAAQ,CAAA;AAAA,IACpB,CAAC,CAAA;AAED,IAAA,qBAAA,CAAsB,aAAA,CAAc,CAAC,IAAA,KAAS;AAC5C,MAAA,SAAA,CAAU,QAAQ,CAAA;AAAA,IACpB,CAAC,CAAA;AAED,IAAA,qBAAA,CAAsB,qBAAqB,MAAM;AAC/C,MAAA,SAAA,CAAU,UAAU,CAAA;AAAA,IACtB,CAAC,CAAA;AAED,IAAA,qBAAA,CAAsB,aAAa,MAAM;AACvC,MAAA,SAAA,CAAU,MAAM,CAAA;AAChB,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,IACvB,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,qBAAqB,CAAC,CAAA;AAE1B,EAAA,MAAM,YAAA,GAAeI,iBAAAA,CAAY,CAAC,cAAA,KAA2B;AAC3D,IAAA,qBAAA,CAAsB,cAAc,CAAA;AACpC,IAAA,IAAI,qBAAA,EAAuB;AACzB,MAAA,qBAAA,CAAsB,YAAA,EAAa;AACnC,MAAA,SAAA,CAAU,YAAY,CAAA;AAAA,IACxB;AAAA,EACF,CAAA,EAAG,CAAC,qBAAA,EAAuB,qBAAqB,CAAC,CAAA;AAEjD,EAAA,MAAM,OAAA,GAAUA,kBAAY,MAAM;AAChC,IAAA,IAAI,gBAAgB,qBAAA,EAAuB;AACzC,MAAA,qBAAA,CAAsB,QAAQ,YAAY,CAAA;AAC1C,MAAA,wBAAA,EAAyB;AACzB,MAAA,SAAA,CAAU,MAAM,CAAA;AAChB,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,IACvB;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,qBAAA,EAAuB,wBAAwB,CAAC,CAAA;AAElE,EAAA,MAAM,UAAA,GAAaA,iBAAAA,CAAY,CAAC,MAAA,KAAmB;AACjD,IAAA,IAAI,gBAAgB,qBAAA,EAAuB;AACzC,MAAA,qBAAA,CAAsB,UAAA,CAAW,cAAc,MAAM,CAAA;AAAA,IACvD;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,qBAAqB,CAAC,CAAA;AAExC,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA,aAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;AChEO,SAAS,gBAAgB,QAAA,EAAmB;AACjD,EAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAO,GAAI,SAAA,EAAU;AAClC,EAAA,MAAM,iBAAA,GAAoB,YAAY,MAAA,CAAO,QAAA;AAC7C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIV,eAAwB,IAAI,CAAA;AACxD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAA8B,IAAI,CAAA;AAC1E,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AAErD,EAAAM,gBAAU,MAAM;AACd,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,UAAA,EAAW;AAAA,IACb;AAAA,EACF,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAEtB,EAAA,MAAM,aAAa,YAAY;AAC7B,IAAA,IAAI,CAAC,iBAAA,EAAmB;AAExB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AAEF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,eAAA,CAAgB,iBAAiB,CAAA;AAC9D,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,SAAA,CAAU,MAAM,CAAA;AAChB,QAAA,eAAA,CAAgB,OAAO,MAAM,CAAA;AAAA,MAC/B;AAGA,MAAA,MAAM,CAAA,GAAI,MAAM,GAAA,CAAI,YAAA,CAAa,UAAU,iBAAiB,CAAA;AAC5D,MAAA,SAAA,CAAU,CAAC,CAAA;AACX,MAAA,eAAA,CAAgB,EAAE,MAAM,CAAA;AACxB,MAAA,MAAM,OAAA,CAAQ,eAAA,CAAgB,iBAAA,EAAmB,CAAC,CAAA;AAAA,IACpD,SAAS,GAAA,EAAU;AACjB,MAAA,QAAA,CAAS,GAAG,CAAA;AAAA,IACd,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA,EAAQ;AAAA,GACV;AACF;ACCO,SAAS,oBAAA,CAAqB,OAAA,GAAuC,EAAC,EAAG;AAC9E,EAAA,MAAM,EAAE,GAAA,EAAI,GAAI,SAAA,EAAU;AAC1B,EAAA,MAAM;AAAA,IACJ,IAAA,GAAO,QAAA;AAAA,IACP,cAAA;AAAA,IACA,YAAA,GAAe,KAAA;AAAA,IACf;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIN,cAAAA,CAAgC;AAAA,IACxD,MAAA,EAAQ,IAAA;AAAA,IACR,YAAA,EAAc,KAAA;AAAA,IACd,aAAA,EAAe,KAAA;AAAA,IACf,gBAAA,EAAkB;AAAA,GACnB,CAAA;AAKD,EAAA,MAAM,iBAAA,GAAoBU,kBAAY,YAA8B;AAClE,IAAA,IAAI;AAEF,MAAA,MAAM,SAAA,GAAY,MAAM,OAAO,kCAAkC,EAAE,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AAEtF,MAAA,MAAM,UAAA,GAAa,MAAM,SAAA,EAAU,CAAE,iBAAA,EAAkB;AACvD,MAAA,MAAM,UACJ,UAAA,KAAe,SAAA,CAAU,oBAAoB,UAAA,IAC7C,UAAA,KAAe,UAAU,mBAAA,CAAoB,WAAA;AAE/C,MAAA,QAAA,CAAS,CAAA,IAAA,MAAS;AAAA,QAChB,GAAG,IAAA;AAAA,QACH,gBAAA,EAAkB,UAAU,SAAA,GAAY;AAAA,OAC1C,CAAE,CAAA;AAEF,MAAA,OAAO,OAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,qEAAqE,KAAK,CAAA;AAGxF,MAAA,IAAI;AACF,QAAA,MAAM,aAAA,GAAgB,MAAM,OAAO,oBAAoB,CAAA;AACvD,QAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,cAAc,uBAAA,EAAwB;AAC/D,QAAA,MAAM,UAAU,MAAA,KAAW,SAAA;AAE3B,QAAA,QAAA,CAAS,CAAA,IAAA,MAAS;AAAA,UAChB,GAAG,IAAA;AAAA,UACH,gBAAA,EAAkB,UAAU,SAAA,GAAY;AAAA,SAC1C,CAAE,CAAA;AAEF,QAAA,OAAO,OAAA;AAAA,MACT,SAAS,SAAA,EAAW;AAClB,QAAA,OAAA,CAAQ,KAAA,CAAM,qEAAqE,SAAS,CAAA;AAC5F,QAAA,QAAA,CAAS,WAAS,EAAE,GAAG,IAAA,EAAM,gBAAA,EAAkB,UAAS,CAAE,CAAA;AAC1D,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAKL,EAAA,MAAM,QAAA,GAAWA,kBAAY,YAAoC;AAC/D,IAAA,IAAI;AAEF,MAAA,MAAM,SAAA,GAAY,MAAM,OAAO,kCAAkC,EAAE,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AACtF,MAAA,MAAM,KAAA,GAAQ,MAAM,SAAA,EAAU,CAAE,QAAA,EAAS;AACzC,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAG/C,MAAA,IAAI;AACF,QAAA,MAAM,aAAA,GAAgB,MAAM,OAAO,oBAAoB,CAAA;AACvD,QAAA,MAAM,KAAA,GAAQ,MAAM,aAAA,CAAc,qBAAA,EAAsB;AACxD,QAAA,OAAO,KAAA,CAAM,IAAA;AAAA,MACf,SAAS,SAAA,EAAW;AAClB,QAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,SAAS,CAAA;AACzD,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAKL,EAAA,MAAM,cAAA,GAAiBA,iBAAAA;AAAA,IACrB,OAAO,MAAA,EAAiB,SAAA,EAAoB,QAAA,KAA8C;AACxF,MAAA,IAAI,SAAS,QAAA,EAAU;AACrB,QAAA,OAAA,CAAQ,KAAK,iFAAiF,CAAA;AAC9F,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,uBAAuB,MAAA,IAAU,cAAA;AACvC,MAAA,IAAI,CAAC,oBAAA,EAAsB;AACzB,QAAA,OAAA,CAAQ,MAAM,yDAAyD,CAAA;AACvE,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,SAAA,IAAc,MAAM,QAAA,EAAS;AAC3C,QAAA,IAAI,CAAC,KAAA,EAAO;AACV,UAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,QAC5C;AAEA,QAAA,MAAM,QAAA,GAAWC,oBAAA,CAAS,EAAA,KAAO,KAAA,GAAQ,KAAA,GAAQ,SAAA;AACjD,QAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,aAAA,CAAc,QAAA,CAAS;AAAA,UAC9C,eAAA,EAAiB,oBAAA;AAAA,UACjB,QAAA;AAAA,UACA,UAAA,EAAY,KAAA;AAAA,UACZ,SAAA,EAAW;AAAA,SACZ,CAAA;AAED,QAAA,QAAA,CAAS,WAAS,EAAE,GAAG,MAAM,MAAA,EAAQ,YAAA,EAAc,MAAK,CAAE,CAAA;AAC1D,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,IACA,CAAC,GAAA,EAAK,cAAA,EAAgB,IAAA,EAAM,QAAQ;AAAA,GACtC;AAKA,EAAA,MAAM,mBAAA,GAAsBD,iBAAAA;AAAA,IAC1B,OAAO,WAAoB,UAAA,KAAsC;AAC/D,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,OAAA,CAAQ,KAAK,iFAAiF,CAAA;AAC9F,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,SAAA,IAAc,MAAM,QAAA,EAAS;AAC3C,QAAA,IAAI,CAAC,KAAA,EAAO;AACV,UAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,QAC5C;AAEA,QAAA,MAAM,QAAA,GAAWC,oBAAA,CAAS,EAAA,KAAO,KAAA,GAAQ,KAAA,GAAQ,SAAA;AAGjD,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,MAAA,CAAO,KAAK,eAAA,EAAiB;AAAA,UACtD,QAAA;AAAA,UACA,UAAA,EAAY,KAAA;AAAA,UACZ,WAAA,EAAa,UAAA,IAAc,CAAA,EAAGA,oBAAA,CAAS,EAAE,CAAA,OAAA;AAAA,SAC1C,CAAA;AAED,QAAA,QAAA,CAAS,CAAA,IAAA,MAAS;AAAA,UAChB,GAAG,IAAA;AAAA,UACH,QAAQ,QAAA,CAAS,IAAA;AAAA,UACjB,YAAA,EAAc;AAAA,SAChB,CAAE,CAAA;AAEF,QAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MAClB,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AACvD,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,IACA,CAAC,GAAA,EAAK,IAAA,EAAM,QAAQ;AAAA,GACtB;AAKA,EAAA,MAAM,gBAAA,GAAmBD,kBAAY,YAAY;AAC/C,IAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,SAAS,QAAA,EAAU;AACrB,QAAA,MAAM,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,KAAA,CAAM,OAAO,EAAE,CAAA;AAAA,MACpD,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,MAAA,CAAO,MAAA,CAAO,iBAAiB,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA,CAAE,CAAA;AAAA,MAC5D;AAEA,MAAA,QAAA,CAAS,CAAA,IAAA,MAAS;AAAA,QAChB,GAAG,IAAA;AAAA,QACH,MAAA,EAAQ,IAAA;AAAA,QACR,YAAA,EAAc;AAAA,OAChB,CAAE,CAAA;AAAA,IACJ,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AACnD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF,GAAG,CAAC,GAAA,EAAK,KAAA,CAAM,MAAA,EAAQ,IAAI,CAAC,CAAA;AAK5B,EAAAJ,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAU,sBAAA,EAAwB;AACrC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,WAAA;AAEJ,IAAA,MAAM,yBAAyB,YAAY;AACzC,MAAA,IAAI;AAEF,QAAA,MAAM,SAAA,GAAY,MAAM,OAAO,kCAAkC,EAAE,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AAEtF,QAAA,WAAA,GAAc,SAAA,EAAU,CAAE,SAAA,CAAU,OAAM,aAAA,KAAiB;AACzD,UAAA,OAAA,CAAQ,GAAA,CAAI,qCAAqC,aAAa,CAAA;AAC9D,UAAA,QAAA,CAAS,yBAAyB,aAAa,CAAA;AAAA,QACjD,CAAC,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AAEd,QAAA,IAAI;AACF,UAAA,MAAM,aAAA,GAAgB,MAAM,OAAO,oBAAoB,CAAA;AAEvD,UAAA,MAAM,YAAA,GAAe,aAAA,CAAc,+BAAA,CAAgC,CAAA,YAAA,KAAgB;AACjF,YAAA,OAAA,CAAQ,GAAA,CAAI,4CAA4C,YAAY,CAAA;AACpE,YAAA,QAAA,CAAS,yBAAyB,YAAY,CAAA;AAAA,UAChD,CAAC,CAAA;AAED,UAAA,WAAA,GAAc,MAAM,aAAa,MAAA,EAAO;AAAA,QAC1C,SAAS,SAAA,EAAW;AAClB,UAAA,OAAA,CAAQ,KAAA,CAAM,uCAAuC,SAAS,CAAA;AAAA,QAChE;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,sBAAA,EAAuB;AAEvB,IAAA,OAAO,MAAM;AACX,MAAA,WAAA,IAAc;AAAA,IAChB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,sBAAsB,CAAC,CAAA;AAKrC,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAU,oBAAA,EAAsB;AACnC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,WAAA;AAEJ,IAAA,MAAM,kBAAkB,YAAY;AAClC,MAAA,IAAI;AAEF,QAAA,MAAM,SAAA,GAAY,MAAM,OAAO,kCAAkC,EAAE,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AAGtF,QAAA,SAAA,EAAU,CACP,sBAAA,EAAuB,CACvB,IAAA,CAAK,CAAA,aAAA,KAAiB;AACrB,UAAA,IAAI,aAAA,EAAe;AACjB,YAAA,OAAA,CAAQ,GAAA,CAAI,4CAA4C,aAAa,CAAA;AACrE,YAAA,QAAA,CAAS,uBAAuB,aAAa,CAAA;AAAA,UAC/C;AAAA,QACF,CAAC,CAAA;AAGH,QAAA,WAAA,GAAc,SAAA,EAAU,CAAE,uBAAA,CAAwB,CAAA,aAAA,KAAiB;AACjE,UAAA,OAAA,CAAQ,GAAA,CAAI,4CAA4C,aAAa,CAAA;AACrE,UAAA,QAAA,CAAS,uBAAuB,aAAa,CAAA;AAAA,QAC/C,CAAC,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AAEd,QAAA,IAAI;AACF,UAAA,MAAM,aAAA,GAAgB,MAAM,OAAO,oBAAoB,CAAA;AAEvD,UAAA,MAAM,YAAA,GAAe,aAAA,CAAc,uCAAA,CAAwC,CAAA,QAAA,KAAY;AACrF,YAAA,OAAA,CAAQ,GAAA,CAAI,+BAA+B,QAAQ,CAAA;AACnD,YAAA,QAAA,CAAS,oBAAA,GAAuB,SAAS,YAAY,CAAA;AAAA,UACvD,CAAC,CAAA;AAED,UAAA,WAAA,GAAc,MAAM,aAAa,MAAA,EAAO;AAAA,QAC1C,SAAS,SAAA,EAAW;AAClB,UAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,SAAS,CAAA;AAAA,QACzD;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,eAAA,EAAgB;AAEhB,IAAA,OAAO,MAAM;AACX,MAAA,WAAA,IAAc;AAAA,IAChB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,oBAAoB,CAAC,CAAA;AAKnC,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,WAAA;AAEJ,IAAA,MAAM,2BAA2B,YAAY;AAC3C,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,MAAM,OAAO,kCAAkC,EAAE,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AAEtF,QAAA,WAAA,GAAc,SAAA,EAAU,CAAE,cAAA,CAAe,OAAM,QAAA,KAAY;AACzD,UAAA,OAAA,CAAQ,GAAA,CAAI,wBAAwB,QAAQ,CAAA;AAG5C,UAAA,IAAI,MAAM,YAAA,EAAc;AACtB,YAAA,IAAI,IAAA,KAAS,YAAY,cAAA,EAAgB;AACvC,cAAA,MAAM,cAAA,CAAe,gBAAgB,QAAQ,CAAA;AAAA,YAC/C,CAAA,MAAA,IAAW,SAAS,OAAA,EAAS;AAC3B,cAAA,MAAM,oBAAoB,QAAQ,CAAA;AAAA,YACpC;AAAA,UACF;AAAA,QACF,CAAC,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,0CAA0C,KAAK,CAAA;AAAA,MAC/D;AAAA,IACF,CAAA;AAEA,IAAA,wBAAA,EAAyB;AAEzB,IAAA,OAAO,MAAM;AACX,MAAA,WAAA,IAAc;AAAA,IAChB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,CAAM,YAAA,EAAc,MAAM,cAAA,EAAgB,cAAA,EAAgB,mBAAmB,CAAC,CAAA;AAKlF,EAAAA,gBAAU,MAAM;AACd,IAAA,MAAM,kBAAkB,YAAY;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,MAAM,OAAO,kCAAkC,EAAE,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AACtF,QAAA,MAAM,UAAA,GAAa,MAAM,SAAA,EAAU,CAAE,aAAA,EAAc;AACnD,QAAA,MAAM,UACJ,UAAA,KAAe,SAAA,CAAU,oBAAoB,UAAA,IAC7C,UAAA,KAAe,UAAU,mBAAA,CAAoB,WAAA;AAE/C,QAAA,QAAA,CAAS,CAAA,IAAA,MAAS;AAAA,UAChB,GAAG,IAAA;AAAA,UACH,kBAAkB,OAAA,GAAU,SAAA,GAAY,eAAe,SAAA,CAAU,mBAAA,CAAoB,iBAAiB,cAAA,GAAiB,QAAA;AAAA,UACvH,aAAA,EAAe;AAAA,SACjB,CAAE,CAAA;AAGF,QAAA,IAAI,OAAA,IAAW,YAAA,IAAgB,CAAC,KAAA,CAAM,YAAA,EAAc;AAClD,UAAA,IAAI,IAAA,KAAS,YAAY,cAAA,EAAgB;AACvC,YAAA,MAAM,cAAA,EAAe;AAAA,UACvB,CAAA,MAAA,IAAW,SAAS,OAAA,EAAS;AAC3B,YAAA,MAAM,mBAAA,EAAoB;AAAA,UAC5B;AAAA,QACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAClD,QAAA,QAAA,CAAS,WAAS,EAAE,GAAG,IAAA,EAAM,aAAA,EAAe,MAAK,CAAE,CAAA;AAAA,MACrD;AAAA,IACF,CAAA;AAEA,IAAA,eAAA,EAAgB;AAAA,EAClB,GAAG,CAAC,YAAA,EAAc,MAAM,cAAA,EAAgB,cAAA,EAAgB,mBAAmB,CAAC,CAAA;AAE5E,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,iBAAA;AAAA,IACA,cAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA,GACF;AACF;ACzZO,SAAS,eAAe,cAAA,EAAyB;AACtD,EAAA,MAAM,EAAE,GAAA,EAAI,GAAI,SAAA,EAAU;AAC1B,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIN,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,eAAS,CAAC,CAAA;AAEtD,EAAA,MAAM,gBAAA,GAAmBU,iBAAAA,CAAY,OACnC,IAAA,EACA,cAAA,KAC+B;AAC/B,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IAC/C;AAEA,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,iBAAA,CAAkB,CAAC,CAAA;AAEnB,IAAA,IAAI;AAEF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AACrC,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,MAAA,MAAM,aAAa,MAAM,GAAA,CAAI,kBAAkB,MAAA,CAAO,cAAA,EAAgB,MAAM,cAAc,CAAA;AAC1F,MAAA,iBAAA,CAAkB,GAAG,CAAA;AACrB,MAAA,OAAO,UAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AACnD,MAAA,MAAM,KAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,iBAAA,CAAkB,CAAC,CAAA;AAAA,IACrB;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,cAAc,CAAC,CAAA;AAExB,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AACF;ACtCO,SAAS,UAAU,SAAA,EAAoB;AAC5C,EAAA,MAAM,EAAE,GAAA,EAAI,GAAI,SAAA,EAAU;AAC1B,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIV,cAAAA,CAAkB,EAAE,CAAA;AAChD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AAErD,EAAA,MAAM,UAAA,GAAaU,kBAAY,YAAY;AACzC,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,MAAA,CAAO,KAAK,SAAS,CAAA;AAC5C,MAAA,SAAA,CAAU,IAAI,CAAA;AAAA,IAChB,SAAS,GAAA,EAAU;AACjB,MAAA,QAAA,CAAS,GAAG,CAAA;AAAA,IACd,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,SAAS,CAAC,CAAA;AAEnB,EAAAJ,gBAAU,MAAM;AACd,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,UAAA,EAAW;AAAA,IACb;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,WAAA,GAAcI,iBAAAA,CAAY,OAAO,IAAA,KAA6B;AAClE,IAAA,IAAI,CAAC,SAAA,EAAW,MAAM,IAAI,MAAM,eAAe,CAAA;AAC/C,IAAA,MAAM,QAAQ,MAAM,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,WAAW,IAAI,CAAA;AACrD,IAAA,SAAA,CAAU,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,KAAK,CAAC,CAAA;AACpC,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,EAAG,CAAC,GAAA,EAAK,SAAS,CAAC,CAAA;AAEnB,EAAA,MAAM,WAAA,GAAcA,iBAAAA,CAAY,OAAO,EAAA,EAAY,IAAA,KAA6B;AAC9E,IAAA,MAAM,QAAQ,MAAM,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,IAAI,IAAI,CAAA;AAC9C,IAAA,SAAA,CAAU,CAAC,IAAA,KAAS,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,EAAA,KAAO,EAAA,GAAK,KAAA,GAAQ,CAAE,CAAC,CAAA;AAC9D,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,EAAA,MAAM,WAAA,GAAcA,iBAAAA,CAAY,OAAO,EAAA,KAAe;AACpD,IAAA,MAAM,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAC1B,IAAA,SAAA,CAAU,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAC,CAAA;AAAA,EACrD,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA,EAAQ;AAAA,GACV;AACF;ACpDO,SAAS,iBAAiB,SAAA,EAAoB;AACnD,EAAA,MAAM,EAAE,GAAA,EAAI,GAAI,SAAA,EAAU;AAC1B,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIV,cAAAA,CAAyB,EAAE,CAAA;AACrE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AAErD,EAAA,MAAM,iBAAA,GAAoBU,kBAAY,YAAY;AAChD,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,aAAA,CAAc,KAAK,SAAS,CAAA;AACnD,MAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,IACvB,SAAS,GAAA,EAAU;AACjB,MAAA,QAAA,CAAS,GAAG,CAAA;AAAA,IACd,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,SAAS,CAAC,CAAA;AAEnB,EAAAJ,gBAAU,MAAM;AACd,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,iBAAA,EAAkB;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,mBAAA,GAAsBI,iBAAAA,CAAY,OAAO,EAAA,KAAe;AAC5D,IAAA,MAAM,GAAA,CAAI,aAAA,CAAc,OAAA,CAAQ,EAAE,CAAA;AAClC,IAAA,gBAAA,CAAiB,CAAC,IAAA,KAAS,IAAA,CAAK,GAAA,CAAI,CAAC,MAAO,CAAA,CAAE,EAAA,KAAO,EAAA,GAAK,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,UAAA,EAAoB,GAAI,CAAE,CAAC,CAAA;AAAA,EACvG,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,EAAA,OAAO;AAAA,IACL,aAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,mBAAA;AAAA,IACA,MAAA,EAAQ;AAAA,GACV;AACF;AChCO,SAAS,YAAA,CAAa,SAAA,EAAoB,IAAA,GAAO,EAAA,EAAI;AAC1D,EAAA,MAAM,EAAE,GAAA,EAAI,GAAI,SAAA,EAAU;AAC1B,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIV,eAAqC,IAAI,CAAA;AACvE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAuC,IAAI,CAAA;AAC7E,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAA+B,IAAI,CAAA;AACnE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAmC,IAAI,CAAA;AAC3E,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AAErD,EAAA,MAAM,aAAA,GAAgBU,kBAAY,YAAY;AAC5C,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,CAAC,GAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,QACrC,GAAA,CAAI,SAAA,CAAU,UAAA,CAAW,SAAA,EAAW,IAAI,CAAA;AAAA,QACxC,GAAA,CAAI,SAAA,CAAU,YAAA,CAAa,SAAA,EAAW,IAAI,CAAA;AAAA,QAC1C,GAAA,CAAI,SAAA,CAAU,WAAA,CAAY,SAAA,EAAW,IAAI,CAAA;AAAA,QACzC,GAAA,CAAI,SAAA,CAAU,aAAA,CAAc,SAAA,EAAW,IAAI;AAAA,OAC5C,CAAA;AACD,MAAA,UAAA,CAAW,CAAC,CAAA;AACZ,MAAA,YAAA,CAAa,CAAC,CAAA;AACd,MAAA,WAAA,CAAY,CAAC,CAAA;AACb,MAAA,aAAA,CAAc,CAAC,CAAA;AAAA,IACjB,SAAS,GAAA,EAAU;AACjB,MAAA,QAAA,CAAS,GAAG,CAAA;AAAA,IACd,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,SAAA,EAAW,IAAI,CAAC,CAAA;AAEzB,EAAAJ,gBAAU,MAAM;AACd,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,aAAA,EAAc;AAAA,IAChB;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,IAAI,CAAC,CAAA;AAEpB,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA,EAAQ;AAAA,GACV;AACF","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"]}
@@ -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.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
- * SETUP INSTRUCTIONS:
41
- * 1. Install peer dependencies:
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
- * (or expo-notifications for Expo projects)
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();