|
|
import { atom } from 'jotai' import { IApiResult, IPage } from '@/global' import { atomWithMutation, atomWithQuery, queryClientAtom } from 'jotai-tanstack-query' import { message } from 'antd' import { t } from 'i18next' import { XForm } from '@/types/x-form/model' import * as modelServ from '@/service/x-form/model' import { atomWithStorage } from 'jotai/utils'
type SearchParams = IPage & { key?: string api: string }
export const apiAtom = atomWithStorage('api', '')
export const modelIdAtom = atom(0)
export const modelIdsAtom = atom<number[]>([])
export const modelAtom = atom<XForm.IModel>(undefined as unknown as XForm.IModel)
export const modelSearchAtom = atom<SearchParams>({ key: '', pageSize: 10, page: 1, } as SearchParams)
export const modelPageAtom = atom<IPage>({ pageSize: 10, page: 1, })
export const modelCURDAtom = atomWithQuery<IApiResult<XForm.IModelCURD>, any, any>((get) => { const api = get(apiAtom) console.log('api', api) return { enabled: !!api, queryKey: [ 'modelCURD' ], queryFn: async () => { return await modelServ.model(api).proxy() }, select: (res) => { return res.data.data } } })
export const modelsAtom = atomWithQuery((get) => { const api = get(apiAtom) const curd = get(modelCURDAtom)
return { enabled: curd.isSuccess && !!api, queryKey: [ 'models', get(modelSearchAtom) ], queryFn: async ({ queryKey: [ , params ] }) => {
if (api.startsWith('http')) { return await modelServ.model(api).proxy<XForm.IModel>({ path: '/list', body: params, }) } return await modelServ.model(api).list(params as SearchParams) }, select: res => { const data = res.data data.rows = data.rows?.map(row => { return { ...row, //status: convertToBool(row.status)
} }) return data } } })
//saveOrUpdateAtom
export const saveOrUpdateModelAtom = atomWithMutation<IApiResult, XForm.IModel>((get) => {
return { mutationKey: [ 'updateModel' ], mutationFn: async (data) => { const api = get(apiAtom) if (!api) { return Promise.reject('api 不能为空') } if (data.id === 0) { if (api.startsWith('http')) { return await modelServ.model(api).proxy<XForm.IModel>({ body: data, path: '/add', }) } return await modelServ.model(api).add(data) } if (api.startsWith('http')) { return await modelServ.model(api).proxy<XForm.IModel>({ body: data, path: '/edit', }) } return await modelServ.model(api).update(data) }, onSuccess: (res) => { const isAdd = !!res.data?.id message.success(t(isAdd ? 'message.saveSuccess' : 'message.editSuccess', '保存成功'))
//更新列表
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore fix
get(queryClientAtom).invalidateQueries({ queryKey: [ 'models', get(modelSearchAtom) ] })
return res } } })
export const deleteModelAtom = atomWithMutation((get) => { return { mutationKey: [ 'deleteModel' ], mutationFn: async (ids: number[]) => { const api = get(apiAtom) if (api.startsWith('http')) { return await modelServ.model(api).proxy<XForm.IModel>({ body: ids ?? get(modelIdsAtom) , path: '/deletes', }) } return await modelServ.model(api).batchDelete(ids ?? get(modelIdsAtom)) }, onSuccess: (res) => { message.success('message.deleteSuccess') //更新列表
get(queryClientAtom).invalidateQueries({ queryKey: [ 'models', get(modelSearchAtom) ] }) return res } } })
|