Skip to content

Commit 8c4ec71

Browse files
cache offline: substitui onSettled por onSuccess com controle explícito de estado
1 parent 4013824 commit 8c4ec71

1 file changed

Lines changed: 16 additions & 13 deletions

File tree

src/features/staff/hooks.ts

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,10 @@ export function useCreateStaff() {
1616

1717
return useMutation({
1818
mutationFn: (data: StaffSchema) => createStaff(data),
19-
20-
// 🛡️ Defesa de Arquiteto: Optimistic Update para UX instantânea
2119
onMutate: async (newStaff) => {
22-
// Cancela queries em andamento para não sobrescrever o cache otimista
2320
await queryClient.cancelQueries({ queryKey: ['staffs'] })
24-
25-
// Snapshot do cache atual para rollback em caso de erro
2621
const previousStaffs = queryClient.getQueryData<Staff[]>(['staffs'])
2722

28-
// Atualiza o cache instantaneamente
2923
queryClient.setQueryData(['staffs'], (old: Staff[] | undefined) => {
3024
const optimisticEntry: Staff = {
3125
...newStaff,
@@ -39,18 +33,27 @@ export function useCreateStaff() {
3933

4034
return { previousStaffs }
4135
},
42-
43-
// Em caso de erro real (ex: timeout longo), restaura o cache anterior
36+
onSuccess: (result, newStaff) => {
37+
if (result.synced) {
38+
// Online: Firebase é a fonte da verdade, busca os dados reais
39+
queryClient.invalidateQueries({ queryKey: ['staffs'] })
40+
} else {
41+
// Offline: substitui a entrada temporária pelo registro real do localStorage
42+
// sem disparar um refetch (Firebase está indisponível)
43+
const pendingEntry = getPendingStaffs().find(s => s.email === newStaff.email)
44+
if (pendingEntry) {
45+
queryClient.setQueryData(['staffs'], (old: Staff[] | undefined) => {
46+
const withoutTemp = (old || []).filter(s => !s.id.startsWith('temp-'))
47+
return [pendingEntry, ...withoutTemp]
48+
})
49+
}
50+
}
51+
},
4452
onError: (_err, _newStaff, context) => {
4553
if (context?.previousStaffs) {
4654
queryClient.setQueryData(['staffs'], context.previousStaffs)
4755
}
4856
},
49-
50-
// Sempre invalida após finalizar para sincronizar com a "verdade" do servidor
51-
onSettled: () => {
52-
queryClient.invalidateQueries({ queryKey: ['staffs'] })
53-
},
5457
})
5558
}
5659

0 commit comments

Comments
 (0)