import { css, cx } from '@emotion/css' import useUserArtists from '@/web/api/hooks/useUserArtists' import Tabs from '@/web/components/Tabs' import { useMemo, useRef } from 'react' import CoverRow from '@/web/components/CoverRow' import useUserPlaylists from '@/web/api/hooks/useUserPlaylists' import useUserAlbums from '@/web/api/hooks/useUserAlbums' import { useSnapshot } from 'valtio' import uiStates from '@/web/states/uiStates' import ArtistRow from '@/web/components/ArtistRow' import { playerWidth, topbarHeight } from '@/web/utils/const' import topbarBackground from '@/web/assets/images/topbar-background.png' import useIntersectionObserver from '@/web/hooks/useIntersectionObserver' import { AnimatePresence, motion } from 'framer-motion' import { scrollToBottom } from '@/web/utils/common' import { throttle } from 'lodash-es' import { useTranslation } from 'react-i18next' import VideoRow from '@/web/components/VideoRow' import useUserVideos from '@/web/api/hooks/useUserVideos' import persistedUiStates from '@/web/states/persistedUiStates' import settings from '@/web/states/settings' import useUser from '@/web/api/hooks/useUser' const collections = ['playlists', 'albums', 'artists', 'videos'] as const type Collection = (typeof collections)[number] const Albums = () => { const { data: albums } = useUserAlbums() return } const Playlists = () => { const { data: playlists } = useUserPlaylists() const user = useUser() const myPlaylists = useMemo( () => playlists?.playlist?.slice(1).filter(p => p.userId === user?.data?.account?.id), [playlists, user] ) const otherPlaylists = useMemo( () => playlists?.playlist?.slice(1).filter(p => p.userId !== user?.data?.account?.id), [playlists, user] ) return (
{/* My playlists */} {myPlaylists && ( <>
Created BY ME
)} {/* Other playlists */} {otherPlaylists && ( <>
Created BY OTHERS
)}
) } const Artists = () => { const { data: artists } = useUserArtists() return } const Videos = () => { const { data: videos } = useUserVideos() return } const CollectionTabs = ({ showBg }: { showBg: boolean }) => { const { t } = useTranslation() const { displayPlaylistsFromNeteaseMusic } = useSnapshot(settings) const tabs: { id: Collection; name: string }[] = [ { id: 'albums', name: t`common.album_other`, }, { id: 'playlists', name: t`common.playlist_other`, }, { id: 'artists', name: t`common.artist_other`, }, { id: 'videos', name: t`common.video_other`, }, ] const { librarySelectedTab: selectedTab } = useSnapshot(persistedUiStates) const { minimizePlayer } = useSnapshot(persistedUiStates) const setSelectedTab = (id: Collection) => { persistedUiStates.librarySelectedTab = id } return (
{/* Topbar background */} {showBg && ( )} { if (!displayPlaylistsFromNeteaseMusic && tab.id === 'playlists') { return false } return true })} value={selectedTab} onChange={(id: Collection) => { setSelectedTab(id) scrollToBottom(true) }} className={cx('sticky z-10 -mb-10 px-2.5 lg:px-0')} style={{ top: `${topbarHeight}px`, }} />
) } const Collections = () => { const { librarySelectedTab: selectedTab } = useSnapshot(persistedUiStates) const observePoint = useRef(null) const { onScreen: isScrollReachBottom } = useIntersectionObserver(observePoint) const onScroll = throttle(() => { if (isScrollReachBottom) return scrollToBottom(true) }, 500) return (
{selectedTab === 'albums' && } {selectedTab === 'playlists' && } {selectedTab === 'artists' && } {selectedTab === 'videos' && }
) } export default Collections