mirror of
https://github.com/Myzel394/kleckrelay-website.git
synced 2025-06-18 15:35:26 +02:00
code refactoring: improved structure, removed unnecessary imports
This commit is contained in:
commit
84f6d6479d
@ -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"
|
||||
|
@ -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", () => {
|
||||
|
@ -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>
|
||||
)
|
||||
}
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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 (
|
5
src/components/AppLoadingScreen/index.ts
Normal file
5
src/components/AppLoadingScreen/index.ts
Normal file
@ -0,0 +1,5 @@
|
||||
export * from "./AppLoadingScreen"
|
||||
export {default as AppLoadingScreen} from "./AppLoadingScreen"
|
||||
|
||||
export * from "./AppLoadingScreenContext"
|
||||
export {default as AppLoadingScreenContext} from "./AppLoadingScreenContext"
|
5
src/components/AuthContext/index.ts
Normal file
5
src/components/AuthContext/index.ts
Normal file
@ -0,0 +1,5 @@
|
||||
export * from "./AuthContextProvider"
|
||||
export {default as AuthContextProvider} from "./AuthContextProvider"
|
||||
|
||||
export * from "./AuthContext"
|
||||
export {default as AuthContext} from "./AuthContext"
|
@ -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,
|
7
src/components/LockNavigation/index.ts
Normal file
7
src/components/LockNavigation/index.ts
Normal 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"
|
@ -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"
|
||||
|
@ -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])
|
||||
|
@ -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
|
@ -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",
|
@ -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
|
@ -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}
|
||||
/>
|
||||
)
|
@ -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
|
49
src/components/widgets/index.ts
Normal file
49
src/components/widgets/index.ts
Normal 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"
|
@ -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.
|
||||
|
@ -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>
|
||||
|
@ -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 {
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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
|
||||
|
@ -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"
|
||||
|
@ -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()
|
||||
|
@ -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 {
|
||||
|
@ -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",
|
||||
|
@ -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 (
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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
12
src/utils/crypto/index.ts
Normal 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"
|
@ -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)
|
||||
|
||||
|
@ -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"
|
||||
|
@ -1,5 +1,6 @@
|
||||
import {AxiosError} from "axios"
|
||||
import {FormikErrors} from "formik"
|
||||
|
||||
import {SimpleDetailResponse} from "~/server-types"
|
||||
|
||||
export interface FastAPIError {
|
||||
|
Loading…
x
Reference in New Issue
Block a user