boring.tools-poc/apps/app/src/hooks/useChangelog.ts
Lars Hampe b2ef80d58d
All checks were successful
Build and Push Docker Image / tests (push) Successful in 34s
Build and Push Docker Image / build (push) Successful in 1m34s
feat(app): add changelog list, byId and create page
2024-10-03 22:47:47 +02:00

78 lines
2.0 KiB
TypeScript

import type {
ChangelogCreateInput,
ChangelogOutput,
} from '@boring.tools/schema'
import { useAuth } from '@clerk/clerk-react'
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
import type { z } from 'zod'
import { queryFetch } from '../utils/queryFetch'
type Changelog = z.infer<typeof ChangelogOutput>
type ChangelogCreate = z.infer<typeof ChangelogCreateInput>
export const useChangelogList = () => {
const { getToken } = useAuth()
return useQuery({
queryKey: ['changelogList'],
queryFn: async (): Promise<ReadonlyArray<Changelog>> =>
await queryFetch({
path: 'changelog',
method: 'get',
token: await getToken(),
}),
})
}
export const useChangelogById = ({ id }: { id: string }) => {
const { getToken } = useAuth()
return useQuery({
queryKey: ['changelogById', id],
queryFn: async (): Promise<Readonly<Changelog>> =>
await queryFetch({
path: `changelog/${id}`,
method: 'get',
token: await getToken(),
}),
})
}
export const useChangelogCreate = () => {
const { getToken } = useAuth()
const queryClient = useQueryClient()
return useMutation({
mutationFn: async (
payload: ChangelogCreate,
): Promise<Readonly<Changelog>> =>
await queryFetch({
path: 'changelog',
data: payload,
method: 'post',
token: await getToken(),
}),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['changelogList'] })
},
})
}
export const useChangelogRemove = () => {
const { getToken } = useAuth()
const queryClient = useQueryClient()
return useMutation({
mutationFn: async ({ id }: { id: string }): Promise<Readonly<Changelog>> =>
await queryFetch({
path: `changelog/${id}`,
method: 'delete',
token: await getToken(),
}),
onSuccess: (data) => {
queryClient.invalidateQueries({
queryKey: ['changelogList', 'changelogById', data.id],
})
},
})
}