···44 type TextProps as RNTextProps,
55 type TextStyle,
66} from 'react-native'
77-import {UITextView} from 'react-native-uitextview'
87import createEmojiRegex from 'emoji-regex'
9899+import {UITextView} from '#/platform/ui-text-view'
1010import {type Alf, applyFonts, atoms, flatten} from '#/alf'
1111import {IS_IOS, IS_NATIVE} from '#/env'
1212
···2727import {DISCOVER_DEBUG_DIDS} from '#/lib/constants'
2828import {useOpenComposer} from '#/lib/hooks/useOpenComposer'
2929import {useOpenLink} from '#/lib/hooks/useOpenLink'
3030-import {saveVideoToMediaLibrary} from '#/lib/media/manip'
3131-import {downloadVideoWeb} from '#/lib/media/manip.web'
3030+import {saveVideoToDevice} from '#/lib/media/saveVideoToDevice'
3231import {getCurrentRoute} from '#/lib/routes/helpers'
3332import {makeProfileLink} from '#/lib/routes/links'
3433import {
···109108import * as Prompt from '#/components/Prompt'
110109import * as Toast from '#/components/Toast'
111110import {useAnalytics} from '#/analytics'
112112-import {IS_INTERNAL, IS_WEB} from '#/env'
111111+import {IS_INTERNAL} from '#/env'
113112114113let PostMenuItems = ({
115114 post,
···617616 Toast.show(l({message: 'Downloading video...', context: 'toast'}))
618617619618 let success
620620- if (IS_WEB) success = await downloadVideoWeb({uri: uri})
621621- else success = await saveVideoToMediaLibrary({uri: uri})
619619+ success = await saveVideoToDevice({uri: uri})
622620623621 if (success)
624622 Toast.show(l({message: 'Video downloaded', context: 'toast'}), {
···636634 Toast.show(l({message: 'Downloading GIF...', context: 'toast'}))
637635638636 let success
639639- if (IS_WEB) success = await downloadVideoWeb({uri: gifEmbed.external.uri})
640640- else success = await saveVideoToMediaLibrary({uri: gifEmbed.external.uri})
637637+ success = await saveVideoToDevice({uri: gifEmbed.external.uri})
641638642639 if (success)
643640 Toast.show(l({message: 'GIF downloaded', context: 'toast'}), {
+1-2
src/components/Typography.tsx
···11-import {UITextView} from 'react-native-uitextview'
22-31import {logger} from '#/logger'
22+import {UITextView} from '#/platform/ui-text-view'
43import {atoms as a, type TextStyleProp, useAlf, useTheme, web} from '#/alf'
54import {
65 childHasEmoji,
+1-1
src/components/contacts/screens/GetContacts.tsx
···11import {useContext} from 'react'
22import {Alert, View} from 'react-native'
33import {useSafeAreaInsets} from 'react-native-safe-area-context'
44-import * as Contacts from 'expo-contacts'
54import type AtpAgent from '@atproto/api'
65import {
76 type AppBskyActorProfile,
···1615import {uploadBlob} from '#/lib/api'
1716import {cleanError, isNetworkError} from '#/lib/strings/errors'
1817import {logger} from '#/logger'
1818+import * as Contacts from '#/platform/contacts'
1919import {findContactsStatusQueryKey} from '#/state/queries/find-contacts'
2020import {useAgent} from '#/state/session'
2121import {
+1-1
src/components/contacts/state.ts
···11import {createContext, useContext, useReducer} from 'react'
22import {type GestureResponderEvent} from 'react-native'
33-import {type ExistingContact} from 'expo-contacts'
4354import {type CountryCode} from '#/lib/international-telephone-codes'
55+import {type ExistingContact} from '#/platform/contacts'
66import type * as bsky from '#/types/bsky'
7788export type Contact = ExistingContact
+5
src/lib/media/saveVideoToDevice.ts
···11+import {saveVideoToMediaLibrary} from './manip'
22+33+export async function saveVideoToDevice({uri}: {uri: string}) {
44+ return await saveVideoToMediaLibrary({uri})
55+}
+5
src/lib/media/saveVideoToDevice.web.ts
···11+import {downloadVideoWeb} from './manip.web'
22+33+export async function saveVideoToDevice({uri}: {uri: string}) {
44+ return await downloadVideoWeb({uri})
55+}
···11import {View} from 'react-native'
22-import * as Contacts from 'expo-contacts'
32import {msg} from '@lingui/core/macro'
43import {useLingui} from '@lingui/react'
54import {Trans} from '@lingui/react/macro'
···7687import {urls} from '#/lib/constants'
98import {useCallOnce} from '#/lib/once'
99+import * as Contacts from '#/platform/contacts'
1010import {atoms as a} from '#/alf'
1111import {Admonition} from '#/components/Admonition'
1212import {Button, ButtonText} from '#/components/Button'
+1-1
src/screens/Settings/FindContactsSettings.tsx
···11import {useCallback, useEffect, useState} from 'react'
22import {type ListRenderItemInfo, View} from 'react-native'
33-import * as Contacts from 'expo-contacts'
43import {
54 type AppBskyContactDefs,
65 type AppBskyContactGetSyncStatus,
···2120} from '#/lib/routes/types'
2221import {cleanError, isNetworkError} from '#/lib/strings/errors'
2322import {logger} from '#/logger'
2323+import * as Contacts from '#/platform/contacts'
2424import {
2525 updateProfileShadow,
2626 useProfileShadow,
+38
src/state/appConfig.web.tsx
···11+import {createContext, useContext} from 'react'
22+33+type AppConfigResponse = {
44+ liveNow: {
55+ allow: string[]
66+ exceptions: {
77+ did: string
88+ allow: string[]
99+ }[]
1010+ }
1111+}
1212+1313+export const DEFAULT_APP_CONFIG_RESPONSE: AppConfigResponse = {
1414+ liveNow: {
1515+ allow: [],
1616+ exceptions: [],
1717+ },
1818+}
1919+2020+const Context = createContext<AppConfigResponse>(DEFAULT_APP_CONFIG_RESPONSE)
2121+2222+export function Provider({children}: React.PropsWithChildren<{}>) {
2323+ return (
2424+ <Context.Provider value={DEFAULT_APP_CONFIG_RESPONSE}>
2525+ {children}
2626+ </Context.Provider>
2727+ )
2828+}
2929+3030+export async function prefetchAppConfig() {}
3131+3232+export function useAppConfig() {
3333+ const ctx = useContext(Context)
3434+ if (!ctx) {
3535+ throw new Error('useAppConfig must be used within a Provider')
3636+ }
3737+ return ctx
3838+}
+1-1
src/view/com/util/text/Text.tsx
···11import {useMemo} from 'react'
22import {StyleSheet, type TextProps} from 'react-native'
33-import {UITextView} from 'react-native-uitextview'
4354import {lh, s} from '#/lib/styles'
65import {type TypographyVariant, useTheme} from '#/lib/ThemeContext'
76import {logger} from '#/logger'
77+import {UITextView} from '#/platform/ui-text-view'
88import {applyFonts, useAlf} from '#/alf'
99import {
1010 childHasEmoji,