'use client' import { getGroupsAction } from '@/app/groups/actions' import { deleteRecentGroup, getRecentGroups, getStarredGroups, saveRecentGroup, starGroup, unstarGroup, } from '@/app/groups/recent-groups-helpers' import { Button } from '@/components/ui/button' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' import { Skeleton } from '@/components/ui/skeleton' import { ToastAction } from '@/components/ui/toast' import { useToast } from '@/components/ui/use-toast' import { getGroups } from '@/lib/api' import { StarFilledIcon } from '@radix-ui/react-icons' import { Calendar, Loader2, MoreHorizontal, Star, Users } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/navigation' import { useEffect, useState } from 'react' import { z } from 'zod' const recentGroupsSchema = z.array( z.object({ id: z.string().min(1), name: z.string(), }), ) type RecentGroups = z.infer type State = | { status: 'pending' } | { status: 'partial'; groups: RecentGroups; starredGroups: string[] } | { status: 'complete' groups: RecentGroups groupsDetails: Awaited> starredGroups: string[] } type Props = { getGroupsAction: (groupIds: string[]) => ReturnType } export function RecentGroupList() { const [state, setState] = useState({ status: 'pending' }) useEffect(() => { const groupsInStorage = getRecentGroups() const starredGroups = getStarredGroups() setState({ status: 'partial', groups: groupsInStorage, starredGroups }) getGroupsAction(groupsInStorage.map((g) => g.id)).then((groupsDetails) => { setState({ status: 'complete', groups: groupsInStorage, groupsDetails, starredGroups, }) }) }, []) const router = useRouter() const toast = useToast() if (state.status === 'pending') { return (

Loading recent groups…

) } if (state.groups.length === 0) { return (

You have not visited any group recently.

{' '} or ask a friend to send you the link to an existing one.

) } return (
    {state.groups .toSorted( (first, second) => (state.starredGroups.includes(second.id) ? 2 : 0) - (state.starredGroups.includes(first.id) ? 1 : 0), ) .map((group) => { const details = state.status === 'complete' ? state.groupsDetails.find((d) => d.id === group.id) : null return (
  • { event.stopPropagation() deleteRecentGroup(group) setState({ ...state, groups: state.groups.filter( (g) => g.id !== group.id, ), }) toast.toast({ title: 'Group has been removed', description: 'The group was removed from your recent groups list.', action: ( { saveRecentGroup(group) setState({ ...state, groups: state.groups, }) }} > Undo ), }) }} > Remove from recent groups
    {details ? (
    {details._count.participants}
    {new Date(details.createdAt).toLocaleDateString( 'en-US', { dateStyle: 'medium', }, )}
    ) : (
    )}
  • ) })}
) }