creates application
This commit is contained in:
45
frontend/src/hooks/useClients.ts
Normal file
45
frontend/src/hooks/useClients.ts
Normal file
@@ -0,0 +1,45 @@
|
||||
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
||||
import { clientsApi } from '@/api/clients';
|
||||
import type { CreateClientInput, UpdateClientInput } from '@/types';
|
||||
|
||||
export function useClients() {
|
||||
const queryClient = useQueryClient();
|
||||
|
||||
const { data: clients, isLoading, error } = useQuery({
|
||||
queryKey: ['clients'],
|
||||
queryFn: clientsApi.getAll,
|
||||
});
|
||||
|
||||
const createClient = useMutation({
|
||||
mutationFn: (input: CreateClientInput) => clientsApi.create(input),
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ['clients'] });
|
||||
},
|
||||
});
|
||||
|
||||
const updateClient = useMutation({
|
||||
mutationFn: ({ id, input }: { id: string; input: UpdateClientInput }) =>
|
||||
clientsApi.update(id, input),
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ['clients'] });
|
||||
},
|
||||
});
|
||||
|
||||
const deleteClient = useMutation({
|
||||
mutationFn: (id: string) => clientsApi.delete(id),
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ['clients'] });
|
||||
// Also invalidate projects since they depend on clients
|
||||
queryClient.invalidateQueries({ queryKey: ['projects'] });
|
||||
},
|
||||
});
|
||||
|
||||
return {
|
||||
clients,
|
||||
isLoading,
|
||||
error,
|
||||
createClient,
|
||||
updateClient,
|
||||
deleteClient,
|
||||
};
|
||||
}
|
||||
43
frontend/src/hooks/useProjects.ts
Normal file
43
frontend/src/hooks/useProjects.ts
Normal file
@@ -0,0 +1,43 @@
|
||||
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
||||
import { projectsApi } from '@/api/projects';
|
||||
import type { CreateProjectInput, UpdateProjectInput } from '@/types';
|
||||
|
||||
export function useProjects(clientId?: string) {
|
||||
const queryClient = useQueryClient();
|
||||
|
||||
const { data: projects, isLoading, error } = useQuery({
|
||||
queryKey: ['projects', clientId],
|
||||
queryFn: () => projectsApi.getAll(clientId),
|
||||
});
|
||||
|
||||
const createProject = useMutation({
|
||||
mutationFn: (input: CreateProjectInput) => projectsApi.create(input),
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ['projects'] });
|
||||
},
|
||||
});
|
||||
|
||||
const updateProject = useMutation({
|
||||
mutationFn: ({ id, input }: { id: string; input: UpdateProjectInput }) =>
|
||||
projectsApi.update(id, input),
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ['projects'] });
|
||||
},
|
||||
});
|
||||
|
||||
const deleteProject = useMutation({
|
||||
mutationFn: (id: string) => projectsApi.delete(id),
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ['projects'] });
|
||||
},
|
||||
});
|
||||
|
||||
return {
|
||||
projects,
|
||||
isLoading,
|
||||
error,
|
||||
createProject,
|
||||
updateProject,
|
||||
deleteProject,
|
||||
};
|
||||
}
|
||||
43
frontend/src/hooks/useTimeEntries.ts
Normal file
43
frontend/src/hooks/useTimeEntries.ts
Normal file
@@ -0,0 +1,43 @@
|
||||
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
||||
import { timeEntriesApi } from '@/api/timeEntries';
|
||||
import type { CreateTimeEntryInput, UpdateTimeEntryInput, TimeEntryFilters } from '@/types';
|
||||
|
||||
export function useTimeEntries(filters?: TimeEntryFilters) {
|
||||
const queryClient = useQueryClient();
|
||||
|
||||
const { data, isLoading, error } = useQuery({
|
||||
queryKey: ['timeEntries', filters],
|
||||
queryFn: () => timeEntriesApi.getAll(filters),
|
||||
});
|
||||
|
||||
const createTimeEntry = useMutation({
|
||||
mutationFn: (input: CreateTimeEntryInput) => timeEntriesApi.create(input),
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ['timeEntries'] });
|
||||
},
|
||||
});
|
||||
|
||||
const updateTimeEntry = useMutation({
|
||||
mutationFn: ({ id, input }: { id: string; input: UpdateTimeEntryInput }) =>
|
||||
timeEntriesApi.update(id, input),
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ['timeEntries'] });
|
||||
},
|
||||
});
|
||||
|
||||
const deleteTimeEntry = useMutation({
|
||||
mutationFn: (id: string) => timeEntriesApi.delete(id),
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ['timeEntries'] });
|
||||
},
|
||||
});
|
||||
|
||||
return {
|
||||
data,
|
||||
isLoading,
|
||||
error,
|
||||
createTimeEntry,
|
||||
updateTimeEntry,
|
||||
deleteTimeEntry,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user