[V0.1 WORKING] Added chat, profile, & calendar screen implementations.

This commit is contained in:
c-d-p
2025-04-18 17:30:09 +02:00
parent bf7eb8275c
commit 8d884111fd
19 changed files with 613 additions and 181 deletions

View File

@@ -54,8 +54,8 @@ apiClient.interceptors.response.use(
async (error: AxiosError) => { // Explicitly type error as AxiosError
const originalRequest = error.config;
// Check if the error has a response object (i.e., server responded with error status)
if (error.response) {
// Check if the error has a response object AND an original request config
if (error.response && originalRequest) { // <-- Added check for originalRequest
// Server responded with an error status code (4xx, 5xx)
console.error('[API Client] Response Error Status:', error.response.status);
console.error('[API Client] Response Error Data:', error.response.data);
@@ -64,39 +64,58 @@ apiClient.interceptors.response.use(
if (error.response.status === 401) {
console.warn('[API Client] Unauthorized (401). Token might be expired or invalid.');
if (!originalRequest?._retry) {
originalRequest._retry = true; // Mark the request as retried to avoid infinite loops
if (originalRequest.url === '/auth/refresh') {
console.error('[API Client] Refresh token attempt failed with 401. Not retrying.');
// Clear token and reject without retry
if (Platform.OS === 'web') {
await AsyncStorage.removeItem(TOKEN_KEY);
} else {
await SecureStore.deleteItemAsync(TOKEN_KEY).catch(() => {}); // Ignore delete error
}
delete apiClient.defaults.headers.common['Authorization'];
return Promise.reject(error); // Reject immediately
}
// Proceed with refresh logic only if it wasn't the refresh endpoint that failed
// and if originalRequest exists (already checked above)
if (!originalRequest._retry) { // Now TS knows _retry exists due to declaration file
originalRequest._retry = true;
try {
console.log('[API Client] Attempting token refresh...');
const refreshResponse = await apiClient.post('/auth/refresh', {}, {
headers: {
'Content-Type': 'application/json',
'Content-Type': 'application/json',
},
});
if (refreshResponse.status === 200) {
const newToken = refreshResponse.data?.accessToken;
if (refreshResponse.status === 200) {
const newToken = refreshResponse.data?.access_token;
if (newToken) {
console.log('[API Client] Token refreshed successfully.');
console.log('[API Client] Token refreshed successfully.');
// Save the new token
if (Platform.OS === 'web') {
await AsyncStorage.setItem(TOKEN_KEY, newToken);
} else {
await SecureStore.setItemAsync(TOKEN_KEY, newToken);
}
// Save the new token
if (Platform.OS === 'web') {
await AsyncStorage.setItem(TOKEN_KEY, newToken);
} else {
await SecureStore.setItemAsync(TOKEN_KEY, newToken);
}
// Update the Authorization header for future requests
apiClient.defaults.headers.common['Authorization'] = `Bearer ${newToken}`;
// Safely update original request headers
if (originalRequest.headers) {
originalRequest.headers['Authorization'] = `Bearer ${newToken}`;
}
// Update the Authorization header for future requests
apiClient.defaults.headers.common['Authorization'] = `Bearer ${newToken}`;
originalRequest.headers['Authorization'] = `Bearer ${newToken}`;
// Retry the original request with the new token
return apiClient(originalRequest);
// Retry the original request (originalRequest is guaranteed to exist here)
return apiClient(originalRequest);
} else {
console.error('[API Client] Invalid token structure received during refresh:', refreshResponse.data);
throw new Error('Invalid token received from server.');
}
}
} catch (refreshError) {
} catch (refreshError: any) {
console.error('[API Client] Token refresh failed:', refreshError);
}
}