This commit is contained in:
Bastien COIGNOUX
2026-05-04 08:28:32 +02:00
parent 7f94f83940
commit 695d4e76d0
46 changed files with 13390 additions and 251 deletions

67
app/hooks/useEtapes.ts Normal file
View File

@ -0,0 +1,67 @@
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { getCurrentUserId, pb } from '@/services/pocketbase';
import type { EtapePipelineRecord } from '@/types/collections';
const DEFAULT_ETAPES: { nom: string; ordre: number; couleur: string; is_terminal?: boolean }[] = [
{ nom: 'Prospection', ordre: 1, couleur: '#64748B' },
{ nom: 'Contact établi', ordre: 2, couleur: '#0EA5E9' },
{ nom: 'Visite', ordre: 3, couleur: '#8B5CF6' },
{ nom: 'Analyse', ordre: 4, couleur: '#F59E0B' },
{ nom: 'Offre', ordre: 5, couleur: '#EC4899' },
{ nom: 'Compromis', ordre: 6, couleur: '#10B981' },
{ nom: 'Acte / acquisition', ordre: 7, couleur: '#16A34A', is_terminal: true },
];
export function useEtapes() {
const uid = getCurrentUserId();
const queryClient = useQueryClient();
const query = useQuery({
queryKey: ['etapes_pipeline', uid],
queryFn: async () => {
if (!uid) return [] as EtapePipelineRecord[];
const list = await pb.collection('etapes_pipeline').getFullList<EtapePipelineRecord>({
filter: `user="${uid}"`,
sort: 'ordre',
});
return list;
},
enabled: Boolean(uid),
});
const initMutation = useMutation({
mutationFn: async () => {
if (!uid) throw new Error('Non connecté');
const existing = await pb.collection('etapes_pipeline').getFullList<EtapePipelineRecord>({
filter: `user="${uid}"`,
});
if (existing.length > 0) return existing;
for (const e of DEFAULT_ETAPES) {
await pb.collection('etapes_pipeline').create({
user: uid,
nom: e.nom,
ordre: e.ordre,
couleur: e.couleur,
is_terminal: e.is_terminal ?? false,
});
}
return pb.collection('etapes_pipeline').getFullList<EtapePipelineRecord>({
filter: `user="${uid}"`,
sort: 'ordre',
});
},
onSuccess: () => {
void queryClient.invalidateQueries({ queryKey: ['etapes_pipeline'] });
},
});
return {
etapes: query.data ?? [],
isLoading: query.isPending,
error: query.error,
initEtapesDefaut: initMutation.mutateAsync,
initError: initMutation.error,
isInitPending: initMutation.isPending,
};
}