@planningcenter/chat-react-native 4.2.0-rc.1 → 4.2.0-rc.3

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 (45) hide show
  1. package/build/components/display/index.d.ts +1 -0
  2. package/build/components/display/index.d.ts.map +1 -1
  3. package/build/components/display/index.js +1 -0
  4. package/build/components/display/index.js.map +1 -1
  5. package/build/components/display/version_footer.d.ts +2 -0
  6. package/build/components/display/version_footer.d.ts.map +1 -0
  7. package/build/components/display/version_footer.js +36 -0
  8. package/build/components/display/version_footer.js.map +1 -0
  9. package/build/contexts/api_provider.d.ts.map +1 -1
  10. package/build/contexts/api_provider.js +12 -1
  11. package/build/contexts/api_provider.js.map +1 -1
  12. package/build/hooks/use_features.d.ts +16 -0
  13. package/build/hooks/use_features.d.ts.map +1 -1
  14. package/build/hooks/use_features.js +43 -47
  15. package/build/hooks/use_features.js.map +1 -1
  16. package/build/screens/conversations/components/search_list_header_component.d.ts +2 -0
  17. package/build/screens/conversations/components/search_list_header_component.d.ts.map +1 -0
  18. package/build/screens/conversations/components/search_list_header_component.js +496 -0
  19. package/build/screens/conversations/components/search_list_header_component.js.map +1 -0
  20. package/build/screens/conversations/conversations_screen.d.ts.map +1 -1
  21. package/build/screens/conversations/conversations_screen.js +28 -16
  22. package/build/screens/conversations/conversations_screen.js.map +1 -1
  23. package/build/screens/settings_screen.d.ts.map +1 -1
  24. package/build/screens/settings_screen.js +41 -14
  25. package/build/screens/settings_screen.js.map +1 -1
  26. package/build/utils/package_version.d.ts +2 -0
  27. package/build/utils/package_version.d.ts.map +1 -0
  28. package/build/utils/package_version.js +5 -0
  29. package/build/utils/package_version.js.map +1 -0
  30. package/build/utils/time.d.ts +1 -0
  31. package/build/utils/time.d.ts.map +1 -1
  32. package/build/utils/time.js +1 -0
  33. package/build/utils/time.js.map +1 -1
  34. package/package.json +2 -2
  35. package/src/__tests__/hooks/use_features.test.ts +61 -0
  36. package/src/components/display/__tests__/version_footer.test.tsx +48 -0
  37. package/src/components/display/index.ts +1 -0
  38. package/src/components/display/version_footer.tsx +26 -0
  39. package/src/contexts/api_provider.tsx +4 -0
  40. package/src/hooks/use_features.ts +26 -14
  41. package/src/screens/conversations/components/search_list_header_component.tsx +291 -0
  42. package/src/screens/conversations/conversations_screen.tsx +6 -1
  43. package/src/screens/settings_screen.tsx +11 -1
  44. package/src/utils/package_version.ts +3 -0
  45. package/src/utils/time.ts +1 -0
@@ -3,14 +3,15 @@ import { PlatformPressable } from '@react-navigation/elements';
3
3
  import { useNavigation } from '@react-navigation/native';
4
4
  import React, { useCallback } from 'react';
5
5
  import { Platform, StyleSheet, View } from 'react-native';
6
- import { Heading, Icon, Text } from '../components';
6
+ import { useSafeAreaInsets } from 'react-native-safe-area-context';
7
+ import { Heading, Icon, Text, VersionFooter } from '../components';
7
8
  import { Switch } from '../components/display/switch';
8
9
  import { useDirectMessagesEligible, useTheme } from '../hooks';
9
10
  import { useAppName } from '../hooks/use_app_name';
10
11
  import { usePersonSettings } from '../hooks/use_person_settings';
11
12
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
12
13
  export function SettingsScreen(t0) {
13
- const $ = _c(28);
14
+ const $ = _c(32);
14
15
  const styles = useStyles();
15
16
  const {
16
17
  directMessagesDisabled,
@@ -132,18 +133,37 @@ export function SettingsScreen(t0) {
132
133
  t8 = $[24];
133
134
  }
134
135
  let t9;
135
- if ($[25] !== styles.container || $[26] !== t8) {
136
- t9 = /*#__PURE__*/_jsx(View, {
136
+ if ($[25] === Symbol.for("react.memo_cache_sentinel")) {
137
+ t9 = /*#__PURE__*/_jsx(VersionFooter, {});
138
+ $[25] = t9;
139
+ } else {
140
+ t9 = $[25];
141
+ }
142
+ let t10;
143
+ if ($[26] !== styles.footer) {
144
+ t10 = /*#__PURE__*/_jsx(View, {
145
+ style: styles.footer,
146
+ children: t9
147
+ });
148
+ $[26] = styles.footer;
149
+ $[27] = t10;
150
+ } else {
151
+ t10 = $[27];
152
+ }
153
+ let t11;
154
+ if ($[28] !== styles.container || $[29] !== t10 || $[30] !== t8) {
155
+ t11 = /*#__PURE__*/_jsxs(View, {
137
156
  style: styles.container,
138
- children: t8
157
+ children: [t8, t10]
139
158
  });
140
- $[25] = styles.container;
141
- $[26] = t8;
142
- $[27] = t9;
159
+ $[28] = styles.container;
160
+ $[29] = t10;
161
+ $[30] = t8;
162
+ $[31] = t11;
143
163
  } else {
144
- t9 = $[27];
164
+ t11 = $[31];
145
165
  }
146
- return t9;
166
+ return t11;
147
167
  }
148
168
  function NavRow(t0) {
149
169
  const $ = _c(13);
@@ -207,16 +227,22 @@ function NavRow(t0) {
207
227
  return t4;
208
228
  }
209
229
  const useStyles = () => {
210
- const $ = _c(2);
230
+ const $ = _c(3);
211
231
  const {
212
232
  colors
213
233
  } = useTheme();
234
+ const insets = useSafeAreaInsets();
214
235
  let t0;
215
- if ($[0] !== colors.borderColorDefaultBase) {
236
+ if ($[0] !== colors.borderColorDefaultBase || $[1] !== insets.bottom) {
216
237
  t0 = StyleSheet.create({
217
238
  container: {
218
239
  flex: 1
219
240
  },
241
+ footer: {
242
+ flex: 1,
243
+ justifyContent: "flex-end",
244
+ paddingBottom: Math.max(insets.bottom, 8)
245
+ },
220
246
  sectionOuter: {
221
247
  paddingLeft: 16
222
248
  },
@@ -242,9 +268,10 @@ const useStyles = () => {
242
268
  }
243
269
  });
244
270
  $[0] = colors.borderColorDefaultBase;
245
- $[1] = t0;
271
+ $[1] = insets.bottom;
272
+ $[2] = t0;
246
273
  } else {
247
- t0 = $[1];
274
+ t0 = $[2];
248
275
  }
249
276
  return t0;
250
277
  };
@@ -1 +1 @@
1
- {"version":3,"file":"settings_screen.js","names":["PlatformPressable","useNavigation","React","useCallback","Platform","StyleSheet","View","Heading","Icon","Text","Switch","useDirectMessagesEligible","useTheme","useAppName","usePersonSettings","jsx","_jsx","jsxs","_jsxs","SettingsScreen","t0","$","_c","styles","useStyles","directMessagesDisabled","setDirectMessagesDisabled","isMutating","directMessagesEligible","appName","navigation","t1","navigate","handleNotificationSettings","t2","type","handleGetHelp","t3","Symbol","for","variant","children","t4","sectionHeader","style","t5","settingRow","settingRowText","value","onValueChange","enabled","t6","NavRow","label","t7","t8","sectionOuter","t9","container","onPress","useNavRowStyles","chevron","OS","name","size","inner","accessibilityRole","colors","borderColorDefaultBase","create","flex","paddingLeft","paddingRight","paddingTop","paddingBottom","borderBottomWidth","borderBottomColor","flexDirection","alignItems","justifyContent","paddingVertical","gap","iconColorDefaultDisabled","color"],"sources":["../../src/screens/settings_screen.tsx"],"sourcesContent":["import { PlatformPressable } from '@react-navigation/elements'\nimport { StaticScreenProps, useNavigation } from '@react-navigation/native'\nimport React, { useCallback } from 'react'\nimport { Platform, StyleSheet, View } from 'react-native'\nimport { Heading, Icon, Text } from '../components'\nimport { Switch } from '../components/display/switch'\nimport { useDirectMessagesEligible, useTheme } from '../hooks'\nimport { useAppName } from '../hooks/use_app_name'\nimport { usePersonSettings } from '../hooks/use_person_settings'\n\nexport type SettingsScreenProps = StaticScreenProps<{}>\n\nexport function SettingsScreen({}: SettingsScreenProps) {\n const styles = useStyles()\n const { directMessagesDisabled, setDirectMessagesDisabled, isMutating } = usePersonSettings()\n const directMessagesEligible = useDirectMessagesEligible()\n const appName = useAppName()\n const navigation = useNavigation()\n\n const handleNotificationSettings = useCallback(() => {\n navigation.navigate('NotificationSettings', {})\n }, [navigation])\n\n const handleGetHelp = useCallback(() => {\n navigation.navigate('GetHelp', { type: 'chat' })\n }, [navigation])\n\n return (\n <View style={styles.container}>\n <View style={styles.sectionOuter}>\n <View style={styles.sectionHeader}>\n <Heading variant=\"h2\">Messages</Heading>\n </View>\n {directMessagesEligible && (\n <View style={styles.settingRow}>\n <View style={styles.settingRowText}>\n <Text>Allow direct messages</Text>\n <Text variant=\"tertiary\">\n When off, you can't be added to new direct messages, and any you're already in will\n be turned off.\n </Text>\n </View>\n <Switch\n value={!directMessagesDisabled}\n onValueChange={enabled => setDirectMessagesDisabled(!enabled)}\n disabled={isMutating}\n />\n </View>\n )}\n <NavRow label=\"Notification settings\" onPress={handleNotificationSettings} />\n {appName !== 'services' && <NavRow label=\"Get help\" onPress={handleGetHelp} />}\n </View>\n </View>\n )\n}\n\ninterface NavRowProps {\n label: string\n onPress: () => void\n}\n\nfunction NavRow({ label, onPress }: NavRowProps) {\n const styles = useNavRowStyles()\n return (\n <PlatformPressable\n style={styles.container}\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n >\n <View style={styles.inner}>\n <Text>{label}</Text>\n {Platform.OS === 'ios' && (\n <Icon name=\"general.rightChevron\" size={16} style={styles.chevron} />\n )}\n </View>\n </PlatformPressable>\n )\n}\n\nconst useStyles = () => {\n const { colors } = useTheme()\n return StyleSheet.create({\n container: {\n flex: 1,\n },\n sectionOuter: {\n paddingLeft: 16,\n },\n sectionHeader: {\n paddingRight: 16,\n paddingTop: 24,\n paddingBottom: 12,\n borderBottomWidth: 1,\n borderBottomColor: colors.borderColorDefaultBase,\n },\n settingRow: {\n flexDirection: 'row',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n paddingRight: 16,\n paddingVertical: 12,\n borderBottomWidth: 1,\n borderBottomColor: colors.borderColorDefaultBase,\n },\n settingRowText: {\n flex: 1,\n gap: 8,\n },\n })\n}\n\nconst useNavRowStyles = () => {\n const { colors } = useTheme()\n return StyleSheet.create({\n container: {\n paddingLeft: 0,\n },\n inner: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingRight: 16,\n paddingVertical: 14,\n borderBottomWidth: 1,\n borderBottomColor: colors.borderColorDefaultBase,\n },\n chevron: {\n color: colors.iconColorDefaultDisabled,\n },\n })\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"settings_screen.js","names":["PlatformPressable","useNavigation","React","useCallback","Platform","StyleSheet","View","useSafeAreaInsets","Heading","Icon","Text","VersionFooter","Switch","useDirectMessagesEligible","useTheme","useAppName","usePersonSettings","jsx","_jsx","jsxs","_jsxs","SettingsScreen","t0","$","_c","styles","useStyles","directMessagesDisabled","setDirectMessagesDisabled","isMutating","directMessagesEligible","appName","navigation","t1","navigate","handleNotificationSettings","t2","type","handleGetHelp","t3","Symbol","for","variant","children","t4","sectionHeader","style","t5","settingRow","settingRowText","value","onValueChange","enabled","t6","NavRow","label","t7","t8","sectionOuter","t9","t10","footer","t11","container","onPress","useNavRowStyles","chevron","OS","name","size","inner","accessibilityRole","colors","insets","borderColorDefaultBase","bottom","create","flex","justifyContent","paddingBottom","Math","max","paddingLeft","paddingRight","paddingTop","borderBottomWidth","borderBottomColor","flexDirection","alignItems","paddingVertical","gap","iconColorDefaultDisabled","color"],"sources":["../../src/screens/settings_screen.tsx"],"sourcesContent":["import { PlatformPressable } from '@react-navigation/elements'\nimport { StaticScreenProps, useNavigation } from '@react-navigation/native'\nimport React, { useCallback } from 'react'\nimport { Platform, StyleSheet, View } from 'react-native'\nimport { useSafeAreaInsets } from 'react-native-safe-area-context'\nimport { Heading, Icon, Text, VersionFooter } from '../components'\nimport { Switch } from '../components/display/switch'\nimport { useDirectMessagesEligible, useTheme } from '../hooks'\nimport { useAppName } from '../hooks/use_app_name'\nimport { usePersonSettings } from '../hooks/use_person_settings'\n\nexport type SettingsScreenProps = StaticScreenProps<{}>\n\nexport function SettingsScreen({}: SettingsScreenProps) {\n const styles = useStyles()\n const { directMessagesDisabled, setDirectMessagesDisabled, isMutating } = usePersonSettings()\n const directMessagesEligible = useDirectMessagesEligible()\n const appName = useAppName()\n const navigation = useNavigation()\n\n const handleNotificationSettings = useCallback(() => {\n navigation.navigate('NotificationSettings', {})\n }, [navigation])\n\n const handleGetHelp = useCallback(() => {\n navigation.navigate('GetHelp', { type: 'chat' })\n }, [navigation])\n\n return (\n <View style={styles.container}>\n <View style={styles.sectionOuter}>\n <View style={styles.sectionHeader}>\n <Heading variant=\"h2\">Messages</Heading>\n </View>\n {directMessagesEligible && (\n <View style={styles.settingRow}>\n <View style={styles.settingRowText}>\n <Text>Allow direct messages</Text>\n <Text variant=\"tertiary\">\n When off, you can't be added to new direct messages, and any you're already in will\n be turned off.\n </Text>\n </View>\n <Switch\n value={!directMessagesDisabled}\n onValueChange={enabled => setDirectMessagesDisabled(!enabled)}\n disabled={isMutating}\n />\n </View>\n )}\n <NavRow label=\"Notification settings\" onPress={handleNotificationSettings} />\n {appName !== 'services' && <NavRow label=\"Get help\" onPress={handleGetHelp} />}\n </View>\n <View style={styles.footer}>\n <VersionFooter />\n </View>\n </View>\n )\n}\n\ninterface NavRowProps {\n label: string\n onPress: () => void\n}\n\nfunction NavRow({ label, onPress }: NavRowProps) {\n const styles = useNavRowStyles()\n return (\n <PlatformPressable\n style={styles.container}\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n >\n <View style={styles.inner}>\n <Text>{label}</Text>\n {Platform.OS === 'ios' && (\n <Icon name=\"general.rightChevron\" size={16} style={styles.chevron} />\n )}\n </View>\n </PlatformPressable>\n )\n}\n\nconst useStyles = () => {\n const { colors } = useTheme()\n const insets = useSafeAreaInsets()\n return StyleSheet.create({\n container: {\n flex: 1,\n },\n footer: {\n flex: 1,\n justifyContent: 'flex-end',\n paddingBottom: Math.max(insets.bottom, 8),\n },\n sectionOuter: {\n paddingLeft: 16,\n },\n sectionHeader: {\n paddingRight: 16,\n paddingTop: 24,\n paddingBottom: 12,\n borderBottomWidth: 1,\n borderBottomColor: colors.borderColorDefaultBase,\n },\n settingRow: {\n flexDirection: 'row',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n paddingRight: 16,\n paddingVertical: 12,\n borderBottomWidth: 1,\n borderBottomColor: colors.borderColorDefaultBase,\n },\n settingRowText: {\n flex: 1,\n gap: 8,\n },\n })\n}\n\nconst useNavRowStyles = () => {\n const { colors } = useTheme()\n return StyleSheet.create({\n container: {\n paddingLeft: 0,\n },\n inner: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingRight: 16,\n paddingVertical: 14,\n borderBottomWidth: 1,\n borderBottomColor: colors.borderColorDefaultBase,\n },\n chevron: {\n color: colors.iconColorDefaultDisabled,\n },\n })\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ export declare const chatReactNativeVersion: string;
2
+ //# sourceMappingURL=package_version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package_version.d.ts","sourceRoot":"","sources":["../../src/utils/package_version.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,sBAAsB,QAAU,CAAA"}
@@ -0,0 +1,5 @@
1
+ const {
2
+ version
3
+ } = require('../../package.json');
4
+ export const chatReactNativeVersion = version;
5
+ //# sourceMappingURL=package_version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package_version.js","names":["version","require","chatReactNativeVersion"],"sources":["../../src/utils/package_version.ts"],"sourcesContent":["const { version } = require('../../package.json') as { version: string }\n\nexport const chatReactNativeVersion = version\n"],"mappings":"AAAA,MAAM;EAAEA;AAAQ,CAAC,GAAGC,OAAO,CAAC,oBAAoB,CAAwB;AAExE,OAAO,MAAMC,sBAAsB,GAAGF,OAAO","ignoreList":[]}
@@ -1,6 +1,7 @@
1
1
  type TimeUnit = 'hours' | 'minutes' | 'seconds';
2
2
  export declare function toMs(value: number, unit: TimeUnit): number;
3
3
  export declare const FIVE_SECONDS: number;
4
+ export declare const ONE_MINUTE: number;
4
5
  export declare const FIVE_MINUTES: number;
5
6
  export declare const THIRTY_MINUTES: number;
6
7
  export declare const ONE_HOUR: number;
@@ -1 +1 @@
1
- {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../src/utils/time.ts"],"names":[],"mappings":"AAAA,KAAK,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAA;AAE/C,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,CAS1D;AAED,eAAO,MAAM,YAAY,QAAqB,CAAA;AAC9C,eAAO,MAAM,YAAY,QAAqB,CAAA;AAC9C,eAAO,MAAM,cAAc,QAAsB,CAAA;AACjD,eAAO,MAAM,QAAQ,QAAmB,CAAA"}
1
+ {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../src/utils/time.ts"],"names":[],"mappings":"AAAA,KAAK,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAA;AAE/C,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,CAS1D;AAED,eAAO,MAAM,YAAY,QAAqB,CAAA;AAC9C,eAAO,MAAM,UAAU,QAAqB,CAAA;AAC5C,eAAO,MAAM,YAAY,QAAqB,CAAA;AAC9C,eAAO,MAAM,cAAc,QAAsB,CAAA;AACjD,eAAO,MAAM,QAAQ,QAAmB,CAAA"}
@@ -9,6 +9,7 @@ export function toMs(value, unit) {
9
9
  }
10
10
  }
11
11
  export const FIVE_SECONDS = toMs(5, 'seconds');
12
+ export const ONE_MINUTE = toMs(1, 'minutes');
12
13
  export const FIVE_MINUTES = toMs(5, 'minutes');
13
14
  export const THIRTY_MINUTES = toMs(30, 'minutes');
14
15
  export const ONE_HOUR = toMs(1, 'hours');
@@ -1 +1 @@
1
- {"version":3,"file":"time.js","names":["toMs","value","unit","FIVE_SECONDS","FIVE_MINUTES","THIRTY_MINUTES","ONE_HOUR"],"sources":["../../src/utils/time.ts"],"sourcesContent":["type TimeUnit = 'hours' | 'minutes' | 'seconds'\n\nexport function toMs(value: number, unit: TimeUnit): number {\n switch (unit) {\n case 'hours':\n return value * 60 * 60 * 1000\n case 'minutes':\n return value * 60 * 1000\n case 'seconds':\n return value * 1000\n }\n}\n\nexport const FIVE_SECONDS = toMs(5, 'seconds')\nexport const FIVE_MINUTES = toMs(5, 'minutes')\nexport const THIRTY_MINUTES = toMs(30, 'minutes')\nexport const ONE_HOUR = toMs(1, 'hours')\n"],"mappings":"AAEA,OAAO,SAASA,IAAIA,CAACC,KAAa,EAAEC,IAAc,EAAU;EAC1D,QAAQA,IAAI;IACV,KAAK,OAAO;MACV,OAAOD,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;IAC/B,KAAK,SAAS;MACZ,OAAOA,KAAK,GAAG,EAAE,GAAG,IAAI;IAC1B,KAAK,SAAS;MACZ,OAAOA,KAAK,GAAG,IAAI;EACvB;AACF;AAEA,OAAO,MAAME,YAAY,GAAGH,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC;AAC9C,OAAO,MAAMI,YAAY,GAAGJ,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC;AAC9C,OAAO,MAAMK,cAAc,GAAGL,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC;AACjD,OAAO,MAAMM,QAAQ,GAAGN,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"time.js","names":["toMs","value","unit","FIVE_SECONDS","ONE_MINUTE","FIVE_MINUTES","THIRTY_MINUTES","ONE_HOUR"],"sources":["../../src/utils/time.ts"],"sourcesContent":["type TimeUnit = 'hours' | 'minutes' | 'seconds'\n\nexport function toMs(value: number, unit: TimeUnit): number {\n switch (unit) {\n case 'hours':\n return value * 60 * 60 * 1000\n case 'minutes':\n return value * 60 * 1000\n case 'seconds':\n return value * 1000\n }\n}\n\nexport const FIVE_SECONDS = toMs(5, 'seconds')\nexport const ONE_MINUTE = toMs(1, 'minutes')\nexport const FIVE_MINUTES = toMs(5, 'minutes')\nexport const THIRTY_MINUTES = toMs(30, 'minutes')\nexport const ONE_HOUR = toMs(1, 'hours')\n"],"mappings":"AAEA,OAAO,SAASA,IAAIA,CAACC,KAAa,EAAEC,IAAc,EAAU;EAC1D,QAAQA,IAAI;IACV,KAAK,OAAO;MACV,OAAOD,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;IAC/B,KAAK,SAAS;MACZ,OAAOA,KAAK,GAAG,EAAE,GAAG,IAAI;IAC1B,KAAK,SAAS;MACZ,OAAOA,KAAK,GAAG,IAAI;EACvB;AACF;AAEA,OAAO,MAAME,YAAY,GAAGH,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC;AAC9C,OAAO,MAAMI,UAAU,GAAGJ,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC;AAC5C,OAAO,MAAMK,YAAY,GAAGL,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC;AAC9C,OAAO,MAAMM,cAAc,GAAGN,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC;AACjD,OAAO,MAAMO,QAAQ,GAAGP,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@planningcenter/chat-react-native",
3
- "version": "4.2.0-rc.1",
3
+ "version": "4.2.0-rc.3",
4
4
  "description": "",
5
5
  "repository": {
6
6
  "type": "git",
@@ -84,5 +84,5 @@
84
84
  "sf-symbols-typescript": "^2.2.0",
85
85
  "typescript": "~6.0.3"
86
86
  },
87
- "gitHead": "5f3487e3e5462b3074ed2e855ade9591243c6544"
87
+ "gitHead": "06074367037e679e7240c24b1b7824eb6a818681"
88
88
  }
@@ -0,0 +1,61 @@
1
+ import { buildTestQueryClient } from '../../__utils__/query_client'
2
+ import type { ApiClient } from '../../hooks/use_api_client'
3
+ import { featuresQueryOptions } from '../../hooks/use_features'
4
+
5
+ const features = {
6
+ data: [{ type: 'Feature', id: '1', name: 'ROLLOUT_search', enabled: true }],
7
+ links: {},
8
+ meta: { count: 1, totalCount: 1 },
9
+ }
10
+
11
+ const buildClient = (get: jest.Mock) => ({ chat: { get } }) as unknown as ApiClient
12
+
13
+ const fetchTwice = async (get: jest.Mock, secondsBetween: number) => {
14
+ const queryClient = buildTestQueryClient()
15
+ const options = featuresQueryOptions(buildClient(get))
16
+
17
+ await queryClient.fetchQuery(options)
18
+ jest.advanceTimersByTime(secondsBetween * 1000)
19
+ await queryClient.fetchQuery(options)
20
+ }
21
+
22
+ describe('featuresQueryOptions', () => {
23
+ beforeEach(() => {
24
+ jest.useFakeTimers()
25
+ })
26
+
27
+ afterEach(() => {
28
+ jest.useRealTimers()
29
+ })
30
+
31
+ it('keeps successful flags fresh for five minutes', async () => {
32
+ const get = jest.fn().mockResolvedValue(features)
33
+
34
+ await fetchTwice(get, 4 * 60)
35
+
36
+ expect(get).toHaveBeenCalledTimes(1)
37
+ })
38
+
39
+ it('refetches right away after a failed fetch', async () => {
40
+ const get = jest.fn().mockRejectedValue({ status: 503 })
41
+
42
+ await fetchTwice(get, 1)
43
+
44
+ expect(get).toHaveBeenCalledTimes(2)
45
+ })
46
+
47
+ it('backs off for a minute after a 429', async () => {
48
+ const get = jest.fn().mockRejectedValue({ status: 429 })
49
+ const queryClient = buildTestQueryClient()
50
+ const options = featuresQueryOptions(buildClient(get))
51
+
52
+ await queryClient.fetchQuery(options)
53
+ jest.advanceTimersByTime(30 * 1000)
54
+ await queryClient.fetchQuery(options)
55
+ expect(get).toHaveBeenCalledTimes(1)
56
+
57
+ jest.advanceTimersByTime(31 * 1000)
58
+ await queryClient.fetchQuery(options)
59
+ expect(get).toHaveBeenCalledTimes(2)
60
+ })
61
+ })
@@ -0,0 +1,48 @@
1
+ import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
2
+ import { render } from '@testing-library/react-native'
3
+ import React from 'react'
4
+ import { buildTestQueryClient } from '../../../__utils__/query_client'
5
+ import { ChatProvider } from '../../../contexts/chat_context'
6
+ import { VersionFooter } from '../version_footer'
7
+
8
+ const { version: packageVersion } = require('../../../../package.json') as { version: string }
9
+
10
+ let queryClient: QueryClient
11
+
12
+ beforeEach(() => {
13
+ queryClient = buildTestQueryClient()
14
+ })
15
+
16
+ afterEach(() => {
17
+ queryClient.clear()
18
+ })
19
+
20
+ const Wrapper = ({ children }: { children: React.ReactNode }) => (
21
+ <QueryClientProvider client={queryClient}>
22
+ <ChatProvider
23
+ value={{
24
+ token: {
25
+ access_token: '',
26
+ created_at: 0,
27
+ expires_in: 0,
28
+ scope: '',
29
+ refresh_token: '',
30
+ token_type: '',
31
+ },
32
+ onUnauthorizedResponse: () => {},
33
+ theme: { theme: { colors: {} }, colorScheme: 'light' },
34
+ }}
35
+ >
36
+ {children}
37
+ </ChatProvider>
38
+ </QueryClientProvider>
39
+ )
40
+
41
+ describe('VersionFooter', () => {
42
+ it('shows the published chat-react-native version', () => {
43
+ const { getByText } = render(<VersionFooter />, { wrapper: Wrapper })
44
+
45
+ expect(packageVersion).toMatch(/^\d+\.\d+\.\d+/)
46
+ expect(getByText(`Chat v${packageVersion}`)).toBeTruthy()
47
+ })
48
+ })
@@ -27,3 +27,4 @@ export * from './keyboard_scroll_view'
27
27
  export * from './keyboard_view'
28
28
  export * from './platform_modal_header_buttons'
29
29
  export * from './pressable_row'
30
+ export * from './version_footer'
@@ -0,0 +1,26 @@
1
+ import React from 'react'
2
+ import { StyleSheet, View } from 'react-native'
3
+ import { chatReactNativeVersion } from '../../utils/package_version'
4
+ import { Text } from './text'
5
+
6
+ export function VersionFooter() {
7
+ return (
8
+ <View style={styles.container}>
9
+ <Text variant="footnote" style={styles.text}>
10
+ Chat v{chatReactNativeVersion}
11
+ </Text>
12
+ </View>
13
+ )
14
+ }
15
+
16
+ const styles = StyleSheet.create({
17
+ container: {
18
+ alignItems: 'center',
19
+ paddingTop: 24,
20
+ paddingBottom: 8,
21
+ paddingHorizontal: 16,
22
+ },
23
+ text: {
24
+ textAlign: 'center',
25
+ },
26
+ })
@@ -10,6 +10,7 @@ import { ViewProps } from 'react-native'
10
10
  import { ApiClient, useApiClient } from '../hooks/use_api_client'
11
11
  import { useAppState } from '../hooks/use_app_state'
12
12
  import { appGrantsRequestArgs } from '../hooks/use_chat_permissions'
13
+ import { featuresQueryOptions } from '../hooks/use_features'
13
14
  import { getRequestQueryKey, RequestQueryKey } from '../hooks/use_suspense_api'
14
15
  import { emitAuthRefresh } from '../utils/auth_events'
15
16
  import { ResponseError } from '../utils/response_error'
@@ -81,10 +82,13 @@ export function ApiProvider({ children }: ViewProps) {
81
82
  // This needs to live in the provider so that it can access the api client
82
83
  // and the chat query client
83
84
  const PrefetchQueries = () => {
85
+ const client = useApiClient()
86
+
84
87
  usePrefetchQuery({
85
88
  queryKey: getRequestQueryKey(appGrantsRequestArgs),
86
89
  queryFn: defaultQueryFn,
87
90
  })
91
+ usePrefetchQuery(featuresQueryOptions(client))
88
92
 
89
93
  return null
90
94
  }
@@ -1,26 +1,20 @@
1
- import { useSuspenseQuery } from '@tanstack/react-query'
1
+ import { queryOptions, useSuspenseQuery } from '@tanstack/react-query'
2
2
  import { useCallback } from 'react'
3
3
  import { ApiCollection } from '../types'
4
4
  import type { FeatureResource } from '../types/resources/feature_resource'
5
5
  import { getFeaturesRequestArgs, getFeaturesQueryKey } from '../utils/request/get_features'
6
- import { FIVE_MINUTES } from '../utils/time'
7
- import { useApiClient } from './use_api_client'
6
+ import { FIVE_MINUTES, ONE_MINUTE } from '../utils/time'
7
+ import { ApiClient, useApiClient } from './use_api_client'
8
8
 
9
9
  type FeatureName = (typeof availableFeatures)[keyof typeof availableFeatures]
10
10
 
11
+ type FeaturesCollection = ApiCollection<FeatureResource> & {
12
+ failure?: { status?: number }
13
+ }
14
+
11
15
  export function useFeatures() {
12
16
  const apiClient = useApiClient()
13
- const requestArgs = getFeaturesRequestArgs()
14
-
15
- const { data } = useSuspenseQuery({
16
- queryKey: getFeaturesQueryKey(),
17
- queryFn: () => {
18
- return apiClient.chat
19
- .get<ApiCollection<FeatureResource>>(requestArgs)
20
- .catch(() => stableEmptyFeatures)
21
- },
22
- staleTime: FIVE_MINUTES,
23
- })
17
+ const { data } = useSuspenseQuery(featuresQueryOptions(apiClient))
24
18
 
25
19
  const features = data.data
26
20
 
@@ -36,6 +30,23 @@ export function useFeatures() {
36
30
  }
37
31
  }
38
32
 
33
+ export const featuresQueryOptions = (apiClient: ApiClient) =>
34
+ queryOptions({
35
+ queryKey: getFeaturesQueryKey(),
36
+ queryFn: (): Promise<FeaturesCollection> => {
37
+ return apiClient.chat
38
+ .get<ApiCollection<FeatureResource>>(getFeaturesRequestArgs())
39
+ .catch(error => ({ ...stableEmptyFeatures, failure: { status: error?.status } }))
40
+ },
41
+ staleTime: query => {
42
+ const failure = query.state.data?.failure
43
+ if (!failure) return FIVE_MINUTES
44
+
45
+ return failure.status === 429 ? ONE_MINUTE : 0
46
+ },
47
+ gcTime: Infinity,
48
+ })
49
+
39
50
  export const availableFeatures = {
40
51
  gender_specific_conversations: 'ROLLOUT_gender_specific_conversations',
41
52
  message_reporting: 'ROLLOUT_MOBILE_message_reporting',
@@ -44,6 +55,7 @@ export const availableFeatures = {
44
55
  conversation_safety_lock: 'ROLLOUT_conversation_safety_lock',
45
56
  video_moderation: 'ROLLOUT_MOBILE_video_moderation',
46
57
  dm_search_clear_fix: 'ROLLOUT_MOBILE_dm_search_clear_fix',
58
+ search: 'ROLLOUT_search',
47
59
  } as const satisfies Record<string, `ROLLOUT_${string}`>
48
60
 
49
61
  const stableEmptyFeatures: ApiCollection<FeatureResource> = {