import { t } from '@lingui/macro';
import { notifications, showNotification } from '@mantine/notifications';
import { IconCheck } from '@tabler/icons-react';
import axios from 'axios';
import { api } from '../App';
import { ApiPaths } from '../enums/ApiEndpoints';
import { apiUrl, useServerApiState } from '../states/ApiState';
import { useLocalState } from '../states/LocalState';
import { useSessionState } from '../states/SessionState';
import {
useGlobalSettingsState,
useUserSettingsState
} from '../states/SettingsState';
import { useUserState } from '../states/UserState';
export const doClassicLogin = async (username: string, password: string) => {
const { host } = useLocalState.getState();
// Get token from server
const token = await axios
.get(apiUrl(ApiPaths.user_token), {
auth: { username, password },
baseURL: host,
timeout: 2000,
params: {
name: 'inventree-web-app'
}
})
.then((response) => response.data.token)
.catch((error) => {
showNotification({
title: t`Login failed`,
message: t`Error fetching token from server.`,
color: 'red'
});
return false;
});
if (token === false) return token;
// log in with token
doTokenLogin(token);
return true;
};
/**
* Logout the user (invalidate auth token)
*/
export const doClassicLogout = async () => {
// Logout from the server session
await api.post(apiUrl(ApiPaths.user_logout));
// Set token in context
const { setToken } = useSessionState.getState();
setToken(undefined);
notifications.show({
title: t`Logout successful`,
message: t`See you soon.`,
color: 'green',
icon:
});
return true;
};
export const doSimpleLogin = async (email: string) => {
const { host } = useLocalState.getState();
const mail = await axios
.post(apiUrl(ApiPaths.user_simple_login), {
email: email
})
.then((response) => response.data)
.catch((_error) => {
return false;
});
return mail;
};
// Perform a login using a token
export const doTokenLogin = (token: string) => {
const { setToken } = useSessionState.getState();
const { fetchUserState } = useUserState.getState();
const { fetchServerApiState } = useServerApiState.getState();
const globalSettingsState = useGlobalSettingsState.getState();
const userSettingsState = useUserSettingsState.getState();
setToken(token);
fetchUserState();
fetchServerApiState();
globalSettingsState.fetchSettings();
userSettingsState.fetchSettings();
};
export function handleReset(navigate: any, values: { email: string }) {
api
.post(apiUrl(ApiPaths.user_reset), values, {
headers: { Authorization: '' }
})
.then((val) => {
if (val.status === 200) {
notifications.show({
title: t`Mail delivery successful`,
message: t`Check your inbox for a reset link. This only works if you have an account. Check in spam too.`,
color: 'green',
autoClose: false
});
navigate('/login');
} else {
notifications.show({
title: t`Reset failed`,
message: t`Check your input and try again.`,
color: 'red'
});
}
});
}
/**
* Check login state, and redirect the user as required
*/
export function checkLoginState(
navigate: any,
redirect?: string,
no_redirect?: boolean
) {
api
.get(apiUrl(ApiPaths.user_token), {
timeout: 2000,
params: {
name: 'inventree-web-app'
}
})
.then((val) => {
if (val.status === 200 && val.data.token) {
doTokenLogin(val.data.token);
notifications.show({
title: t`Already logged in`,
message: t`Found an existing login - using it to log you in.`,
color: 'green',
icon:
});
navigate(redirect ?? '/home');
} else {
navigate('/login');
}
})
.catch(() => {
if (!no_redirect) navigate('/login');
});
}