@kesha-antonov/react-native-chat 4.1.0 → 4.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.
Files changed (49) hide show
  1. package/README.md +85 -46
  2. package/lib/Bubble/index.d.ts.map +1 -1
  3. package/lib/Bubble/index.js +59 -19
  4. package/lib/Bubble/index.js.map +1 -1
  5. package/lib/Bubble/styles.d.ts +19 -0
  6. package/lib/Bubble/styles.d.ts.map +1 -1
  7. package/lib/Bubble/styles.js +23 -0
  8. package/lib/Bubble/styles.js.map +1 -1
  9. package/lib/Bubble/types.d.ts +10 -0
  10. package/lib/Bubble/types.d.ts.map +1 -1
  11. package/lib/Chat/ChatKeyboardAvoidingView.d.ts +16 -0
  12. package/lib/Chat/ChatKeyboardAvoidingView.d.ts.map +1 -0
  13. package/lib/Chat/ChatKeyboardAvoidingView.js +17 -0
  14. package/lib/Chat/ChatKeyboardAvoidingView.js.map +1 -0
  15. package/lib/Chat/index.d.ts.map +1 -1
  16. package/lib/Chat/index.js +20 -7
  17. package/lib/Chat/index.js.map +1 -1
  18. package/lib/Chat/types.d.ts +23 -3
  19. package/lib/Chat/types.d.ts.map +1 -1
  20. package/lib/Message/styles.d.ts +1 -4
  21. package/lib/Message/styles.d.ts.map +1 -1
  22. package/lib/Message/styles.js +4 -4
  23. package/lib/Message/styles.js.map +1 -1
  24. package/lib/MessagesContainer/FlashList.d.ts +9 -0
  25. package/lib/MessagesContainer/FlashList.d.ts.map +1 -0
  26. package/lib/MessagesContainer/FlashList.js +23 -0
  27. package/lib/MessagesContainer/FlashList.js.map +1 -0
  28. package/lib/MessagesContainer/index.d.ts.map +1 -1
  29. package/lib/MessagesContainer/index.js +113 -35
  30. package/lib/MessagesContainer/index.js.map +1 -1
  31. package/lib/MessagesContainer/styles.d.ts +0 -4
  32. package/lib/MessagesContainer/styles.d.ts.map +1 -1
  33. package/lib/MessagesContainer/styles.js +0 -4
  34. package/lib/MessagesContainer/styles.js.map +1 -1
  35. package/lib/MessagesContainer/types.d.ts +22 -2
  36. package/lib/MessagesContainer/types.d.ts.map +1 -1
  37. package/lib/hooks/useHasKeyboardProvider.d.ts +19 -0
  38. package/lib/hooks/useHasKeyboardProvider.d.ts.map +1 -0
  39. package/lib/hooks/useHasKeyboardProvider.js +31 -0
  40. package/lib/hooks/useHasKeyboardProvider.js.map +1 -0
  41. package/lib/hooks/useIsKeyboardVisible.d.ts +12 -0
  42. package/lib/hooks/useIsKeyboardVisible.d.ts.map +1 -0
  43. package/lib/hooks/useIsKeyboardVisible.js +31 -0
  44. package/lib/hooks/useIsKeyboardVisible.js.map +1 -0
  45. package/lib/hooks/useKeyboardVerticalOffset.d.ts +19 -0
  46. package/lib/hooks/useKeyboardVerticalOffset.d.ts.map +1 -0
  47. package/lib/hooks/useKeyboardVerticalOffset.js +22 -0
  48. package/lib/hooks/useKeyboardVerticalOffset.js.map +1 -0
  49. package/package.json +8 -1
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/MessagesContainer/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/MessagesContainer/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Whether a `KeyboardProvider` is already mounted above this component.
3
+ *
4
+ * Mounting a second one is not harmless. On Android every provider installs an
5
+ * `OnApplyWindowInsetsListener` on the *activity's* root view and rewrites the content
6
+ * view's margins from its own `statusBarTranslucent` / `navigationBarTranslucent` props,
7
+ * so a nested provider relayouts the whole host app - and it never restores the listener
8
+ * it replaced, leaving the app broken even after the chat screen is gone.
9
+ * See https://github.com/kesha-antonov/react-native-chat/issues/11
10
+ *
11
+ * Detection: with no provider above, `react-native-keyboard-controller` hands out a
12
+ * module-level fallback context. Two details give that fallback away, and neither can
13
+ * hold for a real provider (which creates one shared value per field): both fields point
14
+ * at the very same object, and that object is a hand-rolled stub rather than a Reanimated
15
+ * shared value. Requiring both keeps the failure mode safe - if either detail ever
16
+ * changes we simply mount our own provider, which is what we did before.
17
+ */
18
+ export declare function useHasKeyboardProvider(): boolean;
19
+ //# sourceMappingURL=useHasKeyboardProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useHasKeyboardProvider.d.ts","sourceRoot":"","sources":["../../src/hooks/useHasKeyboardProvider.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,IAAK,OAAO,CAMjD"}
@@ -0,0 +1,31 @@
1
+ import { createContext, useContext } from 'react';
2
+ import { KeyboardContext } from 'react-native-keyboard-controller';
3
+ // `react-native-keyboard-controller/jest` doesn't mock `KeyboardContext`, so fall back to
4
+ // an empty context to keep consumers' test suites running.
5
+ const Context = KeyboardContext ??
6
+ createContext(undefined);
7
+ const isReanimatedSharedValue = (value) => typeof value === 'object' && value !== null && '_isReanimatedSharedValue' in value;
8
+ /**
9
+ * Whether a `KeyboardProvider` is already mounted above this component.
10
+ *
11
+ * Mounting a second one is not harmless. On Android every provider installs an
12
+ * `OnApplyWindowInsetsListener` on the *activity's* root view and rewrites the content
13
+ * view's margins from its own `statusBarTranslucent` / `navigationBarTranslucent` props,
14
+ * so a nested provider relayouts the whole host app - and it never restores the listener
15
+ * it replaced, leaving the app broken even after the chat screen is gone.
16
+ * See https://github.com/kesha-antonov/react-native-chat/issues/11
17
+ *
18
+ * Detection: with no provider above, `react-native-keyboard-controller` hands out a
19
+ * module-level fallback context. Two details give that fallback away, and neither can
20
+ * hold for a real provider (which creates one shared value per field): both fields point
21
+ * at the very same object, and that object is a hand-rolled stub rather than a Reanimated
22
+ * shared value. Requiring both keeps the failure mode safe - if either detail ever
23
+ * changes we simply mount our own provider, which is what we did before.
24
+ */
25
+ export function useHasKeyboardProvider() {
26
+ const context = useContext(Context);
27
+ const progress = context?.reanimated?.progress;
28
+ const height = context?.reanimated?.height;
29
+ return progress !== height && isReanimatedSharedValue(progress);
30
+ }
31
+ //# sourceMappingURL=useHasKeyboardProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useHasKeyboardProvider.js","sourceRoot":"","sources":["../../src/hooks/useHasKeyboardProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAMlE,0FAA0F;AAC1F,2DAA2D;AAC3D,MAAM,OAAO,GACV,eAAmF;IACpF,aAAa,CAA4B,SAAS,CAAC,CAAA;AAErD,MAAM,uBAAuB,GAAG,CAAC,KAAc,EAAE,EAAE,CACjD,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,0BAA0B,IAAI,KAAK,CAAA;AAEpF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,sBAAsB;IACpC,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;IACnC,MAAM,QAAQ,GAAG,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAA;IAC9C,MAAM,MAAM,GAAG,OAAO,EAAE,UAAU,EAAE,MAAM,CAAA;IAE1C,OAAO,QAAQ,KAAK,MAAM,IAAI,uBAAuB,CAAC,QAAQ,CAAC,CAAA;AACjE,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Whether the software keyboard is currently on screen.
3
+ *
4
+ * Tracks `keyboardWillShow` / `keyboardWillHide` rather than the `Did` events so layout
5
+ * reacts *with* the keyboard animation instead of a beat after it.
6
+ *
7
+ * `isEnabled` exists because this re-renders its consumer on every keyboard transition:
8
+ * pass `false` and no listener is registered at all, so features that don't need the
9
+ * keyboard state pay nothing for it.
10
+ */
11
+ export declare function useIsKeyboardVisible(isEnabled?: boolean): boolean;
12
+ //# sourceMappingURL=useIsKeyboardVisible.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useIsKeyboardVisible.d.ts","sourceRoot":"","sources":["../../src/hooks/useIsKeyboardVisible.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAE,SAAS,GAAE,OAAc,GAAG,OAAO,CAwBxE"}
@@ -0,0 +1,31 @@
1
+ import { useEffect, useState } from 'react';
2
+ import { KeyboardController, KeyboardEvents } from 'react-native-keyboard-controller';
3
+ /**
4
+ * Whether the software keyboard is currently on screen.
5
+ *
6
+ * Tracks `keyboardWillShow` / `keyboardWillHide` rather than the `Did` events so layout
7
+ * reacts *with* the keyboard animation instead of a beat after it.
8
+ *
9
+ * `isEnabled` exists because this re-renders its consumer on every keyboard transition:
10
+ * pass `false` and no listener is registered at all, so features that don't need the
11
+ * keyboard state pay nothing for it.
12
+ */
13
+ export function useIsKeyboardVisible(isEnabled = true) {
14
+ const [isVisible, setIsVisible] = useState(() => isEnabled && (KeyboardController.isVisible?.() ?? false));
15
+ useEffect(() => {
16
+ if (!isEnabled) {
17
+ setIsVisible(false);
18
+ return;
19
+ }
20
+ // The keyboard may already be up when this turns on (e.g. the prop flipped while the
21
+ // composer was focused), and it can also change between render and subscribing.
22
+ setIsVisible(KeyboardController.isVisible?.() ?? false);
23
+ const subscriptions = [
24
+ KeyboardEvents.addListener('keyboardWillShow', () => setIsVisible(true)),
25
+ KeyboardEvents.addListener('keyboardWillHide', () => setIsVisible(false)),
26
+ ];
27
+ return () => subscriptions.forEach(subscription => subscription.remove());
28
+ }, [isEnabled]);
29
+ return isVisible;
30
+ }
31
+ //# sourceMappingURL=useIsKeyboardVisible.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useIsKeyboardVisible.js","sourceRoot":"","sources":["../../src/hooks/useIsKeyboardVisible.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AAErF;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAAE,YAAqB,IAAI;IAC7D,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CACxC,GAAG,EAAE,CAAC,SAAS,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,IAAI,KAAK,CAAC,CAC/D,CAAA;IAED,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,OAAM;QACR,CAAC;QAED,qFAAqF;QACrF,gFAAgF;QAChF,YAAY,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,IAAI,KAAK,CAAC,CAAA;QAEvD,MAAM,aAAa,GAAG;YACpB,cAAc,CAAC,WAAW,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACxE,cAAc,CAAC,WAAW,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;SAC1E,CAAA;QAED,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAA;IAC3E,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;IAEf,OAAO,SAAS,CAAA;AAClB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * How far down the window the chat container starts - the value
3
+ * `KeyboardAvoidingView` needs to keep the input toolbar on top of the keyboard.
4
+ *
5
+ * It cannot come from insets: a navigation header draws above the chat and insets
6
+ * cannot see it, so `insets.top` (the old default) placed a chat below a header
7
+ * roughly a header-height too low, i.e. behind the keyboard.
8
+ * See https://github.com/kesha-antonov/react-native-chat/issues/11
9
+ *
10
+ * The `SafeAreaProvider` that `ChatWrapper` mounts right around us reports exactly
11
+ * this: its frame is measured natively against the root view
12
+ * (`offsetDescendantRectToMyCoords` on Android, `convertRect:toView:` on iOS) and
13
+ * refreshed on every layout change. That provider is what makes this work - it is
14
+ * mounted unconditionally on purpose, and every wrapper between it and the
15
+ * `KeyboardAvoidingView` is a zero-offset fill view so that its top edge and the
16
+ * chat's top edge are the same line.
17
+ */
18
+ export declare function useKeyboardVerticalOffset(): number;
19
+ //# sourceMappingURL=useKeyboardVerticalOffset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useKeyboardVerticalOffset.d.ts","sourceRoot":"","sources":["../../src/hooks/useKeyboardVerticalOffset.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,yBAAyB,IAAK,MAAM,CAEnD"}
@@ -0,0 +1,22 @@
1
+ import { useSafeAreaFrame } from 'react-native-safe-area-context';
2
+ /**
3
+ * How far down the window the chat container starts - the value
4
+ * `KeyboardAvoidingView` needs to keep the input toolbar on top of the keyboard.
5
+ *
6
+ * It cannot come from insets: a navigation header draws above the chat and insets
7
+ * cannot see it, so `insets.top` (the old default) placed a chat below a header
8
+ * roughly a header-height too low, i.e. behind the keyboard.
9
+ * See https://github.com/kesha-antonov/react-native-chat/issues/11
10
+ *
11
+ * The `SafeAreaProvider` that `ChatWrapper` mounts right around us reports exactly
12
+ * this: its frame is measured natively against the root view
13
+ * (`offsetDescendantRectToMyCoords` on Android, `convertRect:toView:` on iOS) and
14
+ * refreshed on every layout change. That provider is what makes this work - it is
15
+ * mounted unconditionally on purpose, and every wrapper between it and the
16
+ * `KeyboardAvoidingView` is a zero-offset fill view so that its top edge and the
17
+ * chat's top edge are the same line.
18
+ */
19
+ export function useKeyboardVerticalOffset() {
20
+ return useSafeAreaFrame().y;
21
+ }
22
+ //# sourceMappingURL=useKeyboardVerticalOffset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useKeyboardVerticalOffset.js","sourceRoot":"","sources":["../../src/hooks/useKeyboardVerticalOffset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AAEjE;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,yBAAyB;IACvC,OAAO,gBAAgB,EAAE,CAAC,CAAC,CAAA;AAC7B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kesha-antonov/react-native-chat",
3
- "version": "4.1.0",
3
+ "version": "4.2.0",
4
4
  "description": "The most complete chat UI for React Native",
5
5
  "keywords": [
6
6
  "android",
@@ -70,6 +70,7 @@
70
70
  "@react-native/eslint-config": "0.81.5",
71
71
  "@react-native/metro-config": "0.81.5",
72
72
  "@react-native/typescript-config": "0.81.5",
73
+ "@shopify/flash-list": "^2.3.2",
73
74
  "@stylistic/eslint-plugin": "^3.1.0",
74
75
  "@testing-library/dom": "^10.4.1",
75
76
  "@testing-library/react": "^16.3.0",
@@ -105,6 +106,7 @@
105
106
  "typescript": "^5.9.3"
106
107
  },
107
108
  "peerDependencies": {
109
+ "@shopify/flash-list": "*",
108
110
  "react": ">=18.0.0",
109
111
  "react-native": "*",
110
112
  "react-native-gesture-handler": ">=2.0.0",
@@ -115,5 +117,10 @@
115
117
  "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e",
116
118
  "engines": {
117
119
  "node": ">=20"
120
+ },
121
+ "peerDependenciesMeta": {
122
+ "@shopify/flash-list": {
123
+ "optional": true
124
+ }
118
125
  }
119
126
  }