fix social-app service link pds
This commit is contained in:
BIN
ios/assets/splash/illustration-mobile.mp4
Normal file
BIN
ios/assets/splash/illustration-mobile.mp4
Normal file
Binary file not shown.
@@ -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<string> {
|
||||
+ 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 && (
|
||||
<View style={a.gap_md}>
|
||||
<ProfileHeaderMetrics profile={profile} />
|
||||
|
||||
60
ios/patching/044-social-app-ios-splash-video.patch
Normal file
60
ios/patching/044-social-app-ios-splash-video.patch
Normal file
@@ -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 (
|
||||
<>
|
||||
- <Image
|
||||
- accessibilityIgnoresInvertColors
|
||||
- source={{uri: isDarkMode ? darkSplashImageUri : splashImageUri}}
|
||||
- style={[a.absolute, a.inset_0]}
|
||||
- />
|
||||
+ {isDarkMode ? (
|
||||
+ <Image
|
||||
+ accessibilityIgnoresInvertColors
|
||||
+ source={{uri: darkSplashImageUri}}
|
||||
+ style={[a.absolute, a.inset_0]}
|
||||
+ />
|
||||
+ ) : (
|
||||
+ <VideoView
|
||||
+ player={player}
|
||||
+ style={[a.absolute, a.inset_0]}
|
||||
+ contentFit="cover"
|
||||
+ nativeControls={false}
|
||||
+ allowsFullscreen={false}
|
||||
+ allowsPictureInPicture={false}
|
||||
+ />
|
||||
+ )}
|
||||
|
||||
<Animated.View
|
||||
entering={FadeIn.duration(90)}
|
||||
@@ -3,7 +3,6 @@ import {Pressable, View} from 'react-native'
|
||||
import {type AppBskyActorDefs} from '@atproto/api'
|
||||
import {useQuery} from '@tanstack/react-query'
|
||||
|
||||
import {BSKY_SERVICE} from '#/lib/constants'
|
||||
import {useOpenLink} from '#/lib/hooks/useOpenLink'
|
||||
import {atoms as a, useTheme} from '#/alf'
|
||||
import {Text} from '#/components/Typography'
|
||||
@@ -66,6 +65,26 @@ const SERVICE_CONFIG: Record<
|
||||
},
|
||||
}
|
||||
|
||||
// --- PDS Resolution ---
|
||||
|
||||
async function resolvePds(did: string): Promise<string> {
|
||||
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()
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user