chargeStationService.tsx 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492
  1. import axios from 'axios';
  2. import { Alert } from 'react-native';
  3. import * as SecureStore from 'expo-secure-store';
  4. import { EXPO_PUBLIC_API_URL } from '@env';
  5. import { forgetPasswordFormData } from '../types/signup';
  6. import { CustomerData } from '../types/signUpFormData';
  7. class ChargeStationService {
  8. private apiUrl: string;
  9. constructor() {
  10. this.apiUrl = EXPO_PUBLIC_API_URL;
  11. if (!this.apiUrl) {
  12. throw new Error('API URL is not defined in environment variables');
  13. }
  14. }
  15. async fetchCarBrand() {
  16. try {
  17. const response = await axios.get(`${this.apiUrl}/public/client/car/brand`);
  18. if (response.status === 200 || response.status === 201) {
  19. return response.data;
  20. } else {
  21. console.log('invalid response');
  22. }
  23. } catch (error) {
  24. if (axios.isAxiosError(error)) {
  25. console.error('error:', error.response?.data?.message || error.message);
  26. } else {
  27. console.error('An unexpected error occurred:', error);
  28. }
  29. return false;
  30. }
  31. }
  32. async getCarImage(filename: string) {
  33. try {
  34. const response = await axios.get(`${this.apiUrl}/public/image?filename=${filename}`);
  35. if (response.status === 200 || response.status === 201) {
  36. // console.log(response.data.data);
  37. return response.url;
  38. } else {
  39. console.log('invalid response');
  40. }
  41. } catch (error) {
  42. console.log(error);
  43. }
  44. }
  45. async getUserCars() {
  46. try {
  47. const response = await axios.get(`${this.apiUrl}/clients/customer/car/all`, {
  48. headers: {
  49. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  50. }
  51. });
  52. if (response.status === 200 || response.status === 201) {
  53. // console.log(response.data.data);
  54. return response.data;
  55. } else {
  56. console.log('invalid response');
  57. }
  58. } catch (error) {
  59. console.log(error);
  60. }
  61. }
  62. async getUserDefaultCars() {
  63. try {
  64. const response = await axios.get(`${this.apiUrl}/clients/customer/car/all?queryDefault=true`, {
  65. headers: {
  66. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  67. }
  68. });
  69. if (response.status === 200 || response.status === 201) {
  70. // console.log(response.data.data);
  71. return response.data;
  72. } else {
  73. console.log('invalid response');
  74. }
  75. } catch (error) {
  76. console.log(error);
  77. }
  78. }
  79. async addCar(licensePlate: string, carBrandFk: string, carTypeFk: string, isDefault: boolean) {
  80. try {
  81. const response = await axios.post(
  82. `${this.apiUrl}/clients/customer/car`,
  83. {
  84. licensePlate: licensePlate,
  85. carBrandFk: carBrandFk,
  86. carTypeFk: carTypeFk,
  87. isDefault: isDefault
  88. },
  89. {
  90. headers: {
  91. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  92. }
  93. }
  94. );
  95. if (response.status === 200 || response.status === 201) {
  96. console.log('add car successful');
  97. return true;
  98. } else {
  99. console.log('invalid response');
  100. }
  101. } catch (error) {
  102. if (axios.isAxiosError(error)) {
  103. console.error('error:', error.response?.data?.message || error.message);
  104. } else {
  105. console.error('An unexpected error occurred:', error);
  106. }
  107. return false;
  108. }
  109. }
  110. async deleteCar(carID) {
  111. try {
  112. // console.log('i receive this carID', carID);
  113. const response = await axios.delete(`${this.apiUrl}/clients/customer/car?carId=${carID}`, {
  114. headers: {
  115. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  116. }
  117. });
  118. // console.log('Full response:', JSON.stringify(response, null, 2));
  119. if (response.status === 200 || response.status === 201) {
  120. console.log('delete car successful');
  121. return true;
  122. } else {
  123. console.log('invalid response');
  124. }
  125. } catch (error) {
  126. console.log(error);
  127. }
  128. }
  129. async setDefaultCar(carID) {
  130. try {
  131. const response = await axios.put(
  132. `${this.apiUrl}/clients/customer/car/default?carId=${carID}`,
  133. {},
  134. {
  135. headers: {
  136. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  137. }
  138. }
  139. );
  140. if (response.status === 200 || response.status === 201) {
  141. console.log('set default car successful');
  142. return true;
  143. } else {
  144. console.log('invalid response');
  145. }
  146. } catch (error) {
  147. console.log(error);
  148. }
  149. }
  150. async fetchPriceForCharging() {
  151. try {
  152. const response = await axios.get(`${this.apiUrl}/clients/chargestations/resources/info`, {
  153. headers: {
  154. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  155. }
  156. });
  157. if (response.status === 200 || response.status === 201) {
  158. return response.data;
  159. }
  160. } catch (error) {
  161. console.log(error);
  162. }
  163. }
  164. async getCurrentPrice() {
  165. try {
  166. const response = await axios.get(`${this.apiUrl}/clients/promotion/price?id=2405311022116801000`);
  167. if (response.status === 200 || response.status === 201) {
  168. return response.data.originalPrice;
  169. } else {
  170. throw new Error(`Unexpected response status: ${response.status}`);
  171. }
  172. } catch (error) {
  173. console.error('Error getting current price:', error);
  174. if (axios.isAxiosError(error)) {
  175. console.error('Response data:', error.response?.data);
  176. console.error('Response status:', error.response?.status);
  177. }
  178. throw error; // Re-throw the error for the caller to handle
  179. }
  180. }
  181. async fetchAvailableConnectors(stationID: string) {
  182. try {
  183. const response = await axios.get(
  184. `${this.apiUrl}/clients/chargestations/resources/status?StationIDs=${stationID}`,
  185. {
  186. headers: {
  187. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  188. }
  189. }
  190. );
  191. if (response.status === 200 || response.status === 201) {
  192. const stationStatusInfos = response.data.data.StationStatusInfos;
  193. if (stationStatusInfos && stationStatusInfos.length > 0) {
  194. const availableConnectors = stationStatusInfos[0].ConnectorStatusInfos.filter(
  195. (connector) => connector.Status === 2
  196. ).length;
  197. return availableConnectors;
  198. }
  199. return 0;
  200. }
  201. } catch (error) {
  202. console.log(error);
  203. return 0;
  204. }
  205. }
  206. async fetchChargeStations() {
  207. try {
  208. const response = await axios.get(`${this.apiUrl}/clients/chargestations/resources/info`, {
  209. headers: {
  210. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  211. }
  212. });
  213. if (response.status === 200 || response.status === 201) {
  214. return response.data.data.map((station, index) => {
  215. const { Address, StationName, StationID, StationLng, StationLat } = station.snapshot;
  216. return {
  217. Address,
  218. StationName,
  219. StationID,
  220. StationLng,
  221. StationLat
  222. };
  223. });
  224. } else {
  225. console.log('invalid response');
  226. }
  227. } catch (error) {
  228. if (axios.isAxiosError(error)) {
  229. console.error('Login error:', error.response?.data?.message || error.message);
  230. } else {
  231. console.error('An unexpected error occurred:', error);
  232. }
  233. return false;
  234. }
  235. }
  236. async fetchAllChargeStations() {
  237. try {
  238. const response = await axios.get(`${this.apiUrl}/clients/chargestations/resources/info`, {
  239. headers: {
  240. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  241. }
  242. });
  243. if (response.status === 200 || response.status === 201) {
  244. return response.data.data;
  245. } else {
  246. console.log('invalid response');
  247. }
  248. } catch (error) {
  249. if (axios.isAxiosError(error)) {
  250. console.error('Login error:', error.response?.data?.message || error.message);
  251. } else {
  252. console.error('An unexpected error occurred:', error);
  253. }
  254. return false;
  255. }
  256. }
  257. async fetchChargeStationPrice(stationID: string) {
  258. try {
  259. const response = await axios.get(`${this.apiUrl}/clients/promotion/price?id=${stationID}`);
  260. if (response.status === 200 || response.status === 201) {
  261. return response.data.originalPrice;
  262. } else {
  263. console.log('invalid response');
  264. }
  265. } catch (error) {
  266. if (axios.isAxiosError(error)) {
  267. console.error('Login error:', error.response?.data?.message || error.message);
  268. } else {
  269. console.error('An unexpected error occurred:', error);
  270. }
  271. return false;
  272. }
  273. }
  274. async fetchAvailableDates(stationID: string) {
  275. try {
  276. const response = await axios.get(`${this.apiUrl}/clients/reservation/connectors/${stationID}`, {
  277. headers: {
  278. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  279. }
  280. });
  281. if (response.status === 200 || response.status === 201) {
  282. const dates = response.data.map((i) => i.date);
  283. return dates;
  284. } else {
  285. console.log('invalid response');
  286. }
  287. } catch (error) {
  288. if (axios.isAxiosError(error)) {
  289. console.error('Login error:', error.response?.data?.message || error.message);
  290. } else {
  291. console.error('An unexpected error occurred:', error);
  292. }
  293. return false;
  294. }
  295. }
  296. async fetchAvailableTimeSlots(stationID: string, targetDate: string) {
  297. try {
  298. const response = await axios.get(`${this.apiUrl}/clients/reservation/connectors/${stationID}`, {
  299. headers: {
  300. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  301. }
  302. });
  303. if (response.status === 200 || response.status === 201) {
  304. const times = response.data.find((i) => i.date === targetDate);
  305. if (times) {
  306. const availableTimeSlots = times.range.map((i) => i.start);
  307. return availableTimeSlots;
  308. }
  309. } else {
  310. console.log('invalid response');
  311. }
  312. } catch (error) {
  313. if (axios.isAxiosError(error)) {
  314. console.error('Login error:', error.response?.data?.message || error.message);
  315. } else {
  316. console.error('An unexpected error occurred:', error);
  317. }
  318. return false;
  319. }
  320. }
  321. async fetchSpecificChargeStation(stationID: string) {
  322. try {
  323. const response = await axios.get(`${this.apiUrl}/clients/reservation/connectors/${stationID}`, {
  324. headers: {
  325. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  326. }
  327. });
  328. if (response.status === 200 || response.status === 201) {
  329. return response.data;
  330. } else {
  331. console.log('invalid response');
  332. }
  333. } catch (error) {
  334. console.log(error);
  335. }
  336. }
  337. async fetchOngoingChargingData(format_order_id: string) {
  338. try {
  339. const response = await axios.get(
  340. `${this.apiUrl}/clients/chargestations/resources/equip/status?StartChargeSeq=${format_order_id}`,
  341. {
  342. headers: {
  343. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  344. }
  345. }
  346. );
  347. if (response.status === 200 || response.status === 201) {
  348. console.log('received data from fetchOngoingChargingData at chargingStationService', response.data);
  349. return response.data;
  350. } else {
  351. console.log('invalid response');
  352. }
  353. } catch (error) {
  354. console.log(error);
  355. }
  356. }
  357. async fetchReservationHistories() {
  358. try {
  359. const response = await axios.get(`${this.apiUrl}/clients/reservation/all`, {
  360. headers: {
  361. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  362. }
  363. });
  364. if (response.status === 200 || response.status === 201) {
  365. // console.log(response.data);
  366. return response.data;
  367. } else {
  368. console.log('invalid response');
  369. }
  370. } catch (error) {
  371. console.log(error);
  372. }
  373. }
  374. async startCharging(payload: {
  375. StartChargeSeq: string;
  376. ConnectorID: string;
  377. StopBy: number;
  378. StopValue: number;
  379. StartBalance: number;
  380. }) {
  381. try {
  382. const response = await axios.put(`${this.apiUrl}/clients/chargestations/resources/charge/start`, payload, {
  383. headers: {
  384. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  385. }
  386. });
  387. if (response.status === 200 || response.status === 201) {
  388. return response.data;
  389. } else {
  390. console.log('invalid response');
  391. }
  392. } catch (error) {
  393. console.log(error);
  394. }
  395. }
  396. async stopCharging(payload: { StartChargeSeq: string; ConnectorID: string }) {
  397. try {
  398. console.log('stpo charge initialized');
  399. const response = await axios.put(`${this.apiUrl}/clients/chargestations/resources/charge/stop`, payload, {
  400. headers: {
  401. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  402. }
  403. });
  404. if (response.status === 200 || response.status === 201) {
  405. console.log('stopCharging success', response);
  406. return response.data;
  407. } else {
  408. console.log('stopCharging fail', response);
  409. }
  410. } catch (error) {
  411. console.log('stopCharging fail here error ', error);
  412. }
  413. }
  414. async getTodayReservation() {
  415. try {
  416. const response = await axios.get(`${this.apiUrl}/clients/reservation/today`, {
  417. headers: {
  418. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  419. }
  420. });
  421. if (response.status === 200 || response.status === 201) {
  422. // console.log('getTodayReservation response.data: ', response.data);
  423. return response.data;
  424. } else {
  425. console.log('invalid response');
  426. }
  427. } catch (error) {
  428. console.log(error);
  429. }
  430. }
  431. async getProcessedImageUrl(filename: string) {
  432. try {
  433. const response = await axios.get(`${this.apiUrl}/public/image?filename=${filename}`, {
  434. // const response = await axios.get(`${this.apiUrl}/public/image?filename=BENZ-EQA.png`, {
  435. headers: {
  436. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  437. }
  438. });
  439. if (response.status === 200 || response.status === 201) {
  440. // console.log('i am getProcessedImageUrl s resposne', response.data.url);
  441. return response.data.url;
  442. }
  443. } catch (error) {
  444. console.error('Error fetching image URL:', error);
  445. return null;
  446. }
  447. }
  448. async getProcessedCarImageUrl(filename: string) {
  449. try {
  450. const response = await axios.get(`http://ftp.hkmgt.com/cdn/public/file/crazycharge/${filename}`, {
  451. headers: {
  452. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  453. }
  454. });
  455. if (response.status === 200 || response.status === 201) {
  456. return response.data.detail;
  457. }
  458. } catch (error) {
  459. console.error('Error fetching image URL:', error);
  460. return null;
  461. }
  462. }
  463. }
  464. export const chargeStationService = new ChargeStationService();