api.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import axios, { isAxiosError } from 'axios';
  2. import { hc } from 'hono/client'
  3. import type {
  4. AuthRoutes, UserRoutes, RoleRoutes, FileRoutes,
  5. AdvertisementRoutes, AdvertisementTypeRoutes, GoodsCategoryRoutes, GoodsRoutes,
  6. SupplierRoutes, MerchantRoutes,
  7. DeliveryAddressRoutes, OrderRoutes, OrderGoodsRoutes, OrderRefundRoutes, AdminAreaRoutes
  8. } from '@d8d/server';
  9. // 创建 axios 适配器
  10. const axiosFetch = async (url: RequestInfo | URL, init?: RequestInit) => {
  11. const requestHeaders: Record<string, string> = {};
  12. if (init?.headers instanceof Headers) {
  13. init.headers.forEach((value, key) => {
  14. requestHeaders[key] = value;
  15. })
  16. }
  17. const response = await axios.request({
  18. url: url.toString(),
  19. method: init?.method || 'GET',
  20. headers: requestHeaders,
  21. data: init?.body,
  22. }).catch((error) => {
  23. console.log('axiosFetch error', error)
  24. if (isAxiosError(error)) {
  25. return {
  26. status: error.response?.status,
  27. statusText: error.response?.statusText,
  28. data: error.response?.data,
  29. headers: error.response?.headers
  30. }
  31. }
  32. throw error;
  33. })
  34. const responseHeaders = new Headers();
  35. if (response.headers) {
  36. for (const [key, value] of Object.entries(response.headers)) {
  37. responseHeaders.set(key, value);
  38. }
  39. }
  40. // 处理204 No Content响应,不设置body
  41. const body = response.status === 204
  42. ? null
  43. : responseHeaders.get('content-type')?.includes('application/json')
  44. ? JSON.stringify(response.data)
  45. : response.data;
  46. return new Response(
  47. body,
  48. {
  49. status: response.status,
  50. statusText: response.statusText,
  51. headers: responseHeaders
  52. }
  53. )
  54. }
  55. // 创建客户端
  56. export const authClient = hc<AuthRoutes>('/', {
  57. fetch: axiosFetch,
  58. }).api.v1.auth
  59. export const userClient = hc<UserRoutes>('/', {
  60. fetch: axiosFetch,
  61. }).api.v1.users
  62. export const roleClient = hc<RoleRoutes>('/', {
  63. fetch: axiosFetch,
  64. }).api.v1.roles
  65. export const fileClient = hc<FileRoutes>('/', {
  66. fetch: axiosFetch,
  67. }).api.v1.files
  68. export const advertisementClient = hc<AdvertisementRoutes>('/', {
  69. fetch: axiosFetch,
  70. }).api.v1.advertisements
  71. export const advertisementTypeClient = hc<AdvertisementTypeRoutes>('/', {
  72. fetch: axiosFetch,
  73. }).api.v1['advertisement-types']
  74. export const goodsCategoryClient = hc<GoodsCategoryRoutes>('/', {
  75. fetch: axiosFetch,
  76. }).api.v1['goods-categories']
  77. export const goodsClient = hc<GoodsRoutes>('/', {
  78. fetch: axiosFetch,
  79. }).api.v1.goods
  80. export const supplierClient = hc<SupplierRoutes>('/', {
  81. fetch: axiosFetch,
  82. }).api.v1.suppliers
  83. export const merchantClient = hc<MerchantRoutes>('/', {
  84. fetch: axiosFetch,
  85. }).api.v1.merchants
  86. export const areaClient = hc<AdminAreaRoutes>('/', {
  87. fetch: axiosFetch,
  88. }).api.v1.admin.areas
  89. export const deliveryAddressClient = hc<DeliveryAddressRoutes>('/', {
  90. fetch: axiosFetch,
  91. }).api.v1['delivery-addresses']
  92. // 订单相关客户端
  93. export const orderClient = hc<OrderRoutes>('/', {
  94. fetch: axiosFetch,
  95. }).api.v1.orders
  96. export const orderGoodsClient = hc<OrderGoodsRoutes>('/', {
  97. fetch: axiosFetch,
  98. }).api.v1['orders-goods']
  99. export const orderRefundClient = hc<OrderRefundRoutes>('/', {
  100. fetch: axiosFetch,
  101. }).api.v1['orders-refund']