react-native-gifted-chat 2.8.0 → 2.8.2-alpha.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 (47) hide show
  1. package/README.md +18 -5
  2. package/lib/Bubble/index.d.ts +3 -27
  3. package/lib/Bubble/index.js +138 -125
  4. package/lib/Bubble/index.js.map +1 -1
  5. package/lib/Bubble/types.d.ts +3 -3
  6. package/lib/GiftedChat/index.js +19 -4
  7. package/lib/GiftedChat/index.js.map +1 -1
  8. package/lib/GiftedChat/types.d.ts +5 -10
  9. package/lib/Message/index.js +7 -12
  10. package/lib/Message/index.js.map +1 -1
  11. package/lib/Message/types.d.ts +2 -2
  12. package/lib/MessageContainer/components/Item/index.js +3 -1
  13. package/lib/MessageContainer/components/Item/index.js.map +1 -1
  14. package/lib/MessageContainer/index.js +69 -46
  15. package/lib/MessageContainer/index.js.map +1 -1
  16. package/lib/MessageContainer/styles.d.ts +3 -2
  17. package/lib/MessageContainer/styles.js +3 -2
  18. package/lib/MessageContainer/styles.js.map +1 -1
  19. package/lib/MessageContainer/types.d.ts +6 -9
  20. package/lib/MessageText.d.ts +11 -7
  21. package/lib/MessageText.js +57 -96
  22. package/lib/MessageText.js.map +1 -1
  23. package/lib/SystemMessage.d.ts +2 -1
  24. package/lib/SystemMessage.js +3 -2
  25. package/lib/SystemMessage.js.map +1 -1
  26. package/lib/utils.d.ts +2 -0
  27. package/lib/utils.js +66 -0
  28. package/lib/utils.js.map +1 -1
  29. package/package.json +37 -30
  30. package/src/Bubble/index.tsx +171 -172
  31. package/src/Bubble/types.ts +3 -3
  32. package/src/GiftedChat/index.tsx +23 -3
  33. package/src/GiftedChat/types.ts +6 -4
  34. package/src/Message/index.tsx +10 -16
  35. package/src/Message/types.ts +2 -2
  36. package/src/MessageContainer/components/Item/index.tsx +1 -0
  37. package/src/MessageContainer/index.tsx +93 -58
  38. package/src/MessageContainer/styles.ts +3 -2
  39. package/src/MessageContainer/types.ts +6 -9
  40. package/src/MessageText.tsx +86 -121
  41. package/src/SystemMessage.tsx +4 -1
  42. package/src/__tests__/DayAnimated.test.tsx +54 -0
  43. package/src/__tests__/GiftedChat.test.tsx +25 -0
  44. package/src/__tests__/__snapshots__/DayAnimated.test.tsx.snap +5 -0
  45. package/src/__tests__/__snapshots__/GiftedChat.test.tsx.snap +25 -0
  46. package/src/__tests__/__snapshots__/MessageContainer.test.tsx.snap +11 -9
  47. package/src/utils.ts +77 -1
@@ -1,46 +1,8 @@
1
- import React from 'react';
2
- import { Linking, StyleSheet, View, } from 'react-native';
3
- import ParsedText from 'react-native-parsed-text';
4
- import { useChatContext } from './GiftedChatContext';
1
+ import React, { useMemo, useCallback } from 'react';
2
+ import { Linking, StyleSheet, } from 'react-native';
3
+ import Autolink from 'react-native-autolink';
5
4
  import { error } from './logging';
6
- const WWW_URL_PATTERN = /^www\./i;
7
- const { textStyle } = StyleSheet.create({
8
- textStyle: {
9
- fontSize: 16,
10
- lineHeight: 20,
11
- marginTop: 5,
12
- marginBottom: 5,
13
- marginLeft: 10,
14
- marginRight: 10,
15
- },
16
- });
17
- const styles = {
18
- left: StyleSheet.create({
19
- container: {},
20
- text: {
21
- color: 'black',
22
- ...textStyle,
23
- },
24
- link: {
25
- color: 'black',
26
- textDecorationLine: 'underline',
27
- },
28
- }),
29
- right: StyleSheet.create({
30
- container: {},
31
- text: {
32
- color: 'white',
33
- ...textStyle,
34
- },
35
- link: {
36
- color: 'white',
37
- textDecorationLine: 'underline',
38
- },
39
- }),
40
- };
41
- const DEFAULT_OPTION_TITLES = ['Call', 'Text', 'Cancel'];
42
- export function MessageText({ currentMessage = {}, optionTitles = DEFAULT_OPTION_TITLES, position = 'left', containerStyle, textStyle, linkStyle: linkStyleProp, customTextStyle, parsePatterns, textProps, }) {
43
- const { actionSheet } = useChatContext();
5
+ export const MessageText = ({ currentMessage = {}, position = 'left', containerStyle, textStyle, linkStyle: linkStyleProp, customTextStyle, onPress: onPressProp, ...rest }) => {
44
6
  // TODO: React.memo
45
7
  // const shouldComponentUpdate = (nextProps: MessageTextProps<TMessage>) => {
46
8
  // return (
@@ -49,60 +11,59 @@ export function MessageText({ currentMessage = {}, optionTitles = DEFAULT_OPTION
49
11
  // currentMessage.text !== nextProps.currentMessage.text
50
12
  // )
51
13
  // }
52
- const onUrlPress = (url) => {
53
- // When someone sends a message that includes a website address beginning with "www." (omitting the scheme),
54
- // react-native-parsed-text recognizes it as a valid url, but Linking fails to open due to the missing scheme.
55
- if (WWW_URL_PATTERN.test(url))
56
- onUrlPress(`https://${url}`);
57
- else
58
- Linking.openURL(url).catch(e => {
59
- error(e, 'No handler for URL:', url);
60
- });
61
- };
62
- const onPhonePress = (phone) => {
63
- const options = optionTitles && optionTitles.length > 0
64
- ? optionTitles.slice(0, 3)
65
- : DEFAULT_OPTION_TITLES;
66
- const cancelButtonIndex = options.length - 1;
67
- actionSheet().showActionSheetWithOptions({
68
- options,
69
- cancelButtonIndex,
70
- }, (buttonIndex) => {
71
- switch (buttonIndex) {
72
- case 0:
73
- Linking.openURL(`tel:${phone}`).catch(e => {
74
- error(e, 'No handler for telephone');
75
- });
76
- break;
77
- case 1:
78
- Linking.openURL(`sms:${phone}`).catch(e => {
79
- error(e, 'No handler for text');
80
- });
81
- break;
82
- }
14
+ const onUrlPress = useCallback((url) => {
15
+ if (/^www\./i.test(url))
16
+ url = `https://${url}`;
17
+ Linking.openURL(url).catch(e => {
18
+ error(e, 'No handler for URL:', url);
83
19
  });
84
- };
85
- const onEmailPress = (email) => Linking.openURL(`mailto:${email}`).catch(e => error(e, 'No handler for mailto'));
86
- const linkStyle = [
87
- styles[position].link,
20
+ }, []);
21
+ const onPhonePress = useCallback((phone) => {
22
+ Linking.openURL(`tel:${phone}`).catch(e => {
23
+ error(e, 'No handler for telephone');
24
+ });
25
+ }, []);
26
+ const onEmailPress = useCallback((email) => Linking.openURL(`mailto:${email}`).catch(e => error(e, 'No handler for mailto')), []);
27
+ const linkStyle = useMemo(() => StyleSheet.flatten([
28
+ styles.link,
88
29
  linkStyleProp?.[position],
89
- ];
90
- return (<View style={[
91
- styles[position].container,
92
- containerStyle && containerStyle[position],
93
- ]}>
94
- <ParsedText style={[
95
- styles[position].text,
96
- textStyle && textStyle[position],
97
- customTextStyle,
98
- ]} parse={[
99
- ...(parsePatterns ? parsePatterns(linkStyle) : []),
100
- { type: 'url', style: linkStyle, onPress: onUrlPress },
101
- { type: 'phone', style: linkStyle, onPress: onPhonePress },
102
- { type: 'email', style: linkStyle, onPress: onEmailPress },
103
- ]} childrenProps={{ ...textProps }}>
104
- {currentMessage.text}
105
- </ParsedText>
106
- </View>);
107
- }
30
+ ]), [position, linkStyleProp]);
31
+ const handlePress = useCallback((url, match) => {
32
+ const type = match.getType();
33
+ if (onPressProp)
34
+ onPressProp(currentMessage, url, match);
35
+ else if (type === 'url')
36
+ onUrlPress(url);
37
+ else if (type === 'phone')
38
+ onPhonePress(url);
39
+ else if (type === 'email')
40
+ onEmailPress(url);
41
+ }, [onUrlPress, onPhonePress, onEmailPress, onPressProp, currentMessage]);
42
+ const style = useMemo(() => [
43
+ containerStyle?.[position],
44
+ styles[`text_${position}`],
45
+ textStyle?.[position],
46
+ customTextStyle,
47
+ ], [containerStyle, position, textStyle, customTextStyle]);
48
+ return (<Autolink style={style} {...rest} text={currentMessage.text} email link linkStyle={linkStyle} onPress={handlePress}/>);
49
+ };
50
+ const styles = StyleSheet.create({
51
+ text: {
52
+ fontSize: 16,
53
+ lineHeight: 20,
54
+ marginTop: 5,
55
+ marginBottom: 5,
56
+ marginLeft: 10,
57
+ marginRight: 10,
58
+ },
59
+ text_left: {
60
+ color: 'black',
61
+ },
62
+ text_right: {
63
+ color: 'white',
64
+ },
65
+ link: {
66
+ textDecorationLine: 'underline',
67
+ },
68
+ });
108
69
  //# sourceMappingURL=MessageText.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessageText.js","sourceRoot":"","sources":["../src/MessageText.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MessageText.js","sourceRoot":"","sources":["../src/MessageText.tsx"],"names":[],"mappings":"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"}
@@ -6,5 +6,6 @@ export interface SystemMessageProps<TMessage extends IMessage> {
6
6
  containerStyle?: StyleProp<ViewStyle>;
7
7
  wrapperStyle?: StyleProp<ViewStyle>;
8
8
  textStyle?: StyleProp<TextStyle>;
9
+ children?: React.ReactNode;
9
10
  }
10
- export declare function SystemMessage<TMessage extends IMessage = IMessage>({ currentMessage, containerStyle, wrapperStyle, textStyle, }: SystemMessageProps<TMessage>): React.JSX.Element | null;
11
+ export declare function SystemMessage<TMessage extends IMessage = IMessage>({ currentMessage, containerStyle, wrapperStyle, textStyle, children, }: SystemMessageProps<TMessage>): React.JSX.Element | null;
@@ -14,12 +14,13 @@ const styles = StyleSheet.create({
14
14
  fontWeight: '300',
15
15
  },
16
16
  });
17
- export function SystemMessage({ currentMessage, containerStyle, wrapperStyle, textStyle, }) {
17
+ export function SystemMessage({ currentMessage, containerStyle, wrapperStyle, textStyle, children, }) {
18
18
  if (currentMessage == null || currentMessage.system === false)
19
19
  return null;
20
20
  return (<View style={[stylesCommon.fill, stylesCommon.centerItems, styles.container, containerStyle]}>
21
21
  <View style={wrapperStyle}>
22
- <Text style={[styles.text, textStyle]}>{currentMessage.text}</Text>
22
+ {!!currentMessage.text && <Text style={[styles.text, textStyle]}>{currentMessage.text}</Text>}
23
+ {children}
23
24
  </View>
24
25
  </View>);
25
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SystemMessage.js","sourceRoot":"","sources":["../src/SystemMessage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EACL,UAAU,EACV,IAAI,EACJ,IAAI,GAIL,MAAM,cAAc,CAAA;AACrB,OAAO,KAAK,MAAM,SAAS,CAAA;AAE3B,OAAO,YAAY,MAAM,UAAU,CAAA;AAEnC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,SAAS,EAAE;QACT,SAAS,EAAE,CAAC;QACZ,YAAY,EAAE,EAAE;KACjB;IACD,IAAI,EAAE;QACJ,eAAe,EAAE,KAAK,CAAC,qBAAqB;QAC5C,KAAK,EAAE,KAAK,CAAC,YAAY;QACzB,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,KAAK;KAClB;CACF,CAAC,CAAA;AASF,MAAM,UAAU,aAAa,CAAwC,EACnE,cAAc,EACd,cAAc,EACd,YAAY,EACZ,SAAS,GACoB;IAC7B,IAAI,cAAc,IAAI,IAAI,IAAI,cAAc,CAAC,MAAM,KAAK,KAAK;QAC3D,OAAO,IAAI,CAAA;IAEb,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAC3F;MAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CACxB;QAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,CACpE;MAAA,EAAE,IAAI,CACR;IAAA,EAAE,IAAI,CAAC,CACR,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"SystemMessage.js","sourceRoot":"","sources":["../src/SystemMessage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EACL,UAAU,EACV,IAAI,EACJ,IAAI,GAIL,MAAM,cAAc,CAAA;AACrB,OAAO,KAAK,MAAM,SAAS,CAAA;AAE3B,OAAO,YAAY,MAAM,UAAU,CAAA;AAEnC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,SAAS,EAAE;QACT,SAAS,EAAE,CAAC;QACZ,YAAY,EAAE,EAAE;KACjB;IACD,IAAI,EAAE;QACJ,eAAe,EAAE,KAAK,CAAC,qBAAqB;QAC5C,KAAK,EAAE,KAAK,CAAC,YAAY;QACzB,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,KAAK;KAClB;CACF,CAAC,CAAA;AAUF,MAAM,UAAU,aAAa,CAAwC,EACnE,cAAc,EACd,cAAc,EACd,YAAY,EACZ,SAAS,EACT,QAAQ,GACqB;IAC7B,IAAI,cAAc,IAAI,IAAI,IAAI,cAAc,CAAC,MAAM,KAAK,KAAK;QAC3D,OAAO,IAAI,CAAA;IAEb,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAC3F;MAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CACxB;QAAA,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAC7F;QAAA,CAAC,QAAQ,CACX;MAAA,EAAE,IAAI,CACR;IAAA,EAAE,IAAI,CAAC,CACR,CAAA;AACH,CAAC"}
package/lib/utils.d.ts CHANGED
@@ -1,3 +1,5 @@
1
1
  import { IMessage } from './types';
2
2
  export declare function isSameDay(currentMessage: IMessage, diffMessage: IMessage | null | undefined): boolean;
3
3
  export declare function isSameUser(currentMessage: IMessage, diffMessage: IMessage | null | undefined): boolean;
4
+ export declare function useCallbackDebounced<T extends (...args: any[]) => any>(callbackFunc: T, deps: React.DependencyList | undefined, time: number): (...args: Parameters<T>) => void;
5
+ export declare function useCallbackThrottled<T extends (...args: any[]) => any>(callbackFunc: T, deps: React.DependencyList | undefined, time: number): (...args: Parameters<T>) => void;
package/lib/utils.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { useCallback, useEffect, useRef } from 'react';
1
2
  import dayjs from 'dayjs';
2
3
  export function isSameDay(currentMessage, diffMessage) {
3
4
  if (!diffMessage || !diffMessage.createdAt)
@@ -14,4 +15,69 @@ export function isSameUser(currentMessage, diffMessage) {
14
15
  currentMessage.user &&
15
16
  diffMessage.user._id === currentMessage.user._id);
16
17
  }
18
+ function processCallbackArguments(args) {
19
+ const [e, ...rest] = args;
20
+ const { nativeEvent } = e || {};
21
+ let params = [];
22
+ if (e) {
23
+ if (nativeEvent)
24
+ params.push({ nativeEvent });
25
+ else
26
+ params.push(e);
27
+ if (rest)
28
+ params = params.concat(rest);
29
+ }
30
+ return params;
31
+ }
32
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
33
+ export function useCallbackDebounced(callbackFunc, deps = [], time) {
34
+ const timeoutId = useRef(undefined);
35
+ const savedFunc = useCallback((...args) => {
36
+ const params = processCallbackArguments(args);
37
+ if (timeoutId.current)
38
+ clearTimeout(timeoutId.current);
39
+ timeoutId.current = setTimeout(() => {
40
+ callbackFunc(...params);
41
+ }, time);
42
+ // eslint-disable-next-line react-hooks/exhaustive-deps
43
+ }, [callbackFunc, time, ...deps]);
44
+ useEffect(() => {
45
+ return () => {
46
+ if (timeoutId.current)
47
+ clearTimeout(timeoutId.current);
48
+ };
49
+ }, []);
50
+ return savedFunc;
51
+ }
52
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
53
+ export function useCallbackThrottled(callbackFunc, deps = [], time) {
54
+ const lastExecution = useRef(0);
55
+ const timeoutId = useRef(undefined);
56
+ // we use function instead of arrow to access arguments object
57
+ const savedFunc = useCallback((...args) => {
58
+ const params = processCallbackArguments(args);
59
+ const now = Date.now();
60
+ const timeSinceLastExecution = now - lastExecution.current;
61
+ if (timeSinceLastExecution >= time) {
62
+ // Execute immediately if enough time has passed
63
+ lastExecution.current = now;
64
+ callbackFunc(...params);
65
+ }
66
+ else {
67
+ // Schedule execution for the remaining time
68
+ clearTimeout(timeoutId.current);
69
+ timeoutId.current = setTimeout(() => {
70
+ lastExecution.current = Date.now();
71
+ callbackFunc(...params);
72
+ }, time - timeSinceLastExecution);
73
+ }
74
+ // eslint-disable-next-line react-hooks/exhaustive-deps
75
+ }, [callbackFunc, time, ...deps]);
76
+ useEffect(() => {
77
+ return () => {
78
+ clearTimeout(timeoutId.current);
79
+ };
80
+ }, []);
81
+ return savedFunc;
82
+ }
17
83
  //# sourceMappingURL=utils.js.map
package/lib/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,MAAM,UAAU,SAAS,CACvB,cAAwB,EACxB,WAAwC;IAExC,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,SAAS;QACxC,OAAO,KAAK,CAAA;IAEd,MAAM,gBAAgB,GAAG,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,CAAA;IACxD,MAAM,aAAa,GAAG,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;IAElD,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE;QACzD,OAAO,KAAK,CAAA;IAEd,OAAO,gBAAgB,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA;AACtD,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,cAAwB,EACxB,WAAwC;IAExC,OAAO,CAAC,CAAC,CACP,WAAW;QACX,WAAW,CAAC,IAAI;QAChB,cAAc,CAAC,IAAI;QACnB,WAAW,CAAC,IAAI,CAAC,GAAG,KAAK,cAAc,CAAC,IAAI,CAAC,GAAG,CACjD,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-gifted-chat",
3
- "version": "2.8.0",
3
+ "version": "2.8.2-alpha.0",
4
4
  "description": "The most complete chat UI for React Native",
5
5
  "keywords": [
6
6
  "android",
@@ -33,7 +33,7 @@
33
33
  "build": "rm -rf lib/ && yarn tsc",
34
34
  "lint": "yarn eslint src",
35
35
  "lint:fix": "yarn eslint --cache --fix",
36
- "prepublishOnly": "yarn lint && yarn build && yarn test",
36
+ "prepublishOnly": "yarn lint && yarn build",
37
37
  "start": "cd example && expo start",
38
38
  "start:web": "cd example && expo start -w --dev",
39
39
  "test": "TZ=Europe/Paris jest --no-watchman",
@@ -51,59 +51,66 @@
51
51
  ]
52
52
  },
53
53
  "dependencies": {
54
- "@expo/react-native-action-sheet": "^4.1.0",
54
+ "@expo/react-native-action-sheet": "^4.1.1",
55
55
  "@types/lodash.isequal": "^4.5.8",
56
- "dayjs": "^1.11.13",
56
+ "dayjs": "^1.11.18",
57
57
  "lodash.isequal": "^4.5.0",
58
+ "react-native-autolink": "^4.2.0",
58
59
  "react-native-communications": "^2.2.1",
59
60
  "react-native-iphone-x-helper": "^1.3.1",
60
- "react-native-lightbox-v2": "^0.9.2",
61
- "react-native-parsed-text": "^0.0.22"
61
+ "react-native-lightbox-v2": "^0.9.2"
62
62
  },
63
63
  "devDependencies": {
64
- "@babel/core": "^7.26.8",
65
- "@babel/plugin-transform-react-jsx": "^7.25.9",
66
- "@babel/plugin-transform-unicode-property-regex": "^7.25.9",
67
- "@babel/preset-env": "^7.26.8",
68
- "@react-native/eslint-config": "^0.76.6",
64
+ "@babel/core": "^7.28.4",
65
+ "@babel/plugin-transform-react-jsx": "^7.27.1",
66
+ "@babel/plugin-transform-unicode-property-regex": "^7.27.1",
67
+ "@babel/preset-env": "^7.28.3",
69
68
  "@stylistic/eslint-plugin": "^3.1.0",
70
- "@types/jest": "^29.5.14",
71
- "@types/react": "^19.0.10",
72
- "@types/react-dom": "^19.0.4",
69
+ "@react-native-community/cli": "20.0.0",
70
+ "@react-native-community/cli-platform-android": "20.0.0",
71
+ "@react-native-community/cli-platform-ios": "20.0.0",
72
+ "@react-native/babel-preset": "0.81.5",
73
+ "@react-native/eslint-config": "0.81.5",
74
+ "@react-native/metro-config": "0.81.5",
75
+ "@react-native/typescript-config": "0.81.5",
76
+ "@types/jest": "^29.5.13",
77
+ "@types/react": "^19.1.0",
78
+ "@types/react-test-renderer": "^19.1.0",
79
+ "@types/react-dom": "^19.1.9",
73
80
  "@types/react-native": "^0.72.8",
74
- "@typescript-eslint/eslint-plugin": "^8.23.0",
75
- "@typescript-eslint/parser": "^8.23.0",
81
+ "@typescript-eslint/eslint-plugin": "^8.44.1",
82
+ "@typescript-eslint/parser": "^8.44.1",
76
83
  "babel-jest": "^29.7.0",
77
84
  "eslint": "^8.57.0",
78
85
  "eslint-config-standard": "^17.1.0",
79
86
  "eslint-config-standard-jsx": "^11.0.0",
80
- "eslint-plugin-import": "^2.31.0",
87
+ "eslint-plugin-import": "^2.32.0",
81
88
  "eslint-plugin-jest": "^28.11.0",
82
89
  "eslint-plugin-json": "^4.0.1",
83
- "eslint-plugin-n": "^17.15.1",
90
+ "eslint-plugin-n": "^17.23.1",
84
91
  "eslint-plugin-node": "^11.1.0",
85
92
  "eslint-plugin-promise": "^7.2.1",
86
- "eslint-plugin-react": "^7.37.4",
93
+ "eslint-plugin-react": "^7.37.5",
87
94
  "husky": "^9.1.7",
88
95
  "jest": "^29.7.0",
89
96
  "json": "^11.0.0",
90
- "lint-staged": "^15.4.3",
91
- "react": "^18.3.1",
92
- "react-dom": "^18.3.1",
93
- "react-native": "^0.76.6",
94
- "react-native-keyboard-controller": "^1.16.3",
95
- "react-native-reanimated": "^3.16.7",
96
- "react-test-renderer": "^18.3.1",
97
- "typescript": "^5.7.3"
97
+ "lint-staged": "^15.5.0",
98
+ "react": "19.1.0",
99
+ "react-dom": "19.1.0",
100
+ "react-native": "0.81.5",
101
+ "react-native-keyboard-controller": "^1.19.5",
102
+ "react-native-reanimated": "^3.19.4",
103
+ "react-test-renderer": "19.1.0",
104
+ "typescript": "^5.9.2"
98
105
  },
99
106
  "peerDependencies": {
100
- "react": "*",
107
+ "react": ">=18.0.0",
101
108
  "react-native": "*",
102
109
  "react-native-keyboard-controller": ">=1.0.0",
103
- "react-native-reanimated": ">=2.0.0"
110
+ "react-native-reanimated": ">=3.0.0"
104
111
  },
105
112
  "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e",
106
113
  "engines": {
107
- "node": ">=18"
114
+ "node": ">=20"
108
115
  }
109
116
  }