adapting website to extension

This commit is contained in:
Myzel394 2022-11-27 17:02:39 +01:00
parent 806786ceed
commit 330d04eca2
7 changed files with 31 additions and 19 deletions

View File

@ -10,7 +10,6 @@ import {getServerSettings} from "~/apis"
import {lightTheme} from "~/constants/themes" import {lightTheme} from "~/constants/themes"
import AliasDetailRoute from "~/routes/AliasDetailRoute" import AliasDetailRoute from "~/routes/AliasDetailRoute"
import AliasesRoute from "~/routes/AliasesRoute" import AliasesRoute from "~/routes/AliasesRoute"
import AuthContextProvider from "~/AuthContext/AuthContextProvider"
import AuthenticateRoute from "~/routes/AuthenticateRoute" import AuthenticateRoute from "~/routes/AuthenticateRoute"
import AuthenticatedRoute from "~/routes/AuthenticatedRoute" import AuthenticatedRoute from "~/routes/AuthenticatedRoute"
import CompleteAccountRoute from "~/routes/CompleteAccountRoute" import CompleteAccountRoute from "~/routes/CompleteAccountRoute"
@ -65,7 +64,6 @@ const router = createBrowserRouter([
{ {
path: "/", path: "/",
element: <AuthenticatedRoute />, element: <AuthenticatedRoute />,
loader: getServerSettings,
children: [ children: [
{ {
path: "/", path: "/",
@ -73,6 +71,7 @@ const router = createBrowserRouter([
}, },
{ {
path: "/aliases", path: "/aliases",
loader: getServerSettings,
element: <AliasesRoute />, element: <AliasesRoute />,
}, },
{ {
@ -89,6 +88,7 @@ const router = createBrowserRouter([
}, },
{ {
path: "/reports/:id", path: "/reports/:id",
loader: getServerSettings,
element: <ReportDetailRoute />, element: <ReportDetailRoute />,
}, },
{ {
@ -107,10 +107,8 @@ export default function App(): ReactElement {
<QueryClientProvider client={queryClient}> <QueryClientProvider client={queryClient}>
<ThemeProvider theme={lightTheme}> <ThemeProvider theme={lightTheme}>
<SnackbarProvider> <SnackbarProvider>
<AuthContextProvider> <CssBaseline />
<CssBaseline /> <RouterProvider router={router} />
<RouterProvider router={router} />
</AuthContextProvider>
</SnackbarProvider> </SnackbarProvider>
</ThemeProvider> </ThemeProvider>
</QueryClientProvider> </QueryClientProvider>

View File

@ -1,7 +1,8 @@
import {ReactElement, ReactNode, useCallback, useEffect, useMemo, useState} from "react" import {ReactElement, ReactNode, useCallback, useEffect, useMemo, useRef, useState} from "react"
import {useEvent, useLocalStorage} from "react-use" import {useEvent, useLocalStorage} from "react-use"
import {AxiosError} from "axios" import {AxiosError} from "axios"
import {decrypt, readMessage, readPrivateKey} from "openpgp" import {decrypt, readMessage, readPrivateKey} from "openpgp"
import {useNavigate} from "react-router-dom"
import {useMutation} from "@tanstack/react-query" import {useMutation} from "@tanstack/react-query"
@ -19,10 +20,12 @@ export interface AuthContextProviderProps {
} }
export default function AuthContextProvider({children}: AuthContextProviderProps): ReactElement { export default function AuthContextProvider({children}: AuthContextProviderProps): ReactElement {
const navigate = useNavigate()
const {mutateAsync: refresh} = useMutation<RefreshTokenResult, AxiosError, void>(refreshToken, { const {mutateAsync: refresh} = useMutation<RefreshTokenResult, AxiosError, void>(refreshToken, {
onError: () => logout(false), onError: () => logout(false),
}) })
const $enterPasswordAmount = useRef<number>(0)
const [askForPassword, setAskForPassword] = useState<boolean>(false) const [askForPassword, setAskForPassword] = useState<boolean>(false)
const [doNotAskForPassword, setDoNotAskForPassword] = useState<boolean>(false) const [doNotAskForPassword, setDoNotAskForPassword] = useState<boolean>(false)
@ -238,6 +241,14 @@ export default function AuthContextProvider({children}: AuthContextProviderProps
}, },
}), }),
) )
break
case "enter-password":
if ($enterPasswordAmount.current < 1) {
$enterPasswordAmount.current += 1
navigate("/enter-password")
}
break break
} }
}, },

View File

@ -1,7 +1,7 @@
import {ReactElement} from "react" import {ReactElement} from "react"
import {useTranslation} from "react-i18next" import {useTranslation} from "react-i18next"
import {TiCancel} from "react-icons/ti" import {TiCancel} from "react-icons/ti"
import {MdAccessTimeFilled, MdLock} from "react-icons/md" import {MdAccessTimeFilled, MdShield} from "react-icons/md"
import { import {
Alert, Alert,
@ -49,7 +49,7 @@ export default function PasswordShareConfirmationDialog({
<Button startIcon={<TiCancel />} onClick={() => onClose(true)}> <Button startIcon={<TiCancel />} onClick={() => onClose(true)}>
{t("components.passwordShareConfirmationDialog.doNotShare")} {t("components.passwordShareConfirmationDialog.doNotShare")}
</Button> </Button>
<Button color="error" onClick={onShare} startIcon={<MdLock />}> <Button color="error" onClick={onShare} startIcon={<MdShield />}>
{t("components.passwordShareConfirmationDialog.continueAction")} {t("components.passwordShareConfirmationDialog.continueAction")}
</Button> </Button>
</DialogActions> </DialogActions>

View File

@ -10,10 +10,15 @@ interface ExtensionKleckMessageUser {
type: "get-user" type: "get-user"
} }
interface ExtensionKleckMessageEnterPassword {
type: "enter-password"
}
export type ExtensionKleckMessage = export type ExtensionKleckMessage =
| ExtensionKleckMessagePasswordStatus | ExtensionKleckMessagePasswordStatus
| ExtensionKleckMessageAskForPassword | ExtensionKleckMessageAskForPassword
| ExtensionKleckMessageUser | ExtensionKleckMessageUser
| ExtensionKleckMessageEnterPassword
export type ExtensionKleckEvent = MessageEvent & { export type ExtensionKleckEvent = MessageEvent & {
detail: ExtensionKleckMessage detail: ExtensionKleckMessage

View File

@ -1,10 +1,9 @@
import {ReactElement, useContext, useRef, useState} from "react" import {ReactElement, useContext, useState} from "react"
import {MdArrowDropDown} from "react-icons/md" import {MdArrowDropDown} from "react-icons/md"
import {BsArrowClockwise} from "react-icons/bs" import {BsArrowClockwise} from "react-icons/bs"
import {FaPen} from "react-icons/fa" import {FaPen} from "react-icons/fa"
import {AxiosError} from "axios" import {AxiosError} from "axios"
import {useTranslation} from "react-i18next" import {useTranslation} from "react-i18next"
import {SnackbarKey} from "notistack"
import update from "immutability-helper" import update from "immutability-helper"
import { import {

View File

@ -1,16 +1,14 @@
import * as yup from "yup" import * as yup from "yup"
import {useFormik} from "formik" import {useFormik} from "formik"
import {MdCheckCircle, MdChevronRight, MdLock} from "react-icons/md" import {MdCheckCircle, MdLock} from "react-icons/md"
import {generateKey, readKey} from "openpgp" import {generateKey, readKey} from "openpgp"
import {AxiosError} from "axios" import {AxiosError} from "axios"
import {useTranslation} from "react-i18next" import {useTranslation} from "react-i18next"
import {Box, InputAdornment} from "@mui/material"
import {useMutation} from "@tanstack/react-query"
import React, {ReactElement, useContext, useMemo} from "react" import React, {ReactElement, useContext, useMemo} from "react"
import passwordGenerator from "secure-random-password" import passwordGenerator from "secure-random-password"
import {LoadingButton} from "@mui/lab"
import {Box, Grid, InputAdornment, Typography} from "@mui/material"
import {useMutation} from "@tanstack/react-query"
import {PasswordField, SimpleForm} from "~/components" import {PasswordField, SimpleForm} from "~/components"
import {buildEncryptionPassword, encryptString} from "~/utils" import {buildEncryptionPassword, encryptString} from "~/utils"
import {isDev} from "~/constants/development" import {isDev} from "~/constants/development"
@ -117,7 +115,7 @@ export default function PasswordForm({onDone}: PasswordFormProps): ReactElement
}) })
return ( return (
<Box width="80vw"> <Box maxWidth="80vw">
<form onSubmit={formik.handleSubmit}> <form onSubmit={formik.handleSubmit}>
<SimpleForm <SimpleForm
title={t("routes.CompleteAccountRoute.forms.password.title")} title={t("routes.CompleteAccountRoute.forms.password.title")}

View File

@ -3,14 +3,15 @@ import React, {ReactElement} from "react"
import {ExtensionSignalHandler} from "~/components" import {ExtensionSignalHandler} from "~/components"
import AppLoadingScreen from "~/AppLoadingScreen/AppLoadingScreen" import AppLoadingScreen from "~/AppLoadingScreen/AppLoadingScreen"
import AuthContextProvider from "~/AuthContext/AuthContextProvider"
export default function RootRoute(): ReactElement { export default function RootRoute(): ReactElement {
return ( return (
<> <AuthContextProvider>
<AppLoadingScreen> <AppLoadingScreen>
<Outlet /> <Outlet />
</AppLoadingScreen> </AppLoadingScreen>
<ExtensionSignalHandler /> <ExtensionSignalHandler />
</> </AuthContextProvider>
) )
} }