Let's keep it simple and use existing composer solution
This commit is contained in:
+7
-7
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "bsky.app",
|
"name": "bsky.app",
|
||||||
"version": "1.120.0",
|
"version": "1.121.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=20"
|
"node": ">=20"
|
||||||
@@ -81,14 +81,15 @@
|
|||||||
"icons:optimize": "svgo -f ./assets/icons"
|
"icons:optimize": "svgo -f ./assets/icons"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@atproto/api": "^0.19.6",
|
"@atproto/api": "^0.19.8",
|
||||||
"@bitdrift/react-native": "^0.6.8",
|
"@bitdrift/react-native": "^0.6.8",
|
||||||
"@braintree/sanitize-url": "^6.0.2",
|
"@braintree/sanitize-url": "^6.0.2",
|
||||||
"@bsky.app/alf": "^0.1.7",
|
"@bsky.app/alf": "^0.1.7",
|
||||||
"@bsky.app/expo-image-crop-tool": "^0.5.0",
|
"@bsky.app/expo-image-crop-tool": "^0.5.0",
|
||||||
|
"@bsky.app/expo-scroll-edge-effect": "^0.1.4",
|
||||||
"@bsky.app/expo-translate-text": "^0.2.9",
|
"@bsky.app/expo-translate-text": "^0.2.9",
|
||||||
"@bsky.app/react-native-mmkv": "2.12.5",
|
"@bsky.app/react-native-mmkv": "2.12.5",
|
||||||
"@bsky.app/sift": "^0.3.1",
|
"@bsky.app/sift": "^0.3.2",
|
||||||
"@bsky.app/tapper": "^0.5.0",
|
"@bsky.app/tapper": "^0.5.0",
|
||||||
"@discord/bottom-sheet": "bluesky-social/react-native-bottom-sheet",
|
"@discord/bottom-sheet": "bluesky-social/react-native-bottom-sheet",
|
||||||
"@emoji-mart/data": "^1.2.1",
|
"@emoji-mart/data": "^1.2.1",
|
||||||
@@ -142,7 +143,6 @@
|
|||||||
"bcp-47-match": "^2.0.3",
|
"bcp-47-match": "^2.0.3",
|
||||||
"date-fns": "^2.30.0",
|
"date-fns": "^2.30.0",
|
||||||
"email-validator": "^2.0.4",
|
"email-validator": "^2.0.4",
|
||||||
"embla-carousel-react": "^8.6.0",
|
|
||||||
"emoji-mart": "^5.6.0",
|
"emoji-mart": "^5.6.0",
|
||||||
"emoji-regex": "^10.4.0",
|
"emoji-regex": "^10.4.0",
|
||||||
"eventemitter3": "^5.0.1",
|
"eventemitter3": "^5.0.1",
|
||||||
@@ -157,6 +157,7 @@
|
|||||||
"expo-device": "~8.0.10",
|
"expo-device": "~8.0.10",
|
||||||
"expo-file-system": "~19.0.21",
|
"expo-file-system": "~19.0.21",
|
||||||
"expo-font": "~14.0.11",
|
"expo-font": "~14.0.11",
|
||||||
|
"expo-glass-effect": "55.0.8",
|
||||||
"expo-haptics": "~15.0.8",
|
"expo-haptics": "~15.0.8",
|
||||||
"expo-image": "~3.0.11",
|
"expo-image": "~3.0.11",
|
||||||
"expo-image-manipulator": "~14.0.8",
|
"expo-image-manipulator": "~14.0.8",
|
||||||
@@ -169,7 +170,7 @@
|
|||||||
"expo-location": "~19.0.8",
|
"expo-location": "~19.0.8",
|
||||||
"expo-media-library": "~18.2.1",
|
"expo-media-library": "~18.2.1",
|
||||||
"expo-notifications": "~0.32.16",
|
"expo-notifications": "~0.32.16",
|
||||||
"expo-paste-input": "^0.1.12",
|
"expo-paste-input": "^0.1.15",
|
||||||
"expo-privacy-sensitive": "^0.1.0",
|
"expo-privacy-sensitive": "^0.1.0",
|
||||||
"expo-screen-orientation": "~9.0.8",
|
"expo-screen-orientation": "~9.0.8",
|
||||||
"expo-sharing": "~14.0.8",
|
"expo-sharing": "~14.0.8",
|
||||||
@@ -214,7 +215,7 @@
|
|||||||
"react-native-drawer-layout": "^4.2.2",
|
"react-native-drawer-layout": "^4.2.2",
|
||||||
"react-native-edge-to-edge": "^1.6.0",
|
"react-native-edge-to-edge": "^1.6.0",
|
||||||
"react-native-gesture-handler": "~2.28.0",
|
"react-native-gesture-handler": "~2.28.0",
|
||||||
"react-native-keyboard-controller": "^1.21.0",
|
"react-native-keyboard-controller": "^1.21.5",
|
||||||
"react-native-pager-view": "6.8.0",
|
"react-native-pager-view": "6.8.0",
|
||||||
"react-native-progress": "bluesky-social/react-native-progress",
|
"react-native-progress": "bluesky-social/react-native-progress",
|
||||||
"react-native-qrcode-styled": "^0.3.3",
|
"react-native-qrcode-styled": "^0.3.3",
|
||||||
@@ -246,7 +247,6 @@
|
|||||||
"@babel/runtime": "^7.26.0",
|
"@babel/runtime": "^7.26.0",
|
||||||
"@crowdin/cli": "^4.14.1",
|
"@crowdin/cli": "^4.14.1",
|
||||||
"@eslint/js": "^9.39.2",
|
"@eslint/js": "^9.39.2",
|
||||||
"@expo/config-plugins": "~54.0.4",
|
|
||||||
"@lingui/babel-plugin-lingui-macro": "^5.9.2",
|
"@lingui/babel-plugin-lingui-macro": "^5.9.2",
|
||||||
"@lingui/cli": "^5.9.2",
|
"@lingui/cli": "^5.9.2",
|
||||||
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.15",
|
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.15",
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
import {memo, useState} from 'react'
|
import {memo, useMemo, useState} from 'react'
|
||||||
import {
|
import {
|
||||||
findNodeHandle,
|
findNodeHandle,
|
||||||
|
type ImageStyle,
|
||||||
Keyboard,
|
Keyboard,
|
||||||
type LayoutChangeEvent,
|
type LayoutChangeEvent,
|
||||||
Platform,
|
Platform,
|
||||||
StyleSheet,
|
StyleSheet,
|
||||||
TouchableOpacity,
|
TouchableOpacity,
|
||||||
View,
|
View,
|
||||||
|
type ViewStyle,
|
||||||
} from 'react-native'
|
} from 'react-native'
|
||||||
import {Image} from 'expo-image'
|
import {Image} from 'expo-image'
|
||||||
import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
|
import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
|
||||||
@@ -14,10 +16,10 @@ import {msg} from '@lingui/core/macro'
|
|||||||
import {useLingui} from '@lingui/react'
|
import {useLingui} from '@lingui/react'
|
||||||
import {Trans} from '@lingui/react/macro'
|
import {Trans} from '@lingui/react/macro'
|
||||||
|
|
||||||
|
import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries'
|
||||||
import {type Dimensions} from '#/lib/media/types'
|
import {type Dimensions} from '#/lib/media/types'
|
||||||
import {colors} from '#/lib/styles'
|
import {colors} from '#/lib/styles'
|
||||||
import {type ComposerImage, cropImage} from '#/state/gallery'
|
import {type ComposerImage, cropImage} from '#/state/gallery'
|
||||||
import {DraggableScrollView} from '#/view/com/pager/DraggableScrollView'
|
|
||||||
import {atoms as a, tokens, useTheme} from '#/alf'
|
import {atoms as a, tokens, useTheme} from '#/alf'
|
||||||
import {Admonition} from '#/components/Admonition'
|
import {Admonition} from '#/components/Admonition'
|
||||||
import * as Dialog from '#/components/Dialog'
|
import * as Dialog from '#/components/Dialog'
|
||||||
@@ -30,7 +32,6 @@ import {EditImageDialog} from './EditImageDialog'
|
|||||||
import {ImageAltTextDialog} from './ImageAltTextDialog'
|
import {ImageAltTextDialog} from './ImageAltTextDialog'
|
||||||
|
|
||||||
const IMAGE_GAP = 8
|
const IMAGE_GAP = 8
|
||||||
const CONTAINER_HEIGHT = 200
|
|
||||||
|
|
||||||
interface GalleryProps {
|
interface GalleryProps {
|
||||||
images: ComposerImage[]
|
images: ComposerImage[]
|
||||||
@@ -62,32 +63,53 @@ interface GalleryInnerProps extends GalleryProps {
|
|||||||
containerInfo: Dimensions
|
containerInfo: Dimensions
|
||||||
}
|
}
|
||||||
|
|
||||||
const getItemWidth = (image: ComposerImage, height: number) => {
|
const GalleryInner = ({images, containerInfo, dispatch}: GalleryInnerProps) => {
|
||||||
const source = image.transformed ?? image.source
|
const {isMobile} = useWebMediaQueries()
|
||||||
if (source.width > 0 && source.height > 0) {
|
|
||||||
const ratio = source.width / source.height
|
const {altTextControlStyle, imageControlsStyle, imageStyle} = useMemo(() => {
|
||||||
const w = height * ratio
|
const side =
|
||||||
// Clamp: at least 60% of height, at most 1.5x height
|
images.length === 1
|
||||||
return Math.max(height * 0.6, Math.min(w, height * 1.5))
|
? 250
|
||||||
}
|
: (containerInfo.width - IMAGE_GAP * (images.length - 1)) /
|
||||||
return height
|
images.length
|
||||||
}
|
|
||||||
|
const isOverflow = isMobile && images.length > 2
|
||||||
|
|
||||||
|
return {
|
||||||
|
altTextControlStyle: isOverflow
|
||||||
|
? {left: 4, bottom: 4}
|
||||||
|
: !isMobile && images.length < 3
|
||||||
|
? {left: 8, top: 8}
|
||||||
|
: {left: 4, top: 4},
|
||||||
|
imageControlsStyle: {
|
||||||
|
display: 'flex' as const,
|
||||||
|
flexDirection: 'row' as const,
|
||||||
|
position: 'absolute' as const,
|
||||||
|
...(isOverflow
|
||||||
|
? {top: 4, right: 4, gap: 4}
|
||||||
|
: !isMobile && images.length < 3
|
||||||
|
? {top: 8, right: 8, gap: 8}
|
||||||
|
: {top: 4, right: 4, gap: 4}),
|
||||||
|
zIndex: 1,
|
||||||
|
},
|
||||||
|
imageStyle: {
|
||||||
|
height: side,
|
||||||
|
width: side,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}, [images.length, containerInfo, isMobile])
|
||||||
|
|
||||||
const GalleryInner = ({images, dispatch}: GalleryInnerProps) => {
|
|
||||||
return images.length !== 0 ? (
|
return images.length !== 0 ? (
|
||||||
<>
|
<>
|
||||||
<DraggableScrollView
|
<View testID="selectedPhotosView" style={styles.gallery}>
|
||||||
testID="selectedPhotosView"
|
|
||||||
showsHorizontalScrollIndicator={false}
|
|
||||||
contentContainerStyle={{gap: IMAGE_GAP, paddingTop: 16}}
|
|
||||||
style={{height: CONTAINER_HEIGHT + 16}}>
|
|
||||||
{images.map(image => {
|
{images.map(image => {
|
||||||
return (
|
return (
|
||||||
<GalleryItem
|
<GalleryItem
|
||||||
key={image.source.id}
|
key={image.source.id}
|
||||||
image={image}
|
image={image}
|
||||||
itemWidth={getItemWidth(image, CONTAINER_HEIGHT)}
|
altTextControlStyle={altTextControlStyle}
|
||||||
itemHeight={CONTAINER_HEIGHT}
|
imageControlsStyle={imageControlsStyle}
|
||||||
|
imageStyle={imageStyle}
|
||||||
onChange={next => {
|
onChange={next => {
|
||||||
dispatch({type: 'embed_update_image', image: next})
|
dispatch({type: 'embed_update_image', image: next})
|
||||||
}}
|
}}
|
||||||
@@ -97,7 +119,7 @@ const GalleryInner = ({images, dispatch}: GalleryInnerProps) => {
|
|||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
})}
|
})}
|
||||||
</DraggableScrollView>
|
</View>
|
||||||
{images.some(image => !image.alt) && (
|
{images.some(image => !image.alt) && (
|
||||||
<Admonition type="info" style={[a.mt_sm]}>
|
<Admonition type="info" style={[a.mt_sm]}>
|
||||||
<Trans>
|
<Trans>
|
||||||
@@ -112,16 +134,18 @@ const GalleryInner = ({images, dispatch}: GalleryInnerProps) => {
|
|||||||
|
|
||||||
type GalleryItemProps = {
|
type GalleryItemProps = {
|
||||||
image: ComposerImage
|
image: ComposerImage
|
||||||
itemWidth: number
|
altTextControlStyle?: ViewStyle
|
||||||
itemHeight: number
|
imageControlsStyle?: ViewStyle
|
||||||
|
imageStyle?: ImageStyle
|
||||||
onChange: (next: ComposerImage) => void
|
onChange: (next: ComposerImage) => void
|
||||||
onRemove: () => void
|
onRemove: () => void
|
||||||
}
|
}
|
||||||
|
|
||||||
const GalleryItem = ({
|
const GalleryItem = ({
|
||||||
image,
|
image,
|
||||||
itemWidth,
|
altTextControlStyle,
|
||||||
itemHeight,
|
imageControlsStyle,
|
||||||
|
imageStyle,
|
||||||
onChange,
|
onChange,
|
||||||
onRemove,
|
onRemove,
|
||||||
}: GalleryItemProps): React.ReactNode => {
|
}: GalleryItemProps): React.ReactNode => {
|
||||||
@@ -134,6 +158,7 @@ const GalleryItem = ({
|
|||||||
const [altBtnViewTag, setAltBtnViewTag] = useState<number>()
|
const [altBtnViewTag, setAltBtnViewTag] = useState<number>()
|
||||||
|
|
||||||
const altBtnRef = (node: View | null) => {
|
const altBtnRef = (node: View | null) => {
|
||||||
|
// for iOS 26 fluid transition
|
||||||
if (IS_IOS && node) {
|
if (IS_IOS && node) {
|
||||||
const tag = findNodeHandle(node)
|
const tag = findNodeHandle(node)
|
||||||
if (tag != null) setAltBtnViewTag(tag)
|
if (tag != null) setAltBtnViewTag(tag)
|
||||||
@@ -162,8 +187,33 @@ const GalleryItem = ({
|
|||||||
return (
|
return (
|
||||||
<View
|
<View
|
||||||
ref={altBtnRef}
|
ref={altBtnRef}
|
||||||
style={{width: itemWidth, height: itemHeight}}
|
style={imageStyle as ViewStyle}
|
||||||
|
// Fixes ALT and icons appearing with half opacity when the post is inactive
|
||||||
renderToHardwareTextureAndroid>
|
renderToHardwareTextureAndroid>
|
||||||
|
<TouchableOpacity
|
||||||
|
testID="altTextButton"
|
||||||
|
accessibilityRole="button"
|
||||||
|
accessibilityLabel={_(msg`Add alt text`)}
|
||||||
|
accessibilityHint=""
|
||||||
|
onPress={onAltTextEdit}
|
||||||
|
style={[styles.altTextControl, altTextControlStyle]}>
|
||||||
|
{image.alt.length !== 0 ? (
|
||||||
|
<FontAwesomeIcon
|
||||||
|
icon="check"
|
||||||
|
size={10}
|
||||||
|
style={{color: t.palette.white}}
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
|
<FontAwesomeIcon
|
||||||
|
icon="plus"
|
||||||
|
size={10}
|
||||||
|
style={{color: t.palette.white}}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
<Text style={styles.altTextControlLabel} accessible={false}>
|
||||||
|
<Trans>ALT</Trans>
|
||||||
|
</Text>
|
||||||
|
</TouchableOpacity>
|
||||||
<View style={imageControlsStyle}>
|
<View style={imageControlsStyle}>
|
||||||
<TouchableOpacity
|
<TouchableOpacity
|
||||||
testID="editPhotoButton"
|
testID="editPhotoButton"
|
||||||
@@ -188,32 +238,6 @@ const GalleryItem = ({
|
|||||||
/>
|
/>
|
||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
</View>
|
</View>
|
||||||
|
|
||||||
<TouchableOpacity
|
|
||||||
testID="altTextButton"
|
|
||||||
accessibilityRole="button"
|
|
||||||
accessibilityLabel={_(msg`Add alt text`)}
|
|
||||||
accessibilityHint=""
|
|
||||||
onPress={onAltTextEdit}
|
|
||||||
style={[styles.altTextControl, {left: 4, bottom: 4}]}>
|
|
||||||
{image.alt.length !== 0 ? (
|
|
||||||
<FontAwesomeIcon
|
|
||||||
icon="check"
|
|
||||||
size={10}
|
|
||||||
style={{color: t.palette.white}}
|
|
||||||
/>
|
|
||||||
) : (
|
|
||||||
<FontAwesomeIcon
|
|
||||||
icon="plus"
|
|
||||||
size={10}
|
|
||||||
style={{color: t.palette.white}}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
<Text style={styles.altTextControlLabel} accessible={false}>
|
|
||||||
<Trans>ALT</Trans>
|
|
||||||
</Text>
|
|
||||||
</TouchableOpacity>
|
|
||||||
|
|
||||||
<TouchableOpacity
|
<TouchableOpacity
|
||||||
accessibilityRole="button"
|
accessibilityRole="button"
|
||||||
accessibilityLabel={_(msg`Add alt text`)}
|
accessibilityLabel={_(msg`Add alt text`)}
|
||||||
@@ -224,7 +248,7 @@ const GalleryItem = ({
|
|||||||
|
|
||||||
<Image
|
<Image
|
||||||
testID="selectedPhotoImage"
|
testID="selectedPhotoImage"
|
||||||
style={[styles.image, {width: itemWidth, height: itemHeight}]}
|
style={[styles.image, imageStyle]}
|
||||||
source={{
|
source={{
|
||||||
uri: (image.transformed ?? image.source).path,
|
uri: (image.transformed ?? image.source).path,
|
||||||
}}
|
}}
|
||||||
@@ -253,17 +277,13 @@ const GalleryItem = ({
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
const imageControlsStyle = {
|
|
||||||
display: 'flex' as const,
|
|
||||||
flexDirection: 'row' as const,
|
|
||||||
position: 'absolute' as const,
|
|
||||||
top: 4,
|
|
||||||
right: 4,
|
|
||||||
gap: 4,
|
|
||||||
zIndex: 1,
|
|
||||||
}
|
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
const styles = StyleSheet.create({
|
||||||
|
gallery: {
|
||||||
|
flex: 1,
|
||||||
|
flexDirection: 'row',
|
||||||
|
gap: IMAGE_GAP,
|
||||||
|
marginTop: 16,
|
||||||
|
},
|
||||||
image: {
|
image: {
|
||||||
borderRadius: tokens.borderRadius.md,
|
borderRadius: tokens.borderRadius.md,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -20,12 +20,12 @@
|
|||||||
"@jridgewell/gen-mapping" "^0.3.0"
|
"@jridgewell/gen-mapping" "^0.3.0"
|
||||||
"@jridgewell/trace-mapping" "^0.3.9"
|
"@jridgewell/trace-mapping" "^0.3.9"
|
||||||
|
|
||||||
"@atproto/api@^0.19.6":
|
"@atproto/api@^0.19.8":
|
||||||
version "0.19.6"
|
version "0.19.8"
|
||||||
resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.19.6.tgz#c8fae3d792fe429c900ac0ba2609d60b9a89e28b"
|
resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.19.8.tgz#ae847abece43f0108535c6305780079e8782ab29"
|
||||||
integrity sha512-8L5dZvGaclB52b8msjtgDNx3uLWUY4PELA7KbFyAWBFVasCceE1txdrscCqDCLN+Fff9+Sm07OIjnjHYJXdETA==
|
integrity sha512-b79kuI3AzEmpLLi9afRNq6T0KFEEVL4d+vHFAtWxeDwS7lfwUOIIngMjAVvwmwC5nJRZIrK8L9d4y7LD8zdvsg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@atproto/common-web" "^0.4.19"
|
"@atproto/common-web" "^0.4.20"
|
||||||
"@atproto/lexicon" "^0.6.2"
|
"@atproto/lexicon" "^0.6.2"
|
||||||
"@atproto/syntax" "^0.5.3"
|
"@atproto/syntax" "^0.5.3"
|
||||||
"@atproto/xrpc" "^0.7.7"
|
"@atproto/xrpc" "^0.7.7"
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
tlds "^1.234.0"
|
tlds "^1.234.0"
|
||||||
zod "^3.23.8"
|
zod "^3.23.8"
|
||||||
|
|
||||||
"@atproto/common-web@^0.4.18", "@atproto/common-web@^0.4.19":
|
"@atproto/common-web@^0.4.18":
|
||||||
version "0.4.19"
|
version "0.4.19"
|
||||||
resolved "https://registry.yarnpkg.com/@atproto/common-web/-/common-web-0.4.19.tgz#bbd7f84f545ebe73ca3bc00314ccf4ee66e7069e"
|
resolved "https://registry.yarnpkg.com/@atproto/common-web/-/common-web-0.4.19.tgz#bbd7f84f545ebe73ca3bc00314ccf4ee66e7069e"
|
||||||
integrity sha512-3BTi58p5WpT+9/zb6UZrdsXcfPo5P45UJm0E4iwHLILr+jc37CuBj9JReDSZ4U0i9RTrI3ZkfySyZ9bd+LnMsw==
|
integrity sha512-3BTi58p5WpT+9/zb6UZrdsXcfPo5P45UJm0E4iwHLILr+jc37CuBj9JReDSZ4U0i9RTrI3ZkfySyZ9bd+LnMsw==
|
||||||
@@ -44,6 +44,16 @@
|
|||||||
"@atproto/syntax" "^0.5.1"
|
"@atproto/syntax" "^0.5.1"
|
||||||
zod "^3.23.8"
|
zod "^3.23.8"
|
||||||
|
|
||||||
|
"@atproto/common-web@^0.4.20":
|
||||||
|
version "0.4.20"
|
||||||
|
resolved "https://registry.yarnpkg.com/@atproto/common-web/-/common-web-0.4.20.tgz#bb455868e674d45ed1044c68ccccae3c08168d47"
|
||||||
|
integrity sha512-RcsYT28yQgVi/Glb/hHPGpqpzIlKrbMLeldEd7PmmMLWDaJL2j3lb92qytvxjl1yhi2Ssq2TEuMZ2NlWaAbpow==
|
||||||
|
dependencies:
|
||||||
|
"@atproto/lex-data" "^0.0.15"
|
||||||
|
"@atproto/lex-json" "^0.0.15"
|
||||||
|
"@atproto/syntax" "^0.5.3"
|
||||||
|
zod "^3.23.8"
|
||||||
|
|
||||||
"@atproto/lex-data@^0.0.14":
|
"@atproto/lex-data@^0.0.14":
|
||||||
version "0.0.14"
|
version "0.0.14"
|
||||||
resolved "https://registry.yarnpkg.com/@atproto/lex-data/-/lex-data-0.0.14.tgz#2f2f3c64699925a0d4785e5afd0e7731ba1d46c0"
|
resolved "https://registry.yarnpkg.com/@atproto/lex-data/-/lex-data-0.0.14.tgz#2f2f3c64699925a0d4785e5afd0e7731ba1d46c0"
|
||||||
@@ -54,6 +64,16 @@
|
|||||||
uint8arrays "3.0.0"
|
uint8arrays "3.0.0"
|
||||||
unicode-segmenter "^0.14.0"
|
unicode-segmenter "^0.14.0"
|
||||||
|
|
||||||
|
"@atproto/lex-data@^0.0.15":
|
||||||
|
version "0.0.15"
|
||||||
|
resolved "https://registry.yarnpkg.com/@atproto/lex-data/-/lex-data-0.0.15.tgz#b9a644d71d4a99b32f452250994b5f12276335ef"
|
||||||
|
integrity sha512-ZsbGiaM5S3CnGrcTMbDGON3bLZzCi/Mx9UvcMREKSRujnF68eHgMiXxJqvykP7+QpOX6tYCK93axZkuJVhtSEw==
|
||||||
|
dependencies:
|
||||||
|
multiformats "^9.9.0"
|
||||||
|
tslib "^2.8.1"
|
||||||
|
uint8arrays "3.0.0"
|
||||||
|
unicode-segmenter "^0.14.0"
|
||||||
|
|
||||||
"@atproto/lex-json@^0.0.14":
|
"@atproto/lex-json@^0.0.14":
|
||||||
version "0.0.14"
|
version "0.0.14"
|
||||||
resolved "https://registry.yarnpkg.com/@atproto/lex-json/-/lex-json-0.0.14.tgz#717e533ab583aa5f580acb2a77d9aa3e7eddaa17"
|
resolved "https://registry.yarnpkg.com/@atproto/lex-json/-/lex-json-0.0.14.tgz#717e533ab583aa5f580acb2a77d9aa3e7eddaa17"
|
||||||
@@ -62,6 +82,14 @@
|
|||||||
"@atproto/lex-data" "^0.0.14"
|
"@atproto/lex-data" "^0.0.14"
|
||||||
tslib "^2.8.1"
|
tslib "^2.8.1"
|
||||||
|
|
||||||
|
"@atproto/lex-json@^0.0.15":
|
||||||
|
version "0.0.15"
|
||||||
|
resolved "https://registry.yarnpkg.com/@atproto/lex-json/-/lex-json-0.0.15.tgz#34d300e5dfd8a0ec76ca7363f264a488e17c1bd9"
|
||||||
|
integrity sha512-kCLdP629H6GhgPjBTpZibUoqlpmW0hnVfZVwcD4s4Jch1KAqY/QcfL24Ih8wrW0Ok1YvtMIhjk98evdTA2OJcw==
|
||||||
|
dependencies:
|
||||||
|
"@atproto/lex-data" "^0.0.15"
|
||||||
|
tslib "^2.8.1"
|
||||||
|
|
||||||
"@atproto/lexicon@^0.6.0", "@atproto/lexicon@^0.6.2":
|
"@atproto/lexicon@^0.6.0", "@atproto/lexicon@^0.6.2":
|
||||||
version "0.6.2"
|
version "0.6.2"
|
||||||
resolved "https://registry.yarnpkg.com/@atproto/lexicon/-/lexicon-0.6.2.tgz#f6152a2119df953236ca127c4b30e332265e81e7"
|
resolved "https://registry.yarnpkg.com/@atproto/lexicon/-/lexicon-0.6.2.tgz#f6152a2119df953236ca127c4b30e332265e81e7"
|
||||||
@@ -2401,6 +2429,11 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@bsky.app/expo-image-crop-tool/-/expo-image-crop-tool-0.5.0.tgz#4308fbde5c15e6be9122601797bc3d9549c95e31"
|
resolved "https://registry.yarnpkg.com/@bsky.app/expo-image-crop-tool/-/expo-image-crop-tool-0.5.0.tgz#4308fbde5c15e6be9122601797bc3d9549c95e31"
|
||||||
integrity sha512-gmhQr2HWTRFyPO00fn5OmtiEVtikXusHMrN5Zoq26pu1VZX3zVE+aoc668etTqrvsQcm2Qu8fo96k5F3Wu+6wg==
|
integrity sha512-gmhQr2HWTRFyPO00fn5OmtiEVtikXusHMrN5Zoq26pu1VZX3zVE+aoc668etTqrvsQcm2Qu8fo96k5F3Wu+6wg==
|
||||||
|
|
||||||
|
"@bsky.app/expo-scroll-edge-effect@^0.1.4":
|
||||||
|
version "0.1.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/@bsky.app/expo-scroll-edge-effect/-/expo-scroll-edge-effect-0.1.4.tgz#8b785b606c3078b3f8d1ec200adaf13bc59c2fec"
|
||||||
|
integrity sha512-P94YcYBqZfuUy7ewTrWulPTxTbs6Yvjg2xS5WX4I/F3R3cSQU9fc8vEzb2Pnn4Ieg2wukJdAywqzt+AnyWgJbw==
|
||||||
|
|
||||||
"@bsky.app/expo-translate-text@^0.2.9":
|
"@bsky.app/expo-translate-text@^0.2.9":
|
||||||
version "0.2.9"
|
version "0.2.9"
|
||||||
resolved "https://registry.yarnpkg.com/@bsky.app/expo-translate-text/-/expo-translate-text-0.2.9.tgz#4ed4552cd50bca7d02d14e706e419bd728d4ab51"
|
resolved "https://registry.yarnpkg.com/@bsky.app/expo-translate-text/-/expo-translate-text-0.2.9.tgz#4ed4552cd50bca7d02d14e706e419bd728d4ab51"
|
||||||
@@ -2411,10 +2444,10 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@bsky.app/react-native-mmkv/-/react-native-mmkv-2.12.5.tgz#eb17d31a6158c74393f617a1763ac223ff3f83a6"
|
resolved "https://registry.yarnpkg.com/@bsky.app/react-native-mmkv/-/react-native-mmkv-2.12.5.tgz#eb17d31a6158c74393f617a1763ac223ff3f83a6"
|
||||||
integrity sha512-3vUz1nQY1DiKIPAWRkpp5ZGxH5f2G6Ui0UuQuEYjYv81xx1qFcSzS9KQ2sHcOKYdkOM9amWV2Q8TQCxt1lrAHg==
|
integrity sha512-3vUz1nQY1DiKIPAWRkpp5ZGxH5f2G6Ui0UuQuEYjYv81xx1qFcSzS9KQ2sHcOKYdkOM9amWV2Q8TQCxt1lrAHg==
|
||||||
|
|
||||||
"@bsky.app/sift@^0.3.1":
|
"@bsky.app/sift@^0.3.2":
|
||||||
version "0.3.1"
|
version "0.3.2"
|
||||||
resolved "https://registry.yarnpkg.com/@bsky.app/sift/-/sift-0.3.1.tgz#f529832001bcd64950c214e85aec055a1f2edcdb"
|
resolved "https://registry.yarnpkg.com/@bsky.app/sift/-/sift-0.3.2.tgz#04122bf665fad3a7eb90e1d689028ec9a209c56f"
|
||||||
integrity sha512-jG9GDh0Yh4vBM98BP4HvBp8VBqnt+280tFx9Gh/bWYtZdiN1xfrTkqWqRkvxyujgpXlyoemREUn+7dGs8Bl60A==
|
integrity sha512-u48gzcA5QNkvfWzH+gnouXxLulrgA6yIc7NwSBnEZt9XwZfClLfvEDjRk/VxU4AJlEwQRhY2ZC593H0oo+5/bQ==
|
||||||
|
|
||||||
"@bsky.app/tapper@^0.5.0":
|
"@bsky.app/tapper@^0.5.0":
|
||||||
version "0.5.0"
|
version "0.5.0"
|
||||||
@@ -8078,24 +8111,6 @@ email-validator@^2.0.4:
|
|||||||
resolved "https://registry.yarnpkg.com/email-validator/-/email-validator-2.0.4.tgz#b8dfaa5d0dae28f1b03c95881d904d4e40bfe7ed"
|
resolved "https://registry.yarnpkg.com/email-validator/-/email-validator-2.0.4.tgz#b8dfaa5d0dae28f1b03c95881d904d4e40bfe7ed"
|
||||||
integrity sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==
|
integrity sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==
|
||||||
|
|
||||||
embla-carousel-react@^8.6.0:
|
|
||||||
version "8.6.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/embla-carousel-react/-/embla-carousel-react-8.6.0.tgz#b737042a32761c38d6614593653b3ac619477bd1"
|
|
||||||
integrity sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==
|
|
||||||
dependencies:
|
|
||||||
embla-carousel "8.6.0"
|
|
||||||
embla-carousel-reactive-utils "8.6.0"
|
|
||||||
|
|
||||||
embla-carousel-reactive-utils@8.6.0:
|
|
||||||
version "8.6.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.6.0.tgz#607f1d8ab9921c906a555c206251b2c6db687223"
|
|
||||||
integrity sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A==
|
|
||||||
|
|
||||||
embla-carousel@8.6.0:
|
|
||||||
version "8.6.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/embla-carousel/-/embla-carousel-8.6.0.tgz#abcedff2bff36992ea8ac27cd30080ca5b6a3f58"
|
|
||||||
integrity sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==
|
|
||||||
|
|
||||||
emittery@^0.13.1:
|
emittery@^0.13.1:
|
||||||
version "0.13.1"
|
version "0.13.1"
|
||||||
resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad"
|
resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad"
|
||||||
@@ -9003,6 +9018,11 @@ expo-font@~14.0.11:
|
|||||||
dependencies:
|
dependencies:
|
||||||
fontfaceobserver "^2.1.0"
|
fontfaceobserver "^2.1.0"
|
||||||
|
|
||||||
|
expo-glass-effect@55.0.8:
|
||||||
|
version "55.0.8"
|
||||||
|
resolved "https://registry.yarnpkg.com/expo-glass-effect/-/expo-glass-effect-55.0.8.tgz#ace0e662d7c8fc2935c9d1260e8303eb2fde0bc3"
|
||||||
|
integrity sha512-IvUjHb/4t6r2H/LXDjcQ4uDoHrmO2cLOvEb9leLavQ4HX5+P4LRtQrMDMlkWAn5Wo5DkLcG8+1CrQU2nqgogTA==
|
||||||
|
|
||||||
expo-haptics@~15.0.8:
|
expo-haptics@~15.0.8:
|
||||||
version "15.0.8"
|
version "15.0.8"
|
||||||
resolved "https://registry.yarnpkg.com/expo-haptics/-/expo-haptics-15.0.8.tgz#f93f895ac5d76fe0c5ac26b3644e1dbb097833f3"
|
resolved "https://registry.yarnpkg.com/expo-haptics/-/expo-haptics-15.0.8.tgz#f93f895ac5d76fe0c5ac26b3644e1dbb097833f3"
|
||||||
@@ -9116,10 +9136,10 @@ expo-notifications@~0.32.16:
|
|||||||
expo-application "~7.0.8"
|
expo-application "~7.0.8"
|
||||||
expo-constants "~18.0.13"
|
expo-constants "~18.0.13"
|
||||||
|
|
||||||
expo-paste-input@^0.1.12:
|
expo-paste-input@^0.1.15:
|
||||||
version "0.1.12"
|
version "0.1.15"
|
||||||
resolved "https://registry.yarnpkg.com/expo-paste-input/-/expo-paste-input-0.1.12.tgz#0295eb26caf738fc39019f4ecae48c22b126b67e"
|
resolved "https://registry.yarnpkg.com/expo-paste-input/-/expo-paste-input-0.1.15.tgz#45347c2de28b7455ec5f2a0b461ca77445598560"
|
||||||
integrity sha512-iaOCgygmCYVbSj+gJOxr8P28y8Tf0X4UHtVVXRjEsARKf5gQUoVaRX63uzB+8h+g6vN710fSmu5vdxNP28bw8g==
|
integrity sha512-wV0z1s0/Q4MB+lNiSwbMfck+1Im6sDIcgyCi5Y0aF35n5kcM4FHSOjmRfzn3UbkMlvxmYfDiHeHvIqn22qatqA==
|
||||||
|
|
||||||
expo-privacy-sensitive@^0.1.0:
|
expo-privacy-sensitive@^0.1.0:
|
||||||
version "0.1.0"
|
version "0.1.0"
|
||||||
@@ -13970,10 +13990,10 @@ react-native-is-edge-to-edge@^1.2.1:
|
|||||||
resolved "https://registry.yarnpkg.com/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.2.1.tgz#64e10851abd9d176cbf2b40562f751622bde3358"
|
resolved "https://registry.yarnpkg.com/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.2.1.tgz#64e10851abd9d176cbf2b40562f751622bde3358"
|
||||||
integrity sha512-FLbPWl/MyYQWz+KwqOZsSyj2JmLKglHatd3xLZWskXOpRaio4LfEDEz8E/A6uD8QoTHW6Aobw1jbEwK7KMgR7Q==
|
integrity sha512-FLbPWl/MyYQWz+KwqOZsSyj2JmLKglHatd3xLZWskXOpRaio4LfEDEz8E/A6uD8QoTHW6Aobw1jbEwK7KMgR7Q==
|
||||||
|
|
||||||
react-native-keyboard-controller@^1.21.0:
|
react-native-keyboard-controller@^1.21.5:
|
||||||
version "1.21.0"
|
version "1.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/react-native-keyboard-controller/-/react-native-keyboard-controller-1.21.0.tgz#79ad48c67e6f5ec572b7dc896c7b05a98662a2a2"
|
resolved "https://registry.yarnpkg.com/react-native-keyboard-controller/-/react-native-keyboard-controller-1.21.5.tgz#563aabb7e9ce8dbe2a0dd5f949883ba81620b6c0"
|
||||||
integrity sha512-mLHJysehhSzYoM8BAD2DSjVZEcF69t16ZCJrCAos6sfVtbB3tL+kgGZFX+jNVz/f9BEhqnBFO0EA1tc/V6Hkgw==
|
integrity sha512-wxR+vpJ+2g6QMQCP1mRQKySDUietf5xLntZ76cUNHOGsjyqk6LtznXwHBG9YsR9E/b2IrHXISylwqPnIit6Y6A==
|
||||||
dependencies:
|
dependencies:
|
||||||
react-native-is-edge-to-edge "^1.2.1"
|
react-native-is-edge-to-edge "^1.2.1"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user