big dependency update

This commit is contained in:
Samuel Newman
2026-05-28 11:58:50 +03:00
parent b6ca2fe5b4
commit 109488fe09
17 changed files with 2434 additions and 2354 deletions
+1 -6
View File
@@ -55,7 +55,6 @@ module.exports = function (_config) {
icon: './assets/app-icons/ios_icon_default_next.png',
userInterfaceStyle: 'automatic',
primaryColor: '#006AFF',
newArchEnabled: false,
ios: {
supportsTablet: false,
bundleIdentifier: 'xyz.blueskyweb.app',
@@ -182,10 +181,6 @@ module.exports = function (_config) {
androidStatusBar: {
barStyle: 'light-content',
},
// Dark nav bar in light mode is better than light nav bar in dark mode
androidNavigationBar: {
barStyle: 'light-content',
},
android: {
icon: './assets/app-icons/android_icon_default_next.png',
adaptiveIcon: {
@@ -259,7 +254,7 @@ module.exports = function (_config) {
'expo-build-properties',
{
ios: {
deploymentTarget: '15.1',
deploymentTarget: '16.4',
buildReactNativeFromSource: true,
ccacheEnabled: IS_DEV,
cxxLanguageStandard: 'c++23',
+52 -51
View File
@@ -101,7 +101,6 @@
"@bsky.app/expo-image-crop-tool": "^0.5.1",
"@bsky.app/expo-scroll-edge-effect": "^0.1.4",
"@bsky.app/expo-translate-text": "^0.2.9",
"@bsky.app/react-native-mmkv": "2.12.5",
"@bsky.app/sift": "^0.3.8",
"@bsky.app/tapper": "^0.5.7",
"@bsky.app/video": "0.3.6",
@@ -109,6 +108,7 @@
"@emoji-mart/data": "^1.2.1",
"@emoji-mart/react": "^1.1.1",
"@expo/html-elements": "^0.12.5",
"@expo/ui": "^56.0.14",
"@expo/webpack-config": "^19.0.1",
"@floating-ui/dom": "^1.6.3",
"@floating-ui/react-dom": "^2.0.8",
@@ -155,41 +155,41 @@
"emoji-mart": "^5.6.0",
"emoji-regex": "^10.4.0",
"eventemitter3": "^5.0.1",
"expo": "54.0.34",
"expo-application": "~7.0.8",
"expo-blur": "~15.0.8",
"expo-build-properties": "~1.0.10",
"expo-camera": "~17.0.10",
"expo-clipboard": "~8.0.8",
"expo-contacts": "^15.0.10",
"expo-dev-client": "~6.0.20",
"expo-device": "~8.0.10",
"expo-file-system": "~19.0.21",
"expo-font": "~14.0.11",
"expo-glass-effect": "55.0.8",
"expo-haptics": "~15.0.8",
"expo-image": "~3.0.11",
"expo-image-manipulator": "~14.0.8",
"expo-image-picker": "~17.0.10",
"expo-intent-launcher": "~13.0.8",
"expo-keep-awake": "~15.0.8",
"expo-linear-gradient": "~15.0.8",
"expo-linking": "~8.0.11",
"expo-localization": "~17.0.8",
"expo-location": "~19.0.8",
"expo-media-library": "~18.2.1",
"expo-notifications": "~0.32.17",
"expo": "56.0.5",
"expo-application": "~56.0.3",
"expo-blur": "~56.0.3",
"expo-build-properties": "~56.0.15",
"expo-camera": "~56.0.7",
"expo-clipboard": "~56.0.3",
"expo-contacts": "^56.0.7",
"expo-dev-client": "~56.0.16",
"expo-device": "~56.0.4",
"expo-file-system": "~56.0.7",
"expo-font": "~56.0.5",
"expo-glass-effect": "56.0.4",
"expo-haptics": "~56.0.3",
"expo-image": "~56.0.9",
"expo-image-manipulator": "~56.0.15",
"expo-image-picker": "~56.0.14",
"expo-intent-launcher": "~56.0.4",
"expo-keep-awake": "~56.0.3",
"expo-linear-gradient": "~56.0.4",
"expo-linking": "~56.0.12",
"expo-localization": "~56.0.6",
"expo-location": "~56.0.14",
"expo-media-library": "~56.0.6",
"expo-notifications": "~56.0.14",
"expo-paste-input": "^0.2.1",
"expo-privacy-sensitive": "^0.1.0",
"expo-screen-orientation": "~9.0.8",
"expo-sharing": "~14.0.8",
"expo-sms": "^14.0.7",
"expo-splash-screen": "~31.0.13",
"expo-system-ui": "~6.0.9",
"expo-updates": "~29.0.17",
"expo-video": "~3.0.16",
"expo-video-thumbnails": "^10.0.8",
"expo-web-browser": "~15.0.10",
"expo-screen-orientation": "~56.0.5",
"expo-sharing": "~56.0.14",
"expo-sms": "^56.0.3",
"expo-splash-screen": "~56.0.10",
"expo-system-ui": "~56.0.5",
"expo-updates": "~56.0.17",
"expo-video": "~56.1.2",
"expo-video-thumbnails": "^56.0.3",
"expo-web-browser": "~56.0.5",
"fast-deep-equal": "^3.1.3",
"fast-text-encoding": "^1.0.6",
"fuse.js": "^7.1.0",
@@ -208,34 +208,35 @@
"normalize-url": "^8.0.0",
"psl": "1.9.0",
"radix-ui": "^1.4.3",
"react": "19.1.0",
"react": "19.2.3",
"react-compiler-runtime": "19.1.0-rc.3",
"react-dom": "19.1.0",
"react-dom": "19.2.3",
"react-hotkeys-hook": "5.2.4",
"react-image-crop": "^11.0.7",
"react-is": "19",
"react-keyed-flatten-children": "^5.0.0",
"react-native": "0.81.5",
"react-native": "0.85.3",
"react-native-compressor": "1.13.0",
"react-native-date-picker": "^5.0.13",
"react-native-device-attest": "^0.1.6",
"react-native-drawer-layout": "^4.2.3",
"react-native-edge-to-edge": "^1.8.1",
"react-native-gesture-handler": "~2.28.0",
"react-native-keyboard-controller": "^1.21.8",
"react-native-gesture-handler": "~2.31.2",
"react-native-keyboard-controller": "^1.21.6",
"react-native-mmkv": "^3.3.3",
"react-native-pager-view": "6.8.0",
"react-native-progress": "bluesky-social/react-native-progress",
"react-native-qrcode-styled": "^0.3.3",
"react-native-reanimated": "3.19.1",
"react-native-safe-area-context": "~5.6.0",
"react-native-screens": "4.24.0",
"react-native-svg": "15.12.1",
"react-native-uitextview": "^1.4.0",
"react-native-reanimated": "4.4.0",
"react-native-safe-area-context": "~5.7.0",
"react-native-screens": "4.25.2",
"react-native-svg": "15.15.4",
"react-native-uitextview": "^2.2.0",
"react-native-uuid": "^2.0.3",
"react-native-view-shot": "^4.0.3",
"react-native-view-shot": "^5.1.0",
"react-native-web": "^0.21.0",
"react-native-web-webview": "^1.0.2",
"react-native-webview": "^13.15.0",
"react-native-webview": "^13.16.1",
"react-native-worklets": "^0.9.1",
"react-remove-scroll-bar": "^2.3.8",
"react-responsive": "^10.0.1",
"react-textarea-autosize": "^8.5.3",
@@ -267,13 +268,13 @@
"@types/lodash.debounce": "^4.0.7",
"@types/lodash.shuffle": "^4.2.7",
"@types/psl": "1.1.1",
"@types/react": "^19.1.17",
"@types/react-dom": "^19.1.11",
"@types/react": "^19.2.15",
"@types/react-dom": "^19.2.3",
"@typescript/native-preview": "^7.0.0-dev.20260428.1",
"babel-jest": "^29.7.0",
"babel-plugin-module-resolver": "^5.0.2",
"babel-plugin-react-compiler": "19.1.0-rc.3",
"babel-preset-expo": "~54.0.10",
"babel-preset-expo": "~56.0.13",
"eslint": "^9.39.2",
"eslint-import-resolver-typescript": "^4.4.4",
"eslint-plugin-bsky-internal": "link:eslint",
@@ -290,7 +291,7 @@
"husky": "^9.1.7",
"is-ci": "^3.0.1",
"jest": "^29.7.0",
"jest-expo": "~54.0.17",
"jest-expo": "~56.0.4",
"jest-junit": "^16.0.0",
"lint-staged": "^13.2.3",
"prettier": "^3.8.3",
@@ -1,17 +0,0 @@
diff --git a/ios/RNDatePicker.h b/ios/RNDatePicker.h
index 480746eb7acfbe86f67547d9e1de7a5be4d5faf2..13d30cb547195993dfcb4005cc0d248de9ac391a 100644
--- a/ios/RNDatePicker.h
+++ b/ios/RNDatePicker.h
@@ -15,6 +15,7 @@ NS_ASSUME_NONNULL_END
#else
#import "DatePicker.h"
#import <UIKit/UIKit.h>
+#include <string>
@interface RNDatePicker : DatePicker
@@ -22,4 +23,3 @@ NS_ASSUME_NONNULL_END
@end
#endif
-
@@ -1,48 +0,0 @@
diff --git a/src/components/KeyboardChatScrollView/useExtraContentPadding/index.ts b/src/components/KeyboardChatScrollView/useExtraContentPadding/index.ts
index 0f6d7c67a307885310ab184fdf9e7a5c7b296825..1e0bdd5b1d3b1eceb47bfb0050da84061fd7f77c 100644
--- a/src/components/KeyboardChatScrollView/useExtraContentPadding/index.ts
+++ b/src/components/KeyboardChatScrollView/useExtraContentPadding/index.ts
@@ -1,8 +1,6 @@
import { useCallback } from "react";
-import { Platform } from "react-native";
import { scrollTo, useAnimatedReaction } from "react-native-reanimated";
-import { IS_FABRIC } from "../../../architecture";
import { isScrollAtEnd, shouldShiftContent } from "../useChatKeyboard/helpers";
import type { KeyboardLiftBehavior } from "../useChatKeyboard/types";
@@ -52,7 +50,6 @@ function useExtraContentPadding(options: UseExtraContentPaddingOptions): void {
scroll,
layout,
size,
- contentOffsetY,
inverted,
keyboardLiftBehavior,
freeze,
@@ -62,20 +59,14 @@ function useExtraContentPadding(options: UseExtraContentPaddingOptions): void {
(target: number) => {
"worklet";
- if (contentOffsetY && IS_FABRIC) {
- // eslint-disable-next-line react-compiler/react-compiler
- contentOffsetY.value = target;
- } else if (Platform.OS === "android") {
- // Defer scrollTo so the animatedProps inset commit lands first;
- // otherwise the native ScrollView clamps to the old range.
- requestAnimationFrame(() => {
- scrollTo(scrollViewRef, 0, target, false);
- });
- } else {
+ // Always defer scrollTo so the animatedProps inset commit lands first;
+ // otherwise the native ScrollView clamps contentOffset to the old
+ // contentInset range (iOS Fabric) or the old contentInsetBottom (Android).
+ requestAnimationFrame(() => {
scrollTo(scrollViewRef, 0, target, false);
- }
+ });
},
- [scrollViewRef, contentOffsetY],
+ [scrollViewRef],
);
useAnimatedReaction(
@@ -1,28 +0,0 @@
diff --git a/src/index.js b/src/index.js
index fa76d7e1272e7fbe4bbd153104db127f1f6eecad..018b6860b7fa02d498d73b5fd06028bae99abedb 100644
--- a/src/index.js
+++ b/src/index.js
@@ -125,13 +125,17 @@ export function captureRef<T: React$ElementType>(
}
}
if (typeof view !== "number") {
- const node = findNodeHandle(view);
- if (!node) {
- return Promise.reject(
- new Error("findNodeHandle failed to resolve view=" + String(view))
- );
+ if (Platform.OS == 'web') {
+ view = view;
+ } else {
+ const node = findNodeHandle(view);
+ if (!node) {
+ return Promise.reject(
+ new Error("findNodeHandle failed to resolve view=" + String(view))
+ );
+ }
+ view = node;
}
- view = node;
}
const { options, errors } = validateOptions(optionsObject);
if (__DEV__ && errors.length > 0) {
@@ -1,3 +0,0 @@
## react-native-view-shot patch
Temporary patch for web, where `view`'s type has changed.
+2296 -2113
View File
File diff suppressed because it is too large Load Diff
+10 -19
View File
@@ -4,41 +4,32 @@ strictPeerDependencies: false # default: false
trustPolicy: 'no-downgrade' # default: off
trustPolicyIgnoreAfter: 10080 # 7 days, default: undefined
overrides:
'@react-native/babel-preset': '0.81.5'
'@react-native/normalize-colors': '0.81.5'
'@react-native/babel-preset': '0.85.3'
'@react-native/normalize-colors': '0.85.3'
'@expo/image-utils': '0.8.12'
'@types/estree': '1.0.6'
'react-native-compressor': '1.13.0'
'react-native-reanimated': '3.19.1'
'psl': '1.9.0'
'@types/psl': '1.1.1'
'react-native-screens': '4.24.0'
allowBuilds:
'@sentry/cli': true
'core-js-pure': true
'esbuild': true
'msgpackr-extract': true
'unrs-resolver': true
patchedDependencies:
'@discord/bottom-sheet@4.6.1': patches/@discord__bottom-sheet@4.6.1.patch
'@sentry/react-native@6.20.0': patches/@sentry__react-native@6.20.0.patch
'expo-glass-effect@55.0.8': patches/expo-glass-effect@55.0.8.patch
'expo-haptics@15.0.8': patches/expo-haptics@15.0.8.patch
'expo-image-picker@17.0.11': patches/expo-image-picker@17.0.11.patch
'expo-image@3.0.11': patches/expo-image@3.0.11.patch
'expo-media-library@18.2.1': patches/expo-media-library@18.2.1.patch
'expo-modules-core@3.0.30': patches/expo-modules-core@3.0.30.patch
'expo-notifications@0.32.17': patches/expo-notifications@0.32.17.patch
'expo-updates@29.0.17': patches/expo-updates@29.0.17.patch
# 'expo-haptics@15.0.8': patches/expo-haptics@15.0.8.patch
# 'expo-image-picker@17.0.11': patches/expo-image-picker@17.0.11.patch
# 'expo-media-library@18.2.1': patches/expo-media-library@18.2.1.patch
# 'expo-modules-core@3.0.30': patches/expo-modules-core@3.0.30.patch
# 'expo-notifications@0.32.17': patches/expo-notifications@0.32.17.patch
# 'expo-updates@29.0.17': patches/expo-updates@29.0.17.patch
'react-native-compressor@1.13.0': patches/react-native-compressor@1.13.0.patch
'react-native-date-picker@5.0.13': patches/react-native-date-picker@5.0.13.patch
'react-native-drawer-layout@4.2.3': patches/react-native-drawer-layout@4.2.3.patch
'react-native-keyboard-controller@1.21.8': patches/react-native-keyboard-controller@1.21.8.patch
'react-native-pager-view@6.8.0': patches/react-native-pager-view@6.8.0.patch
'react-native-reanimated@3.19.1': patches/react-native-reanimated@3.19.1.patch
'react-native-svg@15.12.1': patches/react-native-svg@15.12.1.patch
'react-native-uitextview@1.4.0': patches/react-native-uitextview@1.4.0.patch
'react-native-view-shot@4.0.3': patches/react-native-view-shot@4.0.3.patch
'react-native@0.81.5': patches/react-native@0.81.5.patch
'react-native-svg@15.15.4': patches/react-native-svg@15.15.4.patch
'sonner-native@0.21.0': patches/sonner-native@0.21.0.patch
minimumReleaseAgeExclude:
- '@atproto/*'
+3 -1
View File
@@ -20,6 +20,7 @@ import {Image} from 'expo-image'
import * as SplashScreen from 'expo-splash-screen'
import {Logotype} from '#/view/icons/Logotype'
import {atoms as a} from '#/alf'
// @ts-ignore
import splashImagePointer from '../assets/splash/splash.png'
// @ts-ignore
@@ -223,7 +224,8 @@ export function Splash(props: React.PropsWithChildren<Props>) {
{!isAnimationComplete && (
<Animated.View
style={[
StyleSheet.absoluteFillObject,
a.absolute,
a.inset_0,
logoWrapperAnimation,
{
flex: 1,
+1 -1
View File
@@ -1,4 +1,4 @@
import {MMKV} from '@bsky.app/react-native-mmkv'
import {MMKV} from 'react-native-mmkv'
import {setPolyfills} from '@growthbook/growthbook'
import {GrowthBook} from '@growthbook/growthbook-react'
@@ -1,11 +1,10 @@
import {useCallback, useImperativeHandle, useState} from 'react'
import {Keyboard} from 'react-native'
import DatePicker from 'react-native-date-picker'
import {useLingui} from '@lingui/react'
import {useTheme} from '#/alf'
// import {useLingui} from '@lingui/react'
// import {useTheme} from '#/alf'
import {type DateFieldProps} from '#/components/forms/DateField/types'
import {toSimpleDateString} from '#/components/forms/DateField/utils'
// import {toSimpleDateString} from '#/components/forms/DateField/utils'
import * as TextField from '#/components/forms/TextField'
import {DateFieldButton} from './index.shared'
@@ -15,26 +14,26 @@ export const LabelText = TextField.LabelText
export function DateField({
value,
inputRef,
onChangeDate,
// onChangeDate,
label,
isInvalid,
testID,
// testID,
accessibilityHint,
maximumDate,
// maximumDate,
}: DateFieldProps) {
const {i18n} = useLingui()
const t = useTheme()
// const {i18n} = useLingui()
// const t = useTheme()
const [open, setOpen] = useState(false)
const onChangeInternal = useCallback(
(date: Date) => {
setOpen(false)
// const onChangeInternal = useCallback(
// (date: Date) => {
// setOpen(false)
const formatted = toSimpleDateString(date)
onChangeDate(formatted)
},
[onChangeDate, setOpen],
)
// const formatted = toSimpleDateString(date)
// onChangeDate(formatted)
// },
// [onChangeDate, setOpen],
// )
useImperativeHandle(
inputRef,
@@ -54,9 +53,9 @@ export function DateField({
setOpen(true)
}, [])
const onCancel = useCallback(() => {
setOpen(false)
}, [])
// const onCancel = useCallback(() => {
// setOpen(false)
// }, [])
return (
<>
@@ -68,31 +67,36 @@ export function DateField({
accessibilityHint={accessibilityHint}
/>
{open && (
// Android implementation of DatePicker currently does not change default button colors according to theme and only takes hex values for buttonColor
// Can remove the buttonColor setting if/when this PR is merged: https://github.com/henninghall/react-native-date-picker/pull/871
<DatePicker
modal
open
timeZoneOffsetInMinutes={0}
theme={t.scheme}
// @ts-ignore TODO
buttonColor={t.name === 'light' ? '#000000' : '#ffffff'}
date={new Date(value)}
onConfirm={onChangeInternal}
onCancel={onCancel}
mode="date"
locale={i18n.locale}
is24hourSource="locale"
testID={`${testID}-datepicker`}
aria-label={label}
accessibilityLabel={label}
accessibilityHint={accessibilityHint}
maximumDate={
maximumDate ? new Date(toSimpleDateString(maximumDate)) : undefined
{
open &&
// Android implementation of DatePicker currently does not change default button colors according to theme and only takes hex values for buttonColor
// Can remove the buttonColor setting if/when this PR is merged: https://github.com/henninghall/react-native-date-picker/pull/871
{
/* TODO: replace with expo ui date picker */
}
/>
)}
// <DatePicker
// modal
// open
// timeZoneOffsetInMinutes={0}
// theme={t.scheme}
// // @ts-ignore TODO
// buttonColor={t.name === 'light' ? '#000000' : '#ffffff'}
// date={new Date(value)}
// onConfirm={onChangeInternal}
// onCancel={onCancel}
// mode="date"
// locale={i18n.locale}
// is24hourSource="locale"
// testID={`${testID}-datepicker`}
// aria-label={label}
// accessibilityLabel={label}
// accessibilityHint={accessibilityHint}
// maximumDate={
// maximumDate ? new Date(toSimpleDateString(maximumDate)) : undefined
// }
// />
}
</>
)
}
+19 -19
View File
@@ -1,15 +1,14 @@
import {useCallback, useImperativeHandle} from 'react'
import {useImperativeHandle} from 'react'
import {Keyboard, View} from 'react-native'
import DatePicker from 'react-native-date-picker'
import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro'
import {atoms as a, useTheme} from '#/alf'
import {atoms as a} from '#/alf'
import {Button, ButtonText} from '#/components/Button'
import * as Dialog from '#/components/Dialog'
import {type DateFieldProps} from '#/components/forms/DateField/types'
import {toSimpleDateString} from '#/components/forms/DateField/utils'
// import {toSimpleDateString} from '#/components/forms/DateField/utils'
import * as TextField from '#/components/forms/TextField'
import {DateFieldButton} from './index.shared'
@@ -27,26 +26,26 @@ export const LabelText = TextField.LabelText
export function DateField({
value,
inputRef,
onChangeDate,
// onChangeDate,
testID,
label,
isInvalid,
accessibilityHint,
maximumDate,
// maximumDate,
}: DateFieldProps) {
const {_, i18n} = useLingui()
const t = useTheme()
const {_} = useLingui()
// const t = useTheme()
const control = Dialog.useDialogControl()
const onChangeInternal = useCallback(
(date: Date | undefined) => {
if (date) {
const formatted = toSimpleDateString(date)
onChangeDate(formatted)
}
},
[onChangeDate],
)
// const onChangeInternal = useCallback(
// (date: Date | undefined) => {
// if (date) {
// const formatted = toSimpleDateString(date)
// onChangeDate(formatted)
// }
// },
// [onChangeDate],
// )
useImperativeHandle(
inputRef,
@@ -82,7 +81,8 @@ export function DateField({
<Dialog.ScrollableInner label={label}>
<View style={a.gap_lg}>
<View style={[a.relative, a.w_full, a.align_center]}>
<DatePicker
{/* TODO: replace with expo ui date picker */}
{/*<DatePicker
timeZoneOffsetInMinutes={0}
theme={t.scheme}
date={new Date(toSimpleDateString(value))}
@@ -98,7 +98,7 @@ export function DateField({
? new Date(toSimpleDateString(maximumDate))
: undefined
}
/>
/>*/}
</View>
<Button
label={_(msg`Done`)}
@@ -1,6 +1,6 @@
import {beforeEach, describe, expect, it, jest} from '@jest/globals'
jest.mock('@bsky.app/react-native-mmkv', () => ({
jest.mock('react-native-mmkv', () => ({
MMKV: class MMKVMock {
_store = new Map<string, string>()
+1 -1
View File
@@ -2,7 +2,7 @@ import {beforeEach, expect, jest, test} from '@jest/globals'
import {Storage} from '#/storage'
jest.mock('@bsky.app/react-native-mmkv', () => ({
jest.mock('react-native-mmkv', () => ({
MMKV: class MMKVMock {
_store = new Map()
+1 -1
View File
@@ -1,4 +1,4 @@
import {MMKV} from '@bsky.app/react-native-mmkv'
import {MMKV} from 'react-native-mmkv'
import {type DB} from '#/storage/archive/db/types'
+1 -1
View File
@@ -1,5 +1,5 @@
import {useCallback, useEffect, useState} from 'react'
import {MMKV} from '@bsky.app/react-native-mmkv'
import {MMKV} from 'react-native-mmkv'
import {type Account, type Device} from '#/storage/schema'