@ethora/chat-component-rn 26.6.11 → 26.6.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +2 -2
  3. package/lib/commonjs/components/AuthForms/Login.js +2 -1
  4. package/lib/commonjs/components/AuthForms/Login.js.map +1 -1
  5. package/lib/commonjs/components/MainComponents/ChatHeader.js +4 -1
  6. package/lib/commonjs/components/MainComponents/ChatHeader.js.map +1 -1
  7. package/lib/commonjs/components/MainComponents/ChatWrapper.js +14 -13
  8. package/lib/commonjs/components/MainComponents/ChatWrapper.js.map +1 -1
  9. package/lib/commonjs/components/MainComponents/LoginWrapper.js +2 -1
  10. package/lib/commonjs/components/MainComponents/LoginWrapper.js.map +1 -1
  11. package/lib/commonjs/components/MainComponents/MediaMessage.js +18 -7
  12. package/lib/commonjs/components/MainComponents/MediaMessage.js.map +1 -1
  13. package/lib/commonjs/components/MessageBubble/InteractionsOverlay.js +1 -1
  14. package/lib/commonjs/components/MessageBubble/InteractionsOverlay.js.map +1 -1
  15. package/lib/commonjs/components/MessageBubble/Message.js +1 -1
  16. package/lib/commonjs/components/MessageBubble/Message.js.map +1 -1
  17. package/lib/commonjs/components/MessageBubble/MessageInteractions.js +1 -1
  18. package/lib/commonjs/components/MessageBubble/MessageInteractions.js.map +1 -1
  19. package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js +4 -1
  20. package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
  21. package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js +15 -11
  22. package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
  23. package/lib/commonjs/components/Modals/FilePreviewModal/GViewWebView.js +1 -1
  24. package/lib/commonjs/components/Modals/FilePreviewModal/GViewWebView.js.map +1 -1
  25. package/lib/commonjs/components/Modals/FilePreviewModal/PdfView.js +2 -1
  26. package/lib/commonjs/components/Modals/FilePreviewModal/PdfView.js.map +1 -1
  27. package/lib/commonjs/components/RoomComponents/ChatRoomItem.js +5 -1
  28. package/lib/commonjs/components/RoomComponents/ChatRoomItem.js.map +1 -1
  29. package/lib/commonjs/components/RoomComponents/styled/LastMessageFile.js +10 -2
  30. package/lib/commonjs/components/RoomComponents/styled/LastMessageFile.js.map +1 -1
  31. package/lib/commonjs/components/RoomComponents/styled/LastMessagePhoto.js +4 -1
  32. package/lib/commonjs/components/RoomComponents/styled/LastMessagePhoto.js.map +1 -1
  33. package/lib/commonjs/components/RoomComponents/styled/LastMessageVideo.js +4 -1
  34. package/lib/commonjs/components/RoomComponents/styled/LastMessageVideo.js.map +1 -1
  35. package/lib/commonjs/components/VideoCalls/VideoCallSession.js +6 -3
  36. package/lib/commonjs/components/VideoCalls/VideoCallSession.js.map +1 -1
  37. package/lib/commonjs/components/styled/AudioMessage.js +2 -1
  38. package/lib/commonjs/components/styled/AudioMessage.js.map +1 -1
  39. package/lib/commonjs/components/styled/MediaFilePreview.js +1 -1
  40. package/lib/commonjs/components/styled/MediaFilePreview.js.map +1 -1
  41. package/lib/commonjs/components/styled/MessageImage.js +34 -8
  42. package/lib/commonjs/components/styled/MessageImage.js.map +1 -1
  43. package/lib/commonjs/components/styled/VideoMessage.js +36 -64
  44. package/lib/commonjs/components/styled/VideoMessage.js.map +1 -1
  45. package/lib/commonjs/context/xmppProvider.js +44 -18
  46. package/lib/commonjs/context/xmppProvider.js.map +1 -1
  47. package/lib/commonjs/helpers/initXmppRooms.js +5 -1
  48. package/lib/commonjs/helpers/initXmppRooms.js.map +1 -1
  49. package/lib/commonjs/helpers/resolveInitBeforeLoadUser.js +126 -12
  50. package/lib/commonjs/helpers/resolveInitBeforeLoadUser.js.map +1 -1
  51. package/lib/commonjs/helpers/secureFileUrl.js +101 -0
  52. package/lib/commonjs/helpers/secureFileUrl.js.map +1 -0
  53. package/lib/commonjs/hooks/useChatWrapperInit.js +3 -3
  54. package/lib/commonjs/hooks/useChatWrapperInit.js.map +1 -1
  55. package/lib/commonjs/hooks/useFileToken.js +10 -0
  56. package/lib/commonjs/hooks/useFileToken.js.map +1 -0
  57. package/lib/commonjs/hooks/useSendMessage.js +23 -13
  58. package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
  59. package/lib/commonjs/main.js +25 -0
  60. package/lib/commonjs/main.js.map +1 -1
  61. package/lib/commonjs/networking/api-requests/auth.api.js +99 -54
  62. package/lib/commonjs/networking/api-requests/auth.api.js.map +1 -1
  63. package/lib/commonjs/networking/api-requests/roomMembers.api.js +1 -1
  64. package/lib/commonjs/networking/api-requests/roomMembers.api.js.map +1 -1
  65. package/lib/commonjs/networking/api-requests/rooms.api.js +9 -9
  66. package/lib/commonjs/networking/api-requests/rooms.api.js.map +1 -1
  67. package/lib/commonjs/networking/api-requests/user.api.js +9 -9
  68. package/lib/commonjs/networking/api-requests/user.api.js.map +1 -1
  69. package/lib/commonjs/networking/apiClient.js +62 -112
  70. package/lib/commonjs/networking/apiClient.js.map +1 -1
  71. package/lib/commonjs/networking/authRefresh.js +323 -0
  72. package/lib/commonjs/networking/authRefresh.js.map +1 -0
  73. package/lib/commonjs/networking/xmppClient.js +33 -5
  74. package/lib/commonjs/networking/xmppClient.js.map +1 -1
  75. package/lib/commonjs/roomStore/chatSettingsSlice.js +20 -2
  76. package/lib/commonjs/roomStore/chatSettingsSlice.js.map +1 -1
  77. package/lib/module/components/AuthForms/Login.js +2 -1
  78. package/lib/module/components/AuthForms/Login.js.map +1 -1
  79. package/lib/module/components/MainComponents/ChatHeader.js +4 -1
  80. package/lib/module/components/MainComponents/ChatHeader.js.map +1 -1
  81. package/lib/module/components/MainComponents/ChatWrapper.js +14 -13
  82. package/lib/module/components/MainComponents/ChatWrapper.js.map +1 -1
  83. package/lib/module/components/MainComponents/LoginWrapper.js +2 -1
  84. package/lib/module/components/MainComponents/LoginWrapper.js.map +1 -1
  85. package/lib/module/components/MainComponents/MediaMessage.js +18 -7
  86. package/lib/module/components/MainComponents/MediaMessage.js.map +1 -1
  87. package/lib/module/components/MessageBubble/InteractionsOverlay.js +1 -1
  88. package/lib/module/components/MessageBubble/InteractionsOverlay.js.map +1 -1
  89. package/lib/module/components/MessageBubble/Message.js +1 -1
  90. package/lib/module/components/MessageBubble/Message.js.map +1 -1
  91. package/lib/module/components/MessageBubble/MessageInteractions.js +1 -1
  92. package/lib/module/components/MessageBubble/MessageInteractions.js.map +1 -1
  93. package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js +4 -1
  94. package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
  95. package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js +15 -11
  96. package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
  97. package/lib/module/components/Modals/FilePreviewModal/GViewWebView.js +1 -1
  98. package/lib/module/components/Modals/FilePreviewModal/GViewWebView.js.map +1 -1
  99. package/lib/module/components/Modals/FilePreviewModal/PdfView.js +2 -1
  100. package/lib/module/components/Modals/FilePreviewModal/PdfView.js.map +1 -1
  101. package/lib/module/components/RoomComponents/ChatRoomItem.js +5 -1
  102. package/lib/module/components/RoomComponents/ChatRoomItem.js.map +1 -1
  103. package/lib/module/components/RoomComponents/styled/LastMessageFile.js +10 -2
  104. package/lib/module/components/RoomComponents/styled/LastMessageFile.js.map +1 -1
  105. package/lib/module/components/RoomComponents/styled/LastMessagePhoto.js +4 -1
  106. package/lib/module/components/RoomComponents/styled/LastMessagePhoto.js.map +1 -1
  107. package/lib/module/components/RoomComponents/styled/LastMessageVideo.js +4 -1
  108. package/lib/module/components/RoomComponents/styled/LastMessageVideo.js.map +1 -1
  109. package/lib/module/components/VideoCalls/VideoCallSession.js +6 -3
  110. package/lib/module/components/VideoCalls/VideoCallSession.js.map +1 -1
  111. package/lib/module/components/styled/AudioMessage.js +2 -1
  112. package/lib/module/components/styled/AudioMessage.js.map +1 -1
  113. package/lib/module/components/styled/MediaFilePreview.js +1 -1
  114. package/lib/module/components/styled/MediaFilePreview.js.map +1 -1
  115. package/lib/module/components/styled/MessageImage.js +34 -8
  116. package/lib/module/components/styled/MessageImage.js.map +1 -1
  117. package/lib/module/components/styled/VideoMessage.js +36 -64
  118. package/lib/module/components/styled/VideoMessage.js.map +1 -1
  119. package/lib/module/context/xmppProvider.js +43 -18
  120. package/lib/module/context/xmppProvider.js.map +1 -1
  121. package/lib/module/helpers/initXmppRooms.js +5 -1
  122. package/lib/module/helpers/initXmppRooms.js.map +1 -1
  123. package/lib/module/helpers/resolveInitBeforeLoadUser.js +126 -11
  124. package/lib/module/helpers/resolveInitBeforeLoadUser.js.map +1 -1
  125. package/lib/module/helpers/secureFileUrl.js +91 -0
  126. package/lib/module/helpers/secureFileUrl.js.map +1 -0
  127. package/lib/module/hooks/useChatWrapperInit.js +3 -3
  128. package/lib/module/hooks/useChatWrapperInit.js.map +1 -1
  129. package/lib/module/hooks/useFileToken.js +5 -0
  130. package/lib/module/hooks/useFileToken.js.map +1 -0
  131. package/lib/module/hooks/useSendMessage.js +24 -14
  132. package/lib/module/hooks/useSendMessage.js.map +1 -1
  133. package/lib/module/main.js +12 -1
  134. package/lib/module/main.js.map +1 -1
  135. package/lib/module/networking/api-requests/auth.api.js +96 -53
  136. package/lib/module/networking/api-requests/auth.api.js.map +1 -1
  137. package/lib/module/networking/api-requests/roomMembers.api.js +1 -1
  138. package/lib/module/networking/api-requests/roomMembers.api.js.map +1 -1
  139. package/lib/module/networking/api-requests/rooms.api.js +9 -9
  140. package/lib/module/networking/api-requests/rooms.api.js.map +1 -1
  141. package/lib/module/networking/api-requests/user.api.js +8 -7
  142. package/lib/module/networking/api-requests/user.api.js.map +1 -1
  143. package/lib/module/networking/apiClient.js +61 -113
  144. package/lib/module/networking/apiClient.js.map +1 -1
  145. package/lib/module/networking/authRefresh.js +312 -0
  146. package/lib/module/networking/authRefresh.js.map +1 -0
  147. package/lib/module/networking/xmppClient.js +33 -5
  148. package/lib/module/networking/xmppClient.js.map +1 -1
  149. package/lib/module/roomStore/chatSettingsSlice.js +20 -2
  150. package/lib/module/roomStore/chatSettingsSlice.js.map +1 -1
  151. package/lib/typescript/components/AuthForms/Login.d.ts.map +1 -1
  152. package/lib/typescript/components/MainComponents/ChatHeader.d.ts.map +1 -1
  153. package/lib/typescript/components/MainComponents/ChatWrapper.d.ts.map +1 -1
  154. package/lib/typescript/components/MainComponents/LoginWrapper.d.ts.map +1 -1
  155. package/lib/typescript/components/MainComponents/MediaMessage.d.ts.map +1 -1
  156. package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts.map +1 -1
  157. package/lib/typescript/components/Modals/FilePreviewModal/FilePreviewModal.d.ts.map +1 -1
  158. package/lib/typescript/components/Modals/FilePreviewModal/PdfView.d.ts.map +1 -1
  159. package/lib/typescript/components/RoomComponents/ChatRoomItem.d.ts.map +1 -1
  160. package/lib/typescript/components/RoomComponents/styled/LastMessageFile.d.ts.map +1 -1
  161. package/lib/typescript/components/RoomComponents/styled/LastMessagePhoto.d.ts.map +1 -1
  162. package/lib/typescript/components/RoomComponents/styled/LastMessageVideo.d.ts.map +1 -1
  163. package/lib/typescript/components/VideoCalls/VideoCallSession.d.ts.map +1 -1
  164. package/lib/typescript/components/styled/AudioMessage.d.ts.map +1 -1
  165. package/lib/typescript/components/styled/MessageImage.d.ts +8 -0
  166. package/lib/typescript/components/styled/MessageImage.d.ts.map +1 -1
  167. package/lib/typescript/components/styled/VideoMessage.d.ts.map +1 -1
  168. package/lib/typescript/context/xmppProvider.d.ts.map +1 -1
  169. package/lib/typescript/helpers/initXmppRooms.d.ts.map +1 -1
  170. package/lib/typescript/helpers/resolveInitBeforeLoadUser.d.ts.map +1 -1
  171. package/lib/typescript/helpers/secureFileUrl.d.ts +7 -0
  172. package/lib/typescript/helpers/secureFileUrl.d.ts.map +1 -0
  173. package/lib/typescript/hooks/useCustomTypingIndicator.d.ts +16 -4
  174. package/lib/typescript/hooks/useCustomTypingIndicator.d.ts.map +1 -1
  175. package/lib/typescript/hooks/useFileToken.d.ts +2 -0
  176. package/lib/typescript/hooks/useFileToken.d.ts.map +1 -0
  177. package/lib/typescript/hooks/useSendMessage.d.ts.map +1 -1
  178. package/lib/typescript/main.d.ts +6 -1
  179. package/lib/typescript/main.d.ts.map +1 -1
  180. package/lib/typescript/networking/api-requests/auth.api.d.ts +3 -27
  181. package/lib/typescript/networking/api-requests/auth.api.d.ts.map +1 -1
  182. package/lib/typescript/networking/api-requests/user.api.d.ts.map +1 -1
  183. package/lib/typescript/networking/apiClient.d.ts +12 -6
  184. package/lib/typescript/networking/apiClient.d.ts.map +1 -1
  185. package/lib/typescript/networking/authRefresh.d.ts +92 -0
  186. package/lib/typescript/networking/authRefresh.d.ts.map +1 -0
  187. package/lib/typescript/networking/xmppClient.d.ts +6 -0
  188. package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
  189. package/lib/typescript/roomStore/chatSettingsSlice.d.ts +16 -0
  190. package/lib/typescript/roomStore/chatSettingsSlice.d.ts.map +1 -1
  191. package/lib/typescript/types/types.d.ts +17 -0
  192. package/lib/typescript/types/types.d.ts.map +1 -1
  193. package/package.json +29 -28
  194. package/src/components/AuthForms/Login.tsx +1 -0
  195. package/src/components/MainComponents/ChatHeader.tsx +4 -1
  196. package/src/components/MainComponents/ChatWrapper.tsx +14 -19
  197. package/src/components/MainComponents/LoginWrapper.tsx +1 -0
  198. package/src/components/MainComponents/MediaMessage.tsx +15 -5
  199. package/src/components/MessageBubble/InteractionsOverlay.tsx +1 -1
  200. package/src/components/MessageBubble/Message.tsx +1 -1
  201. package/src/components/MessageBubble/MessageInteractions.tsx +1 -1
  202. package/src/components/Modals/ChatProfileModal/ChatProfileModal.tsx +4 -1
  203. package/src/components/Modals/FilePreviewModal/FilePreviewModal.tsx +14 -10
  204. package/src/components/Modals/FilePreviewModal/GViewWebView.tsx +1 -1
  205. package/src/components/Modals/FilePreviewModal/PdfView.tsx +2 -1
  206. package/src/components/RoomComponents/ChatRoomItem.tsx +9 -1
  207. package/src/components/RoomComponents/styled/LastMessageFile.tsx +14 -2
  208. package/src/components/RoomComponents/styled/LastMessagePhoto.tsx +4 -1
  209. package/src/components/RoomComponents/styled/LastMessageVideo.tsx +4 -1
  210. package/src/components/VideoCalls/VideoCallSession.tsx +8 -3
  211. package/src/components/styled/AudioMessage.tsx +2 -1
  212. package/src/components/styled/MediaFilePreview.tsx +1 -1
  213. package/src/components/styled/MessageImage.tsx +45 -6
  214. package/src/components/styled/VideoMessage.tsx +36 -60
  215. package/src/context/xmppProvider.tsx +45 -20
  216. package/src/helpers/initXmppRooms.tsx +5 -1
  217. package/src/helpers/resolveInitBeforeLoadUser.ts +123 -11
  218. package/src/helpers/secureFileUrl.ts +103 -0
  219. package/src/hooks/useChatWrapperInit.ts +3 -3
  220. package/src/hooks/useFileToken.ts +7 -0
  221. package/src/hooks/useSendMessage.tsx +28 -13
  222. package/src/main.ts +22 -1
  223. package/src/networking/api-requests/auth.api.ts +125 -52
  224. package/src/networking/api-requests/roomMembers.api.ts +1 -1
  225. package/src/networking/api-requests/rooms.api.ts +9 -9
  226. package/src/networking/api-requests/user.api.ts +8 -7
  227. package/src/networking/apiClient.ts +68 -123
  228. package/src/networking/authRefresh.ts +435 -0
  229. package/src/networking/xmppClient.ts +37 -5
  230. package/src/roomStore/chatSettingsSlice.ts +28 -3
  231. package/src/types/types.ts +17 -0
@@ -1,4 +1,5 @@
1
1
  import http from '../apiClient';
2
+ import { normalizeApiPath } from '../apiClient';
2
3
  import { store } from '../../roomStore';
3
4
  import { User } from '../../types/types';
4
5
 
@@ -10,7 +11,7 @@ interface GetMyUserOptions {
10
11
  export async function getMyUser(options?: GetMyUserOptions): Promise<User> {
11
12
  const token =
12
13
  options?.token || store.getState().chatSettingStore.user.token || '';
13
- const endpoint = options?.endpoint || '/users/my';
14
+ const endpoint = normalizeApiPath(options?.endpoint) || '/v1/users/my';
14
15
 
15
16
  const response = await http.get(endpoint, {
16
17
  headers: { Authorization: token },
@@ -24,7 +25,7 @@ export async function getMyUser(options?: GetMyUserOptions): Promise<User> {
24
25
 
25
26
  export function getDocuments(walletAddress: string) {
26
27
  const token = store.getState().chatSettingStore.user.token || '';
27
- return http.get(`/docs/${walletAddress}`, {
28
+ return http.get(`/v1/docs/${walletAddress}`, {
28
29
  headers: {
29
30
  Authorization: `Bearer ${token}`,
30
31
  },
@@ -33,7 +34,7 @@ export function getDocuments(walletAddress: string) {
33
34
 
34
35
  export function getExportMyData() {
35
36
  const token = store.getState().chatSettingStore.user.token || '';
36
- return http.get('/users/exportData', {
37
+ return http.get('/v1/users/exportData', {
37
38
  headers: {
38
39
  Authorization: token,
39
40
  responseType: 'arraybuffer',
@@ -43,7 +44,7 @@ export function getExportMyData() {
43
44
 
44
45
  export function deleteDocument(fileId: string) {
45
46
  const token = store.getState().chatSettingStore.user.token || '';
46
- return http.delete(`/files/${fileId}`, {
47
+ return http.delete(`/v1/files/${fileId}`, {
47
48
  headers: {
48
49
  Authorization: token,
49
50
  },
@@ -51,18 +52,18 @@ export function deleteDocument(fileId: string) {
51
52
  }
52
53
 
53
54
  export function deleteMe() {
54
- return http.delete('/users');
55
+ return http.delete('/v1/users');
55
56
  }
56
57
 
57
58
  export function updateMe(data: any) {
58
- return http.put('/users', data);
59
+ return http.put('/v1/users', data);
59
60
  }
60
61
 
61
62
  export async function updateProfile(fd: FormData): Promise<{ user: User }> {
62
63
  const token = store.getState().chatSettingStore.user.token || '';
63
64
 
64
65
  try {
65
- const response = await http.put('/users', fd, {
66
+ const response = await http.put('/v1/users', fd, {
66
67
  headers: {
67
68
  Authorization: token,
68
69
  'Content-Type': 'multipart/form-data',
@@ -1,8 +1,13 @@
1
1
  import axios from 'axios';
2
2
  import { store } from '../roomStore';
3
3
 
4
- import { logout, refreshTokens } from '../roomStore/chatSettingsSlice';
4
+ import { logout } from '../roomStore/chatSettingsSlice';
5
5
  import { installAxiosCapture } from '../utils/devLogger';
6
+ import {
7
+ refreshAuthTokens,
8
+ isRefreshFatalError,
9
+ RefreshResult,
10
+ } from './authRefresh';
6
11
 
7
12
  // Per product-code-policy: no compiled-in Ethora endpoints or tokens.
8
13
  // Consumers must call `setBaseURL(baseUrl, appToken)` (or pass
@@ -21,10 +26,21 @@ const http = axios.create({
21
26
  // `http` instance.
22
27
  installAxiosCapture(http);
23
28
 
29
+ const stripApiVersion = (baseUrl: string): string =>
30
+ baseUrl.replace(/\/+$/, '').replace(/\/v\d+$/, '');
31
+
32
+ export const normalizeApiPath = (path?: string): string | undefined => {
33
+ if (!path) {return path;}
34
+ if (/^https?:\/\//i.test(path)) {return path;}
35
+ if (/^\/v\d+\//.test(path)) {return path;}
36
+ return `/v1${path.startsWith('/') ? '' : '/'}${path}`;
37
+ };
38
+
24
39
  export function setBaseURL(baseUrl?: string, appToken?: string) {
25
- if (baseUrl && baseUrl !== currentBaseURL) {
26
- currentBaseURL = baseUrl;
27
- http.defaults.baseURL = baseUrl;
40
+ const normalized = baseUrl ? stripApiVersion(baseUrl) : baseUrl;
41
+ if (normalized && normalized !== currentBaseURL) {
42
+ currentBaseURL = normalized;
43
+ http.defaults.baseURL = normalized;
28
44
  }
29
45
  if (appToken && appToken !== currentAppToken) {
30
46
  currentAppToken = appToken;
@@ -39,149 +55,78 @@ export function getCurrentBaseURL() {
39
55
  return currentBaseURL;
40
56
  }
41
57
 
42
- export function refresh(): Promise<{
43
- data: { refreshToken: string; token: string };
44
- }> {
45
- return new Promise((resolve, reject) => {
46
- const user = store.getState().chatSettingStore.user;
47
- try {
48
- http
49
- .post(
50
- '/users/login/refresh',
51
- {},
52
- { headers: { Authorization: user.refreshToken } }
53
- )
54
- .then((response) => {
55
- store.dispatch(
56
- refreshTokens({
57
- token: response.data.token,
58
- refreshToken: response.data.refreshToken,
59
- })
60
- );
61
- // BUGFIX: previously the `.then` only dispatched and never
62
- // resolved, so every `await refresh()` callsite hung forever
63
- // on the happy path. Resolve with the axios response shape so
64
- // the interceptor can read `tokens.data.token` to retry.
65
- resolve(response);
66
- })
67
- .catch((error) => {
68
- reject(error);
69
- });
70
- } catch (error) {
71
- // BUGFIX: previously the outer-try catch dispatched logout but
72
- // never rejected, so a synchronous throw from `http.post` (e.g.
73
- // a bad URL) would hang the promise. Reject explicitly.
74
- console.log('errr');
75
- store.dispatch(logout());
76
- reject(error);
77
- }
78
- });
58
+ /**
59
+ * @deprecated Import `refreshAuthTokens` from `./authRefresh` instead.
60
+ *
61
+ * Kept as a thin forwarder so existing call sites keep working while
62
+ * they migrate. Declared as a function (not `const refresh =
63
+ * refreshAuthTokens`) on purpose: this module and `authRefresh` import
64
+ * each other, and a const would capture the binding before the other
65
+ * module finished evaluating.
66
+ */
67
+ export function refresh(): Promise<RefreshResult> {
68
+ return refreshAuthTokens();
79
69
  }
80
70
 
81
- let isRefreshing = false;
82
- let failedQueue: any[] = [];
83
-
84
- const addRequestToQueue = (config: any) => {
85
- return new Promise((resolve, reject) => {
86
- failedQueue.push({ resolve, reject, config });
87
- });
88
- };
89
-
90
- const processQueue = (newAccessToken: string) => {
91
- for (const request of failedQueue) {
92
- if (newAccessToken) {
93
- request.config.headers.Authorization = newAccessToken;
94
- }
95
-
96
- request.resolve(http(request.config));
97
- }
98
-
99
- failedQueue = [];
100
- };
101
-
102
71
  http.interceptors.response.use(
103
72
  (response) => response,
104
73
  async (error) => {
105
- // BUGFIX: the original condition was `if (!enabled)` — inverted, so
106
- // turning `refreshTokens.enabled: true` actually DISABLED the refresh
107
- // path on 401. Use the correct sense.
108
- if (!store.getState().chatSettingStore?.config?.refreshTokens?.enabled) {
109
- // BUGFIX: previously this branch fell off the end of the async
110
- // function and returned `undefined`, which axios treats as a
111
- // resolved-with-undefined response. Callers expecting an error
112
- // got `undefined` instead, silently swallowing every failure
113
- // when the refresh path isn't configured. Re-reject so the
114
- // original error reaches the caller.
115
- return Promise.reject(error);
116
- }
117
-
118
74
  const originalRequest = error.config;
119
75
  const status = error.response?.status;
120
76
 
121
77
  // Refresh paths only fire on 401. Anything else passes through.
122
- if (!error.response || status !== 401) {
78
+ if (!error.response || status !== 401 || !originalRequest) {
123
79
  return Promise.reject(error);
124
80
  }
125
81
 
82
+ // Never retry twice, and never touch the auth endpoints themselves —
83
+ // both would recurse. (`_retry` was set but never checked before,
84
+ // so a request could bounce between 401 and replay indefinitely.)
126
85
  if (
127
- store.getState().chatSettingStore?.config?.refreshTokens?.refreshFunction
86
+ originalRequest._retry ||
87
+ originalRequest.url === '/v1/users/login/refresh' ||
88
+ originalRequest.url === '/v1/users/login'
128
89
  ) {
129
- // Consumer-supplied refresh function. Call it, dispatch the new
130
- // tokens, retry the original request.
131
- try {
132
- const fn = store.getState().chatSettingStore?.config?.refreshTokens?.refreshFunction;
133
- if (!fn) return Promise.reject(error);
134
- const result = await fn();
135
- const { refreshToken: newRefreshToken, accessToken } = result || { refreshToken: '', accessToken: '' };
136
- store.dispatch(
137
- refreshTokens({
138
- token: accessToken,
139
- refreshToken: newRefreshToken || '',
140
- })
141
- );
142
- // BUGFIX: previously this branch returned `undefined` after
143
- // dispatching, so the original request was never retried and
144
- // the caller resolved with undefined. Stamp the new token on
145
- // the original config and replay.
146
- if (originalRequest?.headers) {
147
- originalRequest.headers.Authorization = accessToken;
148
- }
149
- return http(originalRequest);
150
- } catch (refreshErr) {
151
- return Promise.reject(refreshErr);
152
- }
90
+ return Promise.reject(error);
153
91
  }
154
92
 
155
- // Built-in `/users/login/refresh` path. Skip if the failing request
156
- // IS the refresh / login itself — otherwise we'd loop forever.
157
- if (
158
- originalRequest.url === '/users/login/refresh' ||
159
- originalRequest.url === '/users/login'
160
- ) {
93
+ const refreshConfig =
94
+ store.getState().chatSettingStore?.config?.refreshTokens;
95
+
96
+ // BUGFIX (kept): the original condition here was inverted, so
97
+ // `refreshTokens.enabled: true` actually DISABLED the refresh path.
98
+ if (!refreshConfig?.enabled) {
161
99
  return Promise.reject(error);
162
100
  }
163
101
 
164
- originalRequest._retry = true;
165
-
166
- if (isRefreshing) {
167
- const retryOriginalRequest = addRequestToQueue(originalRequest);
168
- return retryOriginalRequest;
102
+ // Nothing to rotate with — reject rather than firing a doomed
103
+ // refresh that would look like a bad-token event to the backend.
104
+ const hasRefreshableSession = Boolean(
105
+ refreshConfig.refreshFunction ||
106
+ store.getState().chatSettingStore.user?.refreshToken
107
+ );
108
+ if (!hasRefreshableSession) {
109
+ return Promise.reject(error);
169
110
  }
170
111
 
171
- isRefreshing = true;
112
+ originalRequest._retry = true;
113
+
172
114
  try {
173
- const tokens = await refresh();
174
- // (was: console.log('tokens', tokens) — dumped the full response
175
- // incl. access/refresh/ws tokens on every refresh; removed.)
176
- isRefreshing = false;
177
- originalRequest.headers.Authorization = tokens.data.token;
178
- processQueue(tokens.data.token);
115
+ // One shared rotation for every 401 in flight — `refreshAuthTokens`
116
+ // dedupes internally, which replaces the old isRefreshing/
117
+ // failedQueue machinery entirely.
118
+ const tokens = await refreshAuthTokens();
119
+ originalRequest.headers = originalRequest.headers || {};
120
+ originalRequest.headers.Authorization = tokens.token;
179
121
  return http(originalRequest);
180
122
  } catch (refreshErr) {
181
- isRefreshing = false;
182
- // BUGFIX: previously this returned the error (resolving the
183
- // promise with the error as value) instead of rejecting, so
184
- // axios callers got the error as a "successful" response body.
123
+ // Only a genuinely dead session logs the user out. A network
124
+ // blip, a 5xx, or a REFRESH_IN_PROGRESS race must leave the
125
+ // session alone — logging out on those is exactly the mass-logout
126
+ // failure mode the new backend scheme would otherwise cause.
127
+ if (isRefreshFatalError(refreshErr)) {
128
+ store.dispatch(logout());
129
+ }
185
130
  return Promise.reject(refreshErr);
186
131
  }
187
132
  }