useTransports.ts 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. import { useState, useEffect } from "react";
  2. import { api } from "@/api/api";
  3. import type { PaginatedResponse } from "@/api/api";
  4. import type { Transport } from "@/types/TransportType";
  5. export const useTransports = () => {
  6. const [transports, setTransports] = useState<Transport[]>([]);
  7. const [loading, setLoading] = useState(false);
  8. const [error, setError] = useState<string | null>(null);
  9. const [page, setPage] = useState(0);
  10. const [size, setSize] = useState(10);
  11. const [totalCount, setTotalCount] = useState(0);
  12. const [totalPages, setTotalPages] = useState(0);
  13. const fetchTransports = async () => {
  14. setLoading(true);
  15. setError(null);
  16. try {
  17. const response = await api.getAllTransports();
  18. setTransports(response.data || []);
  19. } catch (err: unknown) {
  20. const errorMessage =
  21. err instanceof Error
  22. ? err.message
  23. : "Nie udało się pobrać listy pojazdów";
  24. setError(errorMessage);
  25. console.error("Error fetching transports:", err);
  26. } finally {
  27. setLoading(false);
  28. }
  29. };
  30. const fetchTransportsPaged = async (newPage: number = 0, newSize: number = 10) => {
  31. setLoading(true);
  32. setError(null);
  33. try {
  34. const response = await api.getAllTransportsPaged(newPage, newSize);
  35. const data = response.data as PaginatedResponse<Transport>;
  36. setTransports(data.content || []);
  37. setPage(data.page);
  38. setSize(data.size);
  39. setTotalCount(data.totalElements);
  40. setTotalPages(data.totalPages);
  41. } catch (err: unknown) {
  42. const errorMessage =
  43. err instanceof Error
  44. ? err.message
  45. : "Nie udało się pobrać listy pojazdów";
  46. setError(errorMessage);
  47. console.error("Error fetching transports:", err);
  48. } finally {
  49. setLoading(false);
  50. }
  51. };
  52. const searchTransports = async (query: string = "", newPage: number = 0, newSize: number = 10) => {
  53. setLoading(true);
  54. setError(null);
  55. try {
  56. const response = await api.searchTransports(query, newPage, newSize);
  57. const data = response.data as PaginatedResponse<Transport>;
  58. setTransports(data.content || []);
  59. setPage(data.page);
  60. setSize(data.size);
  61. setTotalCount(data.totalElements);
  62. setTotalPages(data.totalPages);
  63. } catch (err: unknown) {
  64. const errorMessage =
  65. err instanceof Error
  66. ? err.message
  67. : "Nie udało się wyszukać pojazdów";
  68. setError(errorMessage);
  69. console.error("Error searching transports:", err);
  70. } finally {
  71. setLoading(false);
  72. }
  73. };
  74. useEffect(() => {
  75. fetchTransportsPaged(0, size);
  76. }, [size]);
  77. const createTransport = async (transportData: any): Promise<any> => {
  78. try {
  79. const response = await api.createTransport(transportData);
  80. await fetchTransportsPaged(page, size);
  81. return { success: true, data: response.data };
  82. } catch (err: unknown) {
  83. // Sprawdzaj czy błąd ma fieldErrors z serwera
  84. if (err instanceof Error) {
  85. const errorData = (err as any).response?.data;
  86. if (errorData?.fieldErrors) {
  87. return {
  88. success: false,
  89. error: errorData.message || "Błąd walidacji",
  90. fieldErrors: errorData.fieldErrors
  91. };
  92. }
  93. }
  94. const errorMessage =
  95. err instanceof Error
  96. ? err.message
  97. : "Nie udało się utworzyć pojazdu";
  98. console.error("Error creating transport:", err);
  99. return { success: false, error: errorMessage };
  100. }
  101. };
  102. const updateTransport = async (id: string, transportData: any): Promise<any> => {
  103. try {
  104. const response = await api.updateTransport(id, transportData);
  105. await fetchTransportsPaged(page, size);
  106. return { success: true, data: response.data };
  107. } catch (err: unknown) {
  108. // Sprawdzaj czy błąd ma fieldErrors z serwera
  109. if (err instanceof Error) {
  110. const errorData = (err as any).response?.data;
  111. if (errorData?.fieldErrors) {
  112. return {
  113. success: false,
  114. error: errorData.message || "Błąd walidacji",
  115. fieldErrors: errorData.fieldErrors
  116. };
  117. }
  118. }
  119. const errorMessage =
  120. err instanceof Error
  121. ? err.message
  122. : "Nie udało się zaktualizować pojazdu";
  123. console.error("Error updating transport:", err);
  124. return { success: false, error: errorMessage };
  125. }
  126. };
  127. const deleteTransport = async (id: string) => {
  128. try {
  129. await api.deleteTransport(id);
  130. await fetchTransportsPaged(page, size);
  131. return { success: true };
  132. } catch (err: unknown) {
  133. const errorMessage =
  134. err instanceof Error
  135. ? err.message
  136. : "Nie udało się usunąć pojazdu";
  137. console.error("Error deleting transport:", err);
  138. return { success: false, error: errorMessage };
  139. }
  140. };
  141. const assignCourier = async (transportId: string, courierId: string) => {
  142. try {
  143. await api.assignTransportToCourier(transportId, courierId);
  144. await fetchTransportsPaged(page, size);
  145. return { success: true };
  146. } catch (err: unknown) {
  147. const errorMessage =
  148. err instanceof Error
  149. ? err.message
  150. : "Nie udało się przypisać kuriera do pojazdu";
  151. console.error("Error assigning courier:", err);
  152. return { success: false, error: errorMessage };
  153. }
  154. };
  155. const unassignCourier = async (transportId: string) => {
  156. try {
  157. await api.unassignTransport(transportId);
  158. await fetchTransportsPaged(page, size);
  159. return { success: true };
  160. } catch (err: unknown) {
  161. const errorMessage =
  162. err instanceof Error
  163. ? err.message
  164. : "Nie udało się odznączyć kuriera";
  165. console.error("Error unassigning courier:", err);
  166. return { success: false, error: errorMessage };
  167. }
  168. };
  169. const handlePageChange = (newPage: number) => {
  170. fetchTransportsPaged(newPage, size);
  171. };
  172. const handleSizeChange = (newSize: number) => {
  173. setSize(newSize);
  174. };
  175. return {
  176. transports,
  177. loading,
  178. error,
  179. page,
  180. size,
  181. totalCount,
  182. totalPages,
  183. fetchTransports,
  184. fetchTransportsPaged,
  185. searchTransports,
  186. createTransport,
  187. updateTransport,
  188. deleteTransport,
  189. assignCourier,
  190. unassignCourier,
  191. handlePageChange,
  192. handleSizeChange,
  193. };
  194. };