import {useMemo} from 'react' import { type $Typed, type AppBskyActorDefs, type AppBskyEmbedExternal, } from '@atproto/api' import {isAfter, parseISO} from 'date-fns' import {useMaybeProfileShadow} from '#/state/cache/profile-shadow' import {useTickEveryMinute} from '#/state/shell' import {temp__canBeLive, temp__isStatusValid} from '#/components/live/temp' import type * as bsky from '#/types/bsky' export function useActorStatus(actor?: bsky.profile.AnyProfileView) { const shadowed = useMaybeProfileShadow(actor) const tick = useTickEveryMinute() return useMemo(() => { tick! // revalidate every minute if ( shadowed && temp__canBeLive(shadowed) && 'status' in shadowed && shadowed.status && temp__isStatusValid(shadowed.status) && isStatusStillActive(shadowed.status.expiresAt) ) { return { isActive: true, status: 'app.bsky.actor.status#live', embed: shadowed.status.embed as $Typed, // temp_isStatusValid asserts this expiresAt: shadowed.status.expiresAt!, // isStatusStillActive asserts this record: shadowed.status.record, } satisfies AppBskyActorDefs.StatusView } else { return { status: '', isActive: false, record: {}, } satisfies AppBskyActorDefs.StatusView } }, [shadowed, tick]) } export function isStatusStillActive(timeStr: string | undefined) { if (!timeStr) return false const now = new Date() const expiry = parseISO(timeStr) return isAfter(expiry, now) }