mirror of
https://github.com/directus/directus.git
synced 2026-02-02 10:25:05 -05:00
* Add note to public page * Add project chooser on public view * Optimize loading order So much nicer to use now Closes #298 * Fix the private project switcher too * Add transition to public view * Prevent project switching if youre already on that project * [WIP] Add reset password form * Add request password reset page * Add jwt-payload util * Install base-64 * Fix test typing * Add new errors to translations * Finish reset password flow * Fix foreground color on v-notice * Fix tests * Allow code in translateError + render project error translated on login * Remove wrong reference to error component * Render project key if name is unknown * Fix date-fns version * Fix tests
77 lines
2.0 KiB
TypeScript
77 lines
2.0 KiB
TypeScript
import axios, { AxiosRequestConfig, AxiosResponse, AxiosError } from 'axios';
|
|
import { useRequestsStore } from '@/stores/requests';
|
|
import { LogoutReason, logout, checkAuth } from '@/auth';
|
|
|
|
const api = axios.create({
|
|
baseURL: getRootPath(),
|
|
});
|
|
|
|
interface RequestConfig extends AxiosRequestConfig {
|
|
id: string;
|
|
}
|
|
|
|
interface Response extends AxiosResponse {
|
|
config: RequestConfig;
|
|
}
|
|
|
|
export interface RequestError extends AxiosError {
|
|
response: Response;
|
|
}
|
|
|
|
export const onRequest = (config: AxiosRequestConfig) => {
|
|
const requestsStore = useRequestsStore();
|
|
const id = requestsStore.startRequest();
|
|
|
|
const requestConfig: RequestConfig = {
|
|
id: id,
|
|
...config,
|
|
};
|
|
|
|
return requestConfig;
|
|
};
|
|
|
|
export const onResponse = (response: AxiosResponse | Response) => {
|
|
const requestsStore = useRequestsStore();
|
|
const id = (response.config as RequestConfig).id;
|
|
requestsStore.endRequest(id);
|
|
return response;
|
|
};
|
|
|
|
export const onError = async (error: RequestError) => {
|
|
const requestsStore = useRequestsStore();
|
|
const id = (error.response.config as RequestConfig).id;
|
|
requestsStore.endRequest(id);
|
|
|
|
// If a request fails with the unauthorized error, it either means that your user doesn't have
|
|
// access, or that your session doesn't exist / has expired.
|
|
// In case of the second, we should force the app to logout completely and redirect to the login
|
|
// view.
|
|
/* istanbul ignore next */
|
|
const status = error.response?.status;
|
|
/* istanbul ignore next */
|
|
const code = error.response?.data?.error?.code;
|
|
|
|
if (status === 401 && code === 3) {
|
|
const loggedIn = await checkAuth();
|
|
|
|
if (loggedIn === false) {
|
|
logout({ reason: LogoutReason.ERROR_SESSION_EXPIRED });
|
|
}
|
|
}
|
|
|
|
return Promise.reject(error);
|
|
};
|
|
|
|
api.interceptors.request.use(onRequest);
|
|
api.interceptors.response.use(onResponse, onError);
|
|
|
|
export function getRootPath(): string {
|
|
const path = window.location.pathname;
|
|
const parts = path.split('/');
|
|
const adminIndex = parts.indexOf('admin');
|
|
const rootPath = parts.slice(0, adminIndex).join('/') + '/';
|
|
return rootPath;
|
|
}
|
|
|
|
export default api;
|