- Rename categoryEmoji to categoryIcon in ItemCard, CandidateCard, ThreadCard, ItemPicker - Import and render LucideIcon at appropriate sizes (36px placeholder, 14-16px badges) - Update hook interfaces to match server API (categoryIcon instead of categoryEmoji) - Rename iconData.ts to iconData.tsx (contains JSX) - Update useCategories mutation type to use icon instead of emoji Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
108 lines
2.7 KiB
TypeScript
108 lines
2.7 KiB
TypeScript
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
|
|
import { apiGet, apiPost, apiPut, apiDelete } from "../lib/api";
|
|
|
|
interface SetupListItem {
|
|
id: number;
|
|
name: string;
|
|
createdAt: string;
|
|
updatedAt: string;
|
|
itemCount: number;
|
|
totalWeight: number;
|
|
totalCost: number;
|
|
}
|
|
|
|
interface SetupItemWithCategory {
|
|
id: number;
|
|
name: string;
|
|
weightGrams: number | null;
|
|
priceCents: number | null;
|
|
categoryId: number;
|
|
notes: string | null;
|
|
productUrl: string | null;
|
|
imageFilename: string | null;
|
|
createdAt: string;
|
|
updatedAt: string;
|
|
categoryName: string;
|
|
categoryIcon: string;
|
|
}
|
|
|
|
interface SetupWithItems {
|
|
id: number;
|
|
name: string;
|
|
createdAt: string;
|
|
updatedAt: string;
|
|
items: SetupItemWithCategory[];
|
|
}
|
|
|
|
export type { SetupListItem, SetupWithItems, SetupItemWithCategory };
|
|
|
|
export function useSetups() {
|
|
return useQuery({
|
|
queryKey: ["setups"],
|
|
queryFn: () => apiGet<SetupListItem[]>("/api/setups"),
|
|
});
|
|
}
|
|
|
|
export function useSetup(setupId: number | null) {
|
|
return useQuery({
|
|
queryKey: ["setups", setupId],
|
|
queryFn: () => apiGet<SetupWithItems>(`/api/setups/${setupId}`),
|
|
enabled: setupId != null,
|
|
});
|
|
}
|
|
|
|
export function useCreateSetup() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (data: { name: string }) =>
|
|
apiPost<SetupListItem>("/api/setups", data),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ["setups"] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useUpdateSetup(setupId: number) {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (data: { name?: string }) =>
|
|
apiPut<SetupListItem>(`/api/setups/${setupId}`, data),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ["setups"] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useDeleteSetup() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (id: number) =>
|
|
apiDelete<{ success: boolean }>(`/api/setups/${id}`),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ["setups"] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useSyncSetupItems(setupId: number) {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (itemIds: number[]) =>
|
|
apiPut<{ success: boolean }>(`/api/setups/${setupId}/items`, { itemIds }),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ["setups"] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useRemoveSetupItem(setupId: number) {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (itemId: number) =>
|
|
apiDelete<{ success: boolean }>(`/api/setups/${setupId}/items/${itemId}`),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ["setups"] });
|
|
},
|
|
});
|
|
}
|