diff --git a/frontend/public/icons.svg b/frontend/public/icons.svg deleted file mode 100644 index e952219..0000000 --- a/frontend/public/icons.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/frontend/src/assets/envelope/stamp.png b/frontend/src/assets/envelope/stamp.png new file mode 100644 index 0000000..1c892ed Binary files /dev/null and b/frontend/src/assets/envelope/stamp.png differ diff --git a/frontend/src/assets/envelope/waxSeal.png b/frontend/src/assets/envelope/waxSeal.png new file mode 100644 index 0000000..9e638e2 Binary files /dev/null and b/frontend/src/assets/envelope/waxSeal.png differ diff --git a/frontend/src/components/ui/EnvelopeReveal.tsx b/frontend/src/components/ui/EnvelopeReveal.tsx index 9ffe250..bafaf88 100644 --- a/frontend/src/components/ui/EnvelopeReveal.tsx +++ b/frontend/src/components/ui/EnvelopeReveal.tsx @@ -1,4 +1,7 @@ -import { useState } from "react"; +import { WavesIcon } from "@phosphor-icons/react"; +import { useRef, useState } from "react"; +import stamp from "../../assets/envelope/stamp.png"; +import waxSeal from "../../assets/envelope/waxSeal.png"; export interface EnvelopeRevealProps { recipient?: string; @@ -12,45 +15,93 @@ export function EnvelopeReveal({ onRevealComplete, }: EnvelopeRevealProps) { const [revealLetter, setRevealLetter] = useState(false); + const [isFlipped, setIsFlipped] = useState(false); + + const flapCheckbox = useRef(null); const handleClick = () => { setRevealLetter(true); setTimeout(() => { onRevealComplete(); - }, 1000); + }, 2500); }; return ( -
-
+
+
- -
-
+
+
+ +
+ Seal flapCheckbox.current?.click()} + /> + -
-
-
+
+
+ +
+ +
setIsFlipped((prev) => !prev)} + > + + to + +

+ {recipient} +

+

{date}

+ {"stamp"} + + +
+
+
); } diff --git a/frontend/src/pages/Reader.tsx b/frontend/src/pages/Reader.tsx index 0d7545d..a99f573 100644 --- a/frontend/src/pages/Reader.tsx +++ b/frontend/src/pages/Reader.tsx @@ -12,7 +12,7 @@ import { LogModal } from "../components/ui/LogModal"; import { endpoints } from "../config/endpoints"; import { useKeyStore } from "../store/useKeyStore"; import { CryptoUtils } from "../utils/crypto"; -import { formatRelativeDate } from "../utils/dateFormat"; +import { formatDate } from "../utils/dateFormat"; import { decryptCanvasImages, decryptCanvasImagesWithSharingKey, @@ -215,10 +215,10 @@ export default function Reader() { className={`transition-all duration-1000 relative ${revealState === "revealed" ? "opacity-0 w-0 h-0" : "opacity-100"}`} > setRevealState("revealed")} diff --git a/frontend/src/utils/dateFormat.test.ts b/frontend/src/utils/dateFormat.test.ts index 3eedd91..98f8198 100644 --- a/frontend/src/utils/dateFormat.test.ts +++ b/frontend/src/utils/dateFormat.test.ts @@ -1,4 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { formatDate } from "../../../../../../../../../home/atom/Documents/code/pi_ku/frontend/src/utils/dateFormat"; import { formatRelativeDate } from "./dateFormat"; describe("formatRelativeDate", () => { @@ -35,3 +36,11 @@ describe("formatRelativeDate", () => { expect(result).toBe("Apr 1, 2026, 6:45 PM"); }); }); + +describe("formatDate", () => { + it("should format a new date as mmm dd, yyyy", () => { + const result = formatDate("2026-04-01T10:15:00Z"); + + expect(result).toBe("April 1, 2026"); + }); +}); diff --git a/frontend/src/utils/dateFormat.ts b/frontend/src/utils/dateFormat.ts index 65b1779..fc72e4a 100644 --- a/frontend/src/utils/dateFormat.ts +++ b/frontend/src/utils/dateFormat.ts @@ -7,6 +7,10 @@ const dateTimeFormatter = new Intl.DateTimeFormat("en-US", { timeStyle: "short", }); +const dateFormatter = new Intl.DateTimeFormat("en-US", { + dateStyle: "long", +}); + const rtf = new Intl.RelativeTimeFormat("en-US", { numeric: "auto", }); @@ -50,3 +54,10 @@ export function formateRelativeDateWithoutTime(input: Date | string | number) { return date.toDateString(); } + +export function formatDate(input: Date | string | number) { + if (!input) return ""; + const date = new Date(input); + + return dateFormatter.format(date); +}