From b2333c020debeec0b268c678ac944c7a50468f49 Mon Sep 17 00:00:00 2001 From: Taken Date: Mon, 29 Sep 2025 23:04:42 +0200 Subject: [PATCH] Added toast progress --- .../guild/[value]/_components/members.tsx | 53 +++++++++++++++++-- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/src/app/(stats)/guild/[value]/_components/members.tsx b/src/app/(stats)/guild/[value]/_components/members.tsx index fd7cbff..0fa655c 100644 --- a/src/app/(stats)/guild/[value]/_components/members.tsx +++ b/src/app/(stats)/guild/[value]/_components/members.tsx @@ -10,6 +10,8 @@ import { playerForGuildSchema } from "@/lib/schema/player" import { QueryClient, QueryClientProvider, useQuery } from "@tanstack/react-query" import Image from "next/image" import Link from "next/link" +import { useCallback, useEffect, useRef, useState } from "react" +import { toast } from "sonner" import z from "zod" type PlayerForGuild = z.infer @@ -49,9 +51,15 @@ function useMemberData(uuid: string) { }) } -function MemberRow({ member }: { member: Guild["guild"]["members"][number] }) { +function MemberRow({ member, onLoad }: { member: Guild["guild"]["members"][number], onLoad: () => void }) { const { data: player, isLoading, isError } = useMemberData(member.uuid) + useEffect(() => { + if (!isLoading && (player || isError)) { + onLoad() + } + }, [isLoading, player, isError, onLoad]) + if (isLoading || (!player && !isError)) return null if (isError || !player) return null @@ -66,6 +74,16 @@ function MemberRow({ member }: { member: Guild["guild"]["members"][number] }) { } function GuildMembersInternal({ members, ranks }: { members: Guild["guild"]["members"], ranks: Guild["guild"]["ranks"] }) { + const [loadedCount, setLoadedCount] = useState(0) + const hasShownToast = useRef(false) + + const totalMembers = members.length + const TOAST_ID = "guild.members.progress" + + const handleMemberLoad = useCallback(() => { + setLoadedCount(prev => prev + 1) + }, []) + const sortedMembers = [...members].sort((a, b) => { if (a.rank === "Guild Master" && b.rank !== "Guild Master") return -1 if (b.rank === "Guild Master" && a.rank !== "Guild Master") return 1 @@ -83,6 +101,30 @@ function GuildMembersInternal({ members, ranks }: { members: Guild["guild"]["mem return a.uuid.localeCompare(b.uuid) }) + useEffect(() => { + if (!hasShownToast.current && totalMembers > 0) { + toast.loading(`Loading guild members... (0/${totalMembers})`, { + id: TOAST_ID, + duration: 1000 + }) + hasShownToast.current = true + } + }, [totalMembers, TOAST_ID]) + + useEffect(() => { + if (loadedCount > 0) { + if (loadedCount >= totalMembers) { + toast.success(`Loaded all ${totalMembers} guild members!`, { + id: TOAST_ID + }) + } else { + toast.loading(`Loading guild members... (${loadedCount}/${totalMembers})`, { + id: TOAST_ID + }) + } + } + }, [loadedCount, totalMembers, TOAST_ID]) + return ( @@ -97,7 +139,13 @@ function GuildMembersInternal({ members, ranks }: { members: Guild["guild"]["mem - {sortedMembers.map(member => )} + {sortedMembers.map(member => ( + + ))} @@ -144,4 +192,3 @@ function MemberCard({ member: m }: { member: MemberWithPlayer }) { ) } -