import { useRoute } from '@starpad/ui' import { useMutation } from '@vue/apollo-composable' import gql from 'graphql-tag' import { Route } from 'vue-router' import { onRouteRedirect } from '../util/router-redirect' export const STORAGE_PREVIOUS_ROUTE = 'starpad:sign-in:previous-route' export function savePreviousRoute (to: Route, from: Route) { if (typeof localStorage !== 'undefined' && !to.matched.some(m => m.meta.ignoreSignInRedirect)) { localStorage.setItem(STORAGE_PREVIOUS_ROUTE, to.query.route ? to.query.route.toString() : from.fullPath) } } export function getPreviousRoute (): string { if (typeof localStorage !== 'undefined') { return localStorage.getItem(STORAGE_PREVIOUS_ROUTE) } return null } export function useRestorePreSigninRoute () { const route = useRoute() onRouteRedirect('home', () => { if (typeof localStorage !== 'undefined') { const fullPath = getPreviousRoute() if (fullPath && route.value.fullPath !== fullPath) { localStorage.removeItem(STORAGE_PREVIOUS_ROUTE) return fullPath } } }) } export function useSignIn () { const signinMutation = useMutation(gql`mutation signin ($input: SignInWithPasswordInput!) { signInWithPassword (input: $input) { user { id name email avatar setupDone emailConfirmationNeeded } } }`, { update: (cache, { data: { signInWithPassword: resultData } }) => { const query = gql`query { currentUser { id name email avatar setupDone emailConfirmationNeeded } }` cache.writeQuery({ query, data: { currentUser: resultData.user, }, }) }, }) async function signin (input: { email: string, password: string }) { await signinMutation.mutate({ input, }) } return { signin, } } export function useForgotPassword () { const forgotPasswordMutation = useMutation(gql`mutation forgotPassword ($input: SendPasswordResetLinkInput!) { sendPasswordResetLink (input: $input) { success } }`) async function sendPasswordResetLink (input: { email: string }) { await forgotPasswordMutation.mutate({ input, }) } return { sendPasswordResetLink, } } export function useResetPassword () { const signinMutation = useMutation(gql`mutation resetPassword ($input: ResetPasswordInput!) { resetPassword (input: $input) { user { id name email avatar setupDone emailConfirmationNeeded } } }`, { update: (cache, { data: { resetPassword: resultData } }) => { const query = gql`query { currentUser { id name email avatar setupDone emailConfirmationNeeded } }` cache.writeQuery({ query, data: { currentUser: resultData.user, }, }) }, }) async function resetPassword (input: { email: string, token: string, password: string }) { await signinMutation.mutate({ input, }) } return { resetPassword, } }