creates application

This commit is contained in:
simon.franken
2026-02-16 10:15:27 +01:00
parent 791c661395
commit 7d678c1c4d
65 changed files with 10389 additions and 0 deletions

View 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,
};
}

View 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,
};
}

View 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,
};
}