authService.tsx 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  1. import axios, {isAxiosError} from 'axios';
  2. import { Alert } from 'react-native';
  3. import * as SecureStore from 'expo-secure-store';
  4. import { forgetPasswordFormData } from '../types/signup';
  5. import { CustomerData } from '../types/signUpFormData';
  6. import * as FileSystem from 'expo-file-system';
  7. import {apiClient} from './requets'
  8. class AuthenticationService {
  9. async emailLogin(username: string, password: string, isBinding?: boolean) {
  10. try {
  11. const response = await apiClient.instance.post('/public/client/customer/sign-in',
  12. {
  13. email: username,
  14. password: password,
  15. isBinding: isBinding,
  16. },
  17. {
  18. customConfig: {needAuth: false}
  19. },
  20. );
  21. if (response.status === 201) {
  22. const token = response.data.accessToken;
  23. await SecureStore.setItemAsync('accessToken', token);
  24. return true;
  25. } else {
  26. return false;
  27. }
  28. } catch (error) {
  29. if (isAxiosError(error)) {
  30. console.error('Login error:', error.response?.data?.message || error.message);
  31. } else {
  32. console.error('An unexpected error occurred:', error);
  33. }
  34. return false;
  35. }
  36. }
  37. async phoneLogin(username: string | null | undefined, password: string, isBinding?: boolean) {
  38. const response = await apiClient.instance.post(
  39. `/public/client/customer/phone/sign-in`,
  40. {
  41. phone: username,
  42. password: password,
  43. isBinding: isBinding,
  44. },
  45. {
  46. customConfig: {needAuth: false}
  47. }
  48. );
  49. if (response.status === 201) {
  50. const token = response.data.accessToken;
  51. await SecureStore.setItemAsync('accessToken', token);
  52. return true;
  53. } else {
  54. return false
  55. }
  56. }
  57. async logout() {
  58. await SecureStore.deleteItemAsync('accessToken');
  59. console.log('log out successfully, accessToken deleted');
  60. }
  61. async sendOtpToSignUpEmail(email: string) {
  62. try {
  63. const response = await apiClient.instance.post(
  64. `/public/client/customer/otp`,
  65. { email: email },
  66. );
  67. if (response.status === 200 || response.status === 201) {
  68. return true;
  69. } else {
  70. console.error('Failed to send OTP:', response.status);
  71. return false;
  72. }
  73. } catch (error) {
  74. if (isAxiosError(error)) {
  75. console.error('Error sending OTP:', error.response?.data?.message || error.message);
  76. } else {
  77. console.error('An unexpected error occurred while sending OTP:', error);
  78. }
  79. return false;
  80. }
  81. }
  82. async uploadUberImage(imageUri: string, customFileName: string) {
  83. try {
  84. const fileInfo = await FileSystem.getInfoAsync(imageUri);
  85. if (!fileInfo.exists) {
  86. throw new Error('File does not exist');
  87. }
  88. const fileExtension = imageUri ? imageUri.split('.').pop()?.toLowerCase() : undefined;
  89. const allowedExtensions = ['jpg', 'jpeg', 'png'];
  90. if (fileExtension && !allowedExtensions.includes(fileExtension)) {
  91. throw new Error('只接受jpg,jpeg,png格式的圖片');
  92. }
  93. const formData = new FormData();
  94. const fileName = customFileName || imageUri.split('/').pop();
  95. formData.append('file', {
  96. uri: imageUri,
  97. name: fileName,
  98. type: `image/${fileExtension}`
  99. } as any);
  100. const response = await apiClient.instance.post(`/clients/customer/image?type=uber`, formData, {
  101. headers: {
  102. accept: '*/*',
  103. 'Content-Type': 'multipart/form-data',
  104. }
  105. });
  106. console.log('Upload response:', response.data);
  107. return response.data;
  108. } catch (error) {
  109. console.error('Error uploading image:', error);
  110. throw error;
  111. }
  112. }
  113. async verifySignUpOtp(
  114. email: string,
  115. code: string,
  116. setScreen: React.Dispatch<React.SetStateAction<number>>,
  117. setError: React.Dispatch<React.SetStateAction<string>>
  118. ) {
  119. try {
  120. const response = await apiClient.instance.put(
  121. `/public/client/customer/otp`,
  122. { email, code },
  123. );
  124. if (response.status === 200) {
  125. console.log('OTP verified successfully');
  126. setScreen((currentScreenNumber: number) => currentScreenNumber + 1);
  127. return true;
  128. } else {
  129. console.error('OTP verification failed:', response.status);
  130. setError('OTP驗證碼錯誤');
  131. return false;
  132. }
  133. } catch (error) {
  134. if (isAxiosError(error)) {
  135. console.error('Error verifying OTP:', error.response?.data?.message || error.message);
  136. setError('發生意外錯誤,請確保您輸入的電子郵件正確,並再次確認您的OTP驗證碼是否正確。');
  137. } else {
  138. console.error('An unexpected error occurred while verifying OTP:', error);
  139. setError('發生意外錯誤,請稍後再試');
  140. }
  141. return false;
  142. }
  143. }
  144. async signUp(data: CustomerData) {
  145. try {
  146. const response = await apiClient.instance.post(`/public/client/customer`, data);
  147. if (response.status === 200 || response.status === 201) {
  148. return true;
  149. } else {
  150. console.error('Signup failed:', response.status);
  151. return false;
  152. }
  153. } catch (error) {
  154. if (isAxiosError(error)) {
  155. console.error('Error signing up:', error.response?.data?.message || error.message);
  156. } else {
  157. console.error('An unexpected error occurred while signing up:', error);
  158. }
  159. return false;
  160. }
  161. }
  162. async sendForgetPasswordOtp(email: string) {
  163. try {
  164. const response = await apiClient.instance.post(
  165. `/public/client/customer/pw/otp`,
  166. { email },
  167. );
  168. if (response.status === 200 || response.status === 201) {
  169. console.log('Forget password OTP sent successfully');
  170. return true;
  171. } else {
  172. console.error('Failed to send forget password OTP:', response.status);
  173. return false;
  174. }
  175. } catch (error) {
  176. if (isAxiosError(error)) {
  177. console.error('Error sending forget password OTP:', error.response?.data?.message || error.message);
  178. } else {
  179. console.error('An unexpected error occurred while sending forget password OTP:', error);
  180. }
  181. return false;
  182. }
  183. }
  184. async getVersion() {
  185. try {
  186. const response = await apiClient.instance.get(`/public/client/app/version`);
  187. return response.data.data;
  188. } catch (error) {
  189. console.error('Error getting version:', error);
  190. return null;
  191. }
  192. }
  193. async verifyingOtpForgetPassword(
  194. email: string,
  195. otp: string,
  196. setForgetPasswordFormData: React.Dispatch<React.SetStateAction<forgetPasswordFormData>>,
  197. setData: React.Dispatch<React.SetStateAction<string>>
  198. ) {
  199. try {
  200. const res = await apiClient.instance.put(`/public/client/customer/pw/otp`, {
  201. email: email,
  202. code: otp
  203. });
  204. const data = res.data;
  205. setData(data.msg);
  206. console.log(data.msg);
  207. setForgetPasswordFormData((prevFormData) => ({
  208. ...prevFormData,
  209. otpAuthCompleted: true
  210. }));
  211. return true;
  212. } catch (error) {
  213. console.error('Error', error);
  214. return false;
  215. }
  216. }
  217. async changePassword(confirmedNewPassword: string, token: string | null) {
  218. try {
  219. const res = await apiClient.instance.put(
  220. `/clients/customer/pw/forget`,
  221. { newPassword: confirmedNewPassword },
  222. {
  223. customConfig: { token }
  224. }
  225. );
  226. return true;
  227. } catch (error) {
  228. if (isAxiosError(error)) {
  229. console.error('Error changing password:', error.response?.data?.message || error.message);
  230. } else {
  231. console.error('An unexpected error occurred:', error);
  232. }
  233. }
  234. }
  235. async changeEmail(email: string | null, token: string | null): Promise<boolean> {
  236. try {
  237. const res = await apiClient.instance.put(
  238. `/clients/customer`,
  239. { email: email },
  240. {
  241. customConfig: { token }
  242. }
  243. );
  244. console.log('Change Name Successfully!');
  245. return true;
  246. } catch (error) {
  247. if (isAxiosError(error)) {
  248. console.error('Error changing name:', error.response?.data?.message);
  249. } else {
  250. console.error('An unexpected error occurred:', error);
  251. }
  252. return false;
  253. }
  254. }
  255. //BELOW CODES RELATE TO "changing account info (such as gender, name)"
  256. async changeName(name: string | null, token: string | null): Promise<boolean> {
  257. try {
  258. const res = await apiClient.instance.put(
  259. `/clients/customer`,
  260. { nickname: name },
  261. {
  262. customConfig: { token }
  263. }
  264. );
  265. console.log('Change Name Successfully!');
  266. return true;
  267. } catch (error) {
  268. if (isAxiosError(error)) {
  269. console.error('Error changing name:', error.response?.data?.message);
  270. } else {
  271. console.error('An unexpected error occurred:', error);
  272. }
  273. return false;
  274. }
  275. }
  276. async changeNotifySessionID(notifySessionID: string | null): Promise<boolean> {
  277. try {
  278. const res = await apiClient.instance.put(
  279. `/clients/customer`,
  280. { notify_session_id: notifySessionID }
  281. );
  282. if (res.data.status == 200) {
  283. console.log('Change notifySessionID Successfully!');
  284. return true;
  285. } else {
  286. console.log('Change notifySessionID Failed!');
  287. return false;
  288. }
  289. } catch (error) {
  290. if (isAxiosError(error)) {
  291. console.error('Error changing name:', error.response?.data?.message);
  292. } else {
  293. console.error('An unexpected error occurred:', error);
  294. }
  295. return false;
  296. }
  297. }
  298. async changePhone(phone: string | null, token: string | null): Promise<boolean> {
  299. try {
  300. const convertPhoneStringToNumber = Number(phone);
  301. const res = await apiClient.instance.put(
  302. `/clients/customer`,
  303. { phone: convertPhoneStringToNumber },
  304. {
  305. customConfig: { token }
  306. }
  307. );
  308. return true;
  309. } catch (error) {
  310. if (isAxiosError(error)) {
  311. console.error('Error changing phone:', error.response?.data?.message);
  312. } else {
  313. console.error('An unexpected error occurred:', error);
  314. }
  315. return false;
  316. }
  317. }
  318. async changeGender(gender: string | null, token: string | null): Promise<boolean> {
  319. try {
  320. const res = await apiClient.instance.put(
  321. `/clients/customer`,
  322. { gender: gender },
  323. {
  324. customConfig: { token }
  325. }
  326. );
  327. console.log('Change gender Successfully!');
  328. return true;
  329. } catch (error) {
  330. if (isAxiosError(error)) {
  331. console.error('Error changing gender:', error.response?.data?.message);
  332. } else {
  333. console.error('An unexpected error occurred:', error);
  334. }
  335. return false;
  336. }
  337. }
  338. async getUserInfo() {
  339. try {
  340. const response = await apiClient.instance.get(`/clients/customer`);
  341. if (response.status === 200 || response.status === 201) {
  342. return response;
  343. } else {
  344. console.log('invalid response');
  345. }
  346. } catch (error) {
  347. console.log(error);
  348. }
  349. }
  350. async deleteAccount(): Promise<boolean> {
  351. try {
  352. const response = await apiClient.instance.delete(`/clients/customer`);
  353. if (response.status === 200 || response.status === 201) {
  354. console.log('Account deleted successfully');
  355. return true;
  356. } else {
  357. console.error('Failed to delete account:', response.status);
  358. return false;
  359. }
  360. } catch (error) {
  361. if (isAxiosError(error)) {
  362. console.error('Error deleting account:', error.response?.data?.message || error.message);
  363. } else {
  364. console.error('An unexpected error occurred while deleting account:', error);
  365. }
  366. return false;
  367. }
  368. }
  369. async checkPhoneSame(phoneNumber: string) {
  370. try {
  371. console.log('being checkPhoneSame');
  372. const response = await apiClient.instance.post(
  373. `/clients/customer/binding/sms`,
  374. {
  375. phone: phoneNumber,
  376. type: 3
  377. }
  378. );
  379. const token = await SecureStore.getItemAsync('accessToken');
  380. console.log('accessToken', token);
  381. console.log('checkPhoneSame response', response.data);
  382. return response.data;
  383. } catch (error) {
  384. console.log(error);
  385. }
  386. }
  387. async confirmBindingPhone(phoneNumber: string, otp: string, notify_session_id: string) {
  388. try {
  389. const response = await apiClient.instance.put(
  390. `/public/client/customer/phone/otp`,
  391. {
  392. phone: phoneNumber,
  393. code: otp,
  394. notify_session_id: notify_session_id,
  395. type: 3
  396. },
  397. );
  398. console.log('confirmBindingPhone response', response.data);
  399. return response.data;
  400. } catch (error) {
  401. console.log(error);
  402. }
  403. }
  404. async verifyPhoneOtp(phoneNumber: string, otp: string, notify_session_id: string) {
  405. try {
  406. const response = await apiClient.instance.put(
  407. `/public/client/customer/phone/otp`,
  408. {
  409. phone: phoneNumber,
  410. code: otp,
  411. notify_session_id: notify_session_id
  412. },
  413. );
  414. return response.data;
  415. } catch (error) {
  416. if (isAxiosError(error)) {
  417. console.error('Error verifying phone OTP:', error.response?.data || error.message);
  418. throw error;
  419. } else {
  420. console.error('Unexpected error:', error);
  421. throw new Error('Failed to verify phone OTP');
  422. }
  423. }
  424. }
  425. async sendOtpToSignUpPhone(phone: string) {
  426. try {
  427. const response = await apiClient.instance.post(`/public/client/customer/phone/sms`, {
  428. phone: phone,
  429. type: 1
  430. });
  431. if (response.status === 200 || response.status === 201) {
  432. return true;
  433. } else {
  434. return false;
  435. }
  436. } catch (error) {
  437. console.log(error);
  438. }
  439. }
  440. }
  441. export const authenticationService = new AuthenticationService();