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 {decryptString, encryptString} from "../src/utils"
|
||||||
import getEncryptionPassword from "../src/utils/get-encryption-password"
|
import getEncryptionPassword from "../src/utils/crypto/get-encryption-password"
|
||||||
|
|
||||||
describe("ciphers", () => {
|
describe("ciphers", () => {
|
||||||
const email = "test@kleckrelay.example"
|
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", () => {
|
describe("getEncryptionPassword", () => {
|
||||||
it("is defined", () => {
|
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 update from "immutability-helper"
|
||||||
|
|
||||||
import {AliasNote} from "~/server-types"
|
import {AliasNote} from "~/server-types"
|
||||||
import {AuthContextType} from "~/AuthContext/AuthContext"
|
|
||||||
import {DEFAULT_ALIAS_NOTE} from "~/constants/values"
|
import {DEFAULT_ALIAS_NOTE} from "~/constants/values"
|
||||||
|
import {AuthContextType} from "~/components"
|
||||||
|
|
||||||
export default function decryptAliasNotes(
|
export default function decryptAliasNotes(
|
||||||
encryptedNotes: string,
|
encryptedNotes: string,
|
||||||
|
@ -2,7 +2,7 @@ import camelcaseKeys from "camelcase-keys"
|
|||||||
import update from "immutability-helper"
|
import update from "immutability-helper"
|
||||||
|
|
||||||
import {DecryptedReportContent} from "~/server-types"
|
import {DecryptedReportContent} from "~/server-types"
|
||||||
import {AuthContextType} from "~/AuthContext/AuthContext"
|
import {AuthContextType} from "~/components"
|
||||||
|
|
||||||
export default async function decryptReport(
|
export default async function decryptReport(
|
||||||
encryptedContent: string,
|
encryptedContent: string,
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
import {ReactElement, useMemo} from "react"
|
import {ReactElement, useMemo} from "react"
|
||||||
import {useAsyncFn} from "react-use"
|
import {useAsyncFn} from "react-use"
|
||||||
|
|
||||||
import LoadingScreen from "~/LoadingScreen"
|
|
||||||
|
|
||||||
import AppLoadingScreenContext, {AppLoadingScreenContextType} from "./AppLoadingScreenContext"
|
import AppLoadingScreenContext, {AppLoadingScreenContextType} from "./AppLoadingScreenContext"
|
||||||
|
|
||||||
export interface AppLoadingScreenProps {
|
export interface AppLoadingScreenProps {
|
||||||
@ -20,7 +18,7 @@ export default function AppLoadingScreen({children}: AppLoadingScreenProps): Rea
|
|||||||
)
|
)
|
||||||
|
|
||||||
if (state.loading) {
|
if (state.loading) {
|
||||||
return <LoadingScreen />
|
return <div>Loading...</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
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 {Dispatch, SetStateAction, useMemo, useRef} from "react"
|
||||||
import {useUpdateEffect} from "react-use"
|
import {useUpdateEffect} from "react-use"
|
||||||
|
|
||||||
import {AuthContextType, EncryptionStatus} from "~/AuthContext/AuthContext"
|
|
||||||
import {ServerUser, User} from "~/server-types"
|
import {ServerUser, User} from "~/server-types"
|
||||||
|
import {AuthContextType, EncryptionStatus} from "~/components"
|
||||||
|
|
||||||
export type UseContextValueData = Pick<
|
export type UseContextValueData = Pick<
|
||||||
AuthContextType,
|
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 * from "./widgets"
|
||||||
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 * 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 {useAsync} from "react-use"
|
||||||
|
|
||||||
import {DecryptedReportContent, Report} from "~/server-types"
|
import {DecryptedReportContent, Report} from "~/server-types"
|
||||||
import AuthContext from "~/AuthContext/AuthContext"
|
|
||||||
import decryptReport from "~/apis/helpers/decrypt-report"
|
import decryptReport from "~/apis/helpers/decrypt-report"
|
||||||
|
|
||||||
|
import {AuthContext} from "../AuthContext"
|
||||||
|
|
||||||
interface DecryptReportPropsBase {
|
interface DecryptReportPropsBase {
|
||||||
encryptedContent?: string
|
encryptedContent?: string
|
||||||
reports?: Report[]
|
reports?: Report[]
|
||||||
children: (
|
children: (report: DecryptedReportContent | DecryptedReportContent[]) => ReactElement
|
||||||
report: DecryptedReportContent | DecryptedReportContent[],
|
|
||||||
) => ReactElement
|
|
||||||
}
|
}
|
||||||
|
|
||||||
interface DecryptReportPropsEncryptedContent {
|
interface DecryptReportPropsEncryptedContent {
|
||||||
@ -34,17 +33,13 @@ export default function DecryptReport({
|
|||||||
const {_decryptUsingPrivateKey} = useContext(AuthContext)
|
const {_decryptUsingPrivateKey} = useContext(AuthContext)
|
||||||
|
|
||||||
const {value} = useAsync(async () => {
|
const {value} = useAsync(async () => {
|
||||||
const decrypt = async (
|
const decrypt = async (content: string): Promise<DecryptedReportContent> =>
|
||||||
content: string,
|
|
||||||
): Promise<DecryptedReportContent> =>
|
|
||||||
decryptReport(content, _decryptUsingPrivateKey)
|
decryptReport(content, _decryptUsingPrivateKey)
|
||||||
|
|
||||||
if (encryptedContent) {
|
if (encryptedContent) {
|
||||||
return decrypt(encryptedContent)
|
return decrypt(encryptedContent)
|
||||||
} else {
|
} else {
|
||||||
return await Promise.all(
|
return await Promise.all(reports!.map(report => decrypt(report.encryptedContent)))
|
||||||
reports!.map(report => decrypt(report.encryptedContent)),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}, [encryptedContent, reports])
|
}, [encryptedContent, reports])
|
||||||
|
|
@ -5,8 +5,8 @@ import {useTranslation} from "react-i18next"
|
|||||||
|
|
||||||
import {Button, Grid, Typography, useTheme} from "@mui/material"
|
import {Button, Grid, Typography, useTheme} from "@mui/material"
|
||||||
|
|
||||||
import AuthContext, {EncryptionStatus} from "~/AuthContext/AuthContext"
|
import {LockNavigationContext} from "../LockNavigation"
|
||||||
import LockNavigationContext from "~/LockNavigationContext/LockNavigationContext"
|
import {AuthContext, EncryptionStatus} from "../AuthContext"
|
||||||
|
|
||||||
export interface WithEncryptionRequiredProps {
|
export interface WithEncryptionRequiredProps {
|
||||||
children?: JSX.Element
|
children?: JSX.Element
|
@ -6,8 +6,9 @@ import sortArray from "sort-array"
|
|||||||
import {ListItemIcon, ListItemText, MenuItem, Select} from "@mui/material"
|
import {ListItemIcon, ListItemText, MenuItem, Select} from "@mui/material"
|
||||||
|
|
||||||
import {Language} from "~/server-types"
|
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 = {
|
const LANGUAGE_NAME_MAP = {
|
||||||
[Language.EN_US]: "English",
|
[Language.EN_US]: "English",
|
@ -1,11 +1,11 @@
|
|||||||
import {IoMdMailOpen} from "react-icons/io"
|
import {IoMdMailOpen} from "react-icons/io"
|
||||||
|
import {useTranslation} from "react-i18next"
|
||||||
import React, {ReactElement} from "react"
|
import React, {ReactElement} from "react"
|
||||||
import UAParser from "ua-parser-js"
|
import UAParser from "ua-parser-js"
|
||||||
|
|
||||||
import {Button} from "@mui/material"
|
import {Button} from "@mui/material"
|
||||||
|
|
||||||
import {APP_LINK_MAP} from "~/utils"
|
import {APP_LINK_MAP} from "~/utils"
|
||||||
import {useTranslation} from "react-i18next"
|
|
||||||
|
|
||||||
export interface OpenMailButtonProps {
|
export interface OpenMailButtonProps {
|
||||||
domain: string
|
domain: string
|
@ -5,7 +5,8 @@ import {UseQueryResult} from "@tanstack/react-query"
|
|||||||
|
|
||||||
import {ErrorLoadingDataMessage} from "~/components/index"
|
import {ErrorLoadingDataMessage} from "~/components/index"
|
||||||
import {parseFastAPIError} from "~/utils"
|
import {parseFastAPIError} from "~/utils"
|
||||||
import LoadingData from "~/components/LoadingData"
|
|
||||||
|
import LoadingData from "./LoadingData"
|
||||||
|
|
||||||
export interface QueryResultProps<TQueryFnData = unknown, TError = AxiosError> {
|
export interface QueryResultProps<TQueryFnData = unknown, TError = AxiosError> {
|
||||||
query: UseQueryResult<TQueryFnData, TError>
|
query: UseQueryResult<TQueryFnData, TError>
|
||||||
@ -27,10 +28,7 @@ export default function QueryResult<TQueryFnData, TError = AxiosError>({
|
|||||||
if (query.error) {
|
if (query.error) {
|
||||||
return (
|
return (
|
||||||
<ErrorLoadingDataMessage
|
<ErrorLoadingDataMessage
|
||||||
message={
|
message={parseFastAPIError(query.error as any as AxiosError).detail as string}
|
||||||
parseFastAPIError(query.error as any as AxiosError)
|
|
||||||
.detail as string
|
|
||||||
}
|
|
||||||
onRetry={query.refetch}
|
onRetry={query.refetch}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
@ -1,11 +1,11 @@
|
|||||||
import {ReactElement} from "react"
|
import {ReactElement} from "react"
|
||||||
|
import {useTranslation} from "react-i18next"
|
||||||
import differenceInSeconds from "date-fns/differenceInSeconds"
|
import differenceInSeconds from "date-fns/differenceInSeconds"
|
||||||
|
|
||||||
import {LoadingButton, LoadingButtonProps} from "@mui/lab"
|
import {LoadingButton, LoadingButtonProps} from "@mui/lab"
|
||||||
|
|
||||||
import {useIntervalUpdate} from "~/hooks"
|
import {useIntervalUpdate} from "~/hooks"
|
||||||
import {isDev} from "~/constants/development"
|
import {isDev} from "~/constants/development"
|
||||||
import {useTranslation} from "react-i18next"
|
|
||||||
|
|
||||||
export interface TimedButtonProps extends LoadingButtonProps {
|
export interface TimedButtonProps extends LoadingButtonProps {
|
||||||
interval: number
|
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 {ServerUser, User} from "~/server-types"
|
||||||
import {AUTHENTICATION_PATHS} from "~/constants/values"
|
import {AUTHENTICATION_PATHS} from "~/constants/values"
|
||||||
import AuthContext from "~/AuthContext/AuthContext"
|
import {AuthContext} from "~/components"
|
||||||
|
|
||||||
/// Returns the currently authenticated user.
|
/// Returns the currently authenticated user.
|
||||||
// If the user is not authenticated, it will automatically redirect to the login page.
|
// 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 {useFormik} from "formik"
|
||||||
import {ReactElement} from "react"
|
import {ReactElement} from "react"
|
||||||
import {RiLinkM} from "react-icons/ri"
|
import {RiLinkM} from "react-icons/ri"
|
||||||
|
import {useTranslation} from "react-i18next"
|
||||||
|
|
||||||
import {
|
import {Button, FormGroup, FormHelperText, Grid, InputAdornment, TextField} from "@mui/material"
|
||||||
Button,
|
|
||||||
FormGroup,
|
|
||||||
FormHelperText,
|
|
||||||
Grid,
|
|
||||||
InputAdornment,
|
|
||||||
TextField,
|
|
||||||
} from "@mui/material"
|
|
||||||
|
|
||||||
import {URL_REGEX} from "~/constants/values"
|
import {URL_REGEX} from "~/constants/values"
|
||||||
import {whenEnterPressed} from "~/utils"
|
import {whenEnterPressed} from "~/utils"
|
||||||
import {useTranslation} from "react-i18next"
|
|
||||||
|
|
||||||
export interface AddWebsiteFieldProps {
|
export interface AddWebsiteFieldProps {
|
||||||
onAdd: (website: string) => Promise<void>
|
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."),
|
url: yup.string().matches(URL_REGEX, "This URL is invalid."),
|
||||||
})
|
})
|
||||||
|
|
||||||
export default function AddWebsiteField({
|
export default function AddWebsiteField({onAdd, isLoading}: AddWebsiteFieldProps): ReactElement {
|
||||||
onAdd,
|
|
||||||
isLoading,
|
|
||||||
}: AddWebsiteFieldProps): ReactElement {
|
|
||||||
const {t} = useTranslation()
|
const {t} = useTranslation()
|
||||||
const websiteFormik = useFormik<WebsiteForm>({
|
const websiteFormik = useFormik<WebsiteForm>({
|
||||||
validationSchema: WEBSITE_SCHEMA,
|
validationSchema: WEBSITE_SCHEMA,
|
||||||
@ -68,9 +58,7 @@ export default function AddWebsiteField({
|
|||||||
<TextField
|
<TextField
|
||||||
name="url"
|
name="url"
|
||||||
id="url"
|
id="url"
|
||||||
label={t(
|
label={t("routes.AliasDetailRoute.sections.notes.form.websites.label")}
|
||||||
"routes.AliasDetailRoute.sections.notes.form.websites.label",
|
|
||||||
)}
|
|
||||||
placeholder={t(
|
placeholder={t(
|
||||||
"routes.AliasDetailRoute.sections.notes.form.websites.placeholder",
|
"routes.AliasDetailRoute.sections.notes.form.websites.placeholder",
|
||||||
)}
|
)}
|
||||||
@ -78,14 +66,9 @@ export default function AddWebsiteField({
|
|||||||
value={websiteFormik.values.url}
|
value={websiteFormik.values.url}
|
||||||
onChange={websiteFormik.handleChange}
|
onChange={websiteFormik.handleChange}
|
||||||
onBlur={websiteFormik.handleBlur}
|
onBlur={websiteFormik.handleBlur}
|
||||||
onKeyDown={whenEnterPressed(() =>
|
onKeyDown={whenEnterPressed(() => websiteFormik.handleSubmit())}
|
||||||
websiteFormik.handleSubmit(),
|
|
||||||
)}
|
|
||||||
disabled={websiteFormik.isSubmitting || isLoading}
|
disabled={websiteFormik.isSubmitting || isLoading}
|
||||||
error={
|
error={websiteFormik.touched.url && Boolean(websiteFormik.errors.url)}
|
||||||
websiteFormik.touched.url &&
|
|
||||||
Boolean(websiteFormik.errors.url)
|
|
||||||
}
|
|
||||||
InputProps={{
|
InputProps={{
|
||||||
startAdornment: (
|
startAdornment: (
|
||||||
<InputAdornment position="start">
|
<InputAdornment position="start">
|
||||||
@ -107,15 +90,10 @@ export default function AddWebsiteField({
|
|||||||
</Grid>
|
</Grid>
|
||||||
<Grid item>
|
<Grid item>
|
||||||
<FormHelperText
|
<FormHelperText
|
||||||
error={
|
error={websiteFormik.touched.url && Boolean(websiteFormik.errors.url)}
|
||||||
websiteFormik.touched.url &&
|
|
||||||
Boolean(websiteFormik.errors.url)
|
|
||||||
}
|
|
||||||
>
|
>
|
||||||
{(websiteFormik.touched.url && websiteFormik.errors.url) ||
|
{(websiteFormik.touched.url && websiteFormik.errors.url) ||
|
||||||
t(
|
t("routes.AliasDetailRoute.sections.notes.form.websites.helperText")}
|
||||||
"routes.AliasDetailRoute.sections.notes.form.websites.helperText",
|
|
||||||
)}
|
|
||||||
</FormHelperText>
|
</FormHelperText>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
@ -28,14 +28,17 @@ import {
|
|||||||
} from "@mui/material"
|
} from "@mui/material"
|
||||||
|
|
||||||
import {parseFastAPIError} from "~/utils"
|
import {parseFastAPIError} from "~/utils"
|
||||||
import {FaviconImage, SimpleOverlayInformation} from "~/components"
|
import {
|
||||||
|
AuthContext,
|
||||||
|
FaviconImage,
|
||||||
|
FormikAutoLockNavigation,
|
||||||
|
SimpleOverlayInformation,
|
||||||
|
} from "~/components"
|
||||||
import {Alias, AliasNote, DecryptedAlias} from "~/server-types"
|
import {Alias, AliasNote, DecryptedAlias} from "~/server-types"
|
||||||
import {updateAlias} from "~/apis"
|
import {updateAlias} from "~/apis"
|
||||||
import {useErrorSuccessSnacks} from "~/hooks"
|
import {useErrorSuccessSnacks} from "~/hooks"
|
||||||
import {queryClient} from "~/constants/react-query"
|
import {queryClient} from "~/constants/react-query"
|
||||||
import AddWebsiteField from "~/route-widgets/AliasDetailRoute/AddWebsiteField"
|
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"
|
import decryptAliasNotes from "~/apis/helpers/decrypt-alias-notes"
|
||||||
|
|
||||||
export interface AliasNotesFormProps {
|
export interface AliasNotesFormProps {
|
||||||
|
@ -22,8 +22,7 @@ import {
|
|||||||
} from "~/constants/enum-mappings"
|
} from "~/constants/enum-mappings"
|
||||||
import {useErrorSuccessSnacks} from "~/hooks"
|
import {useErrorSuccessSnacks} from "~/hooks"
|
||||||
import {queryClient} from "~/constants/react-query"
|
import {queryClient} from "~/constants/react-query"
|
||||||
import AuthContext from "~/AuthContext/AuthContext"
|
import {AuthContext, FormikAutoLockNavigation} from "~/components"
|
||||||
import FormikAutoLockNavigation from "~/LockNavigationContext/FormikAutoLockNavigation"
|
|
||||||
import SelectField from "~/route-widgets/SettingsRoute/SelectField"
|
import SelectField from "~/route-widgets/SettingsRoute/SelectField"
|
||||||
import decryptAliasNotes from "~/apis/helpers/decrypt-alias-notes"
|
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 {Alias, DecryptedAlias} from "~/server-types"
|
||||||
import {UpdateAliasData, updateAlias} from "~/apis"
|
import {UpdateAliasData, updateAlias} from "~/apis"
|
||||||
import {useErrorSuccessSnacks, useUIState} from "~/hooks"
|
import {useErrorSuccessSnacks} from "~/hooks"
|
||||||
import {queryClient} from "~/constants/react-query"
|
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"
|
import decryptAliasNotes from "~/apis/helpers/decrypt-alias-notes"
|
||||||
|
|
||||||
export interface ChangeAliasActivationStatusSwitchProps {
|
export interface ChangeAliasActivationStatusSwitchProps {
|
||||||
|
@ -18,11 +18,11 @@ import {
|
|||||||
import {useMutation} from "@tanstack/react-query"
|
import {useMutation} from "@tanstack/react-query"
|
||||||
|
|
||||||
import {CreateAliasData, createAlias} from "~/apis"
|
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 {DEFAULT_ALIAS_NOTE} from "~/constants/values"
|
||||||
import {useErrorSuccessSnacks} from "~/hooks"
|
import {useErrorSuccessSnacks} from "~/hooks"
|
||||||
import {queryClient} from "~/constants/react-query"
|
import {queryClient} from "~/constants/react-query"
|
||||||
import AuthContext, {EncryptionStatus} from "~/AuthContext/AuthContext"
|
import {AuthContext, EncryptionStatus} from "~/components"
|
||||||
import CustomAliasDialog from "~/route-widgets/AliasesRoute/CustomAliasDialog"
|
import CustomAliasDialog from "~/route-widgets/AliasesRoute/CustomAliasDialog"
|
||||||
|
|
||||||
export function CreateAliasButton(): ReactElement {
|
export function CreateAliasButton(): ReactElement {
|
||||||
|
@ -9,7 +9,7 @@ import {Button} from "@mui/material"
|
|||||||
import {mdiTextBoxMultiple} from "@mdi/js/commonjs/mdi"
|
import {mdiTextBoxMultiple} from "@mdi/js/commonjs/mdi"
|
||||||
import Icon from "@mdi/react"
|
import Icon from "@mdi/react"
|
||||||
|
|
||||||
import LockNavigationContext from "~/LockNavigationContext/LockNavigationContext"
|
import {LockNavigationContext} from "~/components"
|
||||||
|
|
||||||
export enum NavigationSection {
|
export enum NavigationSection {
|
||||||
Overview,
|
Overview,
|
||||||
|
@ -1,13 +1,14 @@
|
|||||||
import {FaLongArrowAltRight} from "react-icons/fa"
|
import {FaLongArrowAltRight} from "react-icons/fa"
|
||||||
import {TiCancel} from "react-icons/ti"
|
import {TiCancel} from "react-icons/ti"
|
||||||
|
import {useTranslation} from "react-i18next"
|
||||||
import React, {ReactElement} from "react"
|
import React, {ReactElement} from "react"
|
||||||
|
|
||||||
import {Box, Button, Grid, Typography} from "@mui/material"
|
import {Box, Button, Grid, Typography} from "@mui/material"
|
||||||
import {MultiStepFormElement} from "~/components"
|
|
||||||
import {mdiTextBoxMultiple} from "@mdi/js/commonjs/mdi"
|
import {mdiTextBoxMultiple} from "@mdi/js/commonjs/mdi"
|
||||||
import {useTranslation} from "react-i18next"
|
|
||||||
import Icon from "@mdi/react"
|
import Icon from "@mdi/react"
|
||||||
|
|
||||||
|
import {MultiStepFormElement} from "~/components"
|
||||||
|
|
||||||
export interface GenerateEmailReportsFormProps {
|
export interface GenerateEmailReportsFormProps {
|
||||||
onYes: () => void
|
onYes: () => void
|
||||||
onNo: () => void
|
onNo: () => void
|
||||||
|
@ -11,14 +11,13 @@ import passwordGenerator from "secure-random-password"
|
|||||||
import {Box, InputAdornment} from "@mui/material"
|
import {Box, InputAdornment} from "@mui/material"
|
||||||
import {useMutation} from "@tanstack/react-query"
|
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 {encryptString, generateKeys, getEncryptionPassword, getUserSalt} from "~/utils"
|
||||||
import {useExtensionHandler, useNavigateToNext, useSystemPreferredTheme, useUser} from "~/hooks"
|
import {useExtensionHandler, useNavigateToNext, useSystemPreferredTheme, useUser} from "~/hooks"
|
||||||
import {MASTER_PASSWORD_LENGTH} from "~/constants/values"
|
import {MASTER_PASSWORD_LENGTH} from "~/constants/values"
|
||||||
import {AuthenticationDetails, ServerSettings, UserNote} from "~/server-types"
|
import {AuthenticationDetails, ServerSettings, UserNote} from "~/server-types"
|
||||||
import {UpdateAccountData, updateAccount} from "~/apis"
|
import {UpdateAccountData, updateAccount} from "~/apis"
|
||||||
import {encryptUserNote} from "~/utils/encrypt-user-note"
|
import {encryptUserNote} from "~/utils/encrypt-user-note"
|
||||||
import AuthContext from "~/AuthContext/AuthContext"
|
|
||||||
|
|
||||||
export interface PasswordFormProps {
|
export interface PasswordFormProps {
|
||||||
onDone: () => void
|
onDone: () => void
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
import {AxiosError} from "axios"
|
import {AxiosError} from "axios"
|
||||||
import {useLoaderData} from "react-router-dom"
|
import {useLoaderData} from "react-router-dom"
|
||||||
|
import {MdMail} from "react-icons/md"
|
||||||
|
import {useTranslation} from "react-i18next"
|
||||||
import React, {ReactElement} from "react"
|
import React, {ReactElement} from "react"
|
||||||
|
|
||||||
import {useMutation} from "@tanstack/react-query"
|
import {useMutation} from "@tanstack/react-query"
|
||||||
@ -7,8 +9,6 @@ import {useMutation} from "@tanstack/react-query"
|
|||||||
import {resendEmailLoginCode} from "~/apis"
|
import {resendEmailLoginCode} from "~/apis"
|
||||||
import {MutationStatusSnackbar, TimedButton} from "~/components"
|
import {MutationStatusSnackbar, TimedButton} from "~/components"
|
||||||
import {ServerSettings, SimpleDetailResponse} from "~/server-types"
|
import {ServerSettings, SimpleDetailResponse} from "~/server-types"
|
||||||
import {MdMail} from "react-icons/md"
|
|
||||||
import {useTranslation} from "react-i18next"
|
|
||||||
|
|
||||||
export interface ResendMailButtonProps {
|
export interface ResendMailButtonProps {
|
||||||
email: string
|
email: string
|
||||||
|
@ -8,7 +8,7 @@ import {Box, Grid, Paper, Typography} from "@mui/material"
|
|||||||
|
|
||||||
import {AuthenticationDetails, ServerUser} from "~/server-types"
|
import {AuthenticationDetails, ServerUser} from "~/server-types"
|
||||||
import {verifyLoginWithEmail} from "~/apis"
|
import {verifyLoginWithEmail} from "~/apis"
|
||||||
import LoadingData from "~/components/LoadingData"
|
import {LoadingData} from "~/components"
|
||||||
|
|
||||||
export interface ConfirmFromDifferentDeviceProps {
|
export interface ConfirmFromDifferentDeviceProps {
|
||||||
email: string
|
email: string
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import {ReactElement} from "react"
|
import {ReactElement} from "react"
|
||||||
import {useTranslation} from "react-i18next"
|
import {useTranslation} from "react-i18next"
|
||||||
import {BsArrowsAngleExpand} from "react-icons/bs"
|
import {BsArrowsAngleExpand} from "react-icons/bs"
|
||||||
import {HiOutlineExternalLink} from "react-icons/hi"
|
|
||||||
|
|
||||||
import {List, ListItemButton, ListItemText} from "@mui/material"
|
import {List, ListItemButton, ListItemText} from "@mui/material"
|
||||||
|
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
import {ReactElement} from "react"
|
import {ReactElement} from "react"
|
||||||
|
import {BsShieldShaded} from "react-icons/bs"
|
||||||
|
import {useTranslation} from "react-i18next"
|
||||||
|
|
||||||
import {List, ListItem, Typography} from "@mui/material"
|
import {List, ListItem, Typography} from "@mui/material"
|
||||||
|
|
||||||
import {DecryptedReportContent} from "~/server-types"
|
import {DecryptedReportContent} from "~/server-types"
|
||||||
import {BsShieldShaded} from "react-icons/bs"
|
|
||||||
import {useTranslation} from "react-i18next"
|
|
||||||
import {ExpandableListItem} from "~/components"
|
import {ExpandableListItem} from "~/components"
|
||||||
|
|
||||||
export interface SinglePixelImageTrackersListItemProps {
|
export interface SinglePixelImageTrackersListItemProps {
|
||||||
|
@ -30,7 +30,7 @@ import {
|
|||||||
IMAGE_PROXY_FORMAT_TYPE_NAME_MAP,
|
IMAGE_PROXY_FORMAT_TYPE_NAME_MAP,
|
||||||
PROXY_USER_AGENT_TYPE_NAME_MAP,
|
PROXY_USER_AGENT_TYPE_NAME_MAP,
|
||||||
} from "~/constants/enum-mappings"
|
} from "~/constants/enum-mappings"
|
||||||
import AuthContext from "~/AuthContext/AuthContext"
|
import {AuthContext} from "~/components"
|
||||||
|
|
||||||
interface Form {
|
interface Form {
|
||||||
removeTrackers: boolean
|
removeTrackers: boolean
|
||||||
|
@ -12,8 +12,8 @@ import {MultiStepFormElement, SimpleForm} from "~/components"
|
|||||||
import {SignupResult, checkIsDomainDisposable, signup} from "~/apis"
|
import {SignupResult, checkIsDomainDisposable, signup} from "~/apis"
|
||||||
import {parseFastAPIError} from "~/utils"
|
import {parseFastAPIError} from "~/utils"
|
||||||
import {ServerSettings} from "~/server-types"
|
import {ServerSettings} from "~/server-types"
|
||||||
|
|
||||||
import {useExtensionHandler} from "~/hooks"
|
import {useExtensionHandler} from "~/hooks"
|
||||||
|
|
||||||
import DetectEmailAutofillService from "./DetectEmailAutofillService"
|
import DetectEmailAutofillService from "./DetectEmailAutofillService"
|
||||||
|
|
||||||
export interface EmailFormProps {
|
export interface EmailFormProps {
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import {MdCancel, MdEdit} from "react-icons/md"
|
import {MdCancel, MdEdit} from "react-icons/md"
|
||||||
|
import {useTranslation} from "react-i18next"
|
||||||
import React, {ReactElement, useState} from "react"
|
import React, {ReactElement, useState} from "react"
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@ -14,7 +15,6 @@ import {
|
|||||||
} from "@mui/material"
|
} from "@mui/material"
|
||||||
|
|
||||||
import {MultiStepFormElement, OpenMailButton} from "~/components"
|
import {MultiStepFormElement, OpenMailButton} from "~/components"
|
||||||
import {useTranslation} from "react-i18next"
|
|
||||||
import ResendMailButton from "~/route-widgets/SignupRoute/YouGotMail/ResendMailButton"
|
import ResendMailButton from "~/route-widgets/SignupRoute/YouGotMail/ResendMailButton"
|
||||||
|
|
||||||
export interface YouGotMailProps {
|
export interface YouGotMailProps {
|
||||||
|
@ -10,7 +10,9 @@ import {getAlias} from "~/apis"
|
|||||||
import {Alias, DecryptedAlias} from "~/server-types"
|
import {Alias, DecryptedAlias} from "~/server-types"
|
||||||
import {
|
import {
|
||||||
AliasTypeIndicator,
|
AliasTypeIndicator,
|
||||||
|
AuthContext,
|
||||||
DecryptionPasswordMissingAlert,
|
DecryptionPasswordMissingAlert,
|
||||||
|
EncryptionStatus,
|
||||||
QueryResult,
|
QueryResult,
|
||||||
SimplePage,
|
SimplePage,
|
||||||
SimplePageBuilder,
|
SimplePageBuilder,
|
||||||
@ -18,7 +20,6 @@ import {
|
|||||||
import AliasAddress from "~/route-widgets/AliasDetailRoute/AliasAddress"
|
import AliasAddress from "~/route-widgets/AliasDetailRoute/AliasAddress"
|
||||||
import AliasNotesForm from "~/route-widgets/AliasDetailRoute/AliasNotesForm"
|
import AliasNotesForm from "~/route-widgets/AliasDetailRoute/AliasNotesForm"
|
||||||
import AliasPreferencesForm from "~/route-widgets/AliasDetailRoute/AliasPreferencesForm"
|
import AliasPreferencesForm from "~/route-widgets/AliasDetailRoute/AliasPreferencesForm"
|
||||||
import AuthContext, {EncryptionStatus} from "~/AuthContext/AuthContext"
|
|
||||||
import ChangeAliasActivationStatusSwitch from "~/route-widgets/AliasDetailRoute/ChangeAliasActivationStatusSwitch"
|
import ChangeAliasActivationStatusSwitch from "~/route-widgets/AliasDetailRoute/ChangeAliasActivationStatusSwitch"
|
||||||
import decryptAliasNotes from "~/apis/helpers/decrypt-alias-notes"
|
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 {Box, Button, Grid, List, ListItem, Paper, useTheme} from "@mui/material"
|
||||||
|
|
||||||
import {useUser} from "~/hooks"
|
import {useUser} from "~/hooks"
|
||||||
import {LanguageButton} from "~/components"
|
import {LanguageButton, LockNavigationContextProvider} from "~/components"
|
||||||
import LockNavigationContextProvider from "~/LockNavigationContext/LockNavigationContextProvider"
|
|
||||||
import NavigationButton, {
|
import NavigationButton, {
|
||||||
NavigationSection,
|
NavigationSection,
|
||||||
} from "~/route-widgets/AuthenticateRoute/NavigationButton"
|
} from "~/route-widgets/AuthenticateRoute/NavigationButton"
|
||||||
|
@ -3,9 +3,8 @@ import {useTranslation} from "react-i18next"
|
|||||||
|
|
||||||
import {Grid, Paper, Typography} from "@mui/material"
|
import {Grid, Paper, Typography} from "@mui/material"
|
||||||
|
|
||||||
import {MultiStepForm} from "~/components"
|
import {AuthContext, EncryptionStatus, MultiStepForm} from "~/components"
|
||||||
import {useNavigateToNext} from "~/hooks"
|
import {useNavigateToNext} from "~/hooks"
|
||||||
import AuthContext, {EncryptionStatus} from "~/AuthContext/AuthContext"
|
|
||||||
import GenerateEmailReportsForm from "~/route-widgets/CompleteAccountRoute/GenerateEmailReportsForm"
|
import GenerateEmailReportsForm from "~/route-widgets/CompleteAccountRoute/GenerateEmailReportsForm"
|
||||||
import PasswordForm from "~/route-widgets/CompleteAccountRoute/PasswordForm"
|
import PasswordForm from "~/route-widgets/CompleteAccountRoute/PasswordForm"
|
||||||
|
|
||||||
|
@ -6,11 +6,11 @@ import {useTranslation} from "react-i18next"
|
|||||||
import {useLoaderData} from "react-router-dom"
|
import {useLoaderData} from "react-router-dom"
|
||||||
|
|
||||||
import {InputAdornment} from "@mui/material"
|
import {InputAdornment} from "@mui/material"
|
||||||
|
|
||||||
import {useNavigateToNext, useUser} from "~/hooks"
|
import {useNavigateToNext, useUser} from "~/hooks"
|
||||||
import {PasswordField, SimpleForm} from "~/components"
|
import {AuthContext, PasswordField, SimpleForm} from "~/components"
|
||||||
import {getMasterPassword} from "~/utils"
|
import {getMasterPassword} from "~/utils"
|
||||||
import {ServerSettings} from "~/server-types"
|
import {ServerSettings} from "~/server-types"
|
||||||
import AuthContext from "~/AuthContext/AuthContext"
|
|
||||||
|
|
||||||
interface Form {
|
interface Form {
|
||||||
password: string
|
password: string
|
||||||
|
@ -2,9 +2,8 @@ import {ReactElement, useContext, useState} from "react"
|
|||||||
import {useNavigate} from "react-router-dom"
|
import {useNavigate} from "react-router-dom"
|
||||||
import {useUpdateEffect} from "react-use"
|
import {useUpdateEffect} from "react-use"
|
||||||
|
|
||||||
import {MultiStepForm} from "~/components"
|
import {AuthContext, MultiStepForm} from "~/components"
|
||||||
import {useQueryParams} from "~/hooks"
|
import {useQueryParams} from "~/hooks"
|
||||||
import AuthContext from "~/AuthContext/AuthContext"
|
|
||||||
import ConfirmCodeForm from "~/route-widgets/LoginRoute/ConfirmCodeForm/ConfirmCodeForm"
|
import ConfirmCodeForm from "~/route-widgets/LoginRoute/ConfirmCodeForm/ConfirmCodeForm"
|
||||||
import ConfirmFromDifferentDevice from "~/route-widgets/LoginRoute/ConfirmFromDifferentDevice"
|
import ConfirmFromDifferentDevice from "~/route-widgets/LoginRoute/ConfirmFromDifferentDevice"
|
||||||
import EmailForm from "~/route-widgets/LoginRoute/EmailForm"
|
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 {Box, CircularProgress, Grid, Paper, Typography} from "@mui/material"
|
||||||
|
|
||||||
import {useNavigateToNext} from "~/hooks"
|
import {useNavigateToNext} from "~/hooks"
|
||||||
import AuthContext from "~/AuthContext/AuthContext"
|
import {AuthContext} from "~/components"
|
||||||
|
|
||||||
export default function LogoutRoute(): ReactElement {
|
export default function LogoutRoute(): ReactElement {
|
||||||
const {t} = useTranslation()
|
const {t} = useTranslation()
|
||||||
|
@ -8,12 +8,11 @@ import {List} from "@mui/material"
|
|||||||
|
|
||||||
import {DecryptedReportContent, Report} from "~/server-types"
|
import {DecryptedReportContent, Report} from "~/server-types"
|
||||||
import {getReport} from "~/apis"
|
import {getReport} from "~/apis"
|
||||||
import {DecryptReport, SimpleOverlayInformation, SimplePageBuilder} from "~/components"
|
import {DecryptReport, QueryResult, SimpleOverlayInformation, SimplePageBuilder} from "~/components"
|
||||||
import {WithEncryptionRequired} from "~/hocs"
|
import {WithEncryptionRequired} from "~/hocs"
|
||||||
import DeleteButton from "~/route-widgets/ReportDetailRoute/DeleteButton"
|
import DeleteButton from "~/route-widgets/ReportDetailRoute/DeleteButton"
|
||||||
import ExpandedUrlsListItem from "~/route-widgets/ReportDetailRoute/ExpandedUrlsListItem"
|
import ExpandedUrlsListItem from "~/route-widgets/ReportDetailRoute/ExpandedUrlsListItem"
|
||||||
import ProxiedImagesListItem from "~/route-widgets/ReportDetailRoute/ProxiedImagesListItem"
|
import ProxiedImagesListItem from "~/route-widgets/ReportDetailRoute/ProxiedImagesListItem"
|
||||||
import QueryResult from "~/components/QueryResult"
|
|
||||||
import SinglePixelImageTrackersListItem from "~/route-widgets/ReportDetailRoute/SinglePixelImageTrackersListItem"
|
import SinglePixelImageTrackersListItem from "~/route-widgets/ReportDetailRoute/SinglePixelImageTrackersListItem"
|
||||||
|
|
||||||
function ReportDetailRoute(): ReactElement {
|
function ReportDetailRoute(): ReactElement {
|
||||||
|
@ -12,12 +12,10 @@ import {InputAdornment, List, MenuItem, TextField, Typography} from "@mui/materi
|
|||||||
import {DecryptedReportContent, PaginationResult, Report} from "~/server-types"
|
import {DecryptedReportContent, PaginationResult, Report} from "~/server-types"
|
||||||
import {getReports} from "~/apis"
|
import {getReports} from "~/apis"
|
||||||
import {WithEncryptionRequired} from "~/hocs"
|
import {WithEncryptionRequired} from "~/hocs"
|
||||||
import {DecryptReport} from "~/components"
|
import {DecryptReport, QueryResult, SimplePage} from "~/components"
|
||||||
import {createEnumMapFromTranslation} from "~/utils"
|
import {createEnumMapFromTranslation} from "~/utils"
|
||||||
import EmptyStateScreen from "~/route-widgets/ReportsRoute/EmptyStateScreen"
|
import EmptyStateScreen from "~/route-widgets/ReportsRoute/EmptyStateScreen"
|
||||||
import QueryResult from "~/components/QueryResult"
|
|
||||||
import ReportInformationItem from "~/route-widgets/ReportsRoute/ReportInformationItem"
|
import ReportInformationItem from "~/route-widgets/ReportsRoute/ReportInformationItem"
|
||||||
import SimplePage from "~/components/SimplePage"
|
|
||||||
|
|
||||||
enum SortingView {
|
enum SortingView {
|
||||||
List = "List",
|
List = "List",
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
import {Outlet} from "react-router-dom"
|
import {Outlet} from "react-router-dom"
|
||||||
import React, {ReactElement} from "react"
|
import React, {ReactElement} from "react"
|
||||||
|
|
||||||
import {ExtensionSignalHandler} from "~/components"
|
import {AppLoadingScreen, AuthContextProvider, ExtensionSignalHandler} from "~/components"
|
||||||
import AppLoadingScreen from "~/AppLoadingScreen/AppLoadingScreen"
|
|
||||||
import AuthContextProvider from "~/AuthContext/AuthContextProvider"
|
|
||||||
|
|
||||||
export default function RootRoute(): ReactElement {
|
export default function RootRoute(): ReactElement {
|
||||||
return (
|
return (
|
||||||
|
@ -12,7 +12,7 @@ import {useMutation} from "@tanstack/react-query"
|
|||||||
import {AuthenticationDetails, ServerSettings} from "~/server-types"
|
import {AuthenticationDetails, ServerSettings} from "~/server-types"
|
||||||
import {VerifyEmailData, verifyEmail} from "~/apis"
|
import {VerifyEmailData, verifyEmail} from "~/apis"
|
||||||
import {useQueryParams} from "~/hooks"
|
import {useQueryParams} from "~/hooks"
|
||||||
import AuthContext from "~/AuthContext/AuthContext"
|
import {AuthContext} from "~/components"
|
||||||
|
|
||||||
const emailSchema = yup.string().email()
|
const emailSchema = yup.string().email()
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ export default async function generateKeys(): Promise<
|
|||||||
SerializedKeyPair<string> & {revocationCertificate: string}
|
SerializedKeyPair<string> & {revocationCertificate: string}
|
||||||
> {
|
> {
|
||||||
return generateKey({
|
return generateKey({
|
||||||
type: "rsa",
|
type: "ecc",
|
||||||
format: "armored",
|
format: "armored",
|
||||||
userIDs: [{name: "John Smith", email: "john@example.com"}],
|
userIDs: [{name: "John Smith", email: "john@example.com"}],
|
||||||
passphrase: "",
|
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 {Theme, UserNote} from "~/server-types"
|
||||||
|
|
||||||
import decryptString from "./decrypt-string"
|
import decryptString from "./crypto/decrypt-string"
|
||||||
import encryptString from "./encrypt-string"
|
import encryptString from "./crypto/encrypt-string"
|
||||||
|
|
||||||
export const USER_NOTE_SCHEMA = yup.object().shape({
|
export const USER_NOTE_SCHEMA = yup.object().shape({
|
||||||
privateKey: yup.string().required(),
|
privateKey: yup.string().required(),
|
||||||
theme: yup.string().oneOf(Object.values(Theme)).required(),
|
theme: yup.string().oneOf(Object.values(Theme)).required(),
|
||||||
})
|
})
|
||||||
|
|
||||||
export function decryptUserNote(
|
export function decryptUserNote(encryptedUserNote: string, password: string): UserNote {
|
||||||
encryptedUserNote: string,
|
|
||||||
password: string,
|
|
||||||
): UserNote {
|
|
||||||
const data = decryptString(encryptedUserNote, password)
|
const data = decryptString(encryptedUserNote, password)
|
||||||
const userNote = JSON.parse(data)
|
const userNote = JSON.parse(data)
|
||||||
|
|
||||||
|
@ -1,22 +1,12 @@
|
|||||||
export * from "./app-url-links"
|
export * from "./app-url-links"
|
||||||
export {default as APP_LINK_MAP} 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 * from "./parse-fastapi-error"
|
||||||
export {default as parseFastAPIError} from "./parse-fastapi-error"
|
export {default as parseFastAPIError} from "./parse-fastapi-error"
|
||||||
export * from "./when-element-has-bounds"
|
export * from "./when-element-has-bounds"
|
||||||
export {default as whenElementHasBounds} 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 * from "./when-enter-pressed"
|
||||||
export {default as whenEnterPressed} from "./when-enter-pressed"
|
export {default as whenEnterPressed} from "./when-enter-pressed"
|
||||||
export * from "./create-enum-map-from-translation"
|
export * from "./create-enum-map-from-translation"
|
||||||
export {default as createEnumMapFromTranslation} 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 "./crypto"
|
||||||
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"
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import {AxiosError} from "axios"
|
import {AxiosError} from "axios"
|
||||||
import {FormikErrors} from "formik"
|
import {FormikErrors} from "formik"
|
||||||
|
|
||||||
import {SimpleDetailResponse} from "~/server-types"
|
import {SimpleDetailResponse} from "~/server-types"
|
||||||
|
|
||||||
export interface FastAPIError {
|
export interface FastAPIError {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user