@duffel/react-native-components-assistant 0.5.1 → 0.5.2-canary.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.
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
- import React from 'react';
4
- import { Linking, Modal, Platform, StyleSheet, View } from 'react-native';
3
+ import React, { useEffect, useState } from 'react';
4
+ import { Keyboard, Linking, Modal, Platform, StyleSheet, View } from 'react-native';
5
5
  import { WebView } from 'react-native-webview';
6
6
  import { hasJsonWebTokenFormat } from "./lib/hasJsonWebTokenFormat.js";
7
7
  import { getClientKeyPayload } from "./lib/getClientKeyPayload.js";
@@ -22,6 +22,26 @@ export const DuffelAssistant = ({
22
22
  onNewMessage,
23
23
  ...properties
24
24
  }) => {
25
+ const [androidKeyboardHeight, setAndroidKeyboardHeight] = useState(0);
26
+ useEffect(() => {
27
+ if (Platform.OS !== 'android') {
28
+ return;
29
+ }
30
+ if (!isOpen) {
31
+ setAndroidKeyboardHeight(0);
32
+ return;
33
+ }
34
+ const keyboardDidShowSubscription = Keyboard.addListener('keyboardDidShow', event => {
35
+ setAndroidKeyboardHeight(event.endCoordinates?.height ?? 0);
36
+ });
37
+ const keyboardDidHideSubscription = Keyboard.addListener('keyboardDidHide', () => {
38
+ setAndroidKeyboardHeight(0);
39
+ });
40
+ return () => {
41
+ keyboardDidShowSubscription.remove();
42
+ keyboardDidHideSubscription.remove();
43
+ };
44
+ }, [isOpen]);
25
45
  if (!hasJsonWebTokenFormat(properties.clientKey)) {
26
46
  throw new Error('Duffel Assistant client key format must be a valid JWT.');
27
47
  }
@@ -78,13 +98,49 @@ export const DuffelAssistant = ({
78
98
  Linking.openURL(request.url).catch(() => {});
79
99
  return false;
80
100
  };
101
+ if (Platform.OS === 'android') {
102
+ return /*#__PURE__*/_jsx(Modal, {
103
+ visible: isOpen,
104
+ onRequestClose: () => onClose(),
105
+ animationType: "slide",
106
+ children: /*#__PURE__*/_jsx(View, {
107
+ style: [styles.androidContainer, {
108
+ paddingBottom: 15 + androidKeyboardHeight
109
+ }],
110
+ children: /*#__PURE__*/_jsx(WebView
111
+ // Required for Android
112
+ , {
113
+ injectedJavaScript: `
114
+ postMessage(
115
+ {
116
+ type: "duffel-assistant-open",
117
+ properties: ${JSON.stringify(properties)},
118
+ },
119
+ "*",
120
+ );
121
+ true;`,
122
+ source: {
123
+ uri: assistantIframeUrl
124
+ },
125
+ onMessage: handleMessage,
126
+ onShouldStartLoadWithRequest: handleShouldStartLoadWithRequest
127
+ // Always fetch the latest assistant bundle. The iframe.html shell
128
+ // references `./iframe-app.js` by a stable path, so without this
129
+ // the system WebView can serve a stale bundle for a long time.
130
+ ,
131
+ cacheEnabled: false,
132
+ cacheMode: "LOAD_NO_CACHE"
133
+ })
134
+ })
135
+ });
136
+ }
81
137
  return /*#__PURE__*/_jsx(Modal, {
82
138
  visible: isOpen,
83
139
  onRequestClose: () => onClose(),
84
140
  animationType: "slide",
85
141
  children: /*#__PURE__*/_jsx(View, {
86
142
  style: styles.container,
87
- children: Platform.OS === 'ios' ? /*#__PURE__*/_jsx(WebView, {
143
+ children: /*#__PURE__*/_jsx(WebView, {
88
144
  injectedJavaScriptObject: properties
89
145
  // When you are running this in development iOS doesn't allow request from hosts with invalid https certificates.
90
146
  // If you try ngrok with the local esbuild server it will fail because ngrok requests in https and the dev server rejects http requests.
@@ -101,29 +157,6 @@ export const DuffelAssistant = ({
101
157
  // the system WebView can serve a stale bundle for a long time.
102
158
  ,
103
159
  cacheEnabled: false
104
- }) : /*#__PURE__*/_jsx(WebView
105
- // Required for Android
106
- , {
107
- injectedJavaScript: `
108
- postMessage(
109
- {
110
- type: "duffel-assistant-open",
111
- properties: ${JSON.stringify(properties)},
112
- },
113
- "*",
114
- );
115
- true;`,
116
- source: {
117
- uri: assistantIframeUrl
118
- },
119
- onMessage: handleMessage,
120
- onShouldStartLoadWithRequest: handleShouldStartLoadWithRequest
121
- // Always fetch the latest assistant bundle. The iframe.html shell
122
- // references `./iframe-app.js` by a stable path, so without this
123
- // the system WebView can serve a stale bundle for a long time.
124
- ,
125
- cacheEnabled: false,
126
- cacheMode: "LOAD_NO_CACHE"
127
160
  })
128
161
  })
129
162
  });
@@ -135,6 +168,12 @@ const styles = StyleSheet.create({
135
168
  paddingHorizontal: 12,
136
169
  paddingTop: 50,
137
170
  paddingBottom: 30
171
+ },
172
+ androidContainer: {
173
+ flex: 1,
174
+ width: '100%',
175
+ paddingTop: 45,
176
+ paddingBottom: 15
138
177
  }
139
178
  });
140
179
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","Linking","Modal","Platform","StyleSheet","View","WebView","hasJsonWebTokenFormat","getClientKeyPayload","jsx","_jsx","assistantIframeUrl","isHttpUrl","url","test","isAssistantIframeUrl","parsedUrl","URL","origin","pathname","error","DuffelAssistant","isOpen","onClose","onNewMessage","properties","clientKey","Error","clientKeyPayload","clientKeyIncludesResource","order_id","undefined","booking_id","cars_booking_id","issueType","console","warn","context","supportChannels","chat","showMinimiseButton","onMinimise","handleMessage","event","nativeEvent","data","parsedData","JSON","parse","type","userId","resourceId","handleShouldStartLoadWithRequest","request","OS","navigationType","openURL","catch","visible","onRequestClose","animationType","children","style","styles","container","injectedJavaScriptObject","source","uri","onMessage","onShouldStartLoadWithRequest","cacheEnabled","injectedJavaScript","stringify","cacheMode","create","height","width","paddingHorizontal","paddingTop","paddingBottom"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","useEffect","useState","Keyboard","Linking","Modal","Platform","StyleSheet","View","WebView","hasJsonWebTokenFormat","getClientKeyPayload","jsx","_jsx","assistantIframeUrl","isHttpUrl","url","test","isAssistantIframeUrl","parsedUrl","URL","origin","pathname","error","DuffelAssistant","isOpen","onClose","onNewMessage","properties","androidKeyboardHeight","setAndroidKeyboardHeight","OS","keyboardDidShowSubscription","addListener","event","endCoordinates","height","keyboardDidHideSubscription","remove","clientKey","Error","clientKeyPayload","clientKeyIncludesResource","order_id","undefined","booking_id","cars_booking_id","issueType","console","warn","context","supportChannels","chat","showMinimiseButton","onMinimise","handleMessage","nativeEvent","data","parsedData","JSON","parse","type","userId","resourceId","handleShouldStartLoadWithRequest","request","navigationType","openURL","catch","visible","onRequestClose","animationType","children","style","styles","androidContainer","paddingBottom","injectedJavaScript","stringify","source","uri","onMessage","onShouldStartLoadWithRequest","cacheEnabled","cacheMode","container","injectedJavaScriptObject","create","width","paddingHorizontal","paddingTop","flex"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,KAAK,oBAAoB,IAAI,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAInG,MAAM,MAAM,oBAAoB,GAAG,4BAA4B,CAAC;AA2BhE,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAkK1D,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAUnD,OAAO,EAAE,KAAK,oBAAoB,IAAI,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAInG,MAAM,MAAM,oBAAoB,GAAG,4BAA4B,CAAC;AA2BhE,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAgN1D,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@duffel/react-native-components-assistant",
3
- "version": "0.5.1",
3
+ "version": "0.5.2-canary.0",
4
4
  "description": "Duffel Assistant component in React Native",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",
package/src/index.tsx CHANGED
@@ -1,5 +1,12 @@
1
- import React from 'react';
2
- import { Linking, Modal, Platform, StyleSheet, View } from 'react-native';
1
+ import React, { useEffect, useState } from 'react';
2
+ import {
3
+ Keyboard,
4
+ Linking,
5
+ Modal,
6
+ Platform,
7
+ StyleSheet,
8
+ View,
9
+ } from 'react-native';
3
10
  import { WebView } from 'react-native-webview';
4
11
  import { type DuffelAssistantProps as DuffelAssistantPropsImported } from './DuffelAssistantProps';
5
12
  import { hasJsonWebTokenFormat } from './lib/hasJsonWebTokenFormat';
@@ -38,6 +45,37 @@ export const DuffelAssistant: React.FC<DuffelAssistantProps> = ({
38
45
  onNewMessage,
39
46
  ...properties
40
47
  }) => {
48
+ const [androidKeyboardHeight, setAndroidKeyboardHeight] = useState(0);
49
+
50
+ useEffect(() => {
51
+ if (Platform.OS !== 'android') {
52
+ return;
53
+ }
54
+
55
+ if (!isOpen) {
56
+ setAndroidKeyboardHeight(0);
57
+ return;
58
+ }
59
+
60
+ const keyboardDidShowSubscription = Keyboard.addListener(
61
+ 'keyboardDidShow',
62
+ (event) => {
63
+ setAndroidKeyboardHeight(event.endCoordinates?.height ?? 0);
64
+ }
65
+ );
66
+ const keyboardDidHideSubscription = Keyboard.addListener(
67
+ 'keyboardDidHide',
68
+ () => {
69
+ setAndroidKeyboardHeight(0);
70
+ }
71
+ );
72
+
73
+ return () => {
74
+ keyboardDidShowSubscription.remove();
75
+ keyboardDidHideSubscription.remove();
76
+ };
77
+ }, [isOpen]);
78
+
41
79
  if (!hasJsonWebTokenFormat(properties.clientKey)) {
42
80
  throw new Error('Duffel Assistant client key format must be a valid JWT.');
43
81
  }
@@ -147,29 +185,19 @@ export const DuffelAssistant: React.FC<DuffelAssistantProps> = ({
147
185
  return false;
148
186
  };
149
187
 
150
- return (
151
- <Modal
152
- visible={isOpen}
153
- onRequestClose={() => onClose()}
154
- animationType="slide"
155
- >
156
- <View style={styles.container}>
157
- {Platform.OS === 'ios' ? (
158
- <WebView
159
- injectedJavaScriptObject={properties}
160
- // When you are running this in development iOS doesn't allow request from hosts with invalid https certificates.
161
- // If you try ngrok with the local esbuild server it will fail because ngrok requests in https and the dev server rejects http requests.
162
- // Easiest solution is to use the production URL with test data.
163
- // If that's not possible, you can also upload the assistant built assets to a different folder in assets.duffel and work with that.
164
- source={{ uri: assistantIframeUrl }}
165
- onMessage={handleMessage}
166
- onShouldStartLoadWithRequest={handleShouldStartLoadWithRequest}
167
- // Always fetch the latest assistant bundle. The iframe.html shell
168
- // references `./iframe-app.js` by a stable path, so without this
169
- // the system WebView can serve a stale bundle for a long time.
170
- cacheEnabled={false}
171
- />
172
- ) : (
188
+ if (Platform.OS === 'android') {
189
+ return (
190
+ <Modal
191
+ visible={isOpen}
192
+ onRequestClose={() => onClose()}
193
+ animationType="slide"
194
+ >
195
+ <View
196
+ style={[
197
+ styles.androidContainer,
198
+ { paddingBottom: 15 + androidKeyboardHeight },
199
+ ]}
200
+ >
173
201
  <WebView
174
202
  // Required for Android
175
203
  injectedJavaScript={`
@@ -190,7 +218,32 @@ export const DuffelAssistant: React.FC<DuffelAssistantProps> = ({
190
218
  cacheEnabled={false}
191
219
  cacheMode="LOAD_NO_CACHE"
192
220
  />
193
- )}
221
+ </View>
222
+ </Modal>
223
+ );
224
+ }
225
+
226
+ return (
227
+ <Modal
228
+ visible={isOpen}
229
+ onRequestClose={() => onClose()}
230
+ animationType="slide"
231
+ >
232
+ <View style={styles.container}>
233
+ <WebView
234
+ injectedJavaScriptObject={properties}
235
+ // When you are running this in development iOS doesn't allow request from hosts with invalid https certificates.
236
+ // If you try ngrok with the local esbuild server it will fail because ngrok requests in https and the dev server rejects http requests.
237
+ // Easiest solution is to use the production URL with test data.
238
+ // If that's not possible, you can also upload the assistant built assets to a different folder in assets.duffel and work with that.
239
+ source={{ uri: assistantIframeUrl }}
240
+ onMessage={handleMessage}
241
+ onShouldStartLoadWithRequest={handleShouldStartLoadWithRequest}
242
+ // Always fetch the latest assistant bundle. The iframe.html shell
243
+ // references `./iframe-app.js` by a stable path, so without this
244
+ // the system WebView can serve a stale bundle for a long time.
245
+ cacheEnabled={false}
246
+ />
194
247
  </View>
195
248
  </Modal>
196
249
  );
@@ -204,4 +257,10 @@ const styles = StyleSheet.create({
204
257
  paddingTop: 50,
205
258
  paddingBottom: 30,
206
259
  },
260
+ androidContainer: {
261
+ flex: 1,
262
+ width: '100%',
263
+ paddingTop: 45,
264
+ paddingBottom: 15,
265
+ },
207
266
  });