Skip to content

Commit 234e80f

Browse files
committed
feat(detail): finishing get detail events for update event
1 parent 016cc90 commit 234e80f

File tree

5 files changed

+59
-30
lines changed

5 files changed

+59
-30
lines changed

src/domains/Events.ts

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -80,31 +80,48 @@ export const userEventSchema = z.object({
8080
export type UserEventType = z.infer<typeof userEventSchema>;
8181

8282
export const createEventFormSchema = (t: (key: string) => string) =>
83-
z.object({
84-
title: z.string().min(1, t("validation.title-required")),
85-
description: z.string().min(1, t("validation.description-required")),
86-
// file_name: z.string().optional(),
87-
slug: z.string().min(1, t("validation.slug-required")),
88-
date: z.string().min(1, t("validation.date-required")),
89-
type: z.string().min(1, t("validation.type-required")),
90-
session_type: z.string().min(1, t("validation.session-type-required")),
91-
location: z.string().min(1, t("validation.location-required")),
92-
duration: z.string().min(1, t("validation.duration-required")),
93-
status: z.string().min(1, t("validation.status-required")),
94-
capacity: z.number().min(1, t("validation.capacity-min")),
95-
price: z.number().min(0, t("validation.price-min")),
96-
registration_link: z.string().url(t("validation.registration-url")),
97-
tags: z.array(z.string()),
98-
speakers: z.array(z.string()),
99-
reservation_start_date: z.string().min(1, t("validation.reservation-start-required")),
100-
reservation_end_date: z.string().min(1, t("validation.reservation-end-required")),
101-
image: z.union([
102-
z.instanceof(File).refine((file) => ["image/png", "image/jpeg", "image/jpg", "image/webp"].includes(file.type), {
103-
message: t("validation.image-type"),
104-
}),
105-
z.string().min(1, t("validation.image-required")),
106-
]),
107-
});
83+
z
84+
.object({
85+
title: z.string().min(1, t("validation.title-required")),
86+
description: z.string().min(1, t("validation.description-required")),
87+
file_name: z.string().optional(),
88+
slug: z.string().min(1, t("validation.slug-required")),
89+
date: z.string().min(1, t("validation.date-required")),
90+
type: z.string().min(1, t("validation.type-required")),
91+
session_type: z.string().min(1, t("validation.session-type-required")),
92+
location: z.string().min(1, t("validation.location-required")),
93+
duration: z.string().min(1, t("validation.duration-required")),
94+
status: z.string().min(1, t("validation.status-required")),
95+
capacity: z.number().min(1, t("validation.capacity-min")),
96+
price: z.number().min(0, t("validation.price-min")),
97+
registration_link: z.string().url(t("validation.registration-url")),
98+
tags: z.array(z.string()),
99+
speakers: z.array(z.string()),
100+
reservation_start_date: z.string().min(1, t("validation.reservation-start-required")),
101+
reservation_end_date: z.string().min(1, t("validation.reservation-end-required")),
102+
image: z
103+
.union([
104+
z
105+
.instanceof(File)
106+
.refine((file) => ["image/png", "image/jpeg", "image/jpg", "image/webp"].includes(file.type), {
107+
message: t("validation.image-type"),
108+
}),
109+
z.string().optional(),
110+
])
111+
.optional(),
112+
})
113+
.refine(
114+
(data) => {
115+
if (data.file_name) {
116+
return true;
117+
}
118+
return data.image instanceof File || (typeof data.image === "string" && data.image.length > 0);
119+
},
120+
{
121+
message: t("validation.image-required"),
122+
path: ["image"],
123+
}
124+
);
108125

109126
export type EventFormType = z.infer<ReturnType<typeof createEventFormSchema>>;
110127

src/features/events/components/EventForm.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { eventTypes, eventStatuses, sessionTypes } from "../constants";
1919
import React, { useState, useEffect } from "react";
2020
import Badge from "@/components/ui/Badge";
2121
import { useRouter } from "@/lib/navigation";
22+
import Image from "next/image";
2223

2324
interface EventFormProps {
2425
onSubmit: (data: EventFormType) => void;
@@ -159,6 +160,12 @@ const EventForm = ({ onSubmit, isLoading = false, initialData, mode = "create" }
159160
)}
160161
/>
161162

163+
{initialData?.file_name && (
164+
<div>
165+
<Image src={initialData.file_name} alt="image cover" width={200} height={200} />
166+
</div>
167+
)}
168+
162169
<FormField
163170
control={form.control}
164171
name="image"

src/features/events/pages/AdminEventUpdatePage.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33
import { EventFormType } from "@/domains/Events";
44
import EventForm from "../components/EventForm";
55
import { useGetDetailEventAdmin } from "../hooks/useEvent";
6+
import Loader from "@/components/common/Loader";
67

78
const AdminEventUpdatePage = ({ eventId }: { eventId: string }) => {
89
console.log("eventsss id", eventId);
9-
const { data } = useGetDetailEventAdmin(eventId);
10+
const { data, isLoading } = useGetDetailEventAdmin(eventId);
1011

1112
console.log("dataaa", data);
1213
const handleSubmit = (data: EventFormType) => {
@@ -21,7 +22,11 @@ const AdminEventUpdatePage = ({ eventId }: { eventId: string }) => {
2122
<p className="text-muted-foreground">Edit event details quickly and easily.</p>
2223
</div>
2324

24-
<EventForm onSubmit={handleSubmit} mode="edit" isLoading={false} />
25+
{isLoading ? (
26+
<Loader />
27+
) : (
28+
<EventForm onSubmit={handleSubmit} mode="edit" isLoading={false} initialData={data?.data} />
29+
)}
2530
</section>
2631
);
2732
};

src/hooks/useQueryParams.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useSearchParams } from "next/navigation";
2-
import { useRouter } from "@/lib/navigation";
2+
import { useRouter } from "next/navigation";
33

44
/**
55
* Custom hook for managing URL query parameters with nextjs

src/services/uploads/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ export const uploadsService = {
2222
* @param type - The type of the image
2323
* @param category - The category for the image
2424
*/
25-
uploadImageAdmin(image: string | File, category: string): Promise<HttpResponse<{ file_name: string }>> {
25+
uploadImageAdmin(image: string | File | undefined, category: string): Promise<HttpResponse<{ file_name: string }>> {
2626
const data = new FormData();
27-
data.append("image", image);
27+
data.append("image", image as File);
2828
data.append("category", category);
2929
return fetcher.post("/admin/images", data, {
3030
headers: { "Content-Type": "multipart/form-data" },

0 commit comments

Comments
 (0)