From 5dfb5e5a9a0db969f590e143a4aaf35dad6b8c24 Mon Sep 17 00:00:00 2001
From: Brandon Egger <brandonegger64@gmail.com>
Date: Sun, 25 Jun 2023 20:42:59 -0500
Subject: [PATCH] add icon image selected preview

---
 src/components/admin/resources/form.tsx | 49 +++++++++++++++----------
 src/pages/resources/[id]/edit.tsx       | 14 +++++++
 2 files changed, 43 insertions(+), 20 deletions(-)

diff --git a/src/components/admin/resources/form.tsx b/src/components/admin/resources/form.tsx
index 539adbf..c32b3b0 100644
--- a/src/components/admin/resources/form.tsx
+++ b/src/components/admin/resources/form.tsx
@@ -53,22 +53,30 @@ export type ResourceUpdateInput = RouterInputs["auditoryResource"]["update"];
  *
  * File needs to be path relative to resource_logos/
  */
-const SelectImageInput = ({ file }: { file?: string }) => {
-  const { getValues } = useFormContext<ResourceUpdateInput>();
+const SelectImageInput = ({
+  file,
+  setIconFile,
+}: {
+  file?: string;
+  setIconFile: (file: File) => void;
+}) => {
+  const [previewImg, setPreviewImg] = useState<string | undefined>(
+    `/resource_logos/${file ?? ""}`
+  );
 
-  const onChange = async (event: ChangeEvent<HTMLInputElement>) => {
-    const data = new FormData();
+  const onChange = (event: ChangeEvent<HTMLInputElement>) => {
     if (!event.target.files || !event.target.files[0]) {
       return;
     }
 
-    const resourceId = getValues("id");
-    data.append("photo", event.target.files[0]);
+    const file = event.target.files[0];
+    const reader = new FileReader();
+    reader.onloadend = () => {
+      setPreviewImg(reader.result as string);
+    };
+    reader.readAsDataURL(file);
 
-    await fetch(`/api/resources/photo/${resourceId}`, {
-      method: "POST",
-      body: data,
-    });
+    setIconFile(file);
   };
 
   return (
@@ -79,7 +87,7 @@ const SelectImageInput = ({ file }: { file?: string }) => {
       >
         <Image
           className="w-full"
-          src={`/resource_logos/${file ?? ""}`}
+          src={previewImg ?? ""}
           alt={`resource logo`}
           width={512}
           height={512}
@@ -89,13 +97,7 @@ const SelectImageInput = ({ file }: { file?: string }) => {
         </div>
       </label>
       <input
-        onChange={(event) => {
-          onChange(event).catch(() => {
-            throw new Error(
-              "Unexpected error occured when selecting new file."
-            );
-          });
-        }}
+        onChange={onChange}
         accept="image/*"
         id="resource-image-file"
         type="file"
@@ -333,8 +335,10 @@ const PaymentTypeOption = ({
  */
 function ResourceSummarySubForm({
   resource,
+  setIconFile,
 }: {
   resource?: ResourceUpdateInput;
+  setIconFile: (file: File) => void;
 }) {
   const { register } = useFormContext<ResourceUpdateInput>();
 
@@ -342,7 +346,7 @@ function ResourceSummarySubForm({
     <div className="space-y-4 px-4">
       <div className="flex flex-row space-x-4 sm:mt-4">
         <div className="flex w-20 flex-col justify-center space-y-2 sm:w-28">
-          <SelectImageInput file={resource?.icon} />
+          <SelectImageInput file={resource?.icon} setIconFile={setIconFile} />
         </div>
         <div className="flex flex-col justify-center overflow-hidden rounded-xl border border-neutral-400 bg-white drop-shadow-lg sm:w-[300px] md:w-[400px]">
           <h2 className="border-b border-neutral-300 px-2 text-center font-semibold">
@@ -462,10 +466,12 @@ const ResourceDescriptionSubForm = () => {
 };
 
 const ResourceForm = ({
+  setIconFile,
   methods,
   resource,
   error,
 }: {
+  setIconFile: (file: File) => void;
   resource?: ResourceUpdateInput;
   methods: UseFormReturn<ResourceUpdateInput>;
   error?: string;
@@ -487,7 +493,10 @@ const ResourceForm = ({
             General
           </h1>
           <div className="justify-left mx-auto flex max-w-lg flex-col space-y-4 pb-5">
-            <ResourceSummarySubForm resource={resource} />
+            <ResourceSummarySubForm
+              resource={resource}
+              setIconFile={setIconFile}
+            />
             <ResourceDescriptionSubForm />
           </div>
         </div>
diff --git a/src/pages/resources/[id]/edit.tsx b/src/pages/resources/[id]/edit.tsx
index e4fa6fd..ab1855b 100644
--- a/src/pages/resources/[id]/edit.tsx
+++ b/src/pages/resources/[id]/edit.tsx
@@ -46,6 +46,7 @@ const EditResourcePage = (
   props: InferGetServerSidePropsType<typeof getServerSideProps>
 ) => {
   const { resource } = props;
+  const [updateIconFile, setIconFile] = useState<File | undefined>(undefined);
   const [serverError, setServerError] = useState<string | undefined>(undefined);
   const formMethods = useForm<ResourceUpdateInput>({
     defaultValues: resource as ResourceUpdateInput,
@@ -59,6 +60,18 @@ const EditResourcePage = (
   });
 
   const onSubmit: SubmitHandler<ResourceUpdateInput> = (data) => {
+    if (updateIconFile) {
+      console.log("we need to update the file!");
+    }
+
+    // const data = new FormData();
+    // data.append("photo", event.target.files[0]);
+
+    // await fetch(`/api/resources/photo/${resourceId}`, {
+    //   method: "POST",
+    //   body: data,
+    // });
+
     mutate(data);
   };
 
@@ -102,6 +115,7 @@ const EditResourcePage = (
       >
         <main className="mb-12">
           <ResourceForm
+            setIconFile={setIconFile}
             methods={formMethods}
             error={serverError}
             resource={resource as ResourceUpdateInput}