Files
llink/js/desktop/src/hooks/use-link-metadata.ts
T
Arjun PatelandGitHub a8a0b7db1b infra: add linting and formatting for js projects (#230)
* wip

* wip

* wip

* format

* wip(mobile): lint and format

* cleanup

* nits

* nits

* idiomatic react

* nit

* format all root files
2026-06-02 07:44:24 -07:00

46 lines
1.2 KiB
TypeScript

import { useQueries, useQuery, skipToken } from '@tanstack/react-query';
import { extractUrls, type LinkMetadata } from '@/lib/link-metadata';
import { platform } from '@/lib/platform';
export function useLinkMetadata(url: string | null) {
return useQuery<LinkMetadata | null>({
queryKey: ['link-metadata', url],
queryFn: url ? () => platform.link.fetchMetadata(url) : skipToken,
staleTime: Infinity,
gcTime: 30 * 60 * 1000,
retry: 1,
});
}
export function useFirstLinkMetadata(text: string) {
const urls = extractUrls(text);
const firstUrl = urls[0] ?? null;
return { ...useLinkMetadata(firstUrl), url: firstUrl };
}
export interface LinkPreviewEntry {
url: string;
metadata: LinkMetadata | null | undefined;
isLoading: boolean;
}
export function useAllLinkMetadata(text: string): LinkPreviewEntry[] {
const urls = extractUrls(text);
const results = useQueries({
queries: urls.map((url) => ({
queryKey: ['link-metadata', url],
queryFn: () => platform.link.fetchMetadata(url),
staleTime: Infinity,
gcTime: 30 * 60 * 1000,
retry: 1,
})),
});
return urls.map((url, i) => ({
url,
metadata: results[i].data,
isLoading: results[i].isLoading,
}));
}