use-user-groups.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. "use client";
  2. import { useQuery } from "@tanstack/react-query";
  3. import { getSupabaseBrowserClient } from "@/lib/supabase/client";
  4. export interface UserGroup {
  5. id: string;
  6. name: string;
  7. created_by: string;
  8. creator_name: string;
  9. movie_count: number;
  10. }
  11. async function fetchUserGroups(): Promise<UserGroup[]> {
  12. const supabase = getSupabaseBrowserClient();
  13. const {
  14. data: { user },
  15. } = await supabase.auth.getUser();
  16. if (!user) return [];
  17. const { data: memberships, error: memberError } = await supabase
  18. .from("group_members")
  19. .select("group_id")
  20. .eq("user_id", user.id);
  21. if (memberError) throw memberError;
  22. if (!memberships || memberships.length === 0) return [];
  23. const groupIds = memberships.map((m) => m.group_id);
  24. const [{ data: groups, error: groupError }, counts] = await Promise.all([
  25. supabase.from("groups").select("id, name, created_by").in("id", groupIds),
  26. Promise.all(
  27. groupIds.map(async (groupId) => {
  28. const { count } = await supabase
  29. .from("movies")
  30. .select("*", { count: "exact", head: true })
  31. .eq("group_id", groupId);
  32. return { groupId, count: count ?? 0 };
  33. }),
  34. ),
  35. ]);
  36. if (groupError) throw groupError;
  37. if (!groups) return [];
  38. const creatorIds = [...new Set(groups.map((g) => g.created_by))];
  39. const { data: creators } = await supabase
  40. .from("users")
  41. .select("id, display_name")
  42. .in("id", creatorIds);
  43. const creatorMap = new Map(creators?.map((c) => [c.id, c.display_name]) ?? []);
  44. const countMap = new Map(counts.map((c) => [c.groupId, c.count]));
  45. return groups.map((group) => ({
  46. id: group.id,
  47. name: group.name,
  48. created_by: group.created_by,
  49. creator_name: creatorMap.get(group.created_by) ?? "Unknown",
  50. movie_count: countMap.get(group.id) ?? 0,
  51. }));
  52. }
  53. export function useUserGroups() {
  54. return useQuery({
  55. queryKey: ["user-groups"],
  56. queryFn: fetchUserGroups,
  57. staleTime: 30 * 1000,
  58. refetchInterval: 30 * 1000,
  59. });
  60. }