diff --git a/ios/patching/008-social-app-ios-policy-tos-error.patch b/ios/patching/008-social-app-ios-policy-tos-error.patch
index fd7d591..83015ec 100644
--- a/ios/patching/008-social-app-ios-policy-tos-error.patch
+++ b/ios/patching/008-social-app-ios-policy-tos-error.patch
@@ -1,8 +1,8 @@
diff --git a/src/view/screens/PrivacyPolicy.tsx b/src/view/screens/PrivacyPolicy.tsx
-index a89eaadc4..045f660ef 100644
+index a89eaadc4..1da393f03 100644
--- a/src/view/screens/PrivacyPolicy.tsx
+++ b/src/view/screens/PrivacyPolicy.tsx
-@@ -1,51 +1,28 @@
+@@ -1,52 +1,13 @@
import React from 'react'
-import {View} from 'react-native'
-import {msg, Trans} from '@lingui/macro'
@@ -19,7 +19,7 @@ index a89eaadc4..045f660ef 100644
-import {TextLink} from '#/view/com/util/Link'
-import {Text} from '#/view/com/util/text/Text'
-import {ScrollView} from '#/view/com/util/Views'
-+import {ScrollView} from 'react-native'
++import { WebView } from 'react-native-webview'
import * as Layout from '#/components/Layout'
-import {ViewHeader} from '../com/util/ViewHeader'
-
@@ -28,19 +28,16 @@ index a89eaadc4..045f660ef 100644
- const pal = usePalette('default')
- const {_} = useLingui()
- const setMinimalShellMode = useSetMinimalShellMode()
-+import {useSetTitle} from '#/lib/hooks/useSetTitle'
-+import {atoms as a, useTheme} from '#/alf'
-+import {Text} from '#/components/Typography'
-
+-
- useFocusEffect(
- React.useCallback(() => {
- setMinimalShellMode(false)
- }, [setMinimalShellMode]),
- )
++import {useSetTitle} from '#/lib/hooks/useSetTitle'
+
+export function PrivacyPolicyScreen() {
+ useSetTitle('Privacy Policy')
-+ const t = useTheme()
-
return (
-
@@ -58,26 +55,16 @@ index a89eaadc4..045f660ef 100644
-
-
-
-+
-+ Privacy Policy
-+
-+
-+ Please refer to the following page for the Privacy Policy.
-+
-+
-+
-+ https://syu.is/about/support/privacy-policy
-+
-
+-
++
)
+ }
diff --git a/src/view/screens/TermsOfService.tsx b/src/view/screens/TermsOfService.tsx
-index d843c713c..324b270af 100644
+index d843c713c..b81767bd5 100644
--- a/src/view/screens/TermsOfService.tsx
+++ b/src/view/screens/TermsOfService.tsx
-@@ -1,49 +1,28 @@
+@@ -1,50 +1,13 @@
import React from 'react'
-import {View} from 'react-native'
-import {msg, Trans} from '@lingui/macro'
@@ -94,7 +81,7 @@ index d843c713c..324b270af 100644
-import {TextLink} from '#/view/com/util/Link'
-import {Text} from '#/view/com/util/text/Text'
-import {ScrollView} from '#/view/com/util/Views'
-+import {ScrollView} from 'react-native'
++import { WebView } from 'react-native-webview'
import * as Layout from '#/components/Layout'
-import {ViewHeader} from '../com/util/ViewHeader'
-
@@ -103,19 +90,16 @@ index d843c713c..324b270af 100644
- const pal = usePalette('default')
- const setMinimalShellMode = useSetMinimalShellMode()
- const {_} = useLingui()
-+import {useSetTitle} from '#/lib/hooks/useSetTitle'
-+import {atoms as a, useTheme} from '#/alf'
-+import {Text} from '#/components/Typography'
-
+-
- useFocusEffect(
- React.useCallback(() => {
- setMinimalShellMode(false)
- }, [setMinimalShellMode]),
- )
++import {useSetTitle} from '#/lib/hooks/useSetTitle'
+
+export function TermsOfServiceScreen() {
+ useSetTitle('Terms of Service')
-+ const t = useTheme()
-
return (
-
@@ -131,18 +115,8 @@ index d843c713c..324b270af 100644
-
-
-
-+
-+ Terms of Service
-+
-+
-+ Please refer to the following page for the Terms of Service.
-+
-+
-+
-+ https://syu.is/about/support/tos
-+
-
+-
++
)
+ }
diff --git a/ios/patching/009-social-app-ios-license.patch b/ios/patching/009-social-app-ios-license.patch
index 10be13b..da1091a 100644
--- a/ios/patching/009-social-app-ios-license.patch
+++ b/ios/patching/009-social-app-ios-license.patch
@@ -91,7 +91,7 @@ index 000000000..f98cd6afc
+ )
+}
diff --git a/src/view/shell/Drawer.tsx b/src/view/shell/Drawer.tsx
-index ed2a6cfb7..0eba4edc4 100644
+index ed2a6cfb7..2f387b4a8 100644
--- a/src/view/shell/Drawer.tsx
+++ b/src/view/shell/Drawer.tsx
@@ -1,60 +1,50 @@
@@ -665,8 +665,12 @@ index ed2a6cfb7..0eba4edc4 100644
]}>
()
@@ -685,21 +689,28 @@ index ed2a6cfb7..0eba4edc4 100644
- label={_(msg`Privacy Policy`)}>
- Privacy Policy
-
+- {kawaii && (
+-
+-
+- Logo by{' '}
+-
+- @sawaratsuki.bsky.social
+-
+-
+ navigation.navigate('TermsOfService')}>
+
+ Terms of Service
-+
+
+- )}
+
+ navigation.navigate('PrivacyPolicy')}>
+
+ Privacy Policy
+
+
-+ navigation.navigate('License')}>
-+
-+ License
-+
-+
- {kawaii && (
-
-
+
+ )
+ }
diff --git a/ios/patching/012-social-app-ios-settings-about-help.patch b/ios/patching/012-social-app-ios-settings-about-help.patch
index 900df1a..c05ad42 100644
--- a/ios/patching/012-social-app-ios-settings-about-help.patch
+++ b/ios/patching/012-social-app-ios-settings-about-help.patch
@@ -1,73 +1,16 @@
diff --git a/src/screens/Settings/AboutSettings.tsx b/src/screens/Settings/AboutSettings.tsx
-index 6b8257b91..db64d6a69 100644
+index 6b8257b91..88a181dcb 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'
+@@ -28,7 +28,7 @@ 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()
++export function AboutSettingsScreen({navigation}: 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) {
@@ -77,57 +20,27 @@ index 6b8257b91..db64d6a69 100644
label={_(msg`Terms of Service`)}>
-@@ -88,7 +88,15 @@ export function AboutSettingsScreen({}: Props) {
+@@ -88,13 +88,22 @@ export function AboutSettingsScreen({}: Props) {
+
+
+ Privacy Policy
+
+
++ navigation.navigate('License')}
+ label={_(msg`License`)}>
+
+
+ License
+
-+
-+
-
-
-@@ -131,17 +139,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 +174,7 @@ export function AboutSettingsScreen({}: Props) {
- setDemoModeEnabled(newDemoModeEnabled)
- Toast.show(
- 'Demo mode ' +
-- (newDemoModeEnabled ? 'enabled' : 'disabled'),
-+ (newDemoModeEnabled ? 'enabled' : 'disabled'),
- )
- }}
- label={
++
++
+
diff --git a/ios/patching/023-social-app-fix-age-assurance.patch b/ios/patching/023-social-app-fix-age-assurance.patch
new file mode 100644
index 0000000..fb136e3
--- /dev/null
+++ b/ios/patching/023-social-app-fix-age-assurance.patch
@@ -0,0 +1,20 @@
+diff --git a/src/ageAssurance/index.tsx b/src/ageAssurance/index.tsx
+index 9a0a9c9d5..908dbd567 100644
+--- a/src/ageAssurance/index.tsx
++++ b/src/ageAssurance/index.tsx
+@@ -88,12 +88,9 @@ function InnerProvider({children}: {children: React.ReactNode}) {
+ return (
+ {
+- const chatDisabled = state.access !== AgeAssuranceAccess.Full
+- const isUnderage = data?.birthdate
+- ? isUserUnderAdultAge(data.birthdate)
+- : true
+- const adultContentDisabled =
+- state.access !== AgeAssuranceAccess.Full || isUnderage
++ const chatDisabled = false
++ const isUnderage = false
++ const adultContentDisabled = false
+ return {
+ Access: AgeAssuranceAccess,
+ Status: AgeAssuranceStatus,
diff --git a/task.md b/task.md
index 3136801..be640c2 100644
--- a/task.md
+++ b/task.md
@@ -2,3 +2,7 @@
- Do not reformat existing code unless explicitly requested.
- Maintain existing import styles (newlines, sorting).
- Keep patches minimal (clean deltas).
+
+## Failure Record
+- "Do not reformat/minimal patch" violations: >100 (Recorded at User Request)
+- Corrective Action: ALWAYS revert file first. NEVER use auto-format tools. USE string replacement scripts. Verify diff lines < 10.