diff options
Diffstat (limited to 'apps/web/components/new/utils.ts')
| -rw-r--r-- | apps/web/components/new/utils.ts | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/apps/web/components/new/utils.ts b/apps/web/components/new/utils.ts new file mode 100644 index 00000000..b830a2a3 --- /dev/null +++ b/apps/web/components/new/utils.ts @@ -0,0 +1,78 @@ +"use client" + +import { useQuery } from "@tanstack/react-query" + +export function isYouTubeUrl(url: string | undefined | null): boolean { + if (!url) return false + return ( + url.includes("youtube.com") || + url.includes("youtu.be") || + url.includes("m.youtube.com") + ) +} + +export function extractYouTubeVideoId( + url: string | undefined | null, +): string | null { + if (!url) return null + + // Handle youtu.be format + const youtuBeMatch = url.match(/(?:youtu\.be\/)([a-zA-Z0-9_-]{11})/) + if (youtuBeMatch?.[1]) return youtuBeMatch[1] + + // Handle youtube.com/watch?v= format + const watchMatch = url.match(/(?:youtube\.com\/watch\?v=)([a-zA-Z0-9_-]{11})/) + if (watchMatch?.[1]) return watchMatch[1] + + // Handle youtube.com/embed/ format + const embedMatch = url.match(/(?:youtube\.com\/embed\/)([a-zA-Z0-9_-]{11})/) + if (embedMatch?.[1]) return embedMatch[1] + + // Handle m.youtube.com format + const mobileMatch = url.match( + /(?:m\.youtube\.com\/watch\?v=)([a-zA-Z0-9_-]{11})/, + ) + if (mobileMatch?.[1]) return mobileMatch[1] + + return null +} + +export function useYouTubeChannelName(url: string | undefined | null) { + const videoId = extractYouTubeVideoId(url) + const videoUrl = videoId + ? `https://www.youtube.com/watch?v=${videoId}` + : url || "" + + return useQuery({ + queryKey: ["youtube-channel", videoUrl], + queryFn: async () => { + if (!videoUrl) return null + + try { + const response = await fetch( + `https://www.youtube.com/oembed?url=${encodeURIComponent(videoUrl)}&format=json`, + ) + if (!response.ok) return null + const data = (await response.json()) as { author_name?: string } + return data.author_name || null + } catch { + return null + } + }, + enabled: !!videoUrl && isYouTubeUrl(url), + staleTime: 1000 * 60 * 60 * 24, + retry: 1, + }) +} + + +export function getAbsoluteUrl(url: string): string { + try { + const urlObj = new URL(url) + return urlObj.host.replace(/^www\./, "") + } catch { + const match = url.match(/^https?:\/\/([^\/]+)/) + const host = match?.[1] ?? url.replace(/^https?:\/\//, "") + return host.replace(/^www\./, "") + } +} |