React/Vite frontend and Express/SQLite backend for tracking visited and planned cities on a map, with per-city notes, photos, links, and participant-based sharing between family members. Includes session auth with admin-managed user accounts, an OSM/Nominatim geocoding proxy, and a single-image Docker deployment. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
41 lines
1.3 KiB
TypeScript
41 lines
1.3 KiB
TypeScript
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
import type { CreateUserInput, UpdateUserInput, ResetPasswordInput } from '@citytracker/shared';
|
|
import * as usersApi from '../api/users';
|
|
|
|
const USERS_KEY = ['users'];
|
|
|
|
export function useUsers() {
|
|
return useQuery({ queryKey: USERS_KEY, queryFn: usersApi.listUsers });
|
|
}
|
|
|
|
export function useCreateUser() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (input: CreateUserInput) => usersApi.createUser(input),
|
|
onSuccess: () => queryClient.invalidateQueries({ queryKey: USERS_KEY }),
|
|
});
|
|
}
|
|
|
|
export function useUpdateUser() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: ({ id, input }: { id: number; input: UpdateUserInput }) =>
|
|
usersApi.updateUser(id, input),
|
|
onSuccess: () => queryClient.invalidateQueries({ queryKey: USERS_KEY }),
|
|
});
|
|
}
|
|
|
|
export function useResetPassword() {
|
|
return useMutation({
|
|
mutationFn: ({ id, input }: { id: number; input: ResetPasswordInput }) =>
|
|
usersApi.resetPassword(id, input),
|
|
});
|
|
}
|
|
|
|
export function useDeleteUser() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (id: number) => usersApi.deleteUser(id),
|
|
onSuccess: () => queryClient.invalidateQueries({ queryKey: USERS_KEY }),
|
|
});
|
|
}
|