66 lines
2.2 KiB
JavaScript
66 lines
2.2 KiB
JavaScript
import axios from 'axios';
|
|
|
|
// Cookie-based auth (Google OAuth2 session), so send credentials with each call.
|
|
const api = axios.create({ baseURL: '/api/v1', withCredentials: true });
|
|
|
|
api.interceptors.response.use(
|
|
(r) => r,
|
|
(err) => {
|
|
if (err.response?.status === 401) {
|
|
// Not signed in. Send the user to the public landing page (unless already
|
|
// there) so they can read the features and choose to log in.
|
|
if (window.location.pathname !== '/') window.location.href = '/';
|
|
}
|
|
return Promise.reject(err);
|
|
}
|
|
);
|
|
|
|
// Top-level navigation that starts the Google flow and returns to the app.
|
|
export const LOGIN_URL = '/api/v1/auth/login?returnUrl=/app';
|
|
|
|
export const AppApi = {
|
|
info: () => api.get('/app/info').then((r) => r.data)
|
|
};
|
|
|
|
export const AuthApi = {
|
|
me: () => api.get('/auth/me').then((r) => r.data),
|
|
logout: () => api.post('/auth/logout')
|
|
};
|
|
|
|
export const SyncApi = {
|
|
status: () => api.get('/sync/status').then((r) => r.data),
|
|
full: () => api.post('/sync/full'),
|
|
incremental: () => api.post('/sync/incremental')
|
|
};
|
|
|
|
export const AnalyticsApi = {
|
|
dashboard: () => api.get('/analytics/dashboard').then((r) => r.data),
|
|
health: () => api.get('/analytics/health').then((r) => r.data),
|
|
topSenders: (take = 20) => api.get(`/analytics/top-senders?take=${take}`).then((r) => r.data),
|
|
volume: (days = 90) => api.get(`/analytics/volume?days=${days}`).then((r) => r.data),
|
|
heatmap: () => api.get('/analytics/heatmap').then((r) => r.data),
|
|
attachments: () => api.get('/analytics/attachments').then((r) => r.data)
|
|
};
|
|
|
|
export const CleanupApi = {
|
|
preview: (req) => api.post('/cleanup/preview', req).then((r) => r.data),
|
|
execute: (req) => api.post('/cleanup/execute', req).then((r) => r.data)
|
|
};
|
|
|
|
export const UnsubscribeApi = {
|
|
detect: () => api.post('/unsubscribe/detect'),
|
|
safeList: () => api.get('/unsubscribe/safe-list').then((r) => r.data),
|
|
process: (req) => api.post('/unsubscribe/process', req).then((r) => r.data)
|
|
};
|
|
|
|
export const LayoutApi = {
|
|
get: () => api.get('/widgetlayout').then((r) => r.data),
|
|
save: (layout) => api.put('/widgetlayout', layout)
|
|
};
|
|
|
|
export const ExportApi = {
|
|
reportUrl: (format) => `/api/v1/export/report?format=${format}`
|
|
};
|
|
|
|
export default api;
|