diff --git a/src/components/ModerationServiceCard.tsx b/src/components/ModerationServiceCard.tsx
new file mode 100644
index 0000000000..07865a6846
--- /dev/null
+++ b/src/components/ModerationServiceCard.tsx
@@ -0,0 +1,133 @@
+import React from 'react'
+import {View} from 'react-native'
+import {msg, Trans} from '@lingui/macro'
+import {useLingui} from '@lingui/react'
+import LinearGradient from 'react-native-linear-gradient'
+import {AppBskyModerationDefs} from '@atproto/api'
+
+import {atoms as a, useTheme, tokens, web} from '#/alf'
+import {Link, useLinkContext} from '#/components/Link'
+import {Text} from '#/components/Typography'
+import {RichText} from '#/components/RichText'
+import {RaisingHande4Finger_Stroke2_Corner0_Rounded as RaisingHand} from '#/components/icons/RaisingHand'
+import {useModServiceInfoQuery} from '#/state/queries/modservice'
+
+type ModerationServiceCardProps = {
+ modservice: AppBskyModerationDefs.ModServiceViewDetailed
+}
+
+export function ModerationServiceCard({
+ modservice,
+}: ModerationServiceCardProps) {
+ const {_} = useLingui()
+
+ return (
+
+
+
+ )
+}
+
+function Inner({modservice}: ModerationServiceCardProps) {
+ const t = useTheme()
+ const {hovered, pressed, focused} = useLinkContext()
+
+ return (
+
+ c[1])}
+ locations={tokens.gradients.midnight.values.map(c => c[0])}
+ start={{x: 0, y: 0}}
+ end={{x: 1, y: 1}}
+ style={[a.absolute, a.inset_0]}
+ />
+
+
+
+ {/* TODO */}
+ {modservice.displayName || 'Mod service'}
+
+
+ {modservice.description ? (
+
+ ) : (
+
+
+ Moderation service managed by @{modservice.creator.handle}
+
+
+ )}
+
+
+
+
+ )
+}
+
+export function ModerationServiceCardSkeleton() {
+ return (
+
+ Loading
+
+ )
+}
+
+export function Loader({
+ did,
+ loading: LoadingComponent = ModerationServiceCardSkeleton,
+ error: ErrorComponent,
+ component: Component,
+}: {
+ did: string
+ loading?: React.ComponentType<{}>
+ error?: React.ComponentType<{error: string}>
+ component: React.ComponentType<{
+ modservice: AppBskyModerationDefs.ModServiceViewDetailed
+ }>
+}) {
+ const {isLoading, data, error} = useModServiceInfoQuery({did})
+
+ return isLoading ? (
+ LoadingComponent ? (
+
+ ) : null
+ ) : error || !data ? (
+ ErrorComponent ? (
+
+ ) : null
+ ) : (
+
+ )
+}
diff --git a/src/view/com/profile/ProfileHeader.tsx b/src/view/com/profile/ProfileHeader.tsx
index 12e71b607b..34160ec977 100644
--- a/src/view/com/profile/ProfileHeader.tsx
+++ b/src/view/com/profile/ProfileHeader.tsx
@@ -27,7 +27,6 @@ import {RichText} from '../util/text/RichText'
import {UserAvatar} from '../util/UserAvatar'
import {UserBanner} from '../util/UserBanner'
import {ProfileHeaderAlerts} from '../util/moderation/ProfileHeaderAlerts'
-import {ProfileHeaderModCard} from './ProfileHeaderModCard'
import {formatCount} from '../util/numeric/format'
import {NativeDropdown, DropdownItem} from '../util/forms/NativeDropdown'
import {Link} from '../util/Link'
@@ -57,6 +56,10 @@ import {Shadow} from '#/state/cache/types'
import {useRequireAuth} from '#/state/session'
import {LabelInfo} from '../util/moderation/LabelInfo'
import {useProfileShadow} from 'state/cache/profile-shadow'
+import {
+ Loader as ModServiceLoader,
+ ModerationServiceCard,
+} from '#/components/ModerationServiceCard'
let ProfileHeaderLoading = (_props: {}): React.ReactNode => {
const pal = usePalette('default')
@@ -624,7 +627,8 @@ let ProfileHeader = ({
{isMe && (
)}
-
+
+
{showSuggestedFollows && (
diff --git a/src/view/com/profile/ProfileHeaderModCard.tsx b/src/view/com/profile/ProfileHeaderModCard.tsx
deleted file mode 100644
index df14ec06e8..0000000000
--- a/src/view/com/profile/ProfileHeaderModCard.tsx
+++ /dev/null
@@ -1,73 +0,0 @@
-import React from 'react'
-import {View} from 'react-native'
-import {msg, Trans} from '@lingui/macro'
-import {useLingui} from '@lingui/react'
-import LinearGradient from 'react-native-linear-gradient'
-
-import {atoms as a, useTheme, tokens, web} from '#/alf'
-import {Link, useLinkContext} from '#/components/Link'
-import {Text} from '#/components/Typography'
-import {RichText} from '#/components/RichText'
-import {RaisingHande4Finger_Stroke2_Corner0_Rounded as RaisingHand} from '#/components/icons/RaisingHand'
-
-export function ProfileHeaderModCard() {
- const {_} = useLingui()
-
- return (
-
-
-
- )
-}
-
-function Inner() {
- const t = useTheme()
- const {hovered, pressed, focused} = useLinkContext()
-
- return (
-
- c[1])}
- locations={tokens.gradients.bonfire.values.map(c => c[0])}
- start={{x: 0, y: 0}}
- end={{x: 1, y: 1}}
- style={[a.absolute, a.inset_0]}
- />
-
-
-
- Moderation service
-
-
-
-
-
-
-
- )
-}