From 23dfba812a813d3481e6a535a57f84292e113e44 Mon Sep 17 00:00:00 2001 From: redglow Date: Sun, 21 Jun 2026 15:21:21 +0200 Subject: [PATCH] feat: image preview --- .../components/AddOrEditAnnouncement.tsx | 114 ++++++++++++++++++ src/client/routes/add/index.tsx | 63 +--------- 2 files changed, 116 insertions(+), 61 deletions(-) create mode 100644 src/client/components/AddOrEditAnnouncement.tsx diff --git a/src/client/components/AddOrEditAnnouncement.tsx b/src/client/components/AddOrEditAnnouncement.tsx new file mode 100644 index 0000000..cf78268 --- /dev/null +++ b/src/client/components/AddOrEditAnnouncement.tsx @@ -0,0 +1,114 @@ +import CloudUploadIcon from "@mui/icons-material/CloudUpload"; +import { + Button, + FormLabel, + TextareaAutosize, + TextField, + Typography, +} from "@mui/material"; +import { Box, styled } from "@mui/system"; +import { DatePicker } from "@mui/x-date-pickers"; +import { type ChangeEvent, useState } from "react"; +import type { Announcement } from "../services"; + +const VisuallyHiddenInput = styled("input")({ + clip: "rect(0 0 0 0)", + clipPath: "inset(50%)", + height: 1, + overflow: "hidden", + position: "absolute", + bottom: 0, + left: 0, + whiteSpace: "nowrap", + width: 1, +}); + +export interface AddOrEditAnnouncementProps { + announcement?: Announcement; +} + +function blobToDataURL(blob: Blob): Promise { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = (_e) => resolve(reader.result as string); + reader.onerror = (_e) => reject(reader.error); + reader.onabort = (_e) => reject(new Error("Read aborted")); + reader.readAsDataURL(blob); + }); +} + +export function AddOrEditAnnouncement({ + announcement, +}: AddOrEditAnnouncementProps) { + const [currentImageUrl, setCurrentImageUrl] = useState( + undefined, + ); + + return ( + :not(style)": { m: 1, width: "25ch" }, + }} + noValidate + autoComplete="off" + > + + Text: + + Publication Date: + + + Current image: + {currentImageUrl ? ( + Current + ) : ( + None + )} + + + ); +} diff --git a/src/client/routes/add/index.tsx b/src/client/routes/add/index.tsx index 0c599ea..4f18733 100644 --- a/src/client/routes/add/index.tsx +++ b/src/client/routes/add/index.tsx @@ -1,69 +1,10 @@ -import CloudUploadIcon from "@mui/icons-material/CloudUpload"; -import { - Box, - Button, - FormLabel, - styled, - TextareaAutosize, - TextField, -} from "@mui/material"; -import { DatePicker } from "@mui/x-date-pickers"; import { createFileRoute } from "@tanstack/react-router"; -import type { ChangeEvent } from "react"; - -const VisuallyHiddenInput = styled("input")({ - clip: "rect(0 0 0 0)", - clipPath: "inset(50%)", - height: 1, - overflow: "hidden", - position: "absolute", - bottom: 0, - left: 0, - whiteSpace: "nowrap", - width: 1, -}); +import { AddOrEditAnnouncement } from "../../components/AddOrEditAnnouncement"; export const Route = createFileRoute("/add/")({ component: RouteComponent, }); function RouteComponent() { - return ( - :not(style)": { m: 1, width: "25ch" }, - }} - noValidate - autoComplete="off" - > - - Text: - - - - - - ); + return ; }