Skip to content

Commit f96b93c

Browse files
committed
Added: image removal from modify form feature
1 parent 7a6e809 commit f96b93c

File tree

2 files changed

+69
-18
lines changed

2 files changed

+69
-18
lines changed

src/app/page.tsx

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import ImageModifyForm, {
1111
} from "@/components/image-modify-form";
1212
import { ChevronLeft, Loader } from "lucide-react";
1313
import Header from "@/components/header";
14-
import * as process from "node:process";
1514

1615
interface UploadFormData {
1716
title: string;
@@ -102,6 +101,44 @@ export default function HomePage() {
102101
setModifications((prevModifications) => [...prevModifications, data]);
103102
};
104103

104+
const handleRemove = (index: number) => {
105+
const dt = new DataTransfer();
106+
107+
const inputElement = document.getElementById(
108+
"image-selection",
109+
) as HTMLInputElement;
110+
111+
if (inputElement?.files) {
112+
const { files } = inputElement;
113+
114+
for (let i = 0; i < files.length; i++) {
115+
if (i !== index) {
116+
dt.items.add(files[i]!);
117+
}
118+
}
119+
120+
inputElement.files = dt.files;
121+
122+
setImageFiles(Array.from(dt.files));
123+
124+
setImageMetas((prevMetas) => {
125+
const newMetas = [...prevMetas];
126+
newMetas.splice(index, 1);
127+
return newMetas;
128+
});
129+
130+
setModifications((prevModifications) => {
131+
const newModifications = [...prevModifications];
132+
newModifications.splice(index, 1);
133+
return newModifications;
134+
});
135+
136+
if (dt.files.length === 0) {
137+
setInputFileKey((prev) => prev + 1);
138+
}
139+
}
140+
};
141+
105142
const processImagesMutation = useMutation({
106143
mutationFn: async (formData: FormData) => {
107144
const res = await fetch("/api/modify", {
@@ -232,11 +269,12 @@ export default function HomePage() {
232269
<div className="space-y-6">
233270
<input
234271
key={inputFileKey}
272+
id="image-selection"
235273
type="file"
236274
multiple
237275
accept="image/*"
238276
onChange={handleImageSelection}
239-
className="bg-input w-full rounded border border-primary p-2 text-primary"
277+
className="w-full rounded border border-primary bg-input p-2 text-primary"
240278
/>
241279
<div className="flex-start flex flex-wrap gap-10">
242280
{imageMetas.map((meta, index) => (
@@ -245,20 +283,21 @@ export default function HomePage() {
245283
imageData={meta}
246284
index={index}
247285
onClone={handleClone}
286+
onRemove={handleRemove}
248287
onChange={(data) => handleModificationChange(index, data)}
249288
/>
250289
))}
251290
</div>
252291
{imageFiles.length > 0 && (
253292
<div className="flex">
254293
<button
255-
className="bg-gradient-button disabled:bg-gradient-button-disabled disabled:text-disabled ml-auto mt-4 flex h-[40px] items-center rounded px-10 font-bold text-primary transition disabled:opacity-50"
294+
className="ml-auto mt-4 flex h-[40px] items-center rounded bg-gradient-button px-10 font-bold text-primary transition disabled:bg-gradient-button-disabled disabled:text-disabled disabled:opacity-50"
256295
onClick={resetForms}
257296
>
258297
Reset
259298
</button>
260299
<button
261-
className="text-md bg-gradient-button disabled:bg-gradient-button-disabled disabled:text-disabled ml-5 mt-4 flex h-[40px] items-center rounded px-10 font-bold text-primary transition disabled:opacity-50"
300+
className="text-md ml-5 mt-4 flex h-[40px] items-center rounded bg-gradient-button px-10 font-bold text-primary transition disabled:bg-gradient-button-disabled disabled:text-disabled disabled:opacity-50"
262301
onClick={handleModificationSubmit}
263302
disabled={loading}
264303
>
@@ -277,7 +316,7 @@ export default function HomePage() {
277316
<button
278317
type="button"
279318
onClick={() => setStep(1)}
280-
className="bg-gradient-button mt-2 flex h-[40px] w-[200px] items-center justify-center rounded-md text-primary"
319+
className="mt-2 flex h-[40px] w-[200px] items-center justify-center rounded-md bg-gradient-button text-primary"
281320
>
282321
<ChevronLeft size={32} />
283322
</button>
@@ -293,19 +332,19 @@ export default function HomePage() {
293332
</div>
294333
<div className="flex">
295334
<button
296-
className="bg-gradient-button disabled:bg-gradient-button-disabled disabled:text-disabled mt-4 flex h-[40px] items-center rounded px-10 font-bold text-primary transition disabled:opacity-50"
335+
className="mt-4 flex h-[40px] items-center rounded bg-gradient-button px-10 font-bold text-primary transition disabled:bg-gradient-button-disabled disabled:text-disabled disabled:opacity-50"
297336
onClick={resetForms}
298337
>
299338
Reset
300339
</button>
301340
<button
302-
className="bg-gradient-button disabled:bg-gradient-button-disabled disabled:text-disabled ml-auto mt-4 flex h-[40px] items-center rounded px-10 font-bold text-primary transition disabled:opacity-50"
341+
className="ml-auto mt-4 flex h-[40px] items-center rounded bg-gradient-button px-10 font-bold text-primary transition disabled:bg-gradient-button-disabled disabled:text-disabled disabled:opacity-50"
303342
onClick={handleDownload}
304343
>
305344
Download
306345
</button>
307346
<button
308-
className="bg-gradient-button disabled:bg-gradient-button-disabled disabled:text-disabled ml-5 mt-4 flex h-[40px] items-center rounded px-10 font-bold text-primary transition disabled:opacity-50"
347+
className="ml-5 mt-4 flex h-[40px] items-center rounded bg-gradient-button px-10 font-bold text-primary transition disabled:bg-gradient-button-disabled disabled:text-disabled disabled:opacity-50"
309348
onClick={handleUploadSubmit}
310349
>
311350
Upload

src/components/image-modify-form.tsx

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import { useState, useEffect } from "react";
44
import { useForm, Controller } from "react-hook-form";
5+
import { X } from "lucide-react";
56

67
export interface ImageModificationData {
78
title: string;
@@ -24,13 +25,15 @@ interface ImageModifyFormProps {
2425
data: ImageModificationData,
2526
clonedImageData: { name: string; size: number; type: string; url: string },
2627
) => void;
28+
onRemove: (index: number) => void;
2729
onChange: (data: ImageModificationData) => void;
2830
}
2931

3032
const ImageModifyForm = ({
3133
imageData,
3234
index,
3335
onClone,
36+
onRemove,
3437
onChange,
3538
}: ImageModifyFormProps) => {
3639
const { control, watch, setValue } = useForm<ImageModificationData>({
@@ -113,9 +116,13 @@ const ImageModifyForm = ({
113116
);
114117
};
115118

119+
const handleRemove = (index: number) => {
120+
onRemove(index);
121+
};
122+
116123
return (
117124
<div className="h-[470px] w-[700px] rounded border border-primary bg-primary p-6 text-primary">
118-
<div className="flex h-full space-x-6">
125+
<div className="flex h-full justify-between">
119126
<div className="flex w-[300px] flex-shrink-0 rounded-lg bg-secondary p-5">
120127
{imageData.url && (
121128
<img
@@ -126,27 +133,32 @@ const ImageModifyForm = ({
126133
)}
127134
</div>
128135

129-
<div>
130-
<div className="col-span-2 mb-4 flex items-center justify-between">
136+
<div className="w-[330px]">
137+
<div className="mb-4 flex items-center justify-between">
131138
<Controller
132139
name="title"
133140
control={control}
134141
render={({ field }) => (
135142
<input
136143
type="text"
137144
{...field}
138-
className="bg-input w-full rounded border border-primary p-2 text-primary"
145+
className="w-[180px] rounded border border-primary bg-input p-2 text-primary"
139146
/>
140147
)}
141148
/>
142149
<button
143150
onClick={handleClone}
144-
className="bg-button-secondary ml-4 w-[100px] rounded p-2 font-bold text-primary transition hover:bg-opacity-85"
151+
className="w-[80px] rounded bg-button-secondary p-2 font-bold text-primary transition"
145152
>
146153
Clone
147154
</button>
155+
<button
156+
onClick={() => handleRemove(index)}
157+
className="flex h-[40px] w-[40px] items-center justify-center rounded bg-button-destroy"
158+
>
159+
<X size={24} className="cursor-pointer" />
160+
</button>
148161
</div>
149-
150162
<div>
151163
<Controller
152164
name="raw"
@@ -180,7 +192,7 @@ const ImageModifyForm = ({
180192
type="number"
181193
{...field}
182194
placeholder="Will be automatically calculated"
183-
className="bg-input disabled:bg-gradient-button-disabled disabled:text-disabled mt-2 w-full rounded border border-primary p-2 text-primary disabled:opacity-50"
195+
className="mt-2 w-full rounded border border-primary bg-input p-2 text-primary disabled:bg-gradient-button-disabled disabled:text-disabled disabled:opacity-50"
184196
disabled={watch("raw")}
185197
value={field.value ?? ""}
186198
/>
@@ -202,7 +214,7 @@ const ImageModifyForm = ({
202214
type="number"
203215
{...field}
204216
placeholder="Will be automatically calculated"
205-
className="bg-input disabled:bg-gradient-button-disabled disabled:text-disabled mt-2 w-full rounded border border-primary p-2 text-primary disabled:opacity-50"
217+
className="mt-2 w-full rounded border border-primary bg-input p-2 text-primary disabled:bg-gradient-button-disabled disabled:text-disabled disabled:opacity-50"
206218
disabled={watch("raw")}
207219
value={field.value ?? ""}
208220
/>
@@ -228,7 +240,7 @@ const ImageModifyForm = ({
228240
min="1"
229241
max="100"
230242
{...field}
231-
className="bg-input disabled:bg-gradient-button-disabled disabled:text-disabled mt-2 w-full rounded border border-primary text-primary disabled:opacity-50"
243+
className="mt-2 w-full rounded border border-primary bg-input text-primary disabled:bg-gradient-button-disabled disabled:text-disabled disabled:opacity-50"
232244
disabled={watch("raw")}
233245
/>
234246
)}
@@ -245,7 +257,7 @@ const ImageModifyForm = ({
245257
render={({ field }) => (
246258
<select
247259
{...field}
248-
className="bg-input disabled:bg-gradient-button-disabled disabled:text-disabled mt-2 w-full rounded border border-primary p-2 text-primary disabled:opacity-50"
260+
className="mt-2 w-full rounded border border-primary bg-input p-2 text-primary disabled:bg-gradient-button-disabled disabled:text-disabled disabled:opacity-50"
249261
disabled={watch("raw")}
250262
>
251263
{Object.entries(formats).map(([key, value]) => (

0 commit comments

Comments
 (0)