From 883f49b915df0db3ce1ac01bf889e8ae95e2f594 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Fri, 13 Feb 2026 11:09:30 -0600 Subject: [PATCH] Move utils into new dir --- src/components/live/EditLiveDialog.tsx | 2 +- src/components/live/GoLiveDialog.tsx | 12 ++++++------ src/components/live/queries.ts | 3 +-- src/features/liveNow/index.tsx | 2 ++ .../live => features/liveNow}/utils.ts | 0 src/lib/hooks/useDebouncedValue.ts | 16 ++++++++++++++++ src/state/queries/handle-availability.ts | 2 +- 7 files changed, 27 insertions(+), 10 deletions(-) rename src/{components/live => features/liveNow}/utils.ts (100%) create mode 100644 src/lib/hooks/useDebouncedValue.ts diff --git a/src/components/live/EditLiveDialog.tsx b/src/components/live/EditLiveDialog.tsx index 585e95bba1..7f42e2ca1c 100644 --- a/src/components/live/EditLiveDialog.tsx +++ b/src/components/live/EditLiveDialog.tsx @@ -20,13 +20,13 @@ import * as TextField from '#/components/forms/TextField' import {Clock_Stroke2_Corner0_Rounded as ClockIcon} from '#/components/icons/Clock' import {Loader} from '#/components/Loader' import {Text} from '#/components/Typography' +import {displayDuration, useDebouncedValue} from '#/features/liveNow' import {LinkPreview} from './LinkPreview' import { useLiveLinkMetaQuery, useRemoveLiveStatusMutation, useUpsertLiveStatusMutation, } from './queries' -import {displayDuration, useDebouncedValue} from './utils' export function EditLiveDialog({ control, diff --git a/src/components/live/GoLiveDialog.tsx b/src/components/live/GoLiveDialog.tsx index 70954e3431..eb5276a7ab 100644 --- a/src/components/live/GoLiveDialog.tsx +++ b/src/components/live/GoLiveDialog.tsx @@ -12,16 +12,16 @@ import {Admonition} from '#/components/Admonition' import {Button, ButtonIcon, ButtonText} from '#/components/Button' import * as Dialog from '#/components/Dialog' import * as TextField from '#/components/forms/TextField' -import { - displayDuration, - getLiveServiceNames, - useDebouncedValue, -} from '#/components/live/utils' import {Loader} from '#/components/Loader' import * as ProfileCard from '#/components/ProfileCard' import * as Select from '#/components/Select' import {Text} from '#/components/Typography' -import {useLiveNowConfig} from '#/features/liveNow' +import { + displayDuration, + getLiveServiceNames, + useDebouncedValue, + useLiveNowConfig, +} from '#/features/liveNow' import type * as bsky from '#/types/bsky' import {LinkPreview} from './LinkPreview' import {useLiveLinkMetaQuery, useUpsertLiveStatusMutation} from './queries' diff --git a/src/components/live/queries.ts b/src/components/live/queries.ts index c03bdb6dc8..735c1a5211 100644 --- a/src/components/live/queries.ts +++ b/src/components/live/queries.ts @@ -16,9 +16,8 @@ import {updateProfileShadow} from '#/state/cache/profile-shadow' import {useAgent, useSession} from '#/state/session' import * as Toast from '#/view/com/util/Toast' import {useDialogContext} from '#/components/Dialog' -import {getLiveServiceNames} from '#/components/live/utils' import {useAnalytics} from '#/analytics' -import {useLiveNowConfig} from '#/features/liveNow' +import {getLiveServiceNames, useLiveNowConfig} from '#/features/liveNow' export function useLiveLinkMetaQuery(url: string | null) { const liveNowConfig = useLiveNowConfig() diff --git a/src/features/liveNow/index.tsx b/src/features/liveNow/index.tsx index cc36009c02..c6106a4bb1 100644 --- a/src/features/liveNow/index.tsx +++ b/src/features/liveNow/index.tsx @@ -14,6 +14,8 @@ import {useTickEveryMinute} from '#/state/shell' import {useAnalytics} from '#/analytics' import type * as bsky from '#/types/bsky' +export * from '#/features/liveNow/utils' + export const DEFAULT_ALLOWED_DOMAINS = [ 'twitch.tv', 'stream.place', diff --git a/src/components/live/utils.ts b/src/features/liveNow/utils.ts similarity index 100% rename from src/components/live/utils.ts rename to src/features/liveNow/utils.ts diff --git a/src/lib/hooks/useDebouncedValue.ts b/src/lib/hooks/useDebouncedValue.ts new file mode 100644 index 0000000000..c8e083b9b3 --- /dev/null +++ b/src/lib/hooks/useDebouncedValue.ts @@ -0,0 +1,16 @@ +import {useEffect, useState} from 'react' + +/** + * Returns a debounced version of the input value that only updates after the + * specified delay has passed without any changes to the input value. + */ +export function useDebouncedValue(val: T, delayMs: number): T { + const [prev, setPrev] = useState(val) + + useEffect(() => { + const timeout = setTimeout(() => setPrev(val), delayMs) + return () => clearTimeout(timeout) + }, [val, delayMs]) + + return prev +} diff --git a/src/state/queries/handle-availability.ts b/src/state/queries/handle-availability.ts index e3f7a6b741..fb25697c76 100644 --- a/src/state/queries/handle-availability.ts +++ b/src/state/queries/handle-availability.ts @@ -6,8 +6,8 @@ import { BSKY_SERVICE_DID, PUBLIC_BSKY_SERVICE, } from '#/lib/constants' +import {useDebouncedValue} from '#/lib/hooks/useDebouncedValue' import {createFullHandle} from '#/lib/strings/handles' -import {useDebouncedValue} from '#/components/live/utils' import {useAnalytics} from '#/analytics' import * as bsky from '#/types/bsky' import {Agent} from '../session/agent'