diff --git a/playground/src/App.vue b/playground/src/App.vue index dda9976..b3af3ce 100644 --- a/playground/src/App.vue +++ b/playground/src/App.vue @@ -12,83 +12,60 @@ import { const id = ref('1') const deleteId = ref('1') -const [users, apiGetUsers, isUsersLoading] = useApiGetUsers({ - data: [], - immediate: true, - onSuccess(response) { - if (response.code !== 200) { - Snackbar(response.message) - } - - return response.data - }, -}) -const [user, apiGetUser, isUserLoading] = useApiGetUser({ - data: {}, - onSuccess(response) { - if (response.code !== 200) { - Snackbar(response.message) - } - - return response.data - }, -}) -const [addedUser, apiAddUser] = useApiAddUser({ - data: {}, - onBefore() { - Snackbar.loading('Adding!') - }, - onSuccess(response) { - if (response.code !== 200) { - Snackbar(response.message) - } - - Snackbar.success('Add User Success!') - return response.data - }, -}) -const [updatedUser, apiUpdateUser] = useApiUpdateUser({ - data: {}, - onBefore() { - Snackbar.loading('Updating!') - }, - onSuccess(response) { - if (response.code !== 200) { - Snackbar(response.message) - } - - Snackbar.success('Update User Success!') - return response.data - }, -}) -const [patchedUser] = useApiPatchUser({ - data: {}, - onBefore() { - Snackbar.loading('Patching!') - }, - onSuccess(response) { - if (response.code !== 200) { - Snackbar(response.message) - } - - Snackbar.success('Patch User Success!') - return response.data - }, -}) -const [deletedUser, apiDeleteUser] = useApiDeleteUser({ - data: {}, - onBefore() { - Snackbar.loading('Deleting!') - }, - onSuccess(response) { - if (response.code !== 200) { - Snackbar(response.message) - } - - Snackbar.success('Delete User Success!') - return response.data - }, -}) +const [users, apiGetUsers, { loading: isUsersLoading }] = useApiGetUsers([], { immediate: true }) +const [user, apiGetUser, { loading: isUserLoading }] = useApiGetUser({}) +const [addedUser, apiAddUser] = useApiAddUser( + {}, + { + onBefore() { + Snackbar.loading('Adding!') + }, + onSuccess(response) { + if (response.code === 200) { + Snackbar.success('Add User Success!') + } + }, + } +) +const [updatedUser, apiUpdateUser] = useApiUpdateUser( + {}, + { + onBefore() { + Snackbar.loading('Updating!') + }, + onSuccess(response) { + if (response.code === 200) { + Snackbar.success('Update User Success!') + } + }, + } +) +const [patchedUser] = useApiPatchUser( + {}, + { + onBefore() { + Snackbar.loading('Patching!') + }, + onSuccess(response) { + if (response.code === 200) { + Snackbar.success('Patch User Success!') + } + }, + } +) +const [deletedUser, apiDeleteUser] = useApiDeleteUser( + {}, + { + onBefore() { + Snackbar.loading('Deleting!') + }, + onSuccess(response) { + if (response.code === 200) { + Snackbar.success('Delete User Success!') + } + }, + } +) const userModel = reactive({ id: '', diff --git a/playground/src/apis/index.ts b/playground/src/apis/index.ts index 8f5cfd0..fb56c6b 100644 --- a/playground/src/apis/index.ts +++ b/playground/src/apis/index.ts @@ -12,51 +12,56 @@ export interface UserModel { name?: string } -export type UseApiOptions> = Pick, 'data'> & - Partial, 'data'>> +export type UseApiOptions> = Partial, 'data'>> -export function useApiGetUsers(options: UseApiOptions>) { +export function useApiGetUsers(data: D, options: UseApiOptions>) { return useAxle({ + data, url: '/user/list-user', runner: axle.get, ...options, }) } -export function useApiGetUser(options: UseApiOptions>) { +export function useApiGetUser(data: D, options?: UseApiOptions>) { return useAxle({ + data, url: '/user/get-user', runner: axle.get, ...options, }) } -export function useApiAddUser(options: UseApiOptions>) { +export function useApiAddUser(data: D, options?: UseApiOptions>) { return useAxle({ + data, url: '/user/add-user', runner: axle.postJSON, ...options, }) } -export function useApiDeleteUser(options: UseApiOptions>) { +export function useApiDeleteUser(data: D, options?: UseApiOptions>) { return useAxle({ + data, url: '/user/delete-user', runner: axle.delete, ...options, }) } -export function useApiUpdateUser(options: UseApiOptions>) { +export function useApiUpdateUser(data: D, options?: UseApiOptions>) { return useAxle({ + data, url: '/user/update-user', runner: axle.putJSON, ...options, }) } -export function useApiPatchUser(options: UseApiOptions>) { +export function useApiPatchUser(data: D, options?: UseApiOptions>) { return useAxle({ + data, url: '/user/patch-user', runner: axle.patchJSON, ...options, diff --git a/playground/src/request/index.ts b/playground/src/request/index.ts index e1deb42..bde02af 100644 --- a/playground/src/request/index.ts +++ b/playground/src/request/index.ts @@ -5,15 +5,24 @@ const axle = createAxle({ baseURL: '/api', }) -const useAxle = createUseAxle() +const useAxle = createUseAxle({ + onTransform: (response) => response.data +}) axle.axios.interceptors.response.use( (response) => { - if (response.status === 200) { - return response.data + const { status, data } = response + + if (status !== 200) { + Snackbar.error(data.message) + return data + } + + if (data.code !== 200) { + Snackbar(data.message) } - Snackbar.error(response.data.message) + return data }, (error) => { Snackbar.error(error.message) diff --git a/src/use.ts b/src/use.ts index 10837ea..ff02bda 100644 --- a/src/use.ts +++ b/src/use.ts @@ -17,18 +17,28 @@ export interface UseAxleOptions> { config?: AxleRequestConfig immediate?: boolean onBefore?(): void - onSuccess?(response: UnwrapRef, prev: UnwrapRef): UnwrapRef + onAfter?(): void + onTransform?(response: UnwrapRef, prev: UnwrapRef): UnwrapRef + onSuccess?(response: UnwrapRef): void onError?(error: Error, prev: Error | undefined): Error } export type UseAxleReturn = [ data: Ref>, run: Run, - loading: Ref>, - extra: { error: Ref> } + extra: { + loading: Ref> + error: Ref> + } ] -export function createUseAxle() { +export interface CreateUseAxleOptions { + onTransform?(response: any, prev: any): any +} + +export function createUseAxle(options: CreateUseAxleOptions = {}) { + const { onTransform: defaultOnTransform } = options + const useAxle = >( options: UseAxleOptions ): UseAxleReturn => { @@ -40,7 +50,9 @@ export function createUseAxle() { params: initialParams, config: initialConfig, onBefore = () => {}, - onSuccess = (response) => response as unknown as UnwrapRef, + onAfter = () => {}, + onTransform = (defaultOnTransform as UseAxleOptions['onTransform']) ?? ((response) => response as unknown as UnwrapRef), + onSuccess = () => {}, onError = (error) => error, } = options const initialUrl = url @@ -57,18 +69,22 @@ export function createUseAxle() { return runner(url, options.params, options.config) .then((response) => { - data.value = onSuccess(response as UnwrapRef, data.value) + data.value = onTransform(response as UnwrapRef, data.value) error.value = undefined - loading.value = false + + onSuccess(response as UnwrapRef) return data.value }) .catch((responseError) => { error.value = onError(responseError, error.value) - loading.value = false throw responseError }) + .finally(() => { + loading.value = false + onAfter() + }) } if (immediate) { @@ -82,8 +98,8 @@ export function createUseAxle() { return [ data, run, - loading, { + loading, error, }, ]