@lorikeetai/react-native-sdk 1.0.0 → 1.2.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 CHANGED
@@ -49,6 +49,8 @@ Header component for the widget.
49
49
 
50
50
  - `title` (required): The title text to display
51
51
  - `style` (optional): Style for the header text
52
+ - `icon` (optional): Clickable icon to be rendered on the right side of the header. Defaults to a new chat icon
53
+ - `onIconPress` (optional): Callback when the header icon is pressed.
52
54
 
53
55
  ### LorikeetWidgetWebView
54
56
 
package/dist/index.cjs CHANGED
@@ -1,12 +1,16 @@
1
1
  'use strict';
2
2
 
3
3
  var react = require('react');
4
- var lucideReactNative = require('lucide-react-native');
5
4
  var reactNative = require('react-native');
6
5
  var reactNativeSafeAreaContext = require('react-native-safe-area-context');
7
6
  var reactNativeWebview = require('react-native-webview');
7
+ var Svg = require('react-native-svg');
8
8
  var jsxRuntime = require('react/jsx-runtime');
9
9
 
10
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
+
12
+ var Svg__default = /*#__PURE__*/_interopDefault(Svg);
13
+
10
14
  var __defProp = Object.defineProperty;
11
15
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12
16
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
@@ -51,6 +55,48 @@ var LorikeetClient = class {
51
55
  }
52
56
  }
53
57
  };
58
+ var MessageCirclePlusIcon = ({
59
+ size = 24,
60
+ color = "currentColor",
61
+ strokeWidth = 2
62
+ }) => {
63
+ return /* @__PURE__ */ jsxRuntime.jsxs(Svg__default.default, { fill: "none", height: size, viewBox: "0 0 24 24", width: size, children: [
64
+ /* @__PURE__ */ jsxRuntime.jsx(
65
+ Svg.Path,
66
+ {
67
+ d: "M7.9 20A9 9 0 1 0 4 16.1L2 22Z",
68
+ stroke: color,
69
+ strokeLinecap: "round",
70
+ strokeLinejoin: "round",
71
+ strokeWidth
72
+ }
73
+ ),
74
+ /* @__PURE__ */ jsxRuntime.jsx(
75
+ Svg.Line,
76
+ {
77
+ stroke: color,
78
+ strokeLinecap: "round",
79
+ strokeWidth,
80
+ x1: "12",
81
+ x2: "12",
82
+ y1: "8",
83
+ y2: "16"
84
+ }
85
+ ),
86
+ /* @__PURE__ */ jsxRuntime.jsx(
87
+ Svg.Line,
88
+ {
89
+ stroke: color,
90
+ strokeLinecap: "round",
91
+ strokeWidth,
92
+ x1: "8",
93
+ x2: "16",
94
+ y1: "12",
95
+ y2: "12"
96
+ }
97
+ )
98
+ ] });
99
+ };
54
100
  var stylesheet = reactNative.StyleSheet.create({
55
101
  root: { flex: 1, backgroundColor: "#fff" },
56
102
  container: {
@@ -65,7 +111,12 @@ var stylesheet = reactNative.StyleSheet.create({
65
111
  },
66
112
  header: {
67
113
  padding: 16,
68
- justifyContent: "center"
114
+ display: "flex",
115
+ flexDirection: "row",
116
+ justifyContent: "space-between"
117
+ },
118
+ headerIcon: {
119
+ width: 24
69
120
  },
70
121
  headerText: {
71
122
  textAlign: "center",
@@ -75,11 +126,7 @@ var stylesheet = reactNative.StyleSheet.create({
75
126
  flex: 1
76
127
  }
77
128
  });
78
- var LorikeetWidgetWebView = ({
79
- uri,
80
- baseUrl = "https://chat.lorikeetcx.ai",
81
- webviewProps = {}
82
- }) => {
129
+ var LorikeetWidgetWebView = react.forwardRef(({ uri, baseUrl = "https://chat.lorikeetcx.ai", webviewProps = {} }, ref) => {
83
130
  return /* @__PURE__ */ jsxRuntime.jsx(
84
131
  reactNativeWebview.WebView,
85
132
  {
@@ -92,21 +139,25 @@ var LorikeetWidgetWebView = ({
92
139
  return false;
93
140
  }
94
141
  },
142
+ ref,
95
143
  source: {
96
144
  uri
97
145
  },
98
146
  style: stylesheet.webView
99
147
  }
100
148
  );
101
- };
149
+ });
150
+ LorikeetWidgetWebView.displayName = "LorikeetWidgetWebView";
102
151
  var LorikeetWidgetHeader = ({
103
152
  title,
104
153
  style,
105
- icon = /* @__PURE__ */ jsxRuntime.jsx(lucideReactNative.MessageCirclePlusIcon, {})
154
+ icon = /* @__PURE__ */ jsxRuntime.jsx(MessageCirclePlusIcon, { size: 16 }),
155
+ onIconPress
106
156
  }) => {
107
157
  return /* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: stylesheet.header, children: [
158
+ /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: stylesheet.headerIcon }),
108
159
  /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: [stylesheet.headerText, style], children: title }),
109
- icon
160
+ /* @__PURE__ */ jsxRuntime.jsx(reactNative.TouchableOpacity, { onPress: onIconPress, style: stylesheet.headerIcon, children: icon })
110
161
  ] });
111
162
  };
112
163
  function LorikeetWidgetView({
@@ -121,6 +172,9 @@ function LorikeetWidgetView({
121
172
  const [lorikeetClient, setLorikeetClient] = react.useState(
122
173
  null
123
174
  );
175
+ const [uri, setUri] = react.useState(null);
176
+ const [timestamp, setTimestamp] = react.useState(Date.now());
177
+ const webViewRef = react.useRef(null);
124
178
  react.useEffect(() => {
125
179
  const lorikeetClient2 = new LorikeetClient({
126
180
  public_key: publicKey,
@@ -131,14 +185,22 @@ function LorikeetWidgetView({
131
185
  }
132
186
  });
133
187
  setLorikeetClient(lorikeetClient2);
188
+ setUri(
189
+ lorikeetClient2.getWebviewUrl({
190
+ token: authToken
191
+ })
192
+ );
134
193
  }, [publicKey, baseUrl]);
135
- if (!lorikeetClient) {
194
+ if (!lorikeetClient || !uri) {
136
195
  return null;
137
196
  }
138
197
  return /* @__PURE__ */ jsxRuntime.jsx(reactNativeSafeAreaContext.SafeAreaView, { edges: ["top", "left", "right"], style: stylesheet.root, children: /* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: stylesheet.container, children: [
139
198
  /* @__PURE__ */ jsxRuntime.jsx(
140
199
  LorikeetWidgetHeader,
141
200
  {
201
+ onIconPress: () => {
202
+ setTimestamp(Date.now());
203
+ },
142
204
  style: styles == null ? void 0 : styles.header,
143
205
  title: (_a = customisations == null ? void 0 : customisations.title) != null ? _a : "Lorikeet AI Agent"
144
206
  }
@@ -147,9 +209,8 @@ function LorikeetWidgetView({
147
209
  LorikeetWidgetWebView,
148
210
  {
149
211
  baseUrl: lorikeetClient.baseUrl,
150
- uri: lorikeetClient.getWebviewUrl({
151
- token: authToken
152
- }),
212
+ ref: webViewRef,
213
+ uri,
153
214
  webviewProps: {
154
215
  onMessage: onWebViewMessage,
155
216
  allowsInlineMediaPlayback: true,
@@ -158,7 +219,8 @@ function LorikeetWidgetView({
158
219
  startInLoadingState: true,
159
220
  style: stylesheet.webView
160
221
  }
161
- }
222
+ },
223
+ timestamp
162
224
  )
163
225
  ] }) });
164
226
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/widget.tsx"],"names":["StyleSheet","jsx","WebView","Linking","MessageCirclePlusIcon","jsxs","View","Text","useState","useEffect","lorikeetClient","SafeAreaView"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Customisations } from '@lorikeetai/web-sdk/types'\n\nimport type { LorikeetInitOptions } from './types'\n\nexport class LorikeetClient {\n baseUrl: string = 'https://chat.lorikeetcx.ai' // Fallback URL\n customisations: Customisations | null = null\n publicKey: string\n\n constructor({ customisations, api_base, public_key }: LorikeetInitOptions) {\n if (api_base) {\n this.baseUrl = api_base\n }\n this.publicKey = public_key\n\n if (customisations) {\n this.customisations = customisations\n }\n }\n\n getWebviewUrl = ({\n customer_email,\n customer_name,\n token,\n ticket_id,\n }: {\n customer_email?: string\n customer_name?: string\n token: string\n ticket_id?: string\n }) => {\n const url = new URL(this.baseUrl)\n\n url.pathname = ticket_id\n ? `/tickets/${this.publicKey}/${ticket_id}`\n : '/widget'\n url.searchParams.append('public_key', this.publicKey)\n\n if (customer_email) {\n url.searchParams.append('customer_email', customer_email)\n }\n if (customer_name) {\n url.searchParams.append('customer_name', customer_name)\n }\n\n url.searchParams.append('token', token)\n\n if (this.customisations) {\n url.searchParams.append(\n 'customisations',\n btoa(JSON.stringify(this.customisations)),\n )\n }\n\n return url.toString()\n }\n}\n","import { useEffect, useState } from 'react'\n\nimport { MessageCirclePlusIcon } from 'lucide-react-native'\nimport { Linking, StyleSheet, Text, View } from 'react-native'\nimport { SafeAreaView } from 'react-native-safe-area-context'\nimport { WebView } from 'react-native-webview'\n\nimport { LorikeetClient } from './client'\nimport type {\n LorikeetWidgetHeaderProps,\n LorikeetWidgetViewProps,\n LorikeetWidgetWebViewProps,\n} from './types'\n\nconst stylesheet = StyleSheet.create({\n root: { flex: 1, backgroundColor: '#fff' },\n container: {\n flex: 1,\n borderRadius: 8,\n overflow: 'hidden',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.1,\n shadowRadius: 4,\n elevation: 3,\n },\n header: {\n padding: 16,\n justifyContent: 'center',\n },\n headerText: {\n textAlign: 'center',\n fontSize: 16,\n },\n webView: {\n flex: 1,\n },\n})\n\nexport const LorikeetWidgetWebView = ({\n uri,\n baseUrl = 'https://chat.lorikeetcx.ai',\n webviewProps = {},\n}: LorikeetWidgetWebViewProps) => {\n return (\n <WebView\n {...webviewProps}\n onNavigationStateChange={(navState) => {\n if (navState.url.includes(baseUrl)) {\n return false\n } else {\n void Linking.openURL(navState.url)\n return false\n }\n }}\n source={{\n uri,\n }}\n style={stylesheet.webView}\n />\n )\n}\n\nexport const LorikeetWidgetHeader = ({\n title,\n style,\n icon = <MessageCirclePlusIcon />,\n}: LorikeetWidgetHeaderProps) => {\n return (\n <View style={stylesheet.header}>\n <Text style={[stylesheet.headerText, style]}>{title}</Text>\n {icon}\n </View>\n )\n}\n\nexport function LorikeetWidgetView({\n publicKey,\n baseUrl,\n authToken,\n customisations,\n styles,\n onWebViewMessage,\n}: LorikeetWidgetViewProps) {\n const [lorikeetClient, setLorikeetClient] = useState<LorikeetClient | null>(\n null,\n )\n\n useEffect(() => {\n const lorikeetClient = new LorikeetClient({\n public_key: publicKey,\n api_base: baseUrl,\n customisations: {\n ...customisations,\n hideHeader:\n customisations?.hideHeader === undefined\n ? true\n : customisations.hideHeader,\n },\n })\n setLorikeetClient(lorikeetClient)\n }, [publicKey, baseUrl])\n\n if (!lorikeetClient) {\n return null\n }\n\n return (\n <SafeAreaView edges={['top', 'left', 'right']} style={stylesheet.root}>\n <View style={stylesheet.container}>\n <LorikeetWidgetHeader\n style={styles?.header}\n title={customisations?.title ?? 'Lorikeet AI Agent'}\n />\n <LorikeetWidgetWebView\n baseUrl={lorikeetClient.baseUrl}\n uri={lorikeetClient.getWebviewUrl({\n token: authToken,\n })}\n webviewProps={{\n onMessage: onWebViewMessage,\n allowsInlineMediaPlayback: true,\n mediaPlaybackRequiresUserAction: false,\n scalesPageToFit: true,\n startInLoadingState: true,\n style: stylesheet.webView,\n }}\n />\n </View>\n </SafeAreaView>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/client.ts","../src/message-circle-plus-icon.tsx","../src/widget.tsx"],"names":["jsxs","Svg","jsx","Path","Line","StyleSheet","forwardRef","WebView","Linking","View","Text","TouchableOpacity","useState","useRef","useEffect","lorikeetClient","SafeAreaView"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Customisations } from '@lorikeetai/web-sdk/types'\n\nimport type { LorikeetInitOptions } from './types'\n\nexport class LorikeetClient {\n baseUrl: string = 'https://chat.lorikeetcx.ai' // Fallback URL\n customisations: Customisations | null = null\n publicKey: string\n\n constructor({ customisations, api_base, public_key }: LorikeetInitOptions) {\n if (api_base) {\n this.baseUrl = api_base\n }\n this.publicKey = public_key\n\n if (customisations) {\n this.customisations = customisations\n }\n }\n\n getWebviewUrl = ({\n customer_email,\n customer_name,\n token,\n ticket_id,\n }: {\n customer_email?: string\n customer_name?: string\n token: string\n ticket_id?: string\n }) => {\n const url = new URL(this.baseUrl)\n\n url.pathname = ticket_id\n ? `/tickets/${this.publicKey}/${ticket_id}`\n : '/widget'\n url.searchParams.append('public_key', this.publicKey)\n\n if (customer_email) {\n url.searchParams.append('customer_email', customer_email)\n }\n if (customer_name) {\n url.searchParams.append('customer_name', customer_name)\n }\n\n url.searchParams.append('token', token)\n\n if (this.customisations) {\n url.searchParams.append(\n 'customisations',\n btoa(JSON.stringify(this.customisations)),\n )\n }\n\n return url.toString()\n }\n}\n","import Svg, { Line, Path } from 'react-native-svg'\n\ninterface MessageCirclePlusIconProps {\n color?: string\n size?: number\n strokeWidth?: number\n}\n\nexport const MessageCirclePlusIcon = ({\n size = 24,\n color = 'currentColor',\n strokeWidth = 2,\n}: MessageCirclePlusIconProps) => {\n return (\n <Svg fill=\"none\" height={size} viewBox=\"0 0 24 24\" width={size}>\n <Path\n d=\"M7.9 20A9 9 0 1 0 4 16.1L2 22Z\"\n stroke={color}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={strokeWidth}\n />\n <Line\n stroke={color}\n strokeLinecap=\"round\"\n strokeWidth={strokeWidth}\n x1=\"12\"\n x2=\"12\"\n y1=\"8\"\n y2=\"16\"\n />\n <Line\n stroke={color}\n strokeLinecap=\"round\"\n strokeWidth={strokeWidth}\n x1=\"8\"\n x2=\"16\"\n y1=\"12\"\n y2=\"12\"\n />\n </Svg>\n )\n}\n","import { forwardRef, useEffect, useRef, useState } from 'react'\n\nimport { Linking, StyleSheet, Text, TouchableOpacity, View } from 'react-native'\nimport { SafeAreaView } from 'react-native-safe-area-context'\nimport { WebView } from 'react-native-webview'\n\nimport { LorikeetClient } from './client'\nimport { MessageCirclePlusIcon } from './message-circle-plus-icon'\nimport type {\n LorikeetWidgetHeaderProps,\n LorikeetWidgetViewProps,\n LorikeetWidgetWebViewProps,\n} from './types'\n\nconst stylesheet = StyleSheet.create({\n root: { flex: 1, backgroundColor: '#fff' },\n container: {\n flex: 1,\n borderRadius: 8,\n overflow: 'hidden',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.1,\n shadowRadius: 4,\n elevation: 3,\n },\n header: {\n padding: 16,\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n headerIcon: {\n width: 24,\n },\n headerText: {\n textAlign: 'center',\n fontSize: 16,\n },\n webView: {\n flex: 1,\n },\n})\n\nexport const LorikeetWidgetWebView = forwardRef<\n WebView,\n LorikeetWidgetWebViewProps\n>(({ uri, baseUrl = 'https://chat.lorikeetcx.ai', webviewProps = {} }, ref) => {\n return (\n <WebView\n {...webviewProps}\n onNavigationStateChange={(navState) => {\n if (navState.url.includes(baseUrl)) {\n return false\n } else {\n void Linking.openURL(navState.url)\n return false\n }\n }}\n ref={ref}\n source={{\n uri,\n }}\n style={stylesheet.webView}\n />\n )\n})\nLorikeetWidgetWebView.displayName = 'LorikeetWidgetWebView'\n\nexport const LorikeetWidgetHeader = ({\n title,\n style,\n icon = <MessageCirclePlusIcon size={16} />,\n onIconPress,\n}: LorikeetWidgetHeaderProps) => {\n return (\n <View style={stylesheet.header}>\n <View style={stylesheet.headerIcon} />\n <Text style={[stylesheet.headerText, style]}>{title}</Text>\n <TouchableOpacity onPress={onIconPress} style={stylesheet.headerIcon}>\n {icon}\n </TouchableOpacity>\n </View>\n )\n}\n\nexport function LorikeetWidgetView({\n publicKey,\n baseUrl,\n authToken,\n customisations,\n styles,\n onWebViewMessage,\n}: LorikeetWidgetViewProps) {\n const [lorikeetClient, setLorikeetClient] = useState<LorikeetClient | null>(\n null,\n )\n const [uri, setUri] = useState<string | null>(null)\n const [timestamp, setTimestamp] = useState<number>(Date.now())\n const webViewRef = useRef<WebView>(null)\n\n useEffect(() => {\n const lorikeetClient = new LorikeetClient({\n public_key: publicKey,\n api_base: baseUrl,\n customisations: {\n ...customisations,\n hideHeader:\n customisations?.hideHeader === undefined\n ? true\n : customisations.hideHeader,\n },\n })\n setLorikeetClient(lorikeetClient)\n setUri(\n lorikeetClient.getWebviewUrl({\n token: authToken,\n }),\n )\n }, [publicKey, baseUrl])\n\n if (!lorikeetClient || !uri) {\n return null\n }\n\n return (\n <SafeAreaView edges={['top', 'left', 'right']} style={stylesheet.root}>\n <View style={stylesheet.container}>\n <LorikeetWidgetHeader\n onIconPress={() => {\n setTimestamp(Date.now())\n }}\n style={styles?.header}\n title={customisations?.title ?? 'Lorikeet AI Agent'}\n />\n <LorikeetWidgetWebView\n baseUrl={lorikeetClient.baseUrl}\n key={timestamp}\n ref={webViewRef}\n uri={uri}\n webviewProps={{\n onMessage: onWebViewMessage,\n allowsInlineMediaPlayback: true,\n mediaPlaybackRequiresUserAction: false,\n scalesPageToFit: true,\n startInLoadingState: true,\n style: stylesheet.webView,\n }}\n />\n </View>\n </SafeAreaView>\n )\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -1,7 +1,8 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as react from 'react';
3
+ import { WebViewProps, WebViewMessageEvent, WebView } from 'react-native-webview';
2
4
  import { Customisations } from '@lorikeetai/web-sdk/types';
3
5
  import { StyleProp, TextStyle } from 'react-native';
4
- import { WebViewProps, WebViewMessageEvent } from 'react-native-webview';
5
6
 
6
7
  interface LorikeetInitOptions {
7
8
  api_base?: string;
@@ -17,6 +18,7 @@ type LorikeetWidgetHeaderProps = {
17
18
  title: string;
18
19
  style?: StyleProp<TextStyle>;
19
20
  icon?: React.ReactNode;
21
+ onIconPress?: () => void;
20
22
  };
21
23
  type LorikeetWidgetViewProps = {
22
24
  publicKey: string;
@@ -29,8 +31,8 @@ type LorikeetWidgetViewProps = {
29
31
  };
30
32
  };
31
33
 
32
- declare const LorikeetWidgetWebView: ({ uri, baseUrl, webviewProps, }: LorikeetWidgetWebViewProps) => react_jsx_runtime.JSX.Element;
33
- declare const LorikeetWidgetHeader: ({ title, style, icon, }: LorikeetWidgetHeaderProps) => react_jsx_runtime.JSX.Element;
34
+ declare const LorikeetWidgetWebView: react.ForwardRefExoticComponent<LorikeetWidgetWebViewProps & react.RefAttributes<WebView<{}>>>;
35
+ declare const LorikeetWidgetHeader: ({ title, style, icon, onIconPress, }: LorikeetWidgetHeaderProps) => react_jsx_runtime.JSX.Element;
34
36
  declare function LorikeetWidgetView({ publicKey, baseUrl, authToken, customisations, styles, onWebViewMessage, }: LorikeetWidgetViewProps): react_jsx_runtime.JSX.Element | null;
35
37
 
36
38
  declare class LorikeetClient {
package/dist/index.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as react from 'react';
3
+ import { WebViewProps, WebViewMessageEvent, WebView } from 'react-native-webview';
2
4
  import { Customisations } from '@lorikeetai/web-sdk/types';
3
5
  import { StyleProp, TextStyle } from 'react-native';
4
- import { WebViewProps, WebViewMessageEvent } from 'react-native-webview';
5
6
 
6
7
  interface LorikeetInitOptions {
7
8
  api_base?: string;
@@ -17,6 +18,7 @@ type LorikeetWidgetHeaderProps = {
17
18
  title: string;
18
19
  style?: StyleProp<TextStyle>;
19
20
  icon?: React.ReactNode;
21
+ onIconPress?: () => void;
20
22
  };
21
23
  type LorikeetWidgetViewProps = {
22
24
  publicKey: string;
@@ -29,8 +31,8 @@ type LorikeetWidgetViewProps = {
29
31
  };
30
32
  };
31
33
 
32
- declare const LorikeetWidgetWebView: ({ uri, baseUrl, webviewProps, }: LorikeetWidgetWebViewProps) => react_jsx_runtime.JSX.Element;
33
- declare const LorikeetWidgetHeader: ({ title, style, icon, }: LorikeetWidgetHeaderProps) => react_jsx_runtime.JSX.Element;
34
+ declare const LorikeetWidgetWebView: react.ForwardRefExoticComponent<LorikeetWidgetWebViewProps & react.RefAttributes<WebView<{}>>>;
35
+ declare const LorikeetWidgetHeader: ({ title, style, icon, onIconPress, }: LorikeetWidgetHeaderProps) => react_jsx_runtime.JSX.Element;
34
36
  declare function LorikeetWidgetView({ publicKey, baseUrl, authToken, customisations, styles, onWebViewMessage, }: LorikeetWidgetViewProps): react_jsx_runtime.JSX.Element | null;
35
37
 
36
38
  declare class LorikeetClient {
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- import { useState, useEffect } from 'react';
2
- import { MessageCirclePlusIcon } from 'lucide-react-native';
3
- import { StyleSheet, Linking, View, Text } from 'react-native';
1
+ import { forwardRef, useState, useRef, useEffect } from 'react';
2
+ import { StyleSheet, Linking, View, Text, TouchableOpacity } from 'react-native';
4
3
  import { SafeAreaView } from 'react-native-safe-area-context';
5
4
  import { WebView } from 'react-native-webview';
5
+ import Svg, { Path, Line } from 'react-native-svg';
6
6
  import { jsx, jsxs } from 'react/jsx-runtime';
7
7
 
8
8
  var __defProp = Object.defineProperty;
@@ -49,6 +49,48 @@ var LorikeetClient = class {
49
49
  }
50
50
  }
51
51
  };
52
+ var MessageCirclePlusIcon = ({
53
+ size = 24,
54
+ color = "currentColor",
55
+ strokeWidth = 2
56
+ }) => {
57
+ return /* @__PURE__ */ jsxs(Svg, { fill: "none", height: size, viewBox: "0 0 24 24", width: size, children: [
58
+ /* @__PURE__ */ jsx(
59
+ Path,
60
+ {
61
+ d: "M7.9 20A9 9 0 1 0 4 16.1L2 22Z",
62
+ stroke: color,
63
+ strokeLinecap: "round",
64
+ strokeLinejoin: "round",
65
+ strokeWidth
66
+ }
67
+ ),
68
+ /* @__PURE__ */ jsx(
69
+ Line,
70
+ {
71
+ stroke: color,
72
+ strokeLinecap: "round",
73
+ strokeWidth,
74
+ x1: "12",
75
+ x2: "12",
76
+ y1: "8",
77
+ y2: "16"
78
+ }
79
+ ),
80
+ /* @__PURE__ */ jsx(
81
+ Line,
82
+ {
83
+ stroke: color,
84
+ strokeLinecap: "round",
85
+ strokeWidth,
86
+ x1: "8",
87
+ x2: "16",
88
+ y1: "12",
89
+ y2: "12"
90
+ }
91
+ )
92
+ ] });
93
+ };
52
94
  var stylesheet = StyleSheet.create({
53
95
  root: { flex: 1, backgroundColor: "#fff" },
54
96
  container: {
@@ -63,7 +105,12 @@ var stylesheet = StyleSheet.create({
63
105
  },
64
106
  header: {
65
107
  padding: 16,
66
- justifyContent: "center"
108
+ display: "flex",
109
+ flexDirection: "row",
110
+ justifyContent: "space-between"
111
+ },
112
+ headerIcon: {
113
+ width: 24
67
114
  },
68
115
  headerText: {
69
116
  textAlign: "center",
@@ -73,11 +120,7 @@ var stylesheet = StyleSheet.create({
73
120
  flex: 1
74
121
  }
75
122
  });
76
- var LorikeetWidgetWebView = ({
77
- uri,
78
- baseUrl = "https://chat.lorikeetcx.ai",
79
- webviewProps = {}
80
- }) => {
123
+ var LorikeetWidgetWebView = forwardRef(({ uri, baseUrl = "https://chat.lorikeetcx.ai", webviewProps = {} }, ref) => {
81
124
  return /* @__PURE__ */ jsx(
82
125
  WebView,
83
126
  {
@@ -90,21 +133,25 @@ var LorikeetWidgetWebView = ({
90
133
  return false;
91
134
  }
92
135
  },
136
+ ref,
93
137
  source: {
94
138
  uri
95
139
  },
96
140
  style: stylesheet.webView
97
141
  }
98
142
  );
99
- };
143
+ });
144
+ LorikeetWidgetWebView.displayName = "LorikeetWidgetWebView";
100
145
  var LorikeetWidgetHeader = ({
101
146
  title,
102
147
  style,
103
- icon = /* @__PURE__ */ jsx(MessageCirclePlusIcon, {})
148
+ icon = /* @__PURE__ */ jsx(MessageCirclePlusIcon, { size: 16 }),
149
+ onIconPress
104
150
  }) => {
105
151
  return /* @__PURE__ */ jsxs(View, { style: stylesheet.header, children: [
152
+ /* @__PURE__ */ jsx(View, { style: stylesheet.headerIcon }),
106
153
  /* @__PURE__ */ jsx(Text, { style: [stylesheet.headerText, style], children: title }),
107
- icon
154
+ /* @__PURE__ */ jsx(TouchableOpacity, { onPress: onIconPress, style: stylesheet.headerIcon, children: icon })
108
155
  ] });
109
156
  };
110
157
  function LorikeetWidgetView({
@@ -119,6 +166,9 @@ function LorikeetWidgetView({
119
166
  const [lorikeetClient, setLorikeetClient] = useState(
120
167
  null
121
168
  );
169
+ const [uri, setUri] = useState(null);
170
+ const [timestamp, setTimestamp] = useState(Date.now());
171
+ const webViewRef = useRef(null);
122
172
  useEffect(() => {
123
173
  const lorikeetClient2 = new LorikeetClient({
124
174
  public_key: publicKey,
@@ -129,14 +179,22 @@ function LorikeetWidgetView({
129
179
  }
130
180
  });
131
181
  setLorikeetClient(lorikeetClient2);
182
+ setUri(
183
+ lorikeetClient2.getWebviewUrl({
184
+ token: authToken
185
+ })
186
+ );
132
187
  }, [publicKey, baseUrl]);
133
- if (!lorikeetClient) {
188
+ if (!lorikeetClient || !uri) {
134
189
  return null;
135
190
  }
136
191
  return /* @__PURE__ */ jsx(SafeAreaView, { edges: ["top", "left", "right"], style: stylesheet.root, children: /* @__PURE__ */ jsxs(View, { style: stylesheet.container, children: [
137
192
  /* @__PURE__ */ jsx(
138
193
  LorikeetWidgetHeader,
139
194
  {
195
+ onIconPress: () => {
196
+ setTimestamp(Date.now());
197
+ },
140
198
  style: styles == null ? void 0 : styles.header,
141
199
  title: (_a = customisations == null ? void 0 : customisations.title) != null ? _a : "Lorikeet AI Agent"
142
200
  }
@@ -145,9 +203,8 @@ function LorikeetWidgetView({
145
203
  LorikeetWidgetWebView,
146
204
  {
147
205
  baseUrl: lorikeetClient.baseUrl,
148
- uri: lorikeetClient.getWebviewUrl({
149
- token: authToken
150
- }),
206
+ ref: webViewRef,
207
+ uri,
151
208
  webviewProps: {
152
209
  onMessage: onWebViewMessage,
153
210
  allowsInlineMediaPlayback: true,
@@ -156,7 +213,8 @@ function LorikeetWidgetView({
156
213
  startInLoadingState: true,
157
214
  style: stylesheet.webView
158
215
  }
159
- }
216
+ },
217
+ timestamp
160
218
  )
161
219
  ] }) });
162
220
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/widget.tsx"],"names":["lorikeetClient"],"mappings":"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","file":"index.js","sourcesContent":["import type { Customisations } from '@lorikeetai/web-sdk/types'\n\nimport type { LorikeetInitOptions } from './types'\n\nexport class LorikeetClient {\n baseUrl: string = 'https://chat.lorikeetcx.ai' // Fallback URL\n customisations: Customisations | null = null\n publicKey: string\n\n constructor({ customisations, api_base, public_key }: LorikeetInitOptions) {\n if (api_base) {\n this.baseUrl = api_base\n }\n this.publicKey = public_key\n\n if (customisations) {\n this.customisations = customisations\n }\n }\n\n getWebviewUrl = ({\n customer_email,\n customer_name,\n token,\n ticket_id,\n }: {\n customer_email?: string\n customer_name?: string\n token: string\n ticket_id?: string\n }) => {\n const url = new URL(this.baseUrl)\n\n url.pathname = ticket_id\n ? `/tickets/${this.publicKey}/${ticket_id}`\n : '/widget'\n url.searchParams.append('public_key', this.publicKey)\n\n if (customer_email) {\n url.searchParams.append('customer_email', customer_email)\n }\n if (customer_name) {\n url.searchParams.append('customer_name', customer_name)\n }\n\n url.searchParams.append('token', token)\n\n if (this.customisations) {\n url.searchParams.append(\n 'customisations',\n btoa(JSON.stringify(this.customisations)),\n )\n }\n\n return url.toString()\n }\n}\n","import { useEffect, useState } from 'react'\n\nimport { MessageCirclePlusIcon } from 'lucide-react-native'\nimport { Linking, StyleSheet, Text, View } from 'react-native'\nimport { SafeAreaView } from 'react-native-safe-area-context'\nimport { WebView } from 'react-native-webview'\n\nimport { LorikeetClient } from './client'\nimport type {\n LorikeetWidgetHeaderProps,\n LorikeetWidgetViewProps,\n LorikeetWidgetWebViewProps,\n} from './types'\n\nconst stylesheet = StyleSheet.create({\n root: { flex: 1, backgroundColor: '#fff' },\n container: {\n flex: 1,\n borderRadius: 8,\n overflow: 'hidden',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.1,\n shadowRadius: 4,\n elevation: 3,\n },\n header: {\n padding: 16,\n justifyContent: 'center',\n },\n headerText: {\n textAlign: 'center',\n fontSize: 16,\n },\n webView: {\n flex: 1,\n },\n})\n\nexport const LorikeetWidgetWebView = ({\n uri,\n baseUrl = 'https://chat.lorikeetcx.ai',\n webviewProps = {},\n}: LorikeetWidgetWebViewProps) => {\n return (\n <WebView\n {...webviewProps}\n onNavigationStateChange={(navState) => {\n if (navState.url.includes(baseUrl)) {\n return false\n } else {\n void Linking.openURL(navState.url)\n return false\n }\n }}\n source={{\n uri,\n }}\n style={stylesheet.webView}\n />\n )\n}\n\nexport const LorikeetWidgetHeader = ({\n title,\n style,\n icon = <MessageCirclePlusIcon />,\n}: LorikeetWidgetHeaderProps) => {\n return (\n <View style={stylesheet.header}>\n <Text style={[stylesheet.headerText, style]}>{title}</Text>\n {icon}\n </View>\n )\n}\n\nexport function LorikeetWidgetView({\n publicKey,\n baseUrl,\n authToken,\n customisations,\n styles,\n onWebViewMessage,\n}: LorikeetWidgetViewProps) {\n const [lorikeetClient, setLorikeetClient] = useState<LorikeetClient | null>(\n null,\n )\n\n useEffect(() => {\n const lorikeetClient = new LorikeetClient({\n public_key: publicKey,\n api_base: baseUrl,\n customisations: {\n ...customisations,\n hideHeader:\n customisations?.hideHeader === undefined\n ? true\n : customisations.hideHeader,\n },\n })\n setLorikeetClient(lorikeetClient)\n }, [publicKey, baseUrl])\n\n if (!lorikeetClient) {\n return null\n }\n\n return (\n <SafeAreaView edges={['top', 'left', 'right']} style={stylesheet.root}>\n <View style={stylesheet.container}>\n <LorikeetWidgetHeader\n style={styles?.header}\n title={customisations?.title ?? 'Lorikeet AI Agent'}\n />\n <LorikeetWidgetWebView\n baseUrl={lorikeetClient.baseUrl}\n uri={lorikeetClient.getWebviewUrl({\n token: authToken,\n })}\n webviewProps={{\n onMessage: onWebViewMessage,\n allowsInlineMediaPlayback: true,\n mediaPlaybackRequiresUserAction: false,\n scalesPageToFit: true,\n startInLoadingState: true,\n style: stylesheet.webView,\n }}\n />\n </View>\n </SafeAreaView>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/client.ts","../src/message-circle-plus-icon.tsx","../src/widget.tsx"],"names":["jsx","jsxs","lorikeetClient"],"mappings":";;;;;;;;;;;;AAIO,IAAM,iBAAN,MAAqB;AAAA,EAK1B,WAAY,CAAA,EAAE,cAAgB,EAAA,QAAA,EAAU,YAAmC,EAAA;AAJ3E,IAAkB,aAAA,CAAA,IAAA,EAAA,SAAA,EAAA,4BAAA,CAAA,CAAA;AAClB;AAAA,IAAwC,aAAA,CAAA,IAAA,EAAA,gBAAA,EAAA,IAAA,CAAA,CAAA;AACxC,IAAA,aAAA,CAAA,IAAA,EAAA,WAAA,CAAA,CAAA;AAaA,IAAA,aAAA,CAAA,IAAA,EAAA,eAAA,EAAgB,CAAC;AAAA,MACf,cAAA;AAAA,MACA,aAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA;AAAA,KAMI,KAAA;AACJ,MAAA,MAAM,GAAM,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,OAAO,CAAA,CAAA;AAEhC,MAAA,GAAA,CAAI,WAAW,SACX,GAAA,CAAA,SAAA,EAAY,KAAK,SAAS,CAAA,CAAA,EAAI,SAAS,CACvC,CAAA,GAAA,SAAA,CAAA;AACJ,MAAA,GAAA,CAAI,YAAa,CAAA,MAAA,CAAO,YAAc,EAAA,IAAA,CAAK,SAAS,CAAA,CAAA;AAEpD,MAAA,IAAI,cAAgB,EAAA;AAClB,QAAI,GAAA,CAAA,YAAA,CAAa,MAAO,CAAA,gBAAA,EAAkB,cAAc,CAAA,CAAA;AAAA,OAC1D;AACA,MAAA,IAAI,aAAe,EAAA;AACjB,QAAI,GAAA,CAAA,YAAA,CAAa,MAAO,CAAA,eAAA,EAAiB,aAAa,CAAA,CAAA;AAAA,OACxD;AAEA,MAAI,GAAA,CAAA,YAAA,CAAa,MAAO,CAAA,OAAA,EAAS,KAAK,CAAA,CAAA;AAEtC,MAAA,IAAI,KAAK,cAAgB,EAAA;AACvB,QAAA,GAAA,CAAI,YAAa,CAAA,MAAA;AAAA,UACf,gBAAA;AAAA,UACA,IAAK,CAAA,IAAA,CAAK,SAAU,CAAA,IAAA,CAAK,cAAc,CAAC,CAAA;AAAA,SAC1C,CAAA;AAAA,OACF;AAEA,MAAA,OAAO,IAAI,QAAS,EAAA,CAAA;AAAA,KACtB,CAAA,CAAA;AA7CE,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,IAAA,CAAK,OAAU,GAAA,QAAA,CAAA;AAAA,KACjB;AACA,IAAA,IAAA,CAAK,SAAY,GAAA,UAAA,CAAA;AAEjB,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAA,IAAA,CAAK,cAAiB,GAAA,cAAA,CAAA;AAAA,KACxB;AAAA,GACF;AAsCF,EAAA;AChDO,IAAM,wBAAwB,CAAC;AAAA,EACpC,IAAO,GAAA,EAAA;AAAA,EACP,KAAQ,GAAA,cAAA;AAAA,EACR,WAAc,GAAA,CAAA;AAChB,CAAkC,KAAA;AAChC,EACE,uBAAA,IAAA,CAAC,OAAI,IAAK,EAAA,MAAA,EAAO,QAAQ,IAAM,EAAA,OAAA,EAAQ,WAAY,EAAA,KAAA,EAAO,IACxD,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,CAAE,EAAA,gCAAA;AAAA,QACF,MAAQ,EAAA,KAAA;AAAA,QACR,aAAc,EAAA,OAAA;AAAA,QACd,cAAe,EAAA,OAAA;AAAA,QACf,WAAA;AAAA,OAAA;AAAA,KACF;AAAA,oBACA,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,MAAQ,EAAA,KAAA;AAAA,QACR,aAAc,EAAA,OAAA;AAAA,QACd,WAAA;AAAA,QACA,EAAG,EAAA,IAAA;AAAA,QACH,EAAG,EAAA,IAAA;AAAA,QACH,EAAG,EAAA,GAAA;AAAA,QACH,EAAG,EAAA,IAAA;AAAA,OAAA;AAAA,KACL;AAAA,oBACA,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,MAAQ,EAAA,KAAA;AAAA,QACR,aAAc,EAAA,OAAA;AAAA,QACd,WAAA;AAAA,QACA,EAAG,EAAA,GAAA;AAAA,QACH,EAAG,EAAA,IAAA;AAAA,QACH,EAAG,EAAA,IAAA;AAAA,QACH,EAAG,EAAA,IAAA;AAAA,OAAA;AAAA,KACL;AAAA,GACF,EAAA,CAAA,CAAA;AAEJ,CAAA,CAAA;AC5BA,IAAM,UAAA,GAAa,WAAW,MAAO,CAAA;AAAA,EACnC,IAAM,EAAA,EAAE,IAAM,EAAA,CAAA,EAAG,iBAAiB,MAAO,EAAA;AAAA,EACzC,SAAW,EAAA;AAAA,IACT,IAAM,EAAA,CAAA;AAAA,IACN,YAAc,EAAA,CAAA;AAAA,IACd,QAAU,EAAA,QAAA;AAAA,IACV,WAAa,EAAA,MAAA;AAAA,IACb,YAAc,EAAA,EAAE,KAAO,EAAA,CAAA,EAAG,QAAQ,CAAE,EAAA;AAAA,IACpC,aAAe,EAAA,GAAA;AAAA,IACf,YAAc,EAAA,CAAA;AAAA,IACd,SAAW,EAAA,CAAA;AAAA,GACb;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,OAAS,EAAA,EAAA;AAAA,IACT,OAAS,EAAA,MAAA;AAAA,IACT,aAAe,EAAA,KAAA;AAAA,IACf,cAAgB,EAAA,eAAA;AAAA,GAClB;AAAA,EACA,UAAY,EAAA;AAAA,IACV,KAAO,EAAA,EAAA;AAAA,GACT;AAAA,EACA,UAAY,EAAA;AAAA,IACV,SAAW,EAAA,QAAA;AAAA,IACX,QAAU,EAAA,EAAA;AAAA,GACZ;AAAA,EACA,OAAS,EAAA;AAAA,IACP,IAAM,EAAA,CAAA;AAAA,GACR;AACF,CAAC,CAAA,CAAA;AAEY,IAAA,qBAAA,GAAwB,UAGnC,CAAA,CAAC,EAAE,GAAA,EAAK,OAAU,GAAA,4BAAA,EAA8B,YAAe,GAAA,EAAG,EAAA,EAAG,GAAQ,KAAA;AAC7E,EAAA,uBACEA,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACE,GAAG,YAAA;AAAA,MACJ,uBAAA,EAAyB,CAAC,QAAa,KAAA;AACrC,QAAA,IAAI,QAAS,CAAA,GAAA,CAAI,QAAS,CAAA,OAAO,CAAG,EAAA;AAClC,UAAO,OAAA,KAAA,CAAA;AAAA,SACF,MAAA;AACL,UAAK,KAAA,OAAA,CAAQ,OAAQ,CAAA,QAAA,CAAS,GAAG,CAAA,CAAA;AACjC,UAAO,OAAA,KAAA,CAAA;AAAA,SACT;AAAA,OACF;AAAA,MACA,GAAA;AAAA,MACA,MAAQ,EAAA;AAAA,QACN,GAAA;AAAA,OACF;AAAA,MACA,OAAO,UAAW,CAAA,OAAA;AAAA,KAAA;AAAA,GACpB,CAAA;AAEJ,CAAC,EAAA;AACD,qBAAA,CAAsB,WAAc,GAAA,uBAAA,CAAA;AAE7B,IAAM,uBAAuB,CAAC;AAAA,EACnC,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAO,mBAAAA,GAAC,CAAA,qBAAA,EAAA,EAAsB,MAAM,EAAI,EAAA,CAAA;AAAA,EACxC,WAAA;AACF,CAAiC,KAAA;AAC/B,EAAA,uBACEC,IAAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,WAAW,MACtB,EAAA,QAAA,EAAA;AAAA,oBAAAD,GAAC,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,UAAA,CAAW,UAAY,EAAA,CAAA;AAAA,oBACpCA,IAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,UAAW,CAAA,UAAA,EAAY,KAAK,CAAA,EAAI,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA,oBACpDA,IAAC,gBAAiB,EAAA,EAAA,OAAA,EAAS,aAAa,KAAO,EAAA,UAAA,CAAW,YACvD,QACH,EAAA,IAAA,EAAA,CAAA;AAAA,GACF,EAAA,CAAA,CAAA;AAEJ,EAAA;AAEO,SAAS,kBAAmB,CAAA;AAAA,EACjC,SAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,MAAA;AAAA,EACA,gBAAA;AACF,CAA4B,EAAA;AA7F5B,EAAA,IAAA,EAAA,CAAA;AA8FE,EAAM,MAAA,CAAC,cAAgB,EAAA,iBAAiB,CAAI,GAAA,QAAA;AAAA,IAC1C,IAAA;AAAA,GACF,CAAA;AACA,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAI,SAAwB,IAAI,CAAA,CAAA;AAClD,EAAA,MAAM,CAAC,SAAW,EAAA,YAAY,IAAI,QAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAA;AAC7D,EAAM,MAAA,UAAA,GAAa,OAAgB,IAAI,CAAA,CAAA;AAEvC,EAAA,SAAA,CAAU,MAAM;AACd,IAAME,MAAAA,eAAAA,GAAiB,IAAI,cAAe,CAAA;AAAA,MACxC,UAAY,EAAA,SAAA;AAAA,MACZ,QAAU,EAAA,OAAA;AAAA,MACV,cAAgB,EAAA;AAAA,QACd,GAAG,cAAA;AAAA,QACH,UACE,EAAA,CAAA,cAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,cAAA,CAAgB,UAAe,MAAA,KAAA,CAAA,GAC3B,OACA,cAAe,CAAA,UAAA;AAAA,OACvB;AAAA,KACD,CAAA,CAAA;AACD,IAAA,iBAAA,CAAkBA,eAAc,CAAA,CAAA;AAChC,IAAA,MAAA;AAAA,MACEA,gBAAe,aAAc,CAAA;AAAA,QAC3B,KAAO,EAAA,SAAA;AAAA,OACR,CAAA;AAAA,KACH,CAAA;AAAA,GACC,EAAA,CAAC,SAAW,EAAA,OAAO,CAAC,CAAA,CAAA;AAEvB,EAAI,IAAA,CAAC,cAAkB,IAAA,CAAC,GAAK,EAAA;AAC3B,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAA,uBACEF,GAAC,CAAA,YAAA,EAAA,EAAa,KAAO,EAAA,CAAC,OAAO,MAAQ,EAAA,OAAO,CAAG,EAAA,KAAA,EAAO,WAAW,IAC/D,EAAA,QAAA,kBAAAC,KAAC,IAAK,EAAA,EAAA,KAAA,EAAO,WAAW,SACtB,EAAA,QAAA,EAAA;AAAA,oBAAAD,GAAAA;AAAA,MAAC,oBAAA;AAAA,MAAA;AAAA,QACC,aAAa,MAAM;AACjB,UAAa,YAAA,CAAA,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,SACzB;AAAA,QACA,OAAO,MAAQ,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,MAAA,CAAA,MAAA;AAAA,QACf,KAAA,EAAA,CAAO,EAAgB,GAAA,cAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,cAAA,CAAA,KAAA,KAAhB,IAAyB,GAAA,EAAA,GAAA,mBAAA;AAAA,OAAA;AAAA,KAClC;AAAA,oBACAA,GAAAA;AAAA,MAAC,qBAAA;AAAA,MAAA;AAAA,QACC,SAAS,cAAe,CAAA,OAAA;AAAA,QAExB,GAAK,EAAA,UAAA;AAAA,QACL,GAAA;AAAA,QACA,YAAc,EAAA;AAAA,UACZ,SAAW,EAAA,gBAAA;AAAA,UACX,yBAA2B,EAAA,IAAA;AAAA,UAC3B,+BAAiC,EAAA,KAAA;AAAA,UACjC,eAAiB,EAAA,IAAA;AAAA,UACjB,mBAAqB,EAAA,IAAA;AAAA,UACrB,OAAO,UAAW,CAAA,OAAA;AAAA,SACpB;AAAA,OAAA;AAAA,MAVK,SAAA;AAAA,KAWP;AAAA,GAAA,EACF,CACF,EAAA,CAAA,CAAA;AAEJ","file":"index.js","sourcesContent":["import type { Customisations } from '@lorikeetai/web-sdk/types'\n\nimport type { LorikeetInitOptions } from './types'\n\nexport class LorikeetClient {\n baseUrl: string = 'https://chat.lorikeetcx.ai' // Fallback URL\n customisations: Customisations | null = null\n publicKey: string\n\n constructor({ customisations, api_base, public_key }: LorikeetInitOptions) {\n if (api_base) {\n this.baseUrl = api_base\n }\n this.publicKey = public_key\n\n if (customisations) {\n this.customisations = customisations\n }\n }\n\n getWebviewUrl = ({\n customer_email,\n customer_name,\n token,\n ticket_id,\n }: {\n customer_email?: string\n customer_name?: string\n token: string\n ticket_id?: string\n }) => {\n const url = new URL(this.baseUrl)\n\n url.pathname = ticket_id\n ? `/tickets/${this.publicKey}/${ticket_id}`\n : '/widget'\n url.searchParams.append('public_key', this.publicKey)\n\n if (customer_email) {\n url.searchParams.append('customer_email', customer_email)\n }\n if (customer_name) {\n url.searchParams.append('customer_name', customer_name)\n }\n\n url.searchParams.append('token', token)\n\n if (this.customisations) {\n url.searchParams.append(\n 'customisations',\n btoa(JSON.stringify(this.customisations)),\n )\n }\n\n return url.toString()\n }\n}\n","import Svg, { Line, Path } from 'react-native-svg'\n\ninterface MessageCirclePlusIconProps {\n color?: string\n size?: number\n strokeWidth?: number\n}\n\nexport const MessageCirclePlusIcon = ({\n size = 24,\n color = 'currentColor',\n strokeWidth = 2,\n}: MessageCirclePlusIconProps) => {\n return (\n <Svg fill=\"none\" height={size} viewBox=\"0 0 24 24\" width={size}>\n <Path\n d=\"M7.9 20A9 9 0 1 0 4 16.1L2 22Z\"\n stroke={color}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={strokeWidth}\n />\n <Line\n stroke={color}\n strokeLinecap=\"round\"\n strokeWidth={strokeWidth}\n x1=\"12\"\n x2=\"12\"\n y1=\"8\"\n y2=\"16\"\n />\n <Line\n stroke={color}\n strokeLinecap=\"round\"\n strokeWidth={strokeWidth}\n x1=\"8\"\n x2=\"16\"\n y1=\"12\"\n y2=\"12\"\n />\n </Svg>\n )\n}\n","import { forwardRef, useEffect, useRef, useState } from 'react'\n\nimport { Linking, StyleSheet, Text, TouchableOpacity, View } from 'react-native'\nimport { SafeAreaView } from 'react-native-safe-area-context'\nimport { WebView } from 'react-native-webview'\n\nimport { LorikeetClient } from './client'\nimport { MessageCirclePlusIcon } from './message-circle-plus-icon'\nimport type {\n LorikeetWidgetHeaderProps,\n LorikeetWidgetViewProps,\n LorikeetWidgetWebViewProps,\n} from './types'\n\nconst stylesheet = StyleSheet.create({\n root: { flex: 1, backgroundColor: '#fff' },\n container: {\n flex: 1,\n borderRadius: 8,\n overflow: 'hidden',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.1,\n shadowRadius: 4,\n elevation: 3,\n },\n header: {\n padding: 16,\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n headerIcon: {\n width: 24,\n },\n headerText: {\n textAlign: 'center',\n fontSize: 16,\n },\n webView: {\n flex: 1,\n },\n})\n\nexport const LorikeetWidgetWebView = forwardRef<\n WebView,\n LorikeetWidgetWebViewProps\n>(({ uri, baseUrl = 'https://chat.lorikeetcx.ai', webviewProps = {} }, ref) => {\n return (\n <WebView\n {...webviewProps}\n onNavigationStateChange={(navState) => {\n if (navState.url.includes(baseUrl)) {\n return false\n } else {\n void Linking.openURL(navState.url)\n return false\n }\n }}\n ref={ref}\n source={{\n uri,\n }}\n style={stylesheet.webView}\n />\n )\n})\nLorikeetWidgetWebView.displayName = 'LorikeetWidgetWebView'\n\nexport const LorikeetWidgetHeader = ({\n title,\n style,\n icon = <MessageCirclePlusIcon size={16} />,\n onIconPress,\n}: LorikeetWidgetHeaderProps) => {\n return (\n <View style={stylesheet.header}>\n <View style={stylesheet.headerIcon} />\n <Text style={[stylesheet.headerText, style]}>{title}</Text>\n <TouchableOpacity onPress={onIconPress} style={stylesheet.headerIcon}>\n {icon}\n </TouchableOpacity>\n </View>\n )\n}\n\nexport function LorikeetWidgetView({\n publicKey,\n baseUrl,\n authToken,\n customisations,\n styles,\n onWebViewMessage,\n}: LorikeetWidgetViewProps) {\n const [lorikeetClient, setLorikeetClient] = useState<LorikeetClient | null>(\n null,\n )\n const [uri, setUri] = useState<string | null>(null)\n const [timestamp, setTimestamp] = useState<number>(Date.now())\n const webViewRef = useRef<WebView>(null)\n\n useEffect(() => {\n const lorikeetClient = new LorikeetClient({\n public_key: publicKey,\n api_base: baseUrl,\n customisations: {\n ...customisations,\n hideHeader:\n customisations?.hideHeader === undefined\n ? true\n : customisations.hideHeader,\n },\n })\n setLorikeetClient(lorikeetClient)\n setUri(\n lorikeetClient.getWebviewUrl({\n token: authToken,\n }),\n )\n }, [publicKey, baseUrl])\n\n if (!lorikeetClient || !uri) {\n return null\n }\n\n return (\n <SafeAreaView edges={['top', 'left', 'right']} style={stylesheet.root}>\n <View style={stylesheet.container}>\n <LorikeetWidgetHeader\n onIconPress={() => {\n setTimestamp(Date.now())\n }}\n style={styles?.header}\n title={customisations?.title ?? 'Lorikeet AI Agent'}\n />\n <LorikeetWidgetWebView\n baseUrl={lorikeetClient.baseUrl}\n key={timestamp}\n ref={webViewRef}\n uri={uri}\n webviewProps={{\n onMessage: onWebViewMessage,\n allowsInlineMediaPlayback: true,\n mediaPlaybackRequiresUserAction: false,\n scalesPageToFit: true,\n startInLoadingState: true,\n style: stylesheet.webView,\n }}\n />\n </View>\n </SafeAreaView>\n )\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lorikeetai/react-native-sdk",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "description": "LorikeetCX React Native widget for embedding the chat widget via WebView",
@@ -30,7 +30,6 @@
30
30
  }
31
31
  },
32
32
  "dependencies": {
33
- "lucide-react-native": "^0.544.0",
34
33
  "react-native-webview": "13.15.0",
35
34
  "react-native-safe-area-context": "~5.6.0",
36
35
  "react-native-svg": "^15.13.0"
@@ -45,10 +44,10 @@
45
44
  "rimraf": "^6.0.1",
46
45
  "tsup": "^8.3.5",
47
46
  "typescript": "^5.7.2",
48
- "@lorikeetai/prettier-config": "1.0.0",
49
47
  "@lorikeetai/eslint-config": "1.0.0",
50
48
  "@lorikeetai/tsconfig": "1.0.0",
51
- "@lorikeetai/web-sdk": "1.5.1"
49
+ "@lorikeetai/prettier-config": "1.0.0",
50
+ "@lorikeetai/web-sdk": "1.7.0"
52
51
  },
53
52
  "publishConfig": {
54
53
  "access": "public"