@uselingu/react-native-sdk 0.1.3 → 0.1.5

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
@@ -1,8 +1,8 @@
1
- # @lingu/react-native-sdk
1
+ # @uselingu/react-native-sdk
2
2
 
3
3
  > Lingu AI Chat SDK for React Native - Hybrid approach with WebView UI and native API
4
4
 
5
- [![npm version](https://img.shields.io/npm/v/@lingu/react-native-sdk.svg)](https://www.npmjs.com/package/@lingu/react-native-sdk)
5
+ [![npm version](https://img.shields.io/npm/v/@uselingu/react-native-sdk.svg)](https://www.npmjs.com/package/@uselingu/react-native-sdk)
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
7
 
8
8
  ## Features
@@ -21,9 +21,9 @@
21
21
  ## Installation
22
22
 
23
23
  ```bash
24
- npm install @lingu/react-native-sdk react-native-webview @react-native-async-storage/async-storage
24
+ npm install @uselingu/react-native-sdk react-native-webview @react-native-async-storage/async-storage
25
25
  # or
26
- yarn add @lingu/react-native-sdk react-native-webview @react-native-async-storage/async-storage
26
+ yarn add @uselingu/react-native-sdk react-native-webview @react-native-async-storage/async-storage
27
27
  ```
28
28
 
29
29
  ### iOS Setup
@@ -43,7 +43,7 @@ No additional setup required.
43
43
  ```tsx
44
44
  import React from 'react';
45
45
  import { View } from 'react-native';
46
- import { LinguChat } from '@lingu/react-native-sdk';
46
+ import { LinguChat } from '@uselingu/react-native-sdk';
47
47
 
48
48
  export default function App() {
49
49
  return (
@@ -70,6 +70,8 @@ export default function App() {
70
70
  | Prop | Type | Required | Default | Description |
71
71
  |------|------|----------|---------|-------------|
72
72
  | `apiKey` | `string` | Yes | - | Your Lingu API key |
73
+ | `environment` | `'production' \| 'staging'` | No | `production` | Which hosted Lingu backend to use. Ignored if `baseURL` is set. |
74
+ | `baseURL` | `string` | No | prod URL | Explicit API base URL. Overrides `environment`; use for local dev (e.g. `http://127.0.0.1:3003/api`). |
73
75
  | `position` | `ChatPosition` | No | `bottom-right` | FAB position (when closed) |
74
76
  | `theme` | `ThemeMode` | No | `light` | Theme mode |
75
77
  | `primaryColor` | `string` | No | `#4ade80` | Primary color |
@@ -86,6 +88,32 @@ export default function App() {
86
88
  ```typescript
87
89
  type ChatPosition = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
88
90
  type ThemeMode = 'light' | 'dark' | 'system';
91
+ type LinguEnvironment = 'production' | 'staging';
92
+ ```
93
+
94
+ ### Choosing an environment
95
+
96
+ The SDK resolves its API base URL in this order: **`baseURL` → `environment` → production default.**
97
+
98
+ | Config | Resolved URL |
99
+ |--------|--------------|
100
+ | _(nothing set)_ | `https://lingu-api-prod.fly.dev/api` |
101
+ | `environment="production"` | `https://lingu-api-prod.fly.dev/api` |
102
+ | `environment="staging"` | `https://lingu-api.fly.dev/api` |
103
+ | `baseURL="http://127.0.0.1:3003/api"` | your value (local dev) |
104
+
105
+ ```tsx
106
+ // Point the SDK at staging while testing
107
+ <LinguChat apiKey="your-api-key" environment="staging" />
108
+
109
+ // Production (default — can be omitted)
110
+ <LinguChat apiKey="your-api-key" environment="production" />
111
+ ```
112
+
113
+ The predefined URLs are exported if you need them directly:
114
+
115
+ ```tsx
116
+ import { LINGU_API_URLS, resolveBaseURL } from '@uselingu/react-native-sdk';
89
117
  ```
90
118
 
91
119
  ### Dark Mode
@@ -119,7 +147,7 @@ function App() {
119
147
  ### Using the Hook
120
148
 
121
149
  ```tsx
122
- import { useLinguChat } from '@lingu/react-native-sdk';
150
+ import { useLinguChat } from '@uselingu/react-native-sdk';
123
151
 
124
152
  function CustomChat() {
125
153
  const {
@@ -200,7 +228,7 @@ Low-level API client for direct API access.
200
228
  ### Basic Integration
201
229
 
202
230
  ```tsx
203
- import { LinguChat } from '@lingu/react-native-sdk';
231
+ import { LinguChat } from '@uselingu/react-native-sdk';
204
232
 
205
233
  <LinguChat apiKey="your-api-key-here" />
206
234
  ```
@@ -8,6 +8,7 @@ var _react = require("react");
8
8
  var _LinguAPI = require("../services/LinguAPI");
9
9
  var _SessionManager = require("../services/SessionManager");
10
10
  var _StorageManager = require("../services/StorageManager");
11
+ var _types = require("../types");
11
12
  /**
12
13
  * Custom hook for managing Lingu chat state and operations
13
14
  * Now with message persistence and comprehensive logging
@@ -15,10 +16,15 @@ var _StorageManager = require("../services/StorageManager");
15
16
 
16
17
  const LOG_PREFIX = '[useLinguChat]';
17
18
  const useLinguChat = linguConfig => {
18
- var _linguConfig$apiKey;
19
+ var _linguConfig$apiKey, _linguConfig$environm;
20
+ const baseURL = (0, _types.resolveBaseURL)({
21
+ baseURL: linguConfig.baseURL,
22
+ environment: linguConfig.environment
23
+ });
19
24
  console.log(`${LOG_PREFIX} Initializing hook with config:`, {
20
25
  apiKey: ((_linguConfig$apiKey = linguConfig.apiKey) === null || _linguConfig$apiKey === void 0 ? void 0 : _linguConfig$apiKey.substring(0, 20)) + '...',
21
- baseURL: linguConfig.baseURL,
26
+ baseURL,
27
+ environment: (_linguConfig$environm = linguConfig.environment) !== null && _linguConfig$environm !== void 0 ? _linguConfig$environm : 'production',
22
28
  autoOpen: linguConfig.autoOpen
23
29
  });
24
30
  const [messages, setMessages] = (0, _react.useState)([]);
@@ -28,11 +34,19 @@ const useLinguChat = linguConfig => {
28
34
  const apiRef = (0, _react.useRef)(null);
29
35
  const sessionManagerRef = (0, _react.useRef)(null);
30
36
  const currentSessionIdRef = (0, _react.useRef)(null);
37
+ // Mirror `messages` into a ref so callbacks created once in the init effect
38
+ // (onSessionEnd, cleanup) always read the latest messages instead of the
39
+ // empty array captured at mount.
40
+ const messagesRef = (0, _react.useRef)([]);
41
+
42
+ // Keep the messages ref in sync with state.
43
+ (0, _react.useEffect)(() => {
44
+ messagesRef.current = messages;
45
+ }, [messages]);
31
46
 
32
47
  // Initialize API client and session manager
33
48
  (0, _react.useEffect)(() => {
34
49
  console.log(`${LOG_PREFIX} Setting up API client and session manager`);
35
- const baseURL = linguConfig.baseURL || 'https://api.uselingu.app/api';
36
50
  console.log(`${LOG_PREFIX} API Base URL:`, baseURL);
37
51
  const api = new _LinguAPI.LinguAPI(linguConfig.apiKey, baseURL);
38
52
  apiRef.current = api;
@@ -61,10 +75,11 @@ const useLinguChat = linguConfig => {
61
75
  var _linguConfig$onSessio2;
62
76
  console.log(`${LOG_PREFIX} Session ending:`, sessionId);
63
77
 
64
- // Save messages before ending
65
- if (messages.length > 0) {
66
- console.log(`${LOG_PREFIX} Saving ${messages.length} messages before session end`);
67
- await _StorageManager.StorageManager.saveMessages(sessionId, messages);
78
+ // Save messages before ending (read from ref for latest value)
79
+ const currentMessages = messagesRef.current;
80
+ if (currentMessages.length > 0) {
81
+ console.log(`${LOG_PREFIX} Saving ${currentMessages.length} messages before session end`);
82
+ await _StorageManager.StorageManager.saveMessages(sessionId, currentMessages);
68
83
  }
69
84
  currentSessionIdRef.current = null;
70
85
  setIsSessionActive(false);
@@ -97,15 +112,16 @@ const useLinguChat = linguConfig => {
97
112
  return () => {
98
113
  var _sessionManagerRef$cu;
99
114
  console.log(`${LOG_PREFIX} Component unmounting, cleaning up...`);
100
- // Save messages before cleanup
101
- if (currentSessionIdRef.current && messages.length > 0) {
115
+ // Save messages before cleanup (read from ref for latest value)
116
+ const currentMessages = messagesRef.current;
117
+ if (currentSessionIdRef.current && currentMessages.length > 0) {
102
118
  console.log(`${LOG_PREFIX} Saving messages on unmount`);
103
- _StorageManager.StorageManager.saveMessages(currentSessionIdRef.current, messages);
119
+ _StorageManager.StorageManager.saveMessages(currentSessionIdRef.current, currentMessages);
104
120
  }
105
121
  (_sessionManagerRef$cu = sessionManagerRef.current) === null || _sessionManagerRef$cu === void 0 || _sessionManagerRef$cu.cleanup();
106
122
  console.log(`${LOG_PREFIX} Cleanup complete`);
107
123
  };
108
- }, [linguConfig.apiKey, linguConfig.baseURL]);
124
+ }, [linguConfig.apiKey, baseURL]);
109
125
 
110
126
  // Save messages whenever they change
111
127
  (0, _react.useEffect)(() => {
@@ -116,18 +132,44 @@ const useLinguChat = linguConfig => {
116
132
  }, [messages]);
117
133
 
118
134
  /**
119
- * Try to restore previous session
135
+ * Try to restore previous session from backend
120
136
  */
121
137
  const restorePreviousSession = async () => {
122
138
  try {
123
139
  const previousSessionId = await _StorageManager.StorageManager.getCurrentSessionId();
124
- if (previousSessionId) {
140
+ if (previousSessionId && apiRef.current) {
125
141
  console.log(`${LOG_PREFIX} Found previous session:`, previousSessionId);
142
+
143
+ // Try to fetch fresh history from backend
144
+ try {
145
+ const history = await apiRef.current.getChatHistory(previousSessionId);
146
+ if (!history.isNewSession && history.messages.length > 0) {
147
+ console.log(`${LOG_PREFIX} Restored ${history.messages.length} messages from backend`);
148
+
149
+ // Convert backend format to our Message format
150
+ const restoredMessages = history.messages.map((msg, index) => ({
151
+ id: `restored-${index}-${Date.now()}`,
152
+ text: msg.content,
153
+ sender: msg.role === 'assistant' ? 'bot' : 'user',
154
+ timestamp: new Date(msg.timestamp)
155
+ }));
156
+ setMessages(restoredMessages);
157
+ currentSessionIdRef.current = previousSessionId;
158
+ apiRef.current.resumeSession(previousSessionId);
159
+ setIsSessionActive(true);
160
+ return;
161
+ }
162
+ } catch (apiError) {
163
+ console.warn(`${LOG_PREFIX} Failed to fetch from backend, trying local storage:`, apiError);
164
+ }
165
+
166
+ // Fallback to local storage
126
167
  const savedMessages = await _StorageManager.StorageManager.loadMessages(previousSessionId);
127
168
  if (savedMessages.length > 0) {
128
- console.log(`${LOG_PREFIX} Restored ${savedMessages.length} messages from previous session`);
169
+ console.log(`${LOG_PREFIX} Restored ${savedMessages.length} messages from local storage`);
129
170
  setMessages(savedMessages);
130
171
  currentSessionIdRef.current = previousSessionId;
172
+ setIsSessionActive(true);
131
173
  } else {
132
174
  console.log(`${LOG_PREFIX} Previous session had no messages`);
133
175
  }
@@ -135,7 +177,7 @@ const useLinguChat = linguConfig => {
135
177
  console.log(`${LOG_PREFIX} No previous session found`);
136
178
  }
137
179
  } catch (error) {
138
- console.error(`${LOG_PREFIX} Failed to restore previous session:`, error);
180
+ console.error(`${LOG_PREFIX} Failed to restore previous session:`, error);
139
181
  }
140
182
  };
141
183
 
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_LinguAPI","_SessionManager","_StorageManager","LOG_PREFIX","useLinguChat","linguConfig","_linguConfig$apiKey","console","log","apiKey","substring","baseURL","autoOpen","messages","setMessages","useState","isLoading","setIsLoading","config","setConfig","isSessionActive","setIsSessionActive","apiRef","useRef","sessionManagerRef","currentSessionIdRef","useEffect","api","LinguAPI","current","sessionManager","SessionManager","onSessionStart","sessionId","_linguConfig$onSessio","StorageManager","saveCurrentSessionId","savedMessages","loadMessages","length","call","onSessionEnd","_linguConfig$onSessio2","saveMessages","getConfig","then","fetchedConfig","_fetchedConfig$greeti","theme","primaryColor","brandName","greetingMessage","catch","error","restorePreviousSession","_sessionManagerRef$cu","cleanup","previousSessionId","getCurrentSessionId","startSession","useCallback","start","greetingMsg","id","Date","now","text","sender","timestamp","endSession","end","clearHistory","clearMessages","sendMessage","_linguConfig$onMessag","getSessionId","messageLength","preview","userMessage","prev","onMessageSent","_linguConfig$onMessag2","startTime","response","duration","responseLength","botMessage","onMessageReceived","errorMessage","messagesCount","hasConfig","currentSessionId","exports"],"sources":["useLinguChat.ts"],"sourcesContent":["/**\n * Custom hook for managing Lingu chat state and operations\n * Now with message persistence and comprehensive logging\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { LinguAPI } from '../services/LinguAPI';\nimport { SessionManager } from '../services/SessionManager';\nimport { StorageManager } from '../services/StorageManager';\nimport type { Message, WidgetConfig, LinguConfig } from '../types';\n\nconst LOG_PREFIX = '[useLinguChat]';\n\ninterface UseLinguChatReturn {\n messages: Message[];\n isLoading: boolean;\n config: WidgetConfig | null;\n sendMessage: (text: string) => Promise<void>;\n startSession: () => Promise<void>;\n endSession: () => Promise<void>;\n isSessionActive: boolean;\n clearHistory: () => Promise<void>;\n}\n\nexport const useLinguChat = (linguConfig: LinguConfig): UseLinguChatReturn => {\n console.log(`${LOG_PREFIX} Initializing hook with config:`, {\n apiKey: linguConfig.apiKey?.substring(0, 20) + '...',\n baseURL: linguConfig.baseURL,\n autoOpen: linguConfig.autoOpen,\n });\n\n const [messages, setMessages] = useState<Message[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [config, setConfig] = useState<WidgetConfig | null>(null);\n const [isSessionActive, setIsSessionActive] = useState(false);\n\n const apiRef = useRef<LinguAPI | null>(null);\n const sessionManagerRef = useRef<SessionManager | null>(null);\n const currentSessionIdRef = useRef<string | null>(null);\n\n // Initialize API client and session manager\n useEffect(() => {\n console.log(`${LOG_PREFIX} Setting up API client and session manager`);\n\n const baseURL = linguConfig.baseURL || 'https://api.uselingu.app/api';\n console.log(`${LOG_PREFIX} API Base URL:`, baseURL);\n\n const api = new LinguAPI(linguConfig.apiKey, baseURL);\n apiRef.current = api;\n\n const sessionManager = new SessionManager(api, {\n onSessionStart: async (sessionId) => {\n console.log(`${LOG_PREFIX} ✅ Session started:`, sessionId);\n currentSessionIdRef.current = sessionId;\n setIsSessionActive(true);\n\n // Save session ID\n await StorageManager.saveCurrentSessionId(sessionId);\n console.log(`${LOG_PREFIX} Session ID saved to storage`);\n\n // Try to load previous messages for this session\n const savedMessages = await StorageManager.loadMessages(sessionId);\n if (savedMessages.length > 0) {\n console.log(`${LOG_PREFIX} Loaded ${savedMessages.length} messages from storage`);\n setMessages(savedMessages);\n } else {\n console.log(`${LOG_PREFIX} No previous messages found for this session`);\n }\n\n linguConfig.onSessionStart?.(sessionId);\n },\n onSessionEnd: async (sessionId) => {\n console.log(`${LOG_PREFIX} Session ending:`, sessionId);\n\n // Save messages before ending\n if (messages.length > 0) {\n console.log(`${LOG_PREFIX} Saving ${messages.length} messages before session end`);\n await StorageManager.saveMessages(sessionId, messages);\n }\n\n currentSessionIdRef.current = null;\n setIsSessionActive(false);\n console.log(`${LOG_PREFIX} ✅ Session ended successfully`);\n linguConfig.onSessionEnd?.(sessionId);\n },\n });\n sessionManagerRef.current = sessionManager;\n\n // Load widget configuration\n console.log(`${LOG_PREFIX} Fetching widget configuration...`);\n api\n .getConfig()\n .then((fetchedConfig) => {\n console.log(`${LOG_PREFIX} ✅ Widget config loaded:`, {\n theme: fetchedConfig.theme,\n primaryColor: fetchedConfig.primaryColor,\n brandName: fetchedConfig.brandName,\n greetingMessage: fetchedConfig.greetingMessage?.substring(0, 50),\n });\n setConfig(fetchedConfig);\n })\n .catch((error) => {\n console.error(`${LOG_PREFIX} ❌ Failed to load config:`, error);\n });\n\n // Try to restore previous session\n console.log(`${LOG_PREFIX} Attempting to restore previous session...`);\n restorePreviousSession();\n\n // Cleanup on unmount\n return () => {\n console.log(`${LOG_PREFIX} Component unmounting, cleaning up...`);\n // Save messages before cleanup\n if (currentSessionIdRef.current && messages.length > 0) {\n console.log(`${LOG_PREFIX} Saving messages on unmount`);\n StorageManager.saveMessages(currentSessionIdRef.current, messages);\n }\n sessionManagerRef.current?.cleanup();\n console.log(`${LOG_PREFIX} Cleanup complete`);\n };\n }, [linguConfig.apiKey, linguConfig.baseURL]);\n\n // Save messages whenever they change\n useEffect(() => {\n if (currentSessionIdRef.current && messages.length > 0) {\n console.log(`${LOG_PREFIX} Auto-saving ${messages.length} messages`);\n StorageManager.saveMessages(currentSessionIdRef.current, messages);\n }\n }, [messages]);\n\n /**\n * Try to restore previous session\n */\n const restorePreviousSession = async () => {\n try {\n const previousSessionId = await StorageManager.getCurrentSessionId();\n if (previousSessionId) {\n console.log(`${LOG_PREFIX} Found previous session:`, previousSessionId);\n const savedMessages = await StorageManager.loadMessages(previousSessionId);\n if (savedMessages.length > 0) {\n console.log(`${LOG_PREFIX} ✅ Restored ${savedMessages.length} messages from previous session`);\n setMessages(savedMessages);\n currentSessionIdRef.current = previousSessionId;\n } else {\n console.log(`${LOG_PREFIX} Previous session had no messages`);\n }\n } else {\n console.log(`${LOG_PREFIX} No previous session found`);\n }\n } catch (error) {\n console.error(`${LOG_PREFIX} ❌ Failed to restore previous session:`, error);\n }\n };\n\n /**\n * Start a new chat session\n */\n const startSession = useCallback(async () => {\n if (!sessionManagerRef.current) {\n console.error(`${LOG_PREFIX} ❌ Session manager not initialized`);\n return;\n }\n\n try {\n console.log(`${LOG_PREFIX} Starting new session...`);\n await sessionManagerRef.current.start();\n\n // Add greeting message if configured and no previous messages\n if (config?.greetingMessage && messages.length === 0) {\n console.log(`${LOG_PREFIX} Adding greeting message`);\n const greetingMsg: Message = {\n id: `greeting-${Date.now()}`,\n text: config.greetingMessage,\n sender: 'bot',\n timestamp: new Date(),\n };\n setMessages([greetingMsg]);\n }\n } catch (error) {\n console.error(`${LOG_PREFIX} ❌ Failed to start session:`, error);\n }\n }, [config, messages.length]);\n\n /**\n * End the current chat session\n */\n const endSession = useCallback(async () => {\n if (!sessionManagerRef.current) {\n console.error(`${LOG_PREFIX} ❌ Session manager not initialized`);\n return;\n }\n\n try {\n console.log(`${LOG_PREFIX} Ending session...`);\n await sessionManagerRef.current.end();\n // Don't clear messages - they're saved in storage\n console.log(`${LOG_PREFIX} ✅ Session ended, messages preserved`);\n } catch (error) {\n console.error(`${LOG_PREFIX} ❌ Failed to end session:`, error);\n }\n }, []);\n\n /**\n * Clear chat history\n */\n const clearHistory = useCallback(async () => {\n console.log(`${LOG_PREFIX} Clearing chat history...`);\n if (currentSessionIdRef.current) {\n await StorageManager.clearMessages(currentSessionIdRef.current);\n console.log(`${LOG_PREFIX} ✅ Storage cleared for session:`, currentSessionIdRef.current);\n }\n setMessages([]);\n console.log(`${LOG_PREFIX} ✅ Messages cleared from state`);\n }, []);\n\n /**\n * Send a message to the AI\n */\n const sendMessage = useCallback(\n async (text: string) => {\n if (!apiRef.current || !sessionManagerRef.current) {\n console.error(`${LOG_PREFIX} ❌ API or session manager not initialized`);\n return;\n }\n\n const sessionId = sessionManagerRef.current.getSessionId();\n if (!sessionId) {\n console.error(`${LOG_PREFIX} ❌ No active session`);\n return;\n }\n\n console.log(`${LOG_PREFIX} Sending message:`, {\n sessionId,\n messageLength: text.length,\n preview: text.substring(0, 50),\n });\n\n // Add user message\n const userMessage: Message = {\n id: `user-${Date.now()}`,\n text,\n sender: 'user',\n timestamp: new Date(),\n };\n setMessages((prev) => {\n console.log(`${LOG_PREFIX} Adding user message to state (total: ${prev.length + 1})`);\n return [...prev, userMessage];\n });\n linguConfig.onMessageSent?.(text);\n\n // Send to API\n setIsLoading(true);\n console.log(`${LOG_PREFIX} Waiting for AI response...`);\n try {\n const startTime = Date.now();\n const response = await apiRef.current.sendMessage(text, sessionId);\n const duration = Date.now() - startTime;\n\n console.log(`${LOG_PREFIX} ✅ Received AI response in ${duration}ms:`, {\n responseLength: response.length,\n preview: response.substring(0, 50),\n });\n\n // Add bot response\n const botMessage: Message = {\n id: `bot-${Date.now()}`,\n text: response,\n sender: 'bot',\n timestamp: new Date(),\n };\n setMessages((prev) => {\n console.log(`${LOG_PREFIX} Adding bot message to state (total: ${prev.length + 1})`);\n return [...prev, botMessage];\n });\n linguConfig.onMessageReceived?.(response);\n } catch (error) {\n console.error(`${LOG_PREFIX} ❌ Failed to send message:`, error);\n\n // Add error message\n const errorMessage: Message = {\n id: `error-${Date.now()}`,\n text: 'Sorry, I encountered an error. Please try again.',\n sender: 'bot',\n timestamp: new Date(),\n };\n setMessages((prev) => [...prev, errorMessage]);\n console.log(`${LOG_PREFIX} Added error message to state`);\n } finally {\n setIsLoading(false);\n console.log(`${LOG_PREFIX} Message send complete`);\n }\n },\n [linguConfig]\n );\n\n console.log(`${LOG_PREFIX} Current state:`, {\n messagesCount: messages.length,\n isLoading,\n hasConfig: !!config,\n isSessionActive,\n currentSessionId: currentSessionIdRef.current,\n });\n\n return {\n messages,\n isLoading,\n config,\n sendMessage,\n startSession,\n endSession,\n isSessionActive,\n clearHistory,\n };\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","require","_LinguAPI","_SessionManager","_StorageManager","_types","LOG_PREFIX","useLinguChat","linguConfig","_linguConfig$apiKey","_linguConfig$environm","baseURL","resolveBaseURL","environment","console","log","apiKey","substring","autoOpen","messages","setMessages","useState","isLoading","setIsLoading","config","setConfig","isSessionActive","setIsSessionActive","apiRef","useRef","sessionManagerRef","currentSessionIdRef","messagesRef","useEffect","current","api","LinguAPI","sessionManager","SessionManager","onSessionStart","sessionId","_linguConfig$onSessio","StorageManager","saveCurrentSessionId","savedMessages","loadMessages","length","call","onSessionEnd","_linguConfig$onSessio2","currentMessages","saveMessages","getConfig","then","fetchedConfig","_fetchedConfig$greeti","theme","primaryColor","brandName","greetingMessage","catch","error","restorePreviousSession","_sessionManagerRef$cu","cleanup","previousSessionId","getCurrentSessionId","history","getChatHistory","isNewSession","restoredMessages","map","msg","index","id","Date","now","text","content","sender","role","timestamp","resumeSession","apiError","warn","startSession","useCallback","start","greetingMsg","endSession","end","clearHistory","clearMessages","sendMessage","_linguConfig$onMessag","getSessionId","messageLength","preview","userMessage","prev","onMessageSent","_linguConfig$onMessag2","startTime","response","duration","responseLength","botMessage","onMessageReceived","errorMessage","messagesCount","hasConfig","currentSessionId","exports"],"sources":["useLinguChat.ts"],"sourcesContent":["/**\n * Custom hook for managing Lingu chat state and operations\n * Now with message persistence and comprehensive logging\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { LinguAPI } from '../services/LinguAPI';\nimport { SessionManager } from '../services/SessionManager';\nimport { StorageManager } from '../services/StorageManager';\nimport { resolveBaseURL } from '../types';\nimport type { Message, WidgetConfig, LinguConfig } from '../types';\n\nconst LOG_PREFIX = '[useLinguChat]';\n\ninterface UseLinguChatReturn {\n messages: Message[];\n isLoading: boolean;\n config: WidgetConfig | null;\n sendMessage: (text: string) => Promise<void>;\n startSession: () => Promise<void>;\n endSession: () => Promise<void>;\n isSessionActive: boolean;\n clearHistory: () => Promise<void>;\n}\n\nexport const useLinguChat = (linguConfig: LinguConfig): UseLinguChatReturn => {\n const baseURL = resolveBaseURL({\n baseURL: linguConfig.baseURL,\n environment: linguConfig.environment,\n });\n\n console.log(`${LOG_PREFIX} Initializing hook with config:`, {\n apiKey: linguConfig.apiKey?.substring(0, 20) + '...',\n baseURL,\n environment: linguConfig.environment ?? 'production',\n autoOpen: linguConfig.autoOpen,\n });\n\n const [messages, setMessages] = useState<Message[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [config, setConfig] = useState<WidgetConfig | null>(null);\n const [isSessionActive, setIsSessionActive] = useState(false);\n\n const apiRef = useRef<LinguAPI | null>(null);\n const sessionManagerRef = useRef<SessionManager | null>(null);\n const currentSessionIdRef = useRef<string | null>(null);\n // Mirror `messages` into a ref so callbacks created once in the init effect\n // (onSessionEnd, cleanup) always read the latest messages instead of the\n // empty array captured at mount.\n const messagesRef = useRef<Message[]>([]);\n\n // Keep the messages ref in sync with state.\n useEffect(() => {\n messagesRef.current = messages;\n }, [messages]);\n\n // Initialize API client and session manager\n useEffect(() => {\n console.log(`${LOG_PREFIX} Setting up API client and session manager`);\n console.log(`${LOG_PREFIX} API Base URL:`, baseURL);\n\n const api = new LinguAPI(linguConfig.apiKey, baseURL);\n apiRef.current = api;\n\n const sessionManager = new SessionManager(api, {\n onSessionStart: async (sessionId) => {\n console.log(`${LOG_PREFIX} ✅ Session started:`, sessionId);\n currentSessionIdRef.current = sessionId;\n setIsSessionActive(true);\n\n // Save session ID\n await StorageManager.saveCurrentSessionId(sessionId);\n console.log(`${LOG_PREFIX} Session ID saved to storage`);\n\n // Try to load previous messages for this session\n const savedMessages = await StorageManager.loadMessages(sessionId);\n if (savedMessages.length > 0) {\n console.log(`${LOG_PREFIX} Loaded ${savedMessages.length} messages from storage`);\n setMessages(savedMessages);\n } else {\n console.log(`${LOG_PREFIX} No previous messages found for this session`);\n }\n\n linguConfig.onSessionStart?.(sessionId);\n },\n onSessionEnd: async (sessionId) => {\n console.log(`${LOG_PREFIX} Session ending:`, sessionId);\n\n // Save messages before ending (read from ref for latest value)\n const currentMessages = messagesRef.current;\n if (currentMessages.length > 0) {\n console.log(`${LOG_PREFIX} Saving ${currentMessages.length} messages before session end`);\n await StorageManager.saveMessages(sessionId, currentMessages);\n }\n\n currentSessionIdRef.current = null;\n setIsSessionActive(false);\n console.log(`${LOG_PREFIX} ✅ Session ended successfully`);\n linguConfig.onSessionEnd?.(sessionId);\n },\n });\n sessionManagerRef.current = sessionManager;\n\n // Load widget configuration\n console.log(`${LOG_PREFIX} Fetching widget configuration...`);\n api\n .getConfig()\n .then((fetchedConfig) => {\n console.log(`${LOG_PREFIX} ✅ Widget config loaded:`, {\n theme: fetchedConfig.theme,\n primaryColor: fetchedConfig.primaryColor,\n brandName: fetchedConfig.brandName,\n greetingMessage: fetchedConfig.greetingMessage?.substring(0, 50),\n });\n setConfig(fetchedConfig);\n })\n .catch((error) => {\n console.error(`${LOG_PREFIX} ❌ Failed to load config:`, error);\n });\n\n // Try to restore previous session\n console.log(`${LOG_PREFIX} Attempting to restore previous session...`);\n restorePreviousSession();\n\n // Cleanup on unmount\n return () => {\n console.log(`${LOG_PREFIX} Component unmounting, cleaning up...`);\n // Save messages before cleanup (read from ref for latest value)\n const currentMessages = messagesRef.current;\n if (currentSessionIdRef.current && currentMessages.length > 0) {\n console.log(`${LOG_PREFIX} Saving messages on unmount`);\n StorageManager.saveMessages(currentSessionIdRef.current, currentMessages);\n }\n sessionManagerRef.current?.cleanup();\n console.log(`${LOG_PREFIX} Cleanup complete`);\n };\n }, [linguConfig.apiKey, baseURL]);\n\n // Save messages whenever they change\n useEffect(() => {\n if (currentSessionIdRef.current && messages.length > 0) {\n console.log(`${LOG_PREFIX} Auto-saving ${messages.length} messages`);\n StorageManager.saveMessages(currentSessionIdRef.current, messages);\n }\n }, [messages]);\n\n /**\n * Try to restore previous session from backend\n */\n const restorePreviousSession = async () => {\n try {\n const previousSessionId = await StorageManager.getCurrentSessionId();\n if (previousSessionId && apiRef.current) {\n console.log(`${LOG_PREFIX} Found previous session:`, previousSessionId);\n\n // Try to fetch fresh history from backend\n try {\n const history = await apiRef.current.getChatHistory(previousSessionId);\n\n if (!history.isNewSession && history.messages.length > 0) {\n console.log(`${LOG_PREFIX} Restored ${history.messages.length} messages from backend`);\n\n // Convert backend format to our Message format\n const restoredMessages: Message[] = history.messages.map((msg, index) => ({\n id: `restored-${index}-${Date.now()}`,\n text: msg.content,\n sender: msg.role === 'assistant' ? 'bot' : 'user',\n timestamp: new Date(msg.timestamp),\n }));\n\n setMessages(restoredMessages);\n currentSessionIdRef.current = previousSessionId;\n apiRef.current.resumeSession(previousSessionId);\n setIsSessionActive(true);\n return;\n }\n } catch (apiError) {\n console.warn(`${LOG_PREFIX} Failed to fetch from backend, trying local storage:`, apiError);\n }\n\n // Fallback to local storage\n const savedMessages = await StorageManager.loadMessages(previousSessionId);\n if (savedMessages.length > 0) {\n console.log(`${LOG_PREFIX} Restored ${savedMessages.length} messages from local storage`);\n setMessages(savedMessages);\n currentSessionIdRef.current = previousSessionId;\n setIsSessionActive(true);\n } else {\n console.log(`${LOG_PREFIX} Previous session had no messages`);\n }\n } else {\n console.log(`${LOG_PREFIX} No previous session found`);\n }\n } catch (error) {\n console.error(`${LOG_PREFIX} Failed to restore previous session:`, error);\n }\n };\n\n /**\n * Start a new chat session\n */\n const startSession = useCallback(async () => {\n if (!sessionManagerRef.current) {\n console.error(`${LOG_PREFIX} ❌ Session manager not initialized`);\n return;\n }\n\n try {\n console.log(`${LOG_PREFIX} Starting new session...`);\n await sessionManagerRef.current.start();\n\n // Add greeting message if configured and no previous messages\n if (config?.greetingMessage && messages.length === 0) {\n console.log(`${LOG_PREFIX} Adding greeting message`);\n const greetingMsg: Message = {\n id: `greeting-${Date.now()}`,\n text: config.greetingMessage,\n sender: 'bot',\n timestamp: new Date(),\n };\n setMessages([greetingMsg]);\n }\n } catch (error) {\n console.error(`${LOG_PREFIX} ❌ Failed to start session:`, error);\n }\n }, [config, messages.length]);\n\n /**\n * End the current chat session\n */\n const endSession = useCallback(async () => {\n if (!sessionManagerRef.current) {\n console.error(`${LOG_PREFIX} ❌ Session manager not initialized`);\n return;\n }\n\n try {\n console.log(`${LOG_PREFIX} Ending session...`);\n await sessionManagerRef.current.end();\n // Don't clear messages - they're saved in storage\n console.log(`${LOG_PREFIX} ✅ Session ended, messages preserved`);\n } catch (error) {\n console.error(`${LOG_PREFIX} ❌ Failed to end session:`, error);\n }\n }, []);\n\n /**\n * Clear chat history\n */\n const clearHistory = useCallback(async () => {\n console.log(`${LOG_PREFIX} Clearing chat history...`);\n if (currentSessionIdRef.current) {\n await StorageManager.clearMessages(currentSessionIdRef.current);\n console.log(`${LOG_PREFIX} ✅ Storage cleared for session:`, currentSessionIdRef.current);\n }\n setMessages([]);\n console.log(`${LOG_PREFIX} ✅ Messages cleared from state`);\n }, []);\n\n /**\n * Send a message to the AI\n */\n const sendMessage = useCallback(\n async (text: string) => {\n if (!apiRef.current || !sessionManagerRef.current) {\n console.error(`${LOG_PREFIX} ❌ API or session manager not initialized`);\n return;\n }\n\n const sessionId = sessionManagerRef.current.getSessionId();\n if (!sessionId) {\n console.error(`${LOG_PREFIX} ❌ No active session`);\n return;\n }\n\n console.log(`${LOG_PREFIX} Sending message:`, {\n sessionId,\n messageLength: text.length,\n preview: text.substring(0, 50),\n });\n\n // Add user message\n const userMessage: Message = {\n id: `user-${Date.now()}`,\n text,\n sender: 'user',\n timestamp: new Date(),\n };\n setMessages((prev) => {\n console.log(`${LOG_PREFIX} Adding user message to state (total: ${prev.length + 1})`);\n return [...prev, userMessage];\n });\n linguConfig.onMessageSent?.(text);\n\n // Send to API\n setIsLoading(true);\n console.log(`${LOG_PREFIX} Waiting for AI response...`);\n try {\n const startTime = Date.now();\n const response = await apiRef.current.sendMessage(text, sessionId);\n const duration = Date.now() - startTime;\n\n console.log(`${LOG_PREFIX} ✅ Received AI response in ${duration}ms:`, {\n responseLength: response.length,\n preview: response.substring(0, 50),\n });\n\n // Add bot response\n const botMessage: Message = {\n id: `bot-${Date.now()}`,\n text: response,\n sender: 'bot',\n timestamp: new Date(),\n };\n setMessages((prev) => {\n console.log(`${LOG_PREFIX} Adding bot message to state (total: ${prev.length + 1})`);\n return [...prev, botMessage];\n });\n linguConfig.onMessageReceived?.(response);\n } catch (error) {\n console.error(`${LOG_PREFIX} ❌ Failed to send message:`, error);\n\n // Add error message\n const errorMessage: Message = {\n id: `error-${Date.now()}`,\n text: 'Sorry, I encountered an error. Please try again.',\n sender: 'bot',\n timestamp: new Date(),\n };\n setMessages((prev) => [...prev, errorMessage]);\n console.log(`${LOG_PREFIX} Added error message to state`);\n } finally {\n setIsLoading(false);\n console.log(`${LOG_PREFIX} Message send complete`);\n }\n },\n [linguConfig]\n );\n\n console.log(`${LOG_PREFIX} Current state:`, {\n messagesCount: messages.length,\n isLoading,\n hasConfig: !!config,\n isSessionActive,\n currentSessionId: currentSessionIdRef.current,\n });\n\n return {\n messages,\n isLoading,\n config,\n sendMessage,\n startSession,\n endSession,\n isSessionActive,\n clearHistory,\n };\n};\n"],"mappings":"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","ignoreList":[]}
@@ -17,8 +17,23 @@ var _exportNames = {
17
17
  useLinguChat: true,
18
18
  LinguAPI: true,
19
19
  SessionManager: true,
20
- StorageManager: true
20
+ StorageManager: true,
21
+ LINGU_API_URLS: true,
22
+ DEFAULT_LINGU_ENVIRONMENT: true,
23
+ resolveBaseURL: true
21
24
  };
25
+ Object.defineProperty(exports, "DEFAULT_LINGU_ENVIRONMENT", {
26
+ enumerable: true,
27
+ get: function () {
28
+ return _types.DEFAULT_LINGU_ENVIRONMENT;
29
+ }
30
+ });
31
+ Object.defineProperty(exports, "LINGU_API_URLS", {
32
+ enumerable: true,
33
+ get: function () {
34
+ return _types.LINGU_API_URLS;
35
+ }
36
+ });
22
37
  Object.defineProperty(exports, "LinguAPI", {
23
38
  enumerable: true,
24
39
  get: function () {
@@ -85,6 +100,12 @@ Object.defineProperty(exports, "createTheme", {
85
100
  return _theme.createTheme;
86
101
  }
87
102
  });
103
+ Object.defineProperty(exports, "resolveBaseURL", {
104
+ enumerable: true,
105
+ get: function () {
106
+ return _types.resolveBaseURL;
107
+ }
108
+ });
88
109
  Object.defineProperty(exports, "useLinguChat", {
89
110
  enumerable: true,
90
111
  get: function () {
@@ -126,4 +147,5 @@ Object.keys(_utils).forEach(function (key) {
126
147
  }
127
148
  });
128
149
  });
150
+ var _types = require("./types");
129
151
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_LinguChat","require","_NativeChatUI","_LinguWebView","_MessageBubble","_TypingIndicator","_context","_theme","_useLinguChat","_LinguAPI","_SessionManager","_StorageManager","_utils","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get"],"sources":["index.ts"],"sourcesContent":["/**\n * Lingu React Native SDK\n * Standalone AI chat SDK with native UI and theme support\n */\n\n// Main components\nexport { LinguChat } from './components/LinguChat';\nexport { NativeChatUI } from './components/NativeChatUI';\nexport { LinguWebView } from './components/LinguWebView';\nexport { MessageBubble } from './components/MessageBubble';\nexport { TypingIndicator } from './components/TypingIndicator';\n\n// Context and state management\nexport { LinguProvider, useLinguContext } from './context';\n\n// Theme system\nexport { ThemeProvider, useTheme, createTheme } from './theme';\nexport type { Theme, ThemeColors } from './theme';\n\n// Hooks\nexport { useLinguChat } from './hooks/useLinguChat';\n\n// Services\nexport { LinguAPI } from './services/LinguAPI';\nexport { SessionManager } from './services/SessionManager';\nexport { StorageManager } from './services/StorageManager';\n\n// Utils\nexport * from './utils';\n\n// Types\nexport type {\n LinguConfig,\n ChatPosition,\n ThemeMode,\n Message,\n MessageSender,\n WidgetConfig,\n SessionData,\n ApiResponse,\n ChatResponse,\n SessionResponse,\n} from './types';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,IAAAA,UAAA,GAAAC,OAAA;AACA,IAAAC,aAAA,GAAAD,OAAA;AACA,IAAAE,aAAA,GAAAF,OAAA;AACA,IAAAG,cAAA,GAAAH,OAAA;AACA,IAAAI,gBAAA,GAAAJ,OAAA;AAGA,IAAAK,QAAA,GAAAL,OAAA;AAGA,IAAAM,MAAA,GAAAN,OAAA;AAIA,IAAAO,aAAA,GAAAP,OAAA;AAGA,IAAAQ,SAAA,GAAAR,OAAA;AACA,IAAAS,eAAA,GAAAT,OAAA;AACA,IAAAU,eAAA,GAAAV,OAAA;AAGA,IAAAW,MAAA,GAAAX,OAAA;AAAAY,MAAA,CAAAC,IAAA,CAAAF,MAAA,EAAAG,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAJ,MAAA,CAAAI,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAZ,MAAA,CAAAI,GAAA;IAAA;EAAA;AAAA","ignoreList":[]}
1
+ {"version":3,"names":["_LinguChat","require","_NativeChatUI","_LinguWebView","_MessageBubble","_TypingIndicator","_context","_theme","_useLinguChat","_LinguAPI","_SessionManager","_StorageManager","_utils","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_types"],"sources":["index.ts"],"sourcesContent":["/**\n * Lingu React Native SDK\n * Standalone AI chat SDK with native UI and theme support\n */\n\n// Main components\nexport { LinguChat } from './components/LinguChat';\nexport { NativeChatUI } from './components/NativeChatUI';\nexport { LinguWebView } from './components/LinguWebView';\nexport { MessageBubble } from './components/MessageBubble';\nexport { TypingIndicator } from './components/TypingIndicator';\n\n// Context and state management\nexport { LinguProvider, useLinguContext } from './context';\n\n// Theme system\nexport { ThemeProvider, useTheme, createTheme } from './theme';\nexport type { Theme, ThemeColors } from './theme';\n\n// Hooks\nexport { useLinguChat } from './hooks/useLinguChat';\n\n// Services\nexport { LinguAPI } from './services/LinguAPI';\nexport { SessionManager } from './services/SessionManager';\nexport { StorageManager } from './services/StorageManager';\n\n// Utils\nexport * from './utils';\n\n// Environment helpers\nexport {\n LINGU_API_URLS,\n DEFAULT_LINGU_ENVIRONMENT,\n resolveBaseURL,\n} from './types';\n\n// Types\nexport type {\n LinguConfig,\n LinguEnvironment,\n ChatPosition,\n ThemeMode,\n Message,\n MessageSender,\n WidgetConfig,\n SessionData,\n ApiResponse,\n ChatResponse,\n SessionResponse,\n} from './types';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,IAAAA,UAAA,GAAAC,OAAA;AACA,IAAAC,aAAA,GAAAD,OAAA;AACA,IAAAE,aAAA,GAAAF,OAAA;AACA,IAAAG,cAAA,GAAAH,OAAA;AACA,IAAAI,gBAAA,GAAAJ,OAAA;AAGA,IAAAK,QAAA,GAAAL,OAAA;AAGA,IAAAM,MAAA,GAAAN,OAAA;AAIA,IAAAO,aAAA,GAAAP,OAAA;AAGA,IAAAQ,SAAA,GAAAR,OAAA;AACA,IAAAS,eAAA,GAAAT,OAAA;AACA,IAAAU,eAAA,GAAAV,OAAA;AAGA,IAAAW,MAAA,GAAAX,OAAA;AAAAY,MAAA,CAAAC,IAAA,CAAAF,MAAA,EAAAG,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAJ,MAAA,CAAAI,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAZ,MAAA,CAAAI,GAAA;IAAA;EAAA;AAAA;AAGA,IAAAS,MAAA,GAAAxB,OAAA","ignoreList":[]}
@@ -15,7 +15,7 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
15
15
  */
16
16
  const LOG_PREFIX = '[LinguAPI]';
17
17
  class LinguAPI {
18
- constructor(apiKey, baseURL = 'https://api.uselingu.app/api') {
18
+ constructor(apiKey, baseURL = 'https://lingu-api-prod.fly.dev/api') {
19
19
  _defineProperty(this, "client", void 0);
20
20
  _defineProperty(this, "apiKey", void 0);
21
21
  _defineProperty(this, "sessionId", null);
@@ -121,6 +121,37 @@ class LinguAPI {
121
121
  }
122
122
  }
123
123
 
124
+ /**
125
+ * Resume an existing session (sets sessionId without creating new)
126
+ */
127
+ resumeSession(sessionId) {
128
+ console.log(`${LOG_PREFIX} Resuming session:`, sessionId);
129
+ this.sessionId = sessionId;
130
+ return sessionId;
131
+ }
132
+
133
+ /**
134
+ * Get chat history for a session from the backend
135
+ */
136
+ async getChatHistory(sessionId) {
137
+ console.log(`${LOG_PREFIX} Fetching chat history for session:`, sessionId);
138
+ try {
139
+ var _data$messages;
140
+ const startTime = Date.now();
141
+ const response = await this.client.get(`/chat/widget/history?apiKey=${encodeURIComponent(this.apiKey)}&sessionId=${encodeURIComponent(sessionId)}`);
142
+ const duration = Date.now() - startTime;
143
+ const data = response.data.data;
144
+ console.log(`${LOG_PREFIX} Chat history loaded in ${duration}ms:`, {
145
+ messageCount: ((_data$messages = data.messages) === null || _data$messages === void 0 ? void 0 : _data$messages.length) || 0,
146
+ isNewSession: data.isNewSession
147
+ });
148
+ return data;
149
+ } catch (error) {
150
+ console.error(`${LOG_PREFIX} Failed to get chat history:`, error);
151
+ throw new Error('Failed to load chat history');
152
+ }
153
+ }
154
+
124
155
  /**
125
156
  * Send a message to the AI
126
157
  */
@@ -1 +1 @@
1
- {"version":3,"names":["_axios","_interopRequireDefault","require","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","LOG_PREFIX","LinguAPI","constructor","apiKey","baseURL","console","log","apiKeyPrefix","substring","client","axios","create","headers","timeout","interceptors","request","use","config","_config$method","method","toUpperCase","url","hasData","data","error","Promise","reject","response","status","dataSize","JSON","stringify","length","_error$config","statusText","_error$config2","_error$config3","message","getConfig","startTime","Date","now","get","duration","theme","primaryColor","brandName","Error","startSession","sessionId","Math","random","toString","sendMessage","messageLength","preview","post","aiResponse","responseLength","endSession","sendHeartbeat","getSessionId","exports"],"sources":["LinguAPI.ts"],"sourcesContent":["/**\n * Lingu API Client\n * Handles all communication with the Lingu backend API\n * Now with comprehensive logging\n */\n\nimport axios, { AxiosInstance, AxiosError } from 'axios';\nimport type {\n WidgetConfig,\n ChatResponse,\n ApiResponse,\n} from '../types';\n\nconst LOG_PREFIX = '[LinguAPI]';\n\nexport class LinguAPI {\n private client: AxiosInstance;\n private apiKey: string;\n private sessionId: string | null = null;\n\n constructor(apiKey: string, baseURL: string = 'https://api.uselingu.app/api') {\n console.log(`${LOG_PREFIX} Initializing API client:`, {\n baseURL,\n apiKeyPrefix: apiKey.substring(0, 20) + '...',\n });\n\n this.apiKey = apiKey;\n this.client = axios.create({\n baseURL,\n headers: {\n 'Content-Type': 'application/json',\n },\n timeout: 30000, // 30 seconds\n });\n\n // Add request interceptor for logging\n this.client.interceptors.request.use(\n (config) => {\n console.log(`${LOG_PREFIX} → Request:`, {\n method: config.method?.toUpperCase(),\n url: config.url,\n hasData: !!config.data,\n });\n return config;\n },\n (error) => {\n console.error(`${LOG_PREFIX} ❌ Request setup failed:`, error);\n return Promise.reject(error);\n }\n );\n\n // Add response interceptor for error handling and logging\n this.client.interceptors.response.use(\n (response) => {\n console.log(`${LOG_PREFIX} ← Response:`, {\n status: response.status,\n url: response.config.url,\n dataSize: JSON.stringify(response.data).length,\n });\n return response;\n },\n (error: AxiosError) => {\n if (error.response) {\n console.error(`${LOG_PREFIX} ❌ HTTP Error:`, {\n status: error.response.status,\n statusText: error.response.statusText,\n url: error.config?.url,\n data: error.response.data,\n });\n } else if (error.request) {\n console.error(`${LOG_PREFIX} ❌ Network Error:`, {\n message: error.message,\n url: error.config?.url,\n baseURL: error.config?.baseURL,\n });\n } else {\n console.error(`${LOG_PREFIX} ❌ Request Error:`, error.message);\n }\n return Promise.reject(error);\n }\n );\n\n console.log(`${LOG_PREFIX} ✅ API client initialized successfully`);\n }\n\n /**\n * Get widget configuration from the API\n */\n async getConfig(): Promise<WidgetConfig> {\n console.log(`${LOG_PREFIX} Fetching widget configuration...`);\n\n try {\n const startTime = Date.now();\n const response = await this.client.get<ApiResponse<WidgetConfig>>(\n '/chatbot-settings/widget/config',\n {\n headers: { 'X-API-Key': this.apiKey },\n }\n );\n const duration = Date.now() - startTime;\n\n console.log(`${LOG_PREFIX} ✅ Config loaded in ${duration}ms:`, {\n theme: response.data.data.theme,\n primaryColor: response.data.data.primaryColor,\n brandName: response.data.data.brandName,\n });\n\n return response.data.data;\n } catch (error) {\n console.error(`${LOG_PREFIX} ❌ Failed to get config:`, error);\n throw new Error('Failed to load widget configuration');\n }\n }\n\n /**\n * Start a new chat session\n * Note: Backend manages sessions automatically, we just generate a client-side ID\n */\n async startSession(): Promise<string> {\n console.log(`${LOG_PREFIX} Starting new chat session (client-side)...`);\n\n try {\n // Generate a unique session ID client-side\n const sessionId = `session_${Date.now()}_${Math.random().toString(36).substring(7)}`;\n this.sessionId = sessionId;\n\n console.log(`${LOG_PREFIX} ✅ Session created:`, sessionId);\n\n return this.sessionId;\n } catch (error) {\n console.error(`${LOG_PREFIX} ❌ Failed to start session:`, error);\n throw new Error('Failed to start chat session');\n }\n }\n\n /**\n * Send a message to the AI\n */\n async sendMessage(message: string, sessionId: string): Promise<string> {\n console.log(`${LOG_PREFIX} Sending message:`, {\n sessionId,\n messageLength: message.length,\n preview: message.substring(0, 50) + (message.length > 50 ? '...' : ''),\n });\n\n try {\n const startTime = Date.now();\n const response = await this.client.post<ApiResponse<ChatResponse>>(\n '/chat/widget',\n {\n apiKey: this.apiKey,\n message,\n sessionId,\n }\n );\n const duration = Date.now() - startTime;\n\n const aiResponse = response.data.data.message;\n console.log(`${LOG_PREFIX} ✅ AI response received in ${duration}ms:`, {\n responseLength: aiResponse.length,\n preview: aiResponse.substring(0, 50) + (aiResponse.length > 50 ? '...' : ''),\n });\n\n return aiResponse;\n } catch (error) {\n console.error(`${LOG_PREFIX} ❌ Failed to send message:`, error);\n throw new Error('Failed to send message');\n }\n }\n\n /**\n * End the current chat session\n * Note: Backend doesn't have explicit session end, sessions timeout automatically\n */\n async endSession(sessionId: string): Promise<void> {\n console.log(`${LOG_PREFIX} Ending session (client-side only):`, sessionId);\n\n try {\n this.sessionId = null;\n console.log(`${LOG_PREFIX} ✅ Session ended successfully`);\n } catch (error) {\n console.error(`${LOG_PREFIX} ⚠️ Failed to end session:`, error);\n // Don't throw - session will timeout anyway\n }\n }\n\n /**\n * Send heartbeat to keep session alive\n */\n async sendHeartbeat(sessionId: string): Promise<void> {\n console.log(`${LOG_PREFIX} Sending heartbeat for session:`, sessionId);\n\n try {\n // Send special heartbeat message\n await this.client.post('/chat/widget', {\n apiKey: this.apiKey,\n message: '__HEARTBEAT__',\n sessionId,\n });\n console.log(`${LOG_PREFIX} ✅ Heartbeat sent successfully`);\n } catch (error) {\n console.error(`${LOG_PREFIX} ⚠️ Heartbeat failed (will retry):`, error);\n // Don't throw - will retry on next heartbeat\n }\n }\n\n /**\n * Get the current session ID\n */\n getSessionId(): string | null {\n console.log(`${LOG_PREFIX} Current session ID:`, this.sessionId || 'none');\n return this.sessionId;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_axios","_interopRequireDefault","require","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","LOG_PREFIX","LinguAPI","constructor","apiKey","baseURL","console","log","apiKeyPrefix","substring","client","axios","create","headers","timeout","interceptors","request","use","config","_config$method","method","toUpperCase","url","hasData","data","error","Promise","reject","response","status","dataSize","JSON","stringify","length","_error$config","statusText","_error$config2","_error$config3","message","getConfig","startTime","Date","now","get","duration","theme","primaryColor","brandName","Error","startSession","sessionId","Math","random","toString","resumeSession","getChatHistory","_data$messages","encodeURIComponent","messageCount","messages","isNewSession","sendMessage","messageLength","preview","post","aiResponse","responseLength","endSession","sendHeartbeat","getSessionId","exports"],"sources":["LinguAPI.ts"],"sourcesContent":["/**\n * Lingu API Client\n * Handles all communication with the Lingu backend API\n * Now with comprehensive logging\n */\n\nimport axios, { AxiosInstance, AxiosError } from 'axios';\nimport type {\n WidgetConfig,\n ChatResponse,\n ApiResponse,\n} from '../types';\n\nconst LOG_PREFIX = '[LinguAPI]';\n\nexport class LinguAPI {\n private client: AxiosInstance;\n private apiKey: string;\n private sessionId: string | null = null;\n\n constructor(apiKey: string, baseURL: string = 'https://lingu-api-prod.fly.dev/api') {\n console.log(`${LOG_PREFIX} Initializing API client:`, {\n baseURL,\n apiKeyPrefix: apiKey.substring(0, 20) + '...',\n });\n\n this.apiKey = apiKey;\n this.client = axios.create({\n baseURL,\n headers: {\n 'Content-Type': 'application/json',\n },\n timeout: 30000, // 30 seconds\n });\n\n // Add request interceptor for logging\n this.client.interceptors.request.use(\n (config) => {\n console.log(`${LOG_PREFIX} → Request:`, {\n method: config.method?.toUpperCase(),\n url: config.url,\n hasData: !!config.data,\n });\n return config;\n },\n (error) => {\n console.error(`${LOG_PREFIX} ❌ Request setup failed:`, error);\n return Promise.reject(error);\n }\n );\n\n // Add response interceptor for error handling and logging\n this.client.interceptors.response.use(\n (response) => {\n console.log(`${LOG_PREFIX} ← Response:`, {\n status: response.status,\n url: response.config.url,\n dataSize: JSON.stringify(response.data).length,\n });\n return response;\n },\n (error: AxiosError) => {\n if (error.response) {\n console.error(`${LOG_PREFIX} ❌ HTTP Error:`, {\n status: error.response.status,\n statusText: error.response.statusText,\n url: error.config?.url,\n data: error.response.data,\n });\n } else if (error.request) {\n console.error(`${LOG_PREFIX} ❌ Network Error:`, {\n message: error.message,\n url: error.config?.url,\n baseURL: error.config?.baseURL,\n });\n } else {\n console.error(`${LOG_PREFIX} ❌ Request Error:`, error.message);\n }\n return Promise.reject(error);\n }\n );\n\n console.log(`${LOG_PREFIX} ✅ API client initialized successfully`);\n }\n\n /**\n * Get widget configuration from the API\n */\n async getConfig(): Promise<WidgetConfig> {\n console.log(`${LOG_PREFIX} Fetching widget configuration...`);\n\n try {\n const startTime = Date.now();\n const response = await this.client.get<ApiResponse<WidgetConfig>>(\n '/chatbot-settings/widget/config',\n {\n headers: { 'X-API-Key': this.apiKey },\n }\n );\n const duration = Date.now() - startTime;\n\n console.log(`${LOG_PREFIX} ✅ Config loaded in ${duration}ms:`, {\n theme: response.data.data.theme,\n primaryColor: response.data.data.primaryColor,\n brandName: response.data.data.brandName,\n });\n\n return response.data.data;\n } catch (error) {\n console.error(`${LOG_PREFIX} ❌ Failed to get config:`, error);\n throw new Error('Failed to load widget configuration');\n }\n }\n\n /**\n * Start a new chat session\n * Note: Backend manages sessions automatically, we just generate a client-side ID\n */\n async startSession(): Promise<string> {\n console.log(`${LOG_PREFIX} Starting new chat session (client-side)...`);\n\n try {\n // Generate a unique session ID client-side\n const sessionId = `session_${Date.now()}_${Math.random().toString(36).substring(7)}`;\n this.sessionId = sessionId;\n\n console.log(`${LOG_PREFIX} ✅ Session created:`, sessionId);\n\n return this.sessionId;\n } catch (error) {\n console.error(`${LOG_PREFIX} ❌ Failed to start session:`, error);\n throw new Error('Failed to start chat session');\n }\n }\n\n /**\n * Resume an existing session (sets sessionId without creating new)\n */\n resumeSession(sessionId: string): string {\n console.log(`${LOG_PREFIX} Resuming session:`, sessionId);\n this.sessionId = sessionId;\n return sessionId;\n }\n\n /**\n * Get chat history for a session from the backend\n */\n async getChatHistory(sessionId: string): Promise<{\n sessionId: string;\n messages: Array<{\n role: 'user' | 'assistant';\n content: string;\n timestamp: string;\n }>;\n isNewSession: boolean;\n }> {\n console.log(`${LOG_PREFIX} Fetching chat history for session:`, sessionId);\n\n try {\n const startTime = Date.now();\n const response = await this.client.get(\n `/chat/widget/history?apiKey=${encodeURIComponent(this.apiKey)}&sessionId=${encodeURIComponent(sessionId)}`\n );\n const duration = Date.now() - startTime;\n\n const data = response.data.data;\n console.log(`${LOG_PREFIX} Chat history loaded in ${duration}ms:`, {\n messageCount: data.messages?.length || 0,\n isNewSession: data.isNewSession,\n });\n\n return data;\n } catch (error) {\n console.error(`${LOG_PREFIX} Failed to get chat history:`, error);\n throw new Error('Failed to load chat history');\n }\n }\n\n /**\n * Send a message to the AI\n */\n async sendMessage(message: string, sessionId: string): Promise<string> {\n console.log(`${LOG_PREFIX} Sending message:`, {\n sessionId,\n messageLength: message.length,\n preview: message.substring(0, 50) + (message.length > 50 ? '...' : ''),\n });\n\n try {\n const startTime = Date.now();\n const response = await this.client.post<ApiResponse<ChatResponse>>(\n '/chat/widget',\n {\n apiKey: this.apiKey,\n message,\n sessionId,\n }\n );\n const duration = Date.now() - startTime;\n\n const aiResponse = response.data.data.message;\n console.log(`${LOG_PREFIX} ✅ AI response received in ${duration}ms:`, {\n responseLength: aiResponse.length,\n preview: aiResponse.substring(0, 50) + (aiResponse.length > 50 ? '...' : ''),\n });\n\n return aiResponse;\n } catch (error) {\n console.error(`${LOG_PREFIX} ❌ Failed to send message:`, error);\n throw new Error('Failed to send message');\n }\n }\n\n /**\n * End the current chat session\n * Note: Backend doesn't have explicit session end, sessions timeout automatically\n */\n async endSession(sessionId: string): Promise<void> {\n console.log(`${LOG_PREFIX} Ending session (client-side only):`, sessionId);\n\n try {\n this.sessionId = null;\n console.log(`${LOG_PREFIX} ✅ Session ended successfully`);\n } catch (error) {\n console.error(`${LOG_PREFIX} ⚠️ Failed to end session:`, error);\n // Don't throw - session will timeout anyway\n }\n }\n\n /**\n * Send heartbeat to keep session alive\n */\n async sendHeartbeat(sessionId: string): Promise<void> {\n console.log(`${LOG_PREFIX} Sending heartbeat for session:`, sessionId);\n\n try {\n // Send special heartbeat message\n await this.client.post('/chat/widget', {\n apiKey: this.apiKey,\n message: '__HEARTBEAT__',\n sessionId,\n });\n console.log(`${LOG_PREFIX} ✅ Heartbeat sent successfully`);\n } catch (error) {\n console.error(`${LOG_PREFIX} ⚠️ Heartbeat failed (will retry):`, error);\n // Don't throw - will retry on next heartbeat\n }\n }\n\n /**\n * Get the current session ID\n */\n getSessionId(): string | null {\n console.log(`${LOG_PREFIX} Current session ID:`, this.sessionId || 'none');\n return this.sessionId;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,2 +1,36 @@
1
1
  "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.resolveBaseURL = exports.LINGU_API_URLS = exports.DEFAULT_LINGU_ENVIRONMENT = void 0;
7
+ /**
8
+ * Core types for Lingu React Native SDK
9
+ */
10
+
11
+ /**
12
+ * Which Lingu backend the SDK talks to.
13
+ * Ignored when an explicit `baseURL` is provided.
14
+ */
15
+
16
+ /**
17
+ * Predefined API base URLs per environment.
18
+ * An explicit `baseURL` on LinguConfig always overrides these.
19
+ */
20
+ const LINGU_API_URLS = exports.LINGU_API_URLS = {
21
+ production: 'https://lingu-api-prod.fly.dev/api',
22
+ staging: 'https://lingu-api.fly.dev/api'
23
+ };
24
+ const DEFAULT_LINGU_ENVIRONMENT = exports.DEFAULT_LINGU_ENVIRONMENT = 'production';
25
+
26
+ /**
27
+ * Resolve the API base URL from config.
28
+ * Precedence: explicit `baseURL` > `environment` mapping > production default.
29
+ */
30
+ const resolveBaseURL = opts => {
31
+ var _opts$environment;
32
+ if (opts.baseURL) return opts.baseURL;
33
+ return LINGU_API_URLS[(_opts$environment = opts.environment) !== null && _opts$environment !== void 0 ? _opts$environment : DEFAULT_LINGU_ENVIRONMENT];
34
+ };
35
+ exports.resolveBaseURL = resolveBaseURL;
2
36
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["/**\n * Core types for Lingu React Native SDK\n */\n\nexport interface LinguConfig {\n apiKey: string;\n baseURL?: string;\n autoOpen?: boolean;\n onSessionStart?: (sessionId: string) => void;\n onSessionEnd?: (sessionId: string) => void;\n onMessageSent?: (message: string) => void;\n onMessageReceived?: (message: string) => void;\n}\n\nexport type ChatPosition = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\n\nexport type ThemeMode = 'light' | 'dark' | 'system';\n\nexport type MessageSender = 'user' | 'bot';\n\nexport interface Message {\n id: string;\n text: string;\n sender: MessageSender;\n timestamp: Date;\n}\n\nexport interface WidgetConfig {\n widgetPosition: ChatPosition;\n widgetSize: 'small' | 'medium' | 'large';\n theme: ThemeMode;\n primaryColor: string;\n backgroundColor: string;\n textColor: string;\n brandName?: string;\n brandLogo?: string;\n greetingMessage: string;\n}\n\nexport interface SessionData {\n sessionId: string;\n startedAt: Date;\n lastActivity: Date;\n}\n\nexport interface ApiResponse<T> {\n success: boolean;\n data: T;\n error?: string;\n}\n\nexport interface ChatResponse {\n message: string;\n context?: any[];\n}\n\nexport interface SessionResponse {\n sessionId: string;\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":["LINGU_API_URLS","exports","production","staging","DEFAULT_LINGU_ENVIRONMENT","resolveBaseURL","opts","_opts$environment","baseURL","environment"],"sources":["index.ts"],"sourcesContent":["/**\n * Core types for Lingu React Native SDK\n */\n\n/**\n * Which Lingu backend the SDK talks to.\n * Ignored when an explicit `baseURL` is provided.\n */\nexport type LinguEnvironment = 'production' | 'staging';\n\n/**\n * Predefined API base URLs per environment.\n * An explicit `baseURL` on LinguConfig always overrides these.\n */\nexport const LINGU_API_URLS: Record<LinguEnvironment, string> = {\n production: 'https://lingu-api-prod.fly.dev/api',\n staging: 'https://lingu-api.fly.dev/api',\n};\n\nexport const DEFAULT_LINGU_ENVIRONMENT: LinguEnvironment = 'production';\n\n/**\n * Resolve the API base URL from config.\n * Precedence: explicit `baseURL` > `environment` mapping > production default.\n */\nexport const resolveBaseURL = (opts: {\n baseURL?: string;\n environment?: LinguEnvironment;\n}): string => {\n if (opts.baseURL) return opts.baseURL;\n return LINGU_API_URLS[opts.environment ?? DEFAULT_LINGU_ENVIRONMENT];\n};\n\nexport interface LinguConfig {\n apiKey: string;\n /**\n * Explicit API base URL. Overrides `environment` when set.\n * Use this for local development (e.g. http://127.0.0.1:3003/api).\n */\n baseURL?: string;\n /**\n * Select which hosted backend to use: 'production' (default) or 'staging'.\n * Ignored if `baseURL` is provided.\n */\n environment?: LinguEnvironment;\n autoOpen?: boolean;\n onSessionStart?: (sessionId: string) => void;\n onSessionEnd?: (sessionId: string) => void;\n onMessageSent?: (message: string) => void;\n onMessageReceived?: (message: string) => void;\n}\n\nexport type ChatPosition = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\n\nexport type ThemeMode = 'light' | 'dark' | 'system';\n\nexport type MessageSender = 'user' | 'bot';\n\nexport interface Message {\n id: string;\n text: string;\n sender: MessageSender;\n timestamp: Date;\n}\n\nexport interface WidgetConfig {\n widgetPosition: ChatPosition;\n widgetSize: 'small' | 'medium' | 'large';\n theme: ThemeMode;\n primaryColor: string;\n backgroundColor: string;\n textColor: string;\n brandName?: string;\n brandLogo?: string;\n greetingMessage: string;\n}\n\nexport interface SessionData {\n sessionId: string;\n startedAt: Date;\n lastActivity: Date;\n}\n\nexport interface ApiResponse<T> {\n success: boolean;\n data: T;\n error?: string;\n}\n\nexport interface ChatResponse {\n message: string;\n context?: any[];\n}\n\nexport interface SessionResponse {\n sessionId: string;\n}\n"],"mappings":";;;;;;AAAA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACO,MAAMA,cAAgD,GAAAC,OAAA,CAAAD,cAAA,GAAG;EAC7DE,UAAU,EAAE,oCAAoC;EAChDC,OAAO,EAAE;AACZ,CAAC;AAEM,MAAMC,yBAA2C,GAAAH,OAAA,CAAAG,yBAAA,GAAG,YAAY;;AAEvE;AACA;AACA;AACA;AACO,MAAMC,cAAc,GAAIC,IAG9B,IAAa;EAAA,IAAAC,iBAAA;EACX,IAAID,IAAI,CAACE,OAAO,EAAE,OAAOF,IAAI,CAACE,OAAO;EACrC,OAAOR,cAAc,EAAAO,iBAAA,GAACD,IAAI,CAACG,WAAW,cAAAF,iBAAA,cAAAA,iBAAA,GAAIH,yBAAyB,CAAC;AACvE,CAAC;AAACH,OAAA,CAAAI,cAAA,GAAAA,cAAA","ignoreList":[]}