···6363### Tips
64646565- Copy the `.env.example` to `.env` and fill in any necessary tokens. (The Sentry token is NOT required; see instructions below if you want to enable Sentry.)
6666-- To run on the device, add `--device` to the command (e.g. `yarn android --device`). To build in production mode (slower build, faster app), also add `--variant release`.
6666+- To run on the device, add `--device` to the command (e.g. `yarn android --device`). To build in production mode (slower build, faster app), also add `--variant release` on Android or `--configuration Release` on iOS.
6767- If you want to use Expo EAS on your own builds without ejecting from Expo, make sure to change the `owner` and `extra.eas.projectId` properties. If you do not have an Expo account, you may remove these properties.
6868- `npx react-native info` Checks what has been installed.
6969- If the Android simulator frequently hangs or is very sluggish, [bump its memory limit](https://stackoverflow.com/a/40068396)
···164164- TextEncoder / TextDecoder
165165- react-native-url-polyfill
166166- Array#findLast (on web)
167167-- atob (on native)
168167169168### Sentry sourcemaps
170169
···11import ExpoModulesCore
22+import React
2334// This view will be used as a native component. Make sure to inherit from `ExpoView`
45// to apply the proper styling (e.g. border radius and shadows).
···22 Children,
33 cloneElement,
44 isValidElement,
55- type ReactElement,
66- type ReactNode,
75 useCallback,
86 useEffect,
97 useMemo,
···2624 * screen reader support is enabled. THIS SHOULD BE USED SPARINGLY, only when
2725 * no better option is available.
2826 */
2929-export function FocusScope({children}: {children: ReactNode}) {
2727+export function FocusScope({children}: {children: React.ReactNode}) {
3028 const {screenReaderEnabled} = useA11y()
31293230 return screenReaderEnabled ? <FocusTrap>{children}</FocusTrap> : children
···4139 * they have reached the start or end of the content and tell them how to
4240 * remain within the active content section.
4341 */
4444-function FocusTrap({children}: {children: ReactNode}) {
4242+function FocusTrap({children}: {children: React.ReactNode}) {
4543 const {_} = useLingui()
4644 const child = useRef<View>(null)
4745···5351 const decoratedChildren = useMemo(() => {
5452 return Children.toArray(children).map((node, i) => {
5553 if (i === 0 && isValidElement(node)) {
5656- const n = node as ReactElement<any>
5454+ const n = node as React.ReactElement<any>
5755 if (n.props.ref !== undefined) {
5856 throw new Error(
5957 'FocusScope needs to override the ref on its first child.',
+1-2
src/components/FocusScope/index.web.tsx
···11-import {type ReactNode} from 'react'
21import {FocusScope as RadixFocusScope} from 'radix-ui/internal'
3243/*
···65 * use this in Dialogs and such already. It's here as a convenient counterpart
76 * to the hacky native solution.
87 */
99-export function FocusScope({children}: {children: ReactNode}) {
88+export function FocusScope({children}: {children: React.ReactNode}) {
109 return (
1110 <RadixFocusScope.FocusScope loop asChild trapped>
1211 {children}
+1-1
src/components/dms/ActionsWrapper.web.tsx
···72727373 return (
7474 <View
7575- // @ts-expect-error web only
7675 onMouseEnter={onMouseEnter}
7776 onMouseLeave={onMouseLeave}
7777+ // @ts-expect-error web only
7878 onFocus={onFocus}
7979 onBlur={onMouseLeave}
8080 style={[a.flex_1, isFromSelf ? a.flex_row : a.flex_row_reverse]}
+1-1
src/lib/api/upload-blob.ts
···11-import {copyAsync} from 'expo-file-system'
11+import {copyAsync} from 'expo-file-system/legacy'
22import {type BskyAgent, type ComAtprotoRepoUploadBlob} from '@atproto/api'
3344import {safeDeleteAsync} from '#/lib/media/manip'
-15
src/lib/hooks/useAnimatedScrollHandler_FIXED.ts
···11-// Be warned. This Hook is very buggy unless used in a very constrained way.
22-// To use it safely:
33-//
44-// - DO NOT pass its return value as a prop to any user-defined component.
55-// - DO NOT pass its return value to more than a single component.
66-//
77-// In other words, the only safe way to use it is next to the leaf Reanimated View.
88-//
99-// Relevant bug reports:
1010-// - https://github.com/software-mansion/react-native-reanimated/issues/5345
1111-// - https://github.com/software-mansion/react-native-reanimated/issues/5360
1212-// - https://github.com/software-mansion/react-native-reanimated/issues/5364
1313-//
1414-// It's great when it works though.
1515-export {useAnimatedScrollHandler} from 'react-native-reanimated'
···1010 makeDirectoryAsync,
1111 StorageAccessFramework,
1212 writeAsStringAsync,
1313-} from 'expo-file-system'
1313+} from 'expo-file-system/legacy'
1414import {manipulateAsync, SaveFormat} from 'expo-image-manipulator'
1515import * as MediaLibrary from 'expo-media-library'
1616import * as Sharing from 'expo-sharing'
···22 documentDirectory,
33 getInfoAsync,
44 readDirectoryAsync,
55-} from 'expo-file-system'
55+} from 'expo-file-system/legacy'
66import ExpoImageCropTool, {type OpenCropperOptions} from 'expo-image-crop-tool'
7788import {compressIfNeeded} from './manip'
+1-1
src/lib/media/video/upload.ts
···11-import {createUploadTask, FileSystemUploadType} from 'expo-file-system'
11+import {createUploadTask, FileSystemUploadType} from 'expo-file-system/legacy'
22import {type AppBskyVideoDefs, type BskyAgent} from '@atproto/api'
33import {type I18n} from '@lingui/core'
44import {msg} from '@lingui/macro'
+16-16
src/locale/locales/en/messages.po
···216216msgid "{0}s"
217217msgstr ""
218218219219-#: src/view/shell/desktop/LeftNav.tsx:455
219219+#: src/view/shell/desktop/LeftNav.tsx:454
220220msgid "{count, plural, one {# unread item} other {# unread items}}"
221221msgstr ""
222222···17401740#: src/lib/hooks/useNotificationHandler.ts:99
17411741#: src/Navigation.tsx:549
17421742#: src/view/shell/bottom-bar/BottomBar.tsx:221
17431743-#: src/view/shell/desktop/LeftNav.tsx:607
17431743+#: src/view/shell/desktop/LeftNav.tsx:608
17441744#: src/view/shell/Drawer.tsx:466
17451745msgid "Chat"
17461746msgstr ""
···20662066msgid "Complete the challenge"
20672067msgstr ""
2068206820692069-#: src/view/shell/desktop/LeftNav.tsx:572
20692069+#: src/view/shell/desktop/LeftNav.tsx:573
20702070msgid "Compose new post"
20712071msgstr ""
20722072···3384338433853385#: src/Navigation.tsx:759
33863386#: src/screens/Search/Shell.tsx:307
33873387-#: src/view/shell/desktop/LeftNav.tsx:689
33873387+#: src/view/shell/desktop/LeftNav.tsx:690
33883388#: src/view/shell/Drawer.tsx:414
33893389msgid "Explore"
33903390msgstr ""
···36733673#: src/screens/StarterPack/StarterPackScreen.tsx:190
36743674#: src/view/screens/Feeds.tsx:511
36753675#: src/view/screens/Profile.tsx:230
36763676-#: src/view/shell/desktop/LeftNav.tsx:727
36763676+#: src/view/shell/desktop/LeftNav.tsx:728
36773677#: src/view/shell/Drawer.tsx:530
36783678msgid "Feeds"
36793679msgstr ""
···43704370#: src/Navigation.tsx:754
43714371#: src/Navigation.tsx:774
43724372#: src/view/shell/bottom-bar/BottomBar.tsx:178
43734373-#: src/view/shell/desktop/LeftNav.tsx:671
43734373+#: src/view/shell/desktop/LeftNav.tsx:672
43744374#: src/view/shell/Drawer.tsx:440
43754375msgid "Home"
43764376msgstr ""
···49974997#: src/view/screens/Lists.tsx:65
49984998#: src/view/screens/Profile.tsx:224
49994999#: src/view/screens/Profile.tsx:232
50005000-#: src/view/shell/desktop/LeftNav.tsx:745
50005000+#: src/view/shell/desktop/LeftNav.tsx:746
50015001#: src/view/shell/Drawer.tsx:545
50025002msgid "Lists"
50035003msgstr ""
···55605560msgid "New post"
55615561msgstr ""
5562556255635563-#: src/view/shell/desktop/LeftNav.tsx:580
55635563+#: src/view/shell/desktop/LeftNav.tsx:581
55645564msgctxt "action"
55655565msgid "New Post"
55665566msgstr ""
···58395839#: src/screens/Settings/Settings.tsx:199
58405840#: src/view/screens/Notifications.tsx:130
58415841#: src/view/shell/bottom-bar/BottomBar.tsx:252
58425842-#: src/view/shell/desktop/LeftNav.tsx:708
58425842+#: src/view/shell/desktop/LeftNav.tsx:709
58435843#: src/view/shell/Drawer.tsx:493
58445844msgid "Notifications"
58455845msgstr ""
···64546454msgid "Please explain why you think your chats were incorrectly disabled"
64556455msgstr ""
6456645664576457-#: src/components/FocusScope/index.tsx:93
64586458-#: src/components/FocusScope/index.tsx:117
64576457+#: src/components/FocusScope/index.tsx:91
64586458+#: src/components/FocusScope/index.tsx:115
64596459msgid "Please go back, or activate this element to return to the start of the active content."
64606460msgstr ""
64616461···66876687msgstr ""
6688668866896689#: src/view/shell/bottom-bar/BottomBar.tsx:316
66906690-#: src/view/shell/desktop/LeftNav.tsx:786
66906690+#: src/view/shell/desktop/LeftNav.tsx:787
66916691#: src/view/shell/Drawer.tsx:77
66926692#: src/view/shell/Drawer.tsx:596
66936693msgid "Profile"
···74867486msgid "Save to my feeds"
74877487msgstr ""
7488748874897489-#: src/view/shell/desktop/LeftNav.tsx:764
74897489+#: src/view/shell/desktop/LeftNav.tsx:765
74907490#: src/view/shell/Drawer.tsx:571
74917491msgctxt "link to bookmarks screen"
74927492msgid "Saved"
···7909790979107910#: src/Navigation.tsx:213
79117911#: src/screens/Settings/Settings.tsx:99
79127912-#: src/view/shell/desktop/LeftNav.tsx:804
79127912+#: src/view/shell/desktop/LeftNav.tsx:805
79137913#: src/view/shell/Drawer.tsx:609
79147914msgid "Settings"
79157915msgstr ""
···1075410754msgid "You've found some people to follow"
1075510755msgstr ""
10756107561075710757-#: src/components/FocusScope/index.tsx:114
1075710757+#: src/components/FocusScope/index.tsx:112
1075810758msgid "You've reached the end of the active content."
1075910759msgstr ""
1076010760···1076610766msgid "You've reached the maximum number of requests allowed. Please try again later."
1076710767msgstr ""
10768107681076910769-#: src/components/FocusScope/index.tsx:90
1076910769+#: src/components/FocusScope/index.tsx:88
1077010770msgid "You've reached the start of the active content."
1077110771msgstr ""
1077210772
+1-1
src/screens/Messages/components/ChatListItem.tsx
···333333 return (
334334 <GestureActionView actions={actions}>
335335 <View
336336- // @ts-expect-error web only
337336 onMouseEnter={onMouseEnter}
338337 onMouseLeave={onMouseLeave}
338338+ // @ts-expect-error web only
339339 onFocus={onFocus}
340340 onBlur={onMouseLeave}
341341 style={[a.relative, t.atoms.bg]}>
+1-1
src/screens/Settings/AboutSettings.tsx
···11import {Platform} from 'react-native'
22import {setStringAsync} from 'expo-clipboard'
33-import * as FileSystem from 'expo-file-system'
33+import * as FileSystem from 'expo-file-system/legacy'
44import {Image} from 'expo-image'
55import {msg, Trans} from '@lingui/macro'
66import {useLingui} from '@lingui/react'
···33 deleteAsync,
44 makeDirectoryAsync,
55 moveAsync,
66-} from 'expo-file-system'
66+} from 'expo-file-system/legacy'
77import {
88 type Action,
99 type ActionCrop,
+1-1
src/view/com/composer/Composer.tsx
···3232 runOnUI,
3333 scrollTo,
3434 useAnimatedRef,
3535+ useAnimatedScrollHandler,
3536 useAnimatedStyle,
3637 useDerivedValue,
3738 useSharedValue,
···6566 SUPPORTED_MIME_TYPES,
6667 type SupportedMimeTypes,
6768} from '#/lib/constants'
6868-import {useAnimatedScrollHandler} from '#/lib/hooks/useAnimatedScrollHandler_FIXED'
6969import {useAppState} from '#/lib/hooks/useAppState'
7070import {useIsKeyboardVisible} from '#/lib/hooks/useIsKeyboardVisible'
7171import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback'
···1919 useAnimatedProps,
2020 useAnimatedReaction,
2121 useAnimatedRef,
2222+ useAnimatedScrollHandler,
2223 useAnimatedStyle,
2324 useSharedValue,
2425} from 'react-native-reanimated'
2526import {useSafeAreaFrame} from 'react-native-safe-area-context'
2627import {Image} from 'expo-image'
27282828-import {useAnimatedScrollHandler} from '#/lib/hooks/useAnimatedScrollHandler_FIXED'
2929import {
3030 type Dimensions as ImageDimensions,
3131 type ImageSource,
+1-1
src/view/com/util/List.tsx
···33import {
44 type FlatListPropsWithLayout,
55 runOnJS,
66+ useAnimatedScrollHandler,
67 useSharedValue,
78} from 'react-native-reanimated'
89import {updateActiveVideoViewAsync} from '@haileyok/bluesky-video'
9101010-import {useAnimatedScrollHandler} from '#/lib/hooks/useAnimatedScrollHandler_FIXED'
1111import {useDedupe} from '#/lib/hooks/useDedupe'
1212import {useScrollHandlers} from '#/lib/ScrollContext'
1313import {addStyle} from '#/lib/styles'