ai/at
1
0

fix ios patch refact

This commit is contained in:
2026-03-12 23:07:45 +09:00
parent 669f529481
commit 00b1b5ce1e
21 changed files with 344 additions and 546 deletions

View File

@@ -12,7 +12,17 @@
// When testing local services, enter an ngrok (et al) domain here. It must use a standard HTTP/HTTPS port.
...(IS_DEV || IS_TESTFLIGHT ? [] : []),
]
@@ -38,27 +35,25 @@
@@ -35,34 +32,28 @@
const USE_SENTRY = Boolean(process.env.SENTRY_AUTH_TOKEN)
- const IOS_ICON_FILE =
- PLATFORM === 'web' // web build doesn't like .icon files
- ? './assets/app-icons/ios_icon_default_next.png'
- : IS_TESTFLIGHT
- ? './assets/app-icons/ios_icon_testflight.icon'
- : './assets/app-icons/ios_icon_default.icon'
-
return {
expo: {
version: VERSION,
@@ -39,15 +49,12 @@
config: {
usesNonExemptEncryption: false,
},
- icon:
- PLATFORM === 'web' // web build doesn't like .icon files
- ? './assets/app-icons/ios_icon_default_next.png'
- : './assets/app-icons/ios_icon_default.icon',
- icon: IOS_ICON_FILE,
+ icon: './assets/app-icon.png',
infoPlist: {
UIBackgroundModes: ['remote-notification'],
NSCameraUsageDescription:
@@ -118,7 +113,7 @@
@@ -121,7 +112,7 @@
entitlements: {
'com.apple.developer.kernel.increased-memory-limit': true,
'com.apple.developer.kernel.extended-virtual-addressing': true,
@@ -56,7 +63,7 @@
// 'com.apple.developer.device-information.user-assigned-device-name': true,
},
privacyManifests: {
@@ -181,14 +176,14 @@
@@ -184,14 +175,14 @@
barStyle: 'light-content',
},
android: {
@@ -73,7 +80,7 @@
intentFilters: [
{
action: 'VIEW',
@@ -196,7 +191,7 @@
@@ -199,7 +190,7 @@
data: [
{
scheme: 'https',
@@ -82,7 +89,7 @@
},
...(IS_DEV
? [
@@ -280,7 +275,6 @@
@@ -290,7 +281,6 @@
networkInstrumentation: true,
},
],
@@ -90,7 +97,7 @@
'./plugins/withGradleJVMHeapSizeIncrease.js',
'./plugins/withAndroidManifestLargeHeapPlugin.js',
'./plugins/withAndroidManifestFCMIconPlugin.js',
@@ -288,8 +282,6 @@
@@ -298,8 +288,6 @@
'./plugins/withAndroidStylesAccentColorPlugin.js',
'./plugins/withAndroidDayNightThemePlugin.js',
'./plugins/withAndroidNoJitpackPlugin.js',
@@ -99,7 +106,7 @@
[
'expo-font',
{
@@ -417,30 +409,7 @@
@@ -427,30 +415,7 @@
build: {
experimental: {
ios: {

View File

@@ -1,8 +1,6 @@
diff --git a/src/Splash.tsx b/src/Splash.tsx
index 47e70b375..616f351ed 100644
--- a/src/Splash.tsx
+++ b/src/Splash.tsx
@@ -15,8 +15,8 @@ import Animated, {
@@ -15,8 +15,8 @@
withTiming,
} from 'react-native-reanimated'
import {useSafeAreaInsets} from 'react-native-safe-area-context'
@@ -12,14 +10,14 @@ index 47e70b375..616f351ed 100644
import * as SplashScreen from 'expo-splash-screen'
import {Logotype} from '#/view/icons/Logotype'
@@ -29,21 +29,18 @@ const darkSplashImageUri = RNImage.resolveAssetSource(
@@ -29,21 +29,18 @@
darkSplashImagePointer,
).uri
-export const Logo = React.forwardRef(function LogoImpl(props: SvgProps, ref) {
-export const Logo = forwardRef(function LogoImpl(props: SvgProps, ref) {
- const width = 1000
- const height = width * (67 / 64)
+export const Logo = React.forwardRef(function LogoImpl(props: SvgProps & {fill?: string}, ref) {
+export const Logo = forwardRef(function LogoImpl(props: SvgProps & {fill?: string}, ref) {
+ const size = 1000
+ // @ts-ignore
return (
@@ -44,12 +42,10 @@ index 47e70b375..616f351ed 100644
)
})
diff --git a/src/view/com/util/UserAvatar.tsx b/src/view/com/util/UserAvatar.tsx
index 8a9e51a33..65d643b89 100644
--- a/src/view/com/util/UserAvatar.tsx
+++ b/src/view/com/util/UserAvatar.tsx
@@ -444,7 +444,7 @@ let EditableUserAvatar = ({
<HighPriorityImage
@@ -446,7 +446,7 @@
<ExpoImage
testID="userAvatarImage"
style={aviStyle}
- source={{uri: avatar}}
@@ -57,157 +53,13 @@ index 8a9e51a33..65d643b89 100644
accessibilityRole="image"
/>
) : (
@@ -618,9 +618,8 @@ export {PreviewableUserAvatar}
@@ -617,7 +617,8 @@
// manually string-replace to use the smaller ones
// -prf
function hackModifyThumbnailPath(uri: string, isEnabled: boolean): string {
- return isEnabled
- ? uri.replace('/img/avatar/plain/', '/img/avatar_thumbnail/plain/')
- : uri
- return isEnabled ? convertCdnPreset(uri, 'avatar_thumbnail') : uri
+ // syu.is: avatars are served directly from bsky.syu.is, no CDN transformation needed
+ return uri
}
const styles = StyleSheet.create({
diff --git a/src/view/icons/Logo.tsx b/src/view/icons/Logo.tsx
index d7208df13..2763800ac 100644
--- a/src/view/icons/Logo.tsx
+++ b/src/view/icons/Logo.tsx
@@ -1,75 +1,17 @@
import React from 'react'
-import {type TextProps} from 'react-native'
-import Svg, {
- Defs,
- LinearGradient,
- Path,
- type PathProps,
- Stop,
- type SvgProps,
-} from 'react-native-svg'
import {Image} from 'expo-image'
+import {flatten} from '#/alf'
-import {useKawaiiMode} from '#/state/preferences/kawaii'
-import {flatten, useTheme} from '#/alf'
-
-const ratio = 57 / 64
-
-type Props = {
- fill?: PathProps['fill']
- style?: TextProps['style']
-} & Omit<SvgProps, 'style'>
-
-export const Logo = React.forwardRef(function LogoImpl(props: Props, ref) {
- const t = useTheme()
- const {fill, ...rest} = props
- const gradient = fill === 'sky'
- const styles = flatten(props.style)
- const _fill = gradient
- ? 'url(#sky)'
- : fill || styles?.color || t.palette.primary_500
- // @ts-ignore it's fiiiiine
- const size = parseInt(rest.width || 32, 10)
-
- const isKawaii = useKawaiiMode()
-
- if (isKawaii) {
- return (
- <Image
- source={
- size > 100
- ? require('../../../assets/kawaii.png')
- : require('../../../assets/kawaii_smol.png')
- }
- accessibilityLabel="Bluesky"
- accessibilityHint=""
- accessibilityIgnoresInvertColors
- style={[{height: size, aspectRatio: 1.4}]}
- />
- )
- }
-
+export const Logo = React.forwardRef(function LogoImpl(props: any, ref) {
+ const {width, style} = props
+ // @ts-ignore
+ const size = parseInt(width || 32, 10)
return (
- <Svg
- fill="none"
- // @ts-ignore it's fiiiiine
- ref={ref}
- viewBox="0 0 64 57"
- {...rest}
- style={[{width: size, height: size * ratio}, styles]}>
- {gradient && (
- <Defs>
- <LinearGradient id="sky" x1="0" y1="0" x2="0" y2="1">
- <Stop offset="0" stopColor="#0A7AFF" stopOpacity="1" />
- <Stop offset="1" stopColor="#59B9FF" stopOpacity="1" />
- </LinearGradient>
- </Defs>
- )}
-
- <Path
- fill={_fill}
- d="M13.873 3.805C21.21 9.332 29.103 20.537 32 26.55v15.882c0-.338-.13.044-.41.867-1.512 4.456-7.418 21.847-20.923 7.944-7.111-7.32-3.819-14.64 9.125-16.85-7.405 1.264-15.73-.825-18.014-9.015C1.12 23.022 0 8.51 0 6.55 0-3.268 8.579-.182 13.873 3.805ZM50.127 3.805C42.79 9.332 34.897 20.537 32 26.55v15.882c0-.338.13.044.41.867 1.512 4.456 7.418 21.847 20.923 7.944 7.111-7.32 3.819-14.64-9.125-16.85 7.405 1.264 15.73-.825 18.014-9.015C62.88 23.022 64 8.51 64 6.55c0-9.818-8.578-6.732-13.873-2.745Z"
- />
- </Svg>
+ <Image
+ source={require('../../../assets/logo.png')}
+ style={[{width: size, height: size}, flatten(style)]}
+ contentFit="contain"
+ accessibilityLabel="Logo"
+ />
)
})
diff --git a/src/view/icons/Logotype.tsx b/src/view/icons/Logotype.tsx
index 270c913fc..a60ffe07c 100644
--- a/src/view/icons/Logotype.tsx
+++ b/src/view/icons/Logotype.tsx
@@ -1,28 +1,22 @@
-import Svg, {Path, type PathProps, type SvgProps} from 'react-native-svg'
-
-import {usePalette} from '#/lib/hooks/usePalette'
-
-const ratio = 17 / 64
-
-export function Logotype({
- fill,
- ...rest
-}: {fill?: PathProps['fill']} & SvgProps) {
- const pal = usePalette('default')
- // @ts-ignore it's fiiiiine
- const size = parseInt(rest.width || 32)
+import React from 'react'
+import {Text} from 'react-native'
+import {useTheme, atoms as a} from '#/alf'
+export function Logotype({width, fill, style}: any) {
+ const t = useTheme()
+ const fontSize = width ? parseInt(width) / 3.5 : 22
+
return (
- <Svg
- fill="none"
- viewBox="0 0 64 17"
- {...rest}
- width={size}
- height={Number(size) * ratio}>
- <Path
- fill={fill || pal.text.color}
- d="M8.478 6.252c1.503.538 2.3 1.78 2.3 3.172 0 2.356-1.576 3.785-4.6 3.785H0V0h5.974c2.875 0 4.267 1.466 4.267 3.413 0 1.3-.594 2.245-1.763 2.839Zm-2.69-4.193H2.504v3.45h3.284c1.28 0 1.967-.667 1.967-1.78 0-1.02-.705-1.67-1.967-1.67Zm-3.284 9.072h3.544c1.41 0 2.17-.65 2.17-1.818 0-1.224-.723-1.837-2.17-1.837H2.504v3.655ZM14.251 13.209h-2.337V0h2.337v13.209ZM22.001 8.998V3.636h2.338v9.573h-2.263v-1.392c-.724 1.076-1.726 1.614-3.006 1.614-2.022 0-3.34-1.224-3.34-3.45V3.636h2.338v5.955c0 1.206.594 1.818 1.8 1.818 1.132 0 2.133-.835 2.133-2.411ZM34.979 8.59v.556h-7.161c.167 1.651 1.076 2.467 2.486 2.467 1.076 0 1.8-.463 2.189-1.372h2.244c-.5 1.947-2.17 3.19-4.452 3.19-1.428 0-2.579-.463-3.45-1.372-.872-.91-1.318-2.115-1.318-3.637 0-1.502.427-2.708 1.299-3.636.872-.909 2.004-1.372 3.432-1.372 1.447 0 2.597.482 3.45 1.428.854.946 1.28 2.208 1.28 3.747Zm-4.75-3.358c-1.28 0-2.17.742-2.393 2.281h4.805c-.204-1.391-1.057-2.281-2.411-2.281ZM40.16 13.469c-2.783 0-4.249-1.095-4.379-3.303h2.282c.13 1.188.724 1.633 2.134 1.633 1.261 0 1.892-.39 1.892-1.15 0-.687-.445-1.02-1.874-1.262l-1.094-.185c-2.097-.353-3.136-1.318-3.136-2.894 0-1.8 1.429-2.894 3.97-2.894 2.728 0 4.138 1.075 4.23 3.246h-2.207c-.056-1.169-.742-1.577-2.023-1.577-1.113 0-1.67.371-1.67 1.113 0 .668.483.965 1.596 1.169l1.206.186c2.32.426 3.32 1.28 3.32 2.912 0 1.93-1.557 3.006-4.247 3.006ZM54.667 13.209h-2.671l-2.783-4.453-1.447 1.447v3.006h-2.3V0h2.3v7.606l3.896-3.97h2.783l-3.618 3.618 3.84 5.955ZM60.772 6.048l.78-2.412H64l-3.692 10.352c-.39 1.057-.872 1.818-1.484 2.245-.612.426-1.484.63-2.634.63-.39 0-.724-.018-1.02-.055V14.97h.89c1.057 0 1.577-.65 1.577-1.54 0-.445-.149-1.094-.446-1.929l-2.746-7.866h2.487l.779 2.393c.575 1.8 1.076 3.58 1.521 5.343.408-1.521.928-3.302 1.54-5.324Z"
- />
- </Svg>
+ <Text style={[
+ a.font_bold,
+ {
+ fontSize,
+ color: fill || t.palette.primary_500,
+ letterSpacing: -0.5
+ },
+ style
+ ]}>
+ Aiat
+ </Text>
)
}

View File

@@ -34,191 +34,22 @@
</SimpleInlineLinkText>
. You have been sent an email outlining the specific violation
and suspension period, if applicable. You can appeal this
--- a/src/view/screens/PrivacyPolicy.tsx
+++ b/src/view/screens/PrivacyPolicy.tsx
@@ -1,52 +1,49 @@
import React from 'react'
-import {View} from 'react-native'
-import {msg} from '@lingui/core/macro'
-import {useLingui} from '@lingui/react'
-import {Trans} from '@lingui/react/macro'
-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 {ScrollView} from 'react-native'
import * as Layout from '#/components/Layout'
-import {ViewHeader} from '../com/util/ViewHeader'
+import {useSetTitle} from '#/lib/hooks/useSetTitle'
+import {atoms as a, useTheme} from '#/alf'
+import {Text} from '#/components/Typography'
-type Props = NativeStackScreenProps<CommonNavigatorParams, 'PrivacyPolicy'>
-export const PrivacyPolicyScreen = (_props: Props) => {
- const pal = usePalette('default')
- const {_} = useLingui()
- const setMinimalShellMode = useSetMinimalShellMode()
+export function PrivacyPolicyScreen() {
+ useSetTitle('Privacy Policy')
+ const t = useTheme()
- useFocusEffect(
- React.useCallback(() => {
- setMinimalShellMode(false)
- }, [setMinimalShellMode]),
- )
-
return (
<Layout.Screen>
- <ViewHeader title={_(msg`Privacy Policy`)} />
- <ScrollView style={[s.hContentRegion, pal.view]}>
- <View style={[s.p20]}>
- <Text style={pal.text}>
- <Trans>
- The Privacy Policy has been moved to{' '}
- <TextLink
- style={pal.link}
- href="https://bsky.social/about/support/privacy-policy"
- text="bsky.social/about/support/privacy-policy"
- />
- </Trans>
- </Text>
- </View>
- <View style={s.footerSpacer} />
+ <ScrollView
+ style={[a.flex_1, {backgroundColor: t.palette.white}]}
+ contentContainerStyle={[a.p_lg, a.pt_5xl, a.pb_5xl]}>
+ <Text style={[a.text_2xl, a.font_bold, a.mb_lg]}>Privacy Policy</Text>
+
+ <Text style={[a.text_lg, a.font_bold, a.mt_lg, a.mb_md]}>Data Collection</Text>
+ <Text style={[a.mb_md]}>
+ syu.is collects minimal data necessary to provide the service. This includes your account information, posts, and interactions on the AT Protocol network.
+ </Text>
+
+ <Text style={[a.text_lg, a.font_bold, a.mt_lg, a.mb_md]}>Data Storage</Text>
+ <Text style={[a.mb_md]}>
+ Your data is stored on the AT Protocol network. Posts and profile information are public by default as part of the decentralized social network.
+ </Text>
+
+ <Text style={[a.text_lg, a.font_bold, a.mt_lg, a.mb_md]}>Third Parties</Text>
+ <Text style={[a.mb_md]}>
+ We do not sell your personal information to third parties. Your data may be visible to other users and services on the AT Protocol network.
+ </Text>
+
+ <Text style={[a.text_lg, a.font_bold, a.mt_lg, a.mb_md]}>Contact</Text>
+ <Text style={[a.mb_md]}>
+ For privacy-related questions, please contact the administrator.
+ </Text>
+
+ <Text style={[a.text_lg, a.font_bold, a.mt_xl, a.mb_md]}>日本語</Text>
+ <Text style={[a.mb_md]}>
+ syu.isはサービス提供に必要な最小限のデータのみを収集します。投稿やプロフィール情報はAT Protocolネットワーク上で公開されます。個人情報を第三者に販売することはありません。
+ </Text>
+
+ <Text style={[a.text_sm, a.mt_xl, {color: t.palette.contrast_500}]}>
+ Last updated: 2026
+ </Text>
</ScrollView>
</Layout.Screen>
)
--- a/src/view/screens/TermsOfService.tsx
+++ b/src/view/screens/TermsOfService.tsx
@@ -1,50 +1,49 @@
import React from 'react'
-import {View} from 'react-native'
-import {msg} from '@lingui/core/macro'
-import {useLingui} from '@lingui/react'
-import {Trans} from '@lingui/react/macro'
-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 {ScrollView} from 'react-native'
import * as Layout from '#/components/Layout'
-import {ViewHeader} from '../com/util/ViewHeader'
+import {useSetTitle} from '#/lib/hooks/useSetTitle'
+import {atoms as a, useTheme} from '#/alf'
+import {Text} from '#/components/Typography'
-type Props = NativeStackScreenProps<CommonNavigatorParams, 'TermsOfService'>
-export const TermsOfServiceScreen = (_props: Props) => {
- const pal = usePalette('default')
- const setMinimalShellMode = useSetMinimalShellMode()
- const {_} = useLingui()
+export function TermsOfServiceScreen() {
+ useSetTitle('Terms of Service')
+ const t = useTheme()
- useFocusEffect(
- React.useCallback(() => {
- setMinimalShellMode(false)
- }, [setMinimalShellMode]),
- )
-
return (
<Layout.Screen>
- <ViewHeader title={_(msg`Terms of Service`)} />
- <ScrollView style={[s.hContentRegion, pal.view]}>
- <View style={[s.p20]}>
- <Text style={pal.text}>
- <Trans>The Terms of Service have been moved to</Trans>{' '}
- <TextLink
- style={pal.link}
- href="https://bsky.social/about/support/tos"
- text="bsky.social/about/support/tos"
- />
- </Text>
- </View>
- <View style={s.footerSpacer} />
+ <ScrollView
+ style={[a.flex_1, {backgroundColor: t.palette.white}]}
+ contentContainerStyle={[a.p_lg, a.pt_5xl, a.pb_5xl]}>
+ <Text style={[a.text_2xl, a.font_bold, a.mb_lg]}>Terms of Service</Text>
+
+ <Text style={[a.text_lg, a.font_bold, a.mt_lg, a.mb_md]}>Acceptance</Text>
+ <Text style={[a.mb_md]}>
+ By using syu.is, you agree to these terms. If you do not agree, please do not use the service.
+ </Text>
+
+ <Text style={[a.text_lg, a.font_bold, a.mt_lg, a.mb_md]}>Prohibited Content</Text>
+ <Text style={[a.mb_md]}>
+ Do not post illegal content, spam, or harass others. Do not impersonate others or spread misinformation.
+ </Text>
+
+ <Text style={[a.text_lg, a.font_bold, a.mt_lg, a.mb_md]}>Account Termination</Text>
+ <Text style={[a.mb_md]}>
+ The administrator reserves the right to suspend or terminate accounts that violate these terms.
+ </Text>
+
+ <Text style={[a.text_lg, a.font_bold, a.mt_lg, a.mb_md]}>Disclaimer</Text>
+ <Text style={[a.mb_md]}>
+ This service is provided "as is" without warranty of any kind.
+ </Text>
+
+ <Text style={[a.text_lg, a.font_bold, a.mt_xl, a.mb_md]}>日本語</Text>
+ <Text style={[a.mb_md]}>
+ syu.isを利用することで、これらの利用規約に同意したものとみなします。違法なコンテンツの投稿、スパム、他者への嫌がらせは禁止です。管理者は規約違反のアカウントを停止する権利を有します。本サービスは現状のまま提供され、いかなる保証もありません。
+ </Text>
+
+ <Text style={[a.text_sm, a.mt_xl, {color: t.palette.contrast_500}]}>
+ Last updated: 2026
+ </Text>
</ScrollView>
</Layout.Screen>
)
--- a/src/view/shell/desktop/RightNav.tsx
+++ b/src/view/shell/desktop/RightNav.tsx
@@ -112,14 +112,14 @@
</>
)}
<InlineLinkText
- to="https://bsky.social/about/support/privacy-policy"
+ to="/support/privacy-policy"
style={[t.atoms.text_contrast_medium]}
label={_(msg`Privacy`)}>
{_(msg`Privacy`)}
</InlineLinkText>
<Text style={[t.atoms.text_contrast_low]}>{' ∙ '}</Text>
<InlineLinkText
- to="https://bsky.social/about/support/tos"
+ to="/support/tos"
style={[t.atoms.text_contrast_medium]}
label={_(msg`Terms`)}>
{_(msg`Terms`)}

View File

@@ -42,7 +42,7 @@
--- a/src/view/com/posts/FollowingEmptyState.tsx
+++ b/src/view/com/posts/FollowingEmptyState.tsx
@@ -1,38 +1,15 @@
import React from 'react'
import {useCallback} from 'react'
import {StyleSheet, View} from 'react-native'
-import {
- FontAwesomeIcon,
@@ -64,7 +64,7 @@
- const palInverted = usePalette('inverted')
- const navigation = useNavigation<NavigationProp>()
- const onPressFindAccounts = React.useCallback(() => {
- const onPressFindAccounts = useCallback(() => {
- if (IS_WEB) {
- navigation.navigate('Search', {})
- } else {
@@ -73,7 +73,7 @@
- }
- }, [navigation])
-
- const onPressDiscoverFeeds = React.useCallback(() => {
- const onPressDiscoverFeeds = useCallback(() => {
- navigation.navigate('Feeds')
- }, [navigation])
-
@@ -134,7 +134,7 @@
--- a/src/view/com/posts/FollowingEndOfFeed.tsx
+++ b/src/view/com/posts/FollowingEndOfFeed.tsx
@@ -1,37 +1,14 @@
import React from 'react'
import {useCallback} from 'react'
import {Dimensions, StyleSheet, View} from 'react-native'
-import {
- FontAwesomeIcon,
@@ -155,7 +155,7 @@
- const palInverted = usePalette('inverted')
- const navigation = useNavigation<NavigationProp>()
- const onPressFindAccounts = React.useCallback(() => {
- const onPressFindAccounts = useCallback(() => {
- if (IS_WEB) {
- navigation.navigate('Search', {})
- } else {
@@ -164,7 +164,7 @@
- }
- }, [navigation])
-
- const onPressDiscoverFeeds = React.useCallback(() => {
- const onPressDiscoverFeeds = useCallback(() => {
- navigation.navigate('Feeds')
- }, [navigation])
-
@@ -230,7 +230,55 @@
})
--- a/src/view/com/posts/PostFeed.tsx
+++ b/src/view/com/posts/PostFeed.tsx
@@ -765,7 +765,7 @@
@@ -520,16 +520,17 @@
key: 'liveEventFeedsAndTrendingBanner-' + sliceIndex,
})
// Show composer prompt for Discover and Following feeds
- if (
- hasSession &&
- (feedUriOrActorDid === DISCOVER_FEED_URI ||
- feed === 'following')
- ) {
- arr.push({
- type: 'composerPrompt',
- key: 'composerPrompt-' + sliceIndex,
- })
- }
+ // Disabled: hide composer prompt
+ // if (
+ // hasSession &&
+ // (feedUriOrActorDid === DISCOVER_FEED_URI ||
+ // feed === 'following')
+ // ) {
+ // arr.push({
+ // type: 'composerPrompt',
+ // key: 'composerPrompt-' + sliceIndex,
+ // })
+ // }
} else if (sliceIndex === 15) {
if (areVideoFeedsEnabled && !trendingVideoDisabled) {
arr.push({
@@ -546,12 +547,13 @@
} else if (feedKind === 'following') {
if (sliceIndex === 0) {
// Show composer prompt for Following feed
- if (hasSession) {
- arr.push({
- type: 'composerPrompt',
- key: 'composerPrompt-' + sliceIndex,
- })
- }
+ // Disabled: hide composer prompt
+ // if (hasSession) {
+ // arr.push({
+ // type: 'composerPrompt',
+ // key: 'composerPrompt-' + sliceIndex,
+ // })
+ // }
}
} else if (feedKind === 'profile') {
if (sliceIndex === 5) {
@@ -771,7 +773,7 @@
} else if (row.type === 'feedShutdownMsg') {
return <FeedShutdownMsg feedUri={feedUriOrActorDid} />
} else if (row.type === 'interstitialFollows') {

View File

@@ -1,17 +0,0 @@
--- a/bskyweb/cmd/bskyweb/server.go
+++ b/bskyweb/cmd/bskyweb/server.go
@@ -317,6 +317,14 @@ func serve(cctx *cli.Context) error {
e.GET("/support/tos", server.WebGeneric)
e.GET("/support/community-guidelines", server.WebGeneric)
e.GET("/support/copyright", server.WebGeneric)
+ e.GET("/support/privacy-policy", server.WebGeneric)
+ e.GET("/support/license", server.WebGeneric)
+ e.GET("/support/app", server.WebGeneric)
+ e.GET("/support/help", server.WebGeneric)
+ // /about/support/ paths (for web compatibility)
+ e.GET("/about/support/tos", server.WebGeneric)
+ e.GET("/about/support/privacy-policy", server.WebGeneric)
+ e.GET("/about/support/license", server.WebGeneric)
e.GET("/intent/compose", server.WebGeneric)
e.GET("/intent/verify-email", server.WebGeneric)
e.GET("/intent/age-assurance", server.WebGeneric)

View File

@@ -1,4 +1,20 @@
diff --git a/bskyweb/templates/base.html b/bskyweb/templates/base.html
--- a/bskyweb/cmd/bskyweb/server.go
+++ b/bskyweb/cmd/bskyweb/server.go
@@ -317,6 +317,14 @@
e.GET("/support/tos", server.WebGeneric)
e.GET("/support/community-guidelines", server.WebGeneric)
e.GET("/support/copyright", server.WebGeneric)
+ e.GET("/support/privacy-policy", server.WebGeneric)
+ e.GET("/support/license", server.WebGeneric)
+ e.GET("/support/app", server.WebGeneric)
+ e.GET("/support/help", server.WebGeneric)
+ // /about/support/ paths (for web compatibility)
+ e.GET("/about/support/tos", server.WebGeneric)
+ e.GET("/about/support/privacy-policy", server.WebGeneric)
+ e.GET("/about/support/license", server.WebGeneric)
e.GET("/intent/compose", server.WebGeneric)
e.GET("/intent/verify-email", server.WebGeneric)
e.GET("/intent/age-assurance", server.WebGeneric)
--- a/bskyweb/templates/base.html
+++ b/bskyweb/templates/base.html
@@ -7,9 +7,9 @@
@@ -11,10 +27,10 @@ diff --git a/bskyweb/templates/base.html b/bskyweb/templates/base.html
+ <link rel="preconnect" href="https://syu.is">
+ <link rel="preconnect" href="https://bsky.syu.is">
+ <title>{%- block head_title -%}syu.is{%- endblock -%}</title>
<!-- Hello Humans! API docs at https://atproto.com -->
@@ -121,7 +121,7 @@
@@ -158,7 +158,7 @@
<noscript>
<h1 lang="en">JavaScript Required</h1>
<p lang="en">This is a heavily interactive web application, and JavaScript is required. Simple HTML interfaces are possible, but that is not what this is.
@@ -23,45 +39,43 @@ diff --git a/bskyweb/templates/base.html b/bskyweb/templates/base.html
{% block noscript_extra %}{% endblock %}
</noscript>
{% endblock -%}
diff --git a/bskyweb/templates/home.html b/bskyweb/templates/home.html
--- a/bskyweb/templates/home.html
+++ b/bskyweb/templates/home.html
@@ -1,17 +1,17 @@
@@ -1,18 +1,18 @@
{% extends "base.html" %}
-{% block head_title %}Bluesky{% endblock %}
+{% block head_title %}syu.is{% endblock %}
{% block html_head_extra -%}
- <meta property="og:title" content="Bluesky" />
- <meta name="twitter:title" content="Bluesky" />
+ <meta property="og:title" content="syu.is" />
+ <meta name="twitter:title" content="syu.is" />
<meta name="description" content="Social media as it should be. Find your community among millions of users, unleash your creativity, and have some fun again." />
<meta name="og:description" content="Social media as it should be. Find your community among millions of users, unleash your creativity, and have some fun again." />
<meta name="twitter:description" content="Social media as it should be. Find your community among millions of users, unleash your creativity, and have some fun again." />
- <meta property="og:url" content="https://bsky.app" />
- <meta name="twitter:url" content="https://bsky.app" />
- <link rel="canonical" href="https://bsky.app" />
+ <meta property="og:url" content="https://syu.is" />
+ <meta name="twitter:url" content="https://syu.is" />
+ <link rel="canonical" href="https://syu.is" />
<meta property="og:image" content="https://bsky.app/static/social-card-default-gradient.png" />
diff --git a/bskyweb/templates/error.html b/bskyweb/templates/error.html
<meta property="twitter:image" content="https://bsky.app/static/social-card-default-gradient.png" />
--- a/bskyweb/templates/error.html
+++ b/bskyweb/templates/error.html
@@ -1,6 +1,6 @@
{% extends "base.html" %}
-{% block head_title %}Error {{ statusCode }} - Bluesky{% endblock %}
+{% block head_title %}Error {{ statusCode }} - syu.is{% endblock %}
{% block noscript_extra %}
{%- if statusCode == 404 %}
diff --git a/bskyweb/templates/starterpack.html b/bskyweb/templates/starterpack.html
--- a/bskyweb/templates/starterpack.html
+++ b/bskyweb/templates/starterpack.html
@@ -17,8 +17,8 @@
@@ -75,7 +89,6 @@ diff --git a/bskyweb/templates/starterpack.html b/bskyweb/templates/starterpack.
{% endif -%}
<meta name="description" content="Join the conversation" />
<meta name="og:description" content="Join the conversation" />
diff --git a/web/index.html b/web/index.html
--- a/web/index.html
+++ b/web/index.html
@@ -14,8 +14,8 @@
@@ -87,5 +100,5 @@ diff --git a/web/index.html b/web/index.html
+ <link rel="preconnect" href="https://syu.is">
+ <link rel="preconnect" href="https://bsky.syu.is">
<title>%WEB_TITLE%</title>
<link rel="preload" as="font" type="font/woff2" href="/static/media/InterVariable.c504db5c06caaf7cdfba.woff2" crossorigin>

View File

@@ -1,6 +1,6 @@
--- a/src/screens/Signup/StepInfo/index.tsx
+++ b/src/screens/Signup/StepInfo/index.tsx
@@ -8,46 +8,18 @@
@@ -9,46 +9,18 @@
import {isEmailMaybeInvalid} from '#/lib/strings/email'
import {logger} from '#/logger'
import {useSignupContext} from '#/screens/Signup/state'
@@ -47,7 +47,7 @@
export function StepInfo({
onPressBack,
isServerError,
@@ -72,22 +44,7 @@
@@ -73,22 +45,7 @@
const emailInputRef = useRef<TextInput>(null)
const passwordInputRef = useRef<TextInput>(null)
@@ -67,10 +67,10 @@
- : true
- const isDeviceGeolocationGranted = useIsDeviceGeolocationGranted()
-
const [hasWarnedEmail, setHasWarnedEmail] = React.useState<boolean>(false)
const [hasWarnedEmail, setHasWarnedEmail] = useState<boolean>(false)
const tldtsRef = React.useRef<typeof tldts>(undefined)
@@ -107,10 +64,6 @@
const tldtsRef = useRef<typeof tldts>(undefined)
@@ -108,10 +65,6 @@
const emailChanged = prevEmailValueRef.current !== email
const password = passwordValueRef.current
@@ -81,7 +81,7 @@
if (state.serviceDescription?.inviteCodeRequired && !inviteCode) {
return dispatch({
type: 'setError',
@@ -273,107 +226,16 @@
@@ -274,107 +227,16 @@
secureTextEntry
autoComplete="new-password"
autoCapitalize="none"

View File

@@ -1,16 +0,0 @@
diff --git a/src/screens/Search/Explore.tsx b/src/screens/Search/Explore.tsx
--- a/src/screens/Search/Explore.tsx
+++ b/src/screens/Search/Explore.tsx
@@ -687,12 +687,7 @@ export function Explore({
if (useFullExperience) {
i.push(trendingTopicsModule)
- i.push(...suggestedFeedsModule)
- i.push(...suggestedFollowsModule)
- i.push(...suggestedStarterPacksModule)
i.push(...feedPreviewsModule)
- } else {
- i.push(...suggestedFollowsModule)
}
return i

View File

@@ -1,16 +1,30 @@
diff --git a/src/view/screens/Feeds.tsx b/src/view/screens/Feeds.tsx
--- a/src/screens/Search/Explore.tsx
+++ b/src/screens/Search/Explore.tsx
@@ -726,12 +726,7 @@
if (useFullExperience) {
i.push(trendingTopicsModule)
- i.push(...suggestedFeedsModule)
- i.push(...suggestedFollowsModule)
- i.push(...suggestedStarterPacksModule)
i.push(...feedPreviewsModule)
- } else {
- i.push(...suggestedFollowsModule)
}
return i
--- a/src/view/screens/Feeds.tsx
+++ b/src/view/screens/Feeds.tsx
@@ -288,80 +288,7 @@ export function FeedsScreen(_props: Props) {
@@ -289,80 +289,7 @@
}
}
- if (!hasSession || (hasSession && canShowDiscoverSection)) {
- slices.push({
- key: 'popularFeedsHeader',
- type: 'popularFeedsHeader',
- })
- if (popularFeedsError || searchError) {
- slices.push({
- key: 'popularFeedsError',

View File

@@ -1,21 +1,21 @@
diff --git a/src/view/com/home/HomeHeader.tsx b/src/view/com/home/HomeHeader.tsx
--- a/src/view/com/home/HomeHeader.tsx
+++ b/src/view/com/home/HomeHeader.tsx
@@ -3,7 +3,6 @@ import {useNavigation} from '@react-navigation/native'
@@ -3,7 +3,6 @@
import {type NavigationProp} from '#/lib/routes/types'
import {type FeedSourceInfo} from '#/state/queries/feed'
-import {useSession} from '#/state/session'
import {type RenderTabBarFnProps} from '#/view/com/pager/Pager'
import {TabBar} from '../pager/TabBar'
import {HomeHeaderLayout} from './HomeHeaderLayout'
@@ -16,17 +15,15 @@ export function HomeHeader(
@@ -16,16 +15,14 @@
},
) {
const {feeds, onSelect: onSelectProp} = props
- const {hasSession} = useSession()
const navigation = useNavigation<NavigationProp>()
const hasPinnedCustom = React.useMemo<boolean>(() => {
const hasPinnedCustom = useMemo<boolean>(() => {
- if (!hasSession) return false
return feeds.some(tab => {
const isFollowing = tab.uri === 'following'
@@ -23,6 +23,6 @@ diff --git a/src/view/com/home/HomeHeader.tsx b/src/view/com/home/HomeHeader.tsx
})
- }, [feeds, hasSession])
+ }, [feeds])
const items = React.useMemo(() => {
const items = useMemo(() => {
const pinnedNames = feeds.map(f => f.displayName)

View File

@@ -18,8 +18,11 @@
import {sanitizeDisplayName} from '#/lib/strings/display-names'
import {sanitizeHandle} from '#/lib/strings/handles'
import {logger} from '#/logger'
@@ -47,6 +50,103 @@
@@ -45,8 +48,106 @@
import {ProfileHeaderHandle} from './Handle'
import {ProfileHeaderMetrics} from './Metrics'
import {ProfileHeaderShell} from './Shell'
+import {ProfileAtLinks} from './ProfileAtLinks'
import {ProfileHeaderSuggestedFollows} from './SuggestedFollows'
+const SERVICE_FAVICONS: Record<string, any> = {
@@ -122,11 +125,12 @@
interface Props {
profile: AppBskyActorDefs.ProfileViewDetailed
descriptionRT: RichTextAPI | null
@@ -152,6 +252,7 @@
@@ -152,6 +253,8 @@
{!isPlaceholderProfile && !isBlockedUser && (
<View style={a.gap_md}>
<ProfileHeaderMetrics profile={profile} />
+ <ProfileServiceLinks profile={profile} />
+ <ProfileAtLinks profile={profile} />
{descriptionRT && !moderation.ui('profileView').blur ? (
<View pointerEvents="auto">
<RichText

View File

@@ -1,50 +0,0 @@
--- a/src/view/com/posts/PostFeed.tsx 2026-02-16 02:19:59
+++ b/src/view/com/posts/PostFeed.tsx 2026-02-16 02:20:13
@@ -519,16 +519,17 @@
key: 'liveEventFeedsAndTrendingBanner-' + sliceIndex,
})
// Show composer prompt for Discover and Following feeds
- if (
- hasSession &&
- (feedUriOrActorDid === DISCOVER_FEED_URI ||
- feed === 'following')
- ) {
- arr.push({
- type: 'composerPrompt',
- key: 'composerPrompt-' + sliceIndex,
- })
- }
+ // Disabled: hide composer prompt
+ // if (
+ // hasSession &&
+ // (feedUriOrActorDid === DISCOVER_FEED_URI ||
+ // feed === 'following')
+ // ) {
+ // arr.push({
+ // type: 'composerPrompt',
+ // key: 'composerPrompt-' + sliceIndex,
+ // })
+ // }
} else if (sliceIndex === 15) {
if (areVideoFeedsEnabled && !trendingVideoDisabled) {
arr.push({
@@ -545,12 +546,13 @@
} else if (feedKind === 'following') {
if (sliceIndex === 0) {
// Show composer prompt for Following feed
- if (hasSession) {
- arr.push({
- type: 'composerPrompt',
- key: 'composerPrompt-' + sliceIndex,
- })
- }
+ // Disabled: hide composer prompt
+ // if (hasSession) {
+ // arr.push({
+ // type: 'composerPrompt',
+ // key: 'composerPrompt-' + sliceIndex,
+ // })
+ // }
}
} else if (feedKind === 'profile') {
if (sliceIndex === 5) {

View File

@@ -58,3 +58,15 @@
<Animated.View
entering={FadeIn.duration(90)}
@@ -119,8 +140,9 @@
accessibilityHint={_(
msg`Opens flow to sign in to your existing Bluesky account`,
)}
- size="large">
- <ButtonText style={{color: 'white'}}>
+ size="large"
+ color="primary">
+ <ButtonText>
<Trans>Sign in</Trans>
</ButtonText>
</Button>

View File

@@ -1,14 +0,0 @@
--- a/src/view/com/auth/SplashScreen.tsx 2026-02-16 02:55:08
+++ b/src/view/com/auth/SplashScreen.tsx 2026-02-16 02:55:16
@@ -118,8 +118,9 @@
accessibilityHint={_(
msg`Opens flow to sign in to your existing Bluesky account`,
)}
- size="large">
- <ButtonText style={{color: 'white'}}>
+ size="large"
+ color="primary">
+ <ButtonText>
<Trans>Sign in</Trans>
</ButtonText>
</Button>

View File

@@ -1,18 +0,0 @@
--- a/src/screens/Profile/Header/ProfileHeaderStandard.tsx
+++ b/src/screens/Profile/Header/ProfileHeaderStandard.tsx
@@ -48,6 +48,7 @@
import {ProfileHeaderHandle} from './Handle'
import {ProfileHeaderMetrics} from './Metrics'
import {ProfileHeaderShell} from './Shell'
+import {ProfileAtLinks} from './ProfileAtLinks'
import {ProfileHeaderSuggestedFollows} from './SuggestedFollows'
const SERVICE_FAVICONS: Record<string, any> = {
@@ -253,6 +254,7 @@
<View style={a.gap_md}>
<ProfileHeaderMetrics profile={profile} />
<ProfileServiceLinks profile={profile} />
+ <ProfileAtLinks profile={profile} />
{descriptionRT && !moderation.ui('profileView').blur ? (
<View pointerEvents="auto">
<RichText

View File

@@ -1,19 +0,0 @@
--- a/src/view/shell/desktop/RightNav.tsx
+++ b/src/view/shell/desktop/RightNav.tsx
@@ -111,14 +111,14 @@
</>
)}
<InlineLinkText
- to="https://bsky.social/about/support/privacy-policy"
+ to="/support/privacy-policy"
style={[t.atoms.text_contrast_medium]}
label={_(msg`Privacy`)}>
{_(msg`Privacy`)}
</InlineLinkText>
<Text style={[t.atoms.text_contrast_low]}>{' ∙ '}</Text>
<InlineLinkText
- to="https://bsky.social/about/support/tos"
+ to="/support/tos"
style={[t.atoms.text_contrast_medium]}
label={_(msg`Terms`)}>
{_(msg`Terms`)}

17
ios/patching/Logo.tsx Normal file
View File

@@ -0,0 +1,17 @@
import {forwardRef} from 'react'
import {Image} from 'expo-image'
import {flatten} from '#/alf'
export const Logo = forwardRef(function LogoImpl(props: any, ref) {
const {width, style} = props
// @ts-ignore
const size = parseInt(width || 32, 10)
return (
<Image
source={require('../../../assets/logo.png')}
style={[{width: size, height: size}, flatten(style)]}
contentFit="contain"
accessibilityLabel="Logo"
/>
)
})

22
ios/patching/Logotype.tsx Normal file
View File

@@ -0,0 +1,22 @@
import React from 'react'
import {Text} from 'react-native'
import {useTheme, atoms as a} from '#/alf'
export function Logotype({width, fill, style}: any) {
const t = useTheme()
const fontSize = width ? parseInt(width) / 3.5 : 22
return (
<Text style={[
a.font_bold,
{
fontSize,
color: fill || t.palette.primary_500,
letterSpacing: -0.5
},
style
]}>
Aiat
</Text>
)
}

View File

@@ -0,0 +1,50 @@
import {useCallback} 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 PrivacyPolicyScreen() {
useSetTitle('Privacy Policy')
const t = useTheme()
return (
<Layout.Screen>
<ScrollView
style={[a.flex_1, {backgroundColor: t.palette.white}]}
contentContainerStyle={[a.p_lg, a.pt_5xl, a.pb_5xl]}>
<Text style={[a.text_2xl, a.font_bold, a.mb_lg]}>Privacy Policy</Text>
<Text style={[a.text_lg, a.font_bold, a.mt_lg, a.mb_md]}>Data Collection</Text>
<Text style={[a.mb_md]}>
syu.is collects minimal data necessary to provide the service. This includes your account information, posts, and interactions on the AT Protocol network.
</Text>
<Text style={[a.text_lg, a.font_bold, a.mt_lg, a.mb_md]}>Data Storage</Text>
<Text style={[a.mb_md]}>
Your data is stored on the AT Protocol network. Posts and profile information are public by default as part of the decentralized social network.
</Text>
<Text style={[a.text_lg, a.font_bold, a.mt_lg, a.mb_md]}>Third Parties</Text>
<Text style={[a.mb_md]}>
We do not sell your personal information to third parties. Your data may be visible to other users and services on the AT Protocol network.
</Text>
<Text style={[a.text_lg, a.font_bold, a.mt_lg, a.mb_md]}>Contact</Text>
<Text style={[a.mb_md]}>
For privacy-related questions, please contact the administrator.
</Text>
<Text style={[a.text_lg, a.font_bold, a.mt_xl, a.mb_md]}></Text>
<Text style={[a.mb_md]}>
syu.isはサービス提供に必要な最小限のデータのみを収集します稿AT Protocolネットワーク上で公開されます
</Text>
<Text style={[a.text_sm, a.mt_xl, {color: t.palette.contrast_500}]}>
Last updated: 2026
</Text>
</ScrollView>
</Layout.Screen>
)
}

View File

@@ -0,0 +1,50 @@
import {useCallback} 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 TermsOfServiceScreen() {
useSetTitle('Terms of Service')
const t = useTheme()
return (
<Layout.Screen>
<ScrollView
style={[a.flex_1, {backgroundColor: t.palette.white}]}
contentContainerStyle={[a.p_lg, a.pt_5xl, a.pb_5xl]}>
<Text style={[a.text_2xl, a.font_bold, a.mb_lg]}>Terms of Service</Text>
<Text style={[a.text_lg, a.font_bold, a.mt_lg, a.mb_md]}>Acceptance</Text>
<Text style={[a.mb_md]}>
By using syu.is, you agree to these terms. If you do not agree, please do not use the service.
</Text>
<Text style={[a.text_lg, a.font_bold, a.mt_lg, a.mb_md]}>Prohibited Content</Text>
<Text style={[a.mb_md]}>
Do not post illegal content, spam, or harass others. Do not impersonate others or spread misinformation.
</Text>
<Text style={[a.text_lg, a.font_bold, a.mt_lg, a.mb_md]}>Account Termination</Text>
<Text style={[a.mb_md]}>
The administrator reserves the right to suspend or terminate accounts that violate these terms.
</Text>
<Text style={[a.text_lg, a.font_bold, a.mt_lg, a.mb_md]}>Disclaimer</Text>
<Text style={[a.mb_md]}>
This service is provided "as is" without warranty of any kind.
</Text>
<Text style={[a.text_lg, a.font_bold, a.mt_xl, a.mb_md]}></Text>
<Text style={[a.mb_md]}>
syu.isを利用することで稿
</Text>
<Text style={[a.text_sm, a.mt_xl, {color: t.palette.contrast_500}]}>
Last updated: 2026
</Text>
</ScrollView>
</Layout.Screen>
)
}

View File

@@ -22,9 +22,9 @@ typeset -a PATCH_FILES_IOS
PATCH_FILES_IOS=(
"001-social-app-ios-config.patch"
"002-social-app-ios-lib.patch"
"003-social-app-ios-view.patch"
"003-social-app-ios-view.patch" # Splash + UserAvatar (Logo/Logotype → copy)
"004-social-app-ios-core.patch"
"005-social-app-ios-screens.patch"
"005-social-app-ios-screens.patch" # AboutSettings + Takendown + RightNav (PrivacyPolicy/TOS → copy)
"006-social-app-ios-shell.patch"
"007-social-app-ios-misc.patch"
"009-social-app-ios-license.patch"
@@ -33,25 +33,19 @@ PATCH_FILES_IOS=(
"013-social-app-ios-settings-remove-help.patch"
"019-social-app-ios-entitlements-plugin.patch"
"020-social-app-ios-bypass-age-assurance.patch"
"021-social-app-ios-clean-feed.patch"
"022-social-app-ios-bskyweb-support-pages.patch"
"021-social-app-ios-clean-feed.patch" # DiscoverFallback + Empty/End + PostFeed (merged 040)
"022-social-app-ios-bskyweb.patch" # bskyweb routes + templates (merged 025)
"023-social-app-ios-disable-dm.patch"
"024-social-app-ios-disable-external-services.patch"
"025-social-app-ios-bskyweb-title.patch"
"027-social-app-ios-remove-birthdate.patch"
"028-social-app-ios-remove-discover-feeds.patch"
"029-social-app-ios-remove-feeds-discover.patch"
"028-social-app-ios-remove-discover.patch" # Explore + Feeds (merged 029)
"032-social-app-ios-feed-loggedout.patch"
"033-social-app-ios-hide-profile-tabs.patch"
"036-social-app-ios-homeheader-loggedout.patch"
"037-social-app-ios-disable-contacts-nux.patch"
"038-social-app-ios-profile-services.patch"
"038-social-app-ios-profile-services.patch" # ProfileServiceLinks + ProfileAtLinks (merged 042)
"039-social-app-ios-hide-feed-controls.patch"
"040-social-app-ios-hide-composer-prompt.patch"
"041-social-app-ios-splash-signin-button.patch"
"042-social-app-ios-at-links.patch"
"043-social-app-ios-rightnav-links.patch"
"044-social-app-ios-splash-video.patch"
"041-social-app-ios-splash-custom.patch" # signin-button + splash-video (merged 044)
"045-social-app-ios-composer-cancel.patch"
"046-social-app-ios-null-url-guards.patch"
)
@@ -218,6 +212,24 @@ function ios-copy-new-files() {
echo "✅ Copied ProfileAtLinks.tsx"
fi
# Copy full-replacement files (upstream-proof: not affected by import changes)
if [ -f "$patching_dir/Logo.tsx" ]; then
cp "$patching_dir/Logo.tsx" "$target_dir/src/view/icons/Logo.tsx"
echo "✅ Copied Logo.tsx"
fi
if [ -f "$patching_dir/Logotype.tsx" ]; then
cp "$patching_dir/Logotype.tsx" "$target_dir/src/view/icons/Logotype.tsx"
echo "✅ Copied Logotype.tsx"
fi
if [ -f "$patching_dir/PrivacyPolicy.tsx" ]; then
cp "$patching_dir/PrivacyPolicy.tsx" "$target_dir/src/view/screens/PrivacyPolicy.tsx"
echo "✅ Copied PrivacyPolicy.tsx"
fi
if [ -f "$patching_dir/TermsOfService.tsx" ]; then
cp "$patching_dir/TermsOfService.tsx" "$target_dir/src/view/screens/TermsOfService.tsx"
echo "✅ Copied TermsOfService.tsx"
fi
# Copy pre-generated favicons for bskyweb
local favicon_src="$d/ios/assets/favicons"
local bskyweb_static="$target_dir/bskyweb/static"