@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.
Files changed (135) hide show
  1. package/README.md +279 -0
  2. package/lib/commonjs/components/LinguChat.js +283 -0
  3. package/lib/commonjs/components/LinguChat.js.map +1 -0
  4. package/lib/commonjs/components/LinguWebView.js +203 -0
  5. package/lib/commonjs/components/LinguWebView.js.map +1 -0
  6. package/lib/commonjs/components/MessageBubble.js +91 -0
  7. package/lib/commonjs/components/MessageBubble.js.map +1 -0
  8. package/lib/commonjs/components/NativeChatUI.js +192 -0
  9. package/lib/commonjs/components/NativeChatUI.js.map +1 -0
  10. package/lib/commonjs/components/TypingIndicator.js +92 -0
  11. package/lib/commonjs/components/TypingIndicator.js.map +1 -0
  12. package/lib/commonjs/context/LinguProvider.js +47 -0
  13. package/lib/commonjs/context/LinguProvider.js.map +1 -0
  14. package/lib/commonjs/context/index.js +17 -0
  15. package/lib/commonjs/context/index.js.map +1 -0
  16. package/lib/commonjs/hooks/useLinguChat.js +295 -0
  17. package/lib/commonjs/hooks/useLinguChat.js.map +1 -0
  18. package/lib/commonjs/index.js +129 -0
  19. package/lib/commonjs/index.js.map +1 -0
  20. package/lib/commonjs/services/LinguAPI.js +196 -0
  21. package/lib/commonjs/services/LinguAPI.js.map +1 -0
  22. package/lib/commonjs/services/SessionManager.js +131 -0
  23. package/lib/commonjs/services/SessionManager.js.map +1 -0
  24. package/lib/commonjs/services/StorageManager.js +116 -0
  25. package/lib/commonjs/services/StorageManager.js.map +1 -0
  26. package/lib/commonjs/theme/ThemeProvider.js +49 -0
  27. package/lib/commonjs/theme/ThemeProvider.js.map +1 -0
  28. package/lib/commonjs/theme/index.js +28 -0
  29. package/lib/commonjs/theme/index.js.map +1 -0
  30. package/lib/commonjs/theme/theme.js +150 -0
  31. package/lib/commonjs/theme/theme.js.map +1 -0
  32. package/lib/commonjs/types/index.js +2 -0
  33. package/lib/commonjs/types/index.js.map +1 -0
  34. package/lib/commonjs/utils/animations.js +118 -0
  35. package/lib/commonjs/utils/animations.js.map +1 -0
  36. package/lib/commonjs/utils/formatters.js +89 -0
  37. package/lib/commonjs/utils/formatters.js.map +1 -0
  38. package/lib/commonjs/utils/index.js +28 -0
  39. package/lib/commonjs/utils/index.js.map +1 -0
  40. package/lib/module/components/LinguChat.js +277 -0
  41. package/lib/module/components/LinguChat.js.map +1 -0
  42. package/lib/module/components/LinguWebView.js +195 -0
  43. package/lib/module/components/LinguWebView.js.map +1 -0
  44. package/lib/module/components/MessageBubble.js +83 -0
  45. package/lib/module/components/MessageBubble.js.map +1 -0
  46. package/lib/module/components/NativeChatUI.js +184 -0
  47. package/lib/module/components/NativeChatUI.js.map +1 -0
  48. package/lib/module/components/TypingIndicator.js +84 -0
  49. package/lib/module/components/TypingIndicator.js.map +1 -0
  50. package/lib/module/context/LinguProvider.js +38 -0
  51. package/lib/module/context/LinguProvider.js.map +1 -0
  52. package/lib/module/context/index.js +6 -0
  53. package/lib/module/context/index.js.map +1 -0
  54. package/lib/module/hooks/useLinguChat.js +288 -0
  55. package/lib/module/hooks/useLinguChat.js.map +1 -0
  56. package/lib/module/index.js +30 -0
  57. package/lib/module/index.js.map +1 -0
  58. package/lib/module/services/LinguAPI.js +190 -0
  59. package/lib/module/services/LinguAPI.js.map +1 -0
  60. package/lib/module/services/SessionManager.js +124 -0
  61. package/lib/module/services/SessionManager.js.map +1 -0
  62. package/lib/module/services/StorageManager.js +108 -0
  63. package/lib/module/services/StorageManager.js.map +1 -0
  64. package/lib/module/theme/ThemeProvider.js +40 -0
  65. package/lib/module/theme/ThemeProvider.js.map +1 -0
  66. package/lib/module/theme/index.js +7 -0
  67. package/lib/module/theme/index.js.map +1 -0
  68. package/lib/module/theme/theme.js +142 -0
  69. package/lib/module/theme/theme.js.map +1 -0
  70. package/lib/module/types/index.js +2 -0
  71. package/lib/module/types/index.js.map +1 -0
  72. package/lib/module/utils/animations.js +106 -0
  73. package/lib/module/utils/animations.js.map +1 -0
  74. package/lib/module/utils/formatters.js +78 -0
  75. package/lib/module/utils/formatters.js.map +1 -0
  76. package/lib/module/utils/index.js +7 -0
  77. package/lib/module/utils/index.js.map +1 -0
  78. package/lib/typescript/components/LinguChat.d.ts +18 -0
  79. package/lib/typescript/components/LinguChat.d.ts.map +1 -0
  80. package/lib/typescript/components/LinguWebView.d.ts +16 -0
  81. package/lib/typescript/components/LinguWebView.d.ts.map +1 -0
  82. package/lib/typescript/components/MessageBubble.d.ts +13 -0
  83. package/lib/typescript/components/MessageBubble.d.ts.map +1 -0
  84. package/lib/typescript/components/NativeChatUI.d.ts +16 -0
  85. package/lib/typescript/components/NativeChatUI.d.ts.map +1 -0
  86. package/lib/typescript/components/TypingIndicator.d.ts +7 -0
  87. package/lib/typescript/components/TypingIndicator.d.ts.map +1 -0
  88. package/lib/typescript/context/LinguProvider.d.ts +32 -0
  89. package/lib/typescript/context/LinguProvider.d.ts.map +1 -0
  90. package/lib/typescript/context/index.d.ts +5 -0
  91. package/lib/typescript/context/index.d.ts.map +1 -0
  92. package/lib/typescript/hooks/useLinguChat.d.ts +18 -0
  93. package/lib/typescript/hooks/useLinguChat.d.ts.map +1 -0
  94. package/lib/typescript/index.d.ts +19 -0
  95. package/lib/typescript/index.d.ts.map +1 -0
  96. package/lib/typescript/services/LinguAPI.d.ts +39 -0
  97. package/lib/typescript/services/LinguAPI.d.ts.map +1 -0
  98. package/lib/typescript/services/SessionManager.d.ts +46 -0
  99. package/lib/typescript/services/SessionManager.d.ts.map +1 -0
  100. package/lib/typescript/services/StorageManager.d.ts +36 -0
  101. package/lib/typescript/services/StorageManager.d.ts.map +1 -0
  102. package/lib/typescript/theme/ThemeProvider.d.ts +23 -0
  103. package/lib/typescript/theme/ThemeProvider.d.ts.map +1 -0
  104. package/lib/typescript/theme/index.d.ts +6 -0
  105. package/lib/typescript/theme/index.d.ts.map +1 -0
  106. package/lib/typescript/theme/theme.d.ts +130 -0
  107. package/lib/typescript/theme/theme.d.ts.map +1 -0
  108. package/lib/typescript/types/index.d.ts +50 -0
  109. package/lib/typescript/types/index.d.ts.map +1 -0
  110. package/lib/typescript/utils/animations.d.ts +34 -0
  111. package/lib/typescript/utils/animations.d.ts.map +1 -0
  112. package/lib/typescript/utils/formatters.d.ts +25 -0
  113. package/lib/typescript/utils/formatters.d.ts.map +1 -0
  114. package/lib/typescript/utils/index.d.ts +6 -0
  115. package/lib/typescript/utils/index.d.ts.map +1 -0
  116. package/package.json +98 -0
  117. package/src/components/LinguChat.tsx +309 -0
  118. package/src/components/LinguWebView.tsx +216 -0
  119. package/src/components/MessageBubble.tsx +120 -0
  120. package/src/components/NativeChatUI.tsx +247 -0
  121. package/src/components/TypingIndicator.tsx +84 -0
  122. package/src/context/LinguProvider.tsx +53 -0
  123. package/src/context/index.ts +5 -0
  124. package/src/hooks/useLinguChat.ts +314 -0
  125. package/src/index.ts +43 -0
  126. package/src/services/LinguAPI.ts +214 -0
  127. package/src/services/SessionManager.ts +131 -0
  128. package/src/services/StorageManager.ts +111 -0
  129. package/src/theme/ThemeProvider.tsx +58 -0
  130. package/src/theme/index.ts +6 -0
  131. package/src/theme/theme.ts +254 -0
  132. package/src/types/index.ts +59 -0
  133. package/src/utils/animations.ts +141 -0
  134. package/src/utils/formatters.ts +80 -0
  135. 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
+ [![npm version](https://img.shields.io/npm/v/@lingu/react-native-sdk.svg)](https://www.npmjs.com/package/@lingu/react-native-sdk)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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":[]}