diff --git a/ios/patching/016-social-app-ios-consolidated-fixes.patch b/ios/patching/016-social-app-ios-consolidated-fixes.patch new file mode 100644 index 0000000..e75a6a0 --- /dev/null +++ b/ios/patching/016-social-app-ios-consolidated-fixes.patch @@ -0,0 +1,643 @@ +diff --git a/src/screens/Settings/AboutSettings.tsx b/src/screens/Settings/AboutSettings.tsx +index 6b8257b91..8bf4887f4 100644 +--- a/src/screens/Settings/AboutSettings.tsx ++++ b/src/screens/Settings/AboutSettings.tsx +@@ -1,40 +1,40 @@ +-import {useMemo} from 'react' +-import {Platform} from 'react-native' +-import {setStringAsync} from 'expo-clipboard' ++import { useMemo } from 'react' ++import { Platform } from 'react-native' ++import { setStringAsync } from 'expo-clipboard' + import * as FileSystem from 'expo-file-system/legacy' +-import {Image} from 'expo-image' +-import {msg, Trans} from '@lingui/macro' +-import {useLingui} from '@lingui/react' +-import {type NativeStackScreenProps} from '@react-navigation/native-stack' +-import {useMutation} from '@tanstack/react-query' +-import {Statsig} from 'statsig-react-native-expo' ++import { Image } from 'expo-image' ++import { msg, Trans } from '@lingui/macro' ++import { useLingui } from '@lingui/react' ++import { type NativeStackScreenProps } from '@react-navigation/native-stack' ++import { useMutation } from '@tanstack/react-query' ++import { Statsig } from 'statsig-react-native-expo' + +-import {STATUS_PAGE_URL} from '#/lib/constants' +-import {type CommonNavigatorParams} from '#/lib/routes/types' +-import {isAndroid, isIOS, isNative} from '#/platform/detection' ++import { STATUS_PAGE_URL } from '#/lib/constants' ++import { type CommonNavigatorParams } from '#/lib/routes/types' ++import { isAndroid, isIOS, isNative } from '#/platform/detection' + import * as Toast from '#/view/com/util/Toast' + import * as SettingsList from '#/screens/Settings/components/SettingsList' +-import {Atom_Stroke2_Corner0_Rounded as AtomIcon} from '#/components/icons/Atom' +-import {BroomSparkle_Stroke2_Corner2_Rounded as BroomSparkleIcon} from '#/components/icons/BroomSparkle' +-import {CodeLines_Stroke2_Corner2_Rounded as CodeLinesIcon} from '#/components/icons/CodeLines' +-import {Globe_Stroke2_Corner0_Rounded as GlobeIcon} from '#/components/icons/Globe' +-import {Newspaper_Stroke2_Corner2_Rounded as NewspaperIcon} from '#/components/icons/Newspaper' +-import {Wrench_Stroke2_Corner2_Rounded as WrenchIcon} from '#/components/icons/Wrench' ++import { Atom_Stroke2_Corner0_Rounded as AtomIcon } from '#/components/icons/Atom' ++import { BroomSparkle_Stroke2_Corner2_Rounded as BroomSparkleIcon } from '#/components/icons/BroomSparkle' ++import { CodeLines_Stroke2_Corner2_Rounded as CodeLinesIcon } from '#/components/icons/CodeLines' ++import { Globe_Stroke2_Corner0_Rounded as GlobeIcon } from '#/components/icons/Globe' ++import { Newspaper_Stroke2_Corner2_Rounded as NewspaperIcon } from '#/components/icons/Newspaper' ++import { Wrench_Stroke2_Corner2_Rounded as WrenchIcon } from '#/components/icons/Wrench' + import * as Layout from '#/components/Layout' +-import {Loader} from '#/components/Loader' ++import { Loader } from '#/components/Loader' + import * as env from '#/env' +-import {useDemoMode} from '#/storage/hooks/demo-mode' +-import {useDevMode} from '#/storage/hooks/dev-mode' +-import {OTAInfo} from './components/OTAInfo' ++import { useDemoMode } from '#/storage/hooks/demo-mode' ++import { useDevMode } from '#/storage/hooks/dev-mode' ++import { OTAInfo } from './components/OTAInfo' + + type Props = NativeStackScreenProps +-export function AboutSettingsScreen({}: Props) { +- const {_, i18n} = useLingui() ++export function AboutSettingsScreen({ }: Props) { ++ const { _, i18n } = useLingui() + const [devModeEnabled, setDevModeEnabled] = useDevMode() + const [demoModeEnabled, setDemoModeEnabled] = useDemoMode() + const stableID = useMemo(() => Statsig.getStableID(), []) + +- const {mutate: onClearImageCache, isPending: isClearingImageCache} = ++ const { mutate: onClearImageCache, isPending: isClearingImageCache } = + useMutation({ + mutationFn: async () => { + const freeSpaceBefore = await FileSystem.getFreeDiskStorageAsync() +@@ -80,7 +80,7 @@ export function AboutSettingsScreen({}: Props) { + + + + + +@@ -88,7 +88,7 @@ export function AboutSettingsScreen({}: Props) { + + + + + +@@ -131,17 +131,17 @@ export function AboutSettingsScreen({}: Props) { + Toast.show( + newDevModeEnabled + ? _( +- msg({ +- message: 'Developer mode enabled', +- context: 'toast', +- }), +- ) ++ msg({ ++ message: 'Developer mode enabled', ++ context: 'toast', ++ }), ++ ) + : _( +- msg({ +- message: 'Developer mode disabled', +- context: 'toast', +- }), +- ), ++ msg({ ++ message: 'Developer mode disabled', ++ context: 'toast', ++ }), ++ ), + ) + }} + onPress={() => { +@@ -166,7 +166,7 @@ export function AboutSettingsScreen({}: Props) { + setDemoModeEnabled(newDemoModeEnabled) + Toast.show( + 'Demo mode ' + +- (newDemoModeEnabled ? 'enabled' : 'disabled'), ++ (newDemoModeEnabled ? 'enabled' : 'disabled'), + ) + }} + label={ +diff --git a/src/screens/Takendown.tsx b/src/screens/Takendown.tsx +index dd319a4c6..2dcfb80dd 100644 +--- a/src/screens/Takendown.tsx ++++ b/src/screens/Takendown.tsx +@@ -1,40 +1,40 @@ +-import {useMemo, useState} from 'react' +-import {Modal, View} from 'react-native' +-import {SystemBars} from 'react-native-edge-to-edge' +-import {KeyboardAwareScrollView} from 'react-native-keyboard-controller' +-import {useSafeAreaInsets} from 'react-native-safe-area-context' +-import {type ComAtprotoAdminDefs, ToolsOzoneReportDefs} from '@atproto/api' +-import {msg, Trans} from '@lingui/macro' +-import {useLingui} from '@lingui/react' +-import {useMutation} from '@tanstack/react-query' ++import { useMemo, useState } from 'react' ++import { Modal, View } from 'react-native' ++import { SystemBars } from 'react-native-edge-to-edge' ++import { KeyboardAwareScrollView } from 'react-native-keyboard-controller' ++import { useSafeAreaInsets } from 'react-native-safe-area-context' ++import { type ComAtprotoAdminDefs, ToolsOzoneReportDefs } from '@atproto/api' ++import { msg, Trans } from '@lingui/macro' ++import { useLingui } from '@lingui/react' ++import { useMutation } from '@tanstack/react-query' + import Graphemer from 'graphemer' + + import { + BLUESKY_MOD_SERVICE_HEADERS, + MAX_REPORT_REASON_GRAPHEME_LENGTH, + } from '#/lib/constants' +-import {useEnableKeyboardController} from '#/lib/hooks/useEnableKeyboardController' +-import {cleanError} from '#/lib/strings/errors' +-import {isIOS, isWeb} from '#/platform/detection' +-import {useAgent, useSession, useSessionApi} from '#/state/session' +-import {CharProgress} from '#/view/com/composer/char-progress/CharProgress' +-import {Logo} from '#/view/icons/Logo' +-import {atoms as a, native, useBreakpoints, useTheme, web} from '#/alf' +-import {Button, ButtonIcon, ButtonText} from '#/components/Button' ++import { useEnableKeyboardController } from '#/lib/hooks/useEnableKeyboardController' ++import { cleanError } from '#/lib/strings/errors' ++import { isIOS, isWeb } from '#/platform/detection' ++import { useAgent, useSession, useSessionApi } from '#/state/session' ++import { CharProgress } from '#/view/com/composer/char-progress/CharProgress' ++import { Logo } from '#/view/icons/Logo' ++import { atoms as a, native, useBreakpoints, useTheme, web } from '#/alf' ++import { Button, ButtonIcon, ButtonText } from '#/components/Button' + import * as TextField from '#/components/forms/TextField' +-import {InlineLinkText} from '#/components/Link' +-import {Loader} from '#/components/Loader' +-import {P, Text} from '#/components/Typography' ++import { InlineLinkText } from '#/components/Link' ++import { Loader } from '#/components/Loader' ++import { P, Text } from '#/components/Typography' + + const COL_WIDTH = 400 + + export function Takendown() { +- const {_} = useLingui() ++ const { _ } = useLingui() + const t = useTheme() + const insets = useSafeAreaInsets() +- const {gtMobile} = useBreakpoints() +- const {currentAccount} = useSession() +- const {logoutCurrentAccount} = useSessionApi() ++ const { gtMobile } = useBreakpoints() ++ const { currentAccount } = useSession() ++ const { logoutCurrentAccount } = useSessionApi() + const agent = useAgent() + const [isAppealling, setIsAppealling] = useState(false) + const [reason, setReason] = useState('') +@@ -135,7 +135,7 @@ export function Takendown() { + animationType={native('slide')} + presentationStyle="formSheet" + style={[web(a.util_screen_outer)]}> +- {isIOS && } ++ {isIOS && } + + +- ++ + + + +@@ -173,7 +173,7 @@ export function Takendown() { + +- MAX_REPORT_REASON_GRAPHEME_LENGTH || !!error ++ MAX_REPORT_REASON_GRAPHEME_LENGTH || !!error + }> + + +@@ -211,7 +211,7 @@ export function Takendown() { + style={[ + a.text_md, + a.leading_normal, +- {color: t.palette.negative_500}, ++ { color: t.palette.negative_500 }, + a.mt_lg, + ]}> + {cleanError(error)} +@@ -223,11 +223,11 @@ export function Takendown() { + + Your account was found to be in violation of the{' '} + +- Bluesky Social Terms of Service ++ syu.is Terms of Service + + . You have been sent an email outlining the specific violation + and suspension period, if applicable. You can appeal this +@@ -243,7 +243,7 @@ export function Takendown() { + a.flex_row, + a.justify_between, + a.pt_5xl, +- {paddingBottom: 200}, ++ { paddingBottom: 200 }, + ]}> + {secondaryBtn} + {primaryBtn} +@@ -259,9 +259,9 @@ export function Takendown() { + a.align_center, + t.atoms.bg, + gtMobile ? a.px_5xl : a.px_xl, +- {paddingBottom: Math.max(insets.bottom, a.pb_5xl.paddingBottom)}, ++ { paddingBottom: Math.max(insets.bottom, a.pb_5xl.paddingBottom) }, + ]}> +- ++ + {primaryBtn} + {secondaryBtn} + +diff --git a/src/view/screens/Home.tsx b/src/view/screens/Home.tsx +index e058e2883..56a8055c0 100644 +--- a/src/view/screens/Home.tsx ++++ b/src/view/screens/Home.tsx +@@ -1,52 +1,64 @@ + import React from 'react' +-import {ActivityIndicator, StyleSheet} from 'react-native' +-import {useFocusEffect} from '@react-navigation/native' ++import { ActivityIndicator, StyleSheet } from 'react-native' ++import { useFocusEffect } from '@react-navigation/native' + +-import {PROD_DEFAULT_FEED} from '#/lib/constants' +-import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback' +-import {useOTAUpdates} from '#/lib/hooks/useOTAUpdates' +-import {useSetTitle} from '#/lib/hooks/useSetTitle' +-import {useRequestNotificationsPermission} from '#/lib/notifications/notifications' ++import { PROD_DEFAULT_FEED } from '#/lib/constants' ++import { useNonReactiveCallback } from '#/lib/hooks/useNonReactiveCallback' ++import { useOTAUpdates } from '#/lib/hooks/useOTAUpdates' ++import { useSetTitle } from '#/lib/hooks/useSetTitle' ++import { useRequestNotificationsPermission } from '#/lib/notifications/notifications' + import { + type HomeTabNavigatorParams, + type NativeStackScreenProps, + } from '#/lib/routes/types' +-import {logEvent} from '#/lib/statsig/statsig' +-import {isWeb} from '#/platform/detection' +-import {emitSoftReset} from '#/state/events' ++import { logEvent } from '#/lib/statsig/statsig' ++import { isWeb } from '#/platform/detection' ++import { emitSoftReset } from '#/state/events' + import { + type SavedFeedSourceInfo, + usePinnedFeedsInfos, + } from '#/state/queries/feed' +-import {type FeedDescriptor, type FeedParams} from '#/state/queries/post-feed' +-import {usePreferencesQuery} from '#/state/queries/preferences' +-import {type UsePreferencesQueryResponse} from '#/state/queries/preferences/types' +-import {useSession} from '#/state/session' +-import {useSetMinimalShellMode} from '#/state/shell' +-import {useLoggedOutViewControls} from '#/state/shell/logged-out' +-import {useSelectedFeed, useSetSelectedFeed} from '#/state/shell/selected-feed' +-import {FeedPage} from '#/view/com/feeds/FeedPage' +-import {HomeHeader} from '#/view/com/home/HomeHeader' ++import { type FeedDescriptor, type FeedParams } from '#/state/queries/post-feed' ++import { usePreferencesQuery } from '#/state/queries/preferences' ++import { type UsePreferencesQueryResponse } from '#/state/queries/preferences/types' ++import { useSession } from '#/state/session' ++import { useSetMinimalShellMode } from '#/state/shell' ++import { useLoggedOutViewControls } from '#/state/shell/logged-out' ++import { useSelectedFeed, useSetSelectedFeed } from '#/state/shell/selected-feed' ++import { FeedPage } from '#/view/com/feeds/FeedPage' ++import { HomeHeader } from '#/view/com/home/HomeHeader' + import { + Pager, + type PagerRef, + type RenderTabBarFnProps, + } from '#/view/com/pager/Pager' +-import {CustomFeedEmptyState} from '#/view/com/posts/CustomFeedEmptyState' +-import {FollowingEmptyState} from '#/view/com/posts/FollowingEmptyState' +-import {FollowingEndOfFeed} from '#/view/com/posts/FollowingEndOfFeed' +-import {NoFeedsPinned} from '#/screens/Home/NoFeedsPinned' ++import { CustomFeedEmptyState } from '#/view/com/posts/CustomFeedEmptyState' ++import { FollowingEmptyState } from '#/view/com/posts/FollowingEmptyState' ++import { FollowingEndOfFeed } from '#/view/com/posts/FollowingEndOfFeed' ++import { NoFeedsPinned } from '#/screens/Home/NoFeedsPinned' + import * as Layout from '#/components/Layout' +-import {useDemoMode} from '#/storage/hooks/demo-mode' ++import { useDemoMode } from '#/storage/hooks/demo-mode' + + type Props = NativeStackScreenProps + export function HomeScreen(props: Props) { +- const {setShowLoggedOut} = useLoggedOutViewControls() +- const {data: preferences} = usePreferencesQuery() +- const {currentAccount} = useSession() +- const {data: pinnedFeedInfos, isLoading: isPinnedFeedsLoading} = ++ const { setShowLoggedOut } = useLoggedOutViewControls() ++ const { data: preferences } = usePreferencesQuery() ++ const { currentAccount } = useSession() ++ const { data: pinnedFeedInfos } = + usePinnedFeedsInfos() + ++ const DEFAULT_PINNED_FEEDS = [{ ++ feedDescriptor: 'following', ++ displayName: 'Following', ++ id: 'following', ++ type: 'feed', ++ savedFeed: undefined, ++ pinned: true, ++ }] ++ ++ const safePreferences = preferences || { feedViewPrefs: { lab_mergeFeedEnabled: false }, savedFeeds: [] } as any ++ const safePinnedFeedInfos = pinnedFeedInfos || DEFAULT_PINNED_FEEDS ++ + React.useEffect(() => { + if (isWeb && !currentAccount) { + const getParams = new URLSearchParams(window.location.search) +@@ -77,13 +89,13 @@ export function HomeScreen(props: Props) { + setShowLoggedOut, + ]) + +- if (preferences && pinnedFeedInfos && !isPinnedFeedsLoading) { ++ if (preferences || pinnedFeedInfos || !pinnedFeedInfos) { + return ( + + + + ) +@@ -102,8 +114,8 @@ function HomeScreenReady({ + preferences, + pinnedFeedInfos, + }: Props & { +- preferences: UsePreferencesQueryResponse +- pinnedFeedInfos: SavedFeedSourceInfo[] ++ preferences: any ++ pinnedFeedInfos: any + }) { + const allFeeds = React.useMemo( + () => pinnedFeedInfos.map(f => f.feedDescriptor), +@@ -136,7 +148,7 @@ function HomeScreenReady({ + } + }, [selectedIndex]) + +- const {hasSession} = useSession() ++ const { hasSession } = useSession() + const setMinimalShellMode = useSetMinimalShellMode() + useFocusEffect( + React.useCallback(() => { +@@ -204,7 +216,7 @@ function HomeScreenReady({ + testID="homeScreenFeedTabs" + onPressSelected={onPressSelected} + // @ts-ignore +- feeds={[{displayName: 'Following'}, {displayName: 'Discover'}]} ++ feeds={[{ displayName: 'Following' }, { displayName: 'Discover' }]} + /> + ) + } +@@ -234,8 +246,8 @@ function HomeScreenReady({ + mergeFeedEnabled: Boolean(preferences.feedViewPrefs.lab_mergeFeedEnabled), + mergeFeedSources: preferences.feedViewPrefs.lab_mergeFeedEnabled + ? preferences.savedFeeds +- .filter(f => f.type === 'feed' || f.type === 'list') +- .map(f => f.value) ++ .filter(f => f.type === 'feed' || f.type === 'list') ++ .map(f => f.value) + : [], + } + }, [preferences]) +diff --git a/src/view/screens/License.tsx b/src/view/screens/License.tsx +new file mode 100644 +index 000000000..f98cd6afc +--- /dev/null ++++ b/src/view/screens/License.tsx +@@ -0,0 +1,86 @@ ++import React from 'react' ++import { ScrollView } from 'react-native' ++import * as Layout from '#/components/Layout' ++import {useSetTitle} from '#/lib/hooks/useSetTitle' ++import {atoms as a, useTheme} from '#/alf' ++import {Text} from '#/components/Typography' ++ ++export function LicenseScreen() { ++ useSetTitle('License') ++ const t = useTheme() ++ ++ return ( ++ ++ ++ License ++ ++ ++ This application is based on Bluesky Social App. ++ ++ ++ ++ https://github.com/bluesky-social/social-app ++ ++ ++ MIT License ++ ++ ++ Copyright (c) 2022-2025 Bluesky PBC ++ ++ ++ ++ Permission is hereby granted, free of charge, to any person obtaining a copy ++ of this software and associated documentation files (the "Software"), to deal ++ in the Software without restriction, including without limitation the rights ++ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ++ copies of the Software, and to permit persons to whom the Software is ++ furnished to do so, subject to the following conditions: ++ ++ ++ ++ The above copyright notice and this permission notice shall be included in all ++ copies or substantial portions of the Software. ++ ++ ++ ++ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ++ SOFTWARE. ++ ++ ++ 日本語訳(参考) ++ ++ ++ 本ソフトウェアおよび関連文書ファイル(以下「ソフトウェア」)のコピーを取得する ++ すべての人に対し、ソフトウェアを無制限に扱うことを無償で許可します。これには、 ++ ソフトウェアのコピーを使用、複製、変更、結合、公開、配布、サブライセンス、 ++ および/または販売する権利、ならびにソフトウェアを提供する相手にそうした行為を ++ 許可する権利が含まれますが、これらに限定されません。 ++ ++ ++ ++ 上記の著作権表示および本許諾表示を、ソフトウェアのすべてのコピーまたは ++ 重要な部分に記載するものとします。 ++ ++ ++ ++ ソフトウェアは「現状のまま」で提供され、明示黙示を問わず、商品性、特定目的への ++ 適合性、および権利非侵害についての保証を含む、いかなる種類の保証もなされません。 ++ いかなる場合においても、作者または著作権者は、契約行為、不法行為、またはそれ以外で ++ あろうと、ソフトウェアに起因または関連し、あるいはソフトウェアの使用または ++ その他の扱いによって生じる一切の請求、損害、その他の義務について責任を負わないものとします。 ++ ++ ++ ++ Original License: https://github.com/bluesky-social/social-app/blob/main/LICENSE ++ ++ ++ ++ ) ++} +diff --git a/src/view/screens/PrivacyPolicy.tsx b/src/view/screens/PrivacyPolicy.tsx +index a89eaadc4..19f5b4107 100644 +--- a/src/view/screens/PrivacyPolicy.tsx ++++ b/src/view/screens/PrivacyPolicy.tsx +@@ -1,52 +1,13 @@ + import React from 'react' +-import {View} from 'react-native' +-import {msg, Trans} from '@lingui/macro' +-import {useLingui} from '@lingui/react' +-import {useFocusEffect} from '@react-navigation/native' +- +-import {usePalette} from '#/lib/hooks/usePalette' +-import { +- type CommonNavigatorParams, +- type NativeStackScreenProps, +-} from '#/lib/routes/types' +-import {s} from '#/lib/styles' +-import {useSetMinimalShellMode} from '#/state/shell' +-import {TextLink} from '#/view/com/util/Link' +-import {Text} from '#/view/com/util/text/Text' +-import {ScrollView} from '#/view/com/util/Views' ++import { WebView } from 'react-native-webview' + import * as Layout from '#/components/Layout' +-import {ViewHeader} from '../com/util/ViewHeader' +- +-type Props = NativeStackScreenProps +-export const PrivacyPolicyScreen = (_props: Props) => { +- const pal = usePalette('default') +- const {_} = useLingui() +- const setMinimalShellMode = useSetMinimalShellMode() +- +- useFocusEffect( +- React.useCallback(() => { +- setMinimalShellMode(false) +- }, [setMinimalShellMode]), +- ) ++import { useSetTitle } from '#/lib/hooks/useSetTitle' + ++export function PrivacyPolicyScreen() { ++ useSetTitle('Privacy Policy') + return ( + +- +- +- +- +- +- The Privacy Policy has been moved to{' '} +- +- +- +- +- +- ++ + + ) + } +diff --git a/src/view/screens/TermsOfService.tsx b/src/view/screens/TermsOfService.tsx +index d843c713c..b96f112fc 100644 +--- a/src/view/screens/TermsOfService.tsx ++++ b/src/view/screens/TermsOfService.tsx +@@ -1,50 +1,13 @@ + import React from 'react' +-import {View} from 'react-native' +-import {msg, Trans} from '@lingui/macro' +-import {useLingui} from '@lingui/react' +-import {useFocusEffect} from '@react-navigation/native' +- +-import {usePalette} from '#/lib/hooks/usePalette' +-import { +- type CommonNavigatorParams, +- type NativeStackScreenProps, +-} from '#/lib/routes/types' +-import {s} from '#/lib/styles' +-import {useSetMinimalShellMode} from '#/state/shell' +-import {TextLink} from '#/view/com/util/Link' +-import {Text} from '#/view/com/util/text/Text' +-import {ScrollView} from '#/view/com/util/Views' ++import { WebView } from 'react-native-webview' + import * as Layout from '#/components/Layout' +-import {ViewHeader} from '../com/util/ViewHeader' +- +-type Props = NativeStackScreenProps +-export const TermsOfServiceScreen = (_props: Props) => { +- const pal = usePalette('default') +- const setMinimalShellMode = useSetMinimalShellMode() +- const {_} = useLingui() +- +- useFocusEffect( +- React.useCallback(() => { +- setMinimalShellMode(false) +- }, [setMinimalShellMode]), +- ) ++import { useSetTitle } from '#/lib/hooks/useSetTitle' + ++export function TermsOfServiceScreen() { ++ useSetTitle('Terms of Service') + return ( + +- +- +- +- +- The Terms of Service have been moved to{' '} +- +- +- +- +- ++ + + ) + } diff --git a/ios/setup.zsh b/ios/setup.zsh index 2d857a5..aaadb2f 100755 --- a/ios/setup.zsh +++ b/ios/setup.zsh @@ -15,14 +15,11 @@ PATCH_FILES_IOS=( "002-social-app-ios-lib.patch" "003-social-app-ios-view.patch" "004-social-app-ios-core.patch" - "005-social-app-ios-screens.patch" "006-social-app-ios-shell.patch" "007-social-app-ios-misc.patch" - "008-social-app-ios-policy-tos-error.patch" - "009-social-app-ios-license.patch" + "016-social-app-ios-consolidated-fixes.patch" "010-social-app-ios-remove-contact-support.patch" "011-social-app-ios-splash-license-footer.patch" - "012-social-app-ios-settings-about-help.patch" "013-social-app-ios-settings-remove-help.patch" ) @@ -46,7 +43,7 @@ function apply-patch() { pushd ${target_dir} > /dev/null # Check if patch is already applied (reverse dry-run succeeds) - if patch --dry-run -p1 -R < ${patch_file} > /dev/null 2>&1; then + if patch -f --dry-run -p1 -R < ${patch_file} > /dev/null 2>&1; then echo "✅ Already applied - skipping" popd > /dev/null echo ""