hooks/useModelesAdmin.ts

hook·mobile·3.4 KB · 105 lignes· Voir l'itinéraire
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"] }),
  });
}