"use client" import { useMutation, useQueryClient } from "@tanstack/react-query" import { createSupabaseBrowserClient } from "@/lib/supabase/client" import { queryKeys } from "./query-keys" import { notify } from "@/lib/notify" export function useCreateFolder() { const supabaseClient = createSupabaseBrowserClient() const queryClient = useQueryClient() return useMutation({ mutationFn: async ({ name }: { name: string }) => { const { data: { user }, } = await supabaseClient.auth.getUser() if (!user) throw new Error("not authenticated") const { data: maxRow } = await supabaseClient .from("folders") .select("position") .eq("user_id", user.id) .order("position", { ascending: false }) .limit(1) .maybeSingle() const nextPosition = (maxRow?.position ?? 0) + 1000 const { error } = await supabaseClient.from("folders").insert({ user_id: user.id, name, position: nextPosition, }) if (error) throw error }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: queryKeys.subscriptions.all }) queryClient.invalidateQueries({ queryKey: queryKeys.userProfile.all }) notify("folder created") }, onError: (error: Error) => { notify(error.message.includes("limit") ? "folder limit reached for your plan" : "failed to create folder: " + error.message) }, }) } export function useDeleteAllFolders() { const supabaseClient = createSupabaseBrowserClient() const queryClient = useQueryClient() return useMutation({ mutationFn: async () => { const { data: { user }, } = await supabaseClient.auth.getUser() if (!user) throw new Error("not authenticated") await supabaseClient .from("subscriptions") .update({ folder_id: null }) .eq("user_id", user.id) .not("folder_id", "is", null) const { error } = await supabaseClient .from("folders") .delete() .eq("user_id", user.id) if (error) throw error }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: queryKeys.subscriptions.all }) queryClient.invalidateQueries({ queryKey: queryKeys.userProfile.all }) notify("all folders deleted") }, onError: (error: Error) => { notify("failed to delete all folders: " + error.message) }, }) } export function useRenameFolder() { const supabaseClient = createSupabaseBrowserClient() const queryClient = useQueryClient() return useMutation({ mutationFn: async ({ folderIdentifier, name, iconUrl, }: { folderIdentifier: string name: string iconUrl?: string | null }) => { const updatePayload: Record = { name } if (iconUrl !== undefined) updatePayload.icon_url = iconUrl const { error } = await supabaseClient .from("folders") .update(updatePayload) .eq("id", folderIdentifier) if (error) throw error }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: queryKeys.subscriptions.all }) notify("folder renamed") }, onError: (error: Error) => { notify("failed to rename folder: " + error.message) }, }) } export function useDeleteFolder() { const supabaseClient = createSupabaseBrowserClient() const queryClient = useQueryClient() return useMutation({ mutationFn: async ({ folderIdentifier, }: { folderIdentifier: string }) => { await supabaseClient .from("subscriptions") .update({ folder_id: null }) .eq("folder_id", folderIdentifier) const { error } = await supabaseClient .from("folders") .delete() .eq("id", folderIdentifier) if (error) throw error }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: queryKeys.subscriptions.all }) queryClient.invalidateQueries({ queryKey: queryKeys.userProfile.all }) notify("folder deleted") }, onError: (error: Error) => { notify("failed to delete folder: " + error.message) }, }) }