use-response-handle.ts 1.9 KB

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