import { useQuery } from '@tanstack/react-query'; import { useCallback, useRef, useState } from 'react'; import { VList, VListHandle } from 'virtua'; import { useStorage } from '@libs/storage/provider'; import { LoaderIcon } from '@shared/icons'; import { ArticleWidget, FileWidget, GroupWidget, HashtagWidget, NewsfeedWidget, NotificationWidget, ThreadWidget, ToggleWidgetList, TopicWidget, TrendingAccountsWidget, TrendingNotesWidget, UserWidget, WidgetList, } from '@shared/widgets'; import { WIDGET_KIND } from '@stores/constants'; import { Widget } from '@utils/types'; export function HomeScreen() { const ref = useRef(null); const [selectedIndex, setSelectedIndex] = useState(-1); const { db } = useStorage(); const { status, data } = useQuery({ queryKey: ['widgets'], queryFn: async () => { const dbWidgets = await db.getWidgets(); const defaultWidgets = [ { id: '99999', title: 'Newsfeed', content: '', kind: WIDGET_KIND.newsfeed, }, { id: '99998', title: 'Notification', content: '', kind: WIDGET_KIND.notification, }, ]; return [...defaultWidgets, ...dbWidgets]; }, refetchOnMount: false, refetchOnReconnect: false, refetchOnWindowFocus: false, staleTime: Infinity, }); const renderItem = useCallback((widget: Widget) => { switch (widget.kind) { case WIDGET_KIND.notification: return ; case WIDGET_KIND.newsfeed: return ; case WIDGET_KIND.topic: return ; case WIDGET_KIND.user: return ; case WIDGET_KIND.thread: return ; case WIDGET_KIND.article: return ; case WIDGET_KIND.file: return ; case WIDGET_KIND.hashtag: return ; case WIDGET_KIND.group: return ; case WIDGET_KIND.trendingNotes: return ; case WIDGET_KIND.trendingAccounts: return ; case WIDGET_KIND.list: return ; default: return null; } }, []); if (status === 'pending') { return (
); } return ( { if (!ref.current) return; switch (e.code) { case 'ArrowUp': case 'ArrowLeft': { e.preventDefault(); const prevIndex = Math.max(selectedIndex - 1, 0); setSelectedIndex(prevIndex); ref.current.scrollToIndex(prevIndex, { align: 'center', smooth: true, }); break; } case 'ArrowDown': case 'ArrowRight': { e.preventDefault(); const nextIndex = Math.min(selectedIndex + 1, data.length - 1); setSelectedIndex(nextIndex); ref.current.scrollToIndex(nextIndex, { align: 'center', smooth: true, }); break; } default: break; } }} > {data.map((widget) => renderItem(widget))} ); }