From f58a53646ff5769cd2dfa001e8ea8468b06247a6 Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Mon, 13 Oct 2025 02:27:32 +0530 Subject: [PATCH 01/98] reanimated v4 and worklets --- babel.config.js | 2 +- package.json | 3 ++- yarn.lock | 54 +++++++++++++++++++++++++------------------------ 3 files changed, 31 insertions(+), 28 deletions(-) diff --git a/babel.config.js b/babel.config.js index 7a7259adf01..dfcbe6d3afc 100644 --- a/babel.config.js +++ b/babel.config.js @@ -8,7 +8,7 @@ module.exports = { } ], ['@babel/plugin-proposal-decorators', { legacy: true }], - 'react-native-reanimated/plugin', + 'react-native-worklets/plugin', '@babel/plugin-transform-named-capturing-groups-regex', ['module:react-native-dotenv'] ], diff --git a/package.json b/package.json index f6a01974cf0..7c326d1f467 100644 --- a/package.json +++ b/package.json @@ -121,7 +121,7 @@ "react-native-platform-touchable": "1.1.1", "react-native-popover-view": "5.1.7", "react-native-prompt-android": "1.1.0", - "react-native-reanimated": "^3.17.1", + "react-native-reanimated": "^4.1.3", "react-native-restart": "0.0.22", "react-native-safe-area-context": "^5.4.0", "react-native-screens": "^4.13.1", @@ -131,6 +131,7 @@ "react-native-url-polyfill": "2.0.0", "react-native-vector-icons": "9.2.0", "react-native-webview": "^13.15.0", + "react-native-worklets": "^0.6.1", "react-redux": "8.0.5", "reanimated-tab-view": "^0.3.0", "redux": "4.2.0", diff --git a/yarn.lock b/yarn.lock index b7f53c6362e..d1b311763e7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12953,11 +12953,6 @@ react-native-image-crop-picker@RocketChat/react-native-image-crop-picker#5346870 version "0.50.1" resolved "https://codeload.github.com/RocketChat/react-native-image-crop-picker/tar.gz/5346870b0be10d300dc53924309dc6adc9946d50" -react-native-is-edge-to-edge@1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.1.6.tgz#69ec13f70d76e9245e275eed4140d0873a78f902" - integrity sha512-1pHnFTlBahins6UAajXUqeCOHew9l9C2C8tErnpGC3IyLJzvxD+TpYAixnCbrVS52f7+NvMttbiSI290XfwN0w== - react-native-is-edge-to-edge@^1.1.6, react-native-is-edge-to-edge@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.1.7.tgz#28947688f9fafd584e73a4f935ea9603bd9b1939" @@ -13059,23 +13054,13 @@ react-native-prompt-android@1.1.0: resolved "https://registry.yarnpkg.com/react-native-prompt-android/-/react-native-prompt-android-1.1.0.tgz#3c5168029075cb9f72549fd5f92403372fb234e9" integrity sha512-4JoyEaT2ZnK9IH+tDFpbTiQBgva8UIFGQf4/Uw/tnEVWBERlVlzcs5B82T9BkeEhEqXhp89JaiSBnLWj30lciw== -react-native-reanimated@^3.17.1: - version "3.17.1" - resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-3.17.1.tgz#42bed044ad046f09efcc00a80fabcc6eb18c7073" - integrity sha512-ECzLhLxMKLifv34a8799/MHqIazQZV9fLMNSMdixXQlzX71RyL3/ah3cz/h3ERoyhJAYRC2ySLLZho6pXSqMFQ== +react-native-reanimated@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-4.1.3.tgz#de29587b8ff7febada32497793803215faeac636" + integrity sha512-GP8wsi1u3nqvC1fMab/m8gfFwFyldawElCcUSBJQgfrXeLmsPPUOpDw44lbLeCpcwUuLa05WTVePdTEwCLTUZg== dependencies: - "@babel/plugin-transform-arrow-functions" "^7.0.0-0" - "@babel/plugin-transform-class-properties" "^7.0.0-0" - "@babel/plugin-transform-classes" "^7.0.0-0" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.0.0-0" - "@babel/plugin-transform-optional-chaining" "^7.0.0-0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0-0" - "@babel/plugin-transform-template-literals" "^7.0.0-0" - "@babel/plugin-transform-unicode-regex" "^7.0.0-0" - "@babel/preset-typescript" "^7.16.7" - convert-source-map "^2.0.0" - invariant "^2.2.4" - react-native-is-edge-to-edge "1.1.6" + react-native-is-edge-to-edge "^1.2.1" + semver "7.7.2" react-native-restart@0.0.22: version "0.0.22" @@ -13138,6 +13123,23 @@ react-native-webview@^13.15.0: escape-string-regexp "^4.0.0" invariant "2.2.4" +react-native-worklets@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/react-native-worklets/-/react-native-worklets-0.6.1.tgz#daa56dea896c7bdcead064b675ef341ac1f41029" + integrity sha512-URca8l7c7Uog7gv4mcg9KILdJlnbvwdS5yfXQYf5TDkD2W1VY1sduEKrD+sA3lUPXH/TG1vmXAvNxCNwPMYgGg== + dependencies: + "@babel/plugin-transform-arrow-functions" "^7.0.0-0" + "@babel/plugin-transform-class-properties" "^7.0.0-0" + "@babel/plugin-transform-classes" "^7.0.0-0" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.0.0-0" + "@babel/plugin-transform-optional-chaining" "^7.0.0-0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0-0" + "@babel/plugin-transform-template-literals" "^7.0.0-0" + "@babel/plugin-transform-unicode-regex" "^7.0.0-0" + "@babel/preset-typescript" "^7.16.7" + convert-source-map "^2.0.0" + semver "7.7.2" + react-native@*: version "0.73.6" resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.73.6.tgz#ed4c675e205a34bd62c4ce8b9bd1ca5c85126d5b" @@ -13813,6 +13815,11 @@ semver@7.5.2: dependencies: lru-cache "^6.0.0" +semver@7.7.2, semver@^7.6.2, semver@^7.7.1: + version "7.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" @@ -13830,11 +13837,6 @@ semver@^7.1.3, semver@^7.6.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== -semver@^7.6.2, semver@^7.7.1: - version "7.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" - integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== - send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" From 23ec3272873f191fd7bda45c73604992f9164039 Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Mon, 13 Oct 2025 02:43:52 +0530 Subject: [PATCH 02/98] some alignment --- app/containers/AudioPlayer/Seek.tsx | 210 ++++++++++++++-------------- 1 file changed, 108 insertions(+), 102 deletions(-) diff --git a/app/containers/AudioPlayer/Seek.tsx b/app/containers/AudioPlayer/Seek.tsx index 2cb9f1d33e6..cedac759294 100644 --- a/app/containers/AudioPlayer/Seek.tsx +++ b/app/containers/AudioPlayer/Seek.tsx @@ -1,15 +1,15 @@ import React from 'react'; import { LayoutChangeEvent, View, TextInput, TextInputProps, TouchableNativeFeedback } from 'react-native'; -import { PanGestureHandler, PanGestureHandlerGestureEvent } from 'react-native-gesture-handler'; +import { Gesture, GestureDetector, PanGestureHandlerGestureEvent } from 'react-native-gesture-handler'; import Animated, { - SharedValue, - runOnJS, - useAnimatedGestureHandler, - useAnimatedProps, - useAnimatedStyle, - useDerivedValue, - useSharedValue + SharedValue, + useAnimatedProps, + useAnimatedStyle, + useDerivedValue, + useSharedValue, + withTiming } from 'react-native-reanimated'; +import { scheduleOnRN } from 'react-native-worklets'; import styles from './styles'; import { useTheme } from '../../theme'; @@ -19,112 +19,118 @@ Animated.addWhitelistedNativeProps({ text: true }); const AnimatedTextInput = Animated.createAnimatedComponent(TextInput); interface ISeek { - duration: SharedValue; - currentTime: SharedValue; - loaded: boolean; - onChangeTime: (time: number) => Promise; + duration: SharedValue; + currentTime: SharedValue; + loaded: boolean; + onChangeTime: (time: number) => Promise; } function clamp(value: number, min: number, max: number) { - 'worklet'; + 'worklet'; - return Math.min(Math.max(value, min), max); + return Math.min(Math.max(value, min), max); } // https://docs.swmansion.com/react-native-reanimated/docs/2.x/fundamentals/worklets/ const formatTime = (ms: number) => { - 'worklet'; + 'worklet'; - const minutes = Math.floor(ms / 60); - const remainingSeconds = Math.floor(ms % 60); - const formattedMinutes = String(minutes).padStart(2, '0'); - const formattedSeconds = String(remainingSeconds).padStart(2, '0'); - return `${formattedMinutes}:${formattedSeconds}`; + const minutes = Math.floor(ms / 60); + const remainingSeconds = Math.floor(ms % 60); + const formattedMinutes = String(minutes).padStart(2, '0'); + const formattedSeconds = String(remainingSeconds).padStart(2, '0'); + return `${formattedMinutes}:${formattedSeconds}`; }; const Seek = ({ currentTime, duration, loaded = false, onChangeTime }: ISeek) => { - const { colors } = useTheme(); - - const maxWidth = useSharedValue(1); - const translateX = useSharedValue(0); - const timeLabel = useSharedValue(DEFAULT_TIME_LABEL); - const scale = useSharedValue(1); - const isPanning = useSharedValue(false); - - const styleLine = useAnimatedStyle(() => ({ - width: translateX.value - })); - - const styleThumb = useAnimatedStyle(() => ({ - transform: [{ translateX: translateX.value - THUMB_SEEK_SIZE / 2 }, { scale: scale.value }] - })); - - const onLayout = (event: LayoutChangeEvent) => { - const { width } = event.nativeEvent.layout; - maxWidth.value = width; - }; - - const onGestureEvent = useAnimatedGestureHandler({ - onStart: (event, ctx) => { - isPanning.value = true; - ctx.offsetX = translateX.value; - }, - onActive: ({ translationX }, ctx) => { - translateX.value = clamp(ctx.offsetX + translationX, 0, maxWidth.value); - scale.value = 1.3; - }, - onFinish() { - scale.value = 1; - isPanning.value = false; - runOnJS(onChangeTime)(Math.round(currentTime.value * 1000)); - } - }); - - useDerivedValue(() => { - if (isPanning.value) { - // When the user is panning, always the currentTime.value is been set different from the currentTime provided by - // the audio in progress - currentTime.value = (translateX.value * duration.value) / maxWidth.value || 0; - } else { - translateX.value = (currentTime.value * maxWidth.value) / duration.value || 0; - } - timeLabel.value = formatTime(currentTime.value); - }, [translateX, maxWidth, duration, isPanning, currentTime]); - - const timeLabelAnimatedProps = useAnimatedProps(() => { - if (currentTime.value !== 0) { - return { - text: timeLabel.value - } as TextInputProps; - } - return { - text: formatTime(duration.value) - } as TextInputProps; - }, [timeLabel, duration, currentTime]); - - const thumbColor = loaded ? colors.buttonBackgroundPrimaryDefault : colors.buttonBackgroundPrimaryDisabled; - - // TouchableNativeFeedback is avoiding do a long press message when seeking the audio - return ( - - - - - - - - - - - - - - ); + const { colors } = useTheme(); + + const maxWidth = useSharedValue(1); + const translateX = useSharedValue(0); + const timeLabel = useSharedValue(DEFAULT_TIME_LABEL); + const scale = useSharedValue(1); + const isPanning = useSharedValue(false); + const contextX = useSharedValue(0); + + const styleLine = useAnimatedStyle(() => ({ + width: translateX.value + })); + + const styleThumb = useAnimatedStyle(() => ({ + transform: [{ translateX: translateX.value - THUMB_SEEK_SIZE / 2 }, { scale: scale.value }] + })); + + const onLayout = (event: LayoutChangeEvent) => { + const { width } = event.nativeEvent.layout; + maxWidth.value = width; + }; + + const panGesture = Gesture.Pan() + .enabled(loaded) + .activeOffsetX([-ACTIVE_OFFSET_X, ACTIVE_OFFSET_X]) + .onBegin(() => { + isPanning.value = true; + }) + .onStart(() => { + contextX.value = translateX.value; + }) + .onUpdate((event) => { + const newX = contextX.value + event.translationX; + translateX.value = clamp(newX, 0, maxWidth.value); + scale.value = withTiming(1.3, { duration: 150 }); + }) + .onEnd(() => { + scale.value = withTiming(1, { duration: 150 }); + isPanning.value = false; + scheduleOnRN(onChangeTime, Math.round(currentTime.value * 1000)); + }); + + + useDerivedValue(() => { + if (isPanning.value) { + // When the user is panning, always the currentTime.value is been set different from the currentTime provided by + // the audio in progress + currentTime.value = (translateX.value * duration.value) / maxWidth.value || 0; + } else { + translateX.value = (currentTime.value * maxWidth.value) / duration.value || 0; + } + timeLabel.value = formatTime(currentTime.value); + }, [translateX, maxWidth, duration, isPanning, currentTime]); + + const timeLabelAnimatedProps = useAnimatedProps(() => { + if (currentTime.value !== 0) { + return { + text: timeLabel.value + } as TextInputProps; + } + return { + text: formatTime(duration.value) + } as TextInputProps; + }, [timeLabel, duration, currentTime]); + + const thumbColor = loaded ? colors.buttonBackgroundPrimaryDefault : colors.buttonBackgroundPrimaryDisabled; + + // TouchableNativeFeedback is avoiding do a long press message when seeking the audio + return ( + + + + + + + + + + + + + + ); }; export default Seek; From abab68f9a772d1f0d086672c70811f2ed7de9fa6 Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Mon, 13 Oct 2025 02:46:10 +0530 Subject: [PATCH 03/98] remove unused --- app/containers/AudioPlayer/Seek.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/containers/AudioPlayer/Seek.tsx b/app/containers/AudioPlayer/Seek.tsx index cedac759294..028901920a0 100644 --- a/app/containers/AudioPlayer/Seek.tsx +++ b/app/containers/AudioPlayer/Seek.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { LayoutChangeEvent, View, TextInput, TextInputProps, TouchableNativeFeedback } from 'react-native'; -import { Gesture, GestureDetector, PanGestureHandlerGestureEvent } from 'react-native-gesture-handler'; +import { Gesture, GestureDetector } from 'react-native-gesture-handler'; import Animated, { SharedValue, useAnimatedProps, From 1514c7e16afdbd59fbc13e284352e91ea1a3ef86 Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Mon, 13 Oct 2025 02:49:27 +0530 Subject: [PATCH 04/98] runOnJs is now scheduleOnRN --- .../MessageComposer/hooks/useEmojiKeyboard.tsx | 7 ++++--- app/containers/RoomItem/Actions.tsx | 10 +++++----- app/containers/RoomItem/Touchable.tsx | 7 ++++--- app/views/RoomView/List/components/List.tsx | 7 ++++--- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/app/containers/MessageComposer/hooks/useEmojiKeyboard.tsx b/app/containers/MessageComposer/hooks/useEmojiKeyboard.tsx index 34b39818433..a835912050e 100644 --- a/app/containers/MessageComposer/hooks/useEmojiKeyboard.tsx +++ b/app/containers/MessageComposer/hooks/useEmojiKeyboard.tsx @@ -1,8 +1,9 @@ import React, { createContext, ReactElement, useContext, useState } from 'react'; import { Platform } from 'react-native'; import { useKeyboardHandler } from 'react-native-keyboard-controller'; -import { runOnJS, SharedValue, useAnimatedReaction, useSharedValue } from 'react-native-reanimated'; +import { SharedValue, useAnimatedReaction, useSharedValue } from 'react-native-reanimated'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; +import { scheduleOnRN } from 'react-native-worklets'; import { MessageInnerContext } from '../context'; @@ -155,7 +156,7 @@ export const useEmojiKeyboard = () => { } else if (previousHeight.value === EMOJI_KEYBOARD_FIXED_HEIGHT) { updateHeight(); } - runOnJS(setShowEmojiKeyboard)(currentValue); + scheduleOnRN(setShowEmojiKeyboard, currentValue); }, [showEmojiPickerSharedValue] ); @@ -171,7 +172,7 @@ export const useEmojiKeyboard = () => { } else if (currentValue === false && showEmojiPickerSharedValue.value === true) { openEmojiPicker(); } - runOnJS(setShowEmojiSearchbar)(currentValue); + scheduleOnRN(setShowEmojiSearchbar, currentValue); }, [showEmojiSearchbarSharedValue] ); diff --git a/app/containers/RoomItem/Actions.tsx b/app/containers/RoomItem/Actions.tsx index 8782b74f6ce..82e091ec411 100644 --- a/app/containers/RoomItem/Actions.tsx +++ b/app/containers/RoomItem/Actions.tsx @@ -4,12 +4,12 @@ import Animated, { useAnimatedStyle, interpolate, withSpring, - runOnJS, useAnimatedReaction, useSharedValue } from 'react-native-reanimated'; import { RectButton } from 'react-native-gesture-handler'; import * as Haptics from 'expo-haptics'; +import { scheduleOnRN } from 'react-native-worklets'; import { CustomIcon } from '../CustomIcon'; import { DisplayMode } from '../../lib/constants/constantDisplayMode'; @@ -81,14 +81,14 @@ export const RightActions = React.memo(({ transX, favorite, width, toggleFav, on // Triggers the animation and hapticFeedback if swipe reaches/unreaches the threshold. if (I18n.isRTL) { if (previousTransX && currentTransX > LONG_SWIPE && previousTransX <= LONG_SWIPE) { - runOnJS(triggerHideAnimation)(ACTION_WIDTH); + scheduleOnRN(triggerHideAnimation, ACTION_WIDTH); } else if (previousTransX && currentTransX <= LONG_SWIPE && previousTransX > LONG_SWIPE) { - runOnJS(triggerHideAnimation)(0); + scheduleOnRN(triggerHideAnimation, 0); } } else if (previousTransX && currentTransX < -LONG_SWIPE && previousTransX >= -LONG_SWIPE) { - runOnJS(triggerHideAnimation)(-ACTION_WIDTH); + scheduleOnRN(triggerHideAnimation, -ACTION_WIDTH); } else if (previousTransX && currentTransX >= -LONG_SWIPE && previousTransX < -LONG_SWIPE) { - runOnJS(triggerHideAnimation)(0); + scheduleOnRN(triggerHideAnimation, 0); } } ); diff --git a/app/containers/RoomItem/Touchable.tsx b/app/containers/RoomItem/Touchable.tsx index 2059831b827..ae24caf06b1 100644 --- a/app/containers/RoomItem/Touchable.tsx +++ b/app/containers/RoomItem/Touchable.tsx @@ -1,6 +1,7 @@ import React, { useRef, memo } from 'react'; -import Animated, { useSharedValue, useAnimatedStyle, withSpring, runOnJS } from 'react-native-reanimated'; +import Animated, { useSharedValue, useAnimatedStyle, withSpring } from 'react-native-reanimated'; import { Gesture, GestureDetector, GestureUpdateEvent, PanGestureHandlerEventPayload } from 'react-native-gesture-handler'; +import { scheduleOnRN } from 'react-native-worklets'; import Touch from '../Touch'; import { ACTION_WIDTH, LONG_SWIPE, SMALL_SWIPE } from './styles'; @@ -167,7 +168,7 @@ const Touchable = ({ const longPressGesture = Gesture.LongPress() .minDuration(500) .onStart(() => { - runOnJS(handleLongPress)(); + scheduleOnRN(handleLongPress); }); const panGesture = Gesture.Pan() @@ -179,7 +180,7 @@ const Touchable = ({ if (transX.value > 2 * width) transX.value = 2 * width; }) .onEnd(event => { - runOnJS(handleRelease)(event); + scheduleOnRN(handleRelease, event); }); // Use Race instead of Simultaneous to prevent conflicts diff --git a/app/views/RoomView/List/components/List.tsx b/app/views/RoomView/List/components/List.tsx index 6ffa531d297..e0ca315cdf5 100644 --- a/app/views/RoomView/List/components/List.tsx +++ b/app/views/RoomView/List/components/List.tsx @@ -1,6 +1,7 @@ import React, { useState } from 'react'; import { StyleSheet, View } from 'react-native'; -import Animated, { runOnJS, useAnimatedScrollHandler } from 'react-native-reanimated'; +import Animated, { useAnimatedScrollHandler } from 'react-native-reanimated'; +import { scheduleOnRN } from 'react-native-worklets'; import { isIOS } from '../../../../lib/methods/helpers'; import scrollPersistTaps from '../../../../lib/methods/helpers/scrollPersistTaps'; @@ -24,9 +25,9 @@ const List = ({ listRef, jumpToBottom, ...props }: IListProps) => { const scrollHandler = useAnimatedScrollHandler({ onScroll: event => { if (event.contentOffset.y > SCROLL_LIMIT) { - runOnJS(setVisible)(true); + scheduleOnRN(setVisible, true); } else { - runOnJS(setVisible)(false); + scheduleOnRN(setVisible, false); } } }); From 5f28192e3db28731df8b06d29865c1ef0fbdb359 Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Mon, 13 Oct 2025 02:49:31 +0530 Subject: [PATCH 05/98] jest update --- jest.setup.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/jest.setup.js b/jest.setup.js index 6374b2beb62..0855b235cb8 100644 --- a/jest.setup.js +++ b/jest.setup.js @@ -27,10 +27,12 @@ jest.mock('react-native-reanimated', () => { ...actual, useSharedValue: jest.fn(init => ({ value: init })), useAnimatedReaction: jest.fn(), - runOnJS: jest.fn(fn => fn), withTiming: jest.fn(value => value) }; }); +jest.mock('react-native-worklets', () => ({ + scheduleOnRN: jest.fn() +})); jest.mock('@react-native-clipboard/clipboard', () => mockClipboard); From c0a4d2586e5baab266652d1d135a7809af5b4df8 Mon Sep 17 00:00:00 2001 From: Rohit3523 Date: Sun, 12 Oct 2025 21:21:17 +0000 Subject: [PATCH 06/98] chore: format code with Prettier [skip ci] --- app/containers/AudioPlayer/Seek.tsx | 211 ++++++++++++++-------------- 1 file changed, 105 insertions(+), 106 deletions(-) diff --git a/app/containers/AudioPlayer/Seek.tsx b/app/containers/AudioPlayer/Seek.tsx index 028901920a0..2455916368b 100644 --- a/app/containers/AudioPlayer/Seek.tsx +++ b/app/containers/AudioPlayer/Seek.tsx @@ -2,12 +2,12 @@ import React from 'react'; import { LayoutChangeEvent, View, TextInput, TextInputProps, TouchableNativeFeedback } from 'react-native'; import { Gesture, GestureDetector } from 'react-native-gesture-handler'; import Animated, { - SharedValue, - useAnimatedProps, - useAnimatedStyle, - useDerivedValue, - useSharedValue, - withTiming + SharedValue, + useAnimatedProps, + useAnimatedStyle, + useDerivedValue, + useSharedValue, + withTiming } from 'react-native-reanimated'; import { scheduleOnRN } from 'react-native-worklets'; @@ -19,118 +19,117 @@ Animated.addWhitelistedNativeProps({ text: true }); const AnimatedTextInput = Animated.createAnimatedComponent(TextInput); interface ISeek { - duration: SharedValue; - currentTime: SharedValue; - loaded: boolean; - onChangeTime: (time: number) => Promise; + duration: SharedValue; + currentTime: SharedValue; + loaded: boolean; + onChangeTime: (time: number) => Promise; } function clamp(value: number, min: number, max: number) { - 'worklet'; + 'worklet'; - return Math.min(Math.max(value, min), max); + return Math.min(Math.max(value, min), max); } // https://docs.swmansion.com/react-native-reanimated/docs/2.x/fundamentals/worklets/ const formatTime = (ms: number) => { - 'worklet'; + 'worklet'; - const minutes = Math.floor(ms / 60); - const remainingSeconds = Math.floor(ms % 60); - const formattedMinutes = String(minutes).padStart(2, '0'); - const formattedSeconds = String(remainingSeconds).padStart(2, '0'); - return `${formattedMinutes}:${formattedSeconds}`; + const minutes = Math.floor(ms / 60); + const remainingSeconds = Math.floor(ms % 60); + const formattedMinutes = String(minutes).padStart(2, '0'); + const formattedSeconds = String(remainingSeconds).padStart(2, '0'); + return `${formattedMinutes}:${formattedSeconds}`; }; const Seek = ({ currentTime, duration, loaded = false, onChangeTime }: ISeek) => { - const { colors } = useTheme(); - - const maxWidth = useSharedValue(1); - const translateX = useSharedValue(0); - const timeLabel = useSharedValue(DEFAULT_TIME_LABEL); - const scale = useSharedValue(1); - const isPanning = useSharedValue(false); - const contextX = useSharedValue(0); - - const styleLine = useAnimatedStyle(() => ({ - width: translateX.value - })); - - const styleThumb = useAnimatedStyle(() => ({ - transform: [{ translateX: translateX.value - THUMB_SEEK_SIZE / 2 }, { scale: scale.value }] - })); - - const onLayout = (event: LayoutChangeEvent) => { - const { width } = event.nativeEvent.layout; - maxWidth.value = width; - }; - - const panGesture = Gesture.Pan() - .enabled(loaded) - .activeOffsetX([-ACTIVE_OFFSET_X, ACTIVE_OFFSET_X]) - .onBegin(() => { - isPanning.value = true; - }) - .onStart(() => { - contextX.value = translateX.value; - }) - .onUpdate((event) => { - const newX = contextX.value + event.translationX; - translateX.value = clamp(newX, 0, maxWidth.value); - scale.value = withTiming(1.3, { duration: 150 }); - }) - .onEnd(() => { - scale.value = withTiming(1, { duration: 150 }); - isPanning.value = false; - scheduleOnRN(onChangeTime, Math.round(currentTime.value * 1000)); - }); - - - useDerivedValue(() => { - if (isPanning.value) { - // When the user is panning, always the currentTime.value is been set different from the currentTime provided by - // the audio in progress - currentTime.value = (translateX.value * duration.value) / maxWidth.value || 0; - } else { - translateX.value = (currentTime.value * maxWidth.value) / duration.value || 0; - } - timeLabel.value = formatTime(currentTime.value); - }, [translateX, maxWidth, duration, isPanning, currentTime]); - - const timeLabelAnimatedProps = useAnimatedProps(() => { - if (currentTime.value !== 0) { - return { - text: timeLabel.value - } as TextInputProps; - } - return { - text: formatTime(duration.value) - } as TextInputProps; - }, [timeLabel, duration, currentTime]); - - const thumbColor = loaded ? colors.buttonBackgroundPrimaryDefault : colors.buttonBackgroundPrimaryDisabled; - - // TouchableNativeFeedback is avoiding do a long press message when seeking the audio - return ( - - - - - - - - - - - - - - ); + const { colors } = useTheme(); + + const maxWidth = useSharedValue(1); + const translateX = useSharedValue(0); + const timeLabel = useSharedValue(DEFAULT_TIME_LABEL); + const scale = useSharedValue(1); + const isPanning = useSharedValue(false); + const contextX = useSharedValue(0); + + const styleLine = useAnimatedStyle(() => ({ + width: translateX.value + })); + + const styleThumb = useAnimatedStyle(() => ({ + transform: [{ translateX: translateX.value - THUMB_SEEK_SIZE / 2 }, { scale: scale.value }] + })); + + const onLayout = (event: LayoutChangeEvent) => { + const { width } = event.nativeEvent.layout; + maxWidth.value = width; + }; + + const panGesture = Gesture.Pan() + .enabled(loaded) + .activeOffsetX([-ACTIVE_OFFSET_X, ACTIVE_OFFSET_X]) + .onBegin(() => { + isPanning.value = true; + }) + .onStart(() => { + contextX.value = translateX.value; + }) + .onUpdate(event => { + const newX = contextX.value + event.translationX; + translateX.value = clamp(newX, 0, maxWidth.value); + scale.value = withTiming(1.3, { duration: 150 }); + }) + .onEnd(() => { + scale.value = withTiming(1, { duration: 150 }); + isPanning.value = false; + scheduleOnRN(onChangeTime, Math.round(currentTime.value * 1000)); + }); + + useDerivedValue(() => { + if (isPanning.value) { + // When the user is panning, always the currentTime.value is been set different from the currentTime provided by + // the audio in progress + currentTime.value = (translateX.value * duration.value) / maxWidth.value || 0; + } else { + translateX.value = (currentTime.value * maxWidth.value) / duration.value || 0; + } + timeLabel.value = formatTime(currentTime.value); + }, [translateX, maxWidth, duration, isPanning, currentTime]); + + const timeLabelAnimatedProps = useAnimatedProps(() => { + if (currentTime.value !== 0) { + return { + text: timeLabel.value + } as TextInputProps; + } + return { + text: formatTime(duration.value) + } as TextInputProps; + }, [timeLabel, duration, currentTime]); + + const thumbColor = loaded ? colors.buttonBackgroundPrimaryDefault : colors.buttonBackgroundPrimaryDisabled; + + // TouchableNativeFeedback is avoiding do a long press message when seeking the audio + return ( + + + + + + + + + + + + + + ); }; export default Seek; From f27e9f5f4730d710f4460c8a4951efb482b7a8aa Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Mon, 13 Oct 2025 02:54:15 +0530 Subject: [PATCH 07/98] let me trigger ci --- jest.setup.js | 1 + 1 file changed, 1 insertion(+) diff --git a/jest.setup.js b/jest.setup.js index 0855b235cb8..28f70e8295b 100644 --- a/jest.setup.js +++ b/jest.setup.js @@ -30,6 +30,7 @@ jest.mock('react-native-reanimated', () => { withTiming: jest.fn(value => value) }; }); + jest.mock('react-native-worklets', () => ({ scheduleOnRN: jest.fn() })); From 14ecf417f9c960e9ed15b4f2ce38958bcb45f10c Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Mon, 13 Oct 2025 02:54:23 +0530 Subject: [PATCH 08/98] revert --- jest.setup.js | 1 - 1 file changed, 1 deletion(-) diff --git a/jest.setup.js b/jest.setup.js index 28f70e8295b..0855b235cb8 100644 --- a/jest.setup.js +++ b/jest.setup.js @@ -30,7 +30,6 @@ jest.mock('react-native-reanimated', () => { withTiming: jest.fn(value => value) }; }); - jest.mock('react-native-worklets', () => ({ scheduleOnRN: jest.fn() })); From 58b5141ad99d2e84b1b1663e087ff8a0389e92a7 Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Mon, 13 Oct 2025 03:10:10 +0530 Subject: [PATCH 09/98] Using gorhom bottomsheet --- app/containers/ActionSheet/ActionSheet.tsx | 2 +- app/containers/ActionSheet/BottomSheetContent.tsx | 2 +- app/containers/TextInput/FormTextInput.tsx | 2 +- package.json | 3 +-- yarn.lock | 15 ++++----------- 5 files changed, 8 insertions(+), 16 deletions(-) diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index 79995694667..970a9f6a085 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -3,7 +3,7 @@ import * as Haptics from 'expo-haptics'; import React, { forwardRef, isValidElement, useEffect, useImperativeHandle, useRef, useState, useCallback } from 'react'; import { Keyboard, LayoutChangeEvent, useWindowDimensions } from 'react-native'; import { Easing, useDerivedValue, useSharedValue } from 'react-native-reanimated'; -import BottomSheet, { BottomSheetBackdrop, BottomSheetBackdropProps } from '@discord/bottom-sheet'; +import BottomSheet, { BottomSheetBackdrop, BottomSheetBackdropProps } from '@gorhom/bottom-sheet'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { useTheme } from '../../theme'; diff --git a/app/containers/ActionSheet/BottomSheetContent.tsx b/app/containers/ActionSheet/BottomSheetContent.tsx index 7fbe5a63ae9..c0533f37410 100644 --- a/app/containers/ActionSheet/BottomSheetContent.tsx +++ b/app/containers/ActionSheet/BottomSheetContent.tsx @@ -1,6 +1,6 @@ import { Text, useWindowDimensions, ViewProps } from 'react-native'; import React from 'react'; -import { BottomSheetView, BottomSheetFlatList } from '@discord/bottom-sheet'; +import { BottomSheetView, BottomSheetFlatList } from '@gorhom/bottom-sheet'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import I18n from '../../i18n'; diff --git a/app/containers/TextInput/FormTextInput.tsx b/app/containers/TextInput/FormTextInput.tsx index 342f09a20d9..e331ce04b6c 100644 --- a/app/containers/TextInput/FormTextInput.tsx +++ b/app/containers/TextInput/FormTextInput.tsx @@ -1,6 +1,6 @@ import React, { useMemo, useState } from 'react'; import { StyleProp, StyleSheet, Text, TextInput as RNTextInput, TextInputProps, TextStyle, View, ViewStyle } from 'react-native'; -import { BottomSheetTextInput } from '@discord/bottom-sheet'; +import { BottomSheetTextInput } from '@gorhom/bottom-sheet'; import Touchable from 'react-native-platform-touchable'; import { A11y } from 'react-native-a11y-order'; diff --git a/package.json b/package.json index 7c326d1f467..8208f2bdb6f 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,6 @@ }, "dependencies": { "@bugsnag/react-native": "8.4.0", - "@discord/bottom-sheet": "bluesky-social/react-native-bottom-sheet", "@hookform/resolvers": "^2.9.10", "@notifee/react-native": "7.8.2", "@nozbe/watermelondb": "^0.28.0", @@ -164,7 +163,7 @@ "@babel/runtime": "^7.25.0", "@bugsnag/cli": "^3.2.1", "@bugsnag/source-maps": "^2.3.3", - "@gorhom/bottom-sheet": "^5.1.6", + "@gorhom/bottom-sheet": "^5.2.6", "@react-native-community/cli": "18.0.0", "@react-native-community/cli-platform-android": "18.0.0", "@react-native-community/cli-platform-ios": "18.0.0", diff --git a/yarn.lock b/yarn.lock index d1b311763e7..c4200804a70 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2471,13 +2471,6 @@ enabled "2.0.x" kuler "^2.0.0" -"@discord/bottom-sheet@bluesky-social/react-native-bottom-sheet": - version "4.6.1" - resolved "https://codeload.github.com/bluesky-social/react-native-bottom-sheet/tar.gz/28a87d1bb55e10fc355fa1455545a30734995908" - dependencies: - "@gorhom/portal" "1.0.14" - invariant "^2.2.4" - "@egjs/hammerjs@^2.0.17": version "2.0.17" resolved "https://registry.yarnpkg.com/@egjs/hammerjs/-/hammerjs-2.0.17.tgz#5dc02af75a6a06e4c2db0202cae38c9263895124" @@ -3378,10 +3371,10 @@ resolved "https://registry.yarnpkg.com/@flatten-js/interval-tree/-/interval-tree-1.1.2.tgz#fcc891da48bc230392884be01c26fe8c625702e8" integrity sha512-OwLoV9E/XM6b7bes2rSFnGNjyRy7vcoIHFTnmBR2WAaZTf0Fe4EX4GdA65vU1KgFAasti7iRSg2dZfYd1Zt00Q== -"@gorhom/bottom-sheet@^5.1.6": - version "5.1.6" - resolved "https://registry.yarnpkg.com/@gorhom/bottom-sheet/-/bottom-sheet-5.1.6.tgz#92365894ae4d4eefdbaa577408cfaf62463a9490" - integrity sha512-0b5tQj4fTaZAjST1PnkCp0p7d8iRqMezibTcqc8Kkn3N23Vn6upORNTD1fH0bLfwRt6e0WnZ7DjAmq315lrcKQ== +"@gorhom/bottom-sheet@^5.2.6": + version "5.2.6" + resolved "https://registry.yarnpkg.com/@gorhom/bottom-sheet/-/bottom-sheet-5.2.6.tgz#5f2045f6ca965383afe39f7dfa3afad1502b7467" + integrity sha512-vmruJxdiUGDg+ZYcDmS30XDhq/h/+QkINOI5LY/uGjx8cPGwgJW0H6AB902gNTKtccbiKe/rr94EwdmIEz+LAQ== dependencies: "@gorhom/portal" "1.0.14" invariant "^2.2.4" From a6240491e49d20b9826799f361648a1288459482 Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Mon, 13 Oct 2025 03:10:18 +0530 Subject: [PATCH 10/98] jest and test changes --- .../__snapshots__/Message.test.tsx.snap | 50 ------------------- jest.setup.js | 5 +- 2 files changed, 1 insertion(+), 54 deletions(-) diff --git a/app/containers/message/__snapshots__/Message.test.tsx.snap b/app/containers/message/__snapshots__/Message.test.tsx.snap index 720ac298cbc..9696d90a257 100644 --- a/app/containers/message/__snapshots__/Message.test.tsx.snap +++ b/app/containers/message/__snapshots__/Message.test.tsx.snap @@ -101088,9 +101088,6 @@ exports[`Story Snapshots: WithAudio should match snapshot 1`] = ` { withTiming: jest.fn(value => value) }; }); -jest.mock('react-native-worklets', () => ({ - scheduleOnRN: jest.fn() -})); jest.mock('@react-native-clipboard/clipboard', () => mockClipboard); @@ -152,7 +149,7 @@ jest.mock('react-native-notifications', () => ({ } })); -jest.mock('@discord/bottom-sheet', () => { +jest.mock('@gorhom/bottom-sheet', () => { const react = require('react-native'); return { __esModule: true, From 00af6b862f655362f5e8e0e1dca4d97328302835 Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Mon, 13 Oct 2025 03:11:10 +0530 Subject: [PATCH 11/98] remove patch --- patches/@discord+bottom-sheet+4.6.1.patch | 70 ----------------------- 1 file changed, 70 deletions(-) delete mode 100644 patches/@discord+bottom-sheet+4.6.1.patch diff --git a/patches/@discord+bottom-sheet+4.6.1.patch b/patches/@discord+bottom-sheet+4.6.1.patch deleted file mode 100644 index 0dff575d79f..00000000000 --- a/patches/@discord+bottom-sheet+4.6.1.patch +++ /dev/null @@ -1,70 +0,0 @@ -diff --git a/node_modules/@discord/bottom-sheet/src/components/bottomSheet/BottomSheet.tsx b/node_modules/@discord/bottom-sheet/src/components/bottomSheet/BottomSheet.tsx -index 2897fef..9a8505e 100644 ---- a/node_modules/@discord/bottom-sheet/src/components/bottomSheet/BottomSheet.tsx -+++ b/node_modules/@discord/bottom-sheet/src/components/bottomSheet/BottomSheet.tsx -@@ -1382,7 +1382,8 @@ const BottomSheetComponent = forwardRef( - if (containerHeight !== _previousContainerHeight) { - animationSource = ANIMATION_SOURCE.CONTAINER_RESIZE; - animationConfig = { -- duration: 0, -+ // https://github.com/gorhom/react-native-bottom-sheet/pull/1497 -+ duration: 1, - }; - } - } -diff --git a/node_modules/@discord/bottom-sheet/src/components/bottomSheetHandleContainer/BottomSheetHandleContainer.tsx b/node_modules/@discord/bottom-sheet/src/components/bottomSheetHandleContainer/BottomSheetHandleContainer.tsx -index 2219e0f..59f90ba 100644 ---- a/node_modules/@discord/bottom-sheet/src/components/bottomSheetHandleContainer/BottomSheetHandleContainer.tsx -+++ b/node_modules/@discord/bottom-sheet/src/components/bottomSheetHandleContainer/BottomSheetHandleContainer.tsx -@@ -92,10 +92,6 @@ function BottomSheetHandleContainerComponent({ - > - - any; - * https://gist.github.com/JakeCoxon/c7ebf6e6496f8468226fd36b596e1985 - */ - export const useStableCallback = (callback: Callback) => { -+ // @ts-ignore - const callbackRef = useRef(); - const memoCallback = useCallback( - (...args: any) => callbackRef.current && callbackRef.current(...args), -@@ -13,6 +14,7 @@ export const useStableCallback = (callback: Callback) => { - ); - useEffect(() => { - callbackRef.current = callback; -+ // @ts-ignore - return () => (callbackRef.current = undefined); - }); - return memoCallback; -diff --git a/node_modules/@discord/bottom-sheet/src/utilities/animate.ts b/node_modules/@discord/bottom-sheet/src/utilities/animate.ts -index 0ce4c9a..9562675 100644 ---- a/node_modules/@discord/bottom-sheet/src/utilities/animate.ts -+++ b/node_modules/@discord/bottom-sheet/src/utilities/animate.ts -@@ -4,6 +4,7 @@ import { - withTiming, - withSpring, - AnimationCallback, -+ ReduceMotion, - } from 'react-native-reanimated'; - import { ANIMATION_CONFIGS, ANIMATION_METHOD } from '../constants'; - -@@ -26,6 +27,8 @@ export const animate = ({ - configs = ANIMATION_CONFIGS; - } - -+ configs.reduceMotion = ReduceMotion.Never; -+ - // detect animation type - const type = - 'duration' in configs || 'easing' in configs From d181c65cc6410b517ea8b0d54bf726e4b2c16865 Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Mon, 13 Oct 2025 03:30:05 +0530 Subject: [PATCH 12/98] fix type --- app/containers/ActionSheet/BottomSheetContent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/containers/ActionSheet/BottomSheetContent.tsx b/app/containers/ActionSheet/BottomSheetContent.tsx index c0533f37410..3ae86e241ab 100644 --- a/app/containers/ActionSheet/BottomSheetContent.tsx +++ b/app/containers/ActionSheet/BottomSheetContent.tsx @@ -45,7 +45,7 @@ const BottomSheetContent = React.memo(({ options, hasCancel, hide, children, onL testID='action-sheet' data={options} refreshing={false} - keyExtractor={item => item.title} + keyExtractor={(item: TActionSheetOptionsItem) => item.title} bounces={false} renderItem={renderItem} style={{ backgroundColor: colors.strokeExtraDark }} From d3f516bd2b1de2a6dd47644bf2323b7400327775 Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Mon, 13 Oct 2025 03:34:55 +0530 Subject: [PATCH 13/98] fix import, idk why they did this --- app/containers/RoomItem/interfaces.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/containers/RoomItem/interfaces.ts b/app/containers/RoomItem/interfaces.ts index 680e5d6a097..c0b48b5a406 100644 --- a/app/containers/RoomItem/interfaces.ts +++ b/app/containers/RoomItem/interfaces.ts @@ -1,11 +1,11 @@ import React from 'react'; -import Animated from 'react-native-reanimated'; +import { SharedValue } from 'react-native-reanimated'; import { TSupportedThemes } from '../../theme'; import { TUserStatus, ILastMessage, SubscriptionType, IOmnichannelSource, ISubscription } from '../../definitions'; export interface ILeftActionsProps { - transX: Animated.SharedValue; + transX: SharedValue; isRead: boolean; width: number; onToggleReadPress(): void; @@ -13,7 +13,7 @@ export interface ILeftActionsProps { } export interface IRightActionsProps { - transX: Animated.SharedValue; + transX: SharedValue; favorite: boolean; width: number; toggleFav(): void; From cbfe56033654cc5af2517d4f16e27399746ad8af Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Sat, 17 Jan 2026 19:01:31 +0530 Subject: [PATCH 14/98] lint fix --- app/containers/ActionSheet/ActionSheet.tsx | 2 +- app/containers/AudioPlayer/Seek.tsx | 4 ++-- app/containers/RoomItem/Touchable.tsx | 2 +- app/containers/RoomItem/interfaces.ts | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index 81662f632a3..27748be19e2 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -3,7 +3,7 @@ import * as Haptics from 'expo-haptics'; import React, { forwardRef, isValidElement, useEffect, useImperativeHandle, useRef, useState, useCallback } from 'react'; import { Keyboard, type LayoutChangeEvent, useWindowDimensions } from 'react-native'; import { Easing, useDerivedValue, useSharedValue } from 'react-native-reanimated'; -import BottomSheet, { BottomSheetBackdrop, BottomSheetBackdropProps } from '@gorhom/bottom-sheet'; +import BottomSheet, { BottomSheetBackdrop, type BottomSheetBackdropProps } from '@gorhom/bottom-sheet'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { useTheme } from '../../theme'; diff --git a/app/containers/AudioPlayer/Seek.tsx b/app/containers/AudioPlayer/Seek.tsx index 2455916368b..253262592b5 100644 --- a/app/containers/AudioPlayer/Seek.tsx +++ b/app/containers/AudioPlayer/Seek.tsx @@ -1,8 +1,8 @@ import React from 'react'; -import { LayoutChangeEvent, View, TextInput, TextInputProps, TouchableNativeFeedback } from 'react-native'; +import { type LayoutChangeEvent, View, TextInput, type TextInputProps, TouchableNativeFeedback } from 'react-native'; import { Gesture, GestureDetector } from 'react-native-gesture-handler'; import Animated, { - SharedValue, + type SharedValue, useAnimatedProps, useAnimatedStyle, useDerivedValue, diff --git a/app/containers/RoomItem/Touchable.tsx b/app/containers/RoomItem/Touchable.tsx index 0ed8987771c..48a70494297 100644 --- a/app/containers/RoomItem/Touchable.tsx +++ b/app/containers/RoomItem/Touchable.tsx @@ -1,6 +1,6 @@ import React, { useRef, memo } from 'react'; import Animated, { useSharedValue, useAnimatedStyle, withSpring } from 'react-native-reanimated'; -import { Gesture, GestureDetector, GestureUpdateEvent, PanGestureHandlerEventPayload } from 'react-native-gesture-handler'; +import { Gesture, GestureDetector, type GestureUpdateEvent, type PanGestureHandlerEventPayload } from 'react-native-gesture-handler'; import { scheduleOnRN } from 'react-native-worklets'; import Touch from '../Touch'; diff --git a/app/containers/RoomItem/interfaces.ts b/app/containers/RoomItem/interfaces.ts index a9bf0bfd502..9a5842df131 100644 --- a/app/containers/RoomItem/interfaces.ts +++ b/app/containers/RoomItem/interfaces.ts @@ -1,5 +1,5 @@ -import React from 'react'; -import { SharedValue } from 'react-native-reanimated'; +import type React from 'react'; +import { type SharedValue } from 'react-native-reanimated'; import { type TSupportedThemes } from '../../theme'; import { From 8f89ea2079b1741af66ac30343ac3d7d44977422 Mon Sep 17 00:00:00 2001 From: Rohit3523 Date: Sat, 17 Jan 2026 13:34:12 +0000 Subject: [PATCH 15/98] chore: format code and fix lint issues [skip ci] --- app/containers/RoomItem/Touchable.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/containers/RoomItem/Touchable.tsx b/app/containers/RoomItem/Touchable.tsx index 48a70494297..6f88ede833d 100644 --- a/app/containers/RoomItem/Touchable.tsx +++ b/app/containers/RoomItem/Touchable.tsx @@ -1,6 +1,11 @@ import React, { useRef, memo } from 'react'; import Animated, { useSharedValue, useAnimatedStyle, withSpring } from 'react-native-reanimated'; -import { Gesture, GestureDetector, type GestureUpdateEvent, type PanGestureHandlerEventPayload } from 'react-native-gesture-handler'; +import { + Gesture, + GestureDetector, + type GestureUpdateEvent, + type PanGestureHandlerEventPayload +} from 'react-native-gesture-handler'; import { scheduleOnRN } from 'react-native-worklets'; import Touch from '../Touch'; From 65be6cf4e7bfd7a6275558177a31e00ed389d555 Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Fri, 6 Feb 2026 13:33:18 -0300 Subject: [PATCH 16/98] feat: basic setup react-native-true-sheet --- app/containers/ActionSheet/ActionSheet.tsx | 156 ++++-------------- .../ActionSheet/BottomSheetContent.tsx | 11 +- app/containers/TextInput/FormTextInput.tsx | 3 +- ios/Podfile.lock | 30 +++- jest.setup.js | 18 +- package.json | 2 +- patches/@discord+bottom-sheet+4.6.1.patch | 70 -------- yarn.lock | 12 +- 8 files changed, 90 insertions(+), 212 deletions(-) delete mode 100644 patches/@discord+bottom-sheet+4.6.1.patch diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index 65f65d551dc..81bc1874bee 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -1,98 +1,36 @@ import { useBackHandler } from '@react-native-community/hooks'; import * as Haptics from 'expo-haptics'; -import React, { forwardRef, isValidElement, useEffect, useImperativeHandle, useRef, useState, useCallback } from 'react'; -import { Keyboard, type LayoutChangeEvent, useWindowDimensions } from 'react-native'; -import { Easing, useDerivedValue, useSharedValue } from 'react-native-reanimated'; -import BottomSheet, { BottomSheetBackdrop, type BottomSheetBackdropProps } from '@discord/bottom-sheet'; +import React, { forwardRef, isValidElement, useEffect, useImperativeHandle, useRef, useState } from 'react'; +import { Keyboard, useWindowDimensions } from 'react-native'; +import { TrueSheet } from '@lodev09/react-native-true-sheet'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { useTheme } from '../../theme'; -import { isIOS, isTablet } from '../../lib/methods/helpers'; +import { isTablet } from '../../lib/methods/helpers'; import { Handle } from './Handle'; import { type TActionSheetOptions } from './Provider'; import BottomSheetContent from './BottomSheetContent'; import styles from './styles'; export const ACTION_SHEET_ANIMATION_DURATION = 250; -const HANDLE_HEIGHT = 28; -const CANCEL_HEIGHT = 64; - -const ANIMATION_CONFIG = { - duration: ACTION_SHEET_ANIMATION_DURATION, - // https://easings.net/#easeInOutCubic - easing: Easing.bezier(0.645, 0.045, 0.355, 1.0) -}; const ActionSheet = React.memo( forwardRef(({ children }: { children: React.ReactElement }, ref) => { const { colors } = useTheme(); const { height: windowHeight } = useWindowDimensions(); - const { bottom, right, left } = useSafeAreaInsets(); - const { fontScale } = useWindowDimensions(); - const itemHeight = 48 * fontScale; - const bottomSheetRef = useRef(null); + const { right, left } = useSafeAreaInsets(); + const sheetRef = useRef(null); const [data, setData] = useState({} as TActionSheetOptions); const [isVisible, setVisible] = useState(false); - const animatedContentHeight = useSharedValue(0); - const animatedHandleHeight = useSharedValue(0); - const animatedDataSnaps = useSharedValue([]); - const animatedSnapPoints = useDerivedValue(() => { - if (animatedDataSnaps.value?.length) { - return animatedDataSnaps.value; - } - const contentWithHandleHeight = animatedContentHeight.value + animatedHandleHeight.value; - // Bottom sheet requires a default value to work - if (contentWithHandleHeight === 0) { - return ['25%']; - } - return [contentWithHandleHeight]; - }, [data]); - - const handleContentLayout = useCallback( - ({ - nativeEvent: { - layout: { height } - } - }: LayoutChangeEvent) => { - /** - * This logic is only necessary to prevent the action sheet from - * occupying the entire screen when the dynamic content is too big. - */ - animatedContentHeight.value = Math.min(height, windowHeight * 0.8); - }, - [animatedContentHeight, windowHeight] - ); - - const maxSnap = Math.min( - (itemHeight + 0.5) * (data?.options?.length || 0) + - HANDLE_HEIGHT + - // Custom header height - (data?.headerHeight || 0) + - // Insets bottom height (Notch devices) - bottom + - // Cancel button height - (data?.hasCancel ? CANCEL_HEIGHT : 0), - windowHeight * 0.8 - ); - - /* - * if the action sheet cover more than 60% of the screen height, - * we'll provide more one snap of 50% - */ - const snaps = maxSnap > windowHeight * 0.6 && !data.snaps ? ['50%', maxSnap] : [maxSnap]; - - const toggleVisible = () => setVisible(!isVisible); const hide = () => { - bottomSheetRef.current?.close(); + sheetRef.current?.dismiss(); }; const show = (options: TActionSheetOptions) => { setData(options); - if (options.snaps?.length) { - animatedDataSnaps.value = options.snaps; - } - toggleVisible(); + setVisible(true); + sheetRef.current?.present(0); }; useBackHandler(() => { @@ -114,69 +52,43 @@ const ActionSheet = React.memo( hideActionSheet: hide })); - const renderHandle = () => ( + const renderHeader = () => ( <> {isValidElement(data?.customHeader) ? data.customHeader : null} ); - const onClose = () => { - toggleVisible(); - data?.onClose && data?.onClose(); - animatedDataSnaps.value = []; + const onDidDismiss = () => { + setVisible(false); + data?.onClose?.(); }; - const renderBackdrop = useCallback( - (props: BottomSheetBackdropProps) => ( - - ), - [] - ); - - const bottomSheet = isTablet ? styles.bottomSheet : { marginRight: right, marginLeft: left }; - - // Must need this prop to avoid keyboard dismiss - // when is android tablet and the input text is focused - const androidTablet: any = isTablet && !isIOS ? { android_keyboardInputMode: 'adjustResize' } : {}; + const bottomSheetStyle = isTablet ? styles.bottomSheet : { marginRight: right, marginLeft: left }; return ( <> {children} - {isVisible && ( - index === -1 && onClose()} - // We need this to allow horizontal swipe gesture inside the bottom sheet like in reaction picker - enableContentPanningGesture={data?.enableContentPanningGesture ?? true} - {...androidTablet}> - - - )} + + {}} + /> + ); }) diff --git a/app/containers/ActionSheet/BottomSheetContent.tsx b/app/containers/ActionSheet/BottomSheetContent.tsx index 267c4b7a20d..a723280596c 100644 --- a/app/containers/ActionSheet/BottomSheetContent.tsx +++ b/app/containers/ActionSheet/BottomSheetContent.tsx @@ -1,10 +1,10 @@ -import { Text, useWindowDimensions, type ViewProps } from 'react-native'; +import { FlatList, Text, useWindowDimensions, View, type ViewProps } from 'react-native'; import React from 'react'; -import { BottomSheetView, BottomSheetFlatList } from '@discord/bottom-sheet'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import I18n from '../../i18n'; import { useTheme } from '../../theme'; +import { isAndroid } from '../../lib/methods/helpers'; import { type IActionSheetItem, Item } from './Item'; import { type TActionSheetOptionsItem } from './Provider'; import styles from './styles'; @@ -41,7 +41,7 @@ const BottomSheetContent = React.memo(({ options, hasCancel, hide, children, onL if (options) { return ( - ); } return ( - + {children} - + ); }); diff --git a/app/containers/TextInput/FormTextInput.tsx b/app/containers/TextInput/FormTextInput.tsx index 046cdab1e35..e0e11604e37 100644 --- a/app/containers/TextInput/FormTextInput.tsx +++ b/app/containers/TextInput/FormTextInput.tsx @@ -9,7 +9,6 @@ import { View, type ViewStyle } from 'react-native'; -import { BottomSheetTextInput } from '@discord/bottom-sheet'; import Touchable from 'react-native-platform-touchable'; import { A11y } from 'react-native-a11y-order'; @@ -124,7 +123,7 @@ export const FormTextInput = ({ const { colors } = useTheme(); const [showPassword, setShowPassword] = useState(false); const showClearInput = onClearInput && value && value.length > 0; - const Input = bottomSheet ? BottomSheetTextInput : TextInput; + const Input = TextInput; const inputError = getInputError(error); const accessibilityLabelText = useMemo(() => { diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 8d95a39e6b8..62012b99777 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -2606,6 +2606,30 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga + - RNTrueSheet (3.6.11): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga - SDWebImage (5.21.0): - SDWebImage/Core (= 5.21.0) - SDWebImage/Core (5.21.0) @@ -2754,6 +2778,7 @@ DEPENDENCIES: - RNReanimated (from `../node_modules/react-native-reanimated`) - RNScreens (from `../node_modules/react-native-screens`) - RNSVG (from `../node_modules/react-native-svg`) + - "RNTrueSheet (from `../node_modules/@lodev09/react-native-true-sheet`)" - "simdjson (from `../node_modules/@nozbe/simdjson`)" - "WatermelonDB (from `../node_modules/@nozbe/watermelondb`)" - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) @@ -3030,6 +3055,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-screens" RNSVG: :path: "../node_modules/react-native-svg" + RNTrueSheet: + :path: "../node_modules/@lodev09/react-native-true-sheet" simdjson: :path: "../node_modules/@nozbe/simdjson" WatermelonDB: @@ -3086,7 +3113,7 @@ SPEC CHECKSUMS: nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851 - RCT-Folly: e78785aa9ba2ed998ea4151e314036f6c49e6d82 + RCT-Folly: 36fe2295e44b10d831836cc0d1daec5f8abcf809 RCTDeprecation: 0418ac97b9f53b2e37f473da1663ef3061e46beb RCTRequired: b9fde7f981b11aa898f03a70d3d4d36b80f1b16d RCTTypeSafety: 397515ea9a8122b62a7a310adf30205f0a5e3bfc @@ -3177,6 +3204,7 @@ SPEC CHECKSUMS: RNReanimated: f52ccd5ceea2bae48d7421eec89b3f0c10d7b642 RNScreens: b13e4c45f0406f33986a39c0d8da0324bff94435 RNSVG: 680e961f640e381aab730a04b2371969686ed9f7 + RNTrueSheet: c32094ce4b285bf7f5208c10d9a84ab867fe2207 SDWebImage: f84b0feeb08d2d11e6a9b843cb06d75ebf5b8868 SDWebImageAVIFCoder: 00310d246aab3232ce77f1d8f0076f8c4b021d90 SDWebImageSVGCoder: 15a300a97ec1c8ac958f009c02220ac0402e936c diff --git a/jest.setup.js b/jest.setup.js index 774f02d2527..f8f6f2877e4 100644 --- a/jest.setup.js +++ b/jest.setup.js @@ -155,12 +155,22 @@ jest.mock('expo-device', () => ({ isDevice: true })); -jest.mock('@discord/bottom-sheet', () => { - const react = require('react-native'); +jest.mock('@lodev09/react-native-true-sheet', () => { + const React = require('react'); + const { View } = require('react-native'); + const TrueSheet = React.forwardRef((props, ref) => { + React.useImperativeHandle(ref, () => ({ + present: () => Promise.resolve(), + dismiss: () => Promise.resolve(), + resize: () => Promise.resolve() + })); + return ; + }); + TrueSheet.displayName = 'TrueSheet'; return { __esModule: true, - default: react.View, - BottomSheetScrollView: react.ScrollView + TrueSheet, + TrueSheetProvider: ({ children }) => children }; }); diff --git a/package.json b/package.json index 30821c7a692..9838a5b4d26 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ }, "dependencies": { "@bugsnag/react-native": "8.4.0", - "@discord/bottom-sheet": "bluesky-social/react-native-bottom-sheet", + "@lodev09/react-native-true-sheet": "~3.6.0", "@expo/vector-icons": "^14.1.0", "@hookform/resolvers": "^2.9.10", "@nozbe/watermelondb": "^0.28.1-0", diff --git a/patches/@discord+bottom-sheet+4.6.1.patch b/patches/@discord+bottom-sheet+4.6.1.patch deleted file mode 100644 index 0dff575d79f..00000000000 --- a/patches/@discord+bottom-sheet+4.6.1.patch +++ /dev/null @@ -1,70 +0,0 @@ -diff --git a/node_modules/@discord/bottom-sheet/src/components/bottomSheet/BottomSheet.tsx b/node_modules/@discord/bottom-sheet/src/components/bottomSheet/BottomSheet.tsx -index 2897fef..9a8505e 100644 ---- a/node_modules/@discord/bottom-sheet/src/components/bottomSheet/BottomSheet.tsx -+++ b/node_modules/@discord/bottom-sheet/src/components/bottomSheet/BottomSheet.tsx -@@ -1382,7 +1382,8 @@ const BottomSheetComponent = forwardRef( - if (containerHeight !== _previousContainerHeight) { - animationSource = ANIMATION_SOURCE.CONTAINER_RESIZE; - animationConfig = { -- duration: 0, -+ // https://github.com/gorhom/react-native-bottom-sheet/pull/1497 -+ duration: 1, - }; - } - } -diff --git a/node_modules/@discord/bottom-sheet/src/components/bottomSheetHandleContainer/BottomSheetHandleContainer.tsx b/node_modules/@discord/bottom-sheet/src/components/bottomSheetHandleContainer/BottomSheetHandleContainer.tsx -index 2219e0f..59f90ba 100644 ---- a/node_modules/@discord/bottom-sheet/src/components/bottomSheetHandleContainer/BottomSheetHandleContainer.tsx -+++ b/node_modules/@discord/bottom-sheet/src/components/bottomSheetHandleContainer/BottomSheetHandleContainer.tsx -@@ -92,10 +92,6 @@ function BottomSheetHandleContainerComponent({ - > - - any; - * https://gist.github.com/JakeCoxon/c7ebf6e6496f8468226fd36b596e1985 - */ - export const useStableCallback = (callback: Callback) => { -+ // @ts-ignore - const callbackRef = useRef(); - const memoCallback = useCallback( - (...args: any) => callbackRef.current && callbackRef.current(...args), -@@ -13,6 +14,7 @@ export const useStableCallback = (callback: Callback) => { - ); - useEffect(() => { - callbackRef.current = callback; -+ // @ts-ignore - return () => (callbackRef.current = undefined); - }); - return memoCallback; -diff --git a/node_modules/@discord/bottom-sheet/src/utilities/animate.ts b/node_modules/@discord/bottom-sheet/src/utilities/animate.ts -index 0ce4c9a..9562675 100644 ---- a/node_modules/@discord/bottom-sheet/src/utilities/animate.ts -+++ b/node_modules/@discord/bottom-sheet/src/utilities/animate.ts -@@ -4,6 +4,7 @@ import { - withTiming, - withSpring, - AnimationCallback, -+ ReduceMotion, - } from 'react-native-reanimated'; - import { ANIMATION_CONFIGS, ANIMATION_METHOD } from '../constants'; - -@@ -26,6 +27,8 @@ export const animate = ({ - configs = ANIMATION_CONFIGS; - } - -+ configs.reduceMotion = ReduceMotion.Never; -+ - // detect animation type - const type = - 'duration' in configs || 'easing' in configs diff --git a/yarn.lock b/yarn.lock index 4a19e871830..c4fa6694b13 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2457,13 +2457,6 @@ glob "^7.1.6" read-pkg-up "^7.0.1" -"@discord/bottom-sheet@bluesky-social/react-native-bottom-sheet": - version "4.6.1" - resolved "https://codeload.github.com/bluesky-social/react-native-bottom-sheet/tar.gz/28a87d1bb55e10fc355fa1455545a30734995908" - dependencies: - "@gorhom/portal" "1.0.14" - invariant "^2.2.4" - "@egjs/hammerjs@^2.0.17": version "2.0.17" resolved "https://registry.yarnpkg.com/@egjs/hammerjs/-/hammerjs-2.0.17.tgz#5dc02af75a6a06e4c2db0202cae38c9263895124" @@ -3898,6 +3891,11 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@lodev09/react-native-true-sheet@~3.6.0": + version "3.6.11" + resolved "https://registry.yarnpkg.com/@lodev09/react-native-true-sheet/-/react-native-true-sheet-3.6.11.tgz#12bd378b1ee3d2ba5bc04f5b654916233f356583" + integrity sha512-Je7zXgKrLUUnIjj+fXASiOg4PDXUPeD510awlZU5vkDXDhfLZ4gMqeYE/I93nZPI5AC3qQXFQ4Zek3JnhzwgIw== + "@napi-rs/wasm-runtime@^0.2.11": version "0.2.12" resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz#3e78a8b96e6c33a6c517e1894efbd5385a7cb6f2" From 08056fb1db0707341672b7cf316bd8fbb7b8260b Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Fri, 6 Feb 2026 14:28:10 -0300 Subject: [PATCH 17/98] fix: scroll height --- app/containers/ActionSheet/ActionSheet.tsx | 74 ++++++++++++++++++++-- 1 file changed, 67 insertions(+), 7 deletions(-) diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index 81bc1874bee..1ddcfb6ed00 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -1,8 +1,9 @@ import { useBackHandler } from '@react-native-community/hooks'; import * as Haptics from 'expo-haptics'; -import React, { forwardRef, isValidElement, useEffect, useImperativeHandle, useRef, useState } from 'react'; -import { Keyboard, useWindowDimensions } from 'react-native'; +import React, { forwardRef, isValidElement, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react'; +import { Keyboard, type LayoutChangeEvent, useWindowDimensions } from 'react-native'; import { TrueSheet } from '@lodev09/react-native-true-sheet'; +import type { SheetDetent } from '@lodev09/react-native-true-sheet'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { useTheme } from '../../theme'; @@ -13,15 +14,44 @@ import BottomSheetContent from './BottomSheetContent'; import styles from './styles'; export const ACTION_SHEET_ANIMATION_DURATION = 250; +const ACTION_SHEET_MAX_HEIGHT_FRACTION = 0.75; +const HANDLE_HEIGHT = 28; +const CANCEL_HEIGHT = 64; + +function normalizeSnapsToDetents(snaps: (string | number)[]): number[] { + return snaps + .slice(0, 3) + .map(snap => { + if (typeof snap === 'number') { + if (snap <= 0 || snap > 1) return Math.min(1, Math.max(0.1, snap)); + return snap; + } + const match = String(snap).match(/^(\d+(?:\.\d+)?)\s*%$/); + if (match) return Math.min(1, Math.max(0.1, Number(match[1]) / 100)); + return 0.5; + }) + .sort((a, b) => a - b); +} const ActionSheet = React.memo( forwardRef(({ children }: { children: React.ReactElement }, ref) => { const { colors } = useTheme(); - const { height: windowHeight } = useWindowDimensions(); - const { right, left } = useSafeAreaInsets(); + const { height: windowHeight, fontScale } = useWindowDimensions(); + const { bottom, right, left } = useSafeAreaInsets(); const sheetRef = useRef(null); const [data, setData] = useState({} as TActionSheetOptions); const [isVisible, setVisible] = useState(false); + const [contentHeight, setContentHeight] = useState(0); + + const itemHeight = 48 * fontScale; + + const handleContentLayout = useCallback( + ({ nativeEvent: { layout } }: LayoutChangeEvent) => { + const height = Math.min(layout.height, windowHeight * ACTION_SHEET_MAX_HEIGHT_FRACTION); + setContentHeight(height); + }, + [windowHeight] + ); const hide = () => { sheetRef.current?.dismiss(); @@ -61,18 +91,48 @@ const ActionSheet = React.memo( const onDidDismiss = () => { setVisible(false); + setContentHeight(0); data?.onClose?.(); }; const bottomSheetStyle = isTablet ? styles.bottomSheet : { marginRight: right, marginLeft: left }; + const hasOptions = (data?.options?.length || 0) > 0; + const maxSnap = hasOptions + ? Math.min( + (itemHeight + 0.5) * (data?.options?.length || 0) + + HANDLE_HEIGHT + + (data?.headerHeight || 0) + + bottom + + (data?.hasCancel ? CANCEL_HEIGHT : 0), + windowHeight * ACTION_SHEET_MAX_HEIGHT_FRACTION + ) + : 0; + + let detents: SheetDetent[]; + if (data?.snaps?.length) { + detents = normalizeSnapsToDetents(data.snaps); + } else if (hasOptions) { + if (maxSnap > windowHeight * 0.6) { + detents = [0.5, ACTION_SHEET_MAX_HEIGHT_FRACTION]; + } else { + const fraction = Math.max(0.25, Math.min(maxSnap / windowHeight, ACTION_SHEET_MAX_HEIGHT_FRACTION)); + detents = [fraction]; + } + } else if (contentHeight > 0) { + const fraction = Math.min(contentHeight / windowHeight, ACTION_SHEET_MAX_HEIGHT_FRACTION); + detents = [Math.max(0.25, fraction)]; + } else { + detents = ['auto']; + } + return ( <> {children} {}} + onLayout={handleContentLayout} /> From b4a596fb51bce9036423eaa238c1e0d55cd6f59f Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Fri, 6 Feb 2026 14:37:58 -0300 Subject: [PATCH 18/98] fix: inconsistentaction sheet openning --- app/containers/ActionSheet/ActionSheet.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index 1ddcfb6ed00..cbb3ae10a7d 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -60,7 +60,6 @@ const ActionSheet = React.memo( const show = (options: TActionSheetOptions) => { setData(options); setVisible(true); - sheetRef.current?.present(0); }; useBackHandler(() => { @@ -70,6 +69,12 @@ const ActionSheet = React.memo( return isVisible; }); + useEffect(() => { + if (isVisible) { + sheetRef.current?.present(0); + } + }, [isVisible]); + useEffect(() => { if (isVisible) { Keyboard.dismiss(); From 76cc8342b1a4c008cd1d25be36430912c5aa4b21 Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Fri, 6 Feb 2026 14:46:36 -0300 Subject: [PATCH 19/98] feat: add min height --- app/containers/ActionSheet/ActionSheet.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index cbb3ae10a7d..8cbab926195 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -14,6 +14,7 @@ import BottomSheetContent from './BottomSheetContent'; import styles from './styles'; export const ACTION_SHEET_ANIMATION_DURATION = 250; +const ACTION_SHEET_MIN_HEIGHT_FRACTION = 0.35; const ACTION_SHEET_MAX_HEIGHT_FRACTION = 0.75; const HANDLE_HEIGHT = 28; const CANCEL_HEIGHT = 64; @@ -126,9 +127,13 @@ const ActionSheet = React.memo( } } else if (contentHeight > 0) { const fraction = Math.min(contentHeight / windowHeight, ACTION_SHEET_MAX_HEIGHT_FRACTION); - detents = [Math.max(0.25, fraction)]; + const contentDetent = Math.max(0.25, fraction); + detents = + contentDetent > ACTION_SHEET_MIN_HEIGHT_FRACTION + ? [ACTION_SHEET_MIN_HEIGHT_FRACTION, contentDetent] + : [contentDetent]; } else { - detents = ['auto']; + detents = [ACTION_SHEET_MIN_HEIGHT_FRACTION, 'auto']; } return ( From e13c5a4ed3fa141172cbb44c6362b694e8065458 Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Fri, 6 Mar 2026 17:37:43 +0530 Subject: [PATCH 20/98] revert the bottom sheet changes --- app/containers/ActionSheet/ActionSheet.tsx | 2 +- app/containers/ActionSheet/BottomSheetContent.tsx | 2 +- app/containers/TextInput/FormTextInput.tsx | 2 +- jest.setup.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index 27748be19e2..65f65d551dc 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -3,7 +3,7 @@ import * as Haptics from 'expo-haptics'; import React, { forwardRef, isValidElement, useEffect, useImperativeHandle, useRef, useState, useCallback } from 'react'; import { Keyboard, type LayoutChangeEvent, useWindowDimensions } from 'react-native'; import { Easing, useDerivedValue, useSharedValue } from 'react-native-reanimated'; -import BottomSheet, { BottomSheetBackdrop, type BottomSheetBackdropProps } from '@gorhom/bottom-sheet'; +import BottomSheet, { BottomSheetBackdrop, type BottomSheetBackdropProps } from '@discord/bottom-sheet'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { useTheme } from '../../theme'; diff --git a/app/containers/ActionSheet/BottomSheetContent.tsx b/app/containers/ActionSheet/BottomSheetContent.tsx index f8d3f8df3d2..1136e4bca95 100644 --- a/app/containers/ActionSheet/BottomSheetContent.tsx +++ b/app/containers/ActionSheet/BottomSheetContent.tsx @@ -1,6 +1,6 @@ import { Text, useWindowDimensions, type ViewProps } from 'react-native'; import React from 'react'; -import { BottomSheetView, BottomSheetFlatList } from '@gorhom/bottom-sheet'; +import { BottomSheetView, BottomSheetFlatList } from '@discord/bottom-sheet'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import I18n from '../../i18n'; diff --git a/app/containers/TextInput/FormTextInput.tsx b/app/containers/TextInput/FormTextInput.tsx index 7547a7ca7f2..046cdab1e35 100644 --- a/app/containers/TextInput/FormTextInput.tsx +++ b/app/containers/TextInput/FormTextInput.tsx @@ -9,7 +9,7 @@ import { View, type ViewStyle } from 'react-native'; -import { BottomSheetTextInput } from '@gorhom/bottom-sheet'; +import { BottomSheetTextInput } from '@discord/bottom-sheet'; import Touchable from 'react-native-platform-touchable'; import { A11y } from 'react-native-a11y-order'; diff --git a/jest.setup.js b/jest.setup.js index 1585c573f0d..6056e392865 100644 --- a/jest.setup.js +++ b/jest.setup.js @@ -154,7 +154,7 @@ jest.mock('expo-device', () => ({ isDevice: true })); -jest.mock('@gorhom/bottom-sheet', () => { +jest.mock('@discord/bottom-sheet', () => { const react = require('react-native'); return { __esModule: true, From 4fe2c973266f04e86aa52df1af78b733b396415c Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Fri, 6 Mar 2026 17:39:09 +0530 Subject: [PATCH 21/98] revert version --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 3c7e36bc4d1..f3e951cdcb1 100644 --- a/package.json +++ b/package.json @@ -154,7 +154,7 @@ "@babel/runtime": "^7.25.0", "@bugsnag/cli": "^3.2.1", "@bugsnag/source-maps": "^2.3.3", - "@gorhom/bottom-sheet": "^5.2.6", + "@gorhom/bottom-sheet": "^5.1.6", "@react-native-community/cli": "18.0.0", "@react-native-community/cli-platform-android": "18.0.0", "@react-native-community/cli-platform-ios": "18.0.0", diff --git a/yarn.lock b/yarn.lock index 2da7513184f..8fdeb451990 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3457,10 +3457,10 @@ resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.3.tgz#a73bab8eb491d7b8b7be2f0e6c310647835afe83" integrity sha512-2xCRM9q9FlzGZCdgDMJwc0gyUkWFtkosy7Xxr6sFgQwn+wMNIWd7xIvYNauU1r64B5L5rsGKy/n9TKJ0aAFeqQ== -"@gorhom/bottom-sheet@^5.2.6": - version "5.2.6" - resolved "https://registry.yarnpkg.com/@gorhom/bottom-sheet/-/bottom-sheet-5.2.6.tgz#5f2045f6ca965383afe39f7dfa3afad1502b7467" - integrity sha512-vmruJxdiUGDg+ZYcDmS30XDhq/h/+QkINOI5LY/uGjx8cPGwgJW0H6AB902gNTKtccbiKe/rr94EwdmIEz+LAQ== +"@gorhom/bottom-sheet@^5.1.6": + version "5.2.8" + resolved "https://registry.yarnpkg.com/@gorhom/bottom-sheet/-/bottom-sheet-5.2.8.tgz#25e49122c30ffe83d3813b3bcf3dec39f3359aeb" + integrity sha512-+N27SMpbBxXZQ/IA2nlEV6RGxL/qSFHKfdFKcygvW+HqPG5jVNb1OqehLQsGfBP+Up42i0gW5ppI+DhpB7UCzA== dependencies: "@gorhom/portal" "1.0.14" invariant "^2.2.4" From 1dba72615ecce0f7709f4240fa7e6f4aa79dd479 Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Fri, 6 Mar 2026 17:42:11 +0530 Subject: [PATCH 22/98] lock fix --- yarn.lock | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/yarn.lock b/yarn.lock index 54a85418361..fb2b89a25b3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12809,9 +12809,9 @@ react-native-gesture-handler@2.24.0: hoist-non-react-statics "^3.3.0" invariant "^2.2.4" -react-native-image-crop-picker@RocketChat/react-native-image-crop-picker#5346870b0be10d300dc53924309dc6adc9946d50: - version "0.50.1" - resolved "https://codeload.github.com/RocketChat/react-native-image-crop-picker/tar.gz/5346870b0be10d300dc53924309dc6adc9946d50" +react-native-image-crop-picker@RocketChat/react-native-image-crop-picker#f028aac24373d05166747ef6d9e59bb037fe3224: + version "0.51.0" + resolved "https://codeload.github.com/RocketChat/react-native-image-crop-picker/tar.gz/f028aac24373d05166747ef6d9e59bb037fe3224" react-native-is-edge-to-edge@^1.1.6, react-native-is-edge-to-edge@^1.1.7: version "1.1.7" @@ -12899,15 +12899,6 @@ react-native-popover-view@5.1.7: deprecated-react-native-prop-types "^2.3.0" prop-types "^15.8.1" -react-native-reanimated@^3.17.1: - version "3.17.1" - resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-3.17.1.tgz#42bed044ad046f09efcc00a80fabcc6eb18c7073" - integrity sha512-ECzLhLxMKLifv34a8799/MHqIazQZV9fLMNSMdixXQlzX71RyL3/ah3cz/h3ERoyhJAYRC2ySLLZho6pXSqMFQ== -react-native-prompt-android@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/react-native-prompt-android/-/react-native-prompt-android-1.1.0.tgz#3c5168029075cb9f72549fd5f92403372fb234e9" - integrity sha512-4JoyEaT2ZnK9IH+tDFpbTiQBgva8UIFGQf4/Uw/tnEVWBERlVlzcs5B82T9BkeEhEqXhp89JaiSBnLWj30lciw== - react-native-reanimated@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-4.1.3.tgz#de29587b8ff7febada32497793803215faeac636" From caf9d5afcb188528b40027eb7bf03a80ae007b9c Mon Sep 17 00:00:00 2001 From: Rohit3523 Date: Fri, 6 Mar 2026 12:58:30 +0000 Subject: [PATCH 23/98] chore: format code and fix lint issues --- app/containers/ActionSheet/ActionSheet.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index 8cbab926195..78535e0d9d2 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -129,9 +129,7 @@ const ActionSheet = React.memo( const fraction = Math.min(contentHeight / windowHeight, ACTION_SHEET_MAX_HEIGHT_FRACTION); const contentDetent = Math.max(0.25, fraction); detents = - contentDetent > ACTION_SHEET_MIN_HEIGHT_FRACTION - ? [ACTION_SHEET_MIN_HEIGHT_FRACTION, contentDetent] - : [contentDetent]; + contentDetent > ACTION_SHEET_MIN_HEIGHT_FRACTION ? [ACTION_SHEET_MIN_HEIGHT_FRACTION, contentDetent] : [contentDetent]; } else { detents = [ACTION_SHEET_MIN_HEIGHT_FRACTION, 'auto']; } From e3ccc64e80c26e2f2077e554cdcd7843569a3c0e Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Thu, 5 Mar 2026 16:05:10 -0300 Subject: [PATCH 24/98] chore: use Touch instead of pressable --- app/containers/EmojiPicker/PressableEmoji.tsx | 19 +- ...odev09+react-native-true-sheet+3.9.4.patch | 2018 +++++++++++++++++ 2 files changed, 2022 insertions(+), 15 deletions(-) create mode 100644 patches/@lodev09+react-native-true-sheet+3.9.4.patch diff --git a/app/containers/EmojiPicker/PressableEmoji.tsx b/app/containers/EmojiPicker/PressableEmoji.tsx index 047e9c4d386..e7a104e37a3 100644 --- a/app/containers/EmojiPicker/PressableEmoji.tsx +++ b/app/containers/EmojiPicker/PressableEmoji.tsx @@ -1,31 +1,20 @@ import React from 'react'; -import { Pressable } from 'react-native'; -import styles, { EMOJI_BUTTON_SIZE } from './styles'; import { type IEmoji } from '../../definitions/IEmoji'; -import { useTheme } from '../../theme'; -import { isIOS } from '../../lib/methods/helpers'; import { Emoji } from './Emoji'; +import Touch from '../Touch'; export const PressableEmoji = ({ emoji, onPress }: { emoji: IEmoji; onPress: (emoji: IEmoji) => void }): React.ReactElement => { - const { colors } = useTheme(); const accessibilityLabel = typeof emoji === 'string' ? emoji : emoji.name; return ( - onPress(emoji)} - testID={`emoji-${typeof emoji === 'string' ? emoji : emoji.name}`} - android_ripple={{ color: colors.buttonBackgroundSecondaryPress, borderless: true, radius: EMOJI_BUTTON_SIZE / 2 }} - style={({ pressed }: { pressed: boolean }) => [ - styles.emojiButton, - { - backgroundColor: isIOS && pressed ? colors.buttonBackgroundSecondaryPress : 'transparent' - } - ]}> + testID={`emoji-${typeof emoji === 'string' ? emoji : emoji.name}`}> - + ); }; diff --git a/patches/@lodev09+react-native-true-sheet+3.9.4.patch b/patches/@lodev09+react-native-true-sheet+3.9.4.patch new file mode 100644 index 00000000000..616d1c7163d --- /dev/null +++ b/patches/@lodev09+react-native-true-sheet+3.9.4.patch @@ -0,0 +1,2018 @@ +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/buildConfig/debug/com/lodev09/truesheet/BuildConfig.java b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/buildConfig/debug/com/lodev09/truesheet/BuildConfig.java +new file mode 100644 +index 0000000..f148c6e +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/buildConfig/debug/com/lodev09/truesheet/BuildConfig.java +@@ -0,0 +1,12 @@ ++/** ++ * Automatically generated file. DO NOT MODIFY ++ */ ++package com.lodev09.truesheet; ++ ++public final class BuildConfig { ++ public static final boolean DEBUG = Boolean.parseBoolean("true"); ++ public static final String LIBRARY_PACKAGE_NAME = "com.lodev09.truesheet"; ++ public static final String BUILD_TYPE = "debug"; ++ // Field from default config. ++ public static final boolean EDGE_TO_EDGE_ENABLED = false; ++} +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetContainerViewManagerDelegate.java b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetContainerViewManagerDelegate.java +new file mode 100644 +index 0000000..69ec6af +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetContainerViewManagerDelegate.java +@@ -0,0 +1,26 @@ ++/** ++* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++* ++* Do not edit this file as changes may cause incorrect behavior and will be lost ++* once the code is regenerated. ++* ++* @generated by codegen project: GeneratePropsJavaDelegate.js ++*/ ++ ++package com.facebook.react.viewmanagers; ++ ++import android.view.View; ++import androidx.annotation.Nullable; ++import com.facebook.react.uimanager.BaseViewManager; ++import com.facebook.react.uimanager.BaseViewManagerDelegate; ++import com.facebook.react.uimanager.LayoutShadowNode; ++ ++public class TrueSheetContainerViewManagerDelegate & TrueSheetContainerViewManagerInterface> extends BaseViewManagerDelegate { ++ public TrueSheetContainerViewManagerDelegate(U viewManager) { ++ super(viewManager); ++ } ++ @Override ++ public void setProperty(T view, String propName, @Nullable Object value) { ++ super.setProperty(view, propName, value); ++ } ++} +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetContainerViewManagerInterface.java b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetContainerViewManagerInterface.java +new file mode 100644 +index 0000000..950e975 +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetContainerViewManagerInterface.java +@@ -0,0 +1,17 @@ ++/** ++* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++* ++* Do not edit this file as changes may cause incorrect behavior and will be lost ++* once the code is regenerated. ++* ++* @generated by codegen project: GeneratePropsJavaInterface.js ++*/ ++ ++package com.facebook.react.viewmanagers; ++ ++import android.view.View; ++import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface; ++ ++public interface TrueSheetContainerViewManagerInterface extends ViewManagerWithGeneratedInterface { ++ // No props ++} +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetContentViewManagerDelegate.java b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetContentViewManagerDelegate.java +new file mode 100644 +index 0000000..0ec3ae2 +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetContentViewManagerDelegate.java +@@ -0,0 +1,26 @@ ++/** ++* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++* ++* Do not edit this file as changes may cause incorrect behavior and will be lost ++* once the code is regenerated. ++* ++* @generated by codegen project: GeneratePropsJavaDelegate.js ++*/ ++ ++package com.facebook.react.viewmanagers; ++ ++import android.view.View; ++import androidx.annotation.Nullable; ++import com.facebook.react.uimanager.BaseViewManager; ++import com.facebook.react.uimanager.BaseViewManagerDelegate; ++import com.facebook.react.uimanager.LayoutShadowNode; ++ ++public class TrueSheetContentViewManagerDelegate & TrueSheetContentViewManagerInterface> extends BaseViewManagerDelegate { ++ public TrueSheetContentViewManagerDelegate(U viewManager) { ++ super(viewManager); ++ } ++ @Override ++ public void setProperty(T view, String propName, @Nullable Object value) { ++ super.setProperty(view, propName, value); ++ } ++} +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetContentViewManagerInterface.java b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetContentViewManagerInterface.java +new file mode 100644 +index 0000000..3df3301 +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetContentViewManagerInterface.java +@@ -0,0 +1,17 @@ ++/** ++* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++* ++* Do not edit this file as changes may cause incorrect behavior and will be lost ++* once the code is regenerated. ++* ++* @generated by codegen project: GeneratePropsJavaInterface.js ++*/ ++ ++package com.facebook.react.viewmanagers; ++ ++import android.view.View; ++import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface; ++ ++public interface TrueSheetContentViewManagerInterface extends ViewManagerWithGeneratedInterface { ++ // No props ++} +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetFooterViewManagerDelegate.java b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetFooterViewManagerDelegate.java +new file mode 100644 +index 0000000..9f5c333 +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetFooterViewManagerDelegate.java +@@ -0,0 +1,26 @@ ++/** ++* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++* ++* Do not edit this file as changes may cause incorrect behavior and will be lost ++* once the code is regenerated. ++* ++* @generated by codegen project: GeneratePropsJavaDelegate.js ++*/ ++ ++package com.facebook.react.viewmanagers; ++ ++import android.view.View; ++import androidx.annotation.Nullable; ++import com.facebook.react.uimanager.BaseViewManager; ++import com.facebook.react.uimanager.BaseViewManagerDelegate; ++import com.facebook.react.uimanager.LayoutShadowNode; ++ ++public class TrueSheetFooterViewManagerDelegate & TrueSheetFooterViewManagerInterface> extends BaseViewManagerDelegate { ++ public TrueSheetFooterViewManagerDelegate(U viewManager) { ++ super(viewManager); ++ } ++ @Override ++ public void setProperty(T view, String propName, @Nullable Object value) { ++ super.setProperty(view, propName, value); ++ } ++} +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetFooterViewManagerInterface.java b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetFooterViewManagerInterface.java +new file mode 100644 +index 0000000..c8d8e22 +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetFooterViewManagerInterface.java +@@ -0,0 +1,17 @@ ++/** ++* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++* ++* Do not edit this file as changes may cause incorrect behavior and will be lost ++* once the code is regenerated. ++* ++* @generated by codegen project: GeneratePropsJavaInterface.js ++*/ ++ ++package com.facebook.react.viewmanagers; ++ ++import android.view.View; ++import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface; ++ ++public interface TrueSheetFooterViewManagerInterface extends ViewManagerWithGeneratedInterface { ++ // No props ++} +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetHeaderViewManagerDelegate.java b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetHeaderViewManagerDelegate.java +new file mode 100644 +index 0000000..6efa55b +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetHeaderViewManagerDelegate.java +@@ -0,0 +1,26 @@ ++/** ++* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++* ++* Do not edit this file as changes may cause incorrect behavior and will be lost ++* once the code is regenerated. ++* ++* @generated by codegen project: GeneratePropsJavaDelegate.js ++*/ ++ ++package com.facebook.react.viewmanagers; ++ ++import android.view.View; ++import androidx.annotation.Nullable; ++import com.facebook.react.uimanager.BaseViewManager; ++import com.facebook.react.uimanager.BaseViewManagerDelegate; ++import com.facebook.react.uimanager.LayoutShadowNode; ++ ++public class TrueSheetHeaderViewManagerDelegate & TrueSheetHeaderViewManagerInterface> extends BaseViewManagerDelegate { ++ public TrueSheetHeaderViewManagerDelegate(U viewManager) { ++ super(viewManager); ++ } ++ @Override ++ public void setProperty(T view, String propName, @Nullable Object value) { ++ super.setProperty(view, propName, value); ++ } ++} +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetHeaderViewManagerInterface.java b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetHeaderViewManagerInterface.java +new file mode 100644 +index 0000000..b282d12 +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetHeaderViewManagerInterface.java +@@ -0,0 +1,17 @@ ++/** ++* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++* ++* Do not edit this file as changes may cause incorrect behavior and will be lost ++* once the code is regenerated. ++* ++* @generated by codegen project: GeneratePropsJavaInterface.js ++*/ ++ ++package com.facebook.react.viewmanagers; ++ ++import android.view.View; ++import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface; ++ ++public interface TrueSheetHeaderViewManagerInterface extends ViewManagerWithGeneratedInterface { ++ // No props ++} +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetViewManagerDelegate.java b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetViewManagerDelegate.java +new file mode 100644 +index 0000000..be5481a +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetViewManagerDelegate.java +@@ -0,0 +1,98 @@ ++/** ++* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++* ++* Do not edit this file as changes may cause incorrect behavior and will be lost ++* once the code is regenerated. ++* ++* @generated by codegen project: GeneratePropsJavaDelegate.js ++*/ ++ ++package com.facebook.react.viewmanagers; ++ ++import android.view.View; ++import androidx.annotation.Nullable; ++import com.facebook.react.bridge.ColorPropConverter; ++import com.facebook.react.bridge.ReadableArray; ++import com.facebook.react.bridge.ReadableMap; ++import com.facebook.react.uimanager.BaseViewManager; ++import com.facebook.react.uimanager.BaseViewManagerDelegate; ++import com.facebook.react.uimanager.LayoutShadowNode; ++ ++public class TrueSheetViewManagerDelegate & TrueSheetViewManagerInterface> extends BaseViewManagerDelegate { ++ public TrueSheetViewManagerDelegate(U viewManager) { ++ super(viewManager); ++ } ++ @Override ++ public void setProperty(T view, String propName, @Nullable Object value) { ++ switch (propName) { ++ case "detents": ++ mViewManager.setDetents(view, (ReadableArray) value); ++ break; ++ case "maxContentHeight": ++ mViewManager.setMaxContentHeight(view, value == null ? 0f : ((Double) value).doubleValue()); ++ break; ++ case "maxContentWidth": ++ mViewManager.setMaxContentWidth(view, value == null ? 0f : ((Double) value).doubleValue()); ++ break; ++ case "cornerRadius": ++ mViewManager.setCornerRadius(view, value == null ? -1f : ((Double) value).doubleValue()); ++ break; ++ case "elevation": ++ mViewManager.setElevation(view, value == null ? -1f : ((Double) value).doubleValue()); ++ break; ++ case "backgroundColor": ++ mViewManager.setBackgroundColor(view, ColorPropConverter.getColor(value, view.getContext())); ++ break; ++ case "initialDetentIndex": ++ mViewManager.setInitialDetentIndex(view, value == null ? -1 : ((Double) value).intValue()); ++ break; ++ case "dimmedDetentIndex": ++ mViewManager.setDimmedDetentIndex(view, value == null ? 0 : ((Double) value).intValue()); ++ break; ++ case "backgroundBlur": ++ mViewManager.setBackgroundBlur(view, (String) value); ++ break; ++ case "anchor": ++ mViewManager.setAnchor(view, (String) value); ++ break; ++ case "anchorOffset": ++ mViewManager.setAnchorOffset(view, value == null ? 16f : ((Double) value).doubleValue()); ++ break; ++ case "insetAdjustment": ++ mViewManager.setInsetAdjustment(view, (String) value); ++ break; ++ case "blurOptions": ++ mViewManager.setBlurOptions(view, (ReadableMap) value); ++ break; ++ case "grabber": ++ mViewManager.setGrabber(view, value == null ? true : (boolean) value); ++ break; ++ case "grabberOptions": ++ mViewManager.setGrabberOptions(view, (ReadableMap) value); ++ break; ++ case "dismissible": ++ mViewManager.setDismissible(view, value == null ? true : (boolean) value); ++ break; ++ case "draggable": ++ mViewManager.setDraggable(view, value == null ? true : (boolean) value); ++ break; ++ case "dimmed": ++ mViewManager.setDimmed(view, value == null ? true : (boolean) value); ++ break; ++ case "initialDetentAnimated": ++ mViewManager.setInitialDetentAnimated(view, value == null ? true : (boolean) value); ++ break; ++ case "scrollable": ++ mViewManager.setScrollable(view, value == null ? false : (boolean) value); ++ break; ++ case "scrollableOptions": ++ mViewManager.setScrollableOptions(view, (ReadableMap) value); ++ break; ++ case "pageSizing": ++ mViewManager.setPageSizing(view, value == null ? true : (boolean) value); ++ break; ++ default: ++ super.setProperty(view, propName, value); ++ } ++ } ++} +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetViewManagerInterface.java b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetViewManagerInterface.java +new file mode 100644 +index 0000000..2341fcb +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetViewManagerInterface.java +@@ -0,0 +1,41 @@ ++/** ++* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++* ++* Do not edit this file as changes may cause incorrect behavior and will be lost ++* once the code is regenerated. ++* ++* @generated by codegen project: GeneratePropsJavaInterface.js ++*/ ++ ++package com.facebook.react.viewmanagers; ++ ++import android.view.View; ++import androidx.annotation.Nullable; ++import com.facebook.react.bridge.ReadableArray; ++import com.facebook.react.bridge.ReadableMap; ++import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface; ++ ++public interface TrueSheetViewManagerInterface extends ViewManagerWithGeneratedInterface { ++ void setDetents(T view, @Nullable ReadableArray value); ++ void setMaxContentHeight(T view, double value); ++ void setMaxContentWidth(T view, double value); ++ void setCornerRadius(T view, double value); ++ void setElevation(T view, double value); ++ void setBackgroundColor(T view, @Nullable Integer value); ++ void setInitialDetentIndex(T view, int value); ++ void setDimmedDetentIndex(T view, int value); ++ void setBackgroundBlur(T view, @Nullable String value); ++ void setAnchor(T view, @Nullable String value); ++ void setAnchorOffset(T view, double value); ++ void setInsetAdjustment(T view, @Nullable String value); ++ void setBlurOptions(T view, @Nullable ReadableMap value); ++ void setGrabber(T view, boolean value); ++ void setGrabberOptions(T view, @Nullable ReadableMap value); ++ void setDismissible(T view, boolean value); ++ void setDraggable(T view, boolean value); ++ void setDimmed(T view, boolean value); ++ void setInitialDetentAnimated(T view, boolean value); ++ void setScrollable(T view, boolean value); ++ void setScrollableOptions(T view, @Nullable ReadableMap value); ++ void setPageSizing(T view, boolean value); ++} +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/lodev09/truesheet/NativeTrueSheetModuleSpec.java b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/lodev09/truesheet/NativeTrueSheetModuleSpec.java +new file mode 100644 +index 0000000..531265d +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/lodev09/truesheet/NativeTrueSheetModuleSpec.java +@@ -0,0 +1,54 @@ ++ ++/** ++ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++ * ++ * Do not edit this file as changes may cause incorrect behavior and will be lost ++ * once the code is regenerated. ++ * ++ * @generated by codegen project: GenerateModuleJavaSpec.js ++ * ++ * @nolint ++ */ ++ ++package com.lodev09.truesheet; ++ ++import com.facebook.proguard.annotations.DoNotStrip; ++import com.facebook.react.bridge.Promise; ++import com.facebook.react.bridge.ReactApplicationContext; ++import com.facebook.react.bridge.ReactContextBaseJavaModule; ++import com.facebook.react.bridge.ReactMethod; ++import com.facebook.react.turbomodule.core.interfaces.TurboModule; ++import javax.annotation.Nonnull; ++ ++public abstract class NativeTrueSheetModuleSpec extends ReactContextBaseJavaModule implements TurboModule { ++ public static final String NAME = "TrueSheetModule"; ++ ++ public NativeTrueSheetModuleSpec(ReactApplicationContext reactContext) { ++ super(reactContext); ++ } ++ ++ @Override ++ public @Nonnull String getName() { ++ return NAME; ++ } ++ ++ @ReactMethod ++ @DoNotStrip ++ public abstract void presentByRef(double viewTag, double index, boolean animated, Promise promise); ++ ++ @ReactMethod ++ @DoNotStrip ++ public abstract void dismissByRef(double viewTag, boolean animated, Promise promise); ++ ++ @ReactMethod ++ @DoNotStrip ++ public abstract void dismissStackByRef(double viewTag, boolean animated, Promise promise); ++ ++ @ReactMethod ++ @DoNotStrip ++ public abstract void resizeByRef(double viewTag, double index, Promise promise); ++ ++ @ReactMethod ++ @DoNotStrip ++ public abstract void dismissAll(boolean animated, Promise promise); ++} +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/CMakeLists.txt b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/CMakeLists.txt +new file mode 100644 +index 0000000..ab16787 +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/CMakeLists.txt +@@ -0,0 +1,36 @@ ++# Copyright (c) Meta Platforms, Inc. and affiliates. ++# ++# This source code is licensed under the MIT license found in the ++# LICENSE file in the root directory of this source tree. ++ ++cmake_minimum_required(VERSION 3.13) ++set(CMAKE_VERBOSE_MAKEFILE on) ++ ++file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/TrueSheetSpec/*.cpp) ++ ++add_library( ++ react_codegen_TrueSheetSpec ++ OBJECT ++ ${react_codegen_SRCS} ++) ++ ++target_include_directories(react_codegen_TrueSheetSpec PUBLIC . react/renderer/components/TrueSheetSpec) ++ ++target_link_libraries( ++ react_codegen_TrueSheetSpec ++ fbjni ++ jsi ++ # We need to link different libraries based on whether we are building rncore or not, that's necessary ++ # because we want to break a circular dependency between react_codegen_rncore and reactnative ++ reactnative ++) ++ ++target_compile_options( ++ react_codegen_TrueSheetSpec ++ PRIVATE ++ -DLOG_TAG=\"ReactNative\" ++ -fexceptions ++ -frtti ++ -std=c++20 ++ -Wall ++) +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/TrueSheetSpec-generated.cpp b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/TrueSheetSpec-generated.cpp +new file mode 100644 +index 0000000..33d7583 +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/TrueSheetSpec-generated.cpp +@@ -0,0 +1,56 @@ ++ ++/** ++ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++ * ++ * Do not edit this file as changes may cause incorrect behavior and will be lost ++ * once the code is regenerated. ++ * ++ * @generated by codegen project: GenerateModuleJniCpp.js ++ */ ++ ++#include "TrueSheetSpec.h" ++ ++namespace facebook::react { ++ ++static facebook::jsi::Value __hostFunction_NativeTrueSheetModuleSpecJSI_presentByRef(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { ++ static jmethodID cachedMethodId = nullptr; ++ return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "presentByRef", "(DDZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); ++} ++ ++static facebook::jsi::Value __hostFunction_NativeTrueSheetModuleSpecJSI_dismissByRef(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { ++ static jmethodID cachedMethodId = nullptr; ++ return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "dismissByRef", "(DZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); ++} ++ ++static facebook::jsi::Value __hostFunction_NativeTrueSheetModuleSpecJSI_dismissStackByRef(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { ++ static jmethodID cachedMethodId = nullptr; ++ return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "dismissStackByRef", "(DZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); ++} ++ ++static facebook::jsi::Value __hostFunction_NativeTrueSheetModuleSpecJSI_resizeByRef(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { ++ static jmethodID cachedMethodId = nullptr; ++ return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "resizeByRef", "(DDLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); ++} ++ ++static facebook::jsi::Value __hostFunction_NativeTrueSheetModuleSpecJSI_dismissAll(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { ++ static jmethodID cachedMethodId = nullptr; ++ return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "dismissAll", "(ZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); ++} ++ ++NativeTrueSheetModuleSpecJSI::NativeTrueSheetModuleSpecJSI(const JavaTurboModule::InitParams ¶ms) ++ : JavaTurboModule(params) { ++ methodMap_["presentByRef"] = MethodMetadata {3, __hostFunction_NativeTrueSheetModuleSpecJSI_presentByRef}; ++ methodMap_["dismissByRef"] = MethodMetadata {2, __hostFunction_NativeTrueSheetModuleSpecJSI_dismissByRef}; ++ methodMap_["dismissStackByRef"] = MethodMetadata {2, __hostFunction_NativeTrueSheetModuleSpecJSI_dismissStackByRef}; ++ methodMap_["resizeByRef"] = MethodMetadata {2, __hostFunction_NativeTrueSheetModuleSpecJSI_resizeByRef}; ++ methodMap_["dismissAll"] = MethodMetadata {1, __hostFunction_NativeTrueSheetModuleSpecJSI_dismissAll}; ++} ++ ++std::shared_ptr TrueSheetSpec_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) { ++ if (moduleName == "TrueSheetModule") { ++ return std::make_shared(params); ++ } ++ return nullptr; ++} ++ ++} // namespace facebook::react +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/TrueSheetSpec.h b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/TrueSheetSpec.h +new file mode 100644 +index 0000000..3a9fbbd +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/TrueSheetSpec.h +@@ -0,0 +1,31 @@ ++ ++/** ++ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++ * ++ * Do not edit this file as changes may cause incorrect behavior and will be lost ++ * once the code is regenerated. ++ * ++ * @generated by codegen project: GenerateModuleJniH.js ++ */ ++ ++#pragma once ++ ++#include ++#include ++#include ++ ++namespace facebook::react { ++ ++/** ++ * JNI C++ class for module 'NativeTrueSheetModule' ++ */ ++class JSI_EXPORT NativeTrueSheetModuleSpecJSI : public JavaTurboModule { ++public: ++ NativeTrueSheetModuleSpecJSI(const JavaTurboModule::InitParams ¶ms); ++}; ++ ++ ++JSI_EXPORT ++std::shared_ptr TrueSheetSpec_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); ++ ++} // namespace facebook::react +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/ComponentDescriptors.cpp b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/ComponentDescriptors.cpp +new file mode 100644 +index 0000000..ff57d3d +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/ComponentDescriptors.cpp +@@ -0,0 +1,25 @@ ++ ++/** ++ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++ * ++ * Do not edit this file as changes may cause incorrect behavior and will be lost ++ * once the code is regenerated. ++ * ++ * @generated by codegen project: GenerateComponentDescriptorCpp.js ++ */ ++ ++#include ++#include ++#include ++ ++namespace facebook::react { ++ ++void TrueSheetSpec_registerComponentDescriptorsFromCodegen( ++ std::shared_ptr registry) { ++registry->add(concreteComponentDescriptorProvider()); ++registry->add(concreteComponentDescriptorProvider()); ++registry->add(concreteComponentDescriptorProvider()); ++registry->add(concreteComponentDescriptorProvider()); ++} ++ ++} // namespace facebook::react +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/ComponentDescriptors.h b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/ComponentDescriptors.h +new file mode 100644 +index 0000000..24868ce +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/ComponentDescriptors.h +@@ -0,0 +1,27 @@ ++ ++/** ++ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++ * ++ * Do not edit this file as changes may cause incorrect behavior and will be lost ++ * once the code is regenerated. ++ * ++ * @generated by codegen project: GenerateComponentDescriptorH.js ++ */ ++ ++#pragma once ++ ++#include ++#include ++#include ++ ++namespace facebook::react { ++ ++using TrueSheetContainerViewComponentDescriptor = ConcreteComponentDescriptor; ++using TrueSheetContentViewComponentDescriptor = ConcreteComponentDescriptor; ++using TrueSheetFooterViewComponentDescriptor = ConcreteComponentDescriptor; ++using TrueSheetHeaderViewComponentDescriptor = ConcreteComponentDescriptor; ++ ++void TrueSheetSpec_registerComponentDescriptorsFromCodegen( ++ std::shared_ptr registry); ++ ++} // namespace facebook::react +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/EventEmitters.cpp b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/EventEmitters.cpp +new file mode 100644 +index 0000000..5424c72 +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/EventEmitters.cpp +@@ -0,0 +1,169 @@ ++ ++/** ++ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++ * ++ * Do not edit this file as changes may cause incorrect behavior and will be lost ++ * once the code is regenerated. ++ * ++ * @generated by codegen project: GenerateEventEmitterCpp.js ++ */ ++ ++#include ++ ++ ++namespace facebook::react { ++ ++ ++ ++ ++ ++void TrueSheetViewEventEmitter::onMount(OnMount $event) const { ++ dispatchEvent("mount", [](jsi::Runtime &runtime) { ++ auto $payload = jsi::Object(runtime); ++ ++ return $payload; ++ }); ++} ++ ++ ++void TrueSheetViewEventEmitter::onWillPresent(OnWillPresent $event) const { ++ dispatchEvent("willPresent", [$event=std::move($event)](jsi::Runtime &runtime) { ++ auto $payload = jsi::Object(runtime); ++ $payload.setProperty(runtime, "index", $event.index); ++$payload.setProperty(runtime, "position", $event.position); ++$payload.setProperty(runtime, "detent", $event.detent); ++ return $payload; ++ }); ++} ++ ++ ++void TrueSheetViewEventEmitter::onDidPresent(OnDidPresent $event) const { ++ dispatchEvent("didPresent", [$event=std::move($event)](jsi::Runtime &runtime) { ++ auto $payload = jsi::Object(runtime); ++ $payload.setProperty(runtime, "index", $event.index); ++$payload.setProperty(runtime, "position", $event.position); ++$payload.setProperty(runtime, "detent", $event.detent); ++ return $payload; ++ }); ++} ++ ++ ++void TrueSheetViewEventEmitter::onWillDismiss(OnWillDismiss $event) const { ++ dispatchEvent("willDismiss", [](jsi::Runtime &runtime) { ++ auto $payload = jsi::Object(runtime); ++ ++ return $payload; ++ }); ++} ++ ++ ++void TrueSheetViewEventEmitter::onDidDismiss(OnDidDismiss $event) const { ++ dispatchEvent("didDismiss", [](jsi::Runtime &runtime) { ++ auto $payload = jsi::Object(runtime); ++ ++ return $payload; ++ }); ++} ++ ++ ++void TrueSheetViewEventEmitter::onDetentChange(OnDetentChange $event) const { ++ dispatchEvent("detentChange", [$event=std::move($event)](jsi::Runtime &runtime) { ++ auto $payload = jsi::Object(runtime); ++ $payload.setProperty(runtime, "index", $event.index); ++$payload.setProperty(runtime, "position", $event.position); ++$payload.setProperty(runtime, "detent", $event.detent); ++ return $payload; ++ }); ++} ++ ++ ++void TrueSheetViewEventEmitter::onDragBegin(OnDragBegin $event) const { ++ dispatchEvent("dragBegin", [$event=std::move($event)](jsi::Runtime &runtime) { ++ auto $payload = jsi::Object(runtime); ++ $payload.setProperty(runtime, "index", $event.index); ++$payload.setProperty(runtime, "position", $event.position); ++$payload.setProperty(runtime, "detent", $event.detent); ++ return $payload; ++ }); ++} ++ ++ ++void TrueSheetViewEventEmitter::onDragChange(OnDragChange $event) const { ++ dispatchEvent("dragChange", [$event=std::move($event)](jsi::Runtime &runtime) { ++ auto $payload = jsi::Object(runtime); ++ $payload.setProperty(runtime, "index", $event.index); ++$payload.setProperty(runtime, "position", $event.position); ++$payload.setProperty(runtime, "detent", $event.detent); ++ return $payload; ++ }); ++} ++ ++ ++void TrueSheetViewEventEmitter::onDragEnd(OnDragEnd $event) const { ++ dispatchEvent("dragEnd", [$event=std::move($event)](jsi::Runtime &runtime) { ++ auto $payload = jsi::Object(runtime); ++ $payload.setProperty(runtime, "index", $event.index); ++$payload.setProperty(runtime, "position", $event.position); ++$payload.setProperty(runtime, "detent", $event.detent); ++ return $payload; ++ }); ++} ++ ++ ++void TrueSheetViewEventEmitter::onPositionChange(OnPositionChange $event) const { ++ dispatchEvent("positionChange", [$event=std::move($event)](jsi::Runtime &runtime) { ++ auto $payload = jsi::Object(runtime); ++ $payload.setProperty(runtime, "index", $event.index); ++$payload.setProperty(runtime, "position", $event.position); ++$payload.setProperty(runtime, "detent", $event.detent); ++$payload.setProperty(runtime, "realtime", $event.realtime); ++ return $payload; ++ }); ++} ++ ++ ++void TrueSheetViewEventEmitter::onWillFocus(OnWillFocus $event) const { ++ dispatchEvent("willFocus", [](jsi::Runtime &runtime) { ++ auto $payload = jsi::Object(runtime); ++ ++ return $payload; ++ }); ++} ++ ++ ++void TrueSheetViewEventEmitter::onDidFocus(OnDidFocus $event) const { ++ dispatchEvent("didFocus", [](jsi::Runtime &runtime) { ++ auto $payload = jsi::Object(runtime); ++ ++ return $payload; ++ }); ++} ++ ++ ++void TrueSheetViewEventEmitter::onWillBlur(OnWillBlur $event) const { ++ dispatchEvent("willBlur", [](jsi::Runtime &runtime) { ++ auto $payload = jsi::Object(runtime); ++ ++ return $payload; ++ }); ++} ++ ++ ++void TrueSheetViewEventEmitter::onDidBlur(OnDidBlur $event) const { ++ dispatchEvent("didBlur", [](jsi::Runtime &runtime) { ++ auto $payload = jsi::Object(runtime); ++ ++ return $payload; ++ }); ++} ++ ++ ++void TrueSheetViewEventEmitter::onBackPress(OnBackPress $event) const { ++ dispatchEvent("backPress", [](jsi::Runtime &runtime) { ++ auto $payload = jsi::Object(runtime); ++ ++ return $payload; ++ }); ++} ++ ++} // namespace facebook::react +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/EventEmitters.h b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/EventEmitters.h +new file mode 100644 +index 0000000..cc85e70 +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/EventEmitters.h +@@ -0,0 +1,152 @@ ++ ++/** ++ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++ * ++ * Do not edit this file as changes may cause incorrect behavior and will be lost ++ * once the code is regenerated. ++ * ++ * @generated by codegen project: GenerateEventEmitterH.js ++ */ ++#pragma once ++ ++#include ++ ++ ++namespace facebook::react { ++class TrueSheetContainerViewEventEmitter : public ViewEventEmitter { ++ public: ++ using ViewEventEmitter::ViewEventEmitter; ++ ++ ++ ++}; ++class TrueSheetContentViewEventEmitter : public ViewEventEmitter { ++ public: ++ using ViewEventEmitter::ViewEventEmitter; ++ ++ ++ ++}; ++class TrueSheetFooterViewEventEmitter : public ViewEventEmitter { ++ public: ++ using ViewEventEmitter::ViewEventEmitter; ++ ++ ++ ++}; ++class TrueSheetHeaderViewEventEmitter : public ViewEventEmitter { ++ public: ++ using ViewEventEmitter::ViewEventEmitter; ++ ++ ++ ++}; ++class TrueSheetViewEventEmitter : public ViewEventEmitter { ++ public: ++ using ViewEventEmitter::ViewEventEmitter; ++ ++ struct OnMount { ++ ++ }; ++ ++ struct OnWillPresent { ++ int index; ++ double position; ++ double detent; ++ }; ++ ++ struct OnDidPresent { ++ int index; ++ double position; ++ double detent; ++ }; ++ ++ struct OnWillDismiss { ++ ++ }; ++ ++ struct OnDidDismiss { ++ ++ }; ++ ++ struct OnDetentChange { ++ int index; ++ double position; ++ double detent; ++ }; ++ ++ struct OnDragBegin { ++ int index; ++ double position; ++ double detent; ++ }; ++ ++ struct OnDragChange { ++ int index; ++ double position; ++ double detent; ++ }; ++ ++ struct OnDragEnd { ++ int index; ++ double position; ++ double detent; ++ }; ++ ++ struct OnPositionChange { ++ double index; ++ double position; ++ double detent; ++ bool realtime; ++ }; ++ ++ struct OnWillFocus { ++ ++ }; ++ ++ struct OnDidFocus { ++ ++ }; ++ ++ struct OnWillBlur { ++ ++ }; ++ ++ struct OnDidBlur { ++ ++ }; ++ ++ struct OnBackPress { ++ ++ }; ++ void onMount(OnMount value) const; ++ ++ void onWillPresent(OnWillPresent value) const; ++ ++ void onDidPresent(OnDidPresent value) const; ++ ++ void onWillDismiss(OnWillDismiss value) const; ++ ++ void onDidDismiss(OnDidDismiss value) const; ++ ++ void onDetentChange(OnDetentChange value) const; ++ ++ void onDragBegin(OnDragBegin value) const; ++ ++ void onDragChange(OnDragChange value) const; ++ ++ void onDragEnd(OnDragEnd value) const; ++ ++ void onPositionChange(OnPositionChange value) const; ++ ++ void onWillFocus(OnWillFocus value) const; ++ ++ void onDidFocus(OnDidFocus value) const; ++ ++ void onWillBlur(OnWillBlur value) const; ++ ++ void onDidBlur(OnDidBlur value) const; ++ ++ void onBackPress(OnBackPress value) const; ++}; ++} // namespace facebook::react +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/Props.cpp b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/Props.cpp +new file mode 100644 +index 0000000..06c320d +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/Props.cpp +@@ -0,0 +1,74 @@ ++ ++/** ++ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++ * ++ * Do not edit this file as changes may cause incorrect behavior and will be lost ++ * once the code is regenerated. ++ * ++ * @generated by codegen project: GeneratePropsCpp.js ++ */ ++ ++#include ++#include ++#include ++ ++namespace facebook::react { ++ ++TrueSheetContainerViewProps::TrueSheetContainerViewProps( ++ const PropsParserContext &context, ++ const TrueSheetContainerViewProps &sourceProps, ++ const RawProps &rawProps): ViewProps(context, sourceProps, rawProps) ++ ++ ++ {} ++TrueSheetContentViewProps::TrueSheetContentViewProps( ++ const PropsParserContext &context, ++ const TrueSheetContentViewProps &sourceProps, ++ const RawProps &rawProps): ViewProps(context, sourceProps, rawProps) ++ ++ ++ {} ++TrueSheetFooterViewProps::TrueSheetFooterViewProps( ++ const PropsParserContext &context, ++ const TrueSheetFooterViewProps &sourceProps, ++ const RawProps &rawProps): ViewProps(context, sourceProps, rawProps) ++ ++ ++ {} ++TrueSheetHeaderViewProps::TrueSheetHeaderViewProps( ++ const PropsParserContext &context, ++ const TrueSheetHeaderViewProps &sourceProps, ++ const RawProps &rawProps): ViewProps(context, sourceProps, rawProps) ++ ++ ++ {} ++TrueSheetViewProps::TrueSheetViewProps( ++ const PropsParserContext &context, ++ const TrueSheetViewProps &sourceProps, ++ const RawProps &rawProps): ViewProps(context, sourceProps, rawProps), ++ ++ detents(convertRawProp(context, rawProps, "detents", sourceProps.detents, {})), ++ maxContentHeight(convertRawProp(context, rawProps, "maxContentHeight", sourceProps.maxContentHeight, {0.0})), ++ maxContentWidth(convertRawProp(context, rawProps, "maxContentWidth", sourceProps.maxContentWidth, {0.0})), ++ cornerRadius(convertRawProp(context, rawProps, "cornerRadius", sourceProps.cornerRadius, {-1.0})), ++ elevation(convertRawProp(context, rawProps, "elevation", sourceProps.elevation, {-1.0})), ++ backgroundColor(convertRawProp(context, rawProps, "backgroundColor", sourceProps.backgroundColor, {})), ++ initialDetentIndex(convertRawProp(context, rawProps, "initialDetentIndex", sourceProps.initialDetentIndex, {-1})), ++ dimmedDetentIndex(convertRawProp(context, rawProps, "dimmedDetentIndex", sourceProps.dimmedDetentIndex, {0})), ++ backgroundBlur(convertRawProp(context, rawProps, "backgroundBlur", sourceProps.backgroundBlur, {TrueSheetViewBackgroundBlur::None})), ++ anchor(convertRawProp(context, rawProps, "anchor", sourceProps.anchor, {TrueSheetViewAnchor::Center})), ++ anchorOffset(convertRawProp(context, rawProps, "anchorOffset", sourceProps.anchorOffset, {16.0})), ++ insetAdjustment(convertRawProp(context, rawProps, "insetAdjustment", sourceProps.insetAdjustment, {TrueSheetViewInsetAdjustment::Automatic})), ++ blurOptions(convertRawProp(context, rawProps, "blurOptions", sourceProps.blurOptions, {})), ++ grabber(convertRawProp(context, rawProps, "grabber", sourceProps.grabber, {true})), ++ grabberOptions(convertRawProp(context, rawProps, "grabberOptions", sourceProps.grabberOptions, {})), ++ dismissible(convertRawProp(context, rawProps, "dismissible", sourceProps.dismissible, {true})), ++ draggable(convertRawProp(context, rawProps, "draggable", sourceProps.draggable, {true})), ++ dimmed(convertRawProp(context, rawProps, "dimmed", sourceProps.dimmed, {true})), ++ initialDetentAnimated(convertRawProp(context, rawProps, "initialDetentAnimated", sourceProps.initialDetentAnimated, {true})), ++ scrollable(convertRawProp(context, rawProps, "scrollable", sourceProps.scrollable, {false})), ++ scrollableOptions(convertRawProp(context, rawProps, "scrollableOptions", sourceProps.scrollableOptions, {})), ++ pageSizing(convertRawProp(context, rawProps, "pageSizing", sourceProps.pageSizing, {true})) ++ {} ++ ++} // namespace facebook::react +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/Props.h b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/Props.h +new file mode 100644 +index 0000000..c1ce69a +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/Props.h +@@ -0,0 +1,258 @@ ++ ++/** ++ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++ * ++ * Do not edit this file as changes may cause incorrect behavior and will be lost ++ * once the code is regenerated. ++ * ++ * @generated by codegen project: GeneratePropsH.js ++ */ ++#pragma once ++ ++#include ++#include ++#include ++#include ++#include ++ ++namespace facebook::react { ++ ++class TrueSheetContainerViewProps final : public ViewProps { ++ public: ++ TrueSheetContainerViewProps() = default; ++ TrueSheetContainerViewProps(const PropsParserContext& context, const TrueSheetContainerViewProps &sourceProps, const RawProps &rawProps); ++ ++#pragma mark - Props ++ ++ ++}; ++ ++class TrueSheetContentViewProps final : public ViewProps { ++ public: ++ TrueSheetContentViewProps() = default; ++ TrueSheetContentViewProps(const PropsParserContext& context, const TrueSheetContentViewProps &sourceProps, const RawProps &rawProps); ++ ++#pragma mark - Props ++ ++ ++}; ++ ++class TrueSheetFooterViewProps final : public ViewProps { ++ public: ++ TrueSheetFooterViewProps() = default; ++ TrueSheetFooterViewProps(const PropsParserContext& context, const TrueSheetFooterViewProps &sourceProps, const RawProps &rawProps); ++ ++#pragma mark - Props ++ ++ ++}; ++ ++class TrueSheetHeaderViewProps final : public ViewProps { ++ public: ++ TrueSheetHeaderViewProps() = default; ++ TrueSheetHeaderViewProps(const PropsParserContext& context, const TrueSheetHeaderViewProps &sourceProps, const RawProps &rawProps); ++ ++#pragma mark - Props ++ ++ ++}; ++ ++enum class TrueSheetViewBackgroundBlur { None, Light, Dark, Default, ExtraLight, Regular, Prominent, SystemUltraThinMaterial, SystemThinMaterial, SystemMaterial, SystemThickMaterial, SystemChromeMaterial, SystemUltraThinMaterialLight, SystemThinMaterialLight, SystemMaterialLight, SystemThickMaterialLight, SystemChromeMaterialLight, SystemUltraThinMaterialDark, SystemThinMaterialDark, SystemMaterialDark, SystemThickMaterialDark, SystemChromeMaterialDark }; ++ ++static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, TrueSheetViewBackgroundBlur &result) { ++ auto string = (std::string)value; ++ if (string == "none") { result = TrueSheetViewBackgroundBlur::None; return; } ++ if (string == "light") { result = TrueSheetViewBackgroundBlur::Light; return; } ++ if (string == "dark") { result = TrueSheetViewBackgroundBlur::Dark; return; } ++ if (string == "default") { result = TrueSheetViewBackgroundBlur::Default; return; } ++ if (string == "extra-light") { result = TrueSheetViewBackgroundBlur::ExtraLight; return; } ++ if (string == "regular") { result = TrueSheetViewBackgroundBlur::Regular; return; } ++ if (string == "prominent") { result = TrueSheetViewBackgroundBlur::Prominent; return; } ++ if (string == "system-ultra-thin-material") { result = TrueSheetViewBackgroundBlur::SystemUltraThinMaterial; return; } ++ if (string == "system-thin-material") { result = TrueSheetViewBackgroundBlur::SystemThinMaterial; return; } ++ if (string == "system-material") { result = TrueSheetViewBackgroundBlur::SystemMaterial; return; } ++ if (string == "system-thick-material") { result = TrueSheetViewBackgroundBlur::SystemThickMaterial; return; } ++ if (string == "system-chrome-material") { result = TrueSheetViewBackgroundBlur::SystemChromeMaterial; return; } ++ if (string == "system-ultra-thin-material-light") { result = TrueSheetViewBackgroundBlur::SystemUltraThinMaterialLight; return; } ++ if (string == "system-thin-material-light") { result = TrueSheetViewBackgroundBlur::SystemThinMaterialLight; return; } ++ if (string == "system-material-light") { result = TrueSheetViewBackgroundBlur::SystemMaterialLight; return; } ++ if (string == "system-thick-material-light") { result = TrueSheetViewBackgroundBlur::SystemThickMaterialLight; return; } ++ if (string == "system-chrome-material-light") { result = TrueSheetViewBackgroundBlur::SystemChromeMaterialLight; return; } ++ if (string == "system-ultra-thin-material-dark") { result = TrueSheetViewBackgroundBlur::SystemUltraThinMaterialDark; return; } ++ if (string == "system-thin-material-dark") { result = TrueSheetViewBackgroundBlur::SystemThinMaterialDark; return; } ++ if (string == "system-material-dark") { result = TrueSheetViewBackgroundBlur::SystemMaterialDark; return; } ++ if (string == "system-thick-material-dark") { result = TrueSheetViewBackgroundBlur::SystemThickMaterialDark; return; } ++ if (string == "system-chrome-material-dark") { result = TrueSheetViewBackgroundBlur::SystemChromeMaterialDark; return; } ++ abort(); ++} ++ ++static inline std::string toString(const TrueSheetViewBackgroundBlur &value) { ++ switch (value) { ++ case TrueSheetViewBackgroundBlur::None: return "none"; ++ case TrueSheetViewBackgroundBlur::Light: return "light"; ++ case TrueSheetViewBackgroundBlur::Dark: return "dark"; ++ case TrueSheetViewBackgroundBlur::Default: return "default"; ++ case TrueSheetViewBackgroundBlur::ExtraLight: return "extra-light"; ++ case TrueSheetViewBackgroundBlur::Regular: return "regular"; ++ case TrueSheetViewBackgroundBlur::Prominent: return "prominent"; ++ case TrueSheetViewBackgroundBlur::SystemUltraThinMaterial: return "system-ultra-thin-material"; ++ case TrueSheetViewBackgroundBlur::SystemThinMaterial: return "system-thin-material"; ++ case TrueSheetViewBackgroundBlur::SystemMaterial: return "system-material"; ++ case TrueSheetViewBackgroundBlur::SystemThickMaterial: return "system-thick-material"; ++ case TrueSheetViewBackgroundBlur::SystemChromeMaterial: return "system-chrome-material"; ++ case TrueSheetViewBackgroundBlur::SystemUltraThinMaterialLight: return "system-ultra-thin-material-light"; ++ case TrueSheetViewBackgroundBlur::SystemThinMaterialLight: return "system-thin-material-light"; ++ case TrueSheetViewBackgroundBlur::SystemMaterialLight: return "system-material-light"; ++ case TrueSheetViewBackgroundBlur::SystemThickMaterialLight: return "system-thick-material-light"; ++ case TrueSheetViewBackgroundBlur::SystemChromeMaterialLight: return "system-chrome-material-light"; ++ case TrueSheetViewBackgroundBlur::SystemUltraThinMaterialDark: return "system-ultra-thin-material-dark"; ++ case TrueSheetViewBackgroundBlur::SystemThinMaterialDark: return "system-thin-material-dark"; ++ case TrueSheetViewBackgroundBlur::SystemMaterialDark: return "system-material-dark"; ++ case TrueSheetViewBackgroundBlur::SystemThickMaterialDark: return "system-thick-material-dark"; ++ case TrueSheetViewBackgroundBlur::SystemChromeMaterialDark: return "system-chrome-material-dark"; ++ } ++} ++enum class TrueSheetViewAnchor { Left, Center, Right }; ++ ++static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, TrueSheetViewAnchor &result) { ++ auto string = (std::string)value; ++ if (string == "left") { result = TrueSheetViewAnchor::Left; return; } ++ if (string == "center") { result = TrueSheetViewAnchor::Center; return; } ++ if (string == "right") { result = TrueSheetViewAnchor::Right; return; } ++ abort(); ++} ++ ++static inline std::string toString(const TrueSheetViewAnchor &value) { ++ switch (value) { ++ case TrueSheetViewAnchor::Left: return "left"; ++ case TrueSheetViewAnchor::Center: return "center"; ++ case TrueSheetViewAnchor::Right: return "right"; ++ } ++} ++enum class TrueSheetViewInsetAdjustment { Automatic, Never }; ++ ++static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, TrueSheetViewInsetAdjustment &result) { ++ auto string = (std::string)value; ++ if (string == "automatic") { result = TrueSheetViewInsetAdjustment::Automatic; return; } ++ if (string == "never") { result = TrueSheetViewInsetAdjustment::Never; return; } ++ abort(); ++} ++ ++static inline std::string toString(const TrueSheetViewInsetAdjustment &value) { ++ switch (value) { ++ case TrueSheetViewInsetAdjustment::Automatic: return "automatic"; ++ case TrueSheetViewInsetAdjustment::Never: return "never"; ++ } ++} ++struct TrueSheetViewBlurOptionsStruct { ++ double intensity{-1.0}; ++ bool interaction{true}; ++}; ++ ++static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, TrueSheetViewBlurOptionsStruct &result) { ++ auto map = (std::unordered_map)value; ++ ++ auto tmp_intensity = map.find("intensity"); ++ if (tmp_intensity != map.end()) { ++ fromRawValue(context, tmp_intensity->second, result.intensity); ++ } ++ auto tmp_interaction = map.find("interaction"); ++ if (tmp_interaction != map.end()) { ++ fromRawValue(context, tmp_interaction->second, result.interaction); ++ } ++} ++ ++static inline std::string toString(const TrueSheetViewBlurOptionsStruct &value) { ++ return "[Object TrueSheetViewBlurOptionsStruct]"; ++} ++ ++struct TrueSheetViewGrabberOptionsStruct { ++ double width{0.0}; ++ double height{0.0}; ++ double topMargin{0.0}; ++ double cornerRadius{-1.0}; ++ SharedColor color{}; ++ bool adaptive{true}; ++}; ++ ++static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, TrueSheetViewGrabberOptionsStruct &result) { ++ auto map = (std::unordered_map)value; ++ ++ auto tmp_width = map.find("width"); ++ if (tmp_width != map.end()) { ++ fromRawValue(context, tmp_width->second, result.width); ++ } ++ auto tmp_height = map.find("height"); ++ if (tmp_height != map.end()) { ++ fromRawValue(context, tmp_height->second, result.height); ++ } ++ auto tmp_topMargin = map.find("topMargin"); ++ if (tmp_topMargin != map.end()) { ++ fromRawValue(context, tmp_topMargin->second, result.topMargin); ++ } ++ auto tmp_cornerRadius = map.find("cornerRadius"); ++ if (tmp_cornerRadius != map.end()) { ++ fromRawValue(context, tmp_cornerRadius->second, result.cornerRadius); ++ } ++ auto tmp_color = map.find("color"); ++ if (tmp_color != map.end()) { ++ fromRawValue(context, tmp_color->second, result.color); ++ } ++ auto tmp_adaptive = map.find("adaptive"); ++ if (tmp_adaptive != map.end()) { ++ fromRawValue(context, tmp_adaptive->second, result.adaptive); ++ } ++} ++ ++static inline std::string toString(const TrueSheetViewGrabberOptionsStruct &value) { ++ return "[Object TrueSheetViewGrabberOptionsStruct]"; ++} ++ ++struct TrueSheetViewScrollableOptionsStruct { ++ double keyboardScrollOffset{0.0}; ++}; ++ ++static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, TrueSheetViewScrollableOptionsStruct &result) { ++ auto map = (std::unordered_map)value; ++ ++ auto tmp_keyboardScrollOffset = map.find("keyboardScrollOffset"); ++ if (tmp_keyboardScrollOffset != map.end()) { ++ fromRawValue(context, tmp_keyboardScrollOffset->second, result.keyboardScrollOffset); ++ } ++} ++ ++static inline std::string toString(const TrueSheetViewScrollableOptionsStruct &value) { ++ return "[Object TrueSheetViewScrollableOptionsStruct]"; ++} ++class TrueSheetViewProps final : public ViewProps { ++ public: ++ TrueSheetViewProps() = default; ++ TrueSheetViewProps(const PropsParserContext& context, const TrueSheetViewProps &sourceProps, const RawProps &rawProps); ++ ++#pragma mark - Props ++ ++ std::vector detents{}; ++ double maxContentHeight{0.0}; ++ double maxContentWidth{0.0}; ++ double cornerRadius{-1.0}; ++ double elevation{-1.0}; ++ SharedColor backgroundColor{}; ++ int initialDetentIndex{-1}; ++ int dimmedDetentIndex{0}; ++ TrueSheetViewBackgroundBlur backgroundBlur{TrueSheetViewBackgroundBlur::None}; ++ TrueSheetViewAnchor anchor{TrueSheetViewAnchor::Center}; ++ double anchorOffset{16.0}; ++ TrueSheetViewInsetAdjustment insetAdjustment{TrueSheetViewInsetAdjustment::Automatic}; ++ TrueSheetViewBlurOptionsStruct blurOptions{}; ++ bool grabber{true}; ++ TrueSheetViewGrabberOptionsStruct grabberOptions{}; ++ bool dismissible{true}; ++ bool draggable{true}; ++ bool dimmed{true}; ++ bool initialDetentAnimated{true}; ++ bool scrollable{false}; ++ TrueSheetViewScrollableOptionsStruct scrollableOptions{}; ++ bool pageSizing{true}; ++}; ++ ++} // namespace facebook::react +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/ShadowNodes.cpp b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/ShadowNodes.cpp +new file mode 100644 +index 0000000..40e19ec +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/ShadowNodes.cpp +@@ -0,0 +1,20 @@ ++ ++/** ++ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++ * ++ * Do not edit this file as changes may cause incorrect behavior and will be lost ++ * once the code is regenerated. ++ * ++ * @generated by codegen project: GenerateShadowNodeCpp.js ++ */ ++ ++#include ++ ++namespace facebook::react { ++ ++extern const char TrueSheetContainerViewComponentName[] = "TrueSheetContainerView"; ++extern const char TrueSheetContentViewComponentName[] = "TrueSheetContentView"; ++extern const char TrueSheetFooterViewComponentName[] = "TrueSheetFooterView"; ++extern const char TrueSheetHeaderViewComponentName[] = "TrueSheetHeaderView"; ++ ++} // namespace facebook::react +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/ShadowNodes.h b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/ShadowNodes.h +new file mode 100644 +index 0000000..8154eda +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/ShadowNodes.h +@@ -0,0 +1,65 @@ ++ ++/** ++ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++ * ++ * Do not edit this file as changes may cause incorrect behavior and will be lost ++ * once the code is regenerated. ++ * ++ * @generated by codegen project: GenerateShadowNodeH.js ++ */ ++ ++#pragma once ++ ++#include ++#include ++#include ++#include ++#include ++ ++namespace facebook::react { ++ ++JSI_EXPORT extern const char TrueSheetContainerViewComponentName[]; ++ ++/* ++ * `ShadowNode` for component. ++ */ ++using TrueSheetContainerViewShadowNode = ConcreteViewShadowNode< ++ TrueSheetContainerViewComponentName, ++ TrueSheetContainerViewProps, ++ TrueSheetContainerViewEventEmitter, ++ TrueSheetContainerViewState>; ++ ++JSI_EXPORT extern const char TrueSheetContentViewComponentName[]; ++ ++/* ++ * `ShadowNode` for component. ++ */ ++using TrueSheetContentViewShadowNode = ConcreteViewShadowNode< ++ TrueSheetContentViewComponentName, ++ TrueSheetContentViewProps, ++ TrueSheetContentViewEventEmitter, ++ TrueSheetContentViewState>; ++ ++JSI_EXPORT extern const char TrueSheetFooterViewComponentName[]; ++ ++/* ++ * `ShadowNode` for component. ++ */ ++using TrueSheetFooterViewShadowNode = ConcreteViewShadowNode< ++ TrueSheetFooterViewComponentName, ++ TrueSheetFooterViewProps, ++ TrueSheetFooterViewEventEmitter, ++ TrueSheetFooterViewState>; ++ ++JSI_EXPORT extern const char TrueSheetHeaderViewComponentName[]; ++ ++/* ++ * `ShadowNode` for component. ++ */ ++using TrueSheetHeaderViewShadowNode = ConcreteViewShadowNode< ++ TrueSheetHeaderViewComponentName, ++ TrueSheetHeaderViewProps, ++ TrueSheetHeaderViewEventEmitter, ++ TrueSheetHeaderViewState>; ++ ++} // namespace facebook::react +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/States.cpp b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/States.cpp +new file mode 100644 +index 0000000..8903dac +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/States.cpp +@@ -0,0 +1,16 @@ ++ ++/** ++ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++ * ++ * Do not edit this file as changes may cause incorrect behavior and will be lost ++ * once the code is regenerated. ++ * ++ * @generated by codegen project: GenerateStateCpp.js ++ */ ++#include ++ ++namespace facebook::react { ++ ++ ++ ++} // namespace facebook::react +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/States.h b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/States.h +new file mode 100644 +index 0000000..d4e3223 +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/States.h +@@ -0,0 +1,65 @@ ++/** ++ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++ * ++ * Do not edit this file as changes may cause incorrect behavior and will be lost ++ * once the code is regenerated. ++ * ++ * @generated by codegen project: GenerateStateH.js ++ */ ++#pragma once ++ ++#ifdef ANDROID ++#include ++#endif ++ ++namespace facebook::react { ++ ++class TrueSheetContainerViewState { ++public: ++ TrueSheetContainerViewState() = default; ++ ++#ifdef ANDROID ++ TrueSheetContainerViewState(TrueSheetContainerViewState const &previousState, folly::dynamic data){}; ++ folly::dynamic getDynamic() const { ++ return {}; ++ }; ++#endif ++}; ++ ++class TrueSheetContentViewState { ++public: ++ TrueSheetContentViewState() = default; ++ ++#ifdef ANDROID ++ TrueSheetContentViewState(TrueSheetContentViewState const &previousState, folly::dynamic data){}; ++ folly::dynamic getDynamic() const { ++ return {}; ++ }; ++#endif ++}; ++ ++class TrueSheetFooterViewState { ++public: ++ TrueSheetFooterViewState() = default; ++ ++#ifdef ANDROID ++ TrueSheetFooterViewState(TrueSheetFooterViewState const &previousState, folly::dynamic data){}; ++ folly::dynamic getDynamic() const { ++ return {}; ++ }; ++#endif ++}; ++ ++class TrueSheetHeaderViewState { ++public: ++ TrueSheetHeaderViewState() = default; ++ ++#ifdef ANDROID ++ TrueSheetHeaderViewState(TrueSheetHeaderViewState const &previousState, folly::dynamic data){}; ++ folly::dynamic getDynamic() const { ++ return {}; ++ }; ++#endif ++}; ++ ++} // namespace facebook::react +\ No newline at end of file +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/TrueSheetSpecJSI-generated.cpp b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/TrueSheetSpecJSI-generated.cpp +new file mode 100644 +index 0000000..4f44db6 +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/TrueSheetSpecJSI-generated.cpp +@@ -0,0 +1,60 @@ ++/** ++ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++ * ++ * Do not edit this file as changes may cause incorrect behavior and will be lost ++ * once the code is regenerated. ++ * ++ * @generated by codegen project: GenerateModuleCpp.js ++ */ ++ ++#include "TrueSheetSpecJSI.h" ++ ++namespace facebook::react { ++ ++static jsi::Value __hostFunction_NativeTrueSheetModuleCxxSpecJSI_presentByRef(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { ++ return static_cast(&turboModule)->presentByRef( ++ rt, ++ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber(), ++ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asNumber(), ++ count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asBool() ++ ); ++} ++static jsi::Value __hostFunction_NativeTrueSheetModuleCxxSpecJSI_dismissByRef(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { ++ return static_cast(&turboModule)->dismissByRef( ++ rt, ++ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber(), ++ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool() ++ ); ++} ++static jsi::Value __hostFunction_NativeTrueSheetModuleCxxSpecJSI_dismissStackByRef(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { ++ return static_cast(&turboModule)->dismissStackByRef( ++ rt, ++ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber(), ++ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool() ++ ); ++} ++static jsi::Value __hostFunction_NativeTrueSheetModuleCxxSpecJSI_resizeByRef(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { ++ return static_cast(&turboModule)->resizeByRef( ++ rt, ++ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber(), ++ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asNumber() ++ ); ++} ++static jsi::Value __hostFunction_NativeTrueSheetModuleCxxSpecJSI_dismissAll(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { ++ return static_cast(&turboModule)->dismissAll( ++ rt, ++ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asBool() ++ ); ++} ++ ++NativeTrueSheetModuleCxxSpecJSI::NativeTrueSheetModuleCxxSpecJSI(std::shared_ptr jsInvoker) ++ : TurboModule("TrueSheetModule", jsInvoker) { ++ methodMap_["presentByRef"] = MethodMetadata {3, __hostFunction_NativeTrueSheetModuleCxxSpecJSI_presentByRef}; ++ methodMap_["dismissByRef"] = MethodMetadata {2, __hostFunction_NativeTrueSheetModuleCxxSpecJSI_dismissByRef}; ++ methodMap_["dismissStackByRef"] = MethodMetadata {2, __hostFunction_NativeTrueSheetModuleCxxSpecJSI_dismissStackByRef}; ++ methodMap_["resizeByRef"] = MethodMetadata {2, __hostFunction_NativeTrueSheetModuleCxxSpecJSI_resizeByRef}; ++ methodMap_["dismissAll"] = MethodMetadata {1, __hostFunction_NativeTrueSheetModuleCxxSpecJSI_dismissAll}; ++} ++ ++ ++} // namespace facebook::react +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/TrueSheetSpecJSI.h b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/TrueSheetSpecJSI.h +new file mode 100644 +index 0000000..558ae50 +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/TrueSheetSpecJSI.h +@@ -0,0 +1,107 @@ ++/** ++ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++ * ++ * Do not edit this file as changes may cause incorrect behavior and will be lost ++ * once the code is regenerated. ++ * ++ * @generated by codegen project: GenerateModuleH.js ++ */ ++ ++#pragma once ++ ++#include ++#include ++ ++namespace facebook::react { ++ ++ ++ class JSI_EXPORT NativeTrueSheetModuleCxxSpecJSI : public TurboModule { ++protected: ++ NativeTrueSheetModuleCxxSpecJSI(std::shared_ptr jsInvoker); ++ ++public: ++ virtual jsi::Value presentByRef(jsi::Runtime &rt, double viewTag, double index, bool animated) = 0; ++ virtual jsi::Value dismissByRef(jsi::Runtime &rt, double viewTag, bool animated) = 0; ++ virtual jsi::Value dismissStackByRef(jsi::Runtime &rt, double viewTag, bool animated) = 0; ++ virtual jsi::Value resizeByRef(jsi::Runtime &rt, double viewTag, double index) = 0; ++ virtual jsi::Value dismissAll(jsi::Runtime &rt, bool animated) = 0; ++ ++}; ++ ++template ++class JSI_EXPORT NativeTrueSheetModuleCxxSpec : public TurboModule { ++public: ++ jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { ++ return delegate_.create(rt, propName); ++ } ++ ++ std::vector getPropertyNames(jsi::Runtime& runtime) override { ++ return delegate_.getPropertyNames(runtime); ++ } ++ ++ static constexpr std::string_view kModuleName = "TrueSheetModule"; ++ ++protected: ++ NativeTrueSheetModuleCxxSpec(std::shared_ptr jsInvoker) ++ : TurboModule(std::string{NativeTrueSheetModuleCxxSpec::kModuleName}, jsInvoker), ++ delegate_(reinterpret_cast(this), jsInvoker) {} ++ ++ ++private: ++ class Delegate : public NativeTrueSheetModuleCxxSpecJSI { ++ public: ++ Delegate(T *instance, std::shared_ptr jsInvoker) : ++ NativeTrueSheetModuleCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { ++ ++ } ++ ++ jsi::Value presentByRef(jsi::Runtime &rt, double viewTag, double index, bool animated) override { ++ static_assert( ++ bridging::getParameterCount(&T::presentByRef) == 4, ++ "Expected presentByRef(...) to have 4 parameters"); ++ ++ return bridging::callFromJs( ++ rt, &T::presentByRef, jsInvoker_, instance_, std::move(viewTag), std::move(index), std::move(animated)); ++ } ++ jsi::Value dismissByRef(jsi::Runtime &rt, double viewTag, bool animated) override { ++ static_assert( ++ bridging::getParameterCount(&T::dismissByRef) == 3, ++ "Expected dismissByRef(...) to have 3 parameters"); ++ ++ return bridging::callFromJs( ++ rt, &T::dismissByRef, jsInvoker_, instance_, std::move(viewTag), std::move(animated)); ++ } ++ jsi::Value dismissStackByRef(jsi::Runtime &rt, double viewTag, bool animated) override { ++ static_assert( ++ bridging::getParameterCount(&T::dismissStackByRef) == 3, ++ "Expected dismissStackByRef(...) to have 3 parameters"); ++ ++ return bridging::callFromJs( ++ rt, &T::dismissStackByRef, jsInvoker_, instance_, std::move(viewTag), std::move(animated)); ++ } ++ jsi::Value resizeByRef(jsi::Runtime &rt, double viewTag, double index) override { ++ static_assert( ++ bridging::getParameterCount(&T::resizeByRef) == 3, ++ "Expected resizeByRef(...) to have 3 parameters"); ++ ++ return bridging::callFromJs( ++ rt, &T::resizeByRef, jsInvoker_, instance_, std::move(viewTag), std::move(index)); ++ } ++ jsi::Value dismissAll(jsi::Runtime &rt, bool animated) override { ++ static_assert( ++ bridging::getParameterCount(&T::dismissAll) == 2, ++ "Expected dismissAll(...) to have 2 parameters"); ++ ++ return bridging::callFromJs( ++ rt, &T::dismissAll, jsInvoker_, instance_, std::move(animated)); ++ } ++ ++ private: ++ friend class NativeTrueSheetModuleCxxSpec; ++ T *instance_; ++ }; ++ ++ Delegate delegate_; ++}; ++ ++} // namespace facebook::react +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/schema.json b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/schema.json +new file mode 100644 +index 0000000..884abd2 +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/schema.json +@@ -0,0 +1 @@ ++{"modules":{"TrueSheetContainerView":{"type":"Component","components":{"TrueSheetContainerView":{"extendsProps":[{"type":"ReactNativeBuiltInType","knownTypeName":"ReactNativeCoreViewProps"}],"events":[],"props":[],"commands":[]}}},"TrueSheetContentView":{"type":"Component","components":{"TrueSheetContentView":{"extendsProps":[{"type":"ReactNativeBuiltInType","knownTypeName":"ReactNativeCoreViewProps"}],"events":[],"props":[],"commands":[]}}},"TrueSheetFooterView":{"type":"Component","components":{"TrueSheetFooterView":{"extendsProps":[{"type":"ReactNativeBuiltInType","knownTypeName":"ReactNativeCoreViewProps"}],"events":[],"props":[],"commands":[]}}},"TrueSheetHeaderView":{"type":"Component","components":{"TrueSheetHeaderView":{"extendsProps":[{"type":"ReactNativeBuiltInType","knownTypeName":"ReactNativeCoreViewProps"}],"events":[],"props":[],"commands":[]}}},"TrueSheetView":{"type":"Component","components":{"TrueSheetView":{"interfaceOnly":true,"extendsProps":[{"type":"ReactNativeBuiltInType","knownTypeName":"ReactNativeCoreViewProps"}],"events":[{"name":"onMount","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[]}}},{"name":"onWillPresent","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[{"name":"index","optional":false,"typeAnnotation":{"type":"Int32TypeAnnotation"}},{"name":"position","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}},{"name":"detent","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}}]}}},{"name":"onDidPresent","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[{"name":"index","optional":false,"typeAnnotation":{"type":"Int32TypeAnnotation"}},{"name":"position","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}},{"name":"detent","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}}]}}},{"name":"onWillDismiss","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[]}}},{"name":"onDidDismiss","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[]}}},{"name":"onDetentChange","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[{"name":"index","optional":false,"typeAnnotation":{"type":"Int32TypeAnnotation"}},{"name":"position","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}},{"name":"detent","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}}]}}},{"name":"onDragBegin","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[{"name":"index","optional":false,"typeAnnotation":{"type":"Int32TypeAnnotation"}},{"name":"position","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}},{"name":"detent","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}}]}}},{"name":"onDragChange","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[{"name":"index","optional":false,"typeAnnotation":{"type":"Int32TypeAnnotation"}},{"name":"position","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}},{"name":"detent","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}}]}}},{"name":"onDragEnd","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[{"name":"index","optional":false,"typeAnnotation":{"type":"Int32TypeAnnotation"}},{"name":"position","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}},{"name":"detent","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}}]}}},{"name":"onPositionChange","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[{"name":"index","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}},{"name":"position","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}},{"name":"detent","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}},{"name":"realtime","optional":false,"typeAnnotation":{"type":"BooleanTypeAnnotation"}}]}}},{"name":"onWillFocus","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[]}}},{"name":"onDidFocus","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[]}}},{"name":"onWillBlur","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[]}}},{"name":"onDidBlur","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[]}}},{"name":"onBackPress","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[]}}}],"props":[{"name":"detents","optional":true,"typeAnnotation":{"type":"ArrayTypeAnnotation","elementType":{"type":"DoubleTypeAnnotation"}}},{"name":"maxContentHeight","optional":true,"typeAnnotation":{"type":"DoubleTypeAnnotation","default":0}},{"name":"maxContentWidth","optional":true,"typeAnnotation":{"type":"DoubleTypeAnnotation","default":0}},{"name":"cornerRadius","optional":true,"typeAnnotation":{"type":"DoubleTypeAnnotation","default":-1}},{"name":"elevation","optional":true,"typeAnnotation":{"type":"DoubleTypeAnnotation","default":-1}},{"name":"backgroundColor","optional":true,"typeAnnotation":{"type":"ReservedPropTypeAnnotation","name":"ColorPrimitive"}},{"name":"initialDetentIndex","optional":true,"typeAnnotation":{"type":"Int32TypeAnnotation","default":-1}},{"name":"dimmedDetentIndex","optional":true,"typeAnnotation":{"type":"Int32TypeAnnotation","default":0}},{"name":"backgroundBlur","optional":true,"typeAnnotation":{"type":"StringEnumTypeAnnotation","default":"none","options":["none","light","dark","default","extra-light","regular","prominent","system-ultra-thin-material","system-thin-material","system-material","system-thick-material","system-chrome-material","system-ultra-thin-material-light","system-thin-material-light","system-material-light","system-thick-material-light","system-chrome-material-light","system-ultra-thin-material-dark","system-thin-material-dark","system-material-dark","system-thick-material-dark","system-chrome-material-dark"]}},{"name":"anchor","optional":true,"typeAnnotation":{"type":"StringEnumTypeAnnotation","default":"center","options":["left","center","right"]}},{"name":"anchorOffset","optional":true,"typeAnnotation":{"type":"DoubleTypeAnnotation","default":16}},{"name":"insetAdjustment","optional":true,"typeAnnotation":{"type":"StringEnumTypeAnnotation","default":"automatic","options":["automatic","never"]}},{"name":"blurOptions","optional":true,"typeAnnotation":{"type":"ObjectTypeAnnotation","properties":[{"name":"intensity","optional":true,"typeAnnotation":{"type":"DoubleTypeAnnotation","default":-1}},{"name":"interaction","optional":true,"typeAnnotation":{"type":"BooleanTypeAnnotation","default":true}}]}},{"name":"grabber","optional":true,"typeAnnotation":{"type":"BooleanTypeAnnotation","default":true}},{"name":"grabberOptions","optional":true,"typeAnnotation":{"type":"ObjectTypeAnnotation","properties":[{"name":"width","optional":true,"typeAnnotation":{"type":"DoubleTypeAnnotation","default":0}},{"name":"height","optional":true,"typeAnnotation":{"type":"DoubleTypeAnnotation","default":0}},{"name":"topMargin","optional":true,"typeAnnotation":{"type":"DoubleTypeAnnotation","default":0}},{"name":"cornerRadius","optional":true,"typeAnnotation":{"type":"DoubleTypeAnnotation","default":-1}},{"name":"color","optional":true,"typeAnnotation":{"type":"ReservedPropTypeAnnotation","name":"ColorPrimitive"}},{"name":"adaptive","optional":true,"typeAnnotation":{"type":"BooleanTypeAnnotation","default":true}}]}},{"name":"dismissible","optional":true,"typeAnnotation":{"type":"BooleanTypeAnnotation","default":true}},{"name":"draggable","optional":true,"typeAnnotation":{"type":"BooleanTypeAnnotation","default":true}},{"name":"dimmed","optional":true,"typeAnnotation":{"type":"BooleanTypeAnnotation","default":true}},{"name":"initialDetentAnimated","optional":true,"typeAnnotation":{"type":"BooleanTypeAnnotation","default":true}},{"name":"scrollable","optional":true,"typeAnnotation":{"type":"BooleanTypeAnnotation","default":false}},{"name":"scrollableOptions","optional":true,"typeAnnotation":{"type":"ObjectTypeAnnotation","properties":[{"name":"keyboardScrollOffset","optional":true,"typeAnnotation":{"type":"DoubleTypeAnnotation","default":0}}]}},{"name":"pageSizing","optional":true,"typeAnnotation":{"type":"BooleanTypeAnnotation","default":true}}],"commands":[]}}},"NativeTrueSheetModule":{"type":"NativeModule","aliasMap":{},"enumMap":{},"spec":{"eventEmitters":[],"methods":[{"name":"presentByRef","optional":false,"typeAnnotation":{"type":"FunctionTypeAnnotation","returnTypeAnnotation":{"type":"PromiseTypeAnnotation","elementType":{"type":"VoidTypeAnnotation"}},"params":[{"name":"viewTag","optional":false,"typeAnnotation":{"type":"NumberTypeAnnotation"}},{"name":"index","optional":false,"typeAnnotation":{"type":"NumberTypeAnnotation"}},{"name":"animated","optional":false,"typeAnnotation":{"type":"BooleanTypeAnnotation"}}]}},{"name":"dismissByRef","optional":false,"typeAnnotation":{"type":"FunctionTypeAnnotation","returnTypeAnnotation":{"type":"PromiseTypeAnnotation","elementType":{"type":"VoidTypeAnnotation"}},"params":[{"name":"viewTag","optional":false,"typeAnnotation":{"type":"NumberTypeAnnotation"}},{"name":"animated","optional":false,"typeAnnotation":{"type":"BooleanTypeAnnotation"}}]}},{"name":"dismissStackByRef","optional":false,"typeAnnotation":{"type":"FunctionTypeAnnotation","returnTypeAnnotation":{"type":"PromiseTypeAnnotation","elementType":{"type":"VoidTypeAnnotation"}},"params":[{"name":"viewTag","optional":false,"typeAnnotation":{"type":"NumberTypeAnnotation"}},{"name":"animated","optional":false,"typeAnnotation":{"type":"BooleanTypeAnnotation"}}]}},{"name":"resizeByRef","optional":false,"typeAnnotation":{"type":"FunctionTypeAnnotation","returnTypeAnnotation":{"type":"PromiseTypeAnnotation","elementType":{"type":"VoidTypeAnnotation"}},"params":[{"name":"viewTag","optional":false,"typeAnnotation":{"type":"NumberTypeAnnotation"}},{"name":"index","optional":false,"typeAnnotation":{"type":"NumberTypeAnnotation"}}]}},{"name":"dismissAll","optional":false,"typeAnnotation":{"type":"FunctionTypeAnnotation","returnTypeAnnotation":{"type":"PromiseTypeAnnotation","elementType":{"type":"VoidTypeAnnotation"}},"params":[{"name":"animated","optional":false,"typeAnnotation":{"type":"BooleanTypeAnnotation"}}]}}]},"moduleName":"TrueSheetModule"}}} +\ No newline at end of file +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +new file mode 100644 +index 0000000..bc496d1 +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +@@ -0,0 +1,7 @@ ++ ++ ++ ++ ++ ++ +\ No newline at end of file +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +new file mode 100644 +index 0000000..9fc3aab +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +@@ -0,0 +1,18 @@ ++{ ++ "version": 3, ++ "artifactType": { ++ "type": "AAPT_FRIENDLY_MERGED_MANIFESTS", ++ "kind": "Directory" ++ }, ++ "applicationId": "com.lodev09.truesheet", ++ "variantName": "debug", ++ "elements": [ ++ { ++ "type": "SINGLE", ++ "filters": [], ++ "attributes": [], ++ "outputFile": "AndroidManifest.xml" ++ } ++ ], ++ "elementType": "File" ++} +\ No newline at end of file +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +new file mode 100644 +index 0000000..1211b1e +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +@@ -0,0 +1,6 @@ ++aarFormatVersion=1.0 ++aarMetadataVersion=1.0 ++minCompileSdk=1 ++minCompileSdkExtension=0 ++minAndroidGradlePluginVersion=1.0.0 ++coreLibraryDesugaringEnabled=false +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +new file mode 100644 +index 0000000..9e26dfe +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +@@ -0,0 +1 @@ ++{} +\ No newline at end of file +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +new file mode 100644 +index 0000000..ecea938 +Binary files /dev/null and b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar differ +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +new file mode 100644 +index 0000000..e69de29 +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +new file mode 100644 +index 0000000..4998f7b +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +@@ -0,0 +1 @@ ++#Thu Mar 05 15:48:34 BRT 2026 +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +new file mode 100644 +index 0000000..a3a53e4 +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +@@ -0,0 +1,2 @@ ++ ++ +\ No newline at end of file +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +new file mode 100644 +index 0000000..78ac5b8 +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +@@ -0,0 +1,2 @@ ++R_DEF: Internal format may change without notice ++local +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +new file mode 100644 +index 0000000..543fbeb +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +@@ -0,0 +1,7 @@ ++1 ++2 ++4 ++5 ++6 ++7 +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +new file mode 100644 +index 0000000..bc496d1 +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +@@ -0,0 +1,7 @@ ++ ++ ++ ++ ++ ++ +\ No newline at end of file +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +new file mode 100644 +index 0000000..0637a08 +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +@@ -0,0 +1 @@ ++[] +\ No newline at end of file +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +new file mode 100644 +index 0000000..08f4ebe +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +@@ -0,0 +1 @@ ++0 Warning/Error +\ No newline at end of file +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +new file mode 100644 +index 0000000..b4281ca +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +@@ -0,0 +1 @@ ++com.lodev09.truesheet +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/kotlin/compileDebugKotlin/cacheable/dirty-sources.txt b/node_modules/@lodev09/react-native-true-sheet/android/build/kotlin/compileDebugKotlin/cacheable/dirty-sources.txt +new file mode 100644 +index 0000000..9342c7a +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/kotlin/compileDebugKotlin/cacheable/dirty-sources.txt +@@ -0,0 +1,28 @@ ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterView.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/events/TrueSheetLifecycleEvents.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetView.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/utils/ViewUtils.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetHeaderViewManager.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetContentViewManager.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/events/TrueSheetDragEvents.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/core/TrueSheetCoordinatorLayout.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/events/TrueSheetStateEvents.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/core/RNScreensEventObserver.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerViewManager.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/utils/KeyboardUtils.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/core/TrueSheetDimView.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetContentView.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/core/TrueSheetGrabberView.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/core/TrueSheetBottomSheetView.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/core/TrueSheetKeyboardObserver.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/core/TrueSheetStackManager.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetPackage.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetViewManager.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetModule.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetHeaderView.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterViewManager.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/core/TrueSheetDetentCalculator.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/events/TrueSheetFocusEvents.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerView.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/utils/ScreenUtils.kt ++/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetViewController.kt +\ No newline at end of file +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin b/node_modules/@lodev09/react-native-true-sheet/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin +new file mode 100644 +index 0000000..4f62add +Binary files /dev/null and b/node_modules/@lodev09/react-native-true-sheet/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin differ +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/outputs/logs/manifest-merger-debug-report.txt b/node_modules/@lodev09/react-native-true-sheet/android/build/outputs/logs/manifest-merger-debug-report.txt +new file mode 100644 +index 0000000..f95831c +--- /dev/null ++++ b/node_modules/@lodev09/react-native-true-sheet/android/build/outputs/logs/manifest-merger-debug-report.txt +@@ -0,0 +1,16 @@ ++-- Merging decision tree log --- ++manifest ++ADDED from /Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/AndroidManifestNew.xml:1:1-2:12 ++INJECTED from /Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/AndroidManifestNew.xml:1:1-2:12 ++ package ++ INJECTED from /Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/AndroidManifestNew.xml ++ xmlns:android ++ ADDED from /Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/AndroidManifestNew.xml:1:11-69 ++uses-sdk ++INJECTED from /Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/AndroidManifestNew.xml reason: use-sdk injection requested ++INJECTED from /Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/AndroidManifestNew.xml ++INJECTED from /Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/AndroidManifestNew.xml ++ android:targetSdkVersion ++ INJECTED from /Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/AndroidManifestNew.xml ++ android:minSdkVersion ++ INJECTED from /Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/AndroidManifestNew.xml +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerViewManager.kt b/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerViewManager.kt +index 359546c..e8d8f0a 100644 +--- a/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerViewManager.kt ++++ b/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerViewManager.kt +@@ -1,10 +1,8 @@ + package com.lodev09.truesheet + + import com.facebook.react.module.annotations.ReactModule +-import com.facebook.react.uimanager.PointerEvents + import com.facebook.react.uimanager.ThemedReactContext + import com.facebook.react.uimanager.ViewGroupManager +-import com.facebook.react.uimanager.annotations.ReactProp + + /** + * ViewManager for TrueSheetContainerView +@@ -17,11 +15,6 @@ class TrueSheetContainerViewManager : ViewGroupManager() + + override fun createViewInstance(reactContext: ThemedReactContext): TrueSheetContainerView = TrueSheetContainerView(reactContext) + +- @ReactProp(name = "pointerEvents") +- fun setPointerEvents(view: TrueSheetContainerView, pointerEventsStr: String?) { +- view.pointerEvents = PointerEvents.parsePointerEvents(pointerEventsStr) +- } +- + companion object { + const val REACT_CLASS = "TrueSheetContainerView" + } +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetContentViewManager.kt b/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetContentViewManager.kt +index 2853192..2bf5fe5 100644 +--- a/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetContentViewManager.kt ++++ b/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetContentViewManager.kt +@@ -1,10 +1,8 @@ + package com.lodev09.truesheet + + import com.facebook.react.module.annotations.ReactModule +-import com.facebook.react.uimanager.PointerEvents + import com.facebook.react.uimanager.ThemedReactContext + import com.facebook.react.uimanager.ViewGroupManager +-import com.facebook.react.uimanager.annotations.ReactProp + + /** + * ViewManager for TrueSheetContentView +@@ -17,11 +15,6 @@ class TrueSheetContentViewManager : ViewGroupManager() { + + override fun createViewInstance(reactContext: ThemedReactContext): TrueSheetContentView = TrueSheetContentView(reactContext) + +- @ReactProp(name = "pointerEvents") +- fun setPointerEvents(view: TrueSheetContentView, pointerEventsStr: String?) { +- view.pointerEvents = PointerEvents.parsePointerEvents(pointerEventsStr) +- } +- + companion object { + const val REACT_CLASS = "TrueSheetContentView" + } +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterViewManager.kt b/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterViewManager.kt +index aedf0a3..d317e6c 100644 +--- a/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterViewManager.kt ++++ b/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterViewManager.kt +@@ -1,10 +1,8 @@ + package com.lodev09.truesheet + + import com.facebook.react.module.annotations.ReactModule +-import com.facebook.react.uimanager.PointerEvents + import com.facebook.react.uimanager.ThemedReactContext + import com.facebook.react.uimanager.ViewGroupManager +-import com.facebook.react.uimanager.annotations.ReactProp + + /** + * ViewManager for TrueSheetFooterView +@@ -17,11 +15,6 @@ class TrueSheetFooterViewManager : ViewGroupManager() { + + override fun createViewInstance(reactContext: ThemedReactContext): TrueSheetFooterView = TrueSheetFooterView(reactContext) + +- @ReactProp(name = "pointerEvents") +- fun setPointerEvents(view: TrueSheetFooterView, pointerEventsStr: String?) { +- view.pointerEvents = PointerEvents.parsePointerEvents(pointerEventsStr) +- } +- + companion object { + const val REACT_CLASS = "TrueSheetFooterView" + } +diff --git a/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetHeaderViewManager.kt b/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetHeaderViewManager.kt +index a811616..bc43932 100644 +--- a/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetHeaderViewManager.kt ++++ b/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetHeaderViewManager.kt +@@ -1,10 +1,8 @@ + package com.lodev09.truesheet + + import com.facebook.react.module.annotations.ReactModule +-import com.facebook.react.uimanager.PointerEvents + import com.facebook.react.uimanager.ThemedReactContext + import com.facebook.react.uimanager.ViewGroupManager +-import com.facebook.react.uimanager.annotations.ReactProp + + /** + * ViewManager for TrueSheetHeaderView +@@ -17,11 +15,6 @@ class TrueSheetHeaderViewManager : ViewGroupManager() { + + override fun createViewInstance(reactContext: ThemedReactContext): TrueSheetHeaderView = TrueSheetHeaderView(reactContext) + +- @ReactProp(name = "pointerEvents") +- fun setPointerEvents(view: TrueSheetHeaderView, pointerEventsStr: String?) { +- view.pointerEvents = PointerEvents.parsePointerEvents(pointerEventsStr) +- } +- + companion object { + const val REACT_CLASS = "TrueSheetHeaderView" + } From 2f535e36e67bb8a4a3804f7ad8b6ad77ae041ae8 Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Fri, 6 Mar 2026 12:58:37 -0300 Subject: [PATCH 25/98] cleanup --- app/containers/TextInput/FormTextInput.tsx | 1 - package.json | 3 +- ...dev09+react-native-true-sheet+3.7.3.patch} | 0 yarn.lock | 33 +++++-------------- 4 files changed, 10 insertions(+), 27 deletions(-) rename patches/{@lodev09+react-native-true-sheet+3.9.4.patch => @lodev09+react-native-true-sheet+3.7.3.patch} (100%) diff --git a/app/containers/TextInput/FormTextInput.tsx b/app/containers/TextInput/FormTextInput.tsx index 5f17dd9b66d..6a5fda320be 100644 --- a/app/containers/TextInput/FormTextInput.tsx +++ b/app/containers/TextInput/FormTextInput.tsx @@ -9,7 +9,6 @@ import { View, type ViewStyle } from 'react-native'; -import Touchable from 'react-native-platform-touchable'; import { A11y } from 'react-native-a11y-order'; import i18n from '../../i18n'; diff --git a/package.json b/package.json index a840700252d..bdb67b130bb 100644 --- a/package.json +++ b/package.json @@ -25,9 +25,9 @@ }, "dependencies": { "@bugsnag/react-native": "8.4.0", - "@lodev09/react-native-true-sheet": "~3.6.0", "@expo/vector-icons": "^14.1.0", "@hookform/resolvers": "^2.9.10", + "@lodev09/react-native-true-sheet": "~3.7.0", "@nozbe/watermelondb": "^0.28.1-0", "@react-native-async-storage/async-storage": "^1.22.3", "@react-native-camera-roll/camera-roll": "^7.10.0", @@ -149,7 +149,6 @@ "@babel/runtime": "~7.25.9", "@bugsnag/cli": "^3.2.1", "@bugsnag/source-maps": "^2.3.3", - "@gorhom/bottom-sheet": "^5.1.6", "@react-native-community/cli": "18.0.0", "@react-native-community/cli-platform-android": "18.0.0", "@react-native-community/cli-platform-ios": "18.0.0", diff --git a/patches/@lodev09+react-native-true-sheet+3.9.4.patch b/patches/@lodev09+react-native-true-sheet+3.7.3.patch similarity index 100% rename from patches/@lodev09+react-native-true-sheet+3.9.4.patch rename to patches/@lodev09+react-native-true-sheet+3.7.3.patch diff --git a/yarn.lock b/yarn.lock index c5fd5e4bb86..c443bf2063c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3369,21 +3369,6 @@ resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.3.tgz#a73bab8eb491d7b8b7be2f0e6c310647835afe83" integrity sha512-2xCRM9q9FlzGZCdgDMJwc0gyUkWFtkosy7Xxr6sFgQwn+wMNIWd7xIvYNauU1r64B5L5rsGKy/n9TKJ0aAFeqQ== -"@gorhom/bottom-sheet@^5.1.6": - version "5.1.6" - resolved "https://registry.yarnpkg.com/@gorhom/bottom-sheet/-/bottom-sheet-5.1.6.tgz#92365894ae4d4eefdbaa577408cfaf62463a9490" - integrity sha512-0b5tQj4fTaZAjST1PnkCp0p7d8iRqMezibTcqc8Kkn3N23Vn6upORNTD1fH0bLfwRt6e0WnZ7DjAmq315lrcKQ== - dependencies: - "@gorhom/portal" "1.0.14" - invariant "^2.2.4" - -"@gorhom/portal@1.0.14": - version "1.0.14" - resolved "https://registry.yarnpkg.com/@gorhom/portal/-/portal-1.0.14.tgz#1953edb76aaba80fb24021dc774550194a18e111" - integrity sha512-MXyL4xvCjmgaORr/rtryDNFy3kU4qUbKlwtQqqsygd0xX3mhKjOLn6mQK8wfu0RkoE0pBE0nAasRoHua+/QZ7A== - dependencies: - nanoid "^3.3.1" - "@grpc/grpc-js@~1.9.0": version "1.9.15" resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.9.15.tgz#433d7ac19b1754af690ea650ab72190bd700739b" @@ -3810,10 +3795,10 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@lodev09/react-native-true-sheet@~3.6.0": - version "3.6.11" - resolved "https://registry.yarnpkg.com/@lodev09/react-native-true-sheet/-/react-native-true-sheet-3.6.11.tgz#12bd378b1ee3d2ba5bc04f5b654916233f356583" - integrity sha512-Je7zXgKrLUUnIjj+fXASiOg4PDXUPeD510awlZU5vkDXDhfLZ4gMqeYE/I93nZPI5AC3qQXFQ4Zek3JnhzwgIw== +"@lodev09/react-native-true-sheet@~3.7.0": + version "3.7.3" + resolved "https://registry.yarnpkg.com/@lodev09/react-native-true-sheet/-/react-native-true-sheet-3.7.3.tgz#eac6dec8665fd6644d9fed8ca1d0993c49356f47" + integrity sha512-vX/3F6lD3qH0GZfSVXL+JD/bjFPZtJa35Vyr9KCv94szOHXsjoEyCyi/52r5jw6jmq/KRALCqwidt9A15qq9gw== "@napi-rs/wasm-runtime@^0.2.11": version "0.2.12" @@ -10902,16 +10887,16 @@ nanoclone@^0.2.1: resolved "https://registry.yarnpkg.com/nanoclone/-/nanoclone-0.2.1.tgz#dd4090f8f1a110d26bb32c49ed2f5b9235209ed4" integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA== -nanoid@^3.3.1, nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== - nanoid@^3.3.11: version "3.3.11" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + napi-build-utils@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" From 3776737958dda6ef8d6a6e5ee9b7b1b70b9fed90 Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Fri, 6 Mar 2026 13:24:56 -0300 Subject: [PATCH 26/98] fix: padding on list and custom actionSheet content --- app/containers/ActionSheet/BottomSheetContent.tsx | 3 ++- app/containers/ActionSheet/styles.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/containers/ActionSheet/BottomSheetContent.tsx b/app/containers/ActionSheet/BottomSheetContent.tsx index a723280596c..79d34e25fff 100644 --- a/app/containers/ActionSheet/BottomSheetContent.tsx +++ b/app/containers/ActionSheet/BottomSheetContent.tsx @@ -26,6 +26,7 @@ const BottomSheetContent = React.memo(({ options, hasCancel, hide, children, onL const { bottom } = useSafeAreaInsets(); const { fontScale } = useWindowDimensions(); const height = 48 * fontScale; + const paddingBottom = bottom + height; const renderFooter = () => hasCancel ? ( @@ -51,7 +52,7 @@ const BottomSheetContent = React.memo(({ options, hasCancel, hide, children, onL style={{ backgroundColor: colors.strokeExtraDark }} keyboardDismissMode='interactive' indicatorStyle='black' - contentContainerStyle={{ paddingBottom: bottom, backgroundColor: colors.surfaceLight }} + contentContainerStyle={{ paddingBottom, backgroundColor: colors.surfaceLight }} ItemSeparatorComponent={List.Separator} ListHeaderComponent={List.Separator} ListFooterComponent={renderFooter} diff --git a/app/containers/ActionSheet/styles.ts b/app/containers/ActionSheet/styles.ts index ad9d40831e3..5ea9d8a63ba 100644 --- a/app/containers/ActionSheet/styles.ts +++ b/app/containers/ActionSheet/styles.ts @@ -70,6 +70,7 @@ export default StyleSheet.create({ marginRight: 8 }, contentContainer: { - flex: 1 + height: '100%', + width: '100%' } }); From 7f041815a3d2a4d8dc69893863cea78a116d275a Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Fri, 6 Mar 2026 13:39:54 -0300 Subject: [PATCH 27/98] fix: actionsheet + gesture handler compatibility --- app/containers/ActionSheet/ActionSheet.tsx | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index 78535e0d9d2..6bc5a6fe38c 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -5,6 +5,7 @@ import { Keyboard, type LayoutChangeEvent, useWindowDimensions } from 'react-nat import { TrueSheet } from '@lodev09/react-native-true-sheet'; import type { SheetDetent } from '@lodev09/react-native-true-sheet'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; +import { GestureHandlerRootView } from 'react-native-gesture-handler'; import { useTheme } from '../../theme'; import { isTablet } from '../../lib/methods/helpers'; @@ -89,10 +90,10 @@ const ActionSheet = React.memo( })); const renderHeader = () => ( - <> + {isValidElement(data?.customHeader) ? data.customHeader : null} - + ); const onDidDismiss = () => { @@ -149,13 +150,15 @@ const ActionSheet = React.memo( scrollable={!!data?.options} style={[styles.container, bottomSheetStyle]} onDidDismiss={onDidDismiss}> - + + + ); From 40d9fb9201e6a6033e64c12df18719e8d17090b0 Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Fri, 6 Mar 2026 14:04:28 -0300 Subject: [PATCH 28/98] rollback Pressable --- app/containers/EmojiPicker/PressableEmoji.tsx | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/app/containers/EmojiPicker/PressableEmoji.tsx b/app/containers/EmojiPicker/PressableEmoji.tsx index e7a104e37a3..047e9c4d386 100644 --- a/app/containers/EmojiPicker/PressableEmoji.tsx +++ b/app/containers/EmojiPicker/PressableEmoji.tsx @@ -1,20 +1,31 @@ import React from 'react'; +import { Pressable } from 'react-native'; +import styles, { EMOJI_BUTTON_SIZE } from './styles'; import { type IEmoji } from '../../definitions/IEmoji'; +import { useTheme } from '../../theme'; +import { isIOS } from '../../lib/methods/helpers'; import { Emoji } from './Emoji'; -import Touch from '../Touch'; export const PressableEmoji = ({ emoji, onPress }: { emoji: IEmoji; onPress: (emoji: IEmoji) => void }): React.ReactElement => { + const { colors } = useTheme(); const accessibilityLabel = typeof emoji === 'string' ? emoji : emoji.name; return ( - onPress(emoji)} - testID={`emoji-${typeof emoji === 'string' ? emoji : emoji.name}`}> + testID={`emoji-${typeof emoji === 'string' ? emoji : emoji.name}`} + android_ripple={{ color: colors.buttonBackgroundSecondaryPress, borderless: true, radius: EMOJI_BUTTON_SIZE / 2 }} + style={({ pressed }: { pressed: boolean }) => [ + styles.emojiButton, + { + backgroundColor: isIOS && pressed ? colors.buttonBackgroundSecondaryPress : 'transparent' + } + ]}> - + ); }; From f868d6d4b1c8dc6b7b5daaf7d443515fd70b7273 Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Fri, 6 Mar 2026 14:09:14 -0300 Subject: [PATCH 29/98] fix: pressable emoji --- app/containers/EmojiPicker/PressableEmoji.tsx | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/app/containers/EmojiPicker/PressableEmoji.tsx b/app/containers/EmojiPicker/PressableEmoji.tsx index 047e9c4d386..b73137688eb 100644 --- a/app/containers/EmojiPicker/PressableEmoji.tsx +++ b/app/containers/EmojiPicker/PressableEmoji.tsx @@ -1,31 +1,22 @@ import React from 'react'; -import { Pressable } from 'react-native'; -import styles, { EMOJI_BUTTON_SIZE } from './styles'; +import styles from './styles'; import { type IEmoji } from '../../definitions/IEmoji'; -import { useTheme } from '../../theme'; -import { isIOS } from '../../lib/methods/helpers'; import { Emoji } from './Emoji'; +import Touch from '../Touch'; export const PressableEmoji = ({ emoji, onPress }: { emoji: IEmoji; onPress: (emoji: IEmoji) => void }): React.ReactElement => { - const { colors } = useTheme(); const accessibilityLabel = typeof emoji === 'string' ? emoji : emoji.name; return ( - onPress(emoji)} - testID={`emoji-${typeof emoji === 'string' ? emoji : emoji.name}`} - android_ripple={{ color: colors.buttonBackgroundSecondaryPress, borderless: true, radius: EMOJI_BUTTON_SIZE / 2 }} - style={({ pressed }: { pressed: boolean }) => [ - styles.emojiButton, - { - backgroundColor: isIOS && pressed ? colors.buttonBackgroundSecondaryPress : 'transparent' - } - ]}> + style={styles.emojiButton} + testID={`emoji-${typeof emoji === 'string' ? emoji : emoji.name}`}> - + ); }; From 504d378c5a6d98ea58826f38e3aca7946844336b Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Fri, 6 Mar 2026 14:09:55 -0300 Subject: [PATCH 30/98] chore: comment --- app/containers/EmojiPicker/PressableEmoji.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/containers/EmojiPicker/PressableEmoji.tsx b/app/containers/EmojiPicker/PressableEmoji.tsx index b73137688eb..9350ab25f7b 100644 --- a/app/containers/EmojiPicker/PressableEmoji.tsx +++ b/app/containers/EmojiPicker/PressableEmoji.tsx @@ -7,7 +7,7 @@ import Touch from '../Touch'; export const PressableEmoji = ({ emoji, onPress }: { emoji: IEmoji; onPress: (emoji: IEmoji) => void }): React.ReactElement => { const accessibilityLabel = typeof emoji === 'string' ? emoji : emoji.name; - + // we should use a Touchable component instead of a Touch component because Gesture handler is compatible with ActionSheet and TextInput typing return ( Date: Fri, 6 Mar 2026 15:01:40 -0300 Subject: [PATCH 31/98] fix: action sheet custom content height --- app/containers/ActionSheet/ActionSheet.tsx | 76 ++++-------------- .../ActionSheet/BottomSheetContent.tsx | 2 +- .../ActionSheet/useActionSheetDetents.ts | 77 +++++++++++++++++++ 3 files changed, 95 insertions(+), 60 deletions(-) create mode 100644 app/containers/ActionSheet/useActionSheetDetents.ts diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index 6bc5a6fe38c..855c4f416d1 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -1,9 +1,8 @@ import { useBackHandler } from '@react-native-community/hooks'; import * as Haptics from 'expo-haptics'; -import React, { forwardRef, isValidElement, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react'; +import React, { forwardRef, isValidElement, useEffect, useImperativeHandle, useRef, useState } from 'react'; import { Keyboard, type LayoutChangeEvent, useWindowDimensions } from 'react-native'; import { TrueSheet } from '@lodev09/react-native-true-sheet'; -import type { SheetDetent } from '@lodev09/react-native-true-sheet'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { GestureHandlerRootView } from 'react-native-gesture-handler'; @@ -12,28 +11,10 @@ import { isTablet } from '../../lib/methods/helpers'; import { Handle } from './Handle'; import { type TActionSheetOptions } from './Provider'; import BottomSheetContent from './BottomSheetContent'; +import { useActionSheetDetents } from './useActionSheetDetents'; import styles from './styles'; export const ACTION_SHEET_ANIMATION_DURATION = 250; -const ACTION_SHEET_MIN_HEIGHT_FRACTION = 0.35; -const ACTION_SHEET_MAX_HEIGHT_FRACTION = 0.75; -const HANDLE_HEIGHT = 28; -const CANCEL_HEIGHT = 64; - -function normalizeSnapsToDetents(snaps: (string | number)[]): number[] { - return snaps - .slice(0, 3) - .map(snap => { - if (typeof snap === 'number') { - if (snap <= 0 || snap > 1) return Math.min(1, Math.max(0.1, snap)); - return snap; - } - const match = String(snap).match(/^(\d+(?:\.\d+)?)\s*%$/); - if (match) return Math.min(1, Math.max(0.1, Number(match[1]) / 100)); - return 0.5; - }) - .sort((a, b) => a - b); -} const ActionSheet = React.memo( forwardRef(({ children }: { children: React.ReactElement }, ref) => { @@ -47,13 +28,10 @@ const ActionSheet = React.memo( const itemHeight = 48 * fontScale; - const handleContentLayout = useCallback( - ({ nativeEvent: { layout } }: LayoutChangeEvent) => { - const height = Math.min(layout.height, windowHeight * ACTION_SHEET_MAX_HEIGHT_FRACTION); - setContentHeight(height); - }, - [windowHeight] - ); + const handleContentLayout = ({ nativeEvent: { layout } }: LayoutChangeEvent) => { + console.log('layout', layout.height); + setContentHeight(layout.height); + }; const hide = () => { sheetRef.current?.dismiss(); @@ -104,36 +82,16 @@ const ActionSheet = React.memo( const bottomSheetStyle = isTablet ? styles.bottomSheet : { marginRight: right, marginLeft: left }; - const hasOptions = (data?.options?.length || 0) > 0; - const maxSnap = hasOptions - ? Math.min( - (itemHeight + 0.5) * (data?.options?.length || 0) + - HANDLE_HEIGHT + - (data?.headerHeight || 0) + - bottom + - (data?.hasCancel ? CANCEL_HEIGHT : 0), - windowHeight * ACTION_SHEET_MAX_HEIGHT_FRACTION - ) - : 0; - - let detents: SheetDetent[]; - if (data?.snaps?.length) { - detents = normalizeSnapsToDetents(data.snaps); - } else if (hasOptions) { - if (maxSnap > windowHeight * 0.6) { - detents = [0.5, ACTION_SHEET_MAX_HEIGHT_FRACTION]; - } else { - const fraction = Math.max(0.25, Math.min(maxSnap / windowHeight, ACTION_SHEET_MAX_HEIGHT_FRACTION)); - detents = [fraction]; - } - } else if (contentHeight > 0) { - const fraction = Math.min(contentHeight / windowHeight, ACTION_SHEET_MAX_HEIGHT_FRACTION); - const contentDetent = Math.max(0.25, fraction); - detents = - contentDetent > ACTION_SHEET_MIN_HEIGHT_FRACTION ? [ACTION_SHEET_MIN_HEIGHT_FRACTION, contentDetent] : [contentDetent]; - } else { - detents = [ACTION_SHEET_MIN_HEIGHT_FRACTION, 'auto']; - } + const { detents, maxHeight } = useActionSheetDetents({ + windowHeight, + bottomInset: bottom, + itemHeight, + optionsLength: data?.options?.length || 0, + snaps: data?.snaps, + headerHeight: data?.headerHeight, + hasCancel: data?.hasCancel, + contentHeight + }); return ( <> @@ -141,7 +99,7 @@ const ActionSheet = React.memo( + {children} ); diff --git a/app/containers/ActionSheet/useActionSheetDetents.ts b/app/containers/ActionSheet/useActionSheetDetents.ts new file mode 100644 index 00000000000..1b34e2d0de3 --- /dev/null +++ b/app/containers/ActionSheet/useActionSheetDetents.ts @@ -0,0 +1,77 @@ +import type { SheetDetent } from '@lodev09/react-native-true-sheet'; +import { useMemo } from 'react'; + +const ACTION_SHEET_MIN_HEIGHT_FRACTION = 0.35; +const ACTION_SHEET_MAX_HEIGHT_FRACTION = 0.75; +const HANDLE_HEIGHT = 28; +const CANCEL_HEIGHT = 64; +const PADDING_BOTTOM = 22; + +function normalizeSnapsToDetents(snaps: (string | number)[]): number[] { + return snaps + .slice(0, 3) + .map(snap => { + if (typeof snap === 'number') { + if (snap <= 0 || snap > 1) return Math.min(1, Math.max(0.1, snap)); + return snap; + } + const match = String(snap).match(/^(\d+(?:\.\d+)?)\s*%$/); + if (match) return Math.min(1, Math.max(0.1, Number(match[1]) / 100)); + return 0.5; + }) + .sort((a, b) => a - b); +} + +type UseActionSheetDetentsParams = { + windowHeight: number; + bottomInset: number; + itemHeight: number; + optionsLength?: number; + snaps?: (string | number)[]; + headerHeight?: number; + hasCancel?: boolean; + contentHeight: number; +}; + +export function useActionSheetDetents({ + windowHeight, + bottomInset, + itemHeight, + optionsLength = 0, + snaps, + headerHeight = 0, + hasCancel = false, + contentHeight +}: UseActionSheetDetentsParams): { detents: SheetDetent[]; maxHeight: number } { + return useMemo(() => { + const maxHeight = windowHeight * ACTION_SHEET_MAX_HEIGHT_FRACTION; + const hasOptions = optionsLength > 0; + + const maxSnap = hasOptions + ? Math.min( + (itemHeight + 0.5) * optionsLength + HANDLE_HEIGHT + headerHeight + bottomInset + (hasCancel ? CANCEL_HEIGHT : 0), + maxHeight + ) + : 0; + + let detents: SheetDetent[]; + if (snaps?.length) { + detents = normalizeSnapsToDetents(snaps); + } else if (hasOptions) { + if (maxSnap > windowHeight * 0.6) { + detents = [0.5, ACTION_SHEET_MAX_HEIGHT_FRACTION]; + } else { + const fraction = Math.max(0.25, Math.min(maxSnap / windowHeight, ACTION_SHEET_MAX_HEIGHT_FRACTION)); + detents = [fraction]; + } + } else if (contentHeight > 0) { + const contentDetent = (contentHeight + bottomInset + PADDING_BOTTOM) / windowHeight; + + detents = [contentDetent]; + } else { + detents = [ACTION_SHEET_MIN_HEIGHT_FRACTION]; + } + + return { detents, maxHeight }; + }, [bottomInset, contentHeight, hasCancel, headerHeight, itemHeight, optionsLength, snaps, windowHeight]); +} From 9ed2a8240cceffed5f2e78979ee606d938ed9205 Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Fri, 6 Mar 2026 17:12:00 -0300 Subject: [PATCH 32/98] fix: directory test --- app/containers/List/ListContainer.tsx | 4 ++-- app/views/DirectoryView/Options.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/containers/List/ListContainer.tsx b/app/containers/List/ListContainer.tsx index f882b54f67e..798ae5f50cc 100644 --- a/app/containers/List/ListContainer.tsx +++ b/app/containers/List/ListContainer.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { ScrollView, StyleSheet } from 'react-native'; +import { ScrollView, type ScrollViewProps, StyleSheet } from 'react-native'; import scrollPersistTaps from '../../lib/methods/helpers/scrollPersistTaps'; @@ -9,7 +9,7 @@ const styles = StyleSheet.create({ } }); -interface IListContainer { +interface IListContainer extends ScrollViewProps { children: (React.ReactElement | null)[] | React.ReactElement | null; testID?: string; } diff --git a/app/views/DirectoryView/Options.tsx b/app/views/DirectoryView/Options.tsx index 3171154d7b1..0cf6de5a205 100644 --- a/app/views/DirectoryView/Options.tsx +++ b/app/views/DirectoryView/Options.tsx @@ -52,7 +52,7 @@ const DirectoryOptions = ({ }; return ( - + {renderItem('channels')} @@ -74,7 +74,7 @@ const DirectoryOptions = ({ ) : null} - + ); }; From baca61162c3b6af18e37ac58aa35edff46002438 Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Fri, 6 Mar 2026 18:50:18 -0300 Subject: [PATCH 33/98] fix: emoji picker --- app/containers/ActionSheet/ActionSheet.tsx | 1 + .../ActionSheet/BottomSheetContent.tsx | 85 ++++++++++--------- app/containers/ActionSheet/Provider.tsx | 1 + app/containers/ActionSheet/styles.ts | 3 +- app/containers/UIKit/MultiSelect/styles.ts | 2 +- app/views/RoomView/index.tsx | 3 +- 6 files changed, 50 insertions(+), 45 deletions(-) diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index 855c4f416d1..1221f882d4c 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -115,6 +115,7 @@ const ActionSheet = React.memo( children={data?.children} hasCancel={data?.hasCancel} onLayout={handleContentLayout} + fullContainer={data.fullContainer} /> diff --git a/app/containers/ActionSheet/BottomSheetContent.tsx b/app/containers/ActionSheet/BottomSheetContent.tsx index 62b14e63b3a..c0632875e70 100644 --- a/app/containers/ActionSheet/BottomSheetContent.tsx +++ b/app/containers/ActionSheet/BottomSheetContent.tsx @@ -17,55 +17,58 @@ interface IBottomSheetContentProps { hide: () => void; children?: React.ReactElement | null; onLayout: ViewProps['onLayout']; + fullContainer?: boolean; } -const BottomSheetContent = React.memo(({ options, hasCancel, hide, children, onLayout }: IBottomSheetContentProps) => { - 'use memo'; +const BottomSheetContent = React.memo( + ({ options, hasCancel, hide, children, onLayout, fullContainer }: IBottomSheetContentProps) => { + 'use memo'; - const { colors } = useTheme(); - const { bottom } = useSafeAreaInsets(); - const { fontScale } = useWindowDimensions(); - const height = 48 * fontScale; - const paddingBottom = bottom + height; + const { colors } = useTheme(); + const { bottom } = useSafeAreaInsets(); + const { fontScale } = useWindowDimensions(); + const height = 48 * fontScale; + const paddingBottom = bottom + height; - const renderFooter = () => - hasCancel ? ( - - {I18n.t('Cancel')} - - ) : null; + const renderFooter = () => + hasCancel ? ( + + {I18n.t('Cancel')} + + ) : null; - const renderItem = ({ item }: { item: IActionSheetItem['item'] }) => ; + const renderItem = ({ item }: { item: IActionSheetItem['item'] }) => ; - if (options) { + if (options) { + return ( + item.title} + bounces={false} + renderItem={renderItem} + style={{ backgroundColor: colors.strokeExtraDark }} + keyboardDismissMode='interactive' + indicatorStyle='black' + contentContainerStyle={{ paddingBottom, backgroundColor: colors.surfaceLight }} + ItemSeparatorComponent={List.Separator} + ListHeaderComponent={List.Separator} + ListFooterComponent={renderFooter} + onLayout={onLayout} + nestedScrollEnabled={isAndroid} + /> + ); + } return ( - item.title} - bounces={false} - renderItem={renderItem} - style={{ backgroundColor: colors.strokeExtraDark }} - keyboardDismissMode='interactive' - indicatorStyle='black' - contentContainerStyle={{ paddingBottom, backgroundColor: colors.surfaceLight }} - ItemSeparatorComponent={List.Separator} - ListHeaderComponent={List.Separator} - ListFooterComponent={renderFooter} - onLayout={onLayout} - nestedScrollEnabled={isAndroid} - /> + + {children} + ); } - return ( - - {children} - - ); -}); +); export default BottomSheetContent; diff --git a/app/containers/ActionSheet/Provider.tsx b/app/containers/ActionSheet/Provider.tsx index d74043234e3..a85d03b3aaf 100644 --- a/app/containers/ActionSheet/Provider.tsx +++ b/app/containers/ActionSheet/Provider.tsx @@ -30,6 +30,7 @@ export type TActionSheetOptions = { snaps?: (string | number)[]; onClose?: () => void; enableContentPanningGesture?: boolean; + fullContainer?: boolean; }; export interface IActionSheetProvider { showActionSheet: (item: TActionSheetOptions) => void; diff --git a/app/containers/ActionSheet/styles.ts b/app/containers/ActionSheet/styles.ts index 5ea9d8a63ba..10d77caabad 100644 --- a/app/containers/ActionSheet/styles.ts +++ b/app/containers/ActionSheet/styles.ts @@ -70,7 +70,6 @@ export default StyleSheet.create({ marginRight: 8 }, contentContainer: { - height: '100%', - width: '100%' + flex: 0 } }); diff --git a/app/containers/UIKit/MultiSelect/styles.ts b/app/containers/UIKit/MultiSelect/styles.ts index 62e6a126720..5933c65c475 100644 --- a/app/containers/UIKit/MultiSelect/styles.ts +++ b/app/containers/UIKit/MultiSelect/styles.ts @@ -9,7 +9,7 @@ export default StyleSheet.create({ justifyContent: 'flex-end' }, actionSheetContainer: { - flex: 1 + flex: 0 }, content: { padding: 16 diff --git a/app/views/RoomView/index.tsx b/app/views/RoomView/index.tsx index 89c851ab168..d0a2f17258e 100644 --- a/app/views/RoomView/index.tsx +++ b/app/views/RoomView/index.tsx @@ -855,7 +855,8 @@ class RoomView extends React.Component { ), snaps: ['50%'], enableContentPanningGesture: false, - onClose: this.resetAction + onClose: this.resetAction, + fullContainer: true }); }, 100); }; From fd975187e3fa85a042924187c1ace1f71e756b5b Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Mon, 9 Mar 2026 13:13:08 -0300 Subject: [PATCH 34/98] fix: close action sheet --- .../ToastsAndDialogs.yml | 3 ++- app/containers/ActionSheet/ActionSheet.tsx | 19 ++++++++----------- app/containers/ActionSheet/Handle.tsx | 11 +++++------ 3 files changed, 15 insertions(+), 18 deletions(-) diff --git a/.maestro/tests/accessibilityAndAppearance/ToastsAndDialogs.yml b/.maestro/tests/accessibilityAndAppearance/ToastsAndDialogs.yml index 63ff917ab40..60bcdfa6fcd 100644 --- a/.maestro/tests/accessibilityAndAppearance/ToastsAndDialogs.yml +++ b/.maestro/tests/accessibilityAndAppearance/ToastsAndDialogs.yml @@ -21,7 +21,8 @@ tags: - tapOn: 'Show alerts as. Toasts' - assertVisible: 'Toasts. Dismissed automatically. Checked' - assertVisible: 'Dialogs. Require manual dismissal. Unchecked' -- tapOn: 'Bottom Sheet backdrop' +- tapOn: + id: 'action-sheet-handle' - tapOn: 'Menu' - tapOn: 'Edit status' - tapOn: diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index 1221f882d4c..d2a4d496425 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -23,13 +23,12 @@ const ActionSheet = React.memo( const { bottom, right, left } = useSafeAreaInsets(); const sheetRef = useRef(null); const [data, setData] = useState({} as TActionSheetOptions); - const [isVisible, setVisible] = useState(false); + const [isVisible, setIsVisible] = useState(false); const [contentHeight, setContentHeight] = useState(0); const itemHeight = 48 * fontScale; const handleContentLayout = ({ nativeEvent: { layout } }: LayoutChangeEvent) => { - console.log('layout', layout.height); setContentHeight(layout.height); }; @@ -39,7 +38,11 @@ const ActionSheet = React.memo( const show = (options: TActionSheetOptions) => { setData(options); - setVisible(true); + setIsVisible(true); + // timeout to open after the old one close; + setTimeout(() => { + sheetRef.current?.present(); + }, 200); }; useBackHandler(() => { @@ -49,12 +52,6 @@ const ActionSheet = React.memo( return isVisible; }); - useEffect(() => { - if (isVisible) { - sheetRef.current?.present(0); - } - }, [isVisible]); - useEffect(() => { if (isVisible) { Keyboard.dismiss(); @@ -69,13 +66,13 @@ const ActionSheet = React.memo( const renderHeader = () => ( - + {isValidElement(data?.customHeader) ? data.customHeader : null} ); const onDidDismiss = () => { - setVisible(false); + setIsVisible(false); setContentHeight(0); data?.onClose?.(); }; diff --git a/app/containers/ActionSheet/Handle.tsx b/app/containers/ActionSheet/Handle.tsx index f155de2fafa..85d1df73a35 100644 --- a/app/containers/ActionSheet/Handle.tsx +++ b/app/containers/ActionSheet/Handle.tsx @@ -4,14 +4,13 @@ import { View } from 'react-native'; import styles from './styles'; import { themes } from '../../lib/constants/colors'; import { useTheme } from '../../theme'; +import Touch from '../Touch'; -export const Handle = React.memo(() => { - 'use memo'; - +export const Handle = ({ onPress }: { onPress: () => void }) => { const { theme } = useTheme(); return ( - + - + ); -}); +}; From deb038d3130102f1f2113041132d4df60e30dbd9 Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Mon, 9 Mar 2026 17:16:00 -0300 Subject: [PATCH 35/98] fix: bottom sheet emoji picker scroll and padding --- app/containers/ActionSheet/ActionSheet.tsx | 8 +++++++- app/containers/EmojiPicker/EmojiCategory.tsx | 21 +++++++++++++++++--- app/containers/EmojiPicker/index.tsx | 6 ++++-- app/containers/EmojiPicker/interfaces.ts | 2 ++ app/views/RoomView/ReactionPicker.tsx | 2 +- 5 files changed, 32 insertions(+), 7 deletions(-) diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index d2a4d496425..6ccbee31b67 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -90,6 +90,11 @@ const ActionSheet = React.memo( contentHeight }); + const hasOptions = !!data?.options?.length; + const hasSnaps = !!data?.snaps?.length; + const disableContentPanning = data?.enableContentPanningGesture === false; + const isScrollable = hasOptions || (hasSnaps && !disableContentPanning); + return ( <> {children} @@ -101,8 +106,9 @@ const ActionSheet = React.memo( cornerRadius={16} dimmed grabber={false} + draggable={!disableContentPanning} header={renderHeader()} - scrollable={!!data?.options} + scrollable={isScrollable} style={[styles.container, bottomSheetStyle]} onDidDismiss={onDidDismiss}> diff --git a/app/containers/EmojiPicker/EmojiCategory.tsx b/app/containers/EmojiPicker/EmojiCategory.tsx index 0773caa6172..acb518d0ba5 100644 --- a/app/containers/EmojiPicker/EmojiCategory.tsx +++ b/app/containers/EmojiPicker/EmojiCategory.tsx @@ -1,5 +1,6 @@ import React, { memo } from 'react'; import { FlatList } from 'react-native'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { type ICustomEmojis, type IEmoji } from '../../definitions/IEmoji'; import scrollPersistTaps from '../../lib/methods/helpers/scrollPersistTaps'; @@ -10,6 +11,8 @@ import { useAppSelector } from '../../lib/hooks/useAppSelector'; import { useFrequentlyUsedEmoji } from '../../lib/hooks/useFrequentlyUsedEmoji'; import { type IEmojiCategoryProps, type TEmojiCategory } from './interfaces'; +const EMOJI_CATEGORY_BOTTOM_SHEET_PADDING = EMOJI_BUTTON_SIZE + 22; + const useEmojis = (category?: TEmojiCategory) => { const { frequentlyUsed, loaded } = useFrequentlyUsedEmoji(); const allCustomEmojis: ICustomEmojis = useAppSelector( @@ -38,8 +41,15 @@ const useEmojis = (category?: TEmojiCategory) => { return emojisByCategory[category]; }; -const EmojiCategory = ({ parentWidth, category, emojis, onEmojiSelected }: IEmojiCategoryProps): React.ReactElement | null => { +const EmojiCategory = ({ + parentWidth, + category, + emojis, + onEmojiSelected, + bottomSheet = false +}: IEmojiCategoryProps): React.ReactElement | null => { const items = useEmojis(category); + const { bottom } = useSafeAreaInsets(); if (!parentWidth) { return null; @@ -47,6 +57,7 @@ const EmojiCategory = ({ parentWidth, category, emojis, onEmojiSelected }: IEmoj const numColumns = Math.trunc(parentWidth / EMOJI_BUTTON_SIZE); const marginHorizontal = (parentWidth % EMOJI_BUTTON_SIZE) / 2; + const contentPaddingBottom = bottomSheet ? bottom + EMOJI_CATEGORY_BOTTOM_SHEET_PADDING : undefined; const renderItem = ({ item }: { item: IEmoji }) => ; @@ -57,9 +68,13 @@ const EmojiCategory = ({ parentWidth, category, emojis, onEmojiSelected }: IEmoj data={emojis || items} renderItem={renderItem} numColumns={numColumns} - contentContainerStyle={{ marginHorizontal }} + contentContainerStyle={{ + marginHorizontal, + ...(contentPaddingBottom != null && { paddingBottom: contentPaddingBottom }) + }} {...scrollPersistTaps} - keyboardDismissMode={'none'} + keyboardDismissMode='none' + nestedScrollEnabled /> ); }; diff --git a/app/containers/EmojiPicker/index.tsx b/app/containers/EmojiPicker/index.tsx index 411ceb16558..36ca3283389 100644 --- a/app/containers/EmojiPicker/index.tsx +++ b/app/containers/EmojiPicker/index.tsx @@ -24,7 +24,8 @@ const EmojiPicker = ({ onItemClicked, isEmojiKeyboard = false, searching = false, - searchedEmojis = [] + searchedEmojis = [], + bottomSheet = false }: IEmojiPickerProps): React.ReactElement | null => { const [parentWidth, setParentWidth] = useState(0); const { bottom } = useSafeAreaInsets(); @@ -39,7 +40,7 @@ const EmojiPicker = ({ ); const renderScene = ({ route }: { route: Route }) => ( - + ); const renderTabItem = (tab: Route, color: string) => ( @@ -63,6 +64,7 @@ const EmojiPicker = ({ emojis={searchedEmojis} onEmojiSelected={(emoji: IEmoji) => handleEmojiSelect(emoji)} parentWidth={parentWidth} + bottomSheet={bottomSheet} /> ) : ( diff --git a/app/containers/EmojiPicker/interfaces.ts b/app/containers/EmojiPicker/interfaces.ts index 7692b51ba68..1bc5ccf594e 100644 --- a/app/containers/EmojiPicker/interfaces.ts +++ b/app/containers/EmojiPicker/interfaces.ts @@ -14,6 +14,7 @@ export interface IEmojiPickerProps { isEmojiKeyboard?: boolean; searching?: boolean; searchedEmojis?: IEmoji[]; + bottomSheet?: boolean; } export interface IFooterProps { @@ -28,6 +29,7 @@ export interface IEmojiCategoryProps { parentWidth: number; category?: TEmojiCategory; emojis?: IEmoji[]; + bottomSheet?: boolean; } export interface IEmojiSearchBarProps { diff --git a/app/views/RoomView/ReactionPicker.tsx b/app/views/RoomView/ReactionPicker.tsx index 60f38c7fbe5..6d2ce348b3b 100644 --- a/app/views/RoomView/ReactionPicker.tsx +++ b/app/views/RoomView/ReactionPicker.tsx @@ -45,7 +45,7 @@ const ReactionPicker = ({ onEmojiSelected, messageId, reactionClose }: IReaction - + ); }; From 6afa789b6752b79bc40b0aba70d9200b3996b417 Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Mon, 9 Mar 2026 20:17:35 +0000 Subject: [PATCH 36/98] chore: format code and fix lint issues --- app/containers/EmojiPicker/index.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/containers/EmojiPicker/index.tsx b/app/containers/EmojiPicker/index.tsx index 36ca3283389..75b14aead11 100644 --- a/app/containers/EmojiPicker/index.tsx +++ b/app/containers/EmojiPicker/index.tsx @@ -40,7 +40,12 @@ const EmojiPicker = ({ ); const renderScene = ({ route }: { route: Route }) => ( - + ); const renderTabItem = (tab: Route, color: string) => ( From 3937eecaa8c475c116d60630e506845b4dbbecbd Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Mon, 9 Mar 2026 18:14:36 -0300 Subject: [PATCH 37/98] fix: bottomSheet iOS weird padding --- app/containers/ActionSheet/ActionSheet.tsx | 14 ++++++++++++-- .../ActionSheet/BottomSheetContent.tsx | 19 ++++++++++++++++--- .../ActionSheet/useActionSheetDetents.ts | 2 +- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index 6ccbee31b67..766a7d1e06f 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -7,11 +7,11 @@ import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { GestureHandlerRootView } from 'react-native-gesture-handler'; import { useTheme } from '../../theme'; -import { isTablet } from '../../lib/methods/helpers'; +import { isIOS, isTablet } from '../../lib/methods/helpers'; import { Handle } from './Handle'; import { type TActionSheetOptions } from './Provider'; import BottomSheetContent from './BottomSheetContent'; -import { useActionSheetDetents } from './useActionSheetDetents'; +import { HANDLE_HEIGHT, useActionSheetDetents } from './useActionSheetDetents'; import styles from './styles'; export const ACTION_SHEET_ANIMATION_DURATION = 250; @@ -95,6 +95,15 @@ const ActionSheet = React.memo( const disableContentPanning = data?.enableContentPanningGesture === false; const isScrollable = hasOptions || (hasSnaps && !disableContentPanning); + const contentMinHeight = + data.fullContainer && data.snaps?.length + ? (() => { + const snap = data.snaps[0]; + const fraction = typeof snap === 'number' ? Math.min(1, Math.max(0.1, snap)) : (parseFloat(String(snap)) || 50) / 100; + return Math.max(0, windowHeight * fraction - HANDLE_HEIGHT - bottom); + })() + : undefined; + return ( <> {children} @@ -119,6 +128,7 @@ const ActionSheet = React.memo( hasCancel={data?.hasCancel} onLayout={handleContentLayout} fullContainer={data.fullContainer} + contentMinHeight={isIOS ? contentMinHeight : undefined} /> diff --git a/app/containers/ActionSheet/BottomSheetContent.tsx b/app/containers/ActionSheet/BottomSheetContent.tsx index c0632875e70..19f0058d58b 100644 --- a/app/containers/ActionSheet/BottomSheetContent.tsx +++ b/app/containers/ActionSheet/BottomSheetContent.tsx @@ -1,4 +1,4 @@ -import { FlatList, Text, useWindowDimensions, View, type ViewProps } from 'react-native'; +import { FlatList, Platform, Text, useWindowDimensions, View, type ViewProps } from 'react-native'; import React from 'react'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; @@ -18,10 +18,11 @@ interface IBottomSheetContentProps { children?: React.ReactElement | null; onLayout: ViewProps['onLayout']; fullContainer?: boolean; + contentMinHeight?: number; } const BottomSheetContent = React.memo( - ({ options, hasCancel, hide, children, onLayout, fullContainer }: IBottomSheetContentProps) => { + ({ options, hasCancel, hide, children, onLayout, fullContainer, contentMinHeight }: IBottomSheetContentProps) => { 'use memo'; const { colors } = useTheme(); @@ -64,7 +65,19 @@ const BottomSheetContent = React.memo( ); } return ( - + {children} ); diff --git a/app/containers/ActionSheet/useActionSheetDetents.ts b/app/containers/ActionSheet/useActionSheetDetents.ts index 1b34e2d0de3..42b930d7e9b 100644 --- a/app/containers/ActionSheet/useActionSheetDetents.ts +++ b/app/containers/ActionSheet/useActionSheetDetents.ts @@ -3,7 +3,7 @@ import { useMemo } from 'react'; const ACTION_SHEET_MIN_HEIGHT_FRACTION = 0.35; const ACTION_SHEET_MAX_HEIGHT_FRACTION = 0.75; -const HANDLE_HEIGHT = 28; +export const HANDLE_HEIGHT = 28; const CANCEL_HEIGHT = 64; const PADDING_BOTTOM = 22; From 854b50891dcc52563decdfa9149ee4ca25f29d1a Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Mon, 9 Mar 2026 22:40:45 -0300 Subject: [PATCH 38/98] fix: add sleep to pass tests --- .maestro/tests/teams/utils/open-action-sheet.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.maestro/tests/teams/utils/open-action-sheet.yaml b/.maestro/tests/teams/utils/open-action-sheet.yaml index 5b6083c0515..b3bbd9808aa 100644 --- a/.maestro/tests/teams/utils/open-action-sheet.yaml +++ b/.maestro/tests/teams/utils/open-action-sheet.yaml @@ -7,16 +7,16 @@ tags: visible: id: room-members-view-item-${username} timeout: 60000 +- waitForAnimationToEnd: + timeout: 2000 - tapOn: id: room-members-view-item-${username} +- waitForAnimationToEnd: + timeout: 2000 - extendedWaitUntil: visible: id: action-sheet timeout: 60000 -- assertVisible: - id: action-sheet-handle -- tapOn: - id: action-sheet-handle - extendedWaitUntil: visible: id: action-sheet From 9feee82b0f83f6ee8e479c591d691a1e0570a100 Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Mon, 9 Mar 2026 23:20:52 -0300 Subject: [PATCH 39/98] fix: e2e tests --- .maestro/tests/room/room.yaml | 6 ++---- app/views/RoomView/index.tsx | 3 ++- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.maestro/tests/room/room.yaml b/.maestro/tests/room/room.yaml index 75ec706176f..c4410750921 100644 --- a/.maestro/tests/room/room.yaml +++ b/.maestro/tests/room/room.yaml @@ -252,10 +252,8 @@ tags: visible: id: 'action-sheet-handle' timeout: 60000 -- swipe: - from: - id: action-sheet-handle - direction: DOWN +- tapOn: + id: 'action-sheet-handle' - extendedWaitUntil: notVisible: id: 'reactionsList' diff --git a/app/views/RoomView/index.tsx b/app/views/RoomView/index.tsx index d0a2f17258e..7e237aa30ba 100644 --- a/app/views/RoomView/index.tsx +++ b/app/views/RoomView/index.tsx @@ -915,7 +915,8 @@ class RoomView extends React.Component { this.handleCloseEmoji(showActionSheet, { children: , snaps: ['50%'], - enableContentPanningGesture: false + enableContentPanningGesture: false, + fullContainer: true }); }; From 6413650fd6735185b0189aa43475cb66e000d590 Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Tue, 10 Mar 2026 15:41:37 +0530 Subject: [PATCH 40/98] conflict fix --- .../__snapshots__/Message.test.tsx.snap | 1154 +---------------- yarn.lock | 44 - 2 files changed, 72 insertions(+), 1126 deletions(-) diff --git a/app/containers/message/__snapshots__/Message.test.tsx.snap b/app/containers/message/__snapshots__/Message.test.tsx.snap index d16e3c56291..606a52224a2 100644 --- a/app/containers/message/__snapshots__/Message.test.tsx.snap +++ b/app/containers/message/__snapshots__/Message.test.tsx.snap @@ -136889,9 +136889,6 @@ exports[`Story Snapshots: WithAudio should match snapshot 1`] = ` -<<<<<<< HEAD - -======= ->>>>>>> develop @@ -137367,9 +137325,6 @@ exports[`Story Snapshots: WithAudio should match snapshot 1`] = ` -<<<<<<< HEAD - -======= ->>>>>>> develop @@ -137633,67 +137549,10 @@ exports[`Story Snapshots: WithAudio should match snapshot 1`] = ` ] } > -<<<<<<< HEAD - - - - - -======= multi file ->>>>>>> develop - -  - - - - - - - - - >>>>>> develop - hitSlop={ - { - "bottom": 12, - "left": 8, - "right": 8, - "top": 12, - } - } - style={ - [ - { - "borderRadius": 6, - "height": 12, - "position": "absolute", - "width": 12, - }, - { - "backgroundColor": "#D1EBFE", - }, - { - "transform": [ - { - "translateX": -6, - }, - { - "scale": 1, - }, - ], - }, - ] - } - /> - - - - - - >>>>>> develop - { - "gap": 4, - } - } - > - - -<<<<<<< HEAD - >>>>>> develop - hitSlop={ - { - "bottom": 12, - "left": 8, - "right": 8, - "top": 12, - } - } - style={ - [ - { - "borderRadius": 6, - "height": 12, - "position": "absolute", - "width": 12, - }, - { - "backgroundColor": "#D1EBFE", - }, - { - "transform": [ - { - "translateX": -6, - }, - { - "scale": 1, - }, - ], - }, - ] - } - /> -======= ->>>>>>> develop @@ -139207,9 +138753,6 @@ exports[`Story Snapshots: WithAudio should match snapshot 1`] = ` -<<<<<<< HEAD - >>>>>> develop - hitSlop={ - { - "bottom": 12, - "left": 8, - "right": 8, - "top": 12, - } - } -======= @@ -139344,7 +138867,6 @@ exports[`Story Snapshots: WithAudio should match snapshot 1`] = ` >>>>>> develop style={ [ { @@ -139477,9 +138999,6 @@ exports[`Story Snapshots: WithAudio should match snapshot 1`] = ` -<<<<<<< HEAD - >>>>>> develop - hitSlop={ - { - "bottom": 12, - "left": 8, - "right": 8, - "top": 12, - } - } - style={ - [ - { - "borderRadius": 6, - "height": 12, - "position": "absolute", - "width": 12, - }, - { - "backgroundColor": "#D1EBFE", - }, - { - "transform": [ - { - "translateX": -6, - }, - { - "scale": 1, - }, - ], - }, - ] - } - /> -======= ->>>>>>> develop @@ -140903,9 +140372,6 @@ exports[`Story Snapshots: WithAudioLargeFont should match snapshot 1`] = ` -<<<<<<< HEAD - @@ -140984,28 +140412,28 @@ exports[`Story Snapshots: WithAudioLargeFont should match snapshot 1`] = ` - - - - + /> + + + - - - - - - - - - - - -  - - - - - - - - - >>>>>> develop - hitSlop={ - { - "bottom": 12, - "left": 8, - "right": 8, - "top": 12, - } - } - style={ - [ - { - "borderRadius": 6, - "height": 12, - "position": "absolute", - "width": 12, - }, - { - "backgroundColor": "#D1EBFE", - }, - { - "transform": [ - { - "translateX": -6, - }, - { - "scale": 1, - }, - ], - }, - ] - } - /> -======= ->>>>>>> develop - - - - - - - - - - - - - - - - - - - - -<<<<<<< HEAD - -======= ->>>>>>> develop @@ -142202,9 +141207,6 @@ exports[`Story Snapshots: WithAudioLargeFont should match snapshot 1`] = ` Date: Tue, 10 Mar 2026 15:43:30 +0530 Subject: [PATCH 41/98] Move worklet plugin to last --- babel.config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/babel.config.js b/babel.config.js index dfcbe6d3afc..b00c79cb300 100644 --- a/babel.config.js +++ b/babel.config.js @@ -8,9 +8,9 @@ module.exports = { } ], ['@babel/plugin-proposal-decorators', { legacy: true }], - 'react-native-worklets/plugin', '@babel/plugin-transform-named-capturing-groups-regex', - ['module:react-native-dotenv'] + ['module:react-native-dotenv'], + 'react-native-worklets/plugin' ], env: { production: { From b054ed44307e19fcd76b4a1e76ff520c54cff068 Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Tue, 10 Mar 2026 13:08:51 -0300 Subject: [PATCH 42/98] fix: roomView test --- .maestro/tests/room/room.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.maestro/tests/room/room.yaml b/.maestro/tests/room/room.yaml index c4410750921..1809afe167a 100644 --- a/.maestro/tests/room/room.yaml +++ b/.maestro/tests/room/room.yaml @@ -161,6 +161,7 @@ tags: - tapOn: id: emoji-searchbar-input - inputText: 'laughing' +- hideKeyboard - extendedWaitUntil: visible: id: emoji-laughing From bcbc7fe3a4cd29992746e2f90d5ae651d28dbc12 Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Tue, 10 Mar 2026 20:47:28 -0300 Subject: [PATCH 43/98] fix: e2e tests --- .maestro/tests/room/room.yaml | 27 ++++++------- app/containers/MessageActions/index.tsx | 51 ++++++++++++++++--------- 2 files changed, 48 insertions(+), 30 deletions(-) diff --git a/.maestro/tests/room/room.yaml b/.maestro/tests/room/room.yaml index 1809afe167a..b29ad58be49 100644 --- a/.maestro/tests/room/room.yaml +++ b/.maestro/tests/room/room.yaml @@ -316,22 +316,23 @@ tags: visible: text: '.*edit.*' timeout: 60000 +- hideKeyboard - longPressOn: id: 'message-content-edit' +- waitForAnimationToEnd: + timeout: 1000 - extendedWaitUntil: visible: id: action-sheet timeout: 60000 - extendedWaitUntil: visible: - id: action-sheet-handle - timeout: 60000 -- extendedWaitUntil: - visible: - text: 'Edit' + id: message-actions-edit timeout: 60000 +- waitForAnimationToEnd: + timeout: 1000 - tapOn: - text: 'Edit' + id: message-actions-edit - extendedWaitUntil: visible: id: message-composer-input @@ -362,10 +363,10 @@ tags: timeout: 60000 - extendedWaitUntil: visible: - text: 'Quote' + id: message-actions-quote timeout: 60000 - tapOn: - text: 'Quote' + id: message-actions-quote - extendedWaitUntil: visible: id: message-composer-input @@ -418,9 +419,9 @@ tags: direction: UP - scrollUntilVisible: element: - text: 'Delete' + id: message-actions-delete - tapOn: - text: 'Delete' + id: message-actions-delete - extendedWaitUntil: visible: text: '.*You will not be able to recover this message.*' @@ -470,10 +471,10 @@ tags: timeout: 60000 - extendedWaitUntil: visible: - text: 'Reply in direct message' + id: message-actions-reply-in-dm timeout: 60000 - tapOn: - text: 'Reply in direct message' + id: message-actions-reply-in-dm - extendedWaitUntil: visible: id: room-view-title-${output.replyUser.username} @@ -584,7 +585,7 @@ tags: id: action-sheet timeout: 60000 - tapOn: - text: 'Quote' + id: message-actions-quote - extendedWaitUntil: visible: id: 'markdown-preview-${output.originalMessage}' diff --git a/app/containers/MessageActions/index.tsx b/app/containers/MessageActions/index.tsx index 466a70ce510..a10a159e6e1 100644 --- a/app/containers/MessageActions/index.tsx +++ b/app/containers/MessageActions/index.tsx @@ -404,7 +404,8 @@ const MessageActions = React.memo( title: I18n.t('Edit'), icon: 'edit', onPress: () => handleEdit(message.id), - enabled: isEditAllowed + enabled: isEditAllowed, + testID: 'message-actions-edit' }); } @@ -414,7 +415,8 @@ const MessageActions = React.memo( options.push({ title: I18n.t('Jump_to_message'), icon: 'jump-to-message', - onPress: () => jumpToMessage(quoteMessageLink, true) + onPress: () => jumpToMessage(quoteMessageLink, true), + testID: 'message-actions-jump-to-message' }); } @@ -423,7 +425,8 @@ const MessageActions = React.memo( options.push({ title: I18n.t('Quote'), icon: 'quote', - onPress: () => handleQuote(message.id) + onPress: () => handleQuote(message.id), + testID: 'message-actions-quote' }); } @@ -432,7 +435,8 @@ const MessageActions = React.memo( options.push({ title: I18n.t('Reply_in_Thread'), icon: 'threads', - onPress: () => handleReply(message.id) + onPress: () => handleReply(message.id), + testID: 'message-actions-reply-in-thread' }); } @@ -443,7 +447,8 @@ const MessageActions = React.memo( icon: 'arrow-back', onPress: () => handleReplyInDM(message), enabled: permissions.hasCreateDirectMessagePermission && !room.abacAttributes, - disabledReason: room.abacAttributes && I18n.t('ABAC_disabled_action_reason') + disabledReason: room.abacAttributes && I18n.t('ABAC_disabled_action_reason'), + testID: 'message-actions-reply-in-dm' }); } @@ -452,7 +457,8 @@ const MessageActions = React.memo( title: I18n.t('Start_a_Discussion'), icon: 'discussions', onPress: () => handleCreateDiscussion(message), - enabled: permissions.hasCreateDiscussionOtherUserPermission + enabled: permissions.hasCreateDiscussionOtherUserPermission, + testID: 'message-actions-create-discussion' }); // Forward @@ -462,7 +468,8 @@ const MessageActions = React.memo( icon: 'arrow-forward', onPress: () => handleShareMessage(message), enabled: !room.abacAttributes, - disabledReason: room.abacAttributes && I18n.t('ABAC_disabled_action_reason') + disabledReason: room.abacAttributes && I18n.t('ABAC_disabled_action_reason'), + testID: 'message-actions-forward' }); } @@ -472,7 +479,8 @@ const MessageActions = React.memo( icon: 'link', onPress: () => handlePermalink(message), enabled: !room.abacAttributes, - disabledReason: room.abacAttributes && I18n.t('ABAC_disabled_action_reason') + disabledReason: room.abacAttributes && I18n.t('ABAC_disabled_action_reason'), + testID: 'message-actions-get-link' }); // Copy @@ -480,7 +488,8 @@ const MessageActions = React.memo( options.push({ title: I18n.t('Copy'), icon: 'copy', - onPress: () => handleCopy(message) + onPress: () => handleCopy(message), + testID: 'message-actions-copy' }); } @@ -488,7 +497,8 @@ const MessageActions = React.memo( options.push({ title: I18n.t('Share'), icon: 'share', - onPress: () => handleShare(message) + onPress: () => handleShare(message), + testID: 'message-actions-share' }); // Pin @@ -497,7 +507,8 @@ const MessageActions = React.memo( title: I18n.t(message.pinned ? 'Unpin' : 'Pin'), icon: 'pin', onPress: () => handlePin(message), - enabled: permissions?.hasPinPermission + enabled: permissions?.hasPinPermission, + testID: `message-actions-${message.pinned ? 'unpin' : 'pin'}` }); } @@ -506,7 +517,8 @@ const MessageActions = React.memo( options.push({ title: I18n.t(message.starred ? 'Unstar' : 'Star'), icon: message.starred ? 'star-filled' : 'star', - onPress: () => handleStar(message.id, message.starred || false) + onPress: () => handleStar(message.id, message.starred || false), + testID: `message-actions-${message.starred ? 'unstar' : 'star'}` }); } @@ -515,7 +527,8 @@ const MessageActions = React.memo( options.push({ title: I18n.t('Mark_unread'), icon: 'flag', - onPress: () => handleUnread(message) + onPress: () => handleUnread(message), + testID: 'message-actions-mark-unread' }); } @@ -524,7 +537,8 @@ const MessageActions = React.memo( options.push({ title: I18n.t('Read_Receipt'), icon: 'info', - onPress: () => handleReadReceipt(message) + onPress: () => handleReadReceipt(message), + testID: 'message-actions-read-receipt' }); } @@ -533,7 +547,8 @@ const MessageActions = React.memo( options.push({ title: I18n.t(message.autoTranslate !== false ? 'View_Original' : 'Translate'), icon: 'language', - onPress: () => handleToggleTranslation(message) + onPress: () => handleToggleTranslation(message), + testID: 'message-actions-toggle-translation' }); } @@ -542,7 +557,8 @@ const MessageActions = React.memo( title: I18n.t('Report'), icon: 'warning', danger: true, - onPress: () => handleReport(message) + onPress: () => handleReport(message), + testID: 'message-actions-report' }); // Delete @@ -553,7 +569,8 @@ const MessageActions = React.memo( icon: 'delete', danger: true, onPress: () => handleDelete(message), - enabled: isDeleteAllowed + enabled: isDeleteAllowed, + testID: 'message-actions-delete' }); } From 02cd74fdc3df7eb48b7c6890e37cfa63c0911858 Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Wed, 11 Mar 2026 13:05:31 -0300 Subject: [PATCH 44/98] fix: code improvements --- .../ActionSheet/BottomSheetContent.tsx | 17 +++-------------- app/containers/ActionSheet/styles.ts | 5 +++++ 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/app/containers/ActionSheet/BottomSheetContent.tsx b/app/containers/ActionSheet/BottomSheetContent.tsx index 19f0058d58b..e82110db6c5 100644 --- a/app/containers/ActionSheet/BottomSheetContent.tsx +++ b/app/containers/ActionSheet/BottomSheetContent.tsx @@ -1,4 +1,4 @@ -import { FlatList, Platform, Text, useWindowDimensions, View, type ViewProps } from 'react-native'; +import { FlatList, Text, useWindowDimensions, View, type ViewProps } from 'react-native'; import React from 'react'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; @@ -30,6 +30,7 @@ const BottomSheetContent = React.memo( const { fontScale } = useWindowDimensions(); const height = 48 * fontScale; const paddingBottom = bottom + height; + const minHeightStyle = isAndroid || !contentMinHeight ? undefined : { minHeight: contentMinHeight }; const renderFooter = () => hasCancel ? ( @@ -65,19 +66,7 @@ const BottomSheetContent = React.memo( ); } return ( - + {children} ); diff --git a/app/containers/ActionSheet/styles.ts b/app/containers/ActionSheet/styles.ts index 10d77caabad..cbebcd17221 100644 --- a/app/containers/ActionSheet/styles.ts +++ b/app/containers/ActionSheet/styles.ts @@ -71,5 +71,10 @@ export default StyleSheet.create({ }, contentContainer: { flex: 0 + }, + fullContainer: { + width: '100%', + height: '100%', + flex: 0 } }); From e50f3ad6f35205e6eac515cabbba54a87b323d5d Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Wed, 11 Mar 2026 13:24:00 -0300 Subject: [PATCH 45/98] fix: update required height --- app/containers/SupportedVersions/styles.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/containers/SupportedVersions/styles.ts b/app/containers/SupportedVersions/styles.ts index 3ed3c54c5de..6468861692f 100644 --- a/app/containers/SupportedVersions/styles.ts +++ b/app/containers/SupportedVersions/styles.ts @@ -4,7 +4,7 @@ import sharedStyles from '../../views/Styles'; export const styles = StyleSheet.create({ container: { - flex: 1, + flex: 0, padding: 16, backgroundColor: '#fff' }, From af3098da205b1e0f0ec34a37c00c66b4a5796689 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ot=C3=A1vio=20Stasiak?= <91474186+OtavioStasiak@users.noreply.github.com> Date: Wed, 11 Mar 2026 14:38:53 -0300 Subject: [PATCH 46/98] Update patches/@lodev09+react-native-true-sheet+3.7.3.patch Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- ...odev09+react-native-true-sheet+3.7.3.patch | 23 +------------------ 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/patches/@lodev09+react-native-true-sheet+3.7.3.patch b/patches/@lodev09+react-native-true-sheet+3.7.3.patch index 616d1c7163d..d693231f4f8 100644 --- a/patches/@lodev09+react-native-true-sheet+3.7.3.patch +++ b/patches/@lodev09+react-native-true-sheet+3.7.3.patch @@ -1759,28 +1759,7 @@ index 0000000..1211b1e +minAndroidGradlePluginVersion=1.0.0 +coreLibraryDesugaringEnabled=false diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json -new file mode 100644 -index 0000000..9e26dfe ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json -@@ -0,0 +1 @@ -+{} -\ No newline at end of file -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar -new file mode 100644 -index 0000000..ecea938 -Binary files /dev/null and b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar differ -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt -new file mode 100644 -index 0000000..e69de29 -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties -new file mode 100644 -index 0000000..4998f7b ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties -@@ -0,0 +1 @@ -+#Thu Mar 05 15:48:34 BRT 2026 -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml + new file mode 100644 index 0000000..a3a53e4 --- /dev/null From b7c2b2f1f290c2427d39818a3c95f8c9919da5fb Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Wed, 11 Mar 2026 18:04:25 -0300 Subject: [PATCH 47/98] code improvements --- app/containers/ActionSheet/ActionSheet.tsx | 34 +++++++++++++++------- app/containers/TextInput/FormTextInput.tsx | 6 ++-- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index 766a7d1e06f..9d2e317c0c6 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -1,6 +1,6 @@ import { useBackHandler } from '@react-native-community/hooks'; import * as Haptics from 'expo-haptics'; -import React, { forwardRef, isValidElement, useEffect, useImperativeHandle, useRef, useState } from 'react'; +import React, { forwardRef, isValidElement, useImperativeHandle, useRef, useState } from 'react'; import { Keyboard, type LayoutChangeEvent, useWindowDimensions } from 'react-native'; import { TrueSheet } from '@lodev09/react-native-true-sheet'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; @@ -25,6 +25,8 @@ const ActionSheet = React.memo( const [data, setData] = useState({} as TActionSheetOptions); const [isVisible, setIsVisible] = useState(false); const [contentHeight, setContentHeight] = useState(0); + const presentTimerRef = useRef | null>(null); + const onCloseSnapshotRef = useRef(undefined); const itemHeight = 48 * fontScale; @@ -32,15 +34,30 @@ const ActionSheet = React.memo( setContentHeight(layout.height); }; + const cancelPendingPresent = () => { + if (presentTimerRef.current !== null) { + clearTimeout(presentTimerRef.current); + presentTimerRef.current = null; + } + }; + const hide = () => { + cancelPendingPresent(); + onCloseSnapshotRef.current = data?.onClose; sheetRef.current?.dismiss(); + Keyboard.dismiss(); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); }; const show = (options: TActionSheetOptions) => { + cancelPendingPresent(); setData(options); setIsVisible(true); - // timeout to open after the old one close; - setTimeout(() => { + Keyboard.dismiss(); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + onCloseSnapshotRef.current = options.onClose; + presentTimerRef.current = setTimeout(() => { + presentTimerRef.current = null; sheetRef.current?.present(); }, 200); }; @@ -52,13 +69,6 @@ const ActionSheet = React.memo( return isVisible; }); - useEffect(() => { - if (isVisible) { - Keyboard.dismiss(); - Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); - } - }, [isVisible]); - useImperativeHandle(ref, () => ({ showActionSheet: show, hideActionSheet: hide @@ -74,7 +84,9 @@ const ActionSheet = React.memo( const onDidDismiss = () => { setIsVisible(false); setContentHeight(0); - data?.onClose?.(); + const snapshotOnClose = onCloseSnapshotRef.current; + onCloseSnapshotRef.current = undefined; + snapshotOnClose?.(); }; const bottomSheetStyle = isTablet ? styles.bottomSheet : { marginRight: right, marginLeft: left }; diff --git a/app/containers/TextInput/FormTextInput.tsx b/app/containers/TextInput/FormTextInput.tsx index 6a5fda320be..f766b893caa 100644 --- a/app/containers/TextInput/FormTextInput.tsx +++ b/app/containers/TextInput/FormTextInput.tsx @@ -127,8 +127,6 @@ export const FormTextInput = ({ const { colors } = useTheme(); const [showPassword, setShowPassword] = useState(false); const showClearInput = onClearInput && value && value.length > 0; - const Input = TextInput; - const inputError = getInputError(error); const accessibilityLabelText = useMemo(() => { const baseLabel = `${accessibilityLabel || label || ''}`; @@ -154,7 +152,7 @@ export const FormTextInput = ({ ) : null} - - {iconLeft ? ( + {iconLeft ? ( Date: Wed, 11 Mar 2026 18:31:06 -0300 Subject: [PATCH 48/98] fix: style --- app/containers/ActionSheet/styles.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/containers/ActionSheet/styles.ts b/app/containers/ActionSheet/styles.ts index cbebcd17221..4cb8afaecb5 100644 --- a/app/containers/ActionSheet/styles.ts +++ b/app/containers/ActionSheet/styles.ts @@ -44,8 +44,7 @@ export default StyleSheet.create({ ...StyleSheet.absoluteFillObject }, bottomSheet: { - width: '50%', - marginHorizontal: '25%' + width: '100%' }, button: { marginHorizontal: 16, From cc271ef0b3f7e42fb2fb2c2644b8a059024b457b Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Wed, 11 Mar 2026 21:32:44 +0000 Subject: [PATCH 49/98] chore: format code and fix lint issues --- app/containers/TextInput/FormTextInput.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/containers/TextInput/FormTextInput.tsx b/app/containers/TextInput/FormTextInput.tsx index f766b893caa..cef2bd132e9 100644 --- a/app/containers/TextInput/FormTextInput.tsx +++ b/app/containers/TextInput/FormTextInput.tsx @@ -184,7 +184,7 @@ export const FormTextInput = ({ {...inputProps} /> - {iconLeft ? ( + {iconLeft ? ( Date: Wed, 11 Mar 2026 18:43:23 -0300 Subject: [PATCH 50/98] remove unused style --- app/containers/ActionSheet/ActionSheet.tsx | 8 +++----- app/containers/ActionSheet/styles.ts | 3 --- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index 9d2e317c0c6..8a82314c294 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -7,7 +7,7 @@ import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { GestureHandlerRootView } from 'react-native-gesture-handler'; import { useTheme } from '../../theme'; -import { isIOS, isTablet } from '../../lib/methods/helpers'; +import { isIOS } from '../../lib/methods/helpers'; import { Handle } from './Handle'; import { type TActionSheetOptions } from './Provider'; import BottomSheetContent from './BottomSheetContent'; @@ -20,7 +20,7 @@ const ActionSheet = React.memo( forwardRef(({ children }: { children: React.ReactElement }, ref) => { const { colors } = useTheme(); const { height: windowHeight, fontScale } = useWindowDimensions(); - const { bottom, right, left } = useSafeAreaInsets(); + const { bottom } = useSafeAreaInsets(); const sheetRef = useRef(null); const [data, setData] = useState({} as TActionSheetOptions); const [isVisible, setIsVisible] = useState(false); @@ -89,8 +89,6 @@ const ActionSheet = React.memo( snapshotOnClose?.(); }; - const bottomSheetStyle = isTablet ? styles.bottomSheet : { marginRight: right, marginLeft: left }; - const { detents, maxHeight } = useActionSheetDetents({ windowHeight, bottomInset: bottom, @@ -130,7 +128,7 @@ const ActionSheet = React.memo( draggable={!disableContentPanning} header={renderHeader()} scrollable={isScrollable} - style={[styles.container, bottomSheetStyle]} + style={[styles.container]} onDidDismiss={onDidDismiss}> Date: Thu, 12 Mar 2026 11:39:09 -0300 Subject: [PATCH 51/98] clean patch package --- ...odev09+react-native-true-sheet+3.7.3.patch | 1921 +---------------- 1 file changed, 16 insertions(+), 1905 deletions(-) diff --git a/patches/@lodev09+react-native-true-sheet+3.7.3.patch b/patches/@lodev09+react-native-true-sheet+3.7.3.patch index d693231f4f8..6004b34fdae 100644 --- a/patches/@lodev09+react-native-true-sheet+3.7.3.patch +++ b/patches/@lodev09+react-native-true-sheet+3.7.3.patch @@ -1,1911 +1,22 @@ -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/buildConfig/debug/com/lodev09/truesheet/BuildConfig.java b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/buildConfig/debug/com/lodev09/truesheet/BuildConfig.java -new file mode 100644 -index 0000000..f148c6e ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/buildConfig/debug/com/lodev09/truesheet/BuildConfig.java -@@ -0,0 +1,12 @@ -+/** -+ * Automatically generated file. DO NOT MODIFY -+ */ -+package com.lodev09.truesheet; -+ -+public final class BuildConfig { -+ public static final boolean DEBUG = Boolean.parseBoolean("true"); -+ public static final String LIBRARY_PACKAGE_NAME = "com.lodev09.truesheet"; -+ public static final String BUILD_TYPE = "debug"; -+ // Field from default config. -+ public static final boolean EDGE_TO_EDGE_ENABLED = false; -+} -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetContainerViewManagerDelegate.java b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetContainerViewManagerDelegate.java -new file mode 100644 -index 0000000..69ec6af ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetContainerViewManagerDelegate.java -@@ -0,0 +1,26 @@ -+/** -+* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+* -+* Do not edit this file as changes may cause incorrect behavior and will be lost -+* once the code is regenerated. -+* -+* @generated by codegen project: GeneratePropsJavaDelegate.js -+*/ -+ -+package com.facebook.react.viewmanagers; -+ -+import android.view.View; -+import androidx.annotation.Nullable; -+import com.facebook.react.uimanager.BaseViewManager; -+import com.facebook.react.uimanager.BaseViewManagerDelegate; -+import com.facebook.react.uimanager.LayoutShadowNode; -+ -+public class TrueSheetContainerViewManagerDelegate & TrueSheetContainerViewManagerInterface> extends BaseViewManagerDelegate { -+ public TrueSheetContainerViewManagerDelegate(U viewManager) { -+ super(viewManager); -+ } -+ @Override -+ public void setProperty(T view, String propName, @Nullable Object value) { -+ super.setProperty(view, propName, value); -+ } -+} -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetContainerViewManagerInterface.java b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetContainerViewManagerInterface.java -new file mode 100644 -index 0000000..950e975 ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetContainerViewManagerInterface.java -@@ -0,0 +1,17 @@ -+/** -+* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+* -+* Do not edit this file as changes may cause incorrect behavior and will be lost -+* once the code is regenerated. -+* -+* @generated by codegen project: GeneratePropsJavaInterface.js -+*/ -+ -+package com.facebook.react.viewmanagers; -+ -+import android.view.View; -+import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface; -+ -+public interface TrueSheetContainerViewManagerInterface extends ViewManagerWithGeneratedInterface { -+ // No props -+} -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetContentViewManagerDelegate.java b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetContentViewManagerDelegate.java -new file mode 100644 -index 0000000..0ec3ae2 ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetContentViewManagerDelegate.java -@@ -0,0 +1,26 @@ -+/** -+* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+* -+* Do not edit this file as changes may cause incorrect behavior and will be lost -+* once the code is regenerated. -+* -+* @generated by codegen project: GeneratePropsJavaDelegate.js -+*/ -+ -+package com.facebook.react.viewmanagers; -+ -+import android.view.View; -+import androidx.annotation.Nullable; -+import com.facebook.react.uimanager.BaseViewManager; -+import com.facebook.react.uimanager.BaseViewManagerDelegate; -+import com.facebook.react.uimanager.LayoutShadowNode; -+ -+public class TrueSheetContentViewManagerDelegate & TrueSheetContentViewManagerInterface> extends BaseViewManagerDelegate { -+ public TrueSheetContentViewManagerDelegate(U viewManager) { -+ super(viewManager); -+ } -+ @Override -+ public void setProperty(T view, String propName, @Nullable Object value) { -+ super.setProperty(view, propName, value); -+ } -+} -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetContentViewManagerInterface.java b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetContentViewManagerInterface.java -new file mode 100644 -index 0000000..3df3301 ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetContentViewManagerInterface.java -@@ -0,0 +1,17 @@ -+/** -+* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+* -+* Do not edit this file as changes may cause incorrect behavior and will be lost -+* once the code is regenerated. -+* -+* @generated by codegen project: GeneratePropsJavaInterface.js -+*/ -+ -+package com.facebook.react.viewmanagers; -+ -+import android.view.View; -+import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface; -+ -+public interface TrueSheetContentViewManagerInterface extends ViewManagerWithGeneratedInterface { -+ // No props -+} -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetFooterViewManagerDelegate.java b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetFooterViewManagerDelegate.java -new file mode 100644 -index 0000000..9f5c333 ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetFooterViewManagerDelegate.java -@@ -0,0 +1,26 @@ -+/** -+* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+* -+* Do not edit this file as changes may cause incorrect behavior and will be lost -+* once the code is regenerated. -+* -+* @generated by codegen project: GeneratePropsJavaDelegate.js -+*/ -+ -+package com.facebook.react.viewmanagers; -+ -+import android.view.View; -+import androidx.annotation.Nullable; -+import com.facebook.react.uimanager.BaseViewManager; -+import com.facebook.react.uimanager.BaseViewManagerDelegate; -+import com.facebook.react.uimanager.LayoutShadowNode; -+ -+public class TrueSheetFooterViewManagerDelegate & TrueSheetFooterViewManagerInterface> extends BaseViewManagerDelegate { -+ public TrueSheetFooterViewManagerDelegate(U viewManager) { -+ super(viewManager); -+ } -+ @Override -+ public void setProperty(T view, String propName, @Nullable Object value) { -+ super.setProperty(view, propName, value); -+ } -+} -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetFooterViewManagerInterface.java b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetFooterViewManagerInterface.java -new file mode 100644 -index 0000000..c8d8e22 ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetFooterViewManagerInterface.java -@@ -0,0 +1,17 @@ -+/** -+* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+* -+* Do not edit this file as changes may cause incorrect behavior and will be lost -+* once the code is regenerated. -+* -+* @generated by codegen project: GeneratePropsJavaInterface.js -+*/ -+ -+package com.facebook.react.viewmanagers; -+ -+import android.view.View; -+import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface; -+ -+public interface TrueSheetFooterViewManagerInterface extends ViewManagerWithGeneratedInterface { -+ // No props -+} -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetHeaderViewManagerDelegate.java b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetHeaderViewManagerDelegate.java -new file mode 100644 -index 0000000..6efa55b ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetHeaderViewManagerDelegate.java -@@ -0,0 +1,26 @@ -+/** -+* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+* -+* Do not edit this file as changes may cause incorrect behavior and will be lost -+* once the code is regenerated. -+* -+* @generated by codegen project: GeneratePropsJavaDelegate.js -+*/ -+ -+package com.facebook.react.viewmanagers; -+ -+import android.view.View; -+import androidx.annotation.Nullable; -+import com.facebook.react.uimanager.BaseViewManager; -+import com.facebook.react.uimanager.BaseViewManagerDelegate; -+import com.facebook.react.uimanager.LayoutShadowNode; -+ -+public class TrueSheetHeaderViewManagerDelegate & TrueSheetHeaderViewManagerInterface> extends BaseViewManagerDelegate { -+ public TrueSheetHeaderViewManagerDelegate(U viewManager) { -+ super(viewManager); -+ } -+ @Override -+ public void setProperty(T view, String propName, @Nullable Object value) { -+ super.setProperty(view, propName, value); -+ } -+} -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetHeaderViewManagerInterface.java b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetHeaderViewManagerInterface.java -new file mode 100644 -index 0000000..b282d12 ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetHeaderViewManagerInterface.java -@@ -0,0 +1,17 @@ -+/** -+* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+* -+* Do not edit this file as changes may cause incorrect behavior and will be lost -+* once the code is regenerated. -+* -+* @generated by codegen project: GeneratePropsJavaInterface.js -+*/ -+ -+package com.facebook.react.viewmanagers; -+ -+import android.view.View; -+import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface; -+ -+public interface TrueSheetHeaderViewManagerInterface extends ViewManagerWithGeneratedInterface { -+ // No props -+} -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetViewManagerDelegate.java b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetViewManagerDelegate.java -new file mode 100644 -index 0000000..be5481a ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetViewManagerDelegate.java -@@ -0,0 +1,98 @@ -+/** -+* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+* -+* Do not edit this file as changes may cause incorrect behavior and will be lost -+* once the code is regenerated. -+* -+* @generated by codegen project: GeneratePropsJavaDelegate.js -+*/ -+ -+package com.facebook.react.viewmanagers; -+ -+import android.view.View; -+import androidx.annotation.Nullable; -+import com.facebook.react.bridge.ColorPropConverter; -+import com.facebook.react.bridge.ReadableArray; -+import com.facebook.react.bridge.ReadableMap; -+import com.facebook.react.uimanager.BaseViewManager; -+import com.facebook.react.uimanager.BaseViewManagerDelegate; -+import com.facebook.react.uimanager.LayoutShadowNode; -+ -+public class TrueSheetViewManagerDelegate & TrueSheetViewManagerInterface> extends BaseViewManagerDelegate { -+ public TrueSheetViewManagerDelegate(U viewManager) { -+ super(viewManager); -+ } -+ @Override -+ public void setProperty(T view, String propName, @Nullable Object value) { -+ switch (propName) { -+ case "detents": -+ mViewManager.setDetents(view, (ReadableArray) value); -+ break; -+ case "maxContentHeight": -+ mViewManager.setMaxContentHeight(view, value == null ? 0f : ((Double) value).doubleValue()); -+ break; -+ case "maxContentWidth": -+ mViewManager.setMaxContentWidth(view, value == null ? 0f : ((Double) value).doubleValue()); -+ break; -+ case "cornerRadius": -+ mViewManager.setCornerRadius(view, value == null ? -1f : ((Double) value).doubleValue()); -+ break; -+ case "elevation": -+ mViewManager.setElevation(view, value == null ? -1f : ((Double) value).doubleValue()); -+ break; -+ case "backgroundColor": -+ mViewManager.setBackgroundColor(view, ColorPropConverter.getColor(value, view.getContext())); -+ break; -+ case "initialDetentIndex": -+ mViewManager.setInitialDetentIndex(view, value == null ? -1 : ((Double) value).intValue()); -+ break; -+ case "dimmedDetentIndex": -+ mViewManager.setDimmedDetentIndex(view, value == null ? 0 : ((Double) value).intValue()); -+ break; -+ case "backgroundBlur": -+ mViewManager.setBackgroundBlur(view, (String) value); -+ break; -+ case "anchor": -+ mViewManager.setAnchor(view, (String) value); -+ break; -+ case "anchorOffset": -+ mViewManager.setAnchorOffset(view, value == null ? 16f : ((Double) value).doubleValue()); -+ break; -+ case "insetAdjustment": -+ mViewManager.setInsetAdjustment(view, (String) value); -+ break; -+ case "blurOptions": -+ mViewManager.setBlurOptions(view, (ReadableMap) value); -+ break; -+ case "grabber": -+ mViewManager.setGrabber(view, value == null ? true : (boolean) value); -+ break; -+ case "grabberOptions": -+ mViewManager.setGrabberOptions(view, (ReadableMap) value); -+ break; -+ case "dismissible": -+ mViewManager.setDismissible(view, value == null ? true : (boolean) value); -+ break; -+ case "draggable": -+ mViewManager.setDraggable(view, value == null ? true : (boolean) value); -+ break; -+ case "dimmed": -+ mViewManager.setDimmed(view, value == null ? true : (boolean) value); -+ break; -+ case "initialDetentAnimated": -+ mViewManager.setInitialDetentAnimated(view, value == null ? true : (boolean) value); -+ break; -+ case "scrollable": -+ mViewManager.setScrollable(view, value == null ? false : (boolean) value); -+ break; -+ case "scrollableOptions": -+ mViewManager.setScrollableOptions(view, (ReadableMap) value); -+ break; -+ case "pageSizing": -+ mViewManager.setPageSizing(view, value == null ? true : (boolean) value); -+ break; -+ default: -+ super.setProperty(view, propName, value); -+ } -+ } -+} -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetViewManagerInterface.java b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetViewManagerInterface.java -new file mode 100644 -index 0000000..2341fcb ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TrueSheetViewManagerInterface.java -@@ -0,0 +1,41 @@ -+/** -+* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+* -+* Do not edit this file as changes may cause incorrect behavior and will be lost -+* once the code is regenerated. -+* -+* @generated by codegen project: GeneratePropsJavaInterface.js -+*/ -+ -+package com.facebook.react.viewmanagers; -+ -+import android.view.View; -+import androidx.annotation.Nullable; -+import com.facebook.react.bridge.ReadableArray; -+import com.facebook.react.bridge.ReadableMap; -+import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface; -+ -+public interface TrueSheetViewManagerInterface extends ViewManagerWithGeneratedInterface { -+ void setDetents(T view, @Nullable ReadableArray value); -+ void setMaxContentHeight(T view, double value); -+ void setMaxContentWidth(T view, double value); -+ void setCornerRadius(T view, double value); -+ void setElevation(T view, double value); -+ void setBackgroundColor(T view, @Nullable Integer value); -+ void setInitialDetentIndex(T view, int value); -+ void setDimmedDetentIndex(T view, int value); -+ void setBackgroundBlur(T view, @Nullable String value); -+ void setAnchor(T view, @Nullable String value); -+ void setAnchorOffset(T view, double value); -+ void setInsetAdjustment(T view, @Nullable String value); -+ void setBlurOptions(T view, @Nullable ReadableMap value); -+ void setGrabber(T view, boolean value); -+ void setGrabberOptions(T view, @Nullable ReadableMap value); -+ void setDismissible(T view, boolean value); -+ void setDraggable(T view, boolean value); -+ void setDimmed(T view, boolean value); -+ void setInitialDetentAnimated(T view, boolean value); -+ void setScrollable(T view, boolean value); -+ void setScrollableOptions(T view, @Nullable ReadableMap value); -+ void setPageSizing(T view, boolean value); -+} -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/lodev09/truesheet/NativeTrueSheetModuleSpec.java b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/lodev09/truesheet/NativeTrueSheetModuleSpec.java -new file mode 100644 -index 0000000..531265d ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/java/com/lodev09/truesheet/NativeTrueSheetModuleSpec.java -@@ -0,0 +1,54 @@ -+ -+/** -+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+ * -+ * Do not edit this file as changes may cause incorrect behavior and will be lost -+ * once the code is regenerated. -+ * -+ * @generated by codegen project: GenerateModuleJavaSpec.js -+ * -+ * @nolint -+ */ -+ -+package com.lodev09.truesheet; -+ -+import com.facebook.proguard.annotations.DoNotStrip; -+import com.facebook.react.bridge.Promise; -+import com.facebook.react.bridge.ReactApplicationContext; -+import com.facebook.react.bridge.ReactContextBaseJavaModule; -+import com.facebook.react.bridge.ReactMethod; -+import com.facebook.react.turbomodule.core.interfaces.TurboModule; -+import javax.annotation.Nonnull; -+ -+public abstract class NativeTrueSheetModuleSpec extends ReactContextBaseJavaModule implements TurboModule { -+ public static final String NAME = "TrueSheetModule"; -+ -+ public NativeTrueSheetModuleSpec(ReactApplicationContext reactContext) { -+ super(reactContext); -+ } -+ -+ @Override -+ public @Nonnull String getName() { -+ return NAME; -+ } -+ -+ @ReactMethod -+ @DoNotStrip -+ public abstract void presentByRef(double viewTag, double index, boolean animated, Promise promise); -+ -+ @ReactMethod -+ @DoNotStrip -+ public abstract void dismissByRef(double viewTag, boolean animated, Promise promise); -+ -+ @ReactMethod -+ @DoNotStrip -+ public abstract void dismissStackByRef(double viewTag, boolean animated, Promise promise); -+ -+ @ReactMethod -+ @DoNotStrip -+ public abstract void resizeByRef(double viewTag, double index, Promise promise); -+ -+ @ReactMethod -+ @DoNotStrip -+ public abstract void dismissAll(boolean animated, Promise promise); -+} -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/CMakeLists.txt b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/CMakeLists.txt -new file mode 100644 -index 0000000..ab16787 ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/CMakeLists.txt -@@ -0,0 +1,36 @@ -+# Copyright (c) Meta Platforms, Inc. and affiliates. -+# -+# This source code is licensed under the MIT license found in the -+# LICENSE file in the root directory of this source tree. -+ -+cmake_minimum_required(VERSION 3.13) -+set(CMAKE_VERBOSE_MAKEFILE on) -+ -+file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/TrueSheetSpec/*.cpp) -+ -+add_library( -+ react_codegen_TrueSheetSpec -+ OBJECT -+ ${react_codegen_SRCS} -+) -+ -+target_include_directories(react_codegen_TrueSheetSpec PUBLIC . react/renderer/components/TrueSheetSpec) -+ -+target_link_libraries( -+ react_codegen_TrueSheetSpec -+ fbjni -+ jsi -+ # We need to link different libraries based on whether we are building rncore or not, that's necessary -+ # because we want to break a circular dependency between react_codegen_rncore and reactnative -+ reactnative -+) -+ -+target_compile_options( -+ react_codegen_TrueSheetSpec -+ PRIVATE -+ -DLOG_TAG=\"ReactNative\" -+ -fexceptions -+ -frtti -+ -std=c++20 -+ -Wall -+) -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/TrueSheetSpec-generated.cpp b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/TrueSheetSpec-generated.cpp -new file mode 100644 -index 0000000..33d7583 ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/TrueSheetSpec-generated.cpp -@@ -0,0 +1,56 @@ -+ -+/** -+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+ * -+ * Do not edit this file as changes may cause incorrect behavior and will be lost -+ * once the code is regenerated. -+ * -+ * @generated by codegen project: GenerateModuleJniCpp.js -+ */ -+ -+#include "TrueSheetSpec.h" -+ -+namespace facebook::react { -+ -+static facebook::jsi::Value __hostFunction_NativeTrueSheetModuleSpecJSI_presentByRef(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { -+ static jmethodID cachedMethodId = nullptr; -+ return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "presentByRef", "(DDZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); -+} -+ -+static facebook::jsi::Value __hostFunction_NativeTrueSheetModuleSpecJSI_dismissByRef(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { -+ static jmethodID cachedMethodId = nullptr; -+ return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "dismissByRef", "(DZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); -+} -+ -+static facebook::jsi::Value __hostFunction_NativeTrueSheetModuleSpecJSI_dismissStackByRef(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { -+ static jmethodID cachedMethodId = nullptr; -+ return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "dismissStackByRef", "(DZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); -+} -+ -+static facebook::jsi::Value __hostFunction_NativeTrueSheetModuleSpecJSI_resizeByRef(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { -+ static jmethodID cachedMethodId = nullptr; -+ return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "resizeByRef", "(DDLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); -+} -+ -+static facebook::jsi::Value __hostFunction_NativeTrueSheetModuleSpecJSI_dismissAll(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { -+ static jmethodID cachedMethodId = nullptr; -+ return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "dismissAll", "(ZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); -+} -+ -+NativeTrueSheetModuleSpecJSI::NativeTrueSheetModuleSpecJSI(const JavaTurboModule::InitParams ¶ms) -+ : JavaTurboModule(params) { -+ methodMap_["presentByRef"] = MethodMetadata {3, __hostFunction_NativeTrueSheetModuleSpecJSI_presentByRef}; -+ methodMap_["dismissByRef"] = MethodMetadata {2, __hostFunction_NativeTrueSheetModuleSpecJSI_dismissByRef}; -+ methodMap_["dismissStackByRef"] = MethodMetadata {2, __hostFunction_NativeTrueSheetModuleSpecJSI_dismissStackByRef}; -+ methodMap_["resizeByRef"] = MethodMetadata {2, __hostFunction_NativeTrueSheetModuleSpecJSI_resizeByRef}; -+ methodMap_["dismissAll"] = MethodMetadata {1, __hostFunction_NativeTrueSheetModuleSpecJSI_dismissAll}; -+} -+ -+std::shared_ptr TrueSheetSpec_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) { -+ if (moduleName == "TrueSheetModule") { -+ return std::make_shared(params); -+ } -+ return nullptr; -+} -+ -+} // namespace facebook::react -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/TrueSheetSpec.h b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/TrueSheetSpec.h -new file mode 100644 -index 0000000..3a9fbbd ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/TrueSheetSpec.h -@@ -0,0 +1,31 @@ -+ -+/** -+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+ * -+ * Do not edit this file as changes may cause incorrect behavior and will be lost -+ * once the code is regenerated. -+ * -+ * @generated by codegen project: GenerateModuleJniH.js -+ */ -+ -+#pragma once -+ -+#include -+#include -+#include -+ -+namespace facebook::react { -+ -+/** -+ * JNI C++ class for module 'NativeTrueSheetModule' -+ */ -+class JSI_EXPORT NativeTrueSheetModuleSpecJSI : public JavaTurboModule { -+public: -+ NativeTrueSheetModuleSpecJSI(const JavaTurboModule::InitParams ¶ms); -+}; -+ -+ -+JSI_EXPORT -+std::shared_ptr TrueSheetSpec_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); -+ -+} // namespace facebook::react -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/ComponentDescriptors.cpp b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/ComponentDescriptors.cpp -new file mode 100644 -index 0000000..ff57d3d ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/ComponentDescriptors.cpp -@@ -0,0 +1,25 @@ -+ -+/** -+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+ * -+ * Do not edit this file as changes may cause incorrect behavior and will be lost -+ * once the code is regenerated. -+ * -+ * @generated by codegen project: GenerateComponentDescriptorCpp.js -+ */ -+ -+#include -+#include -+#include -+ -+namespace facebook::react { -+ -+void TrueSheetSpec_registerComponentDescriptorsFromCodegen( -+ std::shared_ptr registry) { -+registry->add(concreteComponentDescriptorProvider()); -+registry->add(concreteComponentDescriptorProvider()); -+registry->add(concreteComponentDescriptorProvider()); -+registry->add(concreteComponentDescriptorProvider()); -+} -+ -+} // namespace facebook::react -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/ComponentDescriptors.h b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/ComponentDescriptors.h -new file mode 100644 -index 0000000..24868ce ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/ComponentDescriptors.h -@@ -0,0 +1,27 @@ -+ -+/** -+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+ * -+ * Do not edit this file as changes may cause incorrect behavior and will be lost -+ * once the code is regenerated. -+ * -+ * @generated by codegen project: GenerateComponentDescriptorH.js -+ */ -+ -+#pragma once -+ -+#include -+#include -+#include -+ -+namespace facebook::react { -+ -+using TrueSheetContainerViewComponentDescriptor = ConcreteComponentDescriptor; -+using TrueSheetContentViewComponentDescriptor = ConcreteComponentDescriptor; -+using TrueSheetFooterViewComponentDescriptor = ConcreteComponentDescriptor; -+using TrueSheetHeaderViewComponentDescriptor = ConcreteComponentDescriptor; -+ -+void TrueSheetSpec_registerComponentDescriptorsFromCodegen( -+ std::shared_ptr registry); -+ -+} // namespace facebook::react -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/EventEmitters.cpp b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/EventEmitters.cpp -new file mode 100644 -index 0000000..5424c72 ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/EventEmitters.cpp -@@ -0,0 +1,169 @@ -+ -+/** -+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+ * -+ * Do not edit this file as changes may cause incorrect behavior and will be lost -+ * once the code is regenerated. -+ * -+ * @generated by codegen project: GenerateEventEmitterCpp.js -+ */ -+ -+#include -+ -+ -+namespace facebook::react { -+ -+ -+ -+ -+ -+void TrueSheetViewEventEmitter::onMount(OnMount $event) const { -+ dispatchEvent("mount", [](jsi::Runtime &runtime) { -+ auto $payload = jsi::Object(runtime); -+ -+ return $payload; -+ }); -+} -+ -+ -+void TrueSheetViewEventEmitter::onWillPresent(OnWillPresent $event) const { -+ dispatchEvent("willPresent", [$event=std::move($event)](jsi::Runtime &runtime) { -+ auto $payload = jsi::Object(runtime); -+ $payload.setProperty(runtime, "index", $event.index); -+$payload.setProperty(runtime, "position", $event.position); -+$payload.setProperty(runtime, "detent", $event.detent); -+ return $payload; -+ }); -+} -+ -+ -+void TrueSheetViewEventEmitter::onDidPresent(OnDidPresent $event) const { -+ dispatchEvent("didPresent", [$event=std::move($event)](jsi::Runtime &runtime) { -+ auto $payload = jsi::Object(runtime); -+ $payload.setProperty(runtime, "index", $event.index); -+$payload.setProperty(runtime, "position", $event.position); -+$payload.setProperty(runtime, "detent", $event.detent); -+ return $payload; -+ }); -+} -+ -+ -+void TrueSheetViewEventEmitter::onWillDismiss(OnWillDismiss $event) const { -+ dispatchEvent("willDismiss", [](jsi::Runtime &runtime) { -+ auto $payload = jsi::Object(runtime); -+ -+ return $payload; -+ }); -+} -+ -+ -+void TrueSheetViewEventEmitter::onDidDismiss(OnDidDismiss $event) const { -+ dispatchEvent("didDismiss", [](jsi::Runtime &runtime) { -+ auto $payload = jsi::Object(runtime); -+ -+ return $payload; -+ }); -+} -+ -+ -+void TrueSheetViewEventEmitter::onDetentChange(OnDetentChange $event) const { -+ dispatchEvent("detentChange", [$event=std::move($event)](jsi::Runtime &runtime) { -+ auto $payload = jsi::Object(runtime); -+ $payload.setProperty(runtime, "index", $event.index); -+$payload.setProperty(runtime, "position", $event.position); -+$payload.setProperty(runtime, "detent", $event.detent); -+ return $payload; -+ }); -+} -+ -+ -+void TrueSheetViewEventEmitter::onDragBegin(OnDragBegin $event) const { -+ dispatchEvent("dragBegin", [$event=std::move($event)](jsi::Runtime &runtime) { -+ auto $payload = jsi::Object(runtime); -+ $payload.setProperty(runtime, "index", $event.index); -+$payload.setProperty(runtime, "position", $event.position); -+$payload.setProperty(runtime, "detent", $event.detent); -+ return $payload; -+ }); -+} -+ -+ -+void TrueSheetViewEventEmitter::onDragChange(OnDragChange $event) const { -+ dispatchEvent("dragChange", [$event=std::move($event)](jsi::Runtime &runtime) { -+ auto $payload = jsi::Object(runtime); -+ $payload.setProperty(runtime, "index", $event.index); -+$payload.setProperty(runtime, "position", $event.position); -+$payload.setProperty(runtime, "detent", $event.detent); -+ return $payload; -+ }); -+} -+ -+ -+void TrueSheetViewEventEmitter::onDragEnd(OnDragEnd $event) const { -+ dispatchEvent("dragEnd", [$event=std::move($event)](jsi::Runtime &runtime) { -+ auto $payload = jsi::Object(runtime); -+ $payload.setProperty(runtime, "index", $event.index); -+$payload.setProperty(runtime, "position", $event.position); -+$payload.setProperty(runtime, "detent", $event.detent); -+ return $payload; -+ }); -+} -+ -+ -+void TrueSheetViewEventEmitter::onPositionChange(OnPositionChange $event) const { -+ dispatchEvent("positionChange", [$event=std::move($event)](jsi::Runtime &runtime) { -+ auto $payload = jsi::Object(runtime); -+ $payload.setProperty(runtime, "index", $event.index); -+$payload.setProperty(runtime, "position", $event.position); -+$payload.setProperty(runtime, "detent", $event.detent); -+$payload.setProperty(runtime, "realtime", $event.realtime); -+ return $payload; -+ }); -+} -+ -+ -+void TrueSheetViewEventEmitter::onWillFocus(OnWillFocus $event) const { -+ dispatchEvent("willFocus", [](jsi::Runtime &runtime) { -+ auto $payload = jsi::Object(runtime); -+ -+ return $payload; -+ }); -+} -+ -+ -+void TrueSheetViewEventEmitter::onDidFocus(OnDidFocus $event) const { -+ dispatchEvent("didFocus", [](jsi::Runtime &runtime) { -+ auto $payload = jsi::Object(runtime); -+ -+ return $payload; -+ }); -+} -+ -+ -+void TrueSheetViewEventEmitter::onWillBlur(OnWillBlur $event) const { -+ dispatchEvent("willBlur", [](jsi::Runtime &runtime) { -+ auto $payload = jsi::Object(runtime); -+ -+ return $payload; -+ }); -+} -+ -+ -+void TrueSheetViewEventEmitter::onDidBlur(OnDidBlur $event) const { -+ dispatchEvent("didBlur", [](jsi::Runtime &runtime) { -+ auto $payload = jsi::Object(runtime); -+ -+ return $payload; -+ }); -+} -+ -+ -+void TrueSheetViewEventEmitter::onBackPress(OnBackPress $event) const { -+ dispatchEvent("backPress", [](jsi::Runtime &runtime) { -+ auto $payload = jsi::Object(runtime); -+ -+ return $payload; -+ }); -+} -+ -+} // namespace facebook::react -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/EventEmitters.h b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/EventEmitters.h -new file mode 100644 -index 0000000..cc85e70 ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/EventEmitters.h -@@ -0,0 +1,152 @@ -+ -+/** -+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+ * -+ * Do not edit this file as changes may cause incorrect behavior and will be lost -+ * once the code is regenerated. -+ * -+ * @generated by codegen project: GenerateEventEmitterH.js -+ */ -+#pragma once -+ -+#include -+ -+ -+namespace facebook::react { -+class TrueSheetContainerViewEventEmitter : public ViewEventEmitter { -+ public: -+ using ViewEventEmitter::ViewEventEmitter; -+ -+ -+ -+}; -+class TrueSheetContentViewEventEmitter : public ViewEventEmitter { -+ public: -+ using ViewEventEmitter::ViewEventEmitter; -+ -+ -+ -+}; -+class TrueSheetFooterViewEventEmitter : public ViewEventEmitter { -+ public: -+ using ViewEventEmitter::ViewEventEmitter; -+ -+ -+ -+}; -+class TrueSheetHeaderViewEventEmitter : public ViewEventEmitter { -+ public: -+ using ViewEventEmitter::ViewEventEmitter; -+ -+ -+ -+}; -+class TrueSheetViewEventEmitter : public ViewEventEmitter { -+ public: -+ using ViewEventEmitter::ViewEventEmitter; -+ -+ struct OnMount { -+ -+ }; -+ -+ struct OnWillPresent { -+ int index; -+ double position; -+ double detent; -+ }; -+ -+ struct OnDidPresent { -+ int index; -+ double position; -+ double detent; -+ }; -+ -+ struct OnWillDismiss { -+ -+ }; -+ -+ struct OnDidDismiss { -+ -+ }; -+ -+ struct OnDetentChange { -+ int index; -+ double position; -+ double detent; -+ }; -+ -+ struct OnDragBegin { -+ int index; -+ double position; -+ double detent; -+ }; -+ -+ struct OnDragChange { -+ int index; -+ double position; -+ double detent; -+ }; -+ -+ struct OnDragEnd { -+ int index; -+ double position; -+ double detent; -+ }; -+ -+ struct OnPositionChange { -+ double index; -+ double position; -+ double detent; -+ bool realtime; -+ }; -+ -+ struct OnWillFocus { -+ -+ }; -+ -+ struct OnDidFocus { -+ -+ }; -+ -+ struct OnWillBlur { -+ -+ }; -+ -+ struct OnDidBlur { -+ -+ }; -+ -+ struct OnBackPress { -+ -+ }; -+ void onMount(OnMount value) const; -+ -+ void onWillPresent(OnWillPresent value) const; -+ -+ void onDidPresent(OnDidPresent value) const; -+ -+ void onWillDismiss(OnWillDismiss value) const; -+ -+ void onDidDismiss(OnDidDismiss value) const; -+ -+ void onDetentChange(OnDetentChange value) const; -+ -+ void onDragBegin(OnDragBegin value) const; -+ -+ void onDragChange(OnDragChange value) const; -+ -+ void onDragEnd(OnDragEnd value) const; -+ -+ void onPositionChange(OnPositionChange value) const; -+ -+ void onWillFocus(OnWillFocus value) const; -+ -+ void onDidFocus(OnDidFocus value) const; -+ -+ void onWillBlur(OnWillBlur value) const; -+ -+ void onDidBlur(OnDidBlur value) const; -+ -+ void onBackPress(OnBackPress value) const; -+}; -+} // namespace facebook::react -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/Props.cpp b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/Props.cpp -new file mode 100644 -index 0000000..06c320d ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/Props.cpp -@@ -0,0 +1,74 @@ -+ -+/** -+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+ * -+ * Do not edit this file as changes may cause incorrect behavior and will be lost -+ * once the code is regenerated. -+ * -+ * @generated by codegen project: GeneratePropsCpp.js -+ */ -+ -+#include -+#include -+#include -+ -+namespace facebook::react { -+ -+TrueSheetContainerViewProps::TrueSheetContainerViewProps( -+ const PropsParserContext &context, -+ const TrueSheetContainerViewProps &sourceProps, -+ const RawProps &rawProps): ViewProps(context, sourceProps, rawProps) -+ -+ -+ {} -+TrueSheetContentViewProps::TrueSheetContentViewProps( -+ const PropsParserContext &context, -+ const TrueSheetContentViewProps &sourceProps, -+ const RawProps &rawProps): ViewProps(context, sourceProps, rawProps) -+ -+ -+ {} -+TrueSheetFooterViewProps::TrueSheetFooterViewProps( -+ const PropsParserContext &context, -+ const TrueSheetFooterViewProps &sourceProps, -+ const RawProps &rawProps): ViewProps(context, sourceProps, rawProps) -+ -+ -+ {} -+TrueSheetHeaderViewProps::TrueSheetHeaderViewProps( -+ const PropsParserContext &context, -+ const TrueSheetHeaderViewProps &sourceProps, -+ const RawProps &rawProps): ViewProps(context, sourceProps, rawProps) -+ -+ -+ {} -+TrueSheetViewProps::TrueSheetViewProps( -+ const PropsParserContext &context, -+ const TrueSheetViewProps &sourceProps, -+ const RawProps &rawProps): ViewProps(context, sourceProps, rawProps), -+ -+ detents(convertRawProp(context, rawProps, "detents", sourceProps.detents, {})), -+ maxContentHeight(convertRawProp(context, rawProps, "maxContentHeight", sourceProps.maxContentHeight, {0.0})), -+ maxContentWidth(convertRawProp(context, rawProps, "maxContentWidth", sourceProps.maxContentWidth, {0.0})), -+ cornerRadius(convertRawProp(context, rawProps, "cornerRadius", sourceProps.cornerRadius, {-1.0})), -+ elevation(convertRawProp(context, rawProps, "elevation", sourceProps.elevation, {-1.0})), -+ backgroundColor(convertRawProp(context, rawProps, "backgroundColor", sourceProps.backgroundColor, {})), -+ initialDetentIndex(convertRawProp(context, rawProps, "initialDetentIndex", sourceProps.initialDetentIndex, {-1})), -+ dimmedDetentIndex(convertRawProp(context, rawProps, "dimmedDetentIndex", sourceProps.dimmedDetentIndex, {0})), -+ backgroundBlur(convertRawProp(context, rawProps, "backgroundBlur", sourceProps.backgroundBlur, {TrueSheetViewBackgroundBlur::None})), -+ anchor(convertRawProp(context, rawProps, "anchor", sourceProps.anchor, {TrueSheetViewAnchor::Center})), -+ anchorOffset(convertRawProp(context, rawProps, "anchorOffset", sourceProps.anchorOffset, {16.0})), -+ insetAdjustment(convertRawProp(context, rawProps, "insetAdjustment", sourceProps.insetAdjustment, {TrueSheetViewInsetAdjustment::Automatic})), -+ blurOptions(convertRawProp(context, rawProps, "blurOptions", sourceProps.blurOptions, {})), -+ grabber(convertRawProp(context, rawProps, "grabber", sourceProps.grabber, {true})), -+ grabberOptions(convertRawProp(context, rawProps, "grabberOptions", sourceProps.grabberOptions, {})), -+ dismissible(convertRawProp(context, rawProps, "dismissible", sourceProps.dismissible, {true})), -+ draggable(convertRawProp(context, rawProps, "draggable", sourceProps.draggable, {true})), -+ dimmed(convertRawProp(context, rawProps, "dimmed", sourceProps.dimmed, {true})), -+ initialDetentAnimated(convertRawProp(context, rawProps, "initialDetentAnimated", sourceProps.initialDetentAnimated, {true})), -+ scrollable(convertRawProp(context, rawProps, "scrollable", sourceProps.scrollable, {false})), -+ scrollableOptions(convertRawProp(context, rawProps, "scrollableOptions", sourceProps.scrollableOptions, {})), -+ pageSizing(convertRawProp(context, rawProps, "pageSizing", sourceProps.pageSizing, {true})) -+ {} -+ -+} // namespace facebook::react -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/Props.h b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/Props.h -new file mode 100644 -index 0000000..c1ce69a ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/Props.h -@@ -0,0 +1,258 @@ -+ -+/** -+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+ * -+ * Do not edit this file as changes may cause incorrect behavior and will be lost -+ * once the code is regenerated. -+ * -+ * @generated by codegen project: GeneratePropsH.js -+ */ -+#pragma once -+ -+#include -+#include -+#include -+#include -+#include -+ -+namespace facebook::react { -+ -+class TrueSheetContainerViewProps final : public ViewProps { -+ public: -+ TrueSheetContainerViewProps() = default; -+ TrueSheetContainerViewProps(const PropsParserContext& context, const TrueSheetContainerViewProps &sourceProps, const RawProps &rawProps); -+ -+#pragma mark - Props -+ -+ -+}; -+ -+class TrueSheetContentViewProps final : public ViewProps { -+ public: -+ TrueSheetContentViewProps() = default; -+ TrueSheetContentViewProps(const PropsParserContext& context, const TrueSheetContentViewProps &sourceProps, const RawProps &rawProps); -+ -+#pragma mark - Props -+ -+ -+}; -+ -+class TrueSheetFooterViewProps final : public ViewProps { -+ public: -+ TrueSheetFooterViewProps() = default; -+ TrueSheetFooterViewProps(const PropsParserContext& context, const TrueSheetFooterViewProps &sourceProps, const RawProps &rawProps); -+ -+#pragma mark - Props -+ -+ -+}; -+ -+class TrueSheetHeaderViewProps final : public ViewProps { -+ public: -+ TrueSheetHeaderViewProps() = default; -+ TrueSheetHeaderViewProps(const PropsParserContext& context, const TrueSheetHeaderViewProps &sourceProps, const RawProps &rawProps); -+ -+#pragma mark - Props -+ -+ -+}; -+ -+enum class TrueSheetViewBackgroundBlur { None, Light, Dark, Default, ExtraLight, Regular, Prominent, SystemUltraThinMaterial, SystemThinMaterial, SystemMaterial, SystemThickMaterial, SystemChromeMaterial, SystemUltraThinMaterialLight, SystemThinMaterialLight, SystemMaterialLight, SystemThickMaterialLight, SystemChromeMaterialLight, SystemUltraThinMaterialDark, SystemThinMaterialDark, SystemMaterialDark, SystemThickMaterialDark, SystemChromeMaterialDark }; -+ -+static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, TrueSheetViewBackgroundBlur &result) { -+ auto string = (std::string)value; -+ if (string == "none") { result = TrueSheetViewBackgroundBlur::None; return; } -+ if (string == "light") { result = TrueSheetViewBackgroundBlur::Light; return; } -+ if (string == "dark") { result = TrueSheetViewBackgroundBlur::Dark; return; } -+ if (string == "default") { result = TrueSheetViewBackgroundBlur::Default; return; } -+ if (string == "extra-light") { result = TrueSheetViewBackgroundBlur::ExtraLight; return; } -+ if (string == "regular") { result = TrueSheetViewBackgroundBlur::Regular; return; } -+ if (string == "prominent") { result = TrueSheetViewBackgroundBlur::Prominent; return; } -+ if (string == "system-ultra-thin-material") { result = TrueSheetViewBackgroundBlur::SystemUltraThinMaterial; return; } -+ if (string == "system-thin-material") { result = TrueSheetViewBackgroundBlur::SystemThinMaterial; return; } -+ if (string == "system-material") { result = TrueSheetViewBackgroundBlur::SystemMaterial; return; } -+ if (string == "system-thick-material") { result = TrueSheetViewBackgroundBlur::SystemThickMaterial; return; } -+ if (string == "system-chrome-material") { result = TrueSheetViewBackgroundBlur::SystemChromeMaterial; return; } -+ if (string == "system-ultra-thin-material-light") { result = TrueSheetViewBackgroundBlur::SystemUltraThinMaterialLight; return; } -+ if (string == "system-thin-material-light") { result = TrueSheetViewBackgroundBlur::SystemThinMaterialLight; return; } -+ if (string == "system-material-light") { result = TrueSheetViewBackgroundBlur::SystemMaterialLight; return; } -+ if (string == "system-thick-material-light") { result = TrueSheetViewBackgroundBlur::SystemThickMaterialLight; return; } -+ if (string == "system-chrome-material-light") { result = TrueSheetViewBackgroundBlur::SystemChromeMaterialLight; return; } -+ if (string == "system-ultra-thin-material-dark") { result = TrueSheetViewBackgroundBlur::SystemUltraThinMaterialDark; return; } -+ if (string == "system-thin-material-dark") { result = TrueSheetViewBackgroundBlur::SystemThinMaterialDark; return; } -+ if (string == "system-material-dark") { result = TrueSheetViewBackgroundBlur::SystemMaterialDark; return; } -+ if (string == "system-thick-material-dark") { result = TrueSheetViewBackgroundBlur::SystemThickMaterialDark; return; } -+ if (string == "system-chrome-material-dark") { result = TrueSheetViewBackgroundBlur::SystemChromeMaterialDark; return; } -+ abort(); -+} -+ -+static inline std::string toString(const TrueSheetViewBackgroundBlur &value) { -+ switch (value) { -+ case TrueSheetViewBackgroundBlur::None: return "none"; -+ case TrueSheetViewBackgroundBlur::Light: return "light"; -+ case TrueSheetViewBackgroundBlur::Dark: return "dark"; -+ case TrueSheetViewBackgroundBlur::Default: return "default"; -+ case TrueSheetViewBackgroundBlur::ExtraLight: return "extra-light"; -+ case TrueSheetViewBackgroundBlur::Regular: return "regular"; -+ case TrueSheetViewBackgroundBlur::Prominent: return "prominent"; -+ case TrueSheetViewBackgroundBlur::SystemUltraThinMaterial: return "system-ultra-thin-material"; -+ case TrueSheetViewBackgroundBlur::SystemThinMaterial: return "system-thin-material"; -+ case TrueSheetViewBackgroundBlur::SystemMaterial: return "system-material"; -+ case TrueSheetViewBackgroundBlur::SystemThickMaterial: return "system-thick-material"; -+ case TrueSheetViewBackgroundBlur::SystemChromeMaterial: return "system-chrome-material"; -+ case TrueSheetViewBackgroundBlur::SystemUltraThinMaterialLight: return "system-ultra-thin-material-light"; -+ case TrueSheetViewBackgroundBlur::SystemThinMaterialLight: return "system-thin-material-light"; -+ case TrueSheetViewBackgroundBlur::SystemMaterialLight: return "system-material-light"; -+ case TrueSheetViewBackgroundBlur::SystemThickMaterialLight: return "system-thick-material-light"; -+ case TrueSheetViewBackgroundBlur::SystemChromeMaterialLight: return "system-chrome-material-light"; -+ case TrueSheetViewBackgroundBlur::SystemUltraThinMaterialDark: return "system-ultra-thin-material-dark"; -+ case TrueSheetViewBackgroundBlur::SystemThinMaterialDark: return "system-thin-material-dark"; -+ case TrueSheetViewBackgroundBlur::SystemMaterialDark: return "system-material-dark"; -+ case TrueSheetViewBackgroundBlur::SystemThickMaterialDark: return "system-thick-material-dark"; -+ case TrueSheetViewBackgroundBlur::SystemChromeMaterialDark: return "system-chrome-material-dark"; -+ } -+} -+enum class TrueSheetViewAnchor { Left, Center, Right }; -+ -+static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, TrueSheetViewAnchor &result) { -+ auto string = (std::string)value; -+ if (string == "left") { result = TrueSheetViewAnchor::Left; return; } -+ if (string == "center") { result = TrueSheetViewAnchor::Center; return; } -+ if (string == "right") { result = TrueSheetViewAnchor::Right; return; } -+ abort(); -+} -+ -+static inline std::string toString(const TrueSheetViewAnchor &value) { -+ switch (value) { -+ case TrueSheetViewAnchor::Left: return "left"; -+ case TrueSheetViewAnchor::Center: return "center"; -+ case TrueSheetViewAnchor::Right: return "right"; -+ } -+} -+enum class TrueSheetViewInsetAdjustment { Automatic, Never }; -+ -+static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, TrueSheetViewInsetAdjustment &result) { -+ auto string = (std::string)value; -+ if (string == "automatic") { result = TrueSheetViewInsetAdjustment::Automatic; return; } -+ if (string == "never") { result = TrueSheetViewInsetAdjustment::Never; return; } -+ abort(); -+} -+ -+static inline std::string toString(const TrueSheetViewInsetAdjustment &value) { -+ switch (value) { -+ case TrueSheetViewInsetAdjustment::Automatic: return "automatic"; -+ case TrueSheetViewInsetAdjustment::Never: return "never"; -+ } -+} -+struct TrueSheetViewBlurOptionsStruct { -+ double intensity{-1.0}; -+ bool interaction{true}; -+}; -+ -+static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, TrueSheetViewBlurOptionsStruct &result) { -+ auto map = (std::unordered_map)value; -+ -+ auto tmp_intensity = map.find("intensity"); -+ if (tmp_intensity != map.end()) { -+ fromRawValue(context, tmp_intensity->second, result.intensity); -+ } -+ auto tmp_interaction = map.find("interaction"); -+ if (tmp_interaction != map.end()) { -+ fromRawValue(context, tmp_interaction->second, result.interaction); -+ } -+} -+ -+static inline std::string toString(const TrueSheetViewBlurOptionsStruct &value) { -+ return "[Object TrueSheetViewBlurOptionsStruct]"; -+} -+ -+struct TrueSheetViewGrabberOptionsStruct { -+ double width{0.0}; -+ double height{0.0}; -+ double topMargin{0.0}; -+ double cornerRadius{-1.0}; -+ SharedColor color{}; -+ bool adaptive{true}; -+}; -+ -+static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, TrueSheetViewGrabberOptionsStruct &result) { -+ auto map = (std::unordered_map)value; -+ -+ auto tmp_width = map.find("width"); -+ if (tmp_width != map.end()) { -+ fromRawValue(context, tmp_width->second, result.width); -+ } -+ auto tmp_height = map.find("height"); -+ if (tmp_height != map.end()) { -+ fromRawValue(context, tmp_height->second, result.height); -+ } -+ auto tmp_topMargin = map.find("topMargin"); -+ if (tmp_topMargin != map.end()) { -+ fromRawValue(context, tmp_topMargin->second, result.topMargin); -+ } -+ auto tmp_cornerRadius = map.find("cornerRadius"); -+ if (tmp_cornerRadius != map.end()) { -+ fromRawValue(context, tmp_cornerRadius->second, result.cornerRadius); -+ } -+ auto tmp_color = map.find("color"); -+ if (tmp_color != map.end()) { -+ fromRawValue(context, tmp_color->second, result.color); -+ } -+ auto tmp_adaptive = map.find("adaptive"); -+ if (tmp_adaptive != map.end()) { -+ fromRawValue(context, tmp_adaptive->second, result.adaptive); -+ } -+} -+ -+static inline std::string toString(const TrueSheetViewGrabberOptionsStruct &value) { -+ return "[Object TrueSheetViewGrabberOptionsStruct]"; -+} -+ -+struct TrueSheetViewScrollableOptionsStruct { -+ double keyboardScrollOffset{0.0}; -+}; -+ -+static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, TrueSheetViewScrollableOptionsStruct &result) { -+ auto map = (std::unordered_map)value; -+ -+ auto tmp_keyboardScrollOffset = map.find("keyboardScrollOffset"); -+ if (tmp_keyboardScrollOffset != map.end()) { -+ fromRawValue(context, tmp_keyboardScrollOffset->second, result.keyboardScrollOffset); -+ } -+} -+ -+static inline std::string toString(const TrueSheetViewScrollableOptionsStruct &value) { -+ return "[Object TrueSheetViewScrollableOptionsStruct]"; -+} -+class TrueSheetViewProps final : public ViewProps { -+ public: -+ TrueSheetViewProps() = default; -+ TrueSheetViewProps(const PropsParserContext& context, const TrueSheetViewProps &sourceProps, const RawProps &rawProps); -+ -+#pragma mark - Props -+ -+ std::vector detents{}; -+ double maxContentHeight{0.0}; -+ double maxContentWidth{0.0}; -+ double cornerRadius{-1.0}; -+ double elevation{-1.0}; -+ SharedColor backgroundColor{}; -+ int initialDetentIndex{-1}; -+ int dimmedDetentIndex{0}; -+ TrueSheetViewBackgroundBlur backgroundBlur{TrueSheetViewBackgroundBlur::None}; -+ TrueSheetViewAnchor anchor{TrueSheetViewAnchor::Center}; -+ double anchorOffset{16.0}; -+ TrueSheetViewInsetAdjustment insetAdjustment{TrueSheetViewInsetAdjustment::Automatic}; -+ TrueSheetViewBlurOptionsStruct blurOptions{}; -+ bool grabber{true}; -+ TrueSheetViewGrabberOptionsStruct grabberOptions{}; -+ bool dismissible{true}; -+ bool draggable{true}; -+ bool dimmed{true}; -+ bool initialDetentAnimated{true}; -+ bool scrollable{false}; -+ TrueSheetViewScrollableOptionsStruct scrollableOptions{}; -+ bool pageSizing{true}; -+}; -+ -+} // namespace facebook::react -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/ShadowNodes.cpp b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/ShadowNodes.cpp -new file mode 100644 -index 0000000..40e19ec ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/ShadowNodes.cpp -@@ -0,0 +1,20 @@ -+ -+/** -+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+ * -+ * Do not edit this file as changes may cause incorrect behavior and will be lost -+ * once the code is regenerated. -+ * -+ * @generated by codegen project: GenerateShadowNodeCpp.js -+ */ -+ -+#include -+ -+namespace facebook::react { -+ -+extern const char TrueSheetContainerViewComponentName[] = "TrueSheetContainerView"; -+extern const char TrueSheetContentViewComponentName[] = "TrueSheetContentView"; -+extern const char TrueSheetFooterViewComponentName[] = "TrueSheetFooterView"; -+extern const char TrueSheetHeaderViewComponentName[] = "TrueSheetHeaderView"; -+ -+} // namespace facebook::react -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/ShadowNodes.h b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/ShadowNodes.h -new file mode 100644 -index 0000000..8154eda ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/ShadowNodes.h -@@ -0,0 +1,65 @@ -+ -+/** -+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+ * -+ * Do not edit this file as changes may cause incorrect behavior and will be lost -+ * once the code is regenerated. -+ * -+ * @generated by codegen project: GenerateShadowNodeH.js -+ */ -+ -+#pragma once -+ -+#include -+#include -+#include -+#include -+#include -+ -+namespace facebook::react { -+ -+JSI_EXPORT extern const char TrueSheetContainerViewComponentName[]; -+ -+/* -+ * `ShadowNode` for component. -+ */ -+using TrueSheetContainerViewShadowNode = ConcreteViewShadowNode< -+ TrueSheetContainerViewComponentName, -+ TrueSheetContainerViewProps, -+ TrueSheetContainerViewEventEmitter, -+ TrueSheetContainerViewState>; -+ -+JSI_EXPORT extern const char TrueSheetContentViewComponentName[]; -+ -+/* -+ * `ShadowNode` for component. -+ */ -+using TrueSheetContentViewShadowNode = ConcreteViewShadowNode< -+ TrueSheetContentViewComponentName, -+ TrueSheetContentViewProps, -+ TrueSheetContentViewEventEmitter, -+ TrueSheetContentViewState>; -+ -+JSI_EXPORT extern const char TrueSheetFooterViewComponentName[]; -+ -+/* -+ * `ShadowNode` for component. -+ */ -+using TrueSheetFooterViewShadowNode = ConcreteViewShadowNode< -+ TrueSheetFooterViewComponentName, -+ TrueSheetFooterViewProps, -+ TrueSheetFooterViewEventEmitter, -+ TrueSheetFooterViewState>; -+ -+JSI_EXPORT extern const char TrueSheetHeaderViewComponentName[]; -+ -+/* -+ * `ShadowNode` for component. -+ */ -+using TrueSheetHeaderViewShadowNode = ConcreteViewShadowNode< -+ TrueSheetHeaderViewComponentName, -+ TrueSheetHeaderViewProps, -+ TrueSheetHeaderViewEventEmitter, -+ TrueSheetHeaderViewState>; -+ -+} // namespace facebook::react -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/States.cpp b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/States.cpp -new file mode 100644 -index 0000000..8903dac ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/States.cpp -@@ -0,0 +1,16 @@ -+ -+/** -+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+ * -+ * Do not edit this file as changes may cause incorrect behavior and will be lost -+ * once the code is regenerated. -+ * -+ * @generated by codegen project: GenerateStateCpp.js -+ */ -+#include -+ -+namespace facebook::react { -+ -+ -+ -+} // namespace facebook::react -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/States.h b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/States.h -new file mode 100644 -index 0000000..d4e3223 ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/States.h -@@ -0,0 +1,65 @@ -+/** -+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+ * -+ * Do not edit this file as changes may cause incorrect behavior and will be lost -+ * once the code is regenerated. -+ * -+ * @generated by codegen project: GenerateStateH.js -+ */ -+#pragma once -+ -+#ifdef ANDROID -+#include -+#endif -+ -+namespace facebook::react { -+ -+class TrueSheetContainerViewState { -+public: -+ TrueSheetContainerViewState() = default; -+ -+#ifdef ANDROID -+ TrueSheetContainerViewState(TrueSheetContainerViewState const &previousState, folly::dynamic data){}; -+ folly::dynamic getDynamic() const { -+ return {}; -+ }; -+#endif -+}; -+ -+class TrueSheetContentViewState { -+public: -+ TrueSheetContentViewState() = default; -+ -+#ifdef ANDROID -+ TrueSheetContentViewState(TrueSheetContentViewState const &previousState, folly::dynamic data){}; -+ folly::dynamic getDynamic() const { -+ return {}; -+ }; -+#endif -+}; -+ -+class TrueSheetFooterViewState { -+public: -+ TrueSheetFooterViewState() = default; -+ -+#ifdef ANDROID -+ TrueSheetFooterViewState(TrueSheetFooterViewState const &previousState, folly::dynamic data){}; -+ folly::dynamic getDynamic() const { -+ return {}; -+ }; -+#endif -+}; -+ -+class TrueSheetHeaderViewState { -+public: -+ TrueSheetHeaderViewState() = default; -+ -+#ifdef ANDROID -+ TrueSheetHeaderViewState(TrueSheetHeaderViewState const &previousState, folly::dynamic data){}; -+ folly::dynamic getDynamic() const { -+ return {}; -+ }; -+#endif -+}; -+ -+} // namespace facebook::react -\ No newline at end of file -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/TrueSheetSpecJSI-generated.cpp b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/TrueSheetSpecJSI-generated.cpp -new file mode 100644 -index 0000000..4f44db6 ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/TrueSheetSpecJSI-generated.cpp -@@ -0,0 +1,60 @@ -+/** -+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+ * -+ * Do not edit this file as changes may cause incorrect behavior and will be lost -+ * once the code is regenerated. -+ * -+ * @generated by codegen project: GenerateModuleCpp.js -+ */ -+ -+#include "TrueSheetSpecJSI.h" -+ -+namespace facebook::react { -+ -+static jsi::Value __hostFunction_NativeTrueSheetModuleCxxSpecJSI_presentByRef(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { -+ return static_cast(&turboModule)->presentByRef( -+ rt, -+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber(), -+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asNumber(), -+ count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asBool() -+ ); -+} -+static jsi::Value __hostFunction_NativeTrueSheetModuleCxxSpecJSI_dismissByRef(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { -+ return static_cast(&turboModule)->dismissByRef( -+ rt, -+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber(), -+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool() -+ ); -+} -+static jsi::Value __hostFunction_NativeTrueSheetModuleCxxSpecJSI_dismissStackByRef(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { -+ return static_cast(&turboModule)->dismissStackByRef( -+ rt, -+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber(), -+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool() -+ ); -+} -+static jsi::Value __hostFunction_NativeTrueSheetModuleCxxSpecJSI_resizeByRef(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { -+ return static_cast(&turboModule)->resizeByRef( -+ rt, -+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber(), -+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asNumber() -+ ); -+} -+static jsi::Value __hostFunction_NativeTrueSheetModuleCxxSpecJSI_dismissAll(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { -+ return static_cast(&turboModule)->dismissAll( -+ rt, -+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asBool() -+ ); -+} -+ -+NativeTrueSheetModuleCxxSpecJSI::NativeTrueSheetModuleCxxSpecJSI(std::shared_ptr jsInvoker) -+ : TurboModule("TrueSheetModule", jsInvoker) { -+ methodMap_["presentByRef"] = MethodMetadata {3, __hostFunction_NativeTrueSheetModuleCxxSpecJSI_presentByRef}; -+ methodMap_["dismissByRef"] = MethodMetadata {2, __hostFunction_NativeTrueSheetModuleCxxSpecJSI_dismissByRef}; -+ methodMap_["dismissStackByRef"] = MethodMetadata {2, __hostFunction_NativeTrueSheetModuleCxxSpecJSI_dismissStackByRef}; -+ methodMap_["resizeByRef"] = MethodMetadata {2, __hostFunction_NativeTrueSheetModuleCxxSpecJSI_resizeByRef}; -+ methodMap_["dismissAll"] = MethodMetadata {1, __hostFunction_NativeTrueSheetModuleCxxSpecJSI_dismissAll}; -+} -+ -+ -+} // namespace facebook::react -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/TrueSheetSpecJSI.h b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/TrueSheetSpecJSI.h -new file mode 100644 -index 0000000..558ae50 ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/jni/react/renderer/components/TrueSheetSpec/TrueSheetSpecJSI.h -@@ -0,0 +1,107 @@ -+/** -+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+ * -+ * Do not edit this file as changes may cause incorrect behavior and will be lost -+ * once the code is regenerated. -+ * -+ * @generated by codegen project: GenerateModuleH.js -+ */ -+ -+#pragma once -+ -+#include -+#include -+ -+namespace facebook::react { -+ -+ -+ class JSI_EXPORT NativeTrueSheetModuleCxxSpecJSI : public TurboModule { -+protected: -+ NativeTrueSheetModuleCxxSpecJSI(std::shared_ptr jsInvoker); -+ -+public: -+ virtual jsi::Value presentByRef(jsi::Runtime &rt, double viewTag, double index, bool animated) = 0; -+ virtual jsi::Value dismissByRef(jsi::Runtime &rt, double viewTag, bool animated) = 0; -+ virtual jsi::Value dismissStackByRef(jsi::Runtime &rt, double viewTag, bool animated) = 0; -+ virtual jsi::Value resizeByRef(jsi::Runtime &rt, double viewTag, double index) = 0; -+ virtual jsi::Value dismissAll(jsi::Runtime &rt, bool animated) = 0; -+ -+}; -+ -+template -+class JSI_EXPORT NativeTrueSheetModuleCxxSpec : public TurboModule { -+public: -+ jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { -+ return delegate_.create(rt, propName); -+ } -+ -+ std::vector getPropertyNames(jsi::Runtime& runtime) override { -+ return delegate_.getPropertyNames(runtime); -+ } -+ -+ static constexpr std::string_view kModuleName = "TrueSheetModule"; -+ -+protected: -+ NativeTrueSheetModuleCxxSpec(std::shared_ptr jsInvoker) -+ : TurboModule(std::string{NativeTrueSheetModuleCxxSpec::kModuleName}, jsInvoker), -+ delegate_(reinterpret_cast(this), jsInvoker) {} -+ -+ -+private: -+ class Delegate : public NativeTrueSheetModuleCxxSpecJSI { -+ public: -+ Delegate(T *instance, std::shared_ptr jsInvoker) : -+ NativeTrueSheetModuleCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { -+ -+ } -+ -+ jsi::Value presentByRef(jsi::Runtime &rt, double viewTag, double index, bool animated) override { -+ static_assert( -+ bridging::getParameterCount(&T::presentByRef) == 4, -+ "Expected presentByRef(...) to have 4 parameters"); -+ -+ return bridging::callFromJs( -+ rt, &T::presentByRef, jsInvoker_, instance_, std::move(viewTag), std::move(index), std::move(animated)); -+ } -+ jsi::Value dismissByRef(jsi::Runtime &rt, double viewTag, bool animated) override { -+ static_assert( -+ bridging::getParameterCount(&T::dismissByRef) == 3, -+ "Expected dismissByRef(...) to have 3 parameters"); -+ -+ return bridging::callFromJs( -+ rt, &T::dismissByRef, jsInvoker_, instance_, std::move(viewTag), std::move(animated)); -+ } -+ jsi::Value dismissStackByRef(jsi::Runtime &rt, double viewTag, bool animated) override { -+ static_assert( -+ bridging::getParameterCount(&T::dismissStackByRef) == 3, -+ "Expected dismissStackByRef(...) to have 3 parameters"); -+ -+ return bridging::callFromJs( -+ rt, &T::dismissStackByRef, jsInvoker_, instance_, std::move(viewTag), std::move(animated)); -+ } -+ jsi::Value resizeByRef(jsi::Runtime &rt, double viewTag, double index) override { -+ static_assert( -+ bridging::getParameterCount(&T::resizeByRef) == 3, -+ "Expected resizeByRef(...) to have 3 parameters"); -+ -+ return bridging::callFromJs( -+ rt, &T::resizeByRef, jsInvoker_, instance_, std::move(viewTag), std::move(index)); -+ } -+ jsi::Value dismissAll(jsi::Runtime &rt, bool animated) override { -+ static_assert( -+ bridging::getParameterCount(&T::dismissAll) == 2, -+ "Expected dismissAll(...) to have 2 parameters"); -+ -+ return bridging::callFromJs( -+ rt, &T::dismissAll, jsInvoker_, instance_, std::move(animated)); -+ } -+ -+ private: -+ friend class NativeTrueSheetModuleCxxSpec; -+ T *instance_; -+ }; -+ -+ Delegate delegate_; -+}; -+ -+} // namespace facebook::react -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/schema.json b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/schema.json -new file mode 100644 -index 0000000..884abd2 ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/generated/source/codegen/schema.json -@@ -0,0 +1 @@ -+{"modules":{"TrueSheetContainerView":{"type":"Component","components":{"TrueSheetContainerView":{"extendsProps":[{"type":"ReactNativeBuiltInType","knownTypeName":"ReactNativeCoreViewProps"}],"events":[],"props":[],"commands":[]}}},"TrueSheetContentView":{"type":"Component","components":{"TrueSheetContentView":{"extendsProps":[{"type":"ReactNativeBuiltInType","knownTypeName":"ReactNativeCoreViewProps"}],"events":[],"props":[],"commands":[]}}},"TrueSheetFooterView":{"type":"Component","components":{"TrueSheetFooterView":{"extendsProps":[{"type":"ReactNativeBuiltInType","knownTypeName":"ReactNativeCoreViewProps"}],"events":[],"props":[],"commands":[]}}},"TrueSheetHeaderView":{"type":"Component","components":{"TrueSheetHeaderView":{"extendsProps":[{"type":"ReactNativeBuiltInType","knownTypeName":"ReactNativeCoreViewProps"}],"events":[],"props":[],"commands":[]}}},"TrueSheetView":{"type":"Component","components":{"TrueSheetView":{"interfaceOnly":true,"extendsProps":[{"type":"ReactNativeBuiltInType","knownTypeName":"ReactNativeCoreViewProps"}],"events":[{"name":"onMount","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[]}}},{"name":"onWillPresent","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[{"name":"index","optional":false,"typeAnnotation":{"type":"Int32TypeAnnotation"}},{"name":"position","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}},{"name":"detent","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}}]}}},{"name":"onDidPresent","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[{"name":"index","optional":false,"typeAnnotation":{"type":"Int32TypeAnnotation"}},{"name":"position","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}},{"name":"detent","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}}]}}},{"name":"onWillDismiss","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[]}}},{"name":"onDidDismiss","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[]}}},{"name":"onDetentChange","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[{"name":"index","optional":false,"typeAnnotation":{"type":"Int32TypeAnnotation"}},{"name":"position","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}},{"name":"detent","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}}]}}},{"name":"onDragBegin","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[{"name":"index","optional":false,"typeAnnotation":{"type":"Int32TypeAnnotation"}},{"name":"position","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}},{"name":"detent","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}}]}}},{"name":"onDragChange","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[{"name":"index","optional":false,"typeAnnotation":{"type":"Int32TypeAnnotation"}},{"name":"position","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}},{"name":"detent","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}}]}}},{"name":"onDragEnd","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[{"name":"index","optional":false,"typeAnnotation":{"type":"Int32TypeAnnotation"}},{"name":"position","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}},{"name":"detent","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}}]}}},{"name":"onPositionChange","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[{"name":"index","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}},{"name":"position","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}},{"name":"detent","optional":false,"typeAnnotation":{"type":"DoubleTypeAnnotation"}},{"name":"realtime","optional":false,"typeAnnotation":{"type":"BooleanTypeAnnotation"}}]}}},{"name":"onWillFocus","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[]}}},{"name":"onDidFocus","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[]}}},{"name":"onWillBlur","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[]}}},{"name":"onDidBlur","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[]}}},{"name":"onBackPress","optional":true,"bubblingType":"direct","typeAnnotation":{"type":"EventTypeAnnotation","argument":{"type":"ObjectTypeAnnotation","properties":[]}}}],"props":[{"name":"detents","optional":true,"typeAnnotation":{"type":"ArrayTypeAnnotation","elementType":{"type":"DoubleTypeAnnotation"}}},{"name":"maxContentHeight","optional":true,"typeAnnotation":{"type":"DoubleTypeAnnotation","default":0}},{"name":"maxContentWidth","optional":true,"typeAnnotation":{"type":"DoubleTypeAnnotation","default":0}},{"name":"cornerRadius","optional":true,"typeAnnotation":{"type":"DoubleTypeAnnotation","default":-1}},{"name":"elevation","optional":true,"typeAnnotation":{"type":"DoubleTypeAnnotation","default":-1}},{"name":"backgroundColor","optional":true,"typeAnnotation":{"type":"ReservedPropTypeAnnotation","name":"ColorPrimitive"}},{"name":"initialDetentIndex","optional":true,"typeAnnotation":{"type":"Int32TypeAnnotation","default":-1}},{"name":"dimmedDetentIndex","optional":true,"typeAnnotation":{"type":"Int32TypeAnnotation","default":0}},{"name":"backgroundBlur","optional":true,"typeAnnotation":{"type":"StringEnumTypeAnnotation","default":"none","options":["none","light","dark","default","extra-light","regular","prominent","system-ultra-thin-material","system-thin-material","system-material","system-thick-material","system-chrome-material","system-ultra-thin-material-light","system-thin-material-light","system-material-light","system-thick-material-light","system-chrome-material-light","system-ultra-thin-material-dark","system-thin-material-dark","system-material-dark","system-thick-material-dark","system-chrome-material-dark"]}},{"name":"anchor","optional":true,"typeAnnotation":{"type":"StringEnumTypeAnnotation","default":"center","options":["left","center","right"]}},{"name":"anchorOffset","optional":true,"typeAnnotation":{"type":"DoubleTypeAnnotation","default":16}},{"name":"insetAdjustment","optional":true,"typeAnnotation":{"type":"StringEnumTypeAnnotation","default":"automatic","options":["automatic","never"]}},{"name":"blurOptions","optional":true,"typeAnnotation":{"type":"ObjectTypeAnnotation","properties":[{"name":"intensity","optional":true,"typeAnnotation":{"type":"DoubleTypeAnnotation","default":-1}},{"name":"interaction","optional":true,"typeAnnotation":{"type":"BooleanTypeAnnotation","default":true}}]}},{"name":"grabber","optional":true,"typeAnnotation":{"type":"BooleanTypeAnnotation","default":true}},{"name":"grabberOptions","optional":true,"typeAnnotation":{"type":"ObjectTypeAnnotation","properties":[{"name":"width","optional":true,"typeAnnotation":{"type":"DoubleTypeAnnotation","default":0}},{"name":"height","optional":true,"typeAnnotation":{"type":"DoubleTypeAnnotation","default":0}},{"name":"topMargin","optional":true,"typeAnnotation":{"type":"DoubleTypeAnnotation","default":0}},{"name":"cornerRadius","optional":true,"typeAnnotation":{"type":"DoubleTypeAnnotation","default":-1}},{"name":"color","optional":true,"typeAnnotation":{"type":"ReservedPropTypeAnnotation","name":"ColorPrimitive"}},{"name":"adaptive","optional":true,"typeAnnotation":{"type":"BooleanTypeAnnotation","default":true}}]}},{"name":"dismissible","optional":true,"typeAnnotation":{"type":"BooleanTypeAnnotation","default":true}},{"name":"draggable","optional":true,"typeAnnotation":{"type":"BooleanTypeAnnotation","default":true}},{"name":"dimmed","optional":true,"typeAnnotation":{"type":"BooleanTypeAnnotation","default":true}},{"name":"initialDetentAnimated","optional":true,"typeAnnotation":{"type":"BooleanTypeAnnotation","default":true}},{"name":"scrollable","optional":true,"typeAnnotation":{"type":"BooleanTypeAnnotation","default":false}},{"name":"scrollableOptions","optional":true,"typeAnnotation":{"type":"ObjectTypeAnnotation","properties":[{"name":"keyboardScrollOffset","optional":true,"typeAnnotation":{"type":"DoubleTypeAnnotation","default":0}}]}},{"name":"pageSizing","optional":true,"typeAnnotation":{"type":"BooleanTypeAnnotation","default":true}}],"commands":[]}}},"NativeTrueSheetModule":{"type":"NativeModule","aliasMap":{},"enumMap":{},"spec":{"eventEmitters":[],"methods":[{"name":"presentByRef","optional":false,"typeAnnotation":{"type":"FunctionTypeAnnotation","returnTypeAnnotation":{"type":"PromiseTypeAnnotation","elementType":{"type":"VoidTypeAnnotation"}},"params":[{"name":"viewTag","optional":false,"typeAnnotation":{"type":"NumberTypeAnnotation"}},{"name":"index","optional":false,"typeAnnotation":{"type":"NumberTypeAnnotation"}},{"name":"animated","optional":false,"typeAnnotation":{"type":"BooleanTypeAnnotation"}}]}},{"name":"dismissByRef","optional":false,"typeAnnotation":{"type":"FunctionTypeAnnotation","returnTypeAnnotation":{"type":"PromiseTypeAnnotation","elementType":{"type":"VoidTypeAnnotation"}},"params":[{"name":"viewTag","optional":false,"typeAnnotation":{"type":"NumberTypeAnnotation"}},{"name":"animated","optional":false,"typeAnnotation":{"type":"BooleanTypeAnnotation"}}]}},{"name":"dismissStackByRef","optional":false,"typeAnnotation":{"type":"FunctionTypeAnnotation","returnTypeAnnotation":{"type":"PromiseTypeAnnotation","elementType":{"type":"VoidTypeAnnotation"}},"params":[{"name":"viewTag","optional":false,"typeAnnotation":{"type":"NumberTypeAnnotation"}},{"name":"animated","optional":false,"typeAnnotation":{"type":"BooleanTypeAnnotation"}}]}},{"name":"resizeByRef","optional":false,"typeAnnotation":{"type":"FunctionTypeAnnotation","returnTypeAnnotation":{"type":"PromiseTypeAnnotation","elementType":{"type":"VoidTypeAnnotation"}},"params":[{"name":"viewTag","optional":false,"typeAnnotation":{"type":"NumberTypeAnnotation"}},{"name":"index","optional":false,"typeAnnotation":{"type":"NumberTypeAnnotation"}}]}},{"name":"dismissAll","optional":false,"typeAnnotation":{"type":"FunctionTypeAnnotation","returnTypeAnnotation":{"type":"PromiseTypeAnnotation","elementType":{"type":"VoidTypeAnnotation"}},"params":[{"name":"animated","optional":false,"typeAnnotation":{"type":"BooleanTypeAnnotation"}}]}}]},"moduleName":"TrueSheetModule"}}} -\ No newline at end of file -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml -new file mode 100644 -index 0000000..bc496d1 ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml -@@ -0,0 +1,7 @@ -+ -+ -+ -+ -+ -+ -\ No newline at end of file -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json -new file mode 100644 -index 0000000..9fc3aab ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json -@@ -0,0 +1,18 @@ -+{ -+ "version": 3, -+ "artifactType": { -+ "type": "AAPT_FRIENDLY_MERGED_MANIFESTS", -+ "kind": "Directory" -+ }, -+ "applicationId": "com.lodev09.truesheet", -+ "variantName": "debug", -+ "elements": [ -+ { -+ "type": "SINGLE", -+ "filters": [], -+ "attributes": [], -+ "outputFile": "AndroidManifest.xml" -+ } -+ ], -+ "elementType": "File" -+} -\ No newline at end of file -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties -new file mode 100644 -index 0000000..1211b1e ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties -@@ -0,0 +1,6 @@ -+aarFormatVersion=1.0 -+aarMetadataVersion=1.0 -+minCompileSdk=1 -+minCompileSdkExtension=0 -+minAndroidGradlePluginVersion=1.0.0 -+coreLibraryDesugaringEnabled=false -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json - -new file mode 100644 -index 0000000..a3a53e4 ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml -@@ -0,0 +1,2 @@ -+ -+ -\ No newline at end of file -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt -new file mode 100644 -index 0000000..78ac5b8 ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt -@@ -0,0 +1,2 @@ -+R_DEF: Internal format may change without notice -+local -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt -new file mode 100644 -index 0000000..543fbeb ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt -@@ -0,0 +1,7 @@ -+1 -+2 -+4 -+5 -+6 -+7 -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml -new file mode 100644 -index 0000000..bc496d1 ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml -@@ -0,0 +1,7 @@ -+ -+ -+ -+ -+ -+ -\ No newline at end of file -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json -new file mode 100644 -index 0000000..0637a08 ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json -@@ -0,0 +1 @@ -+[] -\ No newline at end of file -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt -new file mode 100644 -index 0000000..08f4ebe ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt -@@ -0,0 +1 @@ -+0 Warning/Error -\ No newline at end of file -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt -new file mode 100644 -index 0000000..b4281ca ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt -@@ -0,0 +1 @@ -+com.lodev09.truesheet -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/kotlin/compileDebugKotlin/cacheable/dirty-sources.txt b/node_modules/@lodev09/react-native-true-sheet/android/build/kotlin/compileDebugKotlin/cacheable/dirty-sources.txt -new file mode 100644 -index 0000000..9342c7a ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/kotlin/compileDebugKotlin/cacheable/dirty-sources.txt -@@ -0,0 +1,28 @@ -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterView.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/events/TrueSheetLifecycleEvents.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetView.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/utils/ViewUtils.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetHeaderViewManager.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetContentViewManager.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/events/TrueSheetDragEvents.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/core/TrueSheetCoordinatorLayout.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/events/TrueSheetStateEvents.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/core/RNScreensEventObserver.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerViewManager.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/utils/KeyboardUtils.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/core/TrueSheetDimView.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetContentView.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/core/TrueSheetGrabberView.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/core/TrueSheetBottomSheetView.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/core/TrueSheetKeyboardObserver.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/core/TrueSheetStackManager.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetPackage.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetViewManager.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetModule.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetHeaderView.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterViewManager.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/core/TrueSheetDetentCalculator.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/events/TrueSheetFocusEvents.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerView.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/utils/ScreenUtils.kt -+/Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetViewController.kt -\ No newline at end of file -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin b/node_modules/@lodev09/react-native-true-sheet/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin -new file mode 100644 -index 0000000..4f62add -Binary files /dev/null and b/node_modules/@lodev09/react-native-true-sheet/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin differ -diff --git a/node_modules/@lodev09/react-native-true-sheet/android/build/outputs/logs/manifest-merger-debug-report.txt b/node_modules/@lodev09/react-native-true-sheet/android/build/outputs/logs/manifest-merger-debug-report.txt -new file mode 100644 -index 0000000..f95831c ---- /dev/null -+++ b/node_modules/@lodev09/react-native-true-sheet/android/build/outputs/logs/manifest-merger-debug-report.txt -@@ -0,0 +1,16 @@ -+-- Merging decision tree log --- -+manifest -+ADDED from /Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/AndroidManifestNew.xml:1:1-2:12 -+INJECTED from /Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/AndroidManifestNew.xml:1:1-2:12 -+ package -+ INJECTED from /Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/AndroidManifestNew.xml -+ xmlns:android -+ ADDED from /Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/AndroidManifestNew.xml:1:11-69 -+uses-sdk -+INJECTED from /Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/AndroidManifestNew.xml reason: use-sdk injection requested -+INJECTED from /Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/AndroidManifestNew.xml -+INJECTED from /Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/AndroidManifestNew.xml -+ android:targetSdkVersion -+ INJECTED from /Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/AndroidManifestNew.xml -+ android:minSdkVersion -+ INJECTED from /Users/otavio.stasiak/Documents/rocketchat/Rocket.Chat.ReactNative/node_modules/@lodev09/react-native-true-sheet/android/src/main/AndroidManifestNew.xml diff --git a/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerViewManager.kt b/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerViewManager.kt index 359546c..e8d8f0a 100644 --- a/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerViewManager.kt +++ b/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerViewManager.kt @@ -1,10 +1,8 @@ package com.lodev09.truesheet - + import com.facebook.react.module.annotations.ReactModule -import com.facebook.react.uimanager.PointerEvents import com.facebook.react.uimanager.ThemedReactContext import com.facebook.react.uimanager.ViewGroupManager -import com.facebook.react.uimanager.annotations.ReactProp - + /** * ViewManager for TrueSheetContainerView @@ -17,11 +15,6 @@ class TrueSheetContainerViewManager : ViewGroupManager() - + override fun createViewInstance(reactContext: ThemedReactContext): TrueSheetContainerView = TrueSheetContainerView(reactContext) - + - @ReactProp(name = "pointerEvents") - fun setPointerEvents(view: TrueSheetContainerView, pointerEventsStr: String?) { - view.pointerEvents = PointerEvents.parsePointerEvents(pointerEventsStr) @@ -1920,19 +31,19 @@ index 2853192..2bf5fe5 100644 +++ b/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetContentViewManager.kt @@ -1,10 +1,8 @@ package com.lodev09.truesheet - + import com.facebook.react.module.annotations.ReactModule -import com.facebook.react.uimanager.PointerEvents import com.facebook.react.uimanager.ThemedReactContext import com.facebook.react.uimanager.ViewGroupManager -import com.facebook.react.uimanager.annotations.ReactProp - + /** * ViewManager for TrueSheetContentView @@ -17,11 +15,6 @@ class TrueSheetContentViewManager : ViewGroupManager() { - + override fun createViewInstance(reactContext: ThemedReactContext): TrueSheetContentView = TrueSheetContentView(reactContext) - + - @ReactProp(name = "pointerEvents") - fun setPointerEvents(view: TrueSheetContentView, pointerEventsStr: String?) { - view.pointerEvents = PointerEvents.parsePointerEvents(pointerEventsStr) @@ -1947,19 +58,19 @@ index aedf0a3..d317e6c 100644 +++ b/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterViewManager.kt @@ -1,10 +1,8 @@ package com.lodev09.truesheet - + import com.facebook.react.module.annotations.ReactModule -import com.facebook.react.uimanager.PointerEvents import com.facebook.react.uimanager.ThemedReactContext import com.facebook.react.uimanager.ViewGroupManager -import com.facebook.react.uimanager.annotations.ReactProp - + /** * ViewManager for TrueSheetFooterView @@ -17,11 +15,6 @@ class TrueSheetFooterViewManager : ViewGroupManager() { - + override fun createViewInstance(reactContext: ThemedReactContext): TrueSheetFooterView = TrueSheetFooterView(reactContext) - + - @ReactProp(name = "pointerEvents") - fun setPointerEvents(view: TrueSheetFooterView, pointerEventsStr: String?) { - view.pointerEvents = PointerEvents.parsePointerEvents(pointerEventsStr) @@ -1974,19 +85,19 @@ index a811616..bc43932 100644 +++ b/node_modules/@lodev09/react-native-true-sheet/android/src/main/java/com/lodev09/truesheet/TrueSheetHeaderViewManager.kt @@ -1,10 +1,8 @@ package com.lodev09.truesheet - + import com.facebook.react.module.annotations.ReactModule -import com.facebook.react.uimanager.PointerEvents import com.facebook.react.uimanager.ThemedReactContext import com.facebook.react.uimanager.ViewGroupManager -import com.facebook.react.uimanager.annotations.ReactProp - + /** * ViewManager for TrueSheetHeaderView @@ -17,11 +15,6 @@ class TrueSheetHeaderViewManager : ViewGroupManager() { - + override fun createViewInstance(reactContext: ThemedReactContext): TrueSheetHeaderView = TrueSheetHeaderView(reactContext) - + - @ReactProp(name = "pointerEvents") - fun setPointerEvents(view: TrueSheetHeaderView, pointerEventsStr: String?) { - view.pointerEvents = PointerEvents.parsePointerEvents(pointerEventsStr) From a0a68549647197cdcb019f9e572520b04d169415 Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Thu, 12 Mar 2026 12:24:55 -0300 Subject: [PATCH 52/98] fix: remove border rounded and fixing padding issues --- app/containers/ActionSheet/styles.ts | 4 +--- app/containers/ActionSheet/useActionSheetDetents.ts | 3 +-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/app/containers/ActionSheet/styles.ts b/app/containers/ActionSheet/styles.ts index 0ebf22651d2..5a98ca3b545 100644 --- a/app/containers/ActionSheet/styles.ts +++ b/app/containers/ActionSheet/styles.ts @@ -4,9 +4,7 @@ import sharedStyles from '../../views/Styles'; export default StyleSheet.create({ container: { - overflow: 'hidden', - borderTopLeftRadius: 16, - borderTopRightRadius: 16 + overflow: 'hidden' }, item: { paddingHorizontal: 16, diff --git a/app/containers/ActionSheet/useActionSheetDetents.ts b/app/containers/ActionSheet/useActionSheetDetents.ts index 42b930d7e9b..a4a782db019 100644 --- a/app/containers/ActionSheet/useActionSheetDetents.ts +++ b/app/containers/ActionSheet/useActionSheetDetents.ts @@ -5,7 +5,6 @@ const ACTION_SHEET_MIN_HEIGHT_FRACTION = 0.35; const ACTION_SHEET_MAX_HEIGHT_FRACTION = 0.75; export const HANDLE_HEIGHT = 28; const CANCEL_HEIGHT = 64; -const PADDING_BOTTOM = 22; function normalizeSnapsToDetents(snaps: (string | number)[]): number[] { return snaps @@ -65,7 +64,7 @@ export function useActionSheetDetents({ detents = [fraction]; } } else if (contentHeight > 0) { - const contentDetent = (contentHeight + bottomInset + PADDING_BOTTOM) / windowHeight; + const contentDetent = (contentHeight + bottomInset) / windowHeight; detents = [contentDetent]; } else { From ebd8f88c43abbf6b3201ad1ee23041cbd3394356 Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Thu, 12 Mar 2026 12:26:02 -0300 Subject: [PATCH 53/98] fix: list padding --- app/containers/ActionSheet/BottomSheetContent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/containers/ActionSheet/BottomSheetContent.tsx b/app/containers/ActionSheet/BottomSheetContent.tsx index e82110db6c5..929148f8cd5 100644 --- a/app/containers/ActionSheet/BottomSheetContent.tsx +++ b/app/containers/ActionSheet/BottomSheetContent.tsx @@ -29,7 +29,7 @@ const BottomSheetContent = React.memo( const { bottom } = useSafeAreaInsets(); const { fontScale } = useWindowDimensions(); const height = 48 * fontScale; - const paddingBottom = bottom + height; + const paddingBottom = isAndroid ? bottom + height : bottom; const minHeightStyle = isAndroid || !contentMinHeight ? undefined : { minHeight: contentMinHeight }; const renderFooter = () => From f4defa62a00ff3c1aeff7b55e74db304c73f9d05 Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Thu, 12 Mar 2026 12:36:54 -0300 Subject: [PATCH 54/98] adjust bottom padding --- app/containers/ActionSheet/ActionSheet.tsx | 2 +- app/containers/EmojiPicker/EmojiCategory.tsx | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index 8a82314c294..4a35973d680 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -110,7 +110,7 @@ const ActionSheet = React.memo( ? (() => { const snap = data.snaps[0]; const fraction = typeof snap === 'number' ? Math.min(1, Math.max(0.1, snap)) : (parseFloat(String(snap)) || 50) / 100; - return Math.max(0, windowHeight * fraction - HANDLE_HEIGHT - bottom); + return Math.max(0, windowHeight * fraction - HANDLE_HEIGHT); })() : undefined; diff --git a/app/containers/EmojiPicker/EmojiCategory.tsx b/app/containers/EmojiPicker/EmojiCategory.tsx index acb518d0ba5..e396e4dcf71 100644 --- a/app/containers/EmojiPicker/EmojiCategory.tsx +++ b/app/containers/EmojiPicker/EmojiCategory.tsx @@ -10,8 +10,10 @@ import { emojisByCategory } from '../../lib/constants/emojis'; import { useAppSelector } from '../../lib/hooks/useAppSelector'; import { useFrequentlyUsedEmoji } from '../../lib/hooks/useFrequentlyUsedEmoji'; import { type IEmojiCategoryProps, type TEmojiCategory } from './interfaces'; +import { isAndroid } from '../../lib/methods/helpers'; -const EMOJI_CATEGORY_BOTTOM_SHEET_PADDING = EMOJI_BUTTON_SIZE + 22; +const ANDROID_BOTTOM_SHEET_EXTRA_OFFSET = 24; +const ANDROID_BOTTOM_SHEET_CONTENT_PADDING = EMOJI_BUTTON_SIZE + ANDROID_BOTTOM_SHEET_EXTRA_OFFSET; const useEmojis = (category?: TEmojiCategory) => { const { frequentlyUsed, loaded } = useFrequentlyUsedEmoji(); @@ -57,7 +59,7 @@ const EmojiCategory = ({ const numColumns = Math.trunc(parentWidth / EMOJI_BUTTON_SIZE); const marginHorizontal = (parentWidth % EMOJI_BUTTON_SIZE) / 2; - const contentPaddingBottom = bottomSheet ? bottom + EMOJI_CATEGORY_BOTTOM_SHEET_PADDING : undefined; + const contentPaddingBottom = isAndroid && bottomSheet ? ANDROID_BOTTOM_SHEET_CONTENT_PADDING + bottom : undefined; const renderItem = ({ item }: { item: IEmoji }) => ; From d66c8128a4611092e203ee0ca8461daf0c7b64ea Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Thu, 12 Mar 2026 17:23:43 -0300 Subject: [PATCH 55/98] fix: android Directory view Actionsheet click and Servers List render --- app/lib/hooks/useVideoConf/index.tsx | 4 +++- app/views/DirectoryView/index.tsx | 3 ++- app/views/RoomsListView/components/ServersList.tsx | 8 ++++---- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/app/lib/hooks/useVideoConf/index.tsx b/app/lib/hooks/useVideoConf/index.tsx index 0c87ee73f39..20cf67ffad0 100644 --- a/app/lib/hooks/useVideoConf/index.tsx +++ b/app/lib/hooks/useVideoConf/index.tsx @@ -61,7 +61,9 @@ export const useVideoConf = ( if (canInit) { showActionSheet({ children: , - snaps: [480] + snaps: ['60%'], + enableContentPanningGesture: false, + fullContainer: true }); if (!permission?.granted) { diff --git a/app/views/DirectoryView/index.tsx b/app/views/DirectoryView/index.tsx index e827e732c50..8a55ed2c07c 100644 --- a/app/views/DirectoryView/index.tsx +++ b/app/views/DirectoryView/index.tsx @@ -181,7 +181,8 @@ class DirectoryView extends React.Component - ) + ), + enableContentPanningGesture: false }); }; diff --git a/app/views/RoomsListView/components/ServersList.tsx b/app/views/RoomsListView/components/ServersList.tsx index 850eea2375e..a1a052ae451 100644 --- a/app/views/RoomsListView/components/ServersList.tsx +++ b/app/views/RoomsListView/components/ServersList.tsx @@ -1,4 +1,4 @@ -import React, { memo, useEffect, useRef, useState } from 'react'; +import React, { memo, useLayoutEffect, useRef, useState } from 'react'; import { FlatList, Text, View } from 'react-native'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { batch, useDispatch } from 'react-redux'; @@ -39,10 +39,10 @@ const ServersList = () => { const { colors } = useTheme(); const insets = useSafeAreaInsets(); - useEffect(() => { - const init = async () => { + useLayoutEffect(() => { + const init = () => { const serversDB = database.servers; - const observable = await serversDB.get('servers').query().observeWithColumns(['name']); + const observable = serversDB.get('servers').query().observeWithColumns(['name']); subscription.current = observable.subscribe(data => { setServers(data); From 7662c7fcfeef9e023e5ea58e526335255155afd3 Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Thu, 12 Mar 2026 19:10:01 -0300 Subject: [PATCH 56/98] fix: orientation and unit test --- app/containers/ActionSheet/ActionSheet.tsx | 13 ++- app/containers/ActionSheet/Provider.tsx | 6 +- .../useActionSheetDetents.test.tsx | 94 +++++++++++++++++++ .../useVideoConf/StartACallActionSheet.tsx | 11 ++- app/lib/hooks/useVideoConf/index.tsx | 4 +- 5 files changed, 115 insertions(+), 13 deletions(-) create mode 100644 app/containers/ActionSheet/useActionSheetDetents.test.tsx diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index 4a35973d680..f0c2d3ae662 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -19,7 +19,7 @@ export const ACTION_SHEET_ANIMATION_DURATION = 250; const ActionSheet = React.memo( forwardRef(({ children }: { children: React.ReactElement }, ref) => { const { colors } = useTheme(); - const { height: windowHeight, fontScale } = useWindowDimensions(); + const { height: windowHeight, width: windowWidth, fontScale } = useWindowDimensions(); const { bottom } = useSafeAreaInsets(); const sheetRef = useRef(null); const [data, setData] = useState({} as TActionSheetOptions); @@ -89,26 +89,29 @@ const ActionSheet = React.memo( snapshotOnClose?.(); }; + const isPortrait = windowHeight > windowWidth; + const effectiveSnaps = (isPortrait ? data?.portraitSnaps : data?.landscapeSnaps) || data?.snaps; + const { detents, maxHeight } = useActionSheetDetents({ windowHeight, bottomInset: bottom, itemHeight, optionsLength: data?.options?.length || 0, - snaps: data?.snaps, + snaps: effectiveSnaps, headerHeight: data?.headerHeight, hasCancel: data?.hasCancel, contentHeight }); const hasOptions = !!data?.options?.length; - const hasSnaps = !!data?.snaps?.length; + const hasSnaps = !!effectiveSnaps?.length; const disableContentPanning = data?.enableContentPanningGesture === false; const isScrollable = hasOptions || (hasSnaps && !disableContentPanning); const contentMinHeight = - data.fullContainer && data.snaps?.length + data.fullContainer && effectiveSnaps?.length ? (() => { - const snap = data.snaps[0]; + const snap = effectiveSnaps[0]; const fraction = typeof snap === 'number' ? Math.min(1, Math.max(0.1, snap)) : (parseFloat(String(snap)) || 50) / 100; return Math.max(0, windowHeight * fraction - HANDLE_HEIGHT); })() diff --git a/app/containers/ActionSheet/Provider.tsx b/app/containers/ActionSheet/Provider.tsx index a85d03b3aaf..d55260c19ac 100644 --- a/app/containers/ActionSheet/Provider.tsx +++ b/app/containers/ActionSheet/Provider.tsx @@ -26,8 +26,12 @@ export type TActionSheetOptions = { hasCancel?: boolean; // children can both use snaps or dynamic children?: React.ReactElement | null; - /** Required if your action sheet needs vertical scroll */ + // Required if your action sheet needs vertical scroll */ snaps?: (string | number)[]; + // Optional snaps specifically for portrait orientation + portraitSnaps?: (string | number)[]; + // Optional snaps specifically for landscape orientation + landscapeSnaps?: (string | number)[]; onClose?: () => void; enableContentPanningGesture?: boolean; fullContainer?: boolean; diff --git a/app/containers/ActionSheet/useActionSheetDetents.test.tsx b/app/containers/ActionSheet/useActionSheetDetents.test.tsx new file mode 100644 index 00000000000..8bc9c0d6f01 --- /dev/null +++ b/app/containers/ActionSheet/useActionSheetDetents.test.tsx @@ -0,0 +1,94 @@ +import { renderHook } from '@testing-library/react-native'; + +import { useActionSheetDetents } from './useActionSheetDetents'; + +describe('useActionSheetDetents', () => { + const windowHeight = 1000; + + it('normalizes custom snaps when provided', () => { + const { result } = renderHook(() => + useActionSheetDetents({ + windowHeight, + bottomInset: 0, + itemHeight: 0, + optionsLength: 0, + snaps: [0.3, '80%', 2], + headerHeight: 0, + hasCancel: false, + contentHeight: 0 + }) + ); + + expect(result.current.detents).toEqual([0.3, 0.8, 1]); + }); + + it('returns two detents when options content is tall', () => { + const { result } = renderHook(() => + useActionSheetDetents({ + windowHeight, + bottomInset: 16, + itemHeight: 50, + optionsLength: 20, + snaps: undefined, + headerHeight: 24, + hasCancel: true, + contentHeight: 0 + }) + ); + + expect(result.current.maxHeight).toBe(windowHeight * 0.75); + expect(result.current.detents).toEqual([0.5, 0.75]); + }); + + it('returns a single clamped detent when options content is short', () => { + const { result } = renderHook(() => + useActionSheetDetents({ + windowHeight, + bottomInset: 10, + itemHeight: 20, + optionsLength: 3, + snaps: undefined, + headerHeight: 10, + hasCancel: false, + contentHeight: 0 + }) + ); + + expect(result.current.detents).toEqual([0.25]); + }); + + it('computes detent from content height when there are no options', () => { + const { result } = renderHook(() => + useActionSheetDetents({ + windowHeight, + bottomInset: 50, + itemHeight: 0, + optionsLength: 0, + snaps: undefined, + headerHeight: 0, + hasCancel: false, + contentHeight: 300 + }) + ); + + expect(result.current.detents).toEqual([(300 + 50) / windowHeight]); + }); + + it('falls back to minimum height when no content or options', () => { + const { result } = renderHook(() => + useActionSheetDetents({ + windowHeight, + bottomInset: 0, + itemHeight: 0, + optionsLength: 0, + snaps: undefined, + headerHeight: 0, + hasCancel: false, + contentHeight: 0 + }) + ); + + expect(result.current.detents).toEqual([0.35]); + }); +}); + diff --git a/app/lib/hooks/useVideoConf/StartACallActionSheet.tsx b/app/lib/hooks/useVideoConf/StartACallActionSheet.tsx index 24181810a1f..94e25374439 100644 --- a/app/lib/hooks/useVideoConf/StartACallActionSheet.tsx +++ b/app/lib/hooks/useVideoConf/StartACallActionSheet.tsx @@ -1,6 +1,6 @@ import { CameraView } from 'expo-camera'; import React, { useState } from 'react'; -import { StyleSheet, View } from 'react-native'; +import { StyleSheet, useWindowDimensions, View } from 'react-native'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { useDispatch } from 'react-redux'; @@ -28,13 +28,15 @@ export default function StartACallActionSheet({ const [cam, setCam] = useState(false); const [containerWidth, setContainerWidth] = useState(0); const { bottom } = useSafeAreaInsets(); + const { height, width } = useWindowDimensions(); const username = useAppSelector(state => getUserSelector(state).username); const calling = useAppSelector(state => state.videoConf.calling); const dispatch = useDispatch(); const user = useUserData(rid); - + const isPortrait = height > width; + const actionSheetContainerHeight = isPortrait ? '90%' : '75%'; React.useEffect( () => () => { if (calling) { @@ -46,7 +48,7 @@ export default function StartACallActionSheet({ return ( setContainerWidth(e.nativeEvent.layout.width / 2)}> {calling && roomType === SubscriptionType.DIRECT ? : null} Promise; callEnabled: boolean; disabledTooltip?: boolean } => { const user = useAppSelector(state => getUserSelector(state)); const serverVersion = useAppSelector(state => state.server.version); - const { callEnabled, disabledTooltip, roomType } = useVideoConfCall(rid); const [permission, requestPermission] = useCameraPermissions(); @@ -61,7 +60,8 @@ export const useVideoConf = ( if (canInit) { showActionSheet({ children: , - snaps: ['60%'], + portraitSnaps: ['60%'], + landscapeSnaps: ['90%'], enableContentPanningGesture: false, fullContainer: true }); From c19cadfdc7b6135947d235749c6bf6dc103aeefe Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Thu, 12 Mar 2026 22:12:14 +0000 Subject: [PATCH 57/98] chore: format code and fix lint issues --- app/containers/ActionSheet/useActionSheetDetents.test.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/app/containers/ActionSheet/useActionSheetDetents.test.tsx b/app/containers/ActionSheet/useActionSheetDetents.test.tsx index 8bc9c0d6f01..e888b7097b5 100644 --- a/app/containers/ActionSheet/useActionSheetDetents.test.tsx +++ b/app/containers/ActionSheet/useActionSheetDetents.test.tsx @@ -91,4 +91,3 @@ describe('useActionSheetDetents', () => { expect(result.current.detents).toEqual([0.35]); }); }); - From 7946eb408b08b3c84da7ab19326a6a73bc72226a Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Thu, 12 Mar 2026 19:20:12 -0300 Subject: [PATCH 58/98] fix: remve highlight of handle --- app/containers/ActionSheet/Handle.tsx | 8 +++++--- app/containers/EmojiPicker/PressableEmoji.tsx | 1 - 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/containers/ActionSheet/Handle.tsx b/app/containers/ActionSheet/Handle.tsx index 85d1df73a35..d969b8b8867 100644 --- a/app/containers/ActionSheet/Handle.tsx +++ b/app/containers/ActionSheet/Handle.tsx @@ -1,16 +1,18 @@ import React from 'react'; import { View } from 'react-native'; +import { Pressable } from 'react-native-gesture-handler'; import styles from './styles'; import { themes } from '../../lib/constants/colors'; import { useTheme } from '../../theme'; -import Touch from '../Touch'; export const Handle = ({ onPress }: { onPress: () => void }) => { const { theme } = useTheme(); + + // We should use Pressable from gesture-handler to avoid issues with the keyboard return ( - + - + ); }; diff --git a/app/containers/EmojiPicker/PressableEmoji.tsx b/app/containers/EmojiPicker/PressableEmoji.tsx index 9350ab25f7b..f29d1d45c35 100644 --- a/app/containers/EmojiPicker/PressableEmoji.tsx +++ b/app/containers/EmojiPicker/PressableEmoji.tsx @@ -7,7 +7,6 @@ import Touch from '../Touch'; export const PressableEmoji = ({ emoji, onPress }: { emoji: IEmoji; onPress: (emoji: IEmoji) => void }): React.ReactElement => { const accessibilityLabel = typeof emoji === 'string' ? emoji : emoji.name; - // we should use a Touchable component instead of a Touch component because Gesture handler is compatible with ActionSheet and TextInput typing return ( Date: Fri, 13 Mar 2026 12:54:22 -0300 Subject: [PATCH 59/98] cleanup --- app/containers/ActionSheet/ActionSheet.tsx | 9 --------- app/containers/ActionSheet/Provider.tsx | 2 +- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index f0c2d3ae662..a5a3f1db286 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -34,15 +34,7 @@ const ActionSheet = React.memo( setContentHeight(layout.height); }; - const cancelPendingPresent = () => { - if (presentTimerRef.current !== null) { - clearTimeout(presentTimerRef.current); - presentTimerRef.current = null; - } - }; - const hide = () => { - cancelPendingPresent(); onCloseSnapshotRef.current = data?.onClose; sheetRef.current?.dismiss(); Keyboard.dismiss(); @@ -50,7 +42,6 @@ const ActionSheet = React.memo( }; const show = (options: TActionSheetOptions) => { - cancelPendingPresent(); setData(options); setIsVisible(true); Keyboard.dismiss(); diff --git a/app/containers/ActionSheet/Provider.tsx b/app/containers/ActionSheet/Provider.tsx index d55260c19ac..849924daf1a 100644 --- a/app/containers/ActionSheet/Provider.tsx +++ b/app/containers/ActionSheet/Provider.tsx @@ -26,7 +26,7 @@ export type TActionSheetOptions = { hasCancel?: boolean; // children can both use snaps or dynamic children?: React.ReactElement | null; - // Required if your action sheet needs vertical scroll */ + // Required if your action sheet needs vertical scroll snaps?: (string | number)[]; // Optional snaps specifically for portrait orientation portraitSnaps?: (string | number)[]; From 6fc21de7704970d0af2bda6c76e50da1bc2c9f57 Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Sat, 14 Mar 2026 15:01:27 +0530 Subject: [PATCH 60/98] more bottom sheet changes --- app/containers/ActionSheet/ActionSheet.tsx | 10 ++++--- .../ActionSheet/BottomSheetContent.tsx | 6 ++-- .../ActionSheet/useActionSheetDetents.ts | 29 ++++++++++++++----- app/views/RoomMembersView/index.tsx | 3 +- ios/Podfile.lock | 6 ++-- 5 files changed, 37 insertions(+), 17 deletions(-) diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index a5a3f1db286..3afb20ced7f 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -1,13 +1,13 @@ import { useBackHandler } from '@react-native-community/hooks'; import * as Haptics from 'expo-haptics'; import React, { forwardRef, isValidElement, useImperativeHandle, useRef, useState } from 'react'; -import { Keyboard, type LayoutChangeEvent, useWindowDimensions } from 'react-native'; +import { Keyboard, type LayoutChangeEvent, Platform, useWindowDimensions } from 'react-native'; import { TrueSheet } from '@lodev09/react-native-true-sheet'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { GestureHandlerRootView } from 'react-native-gesture-handler'; import { useTheme } from '../../theme'; -import { isIOS } from '../../lib/methods/helpers'; +import { isAndroid, isIOS } from '../../lib/methods/helpers'; import { Handle } from './Handle'; import { type TActionSheetOptions } from './Provider'; import BottomSheetContent from './BottomSheetContent'; @@ -20,7 +20,6 @@ const ActionSheet = React.memo( forwardRef(({ children }: { children: React.ReactElement }, ref) => { const { colors } = useTheme(); const { height: windowHeight, width: windowWidth, fontScale } = useWindowDimensions(); - const { bottom } = useSafeAreaInsets(); const sheetRef = useRef(null); const [data, setData] = useState({} as TActionSheetOptions); const [isVisible, setIsVisible] = useState(false); @@ -28,6 +27,8 @@ const ActionSheet = React.memo( const presentTimerRef = useRef | null>(null); const onCloseSnapshotRef = useRef(undefined); + const isNewAndroid = isAndroid && Number(Platform.Version) >= 36; + const bottom = isIOS || isNewAndroid ? 0 : windowHeight * 0.03; const itemHeight = 48 * fontScale; const handleContentLayout = ({ nativeEvent: { layout } }: LayoutChangeEvent) => { @@ -83,7 +84,7 @@ const ActionSheet = React.memo( const isPortrait = windowHeight > windowWidth; const effectiveSnaps = (isPortrait ? data?.portraitSnaps : data?.landscapeSnaps) || data?.snaps; - const { detents, maxHeight } = useActionSheetDetents({ + const { detents, maxHeight, scrollEnabled } = useActionSheetDetents({ windowHeight, bottomInset: bottom, itemHeight, @@ -133,6 +134,7 @@ const ActionSheet = React.memo( onLayout={handleContentLayout} fullContainer={data.fullContainer} contentMinHeight={isIOS ? contentMinHeight : undefined} + scrollEnabled={scrollEnabled} /> diff --git a/app/containers/ActionSheet/BottomSheetContent.tsx b/app/containers/ActionSheet/BottomSheetContent.tsx index 929148f8cd5..7996da8597b 100644 --- a/app/containers/ActionSheet/BottomSheetContent.tsx +++ b/app/containers/ActionSheet/BottomSheetContent.tsx @@ -19,10 +19,11 @@ interface IBottomSheetContentProps { onLayout: ViewProps['onLayout']; fullContainer?: boolean; contentMinHeight?: number; + scrollEnabled?: boolean; } const BottomSheetContent = React.memo( - ({ options, hasCancel, hide, children, onLayout, fullContainer, contentMinHeight }: IBottomSheetContentProps) => { + ({ options, hasCancel, hide, children, onLayout, fullContainer, contentMinHeight, scrollEnabled }: IBottomSheetContentProps) => { 'use memo'; const { colors } = useTheme(); @@ -61,7 +62,8 @@ const BottomSheetContent = React.memo( ListHeaderComponent={List.Separator} ListFooterComponent={renderFooter} onLayout={onLayout} - nestedScrollEnabled={isAndroid} + scrollEnabled={scrollEnabled} + nestedScrollEnabled={scrollEnabled && isAndroid} /> ); } diff --git a/app/containers/ActionSheet/useActionSheetDetents.ts b/app/containers/ActionSheet/useActionSheetDetents.ts index a4a782db019..dda9ba294c9 100644 --- a/app/containers/ActionSheet/useActionSheetDetents.ts +++ b/app/containers/ActionSheet/useActionSheetDetents.ts @@ -1,5 +1,6 @@ import type { SheetDetent } from '@lodev09/react-native-true-sheet'; import { useMemo } from 'react'; +import { ToastAndroid } from 'react-native'; const ACTION_SHEET_MIN_HEIGHT_FRACTION = 0.35; const ACTION_SHEET_MAX_HEIGHT_FRACTION = 0.75; @@ -32,6 +33,10 @@ type UseActionSheetDetentsParams = { contentHeight: number; }; +function heightToDetent(height: number, screenHeight: number): number { + return Math.max(0, height / screenHeight); +} + export function useActionSheetDetents({ windowHeight, bottomInset, @@ -41,27 +46,37 @@ export function useActionSheetDetents({ headerHeight = 0, hasCancel = false, contentHeight -}: UseActionSheetDetentsParams): { detents: SheetDetent[]; maxHeight: number } { +}: UseActionSheetDetentsParams): { detents: SheetDetent[]; maxHeight: number, scrollEnabled: boolean } { return useMemo(() => { const maxHeight = windowHeight * ACTION_SHEET_MAX_HEIGHT_FRACTION; const hasOptions = optionsLength > 0; const maxSnap = hasOptions ? Math.min( - (itemHeight + 0.5) * optionsLength + HANDLE_HEIGHT + headerHeight + bottomInset + (hasCancel ? CANCEL_HEIGHT : 0), - maxHeight - ) + (itemHeight + 0.5) * optionsLength + HANDLE_HEIGHT + headerHeight + bottomInset + (hasCancel ? CANCEL_HEIGHT : 0), + maxHeight + ) : 0; let detents: SheetDetent[]; + let scrollEnabled = false; + if (snaps?.length) { detents = normalizeSnapsToDetents(snaps); } else if (hasOptions) { if (maxSnap > windowHeight * 0.6) { detents = [0.5, ACTION_SHEET_MAX_HEIGHT_FRACTION]; + ToastAndroid.show('Scrollable', ToastAndroid.SHORT); + scrollEnabled = true; } else { - const fraction = Math.max(0.25, Math.min(maxSnap / windowHeight, ACTION_SHEET_MAX_HEIGHT_FRACTION)); - detents = [fraction]; + const measuredHeight = + (optionsLength * itemHeight) + + HANDLE_HEIGHT + + headerHeight + + (hasCancel ? CANCEL_HEIGHT : bottomInset); + + scrollEnabled = false + detents = [heightToDetent(Math.round(measuredHeight), windowHeight)]; } } else if (contentHeight > 0) { const contentDetent = (contentHeight + bottomInset) / windowHeight; @@ -71,6 +86,6 @@ export function useActionSheetDetents({ detents = [ACTION_SHEET_MIN_HEIGHT_FRACTION]; } - return { detents, maxHeight }; + return { detents, maxHeight, scrollEnabled }; }, [bottomInset, contentHeight, hasCancel, headerHeight, itemHeight, optionsLength, snaps, windowHeight]); } diff --git a/app/views/RoomMembersView/index.tsx b/app/views/RoomMembersView/index.tsx index a285fe5f148..5e67b0a0a3a 100644 --- a/app/views/RoomMembersView/index.tsx +++ b/app/views/RoomMembersView/index.tsx @@ -268,7 +268,8 @@ const RoomMembersView = (): React.ReactElement => { right: () => , testID: 'room-members-view-toggle-status-all' } - ] + ], + enableContentPanningGesture: false }) } testID='room-members-view-filter' diff --git a/ios/Podfile.lock b/ios/Podfile.lock index bec60fa76db..7dda7ffd4c3 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -2606,7 +2606,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - RNTrueSheet (3.6.11): + - RNTrueSheet (3.7.3): - DoubleConversion - glog - hermes-engine @@ -3113,7 +3113,7 @@ SPEC CHECKSUMS: nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851 - RCT-Folly: 36fe2295e44b10d831836cc0d1daec5f8abcf809 + RCT-Folly: e78785aa9ba2ed998ea4151e314036f6c49e6d82 RCTDeprecation: 0418ac97b9f53b2e37f473da1663ef3061e46beb RCTRequired: b9fde7f981b11aa898f03a70d3d4d36b80f1b16d RCTTypeSafety: 397515ea9a8122b62a7a310adf30205f0a5e3bfc @@ -3204,7 +3204,7 @@ SPEC CHECKSUMS: RNReanimated: f52ccd5ceea2bae48d7421eec89b3f0c10d7b642 RNScreens: b13e4c45f0406f33986a39c0d8da0324bff94435 RNSVG: 680e961f640e381aab730a04b2371969686ed9f7 - RNTrueSheet: c32094ce4b285bf7f5208c10d9a84ab867fe2207 + RNTrueSheet: e9ee7ff82a7854295eac6fc225e54f1539e6cd7b SDWebImage: f84b0feeb08d2d11e6a9b843cb06d75ebf5b8868 SDWebImageAVIFCoder: 00310d246aab3232ce77f1d8f0076f8c4b021d90 SDWebImageSVGCoder: 15a300a97ec1c8ac958f009c02220ac0402e936c From 7d1f242e32c3505f66008c9b14deb83bbad8879d Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Mon, 16 Mar 2026 02:39:17 +0530 Subject: [PATCH 61/98] adjustment for android --- app/containers/ActionSheet/ActionSheet.tsx | 3 +-- app/containers/ActionSheet/useActionSheetDetents.ts | 4 +--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index 3afb20ced7f..8dcf9cc5f0c 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -3,7 +3,6 @@ import * as Haptics from 'expo-haptics'; import React, { forwardRef, isValidElement, useImperativeHandle, useRef, useState } from 'react'; import { Keyboard, type LayoutChangeEvent, Platform, useWindowDimensions } from 'react-native'; import { TrueSheet } from '@lodev09/react-native-true-sheet'; -import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { GestureHandlerRootView } from 'react-native-gesture-handler'; import { useTheme } from '../../theme'; @@ -97,7 +96,7 @@ const ActionSheet = React.memo( const hasOptions = !!data?.options?.length; const hasSnaps = !!effectiveSnaps?.length; - const disableContentPanning = data?.enableContentPanningGesture === false; + const disableContentPanning = data?.enableContentPanningGesture === false || !scrollEnabled; const isScrollable = hasOptions || (hasSnaps && !disableContentPanning); const contentMinHeight = diff --git a/app/containers/ActionSheet/useActionSheetDetents.ts b/app/containers/ActionSheet/useActionSheetDetents.ts index dda9ba294c9..eee6c146dac 100644 --- a/app/containers/ActionSheet/useActionSheetDetents.ts +++ b/app/containers/ActionSheet/useActionSheetDetents.ts @@ -1,11 +1,10 @@ import type { SheetDetent } from '@lodev09/react-native-true-sheet'; import { useMemo } from 'react'; -import { ToastAndroid } from 'react-native'; const ACTION_SHEET_MIN_HEIGHT_FRACTION = 0.35; const ACTION_SHEET_MAX_HEIGHT_FRACTION = 0.75; export const HANDLE_HEIGHT = 28; -const CANCEL_HEIGHT = 64; +const CANCEL_HEIGHT = 32; function normalizeSnapsToDetents(snaps: (string | number)[]): number[] { return snaps @@ -66,7 +65,6 @@ export function useActionSheetDetents({ } else if (hasOptions) { if (maxSnap > windowHeight * 0.6) { detents = [0.5, ACTION_SHEET_MAX_HEIGHT_FRACTION]; - ToastAndroid.show('Scrollable', ToastAndroid.SHORT); scrollEnabled = true; } else { const measuredHeight = From 301b0c35eba553d9f0fe04129505f4948a2ca45f Mon Sep 17 00:00:00 2001 From: Rohit3523 Date: Sun, 15 Mar 2026 21:11:54 +0000 Subject: [PATCH 62/98] chore: format code and fix lint issues --- app/containers/ActionSheet/BottomSheetContent.tsx | 11 ++++++++++- .../ActionSheet/useActionSheetDetents.ts | 15 ++++++--------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/app/containers/ActionSheet/BottomSheetContent.tsx b/app/containers/ActionSheet/BottomSheetContent.tsx index 7996da8597b..e1a0e0d1d43 100644 --- a/app/containers/ActionSheet/BottomSheetContent.tsx +++ b/app/containers/ActionSheet/BottomSheetContent.tsx @@ -23,7 +23,16 @@ interface IBottomSheetContentProps { } const BottomSheetContent = React.memo( - ({ options, hasCancel, hide, children, onLayout, fullContainer, contentMinHeight, scrollEnabled }: IBottomSheetContentProps) => { + ({ + options, + hasCancel, + hide, + children, + onLayout, + fullContainer, + contentMinHeight, + scrollEnabled + }: IBottomSheetContentProps) => { 'use memo'; const { colors } = useTheme(); diff --git a/app/containers/ActionSheet/useActionSheetDetents.ts b/app/containers/ActionSheet/useActionSheetDetents.ts index eee6c146dac..8e6fa0d20cf 100644 --- a/app/containers/ActionSheet/useActionSheetDetents.ts +++ b/app/containers/ActionSheet/useActionSheetDetents.ts @@ -45,16 +45,16 @@ export function useActionSheetDetents({ headerHeight = 0, hasCancel = false, contentHeight -}: UseActionSheetDetentsParams): { detents: SheetDetent[]; maxHeight: number, scrollEnabled: boolean } { +}: UseActionSheetDetentsParams): { detents: SheetDetent[]; maxHeight: number; scrollEnabled: boolean } { return useMemo(() => { const maxHeight = windowHeight * ACTION_SHEET_MAX_HEIGHT_FRACTION; const hasOptions = optionsLength > 0; const maxSnap = hasOptions ? Math.min( - (itemHeight + 0.5) * optionsLength + HANDLE_HEIGHT + headerHeight + bottomInset + (hasCancel ? CANCEL_HEIGHT : 0), - maxHeight - ) + (itemHeight + 0.5) * optionsLength + HANDLE_HEIGHT + headerHeight + bottomInset + (hasCancel ? CANCEL_HEIGHT : 0), + maxHeight + ) : 0; let detents: SheetDetent[]; @@ -68,12 +68,9 @@ export function useActionSheetDetents({ scrollEnabled = true; } else { const measuredHeight = - (optionsLength * itemHeight) + - HANDLE_HEIGHT + - headerHeight + - (hasCancel ? CANCEL_HEIGHT : bottomInset); + optionsLength * itemHeight + HANDLE_HEIGHT + headerHeight + (hasCancel ? CANCEL_HEIGHT : bottomInset); - scrollEnabled = false + scrollEnabled = false; detents = [heightToDetent(Math.round(measuredHeight), windowHeight)]; } } else if (contentHeight > 0) { From 8daab958e112b36c2cb4516b52defc22cc9acf4b Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Mon, 16 Mar 2026 03:00:18 +0530 Subject: [PATCH 63/98] rerun --- app/containers/ActionSheet/BottomSheetContent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/containers/ActionSheet/BottomSheetContent.tsx b/app/containers/ActionSheet/BottomSheetContent.tsx index 7996da8597b..e1c7748834a 100644 --- a/app/containers/ActionSheet/BottomSheetContent.tsx +++ b/app/containers/ActionSheet/BottomSheetContent.tsx @@ -32,7 +32,7 @@ const BottomSheetContent = React.memo( const height = 48 * fontScale; const paddingBottom = isAndroid ? bottom + height : bottom; const minHeightStyle = isAndroid || !contentMinHeight ? undefined : { minHeight: contentMinHeight }; - + const renderFooter = () => hasCancel ? ( Date: Mon, 16 Mar 2026 03:00:24 +0530 Subject: [PATCH 64/98] revert --- app/containers/ActionSheet/BottomSheetContent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/containers/ActionSheet/BottomSheetContent.tsx b/app/containers/ActionSheet/BottomSheetContent.tsx index e1c7748834a..7996da8597b 100644 --- a/app/containers/ActionSheet/BottomSheetContent.tsx +++ b/app/containers/ActionSheet/BottomSheetContent.tsx @@ -32,7 +32,7 @@ const BottomSheetContent = React.memo( const height = 48 * fontScale; const paddingBottom = isAndroid ? bottom + height : bottom; const minHeightStyle = isAndroid || !contentMinHeight ? undefined : { minHeight: contentMinHeight }; - + const renderFooter = () => hasCancel ? ( Date: Mon, 16 Mar 2026 03:08:40 +0530 Subject: [PATCH 65/98] test update --- app/containers/ActionSheet/useActionSheetDetents.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/containers/ActionSheet/useActionSheetDetents.test.tsx b/app/containers/ActionSheet/useActionSheetDetents.test.tsx index e888b7097b5..b2b77e73f69 100644 --- a/app/containers/ActionSheet/useActionSheetDetents.test.tsx +++ b/app/containers/ActionSheet/useActionSheetDetents.test.tsx @@ -54,7 +54,7 @@ describe('useActionSheetDetents', () => { }) ); - expect(result.current.detents).toEqual([0.25]); + expect(result.current.detents).toEqual([0.108]); }); it('computes detent from content height when there are no options', () => { From 930c88aa5e723a4f74e14621b3447abf9ad21f8c Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Mon, 16 Mar 2026 16:46:07 +0530 Subject: [PATCH 66/98] some improvements --- app/containers/ActionSheet/ActionSheet.tsx | 2 +- app/containers/ActionSheet/useActionSheetDetents.ts | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index 8dcf9cc5f0c..012e9c79027 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -74,7 +74,7 @@ const ActionSheet = React.memo( const onDidDismiss = () => { setIsVisible(false); - setContentHeight(0); + // Keep contentHeight to avoid flickering on next show const snapshotOnClose = onCloseSnapshotRef.current; onCloseSnapshotRef.current = undefined; snapshotOnClose?.(); diff --git a/app/containers/ActionSheet/useActionSheetDetents.ts b/app/containers/ActionSheet/useActionSheetDetents.ts index 8e6fa0d20cf..71b13308fcb 100644 --- a/app/containers/ActionSheet/useActionSheetDetents.ts +++ b/app/containers/ActionSheet/useActionSheetDetents.ts @@ -3,6 +3,7 @@ import { useMemo } from 'react'; const ACTION_SHEET_MIN_HEIGHT_FRACTION = 0.35; const ACTION_SHEET_MAX_HEIGHT_FRACTION = 0.75; +const SCROLL_ENABLED_THRESHOLD = 0.6; export const HANDLE_HEIGHT = 28; const CANCEL_HEIGHT = 32; @@ -63,12 +64,12 @@ export function useActionSheetDetents({ if (snaps?.length) { detents = normalizeSnapsToDetents(snaps); } else if (hasOptions) { - if (maxSnap > windowHeight * 0.6) { + if (maxSnap > windowHeight * SCROLL_ENABLED_THRESHOLD) { detents = [0.5, ACTION_SHEET_MAX_HEIGHT_FRACTION]; scrollEnabled = true; } else { const measuredHeight = - optionsLength * itemHeight + HANDLE_HEIGHT + headerHeight + (hasCancel ? CANCEL_HEIGHT : bottomInset); + optionsLength * itemHeight + HANDLE_HEIGHT + headerHeight + bottomInset + (hasCancel ? CANCEL_HEIGHT : 0); scrollEnabled = false; detents = [heightToDetent(Math.round(measuredHeight), windowHeight)]; From d0d218bdc7703a71acc49a9e17345a420014ff28 Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Mon, 16 Mar 2026 18:32:34 +0530 Subject: [PATCH 67/98] fix test --- .maestro/tests/teams/utils/close-action-sheet.yaml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.maestro/tests/teams/utils/close-action-sheet.yaml b/.maestro/tests/teams/utils/close-action-sheet.yaml index bd6d32cf6a8..8a19f95eebc 100644 --- a/.maestro/tests/teams/utils/close-action-sheet.yaml +++ b/.maestro/tests/teams/utils/close-action-sheet.yaml @@ -3,10 +3,8 @@ tags: - 'util' --- -- swipe: - from: - id: action-sheet-handle - direction: DOWN +- tapOn: + id: action-sheet-handle - extendedWaitUntil: notVisible: id: action-sheet-handle From 3bab46255588bc27c354a36ed3c3abe890fdd696 Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Mon, 16 Mar 2026 20:54:27 +0530 Subject: [PATCH 68/98] test fix --- .maestro/tests/room/share-message.yaml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.maestro/tests/room/share-message.yaml b/.maestro/tests/room/share-message.yaml index 73dac823f86..a3ffa96847a 100644 --- a/.maestro/tests/room/share-message.yaml +++ b/.maestro/tests/room/share-message.yaml @@ -74,10 +74,7 @@ tags: timeout: 60000 - tapOn: id: multi-select-item-${output.otherUser.username.toLowerCase()} -- swipe: - from: - id: 'action-sheet-handle' - direction: DOWN +- tapOn: Person or channel - extendedWaitUntil: notVisible: id: 'multi-select-search' From cd35041ba695fd4dea879c980e60ac56fb580cb3 Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Tue, 17 Mar 2026 00:29:54 +0530 Subject: [PATCH 69/98] Remove unused bottomSheet prop --- .../ActionSheet/ActionSheetContentWithInputAndSubmit/index.tsx | 2 -- app/containers/EmojiPicker/EmojiSearch.tsx | 2 -- app/containers/TextInput/FormTextInput.tsx | 2 -- app/containers/UIKit/MultiSelect/MultiSelectContent.tsx | 1 - .../components/ConfirmEmailChangeActionSheetContent/index.tsx | 1 - .../components/DeleteAccountActionSheetContent/index.tsx | 1 - 6 files changed, 9 deletions(-) diff --git a/app/containers/ActionSheet/ActionSheetContentWithInputAndSubmit/index.tsx b/app/containers/ActionSheet/ActionSheetContentWithInputAndSubmit/index.tsx index d4315d2b375..e25a2444104 100644 --- a/app/containers/ActionSheet/ActionSheetContentWithInputAndSubmit/index.tsx +++ b/app/containers/ActionSheet/ActionSheetContentWithInputAndSubmit/index.tsx @@ -137,7 +137,6 @@ const ActionSheetContentWithInputAndSubmit = ({ inputRef={inputRefs.current[index] as any} testID={`${testID}-input-${inputConfig.key}`} secureTextEntry={inputConfig.secureTextEntry} - bottomSheet={isIOS} /> )); } @@ -156,7 +155,6 @@ const ActionSheetContentWithInputAndSubmit = ({ autoComplete={autoComplete} testID={`${testID}-input`} secureTextEntry={secureTextEntry} - bottomSheet={isIOS} containerStyle={{ marginTop: 12, marginBottom: 36 }} /> ); diff --git a/app/containers/EmojiPicker/EmojiSearch.tsx b/app/containers/EmojiPicker/EmojiSearch.tsx index 3c1cd284ba5..cc110d7e267 100644 --- a/app/containers/EmojiPicker/EmojiSearch.tsx +++ b/app/containers/EmojiPicker/EmojiSearch.tsx @@ -3,7 +3,6 @@ import React, { useState } from 'react'; import { FormTextInput } from '../TextInput/FormTextInput'; import { useTheme } from '../../theme'; import I18n from '../../i18n'; -import { isIOS } from '../../lib/methods/helpers'; import { type IEmojiSearchBarProps } from './interfaces'; import styles from './styles'; @@ -38,7 +37,6 @@ export const EmojiSearch = ({ onBlur, onChangeText, bottomSheet }: IEmojiSearchB onBlur={onBlur} iconRight={'search'} testID='emoji-searchbar-input' - bottomSheet={bottomSheet && isIOS} autoFocus={!bottomSheet} // focus on input when not in reaction picker /> ); diff --git a/app/containers/TextInput/FormTextInput.tsx b/app/containers/TextInput/FormTextInput.tsx index cef2bd132e9..af0d5541b91 100644 --- a/app/containers/TextInput/FormTextInput.tsx +++ b/app/containers/TextInput/FormTextInput.tsx @@ -90,7 +90,6 @@ export interface IRCTextInputProps extends TextInputProps { iconLeft?: TIconsName; iconRight?: TIconsName; left?: JSX.Element; - bottomSheet?: boolean; onClearInput?: () => void; } @@ -118,7 +117,6 @@ export const FormTextInput = ({ left, testID, secureTextEntry, - bottomSheet, placeholder, accessibilityLabel, showErrorMessage = true, diff --git a/app/containers/UIKit/MultiSelect/MultiSelectContent.tsx b/app/containers/UIKit/MultiSelect/MultiSelectContent.tsx index 268f60c3bb8..6c1a3dc3868 100644 --- a/app/containers/UIKit/MultiSelect/MultiSelectContent.tsx +++ b/app/containers/UIKit/MultiSelect/MultiSelectContent.tsx @@ -72,7 +72,6 @@ export const MultiSelectContent = React.memo( onChangeText={handleSearch} placeholder={I18n.t('Search')} inputStyle={{ backgroundColor: colors.surfaceLight }} - bottomSheet={true} onSubmitEditing={() => { setTimeout(() => { hideActionSheet(); diff --git a/app/views/ProfileView/components/ConfirmEmailChangeActionSheetContent/index.tsx b/app/views/ProfileView/components/ConfirmEmailChangeActionSheetContent/index.tsx index 967fd284bf5..319fdf05ecc 100644 --- a/app/views/ProfileView/components/ConfirmEmailChangeActionSheetContent/index.tsx +++ b/app/views/ProfileView/components/ConfirmEmailChangeActionSheetContent/index.tsx @@ -104,7 +104,6 @@ const ConfirmEmailChangeActionSheetContent = ({ autoComplete='password' testID='profile-view-enter-password-sheet-input' secureTextEntry - bottomSheet={true} containerStyle={styles.inputContainer} error={errors.password?.message} /> diff --git a/app/views/ProfileView/components/DeleteAccountActionSheetContent/index.tsx b/app/views/ProfileView/components/DeleteAccountActionSheetContent/index.tsx index 8f93ccc1b8f..673177ea4a9 100644 --- a/app/views/ProfileView/components/DeleteAccountActionSheetContent/index.tsx +++ b/app/views/ProfileView/components/DeleteAccountActionSheetContent/index.tsx @@ -109,7 +109,6 @@ const DeleteAccountActionSheetContent = (): React.ReactElement => { autoComplete='password' testID='profile-view-delete-account-sheet-input' secureTextEntry - bottomSheet={isIOS} containerStyle={styles.inputContainer} error={errors.password?.message} /> From 35b55df00ae0fd3fe9f2612d70be30259bff7bb1 Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Tue, 17 Mar 2026 01:12:06 +0530 Subject: [PATCH 70/98] memorise bottom sheet handle --- app/containers/ActionSheet/Handle.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/containers/ActionSheet/Handle.tsx b/app/containers/ActionSheet/Handle.tsx index d969b8b8867..325d153b121 100644 --- a/app/containers/ActionSheet/Handle.tsx +++ b/app/containers/ActionSheet/Handle.tsx @@ -7,6 +7,8 @@ import { themes } from '../../lib/constants/colors'; import { useTheme } from '../../theme'; export const Handle = ({ onPress }: { onPress: () => void }) => { + 'use memo'; + const { theme } = useTheme(); // We should use Pressable from gesture-handler to avoid issues with the keyboard From 50e1ffcb37a685f4062ef5e4d1448689ef53f73f Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Tue, 17 Mar 2026 01:12:24 +0530 Subject: [PATCH 71/98] remove unused import --- .../ActionSheet/ActionSheetContentWithInputAndSubmit/index.tsx | 1 - .../components/DeleteAccountActionSheetContent/index.tsx | 1 - 2 files changed, 2 deletions(-) diff --git a/app/containers/ActionSheet/ActionSheetContentWithInputAndSubmit/index.tsx b/app/containers/ActionSheet/ActionSheetContentWithInputAndSubmit/index.tsx index e25a2444104..8ae1f030cc7 100644 --- a/app/containers/ActionSheet/ActionSheetContentWithInputAndSubmit/index.tsx +++ b/app/containers/ActionSheet/ActionSheetContentWithInputAndSubmit/index.tsx @@ -3,7 +3,6 @@ import { StyleSheet, Text, type TextInputProps, View } from 'react-native'; import { CustomIcon, type TIconsName } from '../../CustomIcon'; import i18n from '../../../i18n'; -import { isIOS } from '../../../lib/methods/helpers'; import { useTheme } from '../../../theme'; import sharedStyles from '../../../views/Styles'; import Button from '../../Button'; diff --git a/app/views/ProfileView/components/DeleteAccountActionSheetContent/index.tsx b/app/views/ProfileView/components/DeleteAccountActionSheetContent/index.tsx index 673177ea4a9..36b5fe853bf 100644 --- a/app/views/ProfileView/components/DeleteAccountActionSheetContent/index.tsx +++ b/app/views/ProfileView/components/DeleteAccountActionSheetContent/index.tsx @@ -11,7 +11,6 @@ import ConfirmDeleteAccountContent from './ConfirmDeleteAccountContent'; import { deleteOwnAccount } from '../../../../lib/services/restApi'; import { deleteAccount } from '../../../../actions/login'; import { CustomIcon } from '../../../../containers/CustomIcon'; -import { isIOS } from '../../../../lib/methods/helpers'; import { useTheme } from '../../../../theme'; import { ControlledFormTextInput } from '../../../../containers/TextInput'; import { useActionSheet } from '../../../../containers/ActionSheet/Provider'; From ec14b2870587cfb3c9c41a48495fce420828d833 Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Tue, 17 Mar 2026 01:36:56 +0530 Subject: [PATCH 72/98] ios test fix --- .maestro/tests/room/share-message.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.maestro/tests/room/share-message.yaml b/.maestro/tests/room/share-message.yaml index a3ffa96847a..f0c7b40d107 100644 --- a/.maestro/tests/room/share-message.yaml +++ b/.maestro/tests/room/share-message.yaml @@ -74,7 +74,8 @@ tags: timeout: 60000 - tapOn: id: multi-select-item-${output.otherUser.username.toLowerCase()} -- tapOn: Person or channel +# this is to hide bottom sheet and keyboard together +- tapOn: '.*Person or channel.*' - extendedWaitUntil: notVisible: id: 'multi-select-search' From 28d906222b5a041bae8584d8329b00ef30f27961 Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Tue, 17 Mar 2026 01:43:05 +0530 Subject: [PATCH 73/98] clear timeout --- app/containers/ActionSheet/ActionSheet.tsx | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index 012e9c79027..69ef8255f64 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -35,6 +35,10 @@ const ActionSheet = React.memo( }; const hide = () => { + if (presentTimerRef.current) { + clearTimeout(presentTimerRef.current); + presentTimerRef.current = null; + } onCloseSnapshotRef.current = data?.onClose; sheetRef.current?.dismiss(); Keyboard.dismiss(); @@ -42,6 +46,11 @@ const ActionSheet = React.memo( }; const show = (options: TActionSheetOptions) => { + // Clear any existing present timer to prevent stale presents + if (presentTimerRef.current) { + clearTimeout(presentTimerRef.current); + presentTimerRef.current = null; + } setData(options); setIsVisible(true); Keyboard.dismiss(); From fb40b8bb4b305a47e2bed062e8c723deccbb001d Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Tue, 17 Mar 2026 01:56:57 +0530 Subject: [PATCH 74/98] wait for animation to close --- .maestro/tests/accessibilityAndAppearance/ToastsAndDialogs.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.maestro/tests/accessibilityAndAppearance/ToastsAndDialogs.yml b/.maestro/tests/accessibilityAndAppearance/ToastsAndDialogs.yml index 60bcdfa6fcd..6a2b2cde33b 100644 --- a/.maestro/tests/accessibilityAndAppearance/ToastsAndDialogs.yml +++ b/.maestro/tests/accessibilityAndAppearance/ToastsAndDialogs.yml @@ -23,6 +23,8 @@ tags: - assertVisible: 'Dialogs. Require manual dismissal. Unchecked' - tapOn: id: 'action-sheet-handle' +- waitForAnimationToEnd: + timeout: 5000 - tapOn: 'Menu' - tapOn: 'Edit status' - tapOn: From fdaf54478ffbccf5630d1f0422b161f09cc26571 Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Tue, 17 Mar 2026 02:33:53 +0530 Subject: [PATCH 75/98] lint fix --- app/containers/ActionSheet/ActionSheet.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index 69ef8255f64..4905a7b45db 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -131,19 +131,19 @@ const ActionSheet = React.memo( draggable={!disableContentPanning} header={renderHeader()} scrollable={isScrollable} - style={[styles.container]} + style={styles.container} onDidDismiss={onDidDismiss}> + scrollEnabled={scrollEnabled}> + {data?.children} + From 05c7b5ac46e2fd0629c4346ae1b4b65b15d4ba73 Mon Sep 17 00:00:00 2001 From: Rohit3523 Date: Mon, 16 Mar 2026 21:10:55 +0000 Subject: [PATCH 76/98] chore: format code and fix lint issues --- tsconfig.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index b8e5a9b4bdb..bb3f37edb4d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,7 +4,7 @@ /* Basic Options */ // "incremental": true, /* Enable incremental compilation */ - "target": "esnext" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */, + "target": "esnext" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */, "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, // "lib": [], /* Specify library files to be included in the compilation. */ "allowJs": true /* Allow javascript files to be compiled. */, @@ -35,8 +35,8 @@ // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ /* Additional Checks */ - "noUnusedLocals": true, /* Report errors on unused locals. */ - "noUnusedParameters": true, /* Report errors on unused parameters. */ + "noUnusedLocals": true /* Report errors on unused locals. */, + "noUnusedParameters": true /* Report errors on unused parameters. */, // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ From 5064359838fdf5e67b41dc5b0697378cd6d7bf90 Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Tue, 17 Mar 2026 04:20:05 +0530 Subject: [PATCH 77/98] add comment for extra style --- app/containers/ActionSheet/ActionSheet.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index 4905a7b45db..4ccb57cb42b 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -26,6 +26,8 @@ const ActionSheet = React.memo( const presentTimerRef = useRef | null>(null); const onCloseSnapshotRef = useRef(undefined); + // TrueSheet detects the bottom inset for Android 16 and iOS + // To avoid content hiding behind navigation bar on older Android versions const isNewAndroid = isAndroid && Number(Platform.Version) >= 36; const bottom = isIOS || isNewAndroid ? 0 : windowHeight * 0.03; const itemHeight = 48 * fontScale; From 650104e3064190071dca6c57dd353ae6150867d5 Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Tue, 17 Mar 2026 04:20:12 +0530 Subject: [PATCH 78/98] tap on point to hide sheet --- .maestro/tests/room/share-message.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.maestro/tests/room/share-message.yaml b/.maestro/tests/room/share-message.yaml index f0c7b40d107..d7a339a9030 100644 --- a/.maestro/tests/room/share-message.yaml +++ b/.maestro/tests/room/share-message.yaml @@ -75,7 +75,8 @@ tags: - tapOn: id: multi-select-item-${output.otherUser.username.toLowerCase()} # this is to hide bottom sheet and keyboard together -- tapOn: '.*Person or channel.*' +- tapOn: + point: 5%,10% - extendedWaitUntil: notVisible: id: 'multi-select-search' From 8db5f906317b775f18e026bd0bb57d8a0a80d8d7 Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Wed, 18 Mar 2026 00:30:47 +0530 Subject: [PATCH 79/98] suggested changes by copilot and copilot --- .maestro/tests/room/share-message.yaml | 4 +--- app/containers/ActionSheet/ActionSheet.tsx | 3 +-- app/containers/ActionSheet/Handle.tsx | 8 +++++++- app/containers/ActionSheet/useActionSheetDetents.ts | 8 ++++++-- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/.maestro/tests/room/share-message.yaml b/.maestro/tests/room/share-message.yaml index d7a339a9030..01013195567 100644 --- a/.maestro/tests/room/share-message.yaml +++ b/.maestro/tests/room/share-message.yaml @@ -74,9 +74,7 @@ tags: timeout: 60000 - tapOn: id: multi-select-item-${output.otherUser.username.toLowerCase()} -# this is to hide bottom sheet and keyboard together -- tapOn: - point: 5%,10% +- runFlow: '../../helpers/hide-keyboard.yaml' - extendedWaitUntil: notVisible: id: 'multi-select-search' diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index 4ccb57cb42b..996af546a1b 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -41,7 +41,6 @@ const ActionSheet = React.memo( clearTimeout(presentTimerRef.current); presentTimerRef.current = null; } - onCloseSnapshotRef.current = data?.onClose; sheetRef.current?.dismiss(); Keyboard.dismiss(); Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); @@ -107,7 +106,7 @@ const ActionSheet = React.memo( const hasOptions = !!data?.options?.length; const hasSnaps = !!effectiveSnaps?.length; - const disableContentPanning = data?.enableContentPanningGesture === false || !scrollEnabled; + const disableContentPanning = data?.enableContentPanningGesture === false; const isScrollable = hasOptions || (hasSnaps && !disableContentPanning); const contentMinHeight = diff --git a/app/containers/ActionSheet/Handle.tsx b/app/containers/ActionSheet/Handle.tsx index 325d153b121..fd14f0d2d03 100644 --- a/app/containers/ActionSheet/Handle.tsx +++ b/app/containers/ActionSheet/Handle.tsx @@ -13,7 +13,13 @@ export const Handle = ({ onPress }: { onPress: () => void }) => { // We should use Pressable from gesture-handler to avoid issues with the keyboard return ( - + ); diff --git a/app/containers/ActionSheet/useActionSheetDetents.ts b/app/containers/ActionSheet/useActionSheetDetents.ts index 71b13308fcb..7ea57dd542a 100644 --- a/app/containers/ActionSheet/useActionSheetDetents.ts +++ b/app/containers/ActionSheet/useActionSheetDetents.ts @@ -75,8 +75,12 @@ export function useActionSheetDetents({ detents = [heightToDetent(Math.round(measuredHeight), windowHeight)]; } } else if (contentHeight > 0) { - const contentDetent = (contentHeight + bottomInset) / windowHeight; - + const rawContentDetent = (contentHeight + bottomInset) / windowHeight; + const contentDetent = Math.min( + ACTION_SHEET_MAX_HEIGHT_FRACTION, + Math.max(ACTION_SHEET_MIN_HEIGHT_FRACTION, rawContentDetent) + ); + detents = [contentDetent]; } else { detents = [ACTION_SHEET_MIN_HEIGHT_FRACTION]; From d3f23e705417ea37ad2b43414b925b07770b87f8 Mon Sep 17 00:00:00 2001 From: Rohit3523 Date: Tue, 17 Mar 2026 19:03:37 +0000 Subject: [PATCH 80/98] chore: format code and fix lint issues --- app/containers/ActionSheet/useActionSheetDetents.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/containers/ActionSheet/useActionSheetDetents.ts b/app/containers/ActionSheet/useActionSheetDetents.ts index 7ea57dd542a..fb37af2cf9c 100644 --- a/app/containers/ActionSheet/useActionSheetDetents.ts +++ b/app/containers/ActionSheet/useActionSheetDetents.ts @@ -80,7 +80,7 @@ export function useActionSheetDetents({ ACTION_SHEET_MAX_HEIGHT_FRACTION, Math.max(ACTION_SHEET_MIN_HEIGHT_FRACTION, rawContentDetent) ); - + detents = [contentDetent]; } else { detents = [ACTION_SHEET_MIN_HEIGHT_FRACTION]; From c03938cb9d892b364f74ea1e0f1c5202790790aa Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Wed, 18 Mar 2026 00:44:15 +0530 Subject: [PATCH 81/98] revert the test --- .maestro/tests/room/share-message.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.maestro/tests/room/share-message.yaml b/.maestro/tests/room/share-message.yaml index 01013195567..d7a339a9030 100644 --- a/.maestro/tests/room/share-message.yaml +++ b/.maestro/tests/room/share-message.yaml @@ -74,7 +74,9 @@ tags: timeout: 60000 - tapOn: id: multi-select-item-${output.otherUser.username.toLowerCase()} -- runFlow: '../../helpers/hide-keyboard.yaml' +# this is to hide bottom sheet and keyboard together +- tapOn: + point: 5%,10% - extendedWaitUntil: notVisible: id: 'multi-select-search' From 0e45349f76a20605d0d012ac9b15b06df9b5a33f Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Wed, 18 Mar 2026 02:39:09 +0530 Subject: [PATCH 82/98] Change sheet min height --- app/containers/ActionSheet/useActionSheetDetents.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/containers/ActionSheet/useActionSheetDetents.ts b/app/containers/ActionSheet/useActionSheetDetents.ts index fb37af2cf9c..a47cac2ee59 100644 --- a/app/containers/ActionSheet/useActionSheetDetents.ts +++ b/app/containers/ActionSheet/useActionSheetDetents.ts @@ -1,7 +1,7 @@ import type { SheetDetent } from '@lodev09/react-native-true-sheet'; import { useMemo } from 'react'; -const ACTION_SHEET_MIN_HEIGHT_FRACTION = 0.35; +const ACTION_SHEET_MIN_HEIGHT_FRACTION = 0.15; const ACTION_SHEET_MAX_HEIGHT_FRACTION = 0.75; const SCROLL_ENABLED_THRESHOLD = 0.6; export const HANDLE_HEIGHT = 28; From dbffe976e82c1100ac728e742b8ff8fe44a12bc1 Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Wed, 18 Mar 2026 02:47:34 +0530 Subject: [PATCH 83/98] disable content panning for android --- app/containers/ActionSheet/ActionSheet.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index 996af546a1b..c129a80d2ee 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -106,7 +106,7 @@ const ActionSheet = React.memo( const hasOptions = !!data?.options?.length; const hasSnaps = !!effectiveSnaps?.length; - const disableContentPanning = data?.enableContentPanningGesture === false; + const disableContentPanning = data?.enableContentPanningGesture === false || (!scrollEnabled && isAndroid) const isScrollable = hasOptions || (hasSnaps && !disableContentPanning); const contentMinHeight = From d33a79661c2e22387653cb1413190f8245c9bb7b Mon Sep 17 00:00:00 2001 From: Rohit3523 Date: Tue, 17 Mar 2026 21:21:03 +0000 Subject: [PATCH 84/98] chore: format code and fix lint issues --- app/containers/ActionSheet/ActionSheet.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index c129a80d2ee..5bc18e186df 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -106,7 +106,7 @@ const ActionSheet = React.memo( const hasOptions = !!data?.options?.length; const hasSnaps = !!effectiveSnaps?.length; - const disableContentPanning = data?.enableContentPanningGesture === false || (!scrollEnabled && isAndroid) + const disableContentPanning = data?.enableContentPanningGesture === false || (!scrollEnabled && isAndroid); const isScrollable = hasOptions || (hasSnaps && !disableContentPanning); const contentMinHeight = From 719c192e7938d00c15eea90b0cdf600d067cff79 Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Wed, 18 Mar 2026 03:24:37 +0530 Subject: [PATCH 85/98] rerun --- app/containers/ActionSheet/useActionSheetDetents.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/containers/ActionSheet/useActionSheetDetents.ts b/app/containers/ActionSheet/useActionSheetDetents.ts index a47cac2ee59..6d00d2a69ea 100644 --- a/app/containers/ActionSheet/useActionSheetDetents.ts +++ b/app/containers/ActionSheet/useActionSheetDetents.ts @@ -1,5 +1,5 @@ import type { SheetDetent } from '@lodev09/react-native-true-sheet'; -import { useMemo } from 'react'; +import { useMemo } from 'react'; const ACTION_SHEET_MIN_HEIGHT_FRACTION = 0.15; const ACTION_SHEET_MAX_HEIGHT_FRACTION = 0.75; From 1e6da087c91dbdd31ed69482a5aea4c1f9ba53ad Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Wed, 18 Mar 2026 03:24:42 +0530 Subject: [PATCH 86/98] revert --- app/containers/ActionSheet/useActionSheetDetents.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/containers/ActionSheet/useActionSheetDetents.ts b/app/containers/ActionSheet/useActionSheetDetents.ts index 6d00d2a69ea..a47cac2ee59 100644 --- a/app/containers/ActionSheet/useActionSheetDetents.ts +++ b/app/containers/ActionSheet/useActionSheetDetents.ts @@ -1,5 +1,5 @@ import type { SheetDetent } from '@lodev09/react-native-true-sheet'; -import { useMemo } from 'react'; +import { useMemo } from 'react'; const ACTION_SHEET_MIN_HEIGHT_FRACTION = 0.15; const ACTION_SHEET_MAX_HEIGHT_FRACTION = 0.75; From e8abcf1a84545e2409765c324d1ae9f16a32b229 Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Wed, 18 Mar 2026 03:40:05 +0530 Subject: [PATCH 87/98] test update --- app/containers/ActionSheet/useActionSheetDetents.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/containers/ActionSheet/useActionSheetDetents.test.tsx b/app/containers/ActionSheet/useActionSheetDetents.test.tsx index b2b77e73f69..51be4312ffe 100644 --- a/app/containers/ActionSheet/useActionSheetDetents.test.tsx +++ b/app/containers/ActionSheet/useActionSheetDetents.test.tsx @@ -88,6 +88,6 @@ describe('useActionSheetDetents', () => { }) ); - expect(result.current.detents).toEqual([0.35]); + expect(result.current.detents).toEqual([0.15]); }); }); From 8b410dc4197cf31ea71f804fceef1a18d3b2c0cf Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Thu, 19 Mar 2026 17:21:48 +0530 Subject: [PATCH 88/98] correct cancel button height --- app/containers/ActionSheet/useActionSheetDetents.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/containers/ActionSheet/useActionSheetDetents.ts b/app/containers/ActionSheet/useActionSheetDetents.ts index a47cac2ee59..7dd747fa935 100644 --- a/app/containers/ActionSheet/useActionSheetDetents.ts +++ b/app/containers/ActionSheet/useActionSheetDetents.ts @@ -1,11 +1,11 @@ import type { SheetDetent } from '@lodev09/react-native-true-sheet'; import { useMemo } from 'react'; +import { useWindowDimensions } from 'react-native'; const ACTION_SHEET_MIN_HEIGHT_FRACTION = 0.15; const ACTION_SHEET_MAX_HEIGHT_FRACTION = 0.75; const SCROLL_ENABLED_THRESHOLD = 0.6; export const HANDLE_HEIGHT = 28; -const CANCEL_HEIGHT = 32; function normalizeSnapsToDetents(snaps: (string | number)[]): number[] { return snaps @@ -47,6 +47,9 @@ export function useActionSheetDetents({ hasCancel = false, contentHeight }: UseActionSheetDetentsParams): { detents: SheetDetent[]; maxHeight: number; scrollEnabled: boolean } { + const { fontScale } = useWindowDimensions(); + const CANCEL_HEIGHT = 48 * fontScale; + return useMemo(() => { const maxHeight = windowHeight * ACTION_SHEET_MAX_HEIGHT_FRACTION; const hasOptions = optionsLength > 0; From b81a3ae157d39452bddce2676f994888ea7f595d Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Thu, 19 Mar 2026 17:30:02 +0530 Subject: [PATCH 89/98] Remove timeout to present sheet --- app/containers/ActionSheet/ActionSheet.tsx | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/app/containers/ActionSheet/ActionSheet.tsx b/app/containers/ActionSheet/ActionSheet.tsx index 5bc18e186df..4725bcea93b 100644 --- a/app/containers/ActionSheet/ActionSheet.tsx +++ b/app/containers/ActionSheet/ActionSheet.tsx @@ -23,7 +23,6 @@ const ActionSheet = React.memo( const [data, setData] = useState({} as TActionSheetOptions); const [isVisible, setIsVisible] = useState(false); const [contentHeight, setContentHeight] = useState(0); - const presentTimerRef = useRef | null>(null); const onCloseSnapshotRef = useRef(undefined); // TrueSheet detects the bottom inset for Android 16 and iOS @@ -37,30 +36,18 @@ const ActionSheet = React.memo( }; const hide = () => { - if (presentTimerRef.current) { - clearTimeout(presentTimerRef.current); - presentTimerRef.current = null; - } sheetRef.current?.dismiss(); Keyboard.dismiss(); Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); }; const show = (options: TActionSheetOptions) => { - // Clear any existing present timer to prevent stale presents - if (presentTimerRef.current) { - clearTimeout(presentTimerRef.current); - presentTimerRef.current = null; - } setData(options); setIsVisible(true); Keyboard.dismiss(); Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); onCloseSnapshotRef.current = options.onClose; - presentTimerRef.current = setTimeout(() => { - presentTimerRef.current = null; - sheetRef.current?.present(); - }, 200); + sheetRef.current?.present(); }; useBackHandler(() => { From 9c25b8872275a780e4dd55537ff55592e6130d72 Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Fri, 20 Mar 2026 01:29:31 +0530 Subject: [PATCH 90/98] Added bottom sheet in dev because of storybook --- package.json | 1 + yarn.lock | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 85b2b92e531..6a384298ebe 100644 --- a/package.json +++ b/package.json @@ -148,6 +148,7 @@ "@babel/runtime": "~7.25.9", "@bugsnag/cli": "^3.2.1", "@bugsnag/source-maps": "^2.3.3", + "@gorhom/bottom-sheet": "^5", "@react-native-community/cli": "18.0.0", "@react-native-community/cli-platform-android": "18.0.0", "@react-native-community/cli-platform-ios": "18.0.0", diff --git a/yarn.lock b/yarn.lock index f733a017e37..8125dd3c1cf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3360,6 +3360,21 @@ resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.3.tgz#a73bab8eb491d7b8b7be2f0e6c310647835afe83" integrity sha512-2xCRM9q9FlzGZCdgDMJwc0gyUkWFtkosy7Xxr6sFgQwn+wMNIWd7xIvYNauU1r64B5L5rsGKy/n9TKJ0aAFeqQ== +"@gorhom/bottom-sheet@^5": + version "5.2.8" + resolved "https://registry.yarnpkg.com/@gorhom/bottom-sheet/-/bottom-sheet-5.2.8.tgz#25e49122c30ffe83d3813b3bcf3dec39f3359aeb" + integrity sha512-+N27SMpbBxXZQ/IA2nlEV6RGxL/qSFHKfdFKcygvW+HqPG5jVNb1OqehLQsGfBP+Up42i0gW5ppI+DhpB7UCzA== + dependencies: + "@gorhom/portal" "1.0.14" + invariant "^2.2.4" + +"@gorhom/portal@1.0.14": + version "1.0.14" + resolved "https://registry.yarnpkg.com/@gorhom/portal/-/portal-1.0.14.tgz#1953edb76aaba80fb24021dc774550194a18e111" + integrity sha512-MXyL4xvCjmgaORr/rtryDNFy3kU4qUbKlwtQqqsygd0xX3mhKjOLn6mQK8wfu0RkoE0pBE0nAasRoHua+/QZ7A== + dependencies: + nanoid "^3.3.1" + "@grpc/grpc-js@~1.9.0": version "1.9.15" resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.9.15.tgz#433d7ac19b1754af690ea650ab72190bd700739b" @@ -10916,7 +10931,7 @@ nanoclone@^0.2.1: resolved "https://registry.yarnpkg.com/nanoclone/-/nanoclone-0.2.1.tgz#dd4090f8f1a110d26bb32c49ed2f5b9235209ed4" integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA== -nanoid@^3.3.11: +nanoid@^3.3.1, nanoid@^3.3.11: version "3.3.11" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== From 2b3e51a3c813d17eede78523c9cfba0e96bbf732 Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Fri, 20 Mar 2026 03:00:24 +0530 Subject: [PATCH 91/98] lock file fixed --- ios/Podfile.lock | 67 +++++++++++++++++++++++++++++++++++------------- yarn.lock | 5 ++++ 2 files changed, 54 insertions(+), 18 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 3be0d5999cd..ee4102627d6 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -2382,7 +2382,7 @@ PODS: - Yoga - RNLocalize (2.1.1): - React-Core - - RNReanimated (3.17.1): + - RNReanimated (4.1.3): - DoubleConversion - glog - hermes-engine @@ -2405,10 +2405,10 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNReanimated/reanimated (= 3.17.1) - - RNReanimated/worklets (= 3.17.1) + - RNReanimated/reanimated (= 4.1.3) + - RNWorklets - Yoga - - RNReanimated/reanimated (3.17.1): + - RNReanimated/reanimated (4.1.3): - DoubleConversion - glog - hermes-engine @@ -2431,9 +2431,10 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNReanimated/reanimated/apple (= 3.17.1) + - RNReanimated/reanimated/apple (= 4.1.3) + - RNWorklets - Yoga - - RNReanimated/reanimated/apple (3.17.1): + - RNReanimated/reanimated/apple (4.1.3): - DoubleConversion - glog - hermes-engine @@ -2456,8 +2457,9 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - RNWorklets - Yoga - - RNReanimated/worklets (3.17.1): + - RNScreens (4.13.1): - DoubleConversion - glog - hermes-engine @@ -2474,15 +2476,16 @@ PODS: - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-RCTImage - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNReanimated/worklets/apple (= 3.17.1) + - RNScreens/common (= 4.13.1) - Yoga - - RNReanimated/worklets/apple (3.17.1): + - RNScreens/common (4.13.1): - DoubleConversion - glog - hermes-engine @@ -2499,6 +2502,7 @@ PODS: - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-RCTImage - React-renderercss - React-rendererdebug - React-utils @@ -2506,7 +2510,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - RNScreens (4.13.1): + - RNSVG (15.12.1): - DoubleConversion - glog - hermes-engine @@ -2523,16 +2527,15 @@ PODS: - React-jsi - React-NativeModulesApple - React-RCTFabric - - React-RCTImage - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNScreens/common (= 4.13.1) + - RNSVG/common (= 15.12.1) - Yoga - - RNScreens/common (4.13.1): + - RNSVG/common (15.12.1): - DoubleConversion - glog - hermes-engine @@ -2549,7 +2552,6 @@ PODS: - React-jsi - React-NativeModulesApple - React-RCTFabric - - React-RCTImage - React-renderercss - React-rendererdebug - React-utils @@ -2557,7 +2559,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - RNSVG (15.12.1): + - RNWorklets (0.6.1): - DoubleConversion - glog - hermes-engine @@ -2580,9 +2582,34 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNSVG/common (= 15.12.1) + - RNWorklets/worklets (= 0.6.1) - Yoga - - RNSVG/common (15.12.1): + - RNWorklets/worklets (0.6.1): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNWorklets/worklets/apple (= 0.6.1) + - Yoga + - RNWorklets/worklets/apple (0.6.1): - DoubleConversion - glog - hermes-engine @@ -2754,6 +2781,7 @@ DEPENDENCIES: - RNReanimated (from `../node_modules/react-native-reanimated`) - RNScreens (from `../node_modules/react-native-screens`) - RNSVG (from `../node_modules/react-native-svg`) + - RNWorklets (from `../node_modules/react-native-worklets`) - "simdjson (from `../node_modules/@nozbe/simdjson`)" - "WatermelonDB (from `../node_modules/@nozbe/watermelondb`)" - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) @@ -3030,6 +3058,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-screens" RNSVG: :path: "../node_modules/react-native-svg" + RNWorklets: + :path: "../node_modules/react-native-worklets" simdjson: :path: "../node_modules/@nozbe/simdjson" WatermelonDB: @@ -3174,9 +3204,10 @@ SPEC CHECKSUMS: RNGestureHandler: 8ff2b1434b0ff8bab28c8242a656fb842990bbc8 RNImageCropPicker: c78ee80ea778f90cb850f4d26696fd9c1a7bcfbb RNLocalize: ca86348d88b9a89da0e700af58d428ab3f343c4e - RNReanimated: f52ccd5ceea2bae48d7421eec89b3f0c10d7b642 + RNReanimated: 3f2bab215585dc163bfcc97660466db62db411b5 RNScreens: b13e4c45f0406f33986a39c0d8da0324bff94435 RNSVG: 680e961f640e381aab730a04b2371969686ed9f7 + RNWorklets: b1faafefb82d9f29c4018404a0fb33974b494a7b SDWebImage: f84b0feeb08d2d11e6a9b843cb06d75ebf5b8868 SDWebImageAVIFCoder: 00310d246aab3232ce77f1d8f0076f8c4b021d90 SDWebImageSVGCoder: 15a300a97ec1c8ac958f009c02220ac0402e936c diff --git a/yarn.lock b/yarn.lock index a98850e27e2..2eabda0aeea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12712,6 +12712,11 @@ semver@^7.3.5, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4: dependencies: lru-cache "^6.0.0" +semver@^7.7.3: + version "7.7.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" + integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== + send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" From 45d1292c78feb4a2c494850625e0ef939630e9c4 Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Fri, 20 Mar 2026 16:37:39 +0530 Subject: [PATCH 92/98] increase reaction open time --- app/views/RoomView/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/RoomView/index.tsx b/app/views/RoomView/index.tsx index 7e237aa30ba..eba30e68393 100644 --- a/app/views/RoomView/index.tsx +++ b/app/views/RoomView/index.tsx @@ -858,7 +858,7 @@ class RoomView extends React.Component { onClose: this.resetAction, fullContainer: true }); - }, 100); + }, 250); }; onReactionInit = (messageId: string) => { From cdda96018bb9fd3052208a29dc83ccdef31a39f4 Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Fri, 20 Mar 2026 18:35:22 +0530 Subject: [PATCH 93/98] increase timeout --- app/views/RoomView/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/RoomView/index.tsx b/app/views/RoomView/index.tsx index eba30e68393..2622040f562 100644 --- a/app/views/RoomView/index.tsx +++ b/app/views/RoomView/index.tsx @@ -858,7 +858,7 @@ class RoomView extends React.Component { onClose: this.resetAction, fullContainer: true }); - }, 250); + }, 300); }; onReactionInit = (messageId: string) => { From cff02b61bc35a6af75fa20cb063dbee984ad2079 Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Sat, 21 Mar 2026 18:22:16 +0530 Subject: [PATCH 94/98] Removed deprecated addWhitelistedNativeProps --- app/containers/AudioPlayer/Seek.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/app/containers/AudioPlayer/Seek.tsx b/app/containers/AudioPlayer/Seek.tsx index 253262592b5..ef7af0872dd 100644 --- a/app/containers/AudioPlayer/Seek.tsx +++ b/app/containers/AudioPlayer/Seek.tsx @@ -15,7 +15,6 @@ import styles from './styles'; import { useTheme } from '../../theme'; import { SEEK_HIT_SLOP, THUMB_SEEK_SIZE, ACTIVE_OFFSET_X, DEFAULT_TIME_LABEL } from './constants'; -Animated.addWhitelistedNativeProps({ text: true }); const AnimatedTextInput = Animated.createAnimatedComponent(TextInput); interface ISeek { From 4ff66375113d6044d71afe57749675c07eaa4370 Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Tue, 24 Mar 2026 19:06:00 +0530 Subject: [PATCH 95/98] pod update --- ios/Podfile.lock | 36 ++++++------------------------------ 1 file changed, 6 insertions(+), 30 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 1ee5621a298..ab8fc22e9f4 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -2657,34 +2657,10 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - RNTrueSheet (3.7.3): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-hermes - - React-ImageManager - - React-jsi - - React-NativeModulesApple - - React-RCTFabric - - React-renderercss - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - SDWebImage (5.21.0): - - SDWebImage/Core (= 5.21.0) - - SDWebImage/Core (5.21.0) - - SDWebImageAVIFCoder (0.11.0): + - SDWebImage (5.21.7): + - SDWebImage/Core (= 5.21.7) + - SDWebImage/Core (5.21.7) + - SDWebImageAVIFCoder (0.11.1): - libavif/core (>= 0.11.0) - SDWebImage (~> 5.10) - SDWebImageSVGCoder (1.7.0): @@ -3260,8 +3236,8 @@ SPEC CHECKSUMS: RNSVG: 680e961f640e381aab730a04b2371969686ed9f7 RNTrueSheet: e9ee7ff82a7854295eac6fc225e54f1539e6cd7b RNWorklets: b1faafefb82d9f29c4018404a0fb33974b494a7b - SDWebImage: f84b0feeb08d2d11e6a9b843cb06d75ebf5b8868 - SDWebImageAVIFCoder: 00310d246aab3232ce77f1d8f0076f8c4b021d90 + SDWebImage: e9fc87c1aab89a8ab1bbd74eba378c6f53be8abf + SDWebImageAVIFCoder: afe194a084e851f70228e4be35ef651df0fc5c57 SDWebImageSVGCoder: 15a300a97ec1c8ac958f009c02220ac0402e936c SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380 simdjson: 7bb9e33d87737cec966e7b427773c67baa4458fe From 88be3cdcf96d173ee400f49aeca87859486a1046 Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Wed, 25 Mar 2026 20:54:04 +0530 Subject: [PATCH 96/98] coderabbit suggestion --- app/containers/AudioPlayer/Seek.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/containers/AudioPlayer/Seek.tsx b/app/containers/AudioPlayer/Seek.tsx index ef7af0872dd..3d9be30df63 100644 --- a/app/containers/AudioPlayer/Seek.tsx +++ b/app/containers/AudioPlayer/Seek.tsx @@ -72,11 +72,11 @@ const Seek = ({ currentTime, duration, loaded = false, onChangeTime }: ISeek) => }) .onStart(() => { contextX.value = translateX.value; + scale.value = withTiming(1.3, { duration: 150 }); }) .onUpdate(event => { const newX = contextX.value + event.translationX; translateX.value = clamp(newX, 0, maxWidth.value); - scale.value = withTiming(1.3, { duration: 150 }); }) .onEnd(() => { scale.value = withTiming(1, { duration: 150 }); From 03e0ae03c16bc333458e3f421b22ed8503705dd8 Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Thu, 26 Mar 2026 00:23:00 +0530 Subject: [PATCH 97/98] seekbar improvement --- app/containers/AudioPlayer/Seek.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/containers/AudioPlayer/Seek.tsx b/app/containers/AudioPlayer/Seek.tsx index 3d9be30df63..56f54e83b87 100644 --- a/app/containers/AudioPlayer/Seek.tsx +++ b/app/containers/AudioPlayer/Seek.tsx @@ -67,10 +67,8 @@ const Seek = ({ currentTime, duration, loaded = false, onChangeTime }: ISeek) => const panGesture = Gesture.Pan() .enabled(loaded) .activeOffsetX([-ACTIVE_OFFSET_X, ACTIVE_OFFSET_X]) - .onBegin(() => { - isPanning.value = true; - }) .onStart(() => { + isPanning.value = true; contextX.value = translateX.value; scale.value = withTiming(1.3, { duration: 150 }); }) @@ -79,9 +77,11 @@ const Seek = ({ currentTime, duration, loaded = false, onChangeTime }: ISeek) => translateX.value = clamp(newX, 0, maxWidth.value); }) .onEnd(() => { - scale.value = withTiming(1, { duration: 150 }); - isPanning.value = false; scheduleOnRN(onChangeTime, Math.round(currentTime.value * 1000)); + }) + .onFinalize(() => { + isPanning.value = false; + scale.value = withTiming(1, { duration: 150 }); }); useDerivedValue(() => { From a130cd1094d66814e5289c7fef9da6384b16c4df Mon Sep 17 00:00:00 2001 From: Rohit <40559587+Rohit3523@users.noreply.github.com> Date: Thu, 26 Mar 2026 00:25:20 +0530 Subject: [PATCH 98/98] Replace more runOnJS to scheduleOnRN --- .../ServerItem/SwipeableDeleteItem/Actions.tsx | 10 +++++----- .../ServerItem/SwipeableDeleteItem/Touchable.tsx | 5 +++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/app/containers/ServerItem/SwipeableDeleteItem/Actions.tsx b/app/containers/ServerItem/SwipeableDeleteItem/Actions.tsx index d011e6fb5e8..69efa9cd1dd 100644 --- a/app/containers/ServerItem/SwipeableDeleteItem/Actions.tsx +++ b/app/containers/ServerItem/SwipeableDeleteItem/Actions.tsx @@ -4,13 +4,13 @@ import Animated, { useAnimatedStyle, interpolate, withSpring, - runOnJS, useAnimatedReaction, useSharedValue, type SharedValue } from 'react-native-reanimated'; import { RectButton } from 'react-native-gesture-handler'; import * as Haptics from 'expo-haptics'; +import { scheduleOnRN } from 'react-native-worklets'; import { CustomIcon } from '../../CustomIcon'; import { useTheme } from '../../../theme'; @@ -44,14 +44,14 @@ export const DeleteAction = React.memo( (currentTransX, previousTransX) => { if (I18n.isRTL) { if (previousTransX && currentTransX > longSwipe && previousTransX <= longSwipe) { - runOnJS(triggerDeleteAnimation)(actionWidth); + scheduleOnRN(triggerDeleteAnimation, actionWidth); } else if (previousTransX && currentTransX <= longSwipe && previousTransX > longSwipe) { - runOnJS(triggerDeleteAnimation)(0); + scheduleOnRN(triggerDeleteAnimation, 0); } } else if (previousTransX && currentTransX < -longSwipe && previousTransX >= -longSwipe) { - runOnJS(triggerDeleteAnimation)(-actionWidth); + scheduleOnRN(triggerDeleteAnimation, -actionWidth); } else if (previousTransX && currentTransX >= -longSwipe && previousTransX < -longSwipe) { - runOnJS(triggerDeleteAnimation)(0); + scheduleOnRN(triggerDeleteAnimation, 0); } } ); diff --git a/app/containers/ServerItem/SwipeableDeleteItem/Touchable.tsx b/app/containers/ServerItem/SwipeableDeleteItem/Touchable.tsx index 898187f1129..a9f7b0b7f7f 100644 --- a/app/containers/ServerItem/SwipeableDeleteItem/Touchable.tsx +++ b/app/containers/ServerItem/SwipeableDeleteItem/Touchable.tsx @@ -1,5 +1,5 @@ import React, { useRef, memo } from 'react'; -import Animated, { useSharedValue, useAnimatedStyle, withSpring, runOnJS } from 'react-native-reanimated'; +import Animated, { useSharedValue, useAnimatedStyle, withSpring } from 'react-native-reanimated'; import { Gesture, GestureDetector, @@ -7,6 +7,7 @@ import { type PanGestureHandlerEventPayload } from 'react-native-gesture-handler'; import { View, type AccessibilityActionEvent } from 'react-native'; +import { scheduleOnRN } from 'react-native-worklets'; import Touch from '../../Touch'; import { DeleteAction } from './Actions'; @@ -174,7 +175,7 @@ const SwipeableDeleteTouchable = ({ } }) .onEnd(event => { - runOnJS(handleRelease)(event); + scheduleOnRN(handleRelease, event); }); const animatedStyles = useAnimatedStyle(() => ({