hooks/useModelesAdmin.ts
Annotation non disponible
Lance npm run annotate (nécessite ANTHROPIC_API_KEY dans .env.local) pour générer une annotation française par Claude Haiku 4.5.
8 exports
useModelesAdminuseModeleDetailuseCreateModeleFulluseUpdateModeleuseDeleteModeleModeleAttributDetailModeleDetailAttributInput
Code source· typescript
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { apiDelete, apiGet, apiPatch, apiPost } from "@/lib/api";
import { API_MOBILE } from "@/lib/constants";
import { useAuthStore } from "@/store/authStore";
export type ModeleAttributDetail = {
id: string;
nom: string;
valeursSuggérees: string[];
obligatoire: boolean;
ordre: number;
};
export type ModeleDetail = {
id: string;
nom: string;
description: string | null;
attributs: ModeleAttributDetail[];
_count: { produits: number };
};
export type AttributInput = {
id?: string;
nom: string;
valeurs: string[];
obligatoire?: boolean;
};
export function useModelesAdmin() {
const token = useAuthStore((s) => s.token);
const role = useAuthStore((s) => s.user?.role);
return useQuery({
queryKey: ["vitrine-pro", "modeles"],
queryFn: async () => {
const { data, error } = await apiGet<{ modeles: ModeleDetail[] }>(API_MOBILE.VITRINE_MODELES);
if (error || !data) throw new Error(error ?? "Erreur modèles");
return data.modeles;
},
enabled: !!token && role === "TENANT_ADMIN",
staleTime: 60 * 1000,
});
}
export function useModeleDetail(id: string | null) {
const token = useAuthStore((s) => s.token);
const role = useAuthStore((s) => s.user?.role);
return useQuery({
queryKey: ["vitrine-pro", "modeles", id],
queryFn: async () => {
if (!id) throw new Error("id requis");
const { data, error } = await apiGet<{ modele: ModeleDetail }>(API_MOBILE.VITRINE_MODELE(id));
if (error || !data) throw new Error(error ?? "Erreur modèle");
return data.modele;
},
enabled: !!token && role === "TENANT_ADMIN" && !!id,
staleTime: 60 * 1000,
});
}
export function useCreateModeleFull() {
const qc = useQueryClient();
return useMutation({
mutationFn: async (input: { nom: string; description?: string | null; attributs: AttributInput[] }) => {
const { data, error } = await apiPost<{ success: boolean; modele: ModeleDetail }>(
API_MOBILE.VITRINE_MODELES,
input
);
if (error || !data) throw new Error(error ?? "Erreur création modèle");
return data.modele;
},
onSuccess: () => qc.invalidateQueries({ queryKey: ["vitrine-pro", "modeles"] }),
});
}
export function useUpdateModele() {
const qc = useQueryClient();
return useMutation({
mutationFn: async (input: { id: string; nom?: string; description?: string | null; attributs?: AttributInput[] }) => {
const { id, ...body } = input;
const { data, error } = await apiPatch<{ success: boolean; modele: ModeleDetail }>(
API_MOBILE.VITRINE_MODELE(id),
body
);
if (error || !data) throw new Error(error ?? "Erreur mise à jour modèle");
return data.modele;
},
onSuccess: (modele) => {
qc.invalidateQueries({ queryKey: ["vitrine-pro", "modeles"] });
qc.invalidateQueries({ queryKey: ["vitrine-pro", "modeles", modele.id] });
},
});
}
export function useDeleteModele() {
const qc = useQueryClient();
return useMutation({
mutationFn: async (id: string) => {
const { data, error } = await apiDelete<{ success: boolean }>(API_MOBILE.VITRINE_MODELE(id));
if (error || !data) throw new Error(error ?? "Erreur suppression modèle");
return data;
},
onSuccess: () => qc.invalidateQueries({ queryKey: ["vitrine-pro", "modeles"] }),
});
}
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { apiDelete, apiGet, apiPatch, apiPost } from "@/lib/api";
import { API_MOBILE } from "@/lib/constants";
import { useAuthStore } from "@/store/authStore";
export type ModeleAttributDetail = {
id: string;
nom: string;
valeursSuggérees: string[];
obligatoire: boolean;
ordre: number;
};
export type ModeleDetail = {
id: string;
nom: string;
description: string | null;
attributs: ModeleAttributDetail[];
_count: { produits: number };
};
export type AttributInput = {
id?: string;
nom: string;
valeurs: string[];
obligatoire?: boolean;
};
export function useModelesAdmin() {
const token = useAuthStore((s) => s.token);
const role = useAuthStore((s) => s.user?.role);
return useQuery({
queryKey: ["vitrine-pro", "modeles"],
queryFn: async () => {
const { data, error } = await apiGet<{ modeles: ModeleDetail[] }>(API_MOBILE.VITRINE_MODELES);
if (error || !data) throw new Error(error ?? "Erreur modèles");
return data.modeles;
},
enabled: !!token && role === "TENANT_ADMIN",
staleTime: 60 * 1000,
});
}
export function useModeleDetail(id: string | null) {
const token = useAuthStore((s) => s.token);
const role = useAuthStore((s) => s.user?.role);
return useQuery({
queryKey: ["vitrine-pro", "modeles", id],
queryFn: async () => {
if (!id) throw new Error("id requis");
const { data, error } = await apiGet<{ modele: ModeleDetail }>(API_MOBILE.VITRINE_MODELE(id));
if (error || !data) throw new Error(error ?? "Erreur modèle");
return data.modele;
},
enabled: !!token && role === "TENANT_ADMIN" && !!id,
staleTime: 60 * 1000,
});
}
export function useCreateModeleFull() {
const qc = useQueryClient();
return useMutation({
mutationFn: async (input: { nom: string; description?: string | null; attributs: AttributInput[] }) => {
const { data, error } = await apiPost<{ success: boolean; modele: ModeleDetail }>(
API_MOBILE.VITRINE_MODELES,
input
);
if (error || !data) throw new Error(error ?? "Erreur création modèle");
return data.modele;
},
onSuccess: () => qc.invalidateQueries({ queryKey: ["vitrine-pro", "modeles"] }),
});
}
export function useUpdateModele() {
const qc = useQueryClient();
return useMutation({
mutationFn: async (input: { id: string; nom?: string; description?: string | null; attributs?: AttributInput[] }) => {
const { id, ...body } = input;
const { data, error } = await apiPatch<{ success: boolean; modele: ModeleDetail }>(
API_MOBILE.VITRINE_MODELE(id),
body
);
if (error || !data) throw new Error(error ?? "Erreur mise à jour modèle");
return data.modele;
},
onSuccess: (modele) => {
qc.invalidateQueries({ queryKey: ["vitrine-pro", "modeles"] });
qc.invalidateQueries({ queryKey: ["vitrine-pro", "modeles", modele.id] });
},
});
}
export function useDeleteModele() {
const qc = useQueryClient();
return useMutation({
mutationFn: async (id: string) => {
const { data, error } = await apiDelete<{ success: boolean }>(API_MOBILE.VITRINE_MODELE(id));
if (error || !data) throw new Error(error ?? "Erreur suppression modèle");
return data;
},
onSuccess: () => qc.invalidateQueries({ queryKey: ["vitrine-pro", "modeles"] }),
});
}