[APP-1775] Handle labels on actor statuses (#9716)

This commit is contained in:
Eric Bailey
2026-04-09 15:52:45 -05:00
committed by GitHub
parent d01362a01e
commit 8c9a11dc3f
4 changed files with 167 additions and 53 deletions
+24 -7
View File
@@ -6,6 +6,7 @@ import {
AppBskyEmbedExternal,
AtUri,
ComAtprotoRepoPutRecord,
moderateStatus,
} from '@atproto/api'
import {retry} from '@atproto/common-web'
import {msg} from '@lingui/core/macro'
@@ -21,6 +22,7 @@ import {
updateProfileShadow,
useMaybeProfileShadow,
} from '#/state/cache/profile-shadow'
import {useModerationOpts} from '#/state/preferences/moderation-opts'
import {useAgent, useSession} from '#/state/session'
import {useTickEveryMinute} from '#/state/shell'
import {useDialogContext} from '#/components/Dialog'
@@ -37,6 +39,13 @@ export const DEFAULT_ALLOWED_DOMAINS = [
'bluecast.app',
]
const DEFAULT_STATE = {
status: '',
isDisabled: false,
isActive: false,
record: {},
} satisfies AppBskyActorDefs.StatusView
export type LiveNowConfig = {
canGoLive: boolean
currentAccountAllowedHosts: Set<string>
@@ -87,10 +96,23 @@ export function useActorStatus(actor?: bsky.profile.AnyProfileView) {
const shadowed = useMaybeProfileShadow(actor)
const tick = useTickEveryMinute()
const config = useLiveNowConfig()
const moderationOpts = useModerationOpts()
const moderation = useMemo(() => {
if (!actor || !('status' in actor && actor.status)) return undefined
return moderateStatus(actor, moderationOpts!)
}, [actor, moderationOpts])
return useMemo(() => {
void tick // revalidate every minute
/*
* Do not even allow Live Now to show if filtered for `contentList`.
*/
if (moderation && moderation.ui('contentList').filter) {
return DEFAULT_STATE
}
if (shadowed && 'status' in shadowed && shadowed.status) {
const isValid = isStatusValidForViewers(shadowed.status, config)
const isDisabled = shadowed.status.isDisabled || false
@@ -118,14 +140,9 @@ export function useActorStatus(actor?: bsky.profile.AnyProfileView) {
record: shadowed.status.record,
} satisfies AppBskyActorDefs.StatusView
} else {
return {
status: '',
isDisabled: false,
isActive: false,
record: {},
} satisfies AppBskyActorDefs.StatusView
return DEFAULT_STATE
}
}, [shadowed, config, tick])
}, [shadowed, config, tick, moderation])
}
export function isStatusStillActive(timeStr: string | undefined) {