'use client' import { getGroupsAction } from '@/app/groups/actions' import { getRecentGroups, getStarredGroups, starGroup, unstarGroup, } from '@/app/groups/recent-groups-helpers' import { Button } from '@/components/ui/button' import { Skeleton } from '@/components/ui/skeleton' import { getGroups } from '@/lib/api' import { StarFilledIcon } from '@radix-ui/react-icons' import { Calendar, Loader2, 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() 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 (
  • {details ? (
    {details._count.participants}
    {new Date(details.createdAt).toLocaleDateString( 'en-US', { dateStyle: 'medium', }, )}
    ) : (
    )}
  • ) })}
) }