diff --git a/src/constants/values.ts b/src/constants/values.ts index 4dbd6b0..93d31f2 100644 --- a/src/constants/values.ts +++ b/src/constants/values.ts @@ -7,6 +7,7 @@ export const URL_REGEX = export const DEFAULT_ALIAS_NOTE: AliasNote = { version: "1.0", data: { + createdAt: null, personalNotes: "", websites: [], }, diff --git a/src/route-widgets/AliasDetailRoute/AliasNotesForm.tsx b/src/route-widgets/AliasDetailRoute/AliasNotesForm.tsx index 6abf449..cfc60e5 100644 --- a/src/route-widgets/AliasDetailRoute/AliasNotesForm.tsx +++ b/src/route-widgets/AliasDetailRoute/AliasNotesForm.tsx @@ -2,6 +2,7 @@ import * as yup from "yup" import {TiDelete} from "react-icons/ti" import {AxiosError} from "axios" import {ReactElement, useContext} from "react" +import {MdEditCalendar} from "react-icons/md" import {RiLinkM, RiStickyNoteFill} from "react-icons/ri" import {FieldArray, FormikProvider, useFormik} from "formik" import update from "immutability-helper" @@ -20,6 +21,8 @@ import { ListItemSecondaryAction, ListItemText, TextField, + Tooltip, + Typography, } from "@mui/material" import {URL_REGEX} from "~/constants/values" @@ -28,6 +31,7 @@ import {BackupImage, ErrorSnack, SuccessSnack} from "~/components" import {Alias, AliasNote, DecryptedAlias} from "~/server-types" import {UpdateAliasData, updateAlias} from "~/apis" import AuthContext from "~/AuthContext/AuthContext" +import format from "date-fns/format" export interface AliasNotesFormProps { id: string @@ -153,6 +157,29 @@ export default function AliasNotesForm({ <>
+ {notes.data.createdAt && ( + + + + + + + + + {format(notes.data.createdAt, "Pp")} + + + + + + )} ("") + const {mutateAsync, isLoading, isSuccess} = useMutation< Alias, AxiosError, CreateAliasData - >(values => createAlias(values), { - onSuccess: onCreated, - onError: error => - setErrorMessage(parseFastAPIError(error).detail as string), - }) + >( + async values => { + if (encryptionStatus === EncryptionStatus.Available) { + values.encryptedNotes = await _encryptUsingMasterPassword( + JSON.stringify( + update(DEFAULT_ALIAS_NOTE, { + data: { + createdAt: { + $set: new Date(), + }, + }, + }), + ), + ) + } + + return createAlias(values) + }, + { + onSuccess: onCreated, + onError: error => + setErrorMessage(parseFastAPIError(error).detail as string), + }, + ) const [showCustomCreateDialog, setShowCustomCreateDialog] = useState(false) diff --git a/src/routes/AliasDetailRoute.tsx b/src/routes/AliasDetailRoute.tsx index f335cde..4a28a57 100644 --- a/src/routes/AliasDetailRoute.tsx +++ b/src/routes/AliasDetailRoute.tsx @@ -14,7 +14,7 @@ import AuthContext, {EncryptionStatus} from "~/AuthContext/AuthContext" export default function AliasDetailRoute(): ReactElement { const params = useParams() const address = atob(params.addressInBase64 as string) - const {user, _decryptUsingMasterPassword, encryptionStatus} = + const {_decryptUsingMasterPassword, encryptionStatus} = useContext(AuthContext) const query = useQuery( diff --git a/src/server-types.ts b/src/server-types.ts index 35157be..b1f2dbb 100644 --- a/src/server-types.ts +++ b/src/server-types.ts @@ -95,10 +95,10 @@ export interface Alias { export interface AliasNote { version: "1.0" data: { + createdAt: Date | null personalNotes: string websites: Array<{ url: string - createdAt: Date }> } } diff --git a/src/utils/decrypt-alias-notes.ts b/src/utils/decrypt-alias-notes.ts index ca4ab0f..a336150 100644 --- a/src/utils/decrypt-alias-notes.ts +++ b/src/utils/decrypt-alias-notes.ts @@ -1,4 +1,6 @@ -import {Alias, DecryptedAlias} from "~/server-types" +import update from "immutability-helper" + +import {Alias, AliasNote, DecryptedAlias} from "~/server-types" import {AuthContextType} from "~/AuthContext/AuthContext" import {DEFAULT_ALIAS_NOTE} from "~/constants/values" @@ -9,12 +11,22 @@ export default function decryptAliasNotes( if (!alias.encryptedNotes) { return { ...alias, - notes: DEFAULT_ALIAS_NOTE, + notes: update(DEFAULT_ALIAS_NOTE, {}), } } return { ...alias, - notes: JSON.parse(decryptContent(alias.encryptedNotes)), + notes: update( + JSON.parse(decryptContent(alias.encryptedNotes)), + { + data: { + createdAt: { + $apply: createdAt => + createdAt ? new Date(createdAt) : null, + }, + }, + }, + ), } }