@uselingu/react-native-sdk 0.1.0
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 +279 -0
- package/lib/commonjs/components/LinguChat.js +283 -0
- package/lib/commonjs/components/LinguChat.js.map +1 -0
- package/lib/commonjs/components/LinguWebView.js +203 -0
- package/lib/commonjs/components/LinguWebView.js.map +1 -0
- package/lib/commonjs/components/MessageBubble.js +91 -0
- package/lib/commonjs/components/MessageBubble.js.map +1 -0
- package/lib/commonjs/components/NativeChatUI.js +192 -0
- package/lib/commonjs/components/NativeChatUI.js.map +1 -0
- package/lib/commonjs/components/TypingIndicator.js +92 -0
- package/lib/commonjs/components/TypingIndicator.js.map +1 -0
- package/lib/commonjs/context/LinguProvider.js +47 -0
- package/lib/commonjs/context/LinguProvider.js.map +1 -0
- package/lib/commonjs/context/index.js +17 -0
- package/lib/commonjs/context/index.js.map +1 -0
- package/lib/commonjs/hooks/useLinguChat.js +295 -0
- package/lib/commonjs/hooks/useLinguChat.js.map +1 -0
- package/lib/commonjs/index.js +129 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/services/LinguAPI.js +196 -0
- package/lib/commonjs/services/LinguAPI.js.map +1 -0
- package/lib/commonjs/services/SessionManager.js +131 -0
- package/lib/commonjs/services/SessionManager.js.map +1 -0
- package/lib/commonjs/services/StorageManager.js +116 -0
- package/lib/commonjs/services/StorageManager.js.map +1 -0
- package/lib/commonjs/theme/ThemeProvider.js +49 -0
- package/lib/commonjs/theme/ThemeProvider.js.map +1 -0
- package/lib/commonjs/theme/index.js +28 -0
- package/lib/commonjs/theme/index.js.map +1 -0
- package/lib/commonjs/theme/theme.js +150 -0
- package/lib/commonjs/theme/theme.js.map +1 -0
- package/lib/commonjs/types/index.js +2 -0
- package/lib/commonjs/types/index.js.map +1 -0
- package/lib/commonjs/utils/animations.js +118 -0
- package/lib/commonjs/utils/animations.js.map +1 -0
- package/lib/commonjs/utils/formatters.js +89 -0
- package/lib/commonjs/utils/formatters.js.map +1 -0
- package/lib/commonjs/utils/index.js +28 -0
- package/lib/commonjs/utils/index.js.map +1 -0
- package/lib/module/components/LinguChat.js +277 -0
- package/lib/module/components/LinguChat.js.map +1 -0
- package/lib/module/components/LinguWebView.js +195 -0
- package/lib/module/components/LinguWebView.js.map +1 -0
- package/lib/module/components/MessageBubble.js +83 -0
- package/lib/module/components/MessageBubble.js.map +1 -0
- package/lib/module/components/NativeChatUI.js +184 -0
- package/lib/module/components/NativeChatUI.js.map +1 -0
- package/lib/module/components/TypingIndicator.js +84 -0
- package/lib/module/components/TypingIndicator.js.map +1 -0
- package/lib/module/context/LinguProvider.js +38 -0
- package/lib/module/context/LinguProvider.js.map +1 -0
- package/lib/module/context/index.js +6 -0
- package/lib/module/context/index.js.map +1 -0
- package/lib/module/hooks/useLinguChat.js +288 -0
- package/lib/module/hooks/useLinguChat.js.map +1 -0
- package/lib/module/index.js +30 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/services/LinguAPI.js +190 -0
- package/lib/module/services/LinguAPI.js.map +1 -0
- package/lib/module/services/SessionManager.js +124 -0
- package/lib/module/services/SessionManager.js.map +1 -0
- package/lib/module/services/StorageManager.js +108 -0
- package/lib/module/services/StorageManager.js.map +1 -0
- package/lib/module/theme/ThemeProvider.js +40 -0
- package/lib/module/theme/ThemeProvider.js.map +1 -0
- package/lib/module/theme/index.js +7 -0
- package/lib/module/theme/index.js.map +1 -0
- package/lib/module/theme/theme.js +142 -0
- package/lib/module/theme/theme.js.map +1 -0
- package/lib/module/types/index.js +2 -0
- package/lib/module/types/index.js.map +1 -0
- package/lib/module/utils/animations.js +106 -0
- package/lib/module/utils/animations.js.map +1 -0
- package/lib/module/utils/formatters.js +78 -0
- package/lib/module/utils/formatters.js.map +1 -0
- package/lib/module/utils/index.js +7 -0
- package/lib/module/utils/index.js.map +1 -0
- package/lib/typescript/components/LinguChat.d.ts +18 -0
- package/lib/typescript/components/LinguChat.d.ts.map +1 -0
- package/lib/typescript/components/LinguWebView.d.ts +16 -0
- package/lib/typescript/components/LinguWebView.d.ts.map +1 -0
- package/lib/typescript/components/MessageBubble.d.ts +13 -0
- package/lib/typescript/components/MessageBubble.d.ts.map +1 -0
- package/lib/typescript/components/NativeChatUI.d.ts +16 -0
- package/lib/typescript/components/NativeChatUI.d.ts.map +1 -0
- package/lib/typescript/components/TypingIndicator.d.ts +7 -0
- package/lib/typescript/components/TypingIndicator.d.ts.map +1 -0
- package/lib/typescript/context/LinguProvider.d.ts +32 -0
- package/lib/typescript/context/LinguProvider.d.ts.map +1 -0
- package/lib/typescript/context/index.d.ts +5 -0
- package/lib/typescript/context/index.d.ts.map +1 -0
- package/lib/typescript/hooks/useLinguChat.d.ts +18 -0
- package/lib/typescript/hooks/useLinguChat.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +19 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/services/LinguAPI.d.ts +39 -0
- package/lib/typescript/services/LinguAPI.d.ts.map +1 -0
- package/lib/typescript/services/SessionManager.d.ts +46 -0
- package/lib/typescript/services/SessionManager.d.ts.map +1 -0
- package/lib/typescript/services/StorageManager.d.ts +36 -0
- package/lib/typescript/services/StorageManager.d.ts.map +1 -0
- package/lib/typescript/theme/ThemeProvider.d.ts +23 -0
- package/lib/typescript/theme/ThemeProvider.d.ts.map +1 -0
- package/lib/typescript/theme/index.d.ts +6 -0
- package/lib/typescript/theme/index.d.ts.map +1 -0
- package/lib/typescript/theme/theme.d.ts +130 -0
- package/lib/typescript/theme/theme.d.ts.map +1 -0
- package/lib/typescript/types/index.d.ts +50 -0
- package/lib/typescript/types/index.d.ts.map +1 -0
- package/lib/typescript/utils/animations.d.ts +34 -0
- package/lib/typescript/utils/animations.d.ts.map +1 -0
- package/lib/typescript/utils/formatters.d.ts +25 -0
- package/lib/typescript/utils/formatters.d.ts.map +1 -0
- package/lib/typescript/utils/index.d.ts +6 -0
- package/lib/typescript/utils/index.d.ts.map +1 -0
- package/package.json +98 -0
- package/src/components/LinguChat.tsx +309 -0
- package/src/components/LinguWebView.tsx +216 -0
- package/src/components/MessageBubble.tsx +120 -0
- package/src/components/NativeChatUI.tsx +247 -0
- package/src/components/TypingIndicator.tsx +84 -0
- package/src/context/LinguProvider.tsx +53 -0
- package/src/context/index.ts +5 -0
- package/src/hooks/useLinguChat.ts +314 -0
- package/src/index.ts +43 -0
- package/src/services/LinguAPI.ts +214 -0
- package/src/services/SessionManager.ts +131 -0
- package/src/services/StorageManager.ts +111 -0
- package/src/theme/ThemeProvider.tsx +58 -0
- package/src/theme/index.ts +6 -0
- package/src/theme/theme.ts +254 -0
- package/src/types/index.ts +59 -0
- package/src/utils/animations.ts +141 -0
- package/src/utils/formatters.ts +80 -0
- package/src/utils/index.ts +6 -0
package/README.md
ADDED
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
# @lingu/react-native-sdk
|
|
2
|
+
|
|
3
|
+
> Lingu AI Chat SDK for React Native - Hybrid approach with WebView UI and native API
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@lingu/react-native-sdk)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
7
|
+
|
|
8
|
+
## Features
|
|
9
|
+
|
|
10
|
+
✅ **Full-Page Chat UI** - Immersive full-screen chat experience with back navigation
|
|
11
|
+
✅ **Message Persistence** - Conversations saved locally and restored automatically
|
|
12
|
+
✅ **Hybrid Architecture** - WebView UI with native API performance
|
|
13
|
+
✅ **Easy Integration** - Drop-in component for React Native apps
|
|
14
|
+
✅ **Session Management** - Automatic session handling and heartbeat
|
|
15
|
+
✅ **Customizable** - Full control over colors, position, and behavior
|
|
16
|
+
✅ **TypeScript** - Full type safety
|
|
17
|
+
✅ **Cross-platform** - Works on iOS and Android
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Installation
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm install @lingu/react-native-sdk react-native-webview @react-native-async-storage/async-storage
|
|
25
|
+
# or
|
|
26
|
+
yarn add @lingu/react-native-sdk react-native-webview @react-native-async-storage/async-storage
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### iOS Setup
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
cd ios && pod install
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Android Setup
|
|
36
|
+
|
|
37
|
+
No additional setup required.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Quick Start
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
import React from 'react';
|
|
45
|
+
import { View } from 'react-native';
|
|
46
|
+
import { LinguChat } from '@lingu/react-native-sdk';
|
|
47
|
+
|
|
48
|
+
export default function App() {
|
|
49
|
+
return (
|
|
50
|
+
<View style={{ flex: 1 }}>
|
|
51
|
+
{/* Your app content */}
|
|
52
|
+
|
|
53
|
+
<LinguChat
|
|
54
|
+
apiKey="your-api-key-here"
|
|
55
|
+
position="bottom-right"
|
|
56
|
+
theme="light"
|
|
57
|
+
primaryColor="#4ade80"
|
|
58
|
+
/>
|
|
59
|
+
</View>
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Configuration
|
|
67
|
+
|
|
68
|
+
### Props
|
|
69
|
+
|
|
70
|
+
| Prop | Type | Required | Default | Description |
|
|
71
|
+
|------|------|----------|---------|-------------|
|
|
72
|
+
| `apiKey` | `string` | ✅ Yes | - | Your Lingu API key |
|
|
73
|
+
| `baseURL` | `string` | ❌ No | `https://api.uselingu.app/api` | API base URL |
|
|
74
|
+
| `position` | `ChatPosition` | ❌ No | `bottom-right` | FAB position (when closed) |
|
|
75
|
+
| `theme` | `ThemeMode` | ❌ No | `light` | Theme mode |
|
|
76
|
+
| `primaryColor` | `string` | ❌ No | `#4ade80` | Primary color |
|
|
77
|
+
| `autoOpen` | `boolean` | ❌ No | `false` | Auto-open on mount |
|
|
78
|
+
| `showBackButton` | `boolean` | ❌ No | `true` | Show back button in header |
|
|
79
|
+
| `onBackPress` | `() => void` | ❌ No | - | Back button callback |
|
|
80
|
+
| `onSessionStart` | `(sessionId: string) => void` | ❌ No | - | Session start callback |
|
|
81
|
+
| `onSessionEnd` | `(sessionId: string) => void` | ❌ No | - | Session end callback |
|
|
82
|
+
| `onMessageSent` | `(message: string) => void` | ❌ No | - | Message sent callback |
|
|
83
|
+
| `onMessageReceived` | `(message: string) => void` | ❌ No | - | Message received callback |
|
|
84
|
+
|
|
85
|
+
### Types
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
type ChatPosition = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
|
|
89
|
+
type ThemeMode = 'light' | 'dark' | 'system';
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Dark Mode
|
|
93
|
+
|
|
94
|
+
```tsx
|
|
95
|
+
import { useColorScheme } from 'react-native';
|
|
96
|
+
|
|
97
|
+
function App() {
|
|
98
|
+
const colorScheme = useColorScheme();
|
|
99
|
+
|
|
100
|
+
return (
|
|
101
|
+
<LinguChat
|
|
102
|
+
apiKey="your-api-key"
|
|
103
|
+
theme={colorScheme === 'dark' ? 'dark' : 'light'}
|
|
104
|
+
/>
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Permissions
|
|
110
|
+
|
|
111
|
+
**No special permissions required!**
|
|
112
|
+
- ❌ No camera access needed
|
|
113
|
+
- ❌ No microphone access needed
|
|
114
|
+
- ✅ Only internet and storage (automatic)
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Advanced Usage
|
|
119
|
+
|
|
120
|
+
### Using the Hook
|
|
121
|
+
|
|
122
|
+
```tsx
|
|
123
|
+
import { useLinguChat } from '@lingu/react-native-sdk';
|
|
124
|
+
|
|
125
|
+
function CustomChat() {
|
|
126
|
+
const {
|
|
127
|
+
messages,
|
|
128
|
+
isLoading,
|
|
129
|
+
config,
|
|
130
|
+
sendMessage,
|
|
131
|
+
startSession,
|
|
132
|
+
endSession,
|
|
133
|
+
isSessionActive,
|
|
134
|
+
} = useLinguChat({
|
|
135
|
+
apiKey: 'your-api-key-here',
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
// Build your custom UI
|
|
139
|
+
return (
|
|
140
|
+
// Your custom chat UI
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Event Callbacks
|
|
146
|
+
|
|
147
|
+
```tsx
|
|
148
|
+
<LinguChat
|
|
149
|
+
apiKey="your-api-key-here"
|
|
150
|
+
onSessionStart={(sessionId) => {
|
|
151
|
+
console.log('Session started:', sessionId);
|
|
152
|
+
}}
|
|
153
|
+
onSessionEnd={(sessionId) => {
|
|
154
|
+
console.log('Session ended:', sessionId);
|
|
155
|
+
}}
|
|
156
|
+
onMessageSent={(message) => {
|
|
157
|
+
console.log('User sent:', message);
|
|
158
|
+
}}
|
|
159
|
+
onMessageReceived={(message) => {
|
|
160
|
+
console.log('Bot replied:', message);
|
|
161
|
+
}}
|
|
162
|
+
/>
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## API Reference
|
|
168
|
+
|
|
169
|
+
### `LinguChat` Component
|
|
170
|
+
|
|
171
|
+
Main component that renders the chat widget.
|
|
172
|
+
|
|
173
|
+
### `useLinguChat` Hook
|
|
174
|
+
|
|
175
|
+
Custom hook for managing chat state and operations.
|
|
176
|
+
|
|
177
|
+
**Returns:**
|
|
178
|
+
- `messages`: Array of chat messages
|
|
179
|
+
- `isLoading`: Loading state
|
|
180
|
+
- `config`: Widget configuration
|
|
181
|
+
- `sendMessage(text)`: Send a message
|
|
182
|
+
- `startSession()`: Start a new session
|
|
183
|
+
- `endSession()`: End the current session
|
|
184
|
+
- `isSessionActive`: Session status
|
|
185
|
+
|
|
186
|
+
### `LinguAPI` Class
|
|
187
|
+
|
|
188
|
+
Low-level API client for direct API access.
|
|
189
|
+
|
|
190
|
+
**Methods:**
|
|
191
|
+
- `getConfig()`: Get widget configuration
|
|
192
|
+
- `startSession()`: Start a new session
|
|
193
|
+
- `sendMessage(message, sessionId)`: Send a message
|
|
194
|
+
- `endSession(sessionId)`: End a session
|
|
195
|
+
- `sendHeartbeat(sessionId)`: Send heartbeat
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## Examples
|
|
200
|
+
|
|
201
|
+
### Basic Integration
|
|
202
|
+
|
|
203
|
+
```tsx
|
|
204
|
+
import { LinguChat } from '@lingu/react-native-sdk';
|
|
205
|
+
|
|
206
|
+
<LinguChat apiKey="your-api-key-here" />
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Custom Styling
|
|
210
|
+
|
|
211
|
+
```tsx
|
|
212
|
+
<LinguChat
|
|
213
|
+
apiKey="your-api-key-here"
|
|
214
|
+
position="bottom-left"
|
|
215
|
+
theme="dark"
|
|
216
|
+
primaryColor="#3b82f6"
|
|
217
|
+
/>
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### With Callbacks
|
|
221
|
+
|
|
222
|
+
```tsx
|
|
223
|
+
<LinguChat
|
|
224
|
+
apiKey="your-api-key-here"
|
|
225
|
+
onSessionStart={(id) => analytics.track('chat_started', { sessionId: id })}
|
|
226
|
+
onMessageSent={(msg) => analytics.track('message_sent', { message: msg })}
|
|
227
|
+
/>
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## Troubleshooting
|
|
233
|
+
|
|
234
|
+
### Widget not appearing?
|
|
235
|
+
|
|
236
|
+
1. Check that `react-native-webview` is installed
|
|
237
|
+
2. Verify your API key is correct
|
|
238
|
+
3. Check console for error messages
|
|
239
|
+
|
|
240
|
+
### Messages not sending?
|
|
241
|
+
|
|
242
|
+
1. Ensure session is active
|
|
243
|
+
2. Check network connectivity
|
|
244
|
+
3. Verify API endpoint is accessible
|
|
245
|
+
|
|
246
|
+
### Styling issues?
|
|
247
|
+
|
|
248
|
+
1. Make sure the widget container has proper positioning
|
|
249
|
+
2. Check z-index conflicts
|
|
250
|
+
3. Verify parent View has `flex: 1`
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## Requirements
|
|
255
|
+
|
|
256
|
+
- React Native >= 0.70
|
|
257
|
+
- iOS >= 13.0
|
|
258
|
+
- Android >= 21 (Android 5.0)
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## License
|
|
263
|
+
|
|
264
|
+
MIT © Lingu Team
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## Support
|
|
269
|
+
|
|
270
|
+
- 📧 Email: support@uselingu.app
|
|
271
|
+
- 💬 Chat: https://uselingu.app
|
|
272
|
+
- 📚 Docs: https://docs.uselingu.app
|
|
273
|
+
- 🐛 Issues: https://github.com/yourusername/lingu/issues
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
## Changelog
|
|
278
|
+
|
|
279
|
+
See [CHANGELOG.md](CHANGELOG.md) for release history.
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.LinguChat = void 0;
|
|
7
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
8
|
+
var _reactNative = require("react-native");
|
|
9
|
+
var _NativeChatUI = require("./NativeChatUI");
|
|
10
|
+
var _context = require("../context");
|
|
11
|
+
var _theme = require("../theme");
|
|
12
|
+
var _animations = require("../utils/animations");
|
|
13
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
14
|
+
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } /**
|
|
15
|
+
* LinguChat Component
|
|
16
|
+
* Full-page chat interface with back navigation
|
|
17
|
+
* Now with theme support and improved styling
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Internal component that uses context
|
|
21
|
+
*/
|
|
22
|
+
const LinguChatInner = props => {
|
|
23
|
+
var _props$showBackButton;
|
|
24
|
+
const {
|
|
25
|
+
theme
|
|
26
|
+
} = (0, _theme.useTheme)();
|
|
27
|
+
const [isOpen, setIsOpen] = (0, _react.useState)(props.autoOpen || false);
|
|
28
|
+
const [hasUnread, setHasUnread] = (0, _react.useState)(false);
|
|
29
|
+
const scaleAnim = (0, _react.useRef)(new _reactNative.Animated.Value(0)).current;
|
|
30
|
+
const badgePulse = (0, _react.useRef)(new _reactNative.Animated.Value(1)).current;
|
|
31
|
+
const {
|
|
32
|
+
messages,
|
|
33
|
+
isLoading,
|
|
34
|
+
config,
|
|
35
|
+
sendMessage,
|
|
36
|
+
startSession,
|
|
37
|
+
endSession,
|
|
38
|
+
isSessionActive
|
|
39
|
+
} = (0, _context.useLinguContext)();
|
|
40
|
+
|
|
41
|
+
// Entrance animation for FAB
|
|
42
|
+
(0, _react.useEffect)(() => {
|
|
43
|
+
(0, _animations.scaleIn)(scaleAnim).start();
|
|
44
|
+
}, []);
|
|
45
|
+
|
|
46
|
+
// Pulse animation for unread badge
|
|
47
|
+
(0, _react.useEffect)(() => {
|
|
48
|
+
if (hasUnread) {
|
|
49
|
+
(0, _animations.pulse)(badgePulse).start();
|
|
50
|
+
} else {
|
|
51
|
+
badgePulse.setValue(1);
|
|
52
|
+
}
|
|
53
|
+
}, [hasUnread]);
|
|
54
|
+
|
|
55
|
+
// Auto-open if configured
|
|
56
|
+
(0, _react.useEffect)(() => {
|
|
57
|
+
if (props.autoOpen && !isSessionActive) {
|
|
58
|
+
handleOpen();
|
|
59
|
+
}
|
|
60
|
+
}, [props.autoOpen]);
|
|
61
|
+
|
|
62
|
+
// Mark unread when new message arrives and chat is closed
|
|
63
|
+
(0, _react.useEffect)(() => {
|
|
64
|
+
if (!isOpen && messages.length > 0) {
|
|
65
|
+
const lastMessage = messages[messages.length - 1];
|
|
66
|
+
if (lastMessage.sender === 'bot') {
|
|
67
|
+
setHasUnread(true);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}, [messages, isOpen]);
|
|
71
|
+
const handleOpen = async () => {
|
|
72
|
+
setIsOpen(true);
|
|
73
|
+
setHasUnread(false);
|
|
74
|
+
if (!isSessionActive) {
|
|
75
|
+
await startSession();
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
const handleClose = async () => {
|
|
79
|
+
var _props$onBackPress;
|
|
80
|
+
setIsOpen(false);
|
|
81
|
+
await endSession();
|
|
82
|
+
(_props$onBackPress = props.onBackPress) === null || _props$onBackPress === void 0 || _props$onBackPress.call(props);
|
|
83
|
+
};
|
|
84
|
+
const handleSendMessage = async text => {
|
|
85
|
+
await sendMessage(text);
|
|
86
|
+
};
|
|
87
|
+
const getPositionStyle = (position = 'bottom-right') => {
|
|
88
|
+
const base = {
|
|
89
|
+
position: 'absolute'
|
|
90
|
+
};
|
|
91
|
+
switch (position) {
|
|
92
|
+
case 'bottom-right':
|
|
93
|
+
return {
|
|
94
|
+
...base,
|
|
95
|
+
bottom: 20,
|
|
96
|
+
right: 20
|
|
97
|
+
};
|
|
98
|
+
case 'bottom-left':
|
|
99
|
+
return {
|
|
100
|
+
...base,
|
|
101
|
+
bottom: 20,
|
|
102
|
+
left: 20
|
|
103
|
+
};
|
|
104
|
+
case 'top-right':
|
|
105
|
+
return {
|
|
106
|
+
...base,
|
|
107
|
+
top: 20,
|
|
108
|
+
right: 20
|
|
109
|
+
};
|
|
110
|
+
case 'top-left':
|
|
111
|
+
return {
|
|
112
|
+
...base,
|
|
113
|
+
top: 20,
|
|
114
|
+
left: 20
|
|
115
|
+
};
|
|
116
|
+
default:
|
|
117
|
+
return {
|
|
118
|
+
...base,
|
|
119
|
+
bottom: 20,
|
|
120
|
+
right: 20
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
const primaryColor = theme.colors.primary;
|
|
125
|
+
const position = props.position || (config === null || config === void 0 ? void 0 : config.widgetPosition) || 'bottom-right';
|
|
126
|
+
const showBackButton = (_props$showBackButton = props.showBackButton) !== null && _props$showBackButton !== void 0 ? _props$showBackButton : true;
|
|
127
|
+
|
|
128
|
+
// Full-page chat view
|
|
129
|
+
if (isOpen) {
|
|
130
|
+
return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
|
|
131
|
+
style: styles.fullScreenOverlay
|
|
132
|
+
}, /*#__PURE__*/_react.default.createElement(_reactNative.SafeAreaView, {
|
|
133
|
+
style: [styles.fullPageContainer, {
|
|
134
|
+
backgroundColor: theme.colors.background
|
|
135
|
+
}]
|
|
136
|
+
}, showBackButton && /*#__PURE__*/_react.default.createElement(_reactNative.View, {
|
|
137
|
+
style: [styles.header, {
|
|
138
|
+
backgroundColor: primaryColor,
|
|
139
|
+
paddingHorizontal: theme.spacing.lg,
|
|
140
|
+
paddingVertical: theme.spacing.md
|
|
141
|
+
}, theme.shadows.md]
|
|
142
|
+
}, /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
|
|
143
|
+
style: styles.backButton,
|
|
144
|
+
onPress: handleClose,
|
|
145
|
+
activeOpacity: 0.7
|
|
146
|
+
}, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
|
|
147
|
+
style: styles.backButtonText
|
|
148
|
+
}, "\u2190")), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
|
|
149
|
+
style: [styles.headerTitle, {
|
|
150
|
+
fontSize: theme.typography.fontSizes.lg,
|
|
151
|
+
fontWeight: theme.typography.fontWeights.semibold
|
|
152
|
+
}]
|
|
153
|
+
}, (config === null || config === void 0 ? void 0 : config.brandName) || 'Lingu Chat'), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
|
|
154
|
+
style: styles.headerSpacer
|
|
155
|
+
})), /*#__PURE__*/_react.default.createElement(_NativeChatUI.NativeChatUI, {
|
|
156
|
+
config: config,
|
|
157
|
+
messages: messages,
|
|
158
|
+
isLoading: isLoading,
|
|
159
|
+
onSendMessage: handleSendMessage
|
|
160
|
+
})));
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Floating action button
|
|
164
|
+
return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
|
|
165
|
+
style: [styles.fabContainer, getPositionStyle(position)],
|
|
166
|
+
pointerEvents: "box-none"
|
|
167
|
+
}, /*#__PURE__*/_react.default.createElement(_reactNative.Animated.View, {
|
|
168
|
+
style: {
|
|
169
|
+
transform: [{
|
|
170
|
+
scale: scaleAnim
|
|
171
|
+
}]
|
|
172
|
+
}
|
|
173
|
+
}, /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
|
|
174
|
+
style: [styles.fab, {
|
|
175
|
+
backgroundColor: primaryColor,
|
|
176
|
+
width: 60,
|
|
177
|
+
height: 60,
|
|
178
|
+
borderRadius: 30
|
|
179
|
+
}, theme.shadows.lg],
|
|
180
|
+
onPress: handleOpen,
|
|
181
|
+
activeOpacity: 0.8
|
|
182
|
+
}, hasUnread && /*#__PURE__*/_react.default.createElement(_reactNative.Animated.View, {
|
|
183
|
+
style: [styles.badge, {
|
|
184
|
+
backgroundColor: theme.colors.badge,
|
|
185
|
+
transform: [{
|
|
186
|
+
scale: badgePulse
|
|
187
|
+
}]
|
|
188
|
+
}]
|
|
189
|
+
}), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
|
|
190
|
+
style: styles.icon
|
|
191
|
+
}, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
|
|
192
|
+
style: styles.iconBubble
|
|
193
|
+
})))));
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* LinguChat - Main exported component
|
|
198
|
+
* Wraps everything in LinguProvider for standalone state management
|
|
199
|
+
*/
|
|
200
|
+
const LinguChat = ({
|
|
201
|
+
onBackPress,
|
|
202
|
+
showBackButton,
|
|
203
|
+
autoOpen,
|
|
204
|
+
position,
|
|
205
|
+
...linguConfig
|
|
206
|
+
}) => {
|
|
207
|
+
return /*#__PURE__*/_react.default.createElement(_context.LinguProvider, _extends({}, linguConfig, {
|
|
208
|
+
autoOpen: autoOpen
|
|
209
|
+
}), /*#__PURE__*/_react.default.createElement(LinguChatInner, {
|
|
210
|
+
onBackPress: onBackPress,
|
|
211
|
+
showBackButton: showBackButton,
|
|
212
|
+
autoOpen: autoOpen,
|
|
213
|
+
position: position
|
|
214
|
+
}));
|
|
215
|
+
};
|
|
216
|
+
exports.LinguChat = LinguChat;
|
|
217
|
+
const styles = _reactNative.StyleSheet.create({
|
|
218
|
+
fullScreenOverlay: {
|
|
219
|
+
position: 'absolute',
|
|
220
|
+
top: 0,
|
|
221
|
+
left: 0,
|
|
222
|
+
right: 0,
|
|
223
|
+
bottom: 0,
|
|
224
|
+
zIndex: 10000
|
|
225
|
+
},
|
|
226
|
+
fullPageContainer: {
|
|
227
|
+
flex: 1
|
|
228
|
+
},
|
|
229
|
+
header: {
|
|
230
|
+
flexDirection: 'row',
|
|
231
|
+
alignItems: 'center',
|
|
232
|
+
justifyContent: 'space-between'
|
|
233
|
+
},
|
|
234
|
+
backButton: {
|
|
235
|
+
width: 40,
|
|
236
|
+
height: 40,
|
|
237
|
+
justifyContent: 'center',
|
|
238
|
+
alignItems: 'center'
|
|
239
|
+
},
|
|
240
|
+
backButtonText: {
|
|
241
|
+
fontSize: 28,
|
|
242
|
+
color: '#fff',
|
|
243
|
+
fontWeight: '600'
|
|
244
|
+
},
|
|
245
|
+
headerTitle: {
|
|
246
|
+
color: '#fff',
|
|
247
|
+
flex: 1,
|
|
248
|
+
textAlign: 'center'
|
|
249
|
+
},
|
|
250
|
+
headerSpacer: {
|
|
251
|
+
width: 40
|
|
252
|
+
},
|
|
253
|
+
fabContainer: {
|
|
254
|
+
zIndex: 9999
|
|
255
|
+
},
|
|
256
|
+
fab: {
|
|
257
|
+
justifyContent: 'center',
|
|
258
|
+
alignItems: 'center'
|
|
259
|
+
},
|
|
260
|
+
badge: {
|
|
261
|
+
position: 'absolute',
|
|
262
|
+
top: 8,
|
|
263
|
+
right: 8,
|
|
264
|
+
width: 12,
|
|
265
|
+
height: 12,
|
|
266
|
+
borderRadius: 6,
|
|
267
|
+
borderWidth: 2,
|
|
268
|
+
borderColor: '#fff'
|
|
269
|
+
},
|
|
270
|
+
icon: {
|
|
271
|
+
width: 30,
|
|
272
|
+
height: 30,
|
|
273
|
+
justifyContent: 'center',
|
|
274
|
+
alignItems: 'center'
|
|
275
|
+
},
|
|
276
|
+
iconBubble: {
|
|
277
|
+
width: 24,
|
|
278
|
+
height: 20,
|
|
279
|
+
backgroundColor: '#fff',
|
|
280
|
+
borderRadius: 12
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
//# sourceMappingURL=LinguChat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_NativeChatUI","_context","_theme","_animations","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_extends","assign","bind","arguments","length","apply","LinguChatInner","props","_props$showBackButton","theme","useTheme","isOpen","setIsOpen","useState","autoOpen","hasUnread","setHasUnread","scaleAnim","useRef","Animated","Value","current","badgePulse","messages","isLoading","config","sendMessage","startSession","endSession","isSessionActive","useLinguContext","useEffect","scaleIn","start","pulse","setValue","handleOpen","lastMessage","sender","handleClose","_props$onBackPress","onBackPress","handleSendMessage","text","getPositionStyle","position","base","bottom","right","left","top","primaryColor","colors","primary","widgetPosition","showBackButton","createElement","View","style","styles","fullScreenOverlay","SafeAreaView","fullPageContainer","backgroundColor","background","header","paddingHorizontal","spacing","lg","paddingVertical","md","shadows","TouchableOpacity","backButton","onPress","activeOpacity","Text","backButtonText","headerTitle","fontSize","typography","fontSizes","fontWeight","fontWeights","semibold","brandName","headerSpacer","NativeChatUI","onSendMessage","fabContainer","pointerEvents","transform","scale","fab","width","height","borderRadius","badge","icon","iconBubble","LinguChat","linguConfig","LinguProvider","exports","StyleSheet","create","zIndex","flex","flexDirection","alignItems","justifyContent","color","textAlign","borderWidth","borderColor"],"sources":["LinguChat.tsx"],"sourcesContent":["/**\n * LinguChat Component\n * Full-page chat interface with back navigation\n * Now with theme support and improved styling\n */\n\nimport React, { useState, useEffect, useRef } from 'react';\nimport {\n View,\n TouchableOpacity,\n StyleSheet,\n Animated,\n SafeAreaView,\n Text,\n} from 'react-native';\nimport { NativeChatUI } from './NativeChatUI';\nimport { LinguProvider, useLinguContext } from '../context';\nimport { useTheme } from '../theme';\nimport { scaleIn, pulse } from '../utils/animations';\nimport type { LinguConfig, ChatPosition } from '../types';\n\nexport interface LinguChatProps extends LinguConfig {\n onBackPress?: () => void;\n showBackButton?: boolean;\n position?: ChatPosition; // UI preference for FAB position\n}\n\ninterface LinguChatInnerProps {\n onBackPress?: () => void;\n showBackButton?: boolean;\n autoOpen?: boolean;\n position?: ChatPosition;\n}\n\n/**\n * Internal component that uses context\n */\nconst LinguChatInner: React.FC<LinguChatInnerProps> = (props) => {\n const { theme } = useTheme();\n const [isOpen, setIsOpen] = useState(props.autoOpen || false);\n const [hasUnread, setHasUnread] = useState(false);\n const scaleAnim = useRef(new Animated.Value(0)).current;\n const badgePulse = useRef(new Animated.Value(1)).current;\n\n const {\n messages,\n isLoading,\n config,\n sendMessage,\n startSession,\n endSession,\n isSessionActive,\n } = useLinguContext();\n\n // Entrance animation for FAB\n useEffect(() => {\n scaleIn(scaleAnim).start();\n }, []);\n\n // Pulse animation for unread badge\n useEffect(() => {\n if (hasUnread) {\n pulse(badgePulse).start();\n } else {\n badgePulse.setValue(1);\n }\n }, [hasUnread]);\n\n // Auto-open if configured\n useEffect(() => {\n if (props.autoOpen && !isSessionActive) {\n handleOpen();\n }\n }, [props.autoOpen]);\n\n // Mark unread when new message arrives and chat is closed\n useEffect(() => {\n if (!isOpen && messages.length > 0) {\n const lastMessage = messages[messages.length - 1];\n if (lastMessage.sender === 'bot') {\n setHasUnread(true);\n }\n }\n }, [messages, isOpen]);\n\n const handleOpen = async () => {\n setIsOpen(true);\n setHasUnread(false);\n\n if (!isSessionActive) {\n await startSession();\n }\n };\n\n const handleClose = async () => {\n setIsOpen(false);\n await endSession();\n props.onBackPress?.();\n };\n\n const handleSendMessage = async (text: string) => {\n await sendMessage(text);\n };\n\n const getPositionStyle = (position: ChatPosition = 'bottom-right') => {\n const base = { position: 'absolute' as const };\n switch (position) {\n case 'bottom-right':\n return { ...base, bottom: 20, right: 20 };\n case 'bottom-left':\n return { ...base, bottom: 20, left: 20 };\n case 'top-right':\n return { ...base, top: 20, right: 20 };\n case 'top-left':\n return { ...base, top: 20, left: 20 };\n default:\n return { ...base, bottom: 20, right: 20 };\n }\n };\n\n const primaryColor = theme.colors.primary;\n const position = props.position || config?.widgetPosition || 'bottom-right';\n const showBackButton = props.showBackButton ?? true;\n\n // Full-page chat view\n if (isOpen) {\n return (\n <View style={styles.fullScreenOverlay}>\n <SafeAreaView\n style={[\n styles.fullPageContainer,\n { backgroundColor: theme.colors.background },\n ]}\n >\n {/* Header with back button */}\n {showBackButton && (\n <View\n style={[\n styles.header,\n {\n backgroundColor: primaryColor,\n paddingHorizontal: theme.spacing.lg,\n paddingVertical: theme.spacing.md,\n },\n theme.shadows.md,\n ]}\n >\n <TouchableOpacity\n style={styles.backButton}\n onPress={handleClose}\n activeOpacity={0.7}\n >\n <Text style={styles.backButtonText}>←</Text>\n </TouchableOpacity>\n <Text\n style={[\n styles.headerTitle,\n {\n fontSize: theme.typography.fontSizes.lg,\n fontWeight: theme.typography.fontWeights.semibold,\n },\n ]}\n >\n {config?.brandName || 'Lingu Chat'}\n </Text>\n <View style={styles.headerSpacer} />\n </View>\n )}\n\n {/* Native Chat UI */}\n <NativeChatUI\n config={config}\n messages={messages}\n isLoading={isLoading}\n onSendMessage={handleSendMessage}\n />\n </SafeAreaView>\n </View>\n );\n }\n\n // Floating action button\n return (\n <View style={[styles.fabContainer, getPositionStyle(position)]} pointerEvents=\"box-none\">\n <Animated.View style={{ transform: [{ scale: scaleAnim }] }}>\n <TouchableOpacity\n style={[\n styles.fab,\n {\n backgroundColor: primaryColor,\n width: 60,\n height: 60,\n borderRadius: 30,\n },\n theme.shadows.lg,\n ]}\n onPress={handleOpen}\n activeOpacity={0.8}\n >\n {hasUnread && (\n <Animated.View\n style={[\n styles.badge,\n {\n backgroundColor: theme.colors.badge,\n transform: [{ scale: badgePulse }],\n },\n ]}\n />\n )}\n <View style={styles.icon}>\n {/* Chat icon */}\n <View style={styles.iconBubble} />\n </View>\n </TouchableOpacity>\n </Animated.View>\n </View>\n );\n};\n\n/**\n * LinguChat - Main exported component\n * Wraps everything in LinguProvider for standalone state management\n */\nexport const LinguChat: React.FC<LinguChatProps> = ({\n onBackPress,\n showBackButton,\n autoOpen,\n position,\n ...linguConfig\n}) => {\n return (\n <LinguProvider {...linguConfig} autoOpen={autoOpen}>\n <LinguChatInner\n onBackPress={onBackPress}\n showBackButton={showBackButton}\n autoOpen={autoOpen}\n position={position}\n />\n </LinguProvider>\n );\n};\n\nconst styles = StyleSheet.create({\n fullScreenOverlay: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 10000,\n },\n fullPageContainer: {\n flex: 1,\n },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n },\n backButton: {\n width: 40,\n height: 40,\n justifyContent: 'center',\n alignItems: 'center',\n },\n backButtonText: {\n fontSize: 28,\n color: '#fff',\n fontWeight: '600',\n },\n headerTitle: {\n color: '#fff',\n flex: 1,\n textAlign: 'center',\n },\n headerSpacer: {\n width: 40,\n },\n fabContainer: {\n zIndex: 9999,\n },\n fab: {\n justifyContent: 'center',\n alignItems: 'center',\n },\n badge: {\n position: 'absolute',\n top: 8,\n right: 8,\n width: 12,\n height: 12,\n borderRadius: 6,\n borderWidth: 2,\n borderColor: '#fff',\n },\n icon: {\n width: 30,\n height: 30,\n justifyContent: 'center',\n alignItems: 'center',\n },\n iconBubble: {\n width: 24,\n height: 20,\n backgroundColor: '#fff',\n borderRadius: 12,\n },\n});\n"],"mappings":"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","ignoreList":[]}
|