code refactoring: improved structure, removed unnecessary imports

This commit is contained in:
Myzel394 2023-01-14 22:38:19 +01:00
commit 84f6d6479d
86 changed files with 155 additions and 178 deletions

View File

@ -1,5 +1,5 @@
import {decryptString, encryptString} from "../src/utils"
import getEncryptionPassword from "../src/utils/get-encryption-password"
import getEncryptionPassword from "../src/utils/crypto/get-encryption-password"
describe("ciphers", () => {
const email = "test@kleckrelay.example"

View File

@ -1,4 +1,4 @@
import getEncryptionPassword from "../src/utils/get-encryption-password"
import getEncryptionPassword from "../src/utils/crypto/get-encryption-password"
describe("getEncryptionPassword", () => {
it("is defined", () => {

View File

@ -1,11 +0,0 @@
import React, {ReactElement} from "react"
import {Typography} from "@mui/material"
export default function LoadingScreen(): ReactElement {
return (
<Typography variant="caption" component="p">
Loading...
</Typography>
)
}

View File

@ -1,8 +1,8 @@
import update from "immutability-helper"
import {AliasNote} from "~/server-types"
import {AuthContextType} from "~/AuthContext/AuthContext"
import {DEFAULT_ALIAS_NOTE} from "~/constants/values"
import {AuthContextType} from "~/components"
export default function decryptAliasNotes(
encryptedNotes: string,

View File

@ -2,7 +2,7 @@ import camelcaseKeys from "camelcase-keys"
import update from "immutability-helper"
import {DecryptedReportContent} from "~/server-types"
import {AuthContextType} from "~/AuthContext/AuthContext"
import {AuthContextType} from "~/components"
export default async function decryptReport(
encryptedContent: string,

View File

@ -1,8 +1,6 @@
import {ReactElement, useMemo} from "react"
import {useAsyncFn} from "react-use"
import LoadingScreen from "~/LoadingScreen"
import AppLoadingScreenContext, {AppLoadingScreenContextType} from "./AppLoadingScreenContext"
export interface AppLoadingScreenProps {
@ -20,7 +18,7 @@ export default function AppLoadingScreen({children}: AppLoadingScreenProps): Rea
)
if (state.loading) {
return <LoadingScreen />
return <div>Loading...</div>
}
return (

View File

@ -0,0 +1,5 @@
export * from "./AppLoadingScreen"
export {default as AppLoadingScreen} from "./AppLoadingScreen"
export * from "./AppLoadingScreenContext"
export {default as AppLoadingScreenContext} from "./AppLoadingScreenContext"

View File

@ -0,0 +1,5 @@
export * from "./AuthContextProvider"
export {default as AuthContextProvider} from "./AuthContextProvider"
export * from "./AuthContext"
export {default as AuthContext} from "./AuthContext"

View File

@ -1,8 +1,8 @@
import {Dispatch, SetStateAction, useMemo, useRef} from "react"
import {useUpdateEffect} from "react-use"
import {AuthContextType, EncryptionStatus} from "~/AuthContext/AuthContext"
import {ServerUser, User} from "~/server-types"
import {AuthContextType, EncryptionStatus} from "~/components"
export type UseContextValueData = Pick<
AuthContextType,

View File

@ -0,0 +1,7 @@
export * from "./LockNavigationContextProvider"
export {default as LockNavigationContextProvider} from "./LockNavigationContextProvider"
export * from "./LockNavigationContext"
export {default as LockNavigationContext} from "./LockNavigationContext"
export {default as FormikAutoLockNavigation} from "./FormikAutoLockNavigation"

View File

@ -1,47 +1,5 @@
export * from "./MultiStepForm"
export {default as MultiStepForm} from "./MultiStepForm"
export * from "./MultiStepFormElement"
export {default as MultiStepFormElement} from "./MultiStepFormElement"
export * from "./OpenMailButton"
export {default as OpenMailButton} from "./OpenMailButton"
export * from "./PasswordField"
export {default as PasswordField} from "./PasswordField"
export * from "./SimpleForm"
export {default as SimpleForm} from "./SimpleForm"
export * from "./MutationStatusSnackbar"
export {default as MutationStatusSnackbar} from "./MutationStatusSnackbar"
export * from "./TimedButton"
export {default as TimedButton} from "./TimedButton"
export * from "./ErrorSnack"
export {default as ErrorSnack} from "./ErrorSnack"
export * from "./SuccessSnack"
export {default as SuccessSnack} from "./SuccessSnack"
export * from "./ErrorLoadingDataMessage"
export {default as ErrorLoadingDataMessage} from "./ErrorLoadingDataMessage"
export * from "./DecryptReport"
export {default as DecryptReport} from "./DecryptReport"
export * from "./SimplePage"
export {default as SimplePage} from "./SimplePage"
export * from "./QueryResult"
export {default as QueryResult} from "./QueryResult"
export * from "./AliasTypeIndicator"
export {default as AliasTypeIndicator} from "./AliasTypeIndicator"
export * from "./DecryptionPasswordMissingAlert"
export {default as DecryptionPasswordMissingAlert} from "./DecryptionPasswordMissingAlert"
export * from "./FaviconImage"
export {default as FaviconImage} from "./FaviconImage"
export * from "./SimpleOverlayInformation"
export {default as SimpleOverlayInformation} from "./SimpleOverlayInformation"
export * from "./SimpleInformationContainer"
export {default as SimpleInformationContainer} from "./SimpleInformationContainer"
export * from "./NoSearchResults"
export {default as NoSearchResults} from "./NoSearchResults"
export * from "./LanguageButton"
export {default as LanguageButton} from "./LanguageButton"
export * from "./ExpandableListItem"
export {default as ExpandableListItem} from "./ExpandableListItem"
export * from "./ExternalLinkIndication"
export {default as ExternalLinkIndication} from "./ExternalLinkIndication"
export {default as ExtensionSignalHandler} from "./ExtensionalSignalHandler"
export * from "./widgets"
export * as SimplePageBuilder from "./simple-page-builder"
export * from "./AuthContext"
export * from "./LockNavigation"
export * from "./AppLoadingScreen"

View File

@ -2,15 +2,14 @@ import {ReactElement, useContext} from "react"
import {useAsync} from "react-use"
import {DecryptedReportContent, Report} from "~/server-types"
import AuthContext from "~/AuthContext/AuthContext"
import decryptReport from "~/apis/helpers/decrypt-report"
import {AuthContext} from "../AuthContext"
interface DecryptReportPropsBase {
encryptedContent?: string
reports?: Report[]
children: (
report: DecryptedReportContent | DecryptedReportContent[],
) => ReactElement
children: (report: DecryptedReportContent | DecryptedReportContent[]) => ReactElement
}
interface DecryptReportPropsEncryptedContent {
@ -34,17 +33,13 @@ export default function DecryptReport({
const {_decryptUsingPrivateKey} = useContext(AuthContext)
const {value} = useAsync(async () => {
const decrypt = async (
content: string,
): Promise<DecryptedReportContent> =>
const decrypt = async (content: string): Promise<DecryptedReportContent> =>
decryptReport(content, _decryptUsingPrivateKey)
if (encryptedContent) {
return decrypt(encryptedContent)
} else {
return await Promise.all(
reports!.map(report => decrypt(report.encryptedContent)),
)
return await Promise.all(reports!.map(report => decrypt(report.encryptedContent)))
}
}, [encryptedContent, reports])

View File

@ -5,8 +5,8 @@ import {useTranslation} from "react-i18next"
import {Button, Grid, Typography, useTheme} from "@mui/material"
import AuthContext, {EncryptionStatus} from "~/AuthContext/AuthContext"
import LockNavigationContext from "~/LockNavigationContext/LockNavigationContext"
import {LockNavigationContext} from "../LockNavigation"
import {AuthContext, EncryptionStatus} from "../AuthContext"
export interface WithEncryptionRequiredProps {
children?: JSX.Element

View File

@ -6,8 +6,9 @@ import sortArray from "sort-array"
import {ListItemIcon, ListItemText, MenuItem, Select} from "@mui/material"
import {Language} from "~/server-types"
import AppLoadingScreenContext from "~/AppLoadingScreen/AppLoadingScreenContext"
import LockNavigationContext from "~/LockNavigationContext/LockNavigationContext"
import {LockNavigationContext} from "../LockNavigation"
import {AppLoadingScreenContext} from "../AppLoadingScreen"
const LANGUAGE_NAME_MAP = {
[Language.EN_US]: "English",

View File

@ -1,11 +1,11 @@
import {IoMdMailOpen} from "react-icons/io"
import {useTranslation} from "react-i18next"
import React, {ReactElement} from "react"
import UAParser from "ua-parser-js"
import {Button} from "@mui/material"
import {APP_LINK_MAP} from "~/utils"
import {useTranslation} from "react-i18next"
export interface OpenMailButtonProps {
domain: string

View File

@ -5,7 +5,8 @@ import {UseQueryResult} from "@tanstack/react-query"
import {ErrorLoadingDataMessage} from "~/components/index"
import {parseFastAPIError} from "~/utils"
import LoadingData from "~/components/LoadingData"
import LoadingData from "./LoadingData"
export interface QueryResultProps<TQueryFnData = unknown, TError = AxiosError> {
query: UseQueryResult<TQueryFnData, TError>
@ -27,10 +28,7 @@ export default function QueryResult<TQueryFnData, TError = AxiosError>({
if (query.error) {
return (
<ErrorLoadingDataMessage
message={
parseFastAPIError(query.error as any as AxiosError)
.detail as string
}
message={parseFastAPIError(query.error as any as AxiosError).detail as string}
onRetry={query.refetch}
/>
)

View File

@ -1,11 +1,11 @@
import {ReactElement} from "react"
import {useTranslation} from "react-i18next"
import differenceInSeconds from "date-fns/differenceInSeconds"
import {LoadingButton, LoadingButtonProps} from "@mui/lab"
import {useIntervalUpdate} from "~/hooks"
import {isDev} from "~/constants/development"
import {useTranslation} from "react-i18next"
export interface TimedButtonProps extends LoadingButtonProps {
interval: number

View File

@ -0,0 +1,49 @@
export * from "./MultiStepForm"
export {default as MultiStepForm} from "./MultiStepForm"
export * from "./MultiStepFormElement"
export {default as MultiStepFormElement} from "./MultiStepFormElement"
export * from "./OpenMailButton"
export {default as OpenMailButton} from "./OpenMailButton"
export * from "./PasswordField"
export {default as PasswordField} from "./PasswordField"
export * from "./SimpleForm"
export {default as SimpleForm} from "./SimpleForm"
export * from "./MutationStatusSnackbar"
export {default as MutationStatusSnackbar} from "./MutationStatusSnackbar"
export * from "./TimedButton"
export {default as TimedButton} from "./TimedButton"
export * from "./ErrorSnack"
export {default as ErrorSnack} from "./ErrorSnack"
export * from "./SuccessSnack"
export {default as SuccessSnack} from "./SuccessSnack"
export * from "./ErrorLoadingDataMessage"
export {default as ErrorLoadingDataMessage} from "./ErrorLoadingDataMessage"
export * from "./DecryptReport"
export {default as DecryptReport} from "./DecryptReport"
export * from "./SimplePage"
export {default as SimplePage} from "./SimplePage"
export * from "./QueryResult"
export {default as QueryResult} from "./QueryResult"
export * from "./AliasTypeIndicator"
export {default as AliasTypeIndicator} from "./AliasTypeIndicator"
export * from "./DecryptionPasswordMissingAlert"
export {default as DecryptionPasswordMissingAlert} from "./DecryptionPasswordMissingAlert"
export * from "./FaviconImage"
export {default as FaviconImage} from "./FaviconImage"
export * from "./SimpleOverlayInformation"
export {default as SimpleOverlayInformation} from "./SimpleOverlayInformation"
export * from "./SimpleInformationContainer"
export {default as SimpleInformationContainer} from "./SimpleInformationContainer"
export * from "./NoSearchResults"
export {default as NoSearchResults} from "./NoSearchResults"
export * from "./LanguageButton"
export {default as LanguageButton} from "./LanguageButton"
export * from "./ExpandableListItem"
export {default as ExpandableListItem} from "./ExpandableListItem"
export * from "./LoadingData"
export {default as LoadingData} from "./LoadingData"
export * from "./ExternalLinkIndication"
export {default as ExternalLinkIndication} from "./ExternalLinkIndication"
export {default as ExtensionSignalHandler} from "./ExtensionalSignalHandler"
export * as SimplePageBuilder from "./simple-page-builder"

View File

@ -3,7 +3,7 @@ import {useContext, useLayoutEffect} from "react"
import {ServerUser, User} from "~/server-types"
import {AUTHENTICATION_PATHS} from "~/constants/values"
import AuthContext from "~/AuthContext/AuthContext"
import {AuthContext} from "~/components"
/// Returns the currently authenticated user.
// If the user is not authenticated, it will automatically redirect to the login page.

View File

@ -2,19 +2,12 @@ import * as yup from "yup"
import {useFormik} from "formik"
import {ReactElement} from "react"
import {RiLinkM} from "react-icons/ri"
import {useTranslation} from "react-i18next"
import {
Button,
FormGroup,
FormHelperText,
Grid,
InputAdornment,
TextField,
} from "@mui/material"
import {Button, FormGroup, FormHelperText, Grid, InputAdornment, TextField} from "@mui/material"
import {URL_REGEX} from "~/constants/values"
import {whenEnterPressed} from "~/utils"
import {useTranslation} from "react-i18next"
export interface AddWebsiteFieldProps {
onAdd: (website: string) => Promise<void>
@ -29,10 +22,7 @@ const WEBSITE_SCHEMA = yup.object().shape({
url: yup.string().matches(URL_REGEX, "This URL is invalid."),
})
export default function AddWebsiteField({
onAdd,
isLoading,
}: AddWebsiteFieldProps): ReactElement {
export default function AddWebsiteField({onAdd, isLoading}: AddWebsiteFieldProps): ReactElement {
const {t} = useTranslation()
const websiteFormik = useFormik<WebsiteForm>({
validationSchema: WEBSITE_SCHEMA,
@ -68,9 +58,7 @@ export default function AddWebsiteField({
<TextField
name="url"
id="url"
label={t(
"routes.AliasDetailRoute.sections.notes.form.websites.label",
)}
label={t("routes.AliasDetailRoute.sections.notes.form.websites.label")}
placeholder={t(
"routes.AliasDetailRoute.sections.notes.form.websites.placeholder",
)}
@ -78,14 +66,9 @@ export default function AddWebsiteField({
value={websiteFormik.values.url}
onChange={websiteFormik.handleChange}
onBlur={websiteFormik.handleBlur}
onKeyDown={whenEnterPressed(() =>
websiteFormik.handleSubmit(),
)}
onKeyDown={whenEnterPressed(() => websiteFormik.handleSubmit())}
disabled={websiteFormik.isSubmitting || isLoading}
error={
websiteFormik.touched.url &&
Boolean(websiteFormik.errors.url)
}
error={websiteFormik.touched.url && Boolean(websiteFormik.errors.url)}
InputProps={{
startAdornment: (
<InputAdornment position="start">
@ -107,15 +90,10 @@ export default function AddWebsiteField({
</Grid>
<Grid item>
<FormHelperText
error={
websiteFormik.touched.url &&
Boolean(websiteFormik.errors.url)
}
error={websiteFormik.touched.url && Boolean(websiteFormik.errors.url)}
>
{(websiteFormik.touched.url && websiteFormik.errors.url) ||
t(
"routes.AliasDetailRoute.sections.notes.form.websites.helperText",
)}
t("routes.AliasDetailRoute.sections.notes.form.websites.helperText")}
</FormHelperText>
</Grid>
</Grid>

View File

@ -28,14 +28,17 @@ import {
} from "@mui/material"
import {parseFastAPIError} from "~/utils"
import {FaviconImage, SimpleOverlayInformation} from "~/components"
import {
AuthContext,
FaviconImage,
FormikAutoLockNavigation,
SimpleOverlayInformation,
} from "~/components"
import {Alias, AliasNote, DecryptedAlias} from "~/server-types"
import {updateAlias} from "~/apis"
import {useErrorSuccessSnacks} from "~/hooks"
import {queryClient} from "~/constants/react-query"
import AddWebsiteField from "~/route-widgets/AliasDetailRoute/AddWebsiteField"
import AuthContext from "~/AuthContext/AuthContext"
import FormikAutoLockNavigation from "~/LockNavigationContext/FormikAutoLockNavigation"
import decryptAliasNotes from "~/apis/helpers/decrypt-alias-notes"
export interface AliasNotesFormProps {

View File

@ -22,8 +22,7 @@ import {
} from "~/constants/enum-mappings"
import {useErrorSuccessSnacks} from "~/hooks"
import {queryClient} from "~/constants/react-query"
import AuthContext from "~/AuthContext/AuthContext"
import FormikAutoLockNavigation from "~/LockNavigationContext/FormikAutoLockNavigation"
import {AuthContext, FormikAutoLockNavigation} from "~/components"
import SelectField from "~/route-widgets/SettingsRoute/SelectField"
import decryptAliasNotes from "~/apis/helpers/decrypt-alias-notes"

View File

@ -8,9 +8,9 @@ import {QueryKey, useMutation} from "@tanstack/react-query"
import {Alias, DecryptedAlias} from "~/server-types"
import {UpdateAliasData, updateAlias} from "~/apis"
import {useErrorSuccessSnacks, useUIState} from "~/hooks"
import {useErrorSuccessSnacks} from "~/hooks"
import {queryClient} from "~/constants/react-query"
import AuthContext, {EncryptionStatus} from "~/AuthContext/AuthContext"
import {AuthContext, EncryptionStatus} from "~/components"
import decryptAliasNotes from "~/apis/helpers/decrypt-alias-notes"
export interface ChangeAliasActivationStatusSwitchProps {

View File

@ -18,11 +18,11 @@ import {
import {useMutation} from "@tanstack/react-query"
import {CreateAliasData, createAlias} from "~/apis"
import {Alias, AliasList, AliasType, PaginationResult} from "~/server-types"
import {Alias, AliasType} from "~/server-types"
import {DEFAULT_ALIAS_NOTE} from "~/constants/values"
import {useErrorSuccessSnacks} from "~/hooks"
import {queryClient} from "~/constants/react-query"
import AuthContext, {EncryptionStatus} from "~/AuthContext/AuthContext"
import {AuthContext, EncryptionStatus} from "~/components"
import CustomAliasDialog from "~/route-widgets/AliasesRoute/CustomAliasDialog"
export function CreateAliasButton(): ReactElement {

View File

@ -9,7 +9,7 @@ import {Button} from "@mui/material"
import {mdiTextBoxMultiple} from "@mdi/js/commonjs/mdi"
import Icon from "@mdi/react"
import LockNavigationContext from "~/LockNavigationContext/LockNavigationContext"
import {LockNavigationContext} from "~/components"
export enum NavigationSection {
Overview,

View File

@ -1,13 +1,14 @@
import {FaLongArrowAltRight} from "react-icons/fa"
import {TiCancel} from "react-icons/ti"
import {useTranslation} from "react-i18next"
import React, {ReactElement} from "react"
import {Box, Button, Grid, Typography} from "@mui/material"
import {MultiStepFormElement} from "~/components"
import {mdiTextBoxMultiple} from "@mdi/js/commonjs/mdi"
import {useTranslation} from "react-i18next"
import Icon from "@mdi/react"
import {MultiStepFormElement} from "~/components"
export interface GenerateEmailReportsFormProps {
onYes: () => void
onNo: () => void

View File

@ -11,14 +11,13 @@ import passwordGenerator from "secure-random-password"
import {Box, InputAdornment} from "@mui/material"
import {useMutation} from "@tanstack/react-query"
import {PasswordField, SimpleForm} from "~/components"
import {AuthContext, PasswordField, SimpleForm} from "~/components"
import {encryptString, generateKeys, getEncryptionPassword, getUserSalt} from "~/utils"
import {useExtensionHandler, useNavigateToNext, useSystemPreferredTheme, useUser} from "~/hooks"
import {MASTER_PASSWORD_LENGTH} from "~/constants/values"
import {AuthenticationDetails, ServerSettings, UserNote} from "~/server-types"
import {UpdateAccountData, updateAccount} from "~/apis"
import {encryptUserNote} from "~/utils/encrypt-user-note"
import AuthContext from "~/AuthContext/AuthContext"
export interface PasswordFormProps {
onDone: () => void

View File

@ -1,5 +1,7 @@
import {AxiosError} from "axios"
import {useLoaderData} from "react-router-dom"
import {MdMail} from "react-icons/md"
import {useTranslation} from "react-i18next"
import React, {ReactElement} from "react"
import {useMutation} from "@tanstack/react-query"
@ -7,8 +9,6 @@ import {useMutation} from "@tanstack/react-query"
import {resendEmailLoginCode} from "~/apis"
import {MutationStatusSnackbar, TimedButton} from "~/components"
import {ServerSettings, SimpleDetailResponse} from "~/server-types"
import {MdMail} from "react-icons/md"
import {useTranslation} from "react-i18next"
export interface ResendMailButtonProps {
email: string

View File

@ -8,7 +8,7 @@ import {Box, Grid, Paper, Typography} from "@mui/material"
import {AuthenticationDetails, ServerUser} from "~/server-types"
import {verifyLoginWithEmail} from "~/apis"
import LoadingData from "~/components/LoadingData"
import {LoadingData} from "~/components"
export interface ConfirmFromDifferentDeviceProps {
email: string

View File

@ -1,7 +1,6 @@
import {ReactElement} from "react"
import {useTranslation} from "react-i18next"
import {BsArrowsAngleExpand} from "react-icons/bs"
import {HiOutlineExternalLink} from "react-icons/hi"
import {List, ListItemButton, ListItemText} from "@mui/material"

View File

@ -1,10 +1,10 @@
import {ReactElement} from "react"
import {BsShieldShaded} from "react-icons/bs"
import {useTranslation} from "react-i18next"
import {List, ListItem, Typography} from "@mui/material"
import {DecryptedReportContent} from "~/server-types"
import {BsShieldShaded} from "react-icons/bs"
import {useTranslation} from "react-i18next"
import {ExpandableListItem} from "~/components"
export interface SinglePixelImageTrackersListItemProps {

View File

@ -30,7 +30,7 @@ import {
IMAGE_PROXY_FORMAT_TYPE_NAME_MAP,
PROXY_USER_AGENT_TYPE_NAME_MAP,
} from "~/constants/enum-mappings"
import AuthContext from "~/AuthContext/AuthContext"
import {AuthContext} from "~/components"
interface Form {
removeTrackers: boolean

View File

@ -12,8 +12,8 @@ import {MultiStepFormElement, SimpleForm} from "~/components"
import {SignupResult, checkIsDomainDisposable, signup} from "~/apis"
import {parseFastAPIError} from "~/utils"
import {ServerSettings} from "~/server-types"
import {useExtensionHandler} from "~/hooks"
import DetectEmailAutofillService from "./DetectEmailAutofillService"
export interface EmailFormProps {

View File

@ -1,4 +1,5 @@
import {MdCancel, MdEdit} from "react-icons/md"
import {useTranslation} from "react-i18next"
import React, {ReactElement, useState} from "react"
import {
@ -14,7 +15,6 @@ import {
} from "@mui/material"
import {MultiStepFormElement, OpenMailButton} from "~/components"
import {useTranslation} from "react-i18next"
import ResendMailButton from "~/route-widgets/SignupRoute/YouGotMail/ResendMailButton"
export interface YouGotMailProps {

View File

@ -10,7 +10,9 @@ import {getAlias} from "~/apis"
import {Alias, DecryptedAlias} from "~/server-types"
import {
AliasTypeIndicator,
AuthContext,
DecryptionPasswordMissingAlert,
EncryptionStatus,
QueryResult,
SimplePage,
SimplePageBuilder,
@ -18,7 +20,6 @@ import {
import AliasAddress from "~/route-widgets/AliasDetailRoute/AliasAddress"
import AliasNotesForm from "~/route-widgets/AliasDetailRoute/AliasNotesForm"
import AliasPreferencesForm from "~/route-widgets/AliasDetailRoute/AliasPreferencesForm"
import AuthContext, {EncryptionStatus} from "~/AuthContext/AuthContext"
import ChangeAliasActivationStatusSwitch from "~/route-widgets/AliasDetailRoute/ChangeAliasActivationStatusSwitch"
import decryptAliasNotes from "~/apis/helpers/decrypt-alias-notes"

View File

@ -6,8 +6,7 @@ import {MdLogout} from "react-icons/md"
import {Box, Button, Grid, List, ListItem, Paper, useTheme} from "@mui/material"
import {useUser} from "~/hooks"
import {LanguageButton} from "~/components"
import LockNavigationContextProvider from "~/LockNavigationContext/LockNavigationContextProvider"
import {LanguageButton, LockNavigationContextProvider} from "~/components"
import NavigationButton, {
NavigationSection,
} from "~/route-widgets/AuthenticateRoute/NavigationButton"

View File

@ -3,9 +3,8 @@ import {useTranslation} from "react-i18next"
import {Grid, Paper, Typography} from "@mui/material"
import {MultiStepForm} from "~/components"
import {AuthContext, EncryptionStatus, MultiStepForm} from "~/components"
import {useNavigateToNext} from "~/hooks"
import AuthContext, {EncryptionStatus} from "~/AuthContext/AuthContext"
import GenerateEmailReportsForm from "~/route-widgets/CompleteAccountRoute/GenerateEmailReportsForm"
import PasswordForm from "~/route-widgets/CompleteAccountRoute/PasswordForm"

View File

@ -6,11 +6,11 @@ import {useTranslation} from "react-i18next"
import {useLoaderData} from "react-router-dom"
import {InputAdornment} from "@mui/material"
import {useNavigateToNext, useUser} from "~/hooks"
import {PasswordField, SimpleForm} from "~/components"
import {AuthContext, PasswordField, SimpleForm} from "~/components"
import {getMasterPassword} from "~/utils"
import {ServerSettings} from "~/server-types"
import AuthContext from "~/AuthContext/AuthContext"
interface Form {
password: string

View File

@ -2,9 +2,8 @@ import {ReactElement, useContext, useState} from "react"
import {useNavigate} from "react-router-dom"
import {useUpdateEffect} from "react-use"
import {MultiStepForm} from "~/components"
import {AuthContext, MultiStepForm} from "~/components"
import {useQueryParams} from "~/hooks"
import AuthContext from "~/AuthContext/AuthContext"
import ConfirmCodeForm from "~/route-widgets/LoginRoute/ConfirmCodeForm/ConfirmCodeForm"
import ConfirmFromDifferentDevice from "~/route-widgets/LoginRoute/ConfirmFromDifferentDevice"
import EmailForm from "~/route-widgets/LoginRoute/EmailForm"

View File

@ -5,7 +5,7 @@ import {useEffectOnce} from "react-use"
import {Box, CircularProgress, Grid, Paper, Typography} from "@mui/material"
import {useNavigateToNext} from "~/hooks"
import AuthContext from "~/AuthContext/AuthContext"
import {AuthContext} from "~/components"
export default function LogoutRoute(): ReactElement {
const {t} = useTranslation()

View File

@ -8,12 +8,11 @@ import {List} from "@mui/material"
import {DecryptedReportContent, Report} from "~/server-types"
import {getReport} from "~/apis"
import {DecryptReport, SimpleOverlayInformation, SimplePageBuilder} from "~/components"
import {DecryptReport, QueryResult, SimpleOverlayInformation, SimplePageBuilder} from "~/components"
import {WithEncryptionRequired} from "~/hocs"
import DeleteButton from "~/route-widgets/ReportDetailRoute/DeleteButton"
import ExpandedUrlsListItem from "~/route-widgets/ReportDetailRoute/ExpandedUrlsListItem"
import ProxiedImagesListItem from "~/route-widgets/ReportDetailRoute/ProxiedImagesListItem"
import QueryResult from "~/components/QueryResult"
import SinglePixelImageTrackersListItem from "~/route-widgets/ReportDetailRoute/SinglePixelImageTrackersListItem"
function ReportDetailRoute(): ReactElement {

View File

@ -12,12 +12,10 @@ import {InputAdornment, List, MenuItem, TextField, Typography} from "@mui/materi
import {DecryptedReportContent, PaginationResult, Report} from "~/server-types"
import {getReports} from "~/apis"
import {WithEncryptionRequired} from "~/hocs"
import {DecryptReport} from "~/components"
import {DecryptReport, QueryResult, SimplePage} from "~/components"
import {createEnumMapFromTranslation} from "~/utils"
import EmptyStateScreen from "~/route-widgets/ReportsRoute/EmptyStateScreen"
import QueryResult from "~/components/QueryResult"
import ReportInformationItem from "~/route-widgets/ReportsRoute/ReportInformationItem"
import SimplePage from "~/components/SimplePage"
enum SortingView {
List = "List",

View File

@ -1,9 +1,7 @@
import {Outlet} from "react-router-dom"
import React, {ReactElement} from "react"
import {ExtensionSignalHandler} from "~/components"
import AppLoadingScreen from "~/AppLoadingScreen/AppLoadingScreen"
import AuthContextProvider from "~/AuthContext/AuthContextProvider"
import {AppLoadingScreen, AuthContextProvider, ExtensionSignalHandler} from "~/components"
export default function RootRoute(): ReactElement {
return (

View File

@ -12,7 +12,7 @@ import {useMutation} from "@tanstack/react-query"
import {AuthenticationDetails, ServerSettings} from "~/server-types"
import {VerifyEmailData, verifyEmail} from "~/apis"
import {useQueryParams} from "~/hooks"
import AuthContext from "~/AuthContext/AuthContext"
import {AuthContext} from "~/components"
const emailSchema = yup.string().email()

View File

@ -4,7 +4,7 @@ export default async function generateKeys(): Promise<
SerializedKeyPair<string> & {revocationCertificate: string}
> {
return generateKey({
type: "rsa",
type: "ecc",
format: "armored",
userIDs: [{name: "John Smith", email: "john@example.com"}],
passphrase: "",

12
src/utils/crypto/index.ts Normal file
View File

@ -0,0 +1,12 @@
export * from "./decrypt-string"
export {default as decryptString} from "./decrypt-string"
export * from "./encrypt-string"
export {default as encryptString} from "./encrypt-string"
export * from "./get-encryption-password"
export {default as getEncryptionPassword} from "./get-encryption-password"
export * from "./get-user-salt"
export {default as getUserSalt} from "./get-user-salt"
export * from "./get-master-password"
export {default as getMasterPassword} from "./get-master-password"
export * from "./generate-keys"
export {default as generateKeys} from "./generate-keys"

View File

@ -2,18 +2,15 @@ import * as yup from "yup"
import {Theme, UserNote} from "~/server-types"
import decryptString from "./decrypt-string"
import encryptString from "./encrypt-string"
import decryptString from "./crypto/decrypt-string"
import encryptString from "./crypto/encrypt-string"
export const USER_NOTE_SCHEMA = yup.object().shape({
privateKey: yup.string().required(),
theme: yup.string().oneOf(Object.values(Theme)).required(),
})
export function decryptUserNote(
encryptedUserNote: string,
password: string,
): UserNote {
export function decryptUserNote(encryptedUserNote: string, password: string): UserNote {
const data = decryptString(encryptedUserNote, password)
const userNote = JSON.parse(data)

View File

@ -1,22 +1,12 @@
export * from "./app-url-links"
export {default as APP_LINK_MAP} from "./app-url-links"
export * from "./encrypt-string"
export {default as encryptString} from "./encrypt-string"
export * from "./parse-fastapi-error"
export {default as parseFastAPIError} from "./parse-fastapi-error"
export * from "./when-element-has-bounds"
export {default as whenElementHasBounds} from "./when-element-has-bounds"
export * from "./decrypt-string"
export {default as decryptString} from "./decrypt-string"
export * from "./when-enter-pressed"
export {default as whenEnterPressed} from "./when-enter-pressed"
export * from "./create-enum-map-from-translation"
export {default as createEnumMapFromTranslation} from "./create-enum-map-from-translation"
export * from "./get-encryption-password"
export {default as getEncryptionPassword} from "./get-encryption-password"
export * from "./get-user-salt"
export {default as getUserSalt} from "./get-user-salt"
export * from "./get-master-password"
export {default as getMasterPassword} from "./get-master-password"
export * from "./generate-keys"
export {default as generateKeys} from "./generate-keys"
export * from "./crypto"

View File

@ -1,5 +1,6 @@
import {AxiosError} from "axios"
import {FormikErrors} from "formik"
import {SimpleDetailResponse} from "~/server-types"
export interface FastAPIError {