aboutsummaryrefslogtreecommitdiff
path: root/apps/web/components/new/utils.ts
diff options
context:
space:
mode:
Diffstat (limited to 'apps/web/components/new/utils.ts')
-rw-r--r--apps/web/components/new/utils.ts78
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\./, "")
+ }
+}