Restore link in Go Live prompt if status record present (#10636)
Co-authored-by: Eric Bailey <git@esb.lol>
This commit is contained in:
@@ -1,10 +1,6 @@
|
|||||||
import {useMemo, useState} from 'react'
|
import {useMemo, useState} from 'react'
|
||||||
import {View} from 'react-native'
|
import {View} from 'react-native'
|
||||||
import {
|
import {type AppBskyActorDefs, type AppBskyEmbedExternal} from '@atproto/api'
|
||||||
type AppBskyActorDefs,
|
|
||||||
AppBskyActorStatus,
|
|
||||||
type AppBskyEmbedExternal,
|
|
||||||
} from '@atproto/api'
|
|
||||||
import {msg} from '@lingui/core/macro'
|
import {msg} from '@lingui/core/macro'
|
||||||
import {useLingui} from '@lingui/react'
|
import {useLingui} from '@lingui/react'
|
||||||
import {Trans} from '@lingui/react/macro'
|
import {Trans} from '@lingui/react/macro'
|
||||||
@@ -24,6 +20,7 @@ import {Loader} from '#/components/Loader'
|
|||||||
import {Text} from '#/components/Typography'
|
import {Text} from '#/components/Typography'
|
||||||
import {
|
import {
|
||||||
displayDuration,
|
displayDuration,
|
||||||
|
getValidLiveStatusRecord,
|
||||||
useLiveLinkMetaQuery,
|
useLiveLinkMetaQuery,
|
||||||
useRemoveLiveStatusMutation,
|
useRemoveLiveStatusMutation,
|
||||||
useUpsertLiveStatusMutation,
|
useUpsertLiveStatusMutation,
|
||||||
@@ -74,14 +71,10 @@ function DialogInner({
|
|||||||
error: linkMetaError,
|
error: linkMetaError,
|
||||||
} = useLiveLinkMetaQuery(debouncedUrl)
|
} = useLiveLinkMetaQuery(debouncedUrl)
|
||||||
|
|
||||||
const record = useMemo(() => {
|
const record = useMemo(
|
||||||
if (!AppBskyActorStatus.isRecord(status.record)) return null
|
() => getValidLiveStatusRecord(status.record),
|
||||||
const validation = AppBskyActorStatus.validateRecord(status.record)
|
[status],
|
||||||
if (validation.success) {
|
)
|
||||||
return validation.value
|
|
||||||
}
|
|
||||||
return null
|
|
||||||
}, [status])
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
mutate: goLive,
|
mutate: goLive,
|
||||||
|
|||||||
@@ -20,7 +20,9 @@ import * as Select from '#/components/Select'
|
|||||||
import {Text} from '#/components/Typography'
|
import {Text} from '#/components/Typography'
|
||||||
import {
|
import {
|
||||||
displayDuration,
|
displayDuration,
|
||||||
|
getLiveLinkFromStatusRecord,
|
||||||
getLiveServiceNames,
|
getLiveServiceNames,
|
||||||
|
useActorStatus,
|
||||||
useLiveLinkMetaQuery,
|
useLiveLinkMetaQuery,
|
||||||
useLiveNowConfig,
|
useLiveNowConfig,
|
||||||
useUpsertLiveStatusMutation,
|
useUpsertLiveStatusMutation,
|
||||||
@@ -50,16 +52,20 @@ function DialogInner({profile}: {profile: bsky.profile.AnyProfileView}) {
|
|||||||
const control = Dialog.useDialogContext()
|
const control = Dialog.useDialogContext()
|
||||||
const {_, i18n} = useLingui()
|
const {_, i18n} = useLingui()
|
||||||
const t = useTheme()
|
const t = useTheme()
|
||||||
const [liveLink, setLiveLink] = useState('')
|
|
||||||
const [liveLinkError, setLiveLinkError] = useState('')
|
const [liveLinkError, setLiveLinkError] = useState('')
|
||||||
const [duration, setDuration] = useState(60)
|
const [duration, setDuration] = useState(60)
|
||||||
const moderationOpts = useModerationOpts()
|
const moderationOpts = useModerationOpts()
|
||||||
const tick = useTickEveryMinute()
|
const tick = useTickEveryMinute()
|
||||||
const liveNowConfig = useLiveNowConfig()
|
const liveNowConfig = useLiveNowConfig()
|
||||||
|
const status = useActorStatus(profile)
|
||||||
const {formatted: allowedServices} = getLiveServiceNames(
|
const {formatted: allowedServices} = getLiveServiceNames(
|
||||||
liveNowConfig.currentAccountAllowedHosts,
|
liveNowConfig.currentAccountAllowedHosts,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const [liveLink, setLiveLink] = useState(() =>
|
||||||
|
getLiveLinkFromStatusRecord(status.record),
|
||||||
|
)
|
||||||
|
|
||||||
const time = useCallback(
|
const time = useCallback(
|
||||||
(offset: number) => {
|
(offset: number) => {
|
||||||
void tick
|
void tick
|
||||||
|
|||||||
@@ -1,7 +1,32 @@
|
|||||||
|
import {AppBskyActorStatus, AppBskyEmbedExternal} from '@atproto/api'
|
||||||
import {type I18n} from '@lingui/core'
|
import {type I18n} from '@lingui/core'
|
||||||
import {plural} from '@lingui/core/macro'
|
import {plural} from '@lingui/core/macro'
|
||||||
import psl from 'psl'
|
import psl from 'psl'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates a raw status record and returns the typed record, or null if the
|
||||||
|
* value is not a valid `app.bsky.actor.status` record.
|
||||||
|
*/
|
||||||
|
export function getValidLiveStatusRecord(
|
||||||
|
statusRecord: unknown,
|
||||||
|
): AppBskyActorStatus.Record | null {
|
||||||
|
if (!AppBskyActorStatus.isRecord(statusRecord)) return null
|
||||||
|
const validation = AppBskyActorStatus.validateRecord(statusRecord)
|
||||||
|
if (!validation.success) return null
|
||||||
|
return validation.value
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extracts the external link URI from a status record, if present. Returns an
|
||||||
|
* empty string when the record is invalid or has no external embed.
|
||||||
|
*/
|
||||||
|
export function getLiveLinkFromStatusRecord(statusRecord: unknown): string {
|
||||||
|
const record = getValidLiveStatusRecord(statusRecord)
|
||||||
|
if (!record) return ''
|
||||||
|
if (!AppBskyEmbedExternal.isMain(record.embed)) return ''
|
||||||
|
return record.embed.external.uri
|
||||||
|
}
|
||||||
|
|
||||||
export function displayDuration(i18n: I18n, durationInMinutes: number) {
|
export function displayDuration(i18n: I18n, durationInMinutes: number) {
|
||||||
const roundedDurationInMinutes = Math.round(durationInMinutes)
|
const roundedDurationInMinutes = Math.round(durationInMinutes)
|
||||||
const hours = Math.floor(roundedDurationInMinutes / 60)
|
const hours = Math.floor(roundedDurationInMinutes / 60)
|
||||||
|
|||||||
Reference in New Issue
Block a user