From 6f5058d474791a8b94b3ab6361c7a618cca42ad1 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 13 Feb 2024 11:44:44 -0600 Subject: [PATCH] Abstract ModerationServiceCard --- src/components/ModerationServiceCard.tsx | 133 ++++++++++++++++++ src/view/com/profile/ProfileHeader.tsx | 8 +- src/view/com/profile/ProfileHeaderModCard.tsx | 73 ---------- 3 files changed, 139 insertions(+), 75 deletions(-) create mode 100644 src/components/ModerationServiceCard.tsx delete mode 100644 src/view/com/profile/ProfileHeaderModCard.tsx 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 - - - - - - - - ) -}