@duffel/react-native-components-assistant 0.4.6 → 0.5.1-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.
package/README.md CHANGED
@@ -21,6 +21,10 @@ function App() {
21
21
  isOpen={isDuffelAssistantOpen}
22
22
  onClose={() => setIsDuffelAssistantOpen(false)}
23
23
  clientKey="<USER_CLIENT_KEY>"
24
+ supportChannels={{
25
+ chat: true,
26
+ phone: true,
27
+ }}
24
28
  />
25
29
  );
26
30
  }
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  import React from 'react';
4
- import { Linking, Modal, Platform, StyleSheet, View } from 'react-native';
4
+ import { KeyboardAvoidingView, 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";
@@ -43,6 +43,9 @@ export const DuffelAssistant = ({
43
43
  if (!clientKeyIncludesResource && properties.context) {
44
44
  throw new Error('The context prop is only supported when the client key includes a resource id.');
45
45
  }
46
+ if (typeof properties.supportChannels !== 'undefined' && properties.supportChannels.chat !== true) {
47
+ throw new Error('The supportChannels prop must keep chat enabled. Phone-only support isn’t offered.');
48
+ }
46
49
  if (properties.showMinimiseButton && typeof properties.onMinimise !== 'function') {
47
50
  console.warn('The showMinimiseButton prop is set to true, but the onMinimise callback is not provided. Make sure to listen to the onMinimise callback to handle the minimisation of the Assistant.');
48
51
  }
@@ -79,24 +82,29 @@ export const DuffelAssistant = ({
79
82
  visible: isOpen,
80
83
  onRequestClose: () => onClose(),
81
84
  animationType: "slide",
82
- children: /*#__PURE__*/_jsx(View, {
83
- style: styles.container,
84
- children: Platform.OS === 'ios' ? /*#__PURE__*/_jsx(WebView, {
85
- injectedJavaScriptObject: properties
86
- // When you are running this in development iOS doesn't allow request from hosts with invalid https certificates.
87
- // If you try ngrok with the local esbuild server it will fail because ngrok requests in https and the dev server rejects http requests.
88
- // Easiest solution is to use the production URL with test data.
89
- // If that's not possible, you can also upload the assistant built assets to a different folder in assets.duffel and work with that.
90
- ,
91
- source: {
92
- uri: assistantIframeUrl
93
- },
94
- onMessage: handleMessage,
95
- onShouldStartLoadWithRequest: handleShouldStartLoadWithRequest
96
- }) : /*#__PURE__*/_jsx(WebView
97
- // Required for Android
98
- , {
99
- injectedJavaScript: `
85
+ children: /*#__PURE__*/_jsx(KeyboardAvoidingView, {
86
+ behavior: Platform.OS === 'android' ? 'padding' : undefined,
87
+ enabled: Platform.OS === 'android',
88
+ style: styles.keyboardAvoidingView,
89
+ children: /*#__PURE__*/_jsx(View, {
90
+ style: styles.container,
91
+ children: Platform.OS === 'ios' ? /*#__PURE__*/_jsx(WebView, {
92
+ injectedJavaScriptObject: properties
93
+ // When you are running this in development iOS doesn't allow request from hosts with invalid https certificates.
94
+ // If you try ngrok with the local esbuild server it will fail because ngrok requests in https and the dev server rejects http requests.
95
+ // Easiest solution is to use the production URL with test data.
96
+ // If that's not possible, you can also upload the assistant built assets to a different folder in assets.duffel and work with that.
97
+ ,
98
+ source: {
99
+ uri: assistantIframeUrl
100
+ },
101
+ onMessage: handleMessage,
102
+ onShouldStartLoadWithRequest: handleShouldStartLoadWithRequest,
103
+ style: styles.webView
104
+ }) : /*#__PURE__*/_jsx(WebView
105
+ // Required for Android
106
+ , {
107
+ injectedJavaScript: `
100
108
  postMessage(
101
109
  {
102
110
  type: "duffel-assistant-open",
@@ -105,22 +113,30 @@ export const DuffelAssistant = ({
105
113
  "*",
106
114
  );
107
115
  true;`,
108
- source: {
109
- uri: assistantIframeUrl
110
- },
111
- onMessage: handleMessage,
112
- onShouldStartLoadWithRequest: handleShouldStartLoadWithRequest
116
+ source: {
117
+ uri: assistantIframeUrl
118
+ },
119
+ onMessage: handleMessage,
120
+ onShouldStartLoadWithRequest: handleShouldStartLoadWithRequest,
121
+ style: styles.webView
122
+ })
113
123
  })
114
124
  })
115
125
  });
116
126
  };
117
127
  const styles = StyleSheet.create({
128
+ keyboardAvoidingView: {
129
+ flex: 1
130
+ },
118
131
  container: {
119
- height: '100%',
132
+ flex: 1,
120
133
  width: '100%',
121
134
  paddingHorizontal: 12,
122
135
  paddingTop: 50,
123
136
  paddingBottom: 30
137
+ },
138
+ webView: {
139
+ flex: 1
124
140
  }
125
141
  });
126
142
  //# 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","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","injectedJavaScript","stringify","create","height","width","paddingHorizontal","paddingTop","paddingBottom"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","KeyboardAvoidingView","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","behavior","enabled","style","styles","keyboardAvoidingView","container","injectedJavaScriptObject","source","uri","onMessage","onShouldStartLoadWithRequest","webView","injectedJavaScript","stringify","create","flex","width","paddingHorizontal","paddingTop","paddingBottom"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
@@ -15,6 +15,20 @@ export type DuffelAssistantContext = {
15
15
  */
16
16
  issueType?: SupportIssueType;
17
17
  };
18
+ export type DuffelAssistantSupportChannels = {
19
+ /**
20
+ * Chat support must stay enabled whenever supportChannels is provided.
21
+ * Phone-only support is not supported.
22
+ */
23
+ chat: true;
24
+ /**
25
+ * Enable phone as an additional support channel when it has been configured
26
+ * for your organisation by Duffel.
27
+ *
28
+ * @default false
29
+ */
30
+ phone: boolean;
31
+ };
18
32
  export interface DuffelAssistantProps {
19
33
  /**
20
34
  * This prop is used to control whether the Assistant is open/visible or closed.
@@ -74,5 +88,14 @@ export interface DuffelAssistantProps {
74
88
  * @default undefined
75
89
  */
76
90
  context?: DuffelAssistantContext;
91
+ /**
92
+ * Configure which support channels the Assistant should offer.
93
+ * When omitted, the Assistant will continue to offer chat only.
94
+ *
95
+ * Chat must remain enabled whenever this prop is provided.
96
+ *
97
+ * @default undefined
98
+ */
99
+ supportChannels?: DuffelAssistantSupportChannels;
77
100
  }
78
101
  //# sourceMappingURL=DuffelAssistantProps.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DuffelAssistantProps.d.ts","sourceRoot":"","sources":["../../../src/DuffelAssistantProps.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEnE,MAAM,MAAM,sBAAsB,GAAG;IACnC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,gBAAgB,CAAC;CAC9B,CAAC;AAEF,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,OAAO,EAAE,MAAM,IAAI,CAAC;IAEpB;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IAExB;;;;;;OAMG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;;OAIG;IACH,WAAW,CAAC,EAAE,SAAS,GAAG,YAAY,GAAG,aAAa,CAAC;IAEvD;;OAEG;IACH,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAE7B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,YAAY,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAE9E;;;;OAIG;IACH,OAAO,CAAC,EAAE,sBAAsB,CAAC;CAClC"}
1
+ {"version":3,"file":"DuffelAssistantProps.d.ts","sourceRoot":"","sources":["../../../src/DuffelAssistantProps.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEnE,MAAM,MAAM,sBAAsB,GAAG;IACnC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,gBAAgB,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C;;;OAGG;IACH,IAAI,EAAE,IAAI,CAAC;IAEX;;;;;OAKG;IACH,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,OAAO,EAAE,MAAM,IAAI,CAAC;IAEpB;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IAExB;;;;;;OAMG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;;OAIG;IACH,WAAW,CAAC,EAAE,SAAS,GAAG,YAAY,GAAG,aAAa,CAAC;IAEvD;;OAEG;IACH,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAE7B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,YAAY,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAE9E;;;;OAIG;IACH,OAAO,CAAC,EAAE,sBAAsB,CAAC;IAEjC;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,8BAA8B,CAAC;CAClD"}
@@ -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,CAgJ1D,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,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,CAiK1D,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@duffel/react-native-components-assistant",
3
- "version": "0.4.6",
3
+ "version": "0.5.1-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",
@@ -18,6 +18,22 @@ export type DuffelAssistantContext = {
18
18
  issueType?: SupportIssueType;
19
19
  };
20
20
 
21
+ export type DuffelAssistantSupportChannels = {
22
+ /**
23
+ * Chat support must stay enabled whenever supportChannels is provided.
24
+ * Phone-only support is not supported.
25
+ */
26
+ chat: true;
27
+
28
+ /**
29
+ * Enable phone as an additional support channel when it has been configured
30
+ * for your organisation by Duffel.
31
+ *
32
+ * @default false
33
+ */
34
+ phone: boolean;
35
+ };
36
+
21
37
  export interface DuffelAssistantProps {
22
38
  /**
23
39
  * This prop is used to control whether the Assistant is open/visible or closed.
@@ -83,4 +99,14 @@ export interface DuffelAssistantProps {
83
99
  * @default undefined
84
100
  */
85
101
  context?: DuffelAssistantContext;
102
+
103
+ /**
104
+ * Configure which support channels the Assistant should offer.
105
+ * When omitted, the Assistant will continue to offer chat only.
106
+ *
107
+ * Chat must remain enabled whenever this prop is provided.
108
+ *
109
+ * @default undefined
110
+ */
111
+ supportChannels?: DuffelAssistantSupportChannels;
86
112
  }
package/src/index.tsx CHANGED
@@ -1,5 +1,12 @@
1
1
  import React from 'react';
2
- import { Linking, Modal, Platform, StyleSheet, View } from 'react-native';
2
+ import {
3
+ KeyboardAvoidingView,
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';
@@ -82,6 +89,15 @@ export const DuffelAssistant: React.FC<DuffelAssistantProps> = ({
82
89
  );
83
90
  }
84
91
 
92
+ if (
93
+ typeof properties.supportChannels !== 'undefined' &&
94
+ properties.supportChannels.chat !== true
95
+ ) {
96
+ throw new Error(
97
+ 'The supportChannels prop must keep chat enabled. Phone-only support isn’t offered.'
98
+ );
99
+ }
100
+
85
101
  if (
86
102
  properties.showMinimiseButton &&
87
103
  typeof properties.onMinimise !== 'function'
@@ -144,22 +160,28 @@ export const DuffelAssistant: React.FC<DuffelAssistantProps> = ({
144
160
  onRequestClose={() => onClose()}
145
161
  animationType="slide"
146
162
  >
147
- <View style={styles.container}>
148
- {Platform.OS === 'ios' ? (
149
- <WebView
150
- injectedJavaScriptObject={properties}
151
- // When you are running this in development iOS doesn't allow request from hosts with invalid https certificates.
152
- // If you try ngrok with the local esbuild server it will fail because ngrok requests in https and the dev server rejects http requests.
153
- // Easiest solution is to use the production URL with test data.
154
- // If that's not possible, you can also upload the assistant built assets to a different folder in assets.duffel and work with that.
155
- source={{ uri: assistantIframeUrl }}
156
- onMessage={handleMessage}
157
- onShouldStartLoadWithRequest={handleShouldStartLoadWithRequest}
158
- />
159
- ) : (
160
- <WebView
161
- // Required for Android
162
- injectedJavaScript={`
163
+ <KeyboardAvoidingView
164
+ behavior={Platform.OS === 'android' ? 'padding' : undefined}
165
+ enabled={Platform.OS === 'android'}
166
+ style={styles.keyboardAvoidingView}
167
+ >
168
+ <View style={styles.container}>
169
+ {Platform.OS === 'ios' ? (
170
+ <WebView
171
+ injectedJavaScriptObject={properties}
172
+ // When you are running this in development iOS doesn't allow request from hosts with invalid https certificates.
173
+ // If you try ngrok with the local esbuild server it will fail because ngrok requests in https and the dev server rejects http requests.
174
+ // Easiest solution is to use the production URL with test data.
175
+ // If that's not possible, you can also upload the assistant built assets to a different folder in assets.duffel and work with that.
176
+ source={{ uri: assistantIframeUrl }}
177
+ onMessage={handleMessage}
178
+ onShouldStartLoadWithRequest={handleShouldStartLoadWithRequest}
179
+ style={styles.webView}
180
+ />
181
+ ) : (
182
+ <WebView
183
+ // Required for Android
184
+ injectedJavaScript={`
163
185
  postMessage(
164
186
  {
165
187
  type: "duffel-assistant-open",
@@ -168,22 +190,30 @@ export const DuffelAssistant: React.FC<DuffelAssistantProps> = ({
168
190
  "*",
169
191
  );
170
192
  true;`}
171
- source={{ uri: assistantIframeUrl }}
172
- onMessage={handleMessage}
173
- onShouldStartLoadWithRequest={handleShouldStartLoadWithRequest}
174
- />
175
- )}
176
- </View>
193
+ source={{ uri: assistantIframeUrl }}
194
+ onMessage={handleMessage}
195
+ onShouldStartLoadWithRequest={handleShouldStartLoadWithRequest}
196
+ style={styles.webView}
197
+ />
198
+ )}
199
+ </View>
200
+ </KeyboardAvoidingView>
177
201
  </Modal>
178
202
  );
179
203
  };
180
204
 
181
205
  const styles = StyleSheet.create({
206
+ keyboardAvoidingView: {
207
+ flex: 1,
208
+ },
182
209
  container: {
183
- height: '100%',
210
+ flex: 1,
184
211
  width: '100%',
185
212
  paddingHorizontal: 12,
186
213
  paddingTop: 50,
187
214
  paddingBottom: 30,
188
215
  },
216
+ webView: {
217
+ flex: 1,
218
+ },
189
219
  });