diff --git a/ios/assets/splash/illustration-mobile.mp4 b/ios/assets/splash/illustration-mobile.mp4 new file mode 100644 index 0000000..de848d3 Binary files /dev/null and b/ios/assets/splash/illustration-mobile.mp4 differ diff --git a/ios/patching/038-social-app-ios-profile-services.patch b/ios/patching/038-social-app-ios-profile-services.patch index 4867998..d9064ac 100644 --- a/ios/patching/038-social-app-ios-profile-services.patch +++ b/ios/patching/038-social-app-ios-profile-services.patch @@ -7,20 +7,19 @@ import { type AppBskyActorDefs, moderateProfile, -@@ -9,9 +9,12 @@ +@@ -9,9 +9,11 @@ } from '@atproto/api' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' +import {useQuery} from '@tanstack/react-query' import {useActorStatus} from '#/lib/actor-status' -+import {BSKY_SERVICE} from '#/lib/constants' import {useHaptics} from '#/lib/haptics' +import {useOpenLink} from '#/lib/hooks/useOpenLink' import {sanitizeDisplayName} from '#/lib/strings/display-names' import {sanitizeHandle} from '#/lib/strings/handles' import {logger} from '#/logger' -@@ -45,6 +48,84 @@ +@@ -45,6 +47,103 @@ import {ProfileHeaderMetrics} from './Metrics' import {ProfileHeaderShell} from './Shell' import {ProfileHeaderSuggestedFollows} from './SuggestedFollows' @@ -31,6 +30,24 @@ + 'atproto.com': require('../../../../assets/favicons/atproto.com.png'), +} + ++async function resolvePds(did: string): Promise { ++ if (did.startsWith('did:web:')) { ++ const host = did.split(':').slice(2).join(':') ++ const res = await fetch(`https://${host}/.well-known/did.json`) ++ if (!res.ok) throw new Error('failed to resolve did:web') ++ const doc = await res.json() ++ const pds = doc.service?.find((s: any) => s.id === '#atproto_pds')?.serviceEndpoint ++ if (pds) return pds ++ return `https://${host}` ++ } ++ const res = await fetch(`https://plc.directory/${did}`) ++ if (!res.ok) throw new Error('failed to resolve DID') ++ const doc = await res.json() ++ const pds = doc.service?.find((s: any) => s.id === '#atproto_pds')?.serviceEndpoint ++ if (!pds) throw new Error('no PDS found') ++ return pds ++} ++ +function ProfileServiceLinks({ + profile, +}: { @@ -42,8 +59,9 @@ + const {data: services} = useQuery({ + queryKey: ['profile-services', profile.did], + queryFn: async () => { ++ const pds = await resolvePds(profile.did) + const res = await fetch( -+ `${BSKY_SERVICE}/xrpc/com.atproto.repo.describeRepo?repo=${encodeURIComponent(profile.did)}`, ++ `${pds}/xrpc/com.atproto.repo.describeRepo?repo=${encodeURIComponent(profile.did)}`, + ) + if (!res.ok) throw new Error('failed') + const data = await res.json() @@ -105,7 +123,7 @@ interface Props { profile: AppBskyActorDefs.ProfileViewDetailed -@@ -151,6 +232,7 @@ +@@ -151,6 +250,7 @@ {!isPlaceholderProfile && !isBlockedUser && ( diff --git a/ios/patching/044-social-app-ios-splash-video.patch b/ios/patching/044-social-app-ios-splash-video.patch new file mode 100644 index 0000000..e68024d --- /dev/null +++ b/ios/patching/044-social-app-ios-splash-video.patch @@ -0,0 +1,60 @@ +--- a/src/view/com/auth/SplashScreen.tsx ++++ b/src/view/com/auth/SplashScreen.tsx +@@ -2,6 +2,7 @@ + import {Image as RNImage, View} from 'react-native' + import Animated, {FadeIn, FadeOut} from 'react-native-reanimated' + import {Image} from 'expo-image' ++import {useVideoPlayer, VideoView} from 'expo-video' + import {msg, Trans} from '@lingui/macro' + import {useLingui} from '@lingui/react' + +@@ -14,10 +15,13 @@ + import splashImagePointer from '../../../../assets/splash/illustration-mobile.png' + // @ts-ignore + import darkSplashImagePointer from '../../../../assets/splash/illustration-mobile-dark.png' ++// @ts-ignore ++import splashVideoPointer from '../../../../assets/splash/illustration-mobile.mp4' + const splashImageUri = RNImage.resolveAssetSource(splashImagePointer).uri + const darkSplashImageUri = RNImage.resolveAssetSource( + darkSplashImagePointer, + ).uri ++const splashVideoUri = RNImage.resolveAssetSource(splashVideoPointer).uri + + export const SplashScreen = ({ + onPressSignin, +@@ -52,13 +56,30 @@ + } + }, [t, isDarkMode]) + ++ const player = useVideoPlayer(splashVideoUri, p => { ++ p.loop = true ++ p.muted = true ++ p.play() ++ }) ++ + return ( + <> +- ++ {isDarkMode ? ( ++ ++ ) : ( ++ ++ )} + + { + if (did.startsWith('did:web:')) { + const host = did.split(':').slice(2).join(':') + const res = await fetch(`https://${host}/.well-known/did.json`) + if (!res.ok) throw new Error('failed to resolve did:web') + const doc = await res.json() + const pds = doc.service?.find((s: any) => s.id === '#atproto_pds')?.serviceEndpoint + if (pds) return pds + return `https://${host}` + } + const res = await fetch(`https://plc.directory/${did}`) + if (!res.ok) throw new Error('failed to resolve DID') + const doc = await res.json() + const pds = doc.service?.find((s: any) => s.id === '#atproto_pds')?.serviceEndpoint + if (!pds) throw new Error('no PDS found') + return pds +} + // --- Component --- export function ProfileAtLinks({ @@ -79,8 +98,9 @@ export function ProfileAtLinks({ const {data: linkData} = useQuery({ queryKey: ['at-links', profile.did], queryFn: async () => { + const pds = await resolvePds(profile.did) const res = await fetch( - `${BSKY_SERVICE}/xrpc/com.atproto.repo.getRecord?repo=${encodeURIComponent(profile.did)}&collection=ai.syui.at.link&rkey=self`, + `${pds}/xrpc/com.atproto.repo.getRecord?repo=${encodeURIComponent(profile.did)}&collection=ai.syui.at.link&rkey=self`, ) if (!res.ok) throw new Error('not found') const json = await res.json() diff --git a/ios/setup.zsh b/ios/setup.zsh index 324212d..4b01f7b 100755 --- a/ios/setup.zsh +++ b/ios/setup.zsh @@ -51,6 +51,7 @@ PATCH_FILES_IOS=( "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" ) function ios-env() { @@ -186,6 +187,12 @@ function ios-copy-new-files() { echo "✅ Copied AppInfo.tsx" fi + # Copy splash video + if [ -f "$d/ios/assets/splash/illustration-mobile.mp4" ]; then + cp "$d/ios/assets/splash/illustration-mobile.mp4" "$target_dir/assets/splash/illustration-mobile.mp4" + echo "✅ Copied splash video (illustration-mobile.mp4)" + fi + # Copy ProfileAtLinks.tsx if [ -f "$patching_dir/ProfileAtLinks.tsx" ]; then cp "$patching_dir/ProfileAtLinks.tsx" "$target_dir/src/screens/Profile/Header/ProfileAtLinks.tsx"