merge in main
This commit is contained in:
@@ -204,7 +204,6 @@ module.exports = function (config) {
|
|||||||
],
|
],
|
||||||
'./plugins/withAndroidManifestPlugin.js',
|
'./plugins/withAndroidManifestPlugin.js',
|
||||||
'./plugins/withAndroidManifestFCMIconPlugin.js',
|
'./plugins/withAndroidManifestFCMIconPlugin.js',
|
||||||
'./plugins/withAndroidManifestLaunchModePlugin.js',
|
|
||||||
'./plugins/withAndroidStylesWindowBackgroundPlugin.js',
|
'./plugins/withAndroidStylesWindowBackgroundPlugin.js',
|
||||||
'./plugins/withAndroidStylesAccentColorPlugin.js',
|
'./plugins/withAndroidStylesAccentColorPlugin.js',
|
||||||
'./plugins/withAndroidSplashScreenStatusBarTranslucentPlugin.js',
|
'./plugins/withAndroidSplashScreenStatusBarTranslucentPlugin.js',
|
||||||
|
|||||||
@@ -272,6 +272,8 @@
|
|||||||
"resolutions": {
|
"resolutions": {
|
||||||
"@types/react": "^18",
|
"@types/react": "^18",
|
||||||
"**/zeed-dom": "0.10.9",
|
"**/zeed-dom": "0.10.9",
|
||||||
|
"**/expo-constants": "16.0.1",
|
||||||
|
"**/expo-device": "6.0.2",
|
||||||
"@react-native/babel-preset": "0.74.1"
|
"@react-native/babel-preset": "0.74.1"
|
||||||
},
|
},
|
||||||
"jest": {
|
"jest": {
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
## expo-modules-core Patch
|
||||||
|
|
||||||
|
This patch fixes crashes seen in some Android clients when using intents to open the app. See https://github.com/expo/expo/pull/29513.
|
||||||
|
|
||||||
|
Do not remove this patch until that PR lands in Expo and is released.
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
diff --git a/node_modules/expo-modules-core/android/src/main/java/expo/modules/adapters/react/NativeModulesProxy.java b/node_modules/expo-modules-core/android/src/main/java/expo/modules/adapters/react/NativeModulesProxy.java
|
||||||
|
index bb74e80..0aa0202 100644
|
||||||
|
--- a/node_modules/expo-modules-core/android/src/main/java/expo/modules/adapters/react/NativeModulesProxy.java
|
||||||
|
+++ b/node_modules/expo-modules-core/android/src/main/java/expo/modules/adapters/react/NativeModulesProxy.java
|
||||||
|
@@ -90,8 +90,8 @@ public class NativeModulesProxy extends ReactContextBaseJavaModule {
|
||||||
|
mModuleRegistry.ensureIsInitialized();
|
||||||
|
|
||||||
|
KotlinInteropModuleRegistry kotlinModuleRegistry = getKotlinInteropModuleRegistry();
|
||||||
|
- kotlinModuleRegistry.emitOnCreate();
|
||||||
|
kotlinModuleRegistry.installJSIInterop();
|
||||||
|
+ kotlinModuleRegistry.emitOnCreate();
|
||||||
|
|
||||||
|
Map<String, Object> constants = new HashMap<>(3);
|
||||||
|
constants.put(MODULES_CONSTANTS_KEY, new HashMap<>());
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
const {withAndroidManifest} = require('expo/config-plugins')
|
|
||||||
|
|
||||||
module.exports = function withAndroidManifestLaunchModePlugin(appConfig) {
|
|
||||||
return withAndroidManifest(appConfig, function (decoratedAppConfig) {
|
|
||||||
try {
|
|
||||||
const mainApplication =
|
|
||||||
decoratedAppConfig.modResults.manifest.application[0]
|
|
||||||
const mainActivity = mainApplication.activity.find(
|
|
||||||
elem => elem.$['android:name'] === '.MainActivity',
|
|
||||||
)
|
|
||||||
mainActivity.$['android:launchMode'] = 'singleTop'
|
|
||||||
} catch (e) {
|
|
||||||
console.error(`withAndroidManifestLaunchModePlugin failed`, e)
|
|
||||||
}
|
|
||||||
return decoratedAppConfig
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -15,8 +15,24 @@ export function SendViaChatDialog({
|
|||||||
control: Dialog.DialogControlProps
|
control: Dialog.DialogControlProps
|
||||||
onSelectChat: (chatId: string) => void
|
onSelectChat: (chatId: string) => void
|
||||||
}) {
|
}) {
|
||||||
const {_} = useLingui()
|
return (
|
||||||
|
<Dialog.Outer
|
||||||
|
control={control}
|
||||||
|
testID="sendViaChatChatDialog"
|
||||||
|
nativeOptions={{sheet: {snapPoints: ['100%']}}}>
|
||||||
|
<SendViaChatDialogInner control={control} onSelectChat={onSelectChat} />
|
||||||
|
</Dialog.Outer>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function SendViaChatDialogInner({
|
||||||
|
control,
|
||||||
|
onSelectChat,
|
||||||
|
}: {
|
||||||
|
control: Dialog.DialogControlProps
|
||||||
|
onSelectChat: (chatId: string) => void
|
||||||
|
}) {
|
||||||
|
const {_} = useLingui()
|
||||||
const {mutate: createChat} = useGetConvoForMembers({
|
const {mutate: createChat} = useGetConvoForMembers({
|
||||||
onSuccess: data => {
|
onSuccess: data => {
|
||||||
onSelectChat(data.convo.id)
|
onSelectChat(data.convo.id)
|
||||||
@@ -39,15 +55,10 @@ export function SendViaChatDialog({
|
|||||||
)
|
)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Dialog.Outer
|
<SearchablePeopleList
|
||||||
control={control}
|
title={_(msg`Send post to...`)}
|
||||||
testID="sendViaChatChatDialog"
|
onSelectChat={onCreateChat}
|
||||||
nativeOptions={{sheet: {snapPoints: ['100%']}}}>
|
showRecentConvos
|
||||||
<SearchablePeopleList
|
/>
|
||||||
title={_(msg`Send post to...`)}
|
|
||||||
onSelectChat={onCreateChat}
|
|
||||||
showRecentConvos
|
|
||||||
/>
|
|
||||||
</Dialog.Outer>
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,8 +3,9 @@ import {
|
|||||||
launchImageLibraryAsync,
|
launchImageLibraryAsync,
|
||||||
MediaTypeOptions,
|
MediaTypeOptions,
|
||||||
} from 'expo-image-picker'
|
} from 'expo-image-picker'
|
||||||
import {getDataUriSize} from './util'
|
|
||||||
import * as Toast from 'view/com/util/Toast'
|
import * as Toast from 'view/com/util/Toast'
|
||||||
|
import {getDataUriSize} from './util'
|
||||||
|
|
||||||
export async function openPicker(opts?: ImagePickerOptions) {
|
export async function openPicker(opts?: ImagePickerOptions) {
|
||||||
const response = await launchImageLibraryAsync({
|
const response = await launchImageLibraryAsync({
|
||||||
@@ -12,6 +13,7 @@ export async function openPicker(opts?: ImagePickerOptions) {
|
|||||||
mediaTypes: MediaTypeOptions.Images,
|
mediaTypes: MediaTypeOptions.Images,
|
||||||
quality: 1,
|
quality: 1,
|
||||||
...opts,
|
...opts,
|
||||||
|
legacy: true,
|
||||||
})
|
})
|
||||||
|
|
||||||
if (response.assets && response.assets.length > 4) {
|
if (response.assets && response.assets.length > 4) {
|
||||||
|
|||||||
@@ -3,4 +3,5 @@ export type Gate =
|
|||||||
| 'request_notifications_permission_after_onboarding_v2'
|
| 'request_notifications_permission_after_onboarding_v2'
|
||||||
| 'show_avi_follow_button'
|
| 'show_avi_follow_button'
|
||||||
| 'show_follow_back_label_v2'
|
| 'show_follow_back_label_v2'
|
||||||
|
| 'show_notification_badge_mobile_web'
|
||||||
| 'starter_packs_enabled'
|
| 'starter_packs_enabled'
|
||||||
|
|||||||
@@ -102,6 +102,7 @@ export function StepProfile() {
|
|||||||
mediaTypes: MediaTypeOptions.Images,
|
mediaTypes: MediaTypeOptions.Images,
|
||||||
quality: 1,
|
quality: 1,
|
||||||
...opts,
|
...opts,
|
||||||
|
legacy: true,
|
||||||
})
|
})
|
||||||
|
|
||||||
return (response.assets ?? [])
|
return (response.assets ?? [])
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import {
|
import {
|
||||||
Easing,
|
cancelAnimation,
|
||||||
SharedValue,
|
SharedValue,
|
||||||
useSharedValue,
|
useSharedValue,
|
||||||
withTiming,
|
withSpring,
|
||||||
} from 'react-native-reanimated'
|
} from 'react-native-reanimated'
|
||||||
|
|
||||||
type StateContext = SharedValue<number>
|
type StateContext = SharedValue<number>
|
||||||
@@ -22,9 +22,10 @@ export function Provider({children}: React.PropsWithChildren<{}>) {
|
|||||||
const setMode = React.useCallback(
|
const setMode = React.useCallback(
|
||||||
(v: boolean) => {
|
(v: boolean) => {
|
||||||
'worklet'
|
'worklet'
|
||||||
mode.value = withTiming(v ? 1 : 0, {
|
// Cancel any existing animation
|
||||||
duration: 400,
|
cancelAnimation(mode)
|
||||||
easing: Easing.bezier(0.25, 0.1, 0.25, 1),
|
mode.value = withSpring(v ? 1 : 0, {
|
||||||
|
overshootClamping: true,
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
[mode],
|
[mode],
|
||||||
|
|||||||
@@ -107,7 +107,9 @@ export const ComposePost = observer(function ComposePost({
|
|||||||
text: initText,
|
text: initText,
|
||||||
imageUris: initImageUris,
|
imageUris: initImageUris,
|
||||||
cancelRef,
|
cancelRef,
|
||||||
|
isModalReady,
|
||||||
}: Props & {
|
}: Props & {
|
||||||
|
isModalReady: boolean
|
||||||
cancelRef?: React.RefObject<CancelRef>
|
cancelRef?: React.RefObject<CancelRef>
|
||||||
}) {
|
}) {
|
||||||
const {currentAccount} = useSession()
|
const {currentAccount} = useSession()
|
||||||
@@ -155,12 +157,6 @@ export const ComposePost = observer(function ComposePost({
|
|||||||
const [labels, setLabels] = useState<string[]>([])
|
const [labels, setLabels] = useState<string[]>([])
|
||||||
const [threadgate, setThreadgate] = useState<ThreadgateSetting[]>([])
|
const [threadgate, setThreadgate] = useState<ThreadgateSetting[]>([])
|
||||||
|
|
||||||
React.useEffect(() => {
|
|
||||||
if (!isAndroid) return
|
|
||||||
const id = setTimeout(() => textInput.current?.focus(), 100)
|
|
||||||
return () => clearTimeout(id)
|
|
||||||
}, [])
|
|
||||||
|
|
||||||
const gallery = useMemo(
|
const gallery = useMemo(
|
||||||
() => new GalleryModel(initImageUris),
|
() => new GalleryModel(initImageUris),
|
||||||
[initImageUris],
|
[initImageUris],
|
||||||
@@ -181,9 +177,7 @@ export const ComposePost = observer(function ComposePost({
|
|||||||
const onPressCancel = useCallback(() => {
|
const onPressCancel = useCallback(() => {
|
||||||
if (graphemeLength > 0 || !gallery.isEmpty || extGif) {
|
if (graphemeLength > 0 || !gallery.isEmpty || extGif) {
|
||||||
closeAllDialogs()
|
closeAllDialogs()
|
||||||
if (Keyboard) {
|
Keyboard.dismiss()
|
||||||
Keyboard.dismiss()
|
|
||||||
}
|
|
||||||
discardPromptControl.open()
|
discardPromptControl.open()
|
||||||
} else {
|
} else {
|
||||||
onClose()
|
onClose()
|
||||||
@@ -524,7 +518,11 @@ export const ComposePost = observer(function ComposePost({
|
|||||||
ref={textInput}
|
ref={textInput}
|
||||||
richtext={richtext}
|
richtext={richtext}
|
||||||
placeholder={selectTextInputPlaceholder}
|
placeholder={selectTextInputPlaceholder}
|
||||||
autoFocus={!isAndroid}
|
// fixes autofocus on android
|
||||||
|
key={
|
||||||
|
isAndroid ? (isModalReady ? 'ready' : 'animating') : 'static'
|
||||||
|
}
|
||||||
|
autoFocus={isAndroid ? isModalReady : true}
|
||||||
setRichText={setRichText}
|
setRichText={setRichText}
|
||||||
onPhotoPasted={onPhotoPasted}
|
onPhotoPasted={onPhotoPasted}
|
||||||
onPressPublish={onPressPublish}
|
onPressPublish={onPressPublish}
|
||||||
|
|||||||
@@ -1,30 +1,36 @@
|
|||||||
import React, {useState} from 'react'
|
import React, {useState} from 'react'
|
||||||
|
|
||||||
import {ActivityIndicator, Dimensions, StyleSheet} from 'react-native'
|
import {ActivityIndicator, Dimensions, StyleSheet} from 'react-native'
|
||||||
import {Image} from 'expo-image'
|
import {Gesture, GestureDetector} from 'react-native-gesture-handler'
|
||||||
import Animated, {
|
import Animated, {
|
||||||
runOnJS,
|
runOnJS,
|
||||||
|
useAnimatedReaction,
|
||||||
useAnimatedRef,
|
useAnimatedRef,
|
||||||
useAnimatedStyle,
|
useAnimatedStyle,
|
||||||
useAnimatedReaction,
|
|
||||||
useSharedValue,
|
useSharedValue,
|
||||||
withDecay,
|
withDecay,
|
||||||
withSpring,
|
withSpring,
|
||||||
} from 'react-native-reanimated'
|
} from 'react-native-reanimated'
|
||||||
import {GestureDetector, Gesture} from 'react-native-gesture-handler'
|
import {Image} from 'expo-image'
|
||||||
|
|
||||||
|
import type {Dimensions as ImageDimensions, ImageSource} from '../../@types'
|
||||||
import useImageDimensions from '../../hooks/useImageDimensions'
|
import useImageDimensions from '../../hooks/useImageDimensions'
|
||||||
import {
|
import {
|
||||||
createTransform,
|
|
||||||
readTransform,
|
|
||||||
applyRounding,
|
applyRounding,
|
||||||
|
createTransform,
|
||||||
prependPan,
|
prependPan,
|
||||||
prependPinch,
|
prependPinch,
|
||||||
prependTransform,
|
prependTransform,
|
||||||
|
readTransform,
|
||||||
TransformMatrix,
|
TransformMatrix,
|
||||||
} from '../../transforms'
|
} from '../../transforms'
|
||||||
import type {ImageSource, Dimensions as ImageDimensions} from '../../@types'
|
|
||||||
|
|
||||||
const SCREEN = Dimensions.get('window')
|
const windowDim = Dimensions.get('window')
|
||||||
|
const screenDim = Dimensions.get('screen')
|
||||||
|
const statusBarHeight = windowDim.height - screenDim.height
|
||||||
|
const SCREEN = {
|
||||||
|
width: windowDim.width,
|
||||||
|
height: windowDim.height + statusBarHeight,
|
||||||
|
}
|
||||||
const MIN_DOUBLE_TAP_SCALE = 2
|
const MIN_DOUBLE_TAP_SCALE = 2
|
||||||
const MAX_ORIGINAL_IMAGE_ZOOM = 2
|
const MAX_ORIGINAL_IMAGE_ZOOM = 2
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
import React, {useCallback, useEffect} from 'react'
|
import React, {useCallback, useEffect} from 'react'
|
||||||
import {NativeScrollEvent} from 'react-native'
|
import {NativeScrollEvent} from 'react-native'
|
||||||
import {interpolate, useSharedValue} from 'react-native-reanimated'
|
import {
|
||||||
|
cancelAnimation,
|
||||||
|
interpolate,
|
||||||
|
useSharedValue,
|
||||||
|
} from 'react-native-reanimated'
|
||||||
import EventEmitter from 'eventemitter3'
|
import EventEmitter from 'eventemitter3'
|
||||||
|
|
||||||
import {ScrollProvider} from '#/lib/ScrollContext'
|
import {ScrollProvider} from '#/lib/ScrollContext'
|
||||||
@@ -117,6 +121,8 @@ export function MainScrollProvider({children}: {children: React.ReactNode}) {
|
|||||||
const newValue = clamp(startMode.value + dProgress, 0, 1)
|
const newValue = clamp(startMode.value + dProgress, 0, 1)
|
||||||
if (newValue !== mode.value) {
|
if (newValue !== mode.value) {
|
||||||
// Manually adjust the value. This won't be (and shouldn't be) animated.
|
// Manually adjust the value. This won't be (and shouldn't be) animated.
|
||||||
|
// Cancel any any existing animation
|
||||||
|
cancelAnimation(mode)
|
||||||
mode.value = newValue
|
mode.value = newValue
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, {useLayoutEffect} from 'react'
|
import React, {useLayoutEffect, useState} from 'react'
|
||||||
import {Modal, View} from 'react-native'
|
import {Modal, View} from 'react-native'
|
||||||
import {GestureHandlerRootView} from 'react-native-gesture-handler'
|
import {GestureHandlerRootView} from 'react-native-gesture-handler'
|
||||||
import {RootSiblingParent} from 'react-native-root-siblings'
|
import {RootSiblingParent} from 'react-native-root-siblings'
|
||||||
@@ -24,8 +24,16 @@ export const Composer = observer(function ComposerImpl({}: {
|
|||||||
const t = useTheme()
|
const t = useTheme()
|
||||||
const state = useComposerState()
|
const state = useComposerState()
|
||||||
const ref = useComposerCancelRef()
|
const ref = useComposerCancelRef()
|
||||||
|
const [isModalReady, setIsModalReady] = useState(false)
|
||||||
|
|
||||||
const open = !!state
|
const open = !!state
|
||||||
|
const [prevOpen, setPrevOpen] = useState(open)
|
||||||
|
if (open !== prevOpen) {
|
||||||
|
setPrevOpen(open)
|
||||||
|
if (!open) {
|
||||||
|
setIsModalReady(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Modal
|
<Modal
|
||||||
@@ -34,10 +42,12 @@ export const Composer = observer(function ComposerImpl({}: {
|
|||||||
visible={open}
|
visible={open}
|
||||||
presentationStyle="formSheet"
|
presentationStyle="formSheet"
|
||||||
animationType="slide"
|
animationType="slide"
|
||||||
|
onShow={() => setIsModalReady(true)}
|
||||||
onRequestClose={() => ref.current?.onPressCancel()}>
|
onRequestClose={() => ref.current?.onPressCancel()}>
|
||||||
<View style={[t.atoms.bg, a.flex_1]}>
|
<View style={[t.atoms.bg, a.flex_1]}>
|
||||||
<Providers open={open}>
|
<Providers open={open}>
|
||||||
<ComposePost
|
<ComposePost
|
||||||
|
isModalReady={isModalReady}
|
||||||
cancelRef={ref}
|
cancelRef={ref}
|
||||||
replyTo={state?.replyTo}
|
replyTo={state?.replyTo}
|
||||||
onPost={state?.onPost}
|
onPost={state?.onPost}
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ export function Composer({}: {winHeight: number}) {
|
|||||||
t.atoms.border_contrast_medium,
|
t.atoms.border_contrast_medium,
|
||||||
]}>
|
]}>
|
||||||
<ComposePost
|
<ComposePost
|
||||||
|
isModalReady={true}
|
||||||
replyTo={state.replyTo}
|
replyTo={state.replyTo}
|
||||||
quote={state.quote}
|
quote={state.quote}
|
||||||
onPost={state.onPost}
|
onPost={state.onPost}
|
||||||
|
|||||||
@@ -16,6 +16,9 @@ import {s} from '#/lib/styles'
|
|||||||
import {useSession} from '#/state/session'
|
import {useSession} from '#/state/session'
|
||||||
import {useLoggedOutViewControls} from '#/state/shell/logged-out'
|
import {useLoggedOutViewControls} from '#/state/shell/logged-out'
|
||||||
import {useCloseAllActiveElements} from '#/state/util'
|
import {useCloseAllActiveElements} from '#/state/util'
|
||||||
|
import {useGate} from 'lib/statsig/statsig'
|
||||||
|
import {useUnreadMessageCount} from 'state/queries/messages/list-converations'
|
||||||
|
import {useUnreadNotifications} from 'state/queries/notifications/unread'
|
||||||
import {Button} from '#/view/com/util/forms/Button'
|
import {Button} from '#/view/com/util/forms/Button'
|
||||||
import {Text} from '#/view/com/util/text/Text'
|
import {Text} from '#/view/com/util/text/Text'
|
||||||
import {Logo} from '#/view/icons/Logo'
|
import {Logo} from '#/view/icons/Logo'
|
||||||
@@ -46,11 +49,15 @@ export function BottomBarWeb() {
|
|||||||
const {hasSession, currentAccount} = useSession()
|
const {hasSession, currentAccount} = useSession()
|
||||||
const pal = usePalette('default')
|
const pal = usePalette('default')
|
||||||
const safeAreaInsets = useSafeAreaInsets()
|
const safeAreaInsets = useSafeAreaInsets()
|
||||||
|
const gate = useGate()
|
||||||
const {footerMinimalShellTransform} = useMinimalShellMode()
|
const {footerMinimalShellTransform} = useMinimalShellMode()
|
||||||
const {requestSwitchToAccount} = useLoggedOutViewControls()
|
const {requestSwitchToAccount} = useLoggedOutViewControls()
|
||||||
const closeAllActiveElements = useCloseAllActiveElements()
|
const closeAllActiveElements = useCloseAllActiveElements()
|
||||||
const iconWidth = 26
|
const iconWidth = 26
|
||||||
|
|
||||||
|
const unreadMessageCount = useUnreadMessageCount()
|
||||||
|
const notificationCountStr = useUnreadNotifications()
|
||||||
|
|
||||||
const showSignIn = React.useCallback(() => {
|
const showSignIn = React.useCallback(() => {
|
||||||
closeAllActiveElements()
|
closeAllActiveElements()
|
||||||
requestSwitchToAccount({requestedAccount: 'none'})
|
requestSwitchToAccount({requestedAccount: 'none'})
|
||||||
@@ -103,10 +110,20 @@ export function BottomBarWeb() {
|
|||||||
{({isActive}) => {
|
{({isActive}) => {
|
||||||
const Icon = isActive ? MessageFilled : Message
|
const Icon = isActive ? MessageFilled : Message
|
||||||
return (
|
return (
|
||||||
<Icon
|
<>
|
||||||
width={iconWidth - 1}
|
<Icon
|
||||||
style={[styles.ctrlIcon, pal.text, styles.messagesIcon]}
|
width={iconWidth - 1}
|
||||||
/>
|
style={[styles.ctrlIcon, pal.text, styles.messagesIcon]}
|
||||||
|
/>
|
||||||
|
{unreadMessageCount.count > 0 &&
|
||||||
|
gate('show_notification_badge_mobile_web') && (
|
||||||
|
<View style={styles.notificationCount}>
|
||||||
|
<Text style={styles.notificationCountLabel}>
|
||||||
|
{unreadMessageCount.numUnread}
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
)
|
)
|
||||||
}}
|
}}
|
||||||
</NavItem>
|
</NavItem>
|
||||||
@@ -114,10 +131,20 @@ export function BottomBarWeb() {
|
|||||||
{({isActive}) => {
|
{({isActive}) => {
|
||||||
const Icon = isActive ? BellFilled : Bell
|
const Icon = isActive ? BellFilled : Bell
|
||||||
return (
|
return (
|
||||||
<Icon
|
<>
|
||||||
width={iconWidth}
|
<Icon
|
||||||
style={[styles.ctrlIcon, pal.text, styles.bellIcon]}
|
width={iconWidth}
|
||||||
/>
|
style={[styles.ctrlIcon, pal.text, styles.bellIcon]}
|
||||||
|
/>
|
||||||
|
{notificationCountStr !== '' &&
|
||||||
|
gate('show_notification_badge_mobile_web') && (
|
||||||
|
<View style={styles.notificationCount}>
|
||||||
|
<Text style={styles.notificationCountLabel}>
|
||||||
|
{notificationCountStr}
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
)
|
)
|
||||||
}}
|
}}
|
||||||
</NavItem>
|
</NavItem>
|
||||||
|
|||||||
@@ -3425,32 +3425,6 @@
|
|||||||
xcode "^3.0.1"
|
xcode "^3.0.1"
|
||||||
xml2js "0.6.0"
|
xml2js "0.6.0"
|
||||||
|
|
||||||
"@expo/config-plugins@~5.0.3":
|
|
||||||
version "5.0.4"
|
|
||||||
resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-5.0.4.tgz#216fea6558fe66615af1370de55193f4181cb23e"
|
|
||||||
integrity sha512-vzUcVpqOMs3h+hyRdhGwk+eGIOhXa5xYdd92yO17RMNHav3v/+ekMbs7XA2c3lepMO8Yd4/5hqmRw9ZTL6jGzg==
|
|
||||||
dependencies:
|
|
||||||
"@expo/config-types" "^47.0.0"
|
|
||||||
"@expo/json-file" "8.2.36"
|
|
||||||
"@expo/plist" "0.0.18"
|
|
||||||
"@expo/sdk-runtime-versions" "^1.0.0"
|
|
||||||
"@react-native/normalize-color" "^2.0.0"
|
|
||||||
chalk "^4.1.2"
|
|
||||||
debug "^4.3.1"
|
|
||||||
find-up "~5.0.0"
|
|
||||||
getenv "^1.0.0"
|
|
||||||
glob "7.1.6"
|
|
||||||
resolve-from "^5.0.0"
|
|
||||||
semver "^7.3.5"
|
|
||||||
slash "^3.0.0"
|
|
||||||
xcode "^3.0.1"
|
|
||||||
xml2js "0.4.23"
|
|
||||||
|
|
||||||
"@expo/config-types@^47.0.0":
|
|
||||||
version "47.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-47.0.0.tgz#99eeabe0bba7a776e0f252b78beb0c574692c38d"
|
|
||||||
integrity sha512-r0pWfuhkv7KIcXMUiNACJmJKKwlTBGMw9VZHNdppS8/0Nve8HZMTkNRFQzTHW1uH3pBj8jEXpyw/2vSWDHex9g==
|
|
||||||
|
|
||||||
"@expo/config-types@^50.0.0-alpha.1":
|
"@expo/config-types@^50.0.0-alpha.1":
|
||||||
version "50.0.0"
|
version "50.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-50.0.0.tgz#b534d3ec997ec60f8af24f6ad56244c8afc71a0b"
|
resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-50.0.0.tgz#b534d3ec997ec60f8af24f6ad56244c8afc71a0b"
|
||||||
@@ -3478,23 +3452,6 @@
|
|||||||
slugify "^1.3.4"
|
slugify "^1.3.4"
|
||||||
sucrase "3.34.0"
|
sucrase "3.34.0"
|
||||||
|
|
||||||
"@expo/config@~7.0.0":
|
|
||||||
version "7.0.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/@expo/config/-/config-7.0.3.tgz#c9c634e76186de25e296485e51418f1e52966e6e"
|
|
||||||
integrity sha512-joVtB5o+NF40Tmsdp65UzryRtbnCuMbXkVO4wJnNJO4aaK0EYLdHCYSewORVqNcDfGN0LphQr8VTG2npbd9CJA==
|
|
||||||
dependencies:
|
|
||||||
"@babel/code-frame" "~7.10.4"
|
|
||||||
"@expo/config-plugins" "~5.0.3"
|
|
||||||
"@expo/config-types" "^47.0.0"
|
|
||||||
"@expo/json-file" "8.2.36"
|
|
||||||
getenv "^1.0.0"
|
|
||||||
glob "7.1.6"
|
|
||||||
require-from-string "^2.0.2"
|
|
||||||
resolve-from "^5.0.0"
|
|
||||||
semver "7.3.2"
|
|
||||||
slugify "^1.3.4"
|
|
||||||
sucrase "^3.20.0"
|
|
||||||
|
|
||||||
"@expo/config@~8.5.0":
|
"@expo/config@~8.5.0":
|
||||||
version "8.5.0"
|
version "8.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/@expo/config/-/config-8.5.0.tgz#c618e016c3272335e33fec02fb7fd67e4dcc3342"
|
resolved "https://registry.yarnpkg.com/@expo/config/-/config-8.5.0.tgz#c618e016c3272335e33fec02fb7fd67e4dcc3342"
|
||||||
@@ -3641,15 +3598,6 @@
|
|||||||
semver "^7.6.0"
|
semver "^7.6.0"
|
||||||
tempy "0.3.0"
|
tempy "0.3.0"
|
||||||
|
|
||||||
"@expo/json-file@8.2.36":
|
|
||||||
version "8.2.36"
|
|
||||||
resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.2.36.tgz#62a505cb7f30a34d097386476794680a3f7385ff"
|
|
||||||
integrity sha512-tOZfTiIFA5KmMpdW9KF7bc6CFiGjb0xnbieJhTGlHrLL+ps2G0OkqmuZ3pFEXBOMnJYUVpnSy++52LFxvpa5ZQ==
|
|
||||||
dependencies:
|
|
||||||
"@babel/code-frame" "~7.10.4"
|
|
||||||
json5 "^1.0.1"
|
|
||||||
write-file-atomic "^2.3.0"
|
|
||||||
|
|
||||||
"@expo/json-file@^8.2.37":
|
"@expo/json-file@^8.2.37":
|
||||||
version "8.2.37"
|
version "8.2.37"
|
||||||
resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.2.37.tgz#9c02d3b42134907c69cc0a027b18671b69344049"
|
resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.2.37.tgz#9c02d3b42134907c69cc0a027b18671b69344049"
|
||||||
@@ -3751,15 +3699,6 @@
|
|||||||
split "^1.0.1"
|
split "^1.0.1"
|
||||||
sudo-prompt "9.1.1"
|
sudo-prompt "9.1.1"
|
||||||
|
|
||||||
"@expo/plist@0.0.18":
|
|
||||||
version "0.0.18"
|
|
||||||
resolved "https://registry.yarnpkg.com/@expo/plist/-/plist-0.0.18.tgz#9abcde78df703a88f6d9fa1a557ee2f045d178b0"
|
|
||||||
integrity sha512-+48gRqUiz65R21CZ/IXa7RNBXgAI/uPSdvJqoN9x1hfL44DNbUoWHgHiEXTx7XelcATpDwNTz6sHLfy0iNqf+w==
|
|
||||||
dependencies:
|
|
||||||
"@xmldom/xmldom" "~0.7.0"
|
|
||||||
base64-js "^1.2.3"
|
|
||||||
xmlbuilder "^14.0.0"
|
|
||||||
|
|
||||||
"@expo/plist@^0.1.0":
|
"@expo/plist@^0.1.0":
|
||||||
version "0.1.0"
|
version "0.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/@expo/plist/-/plist-0.1.0.tgz#eabc95f951d14e10c87fd0443ee01d567371f058"
|
resolved "https://registry.yarnpkg.com/@expo/plist/-/plist-0.1.0.tgz#eabc95f951d14e10c87fd0443ee01d567371f058"
|
||||||
@@ -8593,7 +8532,7 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99"
|
resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99"
|
||||||
integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==
|
integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==
|
||||||
|
|
||||||
"@xmldom/xmldom@~0.7.0", "@xmldom/xmldom@~0.7.7":
|
"@xmldom/xmldom@~0.7.7":
|
||||||
version "0.7.13"
|
version "0.7.13"
|
||||||
resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.13.tgz#ff34942667a4e19a9f4a0996a76814daac364cf3"
|
resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.13.tgz#ff34942667a4e19a9f4a0996a76814daac364cf3"
|
||||||
integrity sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==
|
integrity sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==
|
||||||
@@ -12085,15 +12024,7 @@ expo-clipboard@^6.0.3:
|
|||||||
resolved "https://registry.yarnpkg.com/expo-clipboard/-/expo-clipboard-6.0.3.tgz#dfea74d4a004dce59ecefd063d6fb9f1c356a03f"
|
resolved "https://registry.yarnpkg.com/expo-clipboard/-/expo-clipboard-6.0.3.tgz#dfea74d4a004dce59ecefd063d6fb9f1c356a03f"
|
||||||
integrity sha512-RIKDsuHkYfaspifbFpVC8sBVFKR05L7Pj7mU2/XkbrW9m01OBNvdpGraXEMsTFCx97xMGsZpEw9pPquL4j4xVg==
|
integrity sha512-RIKDsuHkYfaspifbFpVC8sBVFKR05L7Pj7mU2/XkbrW9m01OBNvdpGraXEMsTFCx97xMGsZpEw9pPquL4j4xVg==
|
||||||
|
|
||||||
expo-constants@^13.0.2:
|
expo-constants@16.0.1, expo-constants@^13.0.2, expo-constants@~16.0.0:
|
||||||
version "13.2.4"
|
|
||||||
resolved "https://registry.yarnpkg.com/expo-constants/-/expo-constants-13.2.4.tgz#eab4a553f074b2c60ad7a158d3b82e3484a94606"
|
|
||||||
integrity sha512-Zobau8EuTk2GgafwkfGnWM6CmSLB7X8qnQXVuXe0nd3v92hfQUmRWGhJwH88uxXj3LrfqctM6PaJ8taG1vxfBw==
|
|
||||||
dependencies:
|
|
||||||
"@expo/config" "~7.0.0"
|
|
||||||
uuid "^3.3.2"
|
|
||||||
|
|
||||||
expo-constants@~16.0.0:
|
|
||||||
version "16.0.1"
|
version "16.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/expo-constants/-/expo-constants-16.0.1.tgz#1285e29c85513c6e88e118289e2baab72596d3f7"
|
resolved "https://registry.yarnpkg.com/expo-constants/-/expo-constants-16.0.1.tgz#1285e29c85513c6e88e118289e2baab72596d3f7"
|
||||||
integrity sha512-s6aTHtglp926EsugWtxN7KnpSsE9FCEjb7CgEjQQ78Gpu4btj4wB+IXot2tlqNwqv+x7xFe5veoPGfJDGF/kVg==
|
integrity sha512-s6aTHtglp926EsugWtxN7KnpSsE9FCEjb7CgEjQQ78Gpu4btj4wB+IXot2tlqNwqv+x7xFe5veoPGfJDGF/kVg==
|
||||||
@@ -12135,14 +12066,7 @@ expo-dev-menu@5.0.14:
|
|||||||
expo-dev-menu-interface "1.8.3"
|
expo-dev-menu-interface "1.8.3"
|
||||||
semver "^7.5.4"
|
semver "^7.5.4"
|
||||||
|
|
||||||
expo-device@~4.1.1:
|
expo-device@6.0.2, expo-device@~4.1.1, expo-device@~6.0.2:
|
||||||
version "4.1.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/expo-device/-/expo-device-4.1.1.tgz#5de94144113ffb7fa0f37fa3d70e452113954c10"
|
|
||||||
integrity sha512-It0SGtKcvzQSf+Co6zdPdB63zZvG2/rDolB1lqswMNKj03Y7KVU41s5tcQCqNczj7tmeN3CJy7A8YhYGKdb7gA==
|
|
||||||
dependencies:
|
|
||||||
ua-parser-js "^0.7.19"
|
|
||||||
|
|
||||||
expo-device@~6.0.2:
|
|
||||||
version "6.0.2"
|
version "6.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/expo-device/-/expo-device-6.0.2.tgz#9bc3eccd16509c2819c225cc2ca8f7c3e3bdd11e"
|
resolved "https://registry.yarnpkg.com/expo-device/-/expo-device-6.0.2.tgz#9bc3eccd16509c2819c225cc2ca8f7c3e3bdd11e"
|
||||||
integrity sha512-sCt91CuTmAuMXX4SlFOn4lIos2UIr8vb0jDstDDZXys6kErcj0uynC7bQAMreU5uRUTKMAl4MAMpKt9ufCXPBw==
|
integrity sha512-sCt91CuTmAuMXX4SlFOn4lIos2UIr8vb0jDstDDZXys6kErcj0uynC7bQAMreU5uRUTKMAl4MAMpKt9ufCXPBw==
|
||||||
@@ -15567,7 +15491,7 @@ json-stable-stringify-without-jsonify@^1.0.1:
|
|||||||
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
|
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
|
||||||
integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
|
integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
|
||||||
|
|
||||||
json5@^1.0.1, json5@^1.0.2:
|
json5@^1.0.2:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593"
|
resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593"
|
||||||
integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==
|
integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==
|
||||||
@@ -21358,11 +21282,6 @@ typescript@^5.3.3:
|
|||||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37"
|
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37"
|
||||||
integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==
|
integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==
|
||||||
|
|
||||||
ua-parser-js@^0.7.19:
|
|
||||||
version "0.7.37"
|
|
||||||
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.37.tgz#e464e66dac2d33a7a1251d7d7a99d6157ec27832"
|
|
||||||
integrity sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==
|
|
||||||
|
|
||||||
ua-parser-js@^0.7.33:
|
ua-parser-js@^0.7.33:
|
||||||
version "0.7.35"
|
version "0.7.35"
|
||||||
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.35.tgz#8bda4827be4f0b1dda91699a29499575a1f1d307"
|
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.35.tgz#8bda4827be4f0b1dda91699a29499575a1f1d307"
|
||||||
@@ -21656,11 +21575,6 @@ utrie@^1.0.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
base64-arraybuffer "^1.0.2"
|
base64-arraybuffer "^1.0.2"
|
||||||
|
|
||||||
uuid@^3.3.2:
|
|
||||||
version "3.4.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
|
|
||||||
integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
|
|
||||||
|
|
||||||
uuid@^7.0.3:
|
uuid@^7.0.3:
|
||||||
version "7.0.3"
|
version "7.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b"
|
resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b"
|
||||||
@@ -22413,14 +22327,6 @@ xml-name-validator@^4.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835"
|
resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835"
|
||||||
integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==
|
integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==
|
||||||
|
|
||||||
xml2js@0.4.23:
|
|
||||||
version "0.4.23"
|
|
||||||
resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66"
|
|
||||||
integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==
|
|
||||||
dependencies:
|
|
||||||
sax ">=0.6.0"
|
|
||||||
xmlbuilder "~11.0.0"
|
|
||||||
|
|
||||||
xml2js@0.6.0:
|
xml2js@0.6.0:
|
||||||
version "0.6.0"
|
version "0.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.0.tgz#07afc447a97d2bd6507a1f76eeadddb09f7a8282"
|
resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.0.tgz#07afc447a97d2bd6507a1f76eeadddb09f7a8282"
|
||||||
|
|||||||
Reference in New Issue
Block a user