useAsync.ts 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import { ref, reactive, unref } from "vue";
  2. import { ElMessage } from "element-plus";
  3. import { useNav } from "/@/layout/hooks/nav";
  4. import { IDataType } from "/@/api/types";
  5. type Params = {
  6. code: number;
  7. message: string;
  8. handler: () => void;
  9. };
  10. export function useResponseHandle() {
  11. const { logout } = useNav();
  12. function responseHandle({ code, message, handler }: Params) {
  13. const c = Number(code);
  14. if (c === 1) {
  15. handler();
  16. } else if (c >= 100 && c <= 140) {
  17. logout();
  18. } else {
  19. ElMessage.error(message);
  20. }
  21. }
  22. return responseHandle;
  23. }
  24. export function useAsync<D = any>({
  25. initalData,
  26. initalPagination,
  27. isList = false,
  28. success
  29. }: {
  30. initalData?: D;
  31. isList?: boolean;
  32. initalPagination?: any;
  33. success?: (data?: D) => void;
  34. } = {}) {
  35. const data = ref<D>(initalData);
  36. const isError = ref(false);
  37. const loading = ref(false);
  38. const pagination = reactive(initalPagination || {});
  39. const responseHandle = useResponseHandle();
  40. const setData = (_data: D) => (data.value = _data as any);
  41. const setloading = (_state: boolean) => (loading.value = _state);
  42. function getPaginationParams() {
  43. const { pageSize: size, currentPage: page } = pagination;
  44. return {
  45. size,
  46. page
  47. };
  48. }
  49. function run(promise: Promise<IDataType<D>>) {
  50. setloading(true);
  51. return promise.then(response => {
  52. setloading(false);
  53. const { code: _code, message, data } = response;
  54. if (String(_code) !== "0") isError.value = true;
  55. responseHandle({
  56. code: _code,
  57. message,
  58. handler: () => {
  59. setData(isList ? (data as any).list : data);
  60. isError.value = false;
  61. if (pagination && data && data.count) pagination.total = (data as any).count;
  62. success && success(unref(data));
  63. }
  64. });
  65. });
  66. }
  67. return {
  68. run,
  69. data,
  70. setData,
  71. loading,
  72. isError,
  73. setloading,
  74. pagination,
  75. getPaginationParams
  76. };
  77. }