fix ios patch refact
This commit is contained in:
@@ -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: {
|
||||
|
||||
@@ -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>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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`)}
|
||||
|
||||
@@ -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') {
|
||||
|
||||
@@ -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)
|
||||
@@ -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>
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
@@ -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',
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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
|
||||
@@ -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
17
ios/patching/Logo.tsx
Normal 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
22
ios/patching/Logotype.tsx
Normal 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>
|
||||
)
|
||||
}
|
||||
50
ios/patching/PrivacyPolicy.tsx
Normal file
50
ios/patching/PrivacyPolicy.tsx
Normal 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>
|
||||
)
|
||||
}
|
||||
50
ios/patching/TermsOfService.tsx
Normal file
50
ios/patching/TermsOfService.tsx
Normal 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>
|
||||
)
|
||||
}
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user