useApi.ts 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import { http } from '~/utils/request'
  2. /**
  3. * API composable for making HTTP requests
  4. * Provides reactive state management for API calls
  5. */
  6. export const useApi = () => {
  7. const loading = ref(false)
  8. const error = ref<string | null>(null)
  9. /**
  10. * Wrapper for making API requests with loading state
  11. */
  12. const request = async <T = unknown>(
  13. requestFn: () => Promise<T>,
  14. ): Promise<T | null> => {
  15. loading.value = true
  16. error.value = null
  17. try {
  18. const result = await requestFn()
  19. return result
  20. }
  21. catch (err: unknown) {
  22. const message = err instanceof Error ? err.message : 'Request failed'
  23. error.value = message
  24. console.error('API request error:', err)
  25. return null
  26. }
  27. finally {
  28. loading.value = false
  29. }
  30. }
  31. /**
  32. * GET request with loading state
  33. */
  34. const get = async <T = unknown>(
  35. url: string,
  36. params?: unknown,
  37. ): Promise<T | null> => {
  38. return request(() => http.get<T>(url, params))
  39. }
  40. /**
  41. * POST request with loading state
  42. */
  43. const post = async <T = unknown>(
  44. url: string,
  45. data?: unknown,
  46. ): Promise<T | null> => {
  47. return request(() => http.post<T>(url, data))
  48. }
  49. /**
  50. * PUT request with loading state
  51. */
  52. const put = async <T = unknown>(
  53. url: string,
  54. data?: unknown,
  55. ): Promise<T | null> => {
  56. return request(() => http.put<T>(url, data))
  57. }
  58. /**
  59. * DELETE request with loading state
  60. */
  61. const del = async <T = unknown>(
  62. url: string,
  63. params?: unknown,
  64. ): Promise<T | null> => {
  65. return request(() => http.delete<T>(url, params))
  66. }
  67. /**
  68. * PATCH request with loading state
  69. */
  70. const patch = async <T = unknown>(
  71. url: string,
  72. data?: unknown,
  73. ): Promise<T | null> => {
  74. return request(() => http.patch<T>(url, data))
  75. }
  76. return {
  77. loading: readonly(loading),
  78. error: readonly(error),
  79. request,
  80. get,
  81. post,
  82. put,
  83. delete: del,
  84. patch,
  85. }
  86. }