ai-tube / src /app /main.tsx
jbilcke-hf's picture
jbilcke-hf HF staff
work on HF login
16891a6
raw
history blame
5.23 kB
"use client"
import { useStore } from "./state/useStore"
import { HomeView } from "./views/home-view"
import { PublicChannelsView } from "./views/public-channels-view"
import { PublicChannelView } from "./views/public-channel-view"
import { UserChannelView } from "./views/user-channel-view"
import { PublicVideoView } from "./views/public-video-view"
import { UserAccountView } from "./views/user-account-view"
import { NotFoundView } from "./views/not-found-view"
import { ChannelInfo, VideoInfo } from "@/types/general"
import { useEffect } from "react"
import { usePathname, useRouter } from "next/navigation"
import { TubeLayout } from "./interface/tube-layout"
import { PublicMusicVideosView } from "./views/public-music-videos-view"
import { getCollectionKey } from "@/lib/getCollectionKey"
import { PublicVideoEmbedView } from "./views/public-video-embed-view"
// this is where we transition from the server-side space
// and the client-side space
// basically, all the views are generated in client-side space
// so the role of Main is to map server-side provided params
// to the Zustand store (client-side)
//
// one benefit of doing this is that we will able to add some animations/transitions
// more easily
export function Main({
// view,
publicVideo,
publicVideos,
publicChannelVideos,
publicTracks,
publicTrack,
channel,
}: {
// server side params
// view?: InterfaceView
publicVideo?: VideoInfo
publicVideos?: VideoInfo[]
publicChannelVideos?: VideoInfo[]
publicTracks?: VideoInfo[]
publicTrack?: VideoInfo
channel?: ChannelInfo
}) {
// this could be also a parameter of main, where we pass this manually
const pathname = usePathname()
const router = useRouter()
const setPublicVideo = useStore(s => s.setPublicVideo)
const setView = useStore(s => s.setView)
const setPathname = useStore(s => s.setPathname)
const setPublicChannel = useStore(s => s.setPublicChannel)
const setPublicVideos = useStore(s => s.setPublicVideos)
const setPublicChannelVideos = useStore(s => s.setPublicChannelVideos)
const setPublicTracks = useStore(s => s.setPublicTracks)
const setPublicTrack = useStore(s => s.setPublicTrack)
useEffect(() => {
if (!publicVideos?.length) { return }
// note: it is important to ALWAYS set the current video to videoId
// even if it's undefined
setPublicVideos(publicVideos)
}, [getCollectionKey(publicVideos)])
useEffect(() => {
if (!publicChannelVideos?.length) { return }
// note: it is important to ALWAYS set the current video to videoId
// even if it's undefined
setPublicChannelVideos(publicChannelVideos)
}, [getCollectionKey(publicChannelVideos)])
useEffect(() => {
if (!publicTracks?.length) { return }
// note: it is important to ALWAYS set the current video to videoId
// even if it's undefined
setPublicTracks(publicTracks)
}, [getCollectionKey(publicTracks)])
useEffect(() => {
// note: it is important to ALWAYS set the current video to videoId
// even if it's undefined
setPublicTrack(publicTrack)
if (!publicTrack || !publicTrack?.id) { return }
// this is a hack for hugging face:
// we allow the ?v=<id> param on the root of the domain
if (pathname !== "/music") {
// console.log("we are on huggingface apparently!")
router.replace(`/music?m=${publicTrack.id}`)
}
}, [publicTrack?.id])
useEffect(() => {
// note: it is important to ALWAYS set the current video to videoId
// even if it's undefined
setPublicVideo(publicVideo)
if (!publicVideo || !publicVideo?.id) { return }
if (pathname === "/embed") { return }
// this is a hack for hugging face:
// we allow the ?v=<id> param on the root of the domain
if (pathname !== "/watch") {
// console.log("we are on huggingface apparently!")
router.replace(`/watch?v=${publicVideo.id}`)
}
}, [publicVideo?.id])
useEffect(() => {
// note: it is important to ALWAYS set the current video to videoId
// even if it's undefined
setPublicChannel(channel)
if (!channel || !channel?.id) { return }
// this is a hack for hugging face:
// we allow the ?v=<id> param on the root of the domain
if (pathname !== "/channel") {
// console.log("we are on huggingface apparently!")
router.replace(`/channel?v=${channel.id}`)
}
}, [channel?.id])
// this is critical: it sync the current route (coming from server-side)
// with the zustand state manager
useEffect(() => {
setPathname(pathname)
}, [pathname])
const view = useStore(s => s.view)
return (
<TubeLayout>
{view === "home" && <HomeView />}
{view === "public_video_embed" && <PublicVideoEmbedView />}
{view === "public_video" && <PublicVideoView />}
{view === "public_music_videos" && <PublicMusicVideosView />}
{view === "public_channels" && <PublicChannelsView />}
{view === "public_channel" && <PublicChannelView />}
{/*view === "user_videos" && <UserVideosView />*/}
{view === "user_channel" && <UserChannelView />}
{view === "user_account" && <UserAccountView />}
{view === "not_found" && <NotFoundView />}
</TubeLayout>
)
}