From 3f6533cdd1f3f670c4ac61ea86396fb2354537c5 Mon Sep 17 00:00:00 2001 From: Farhan Date: Sat, 9 Aug 2025 22:58:58 +0800 Subject: [PATCH] refactor: auth process with http only cookies from backend --- next.config.mjs | 5 +++ src/domains/Events.ts | 5 +-- .../events/components/EventCardV2.test.tsx | 2 +- .../components/EventFormRegistration.tsx | 27 ++---------- src/features/events/hooks/useRegistEvent.ts | 43 +++++++++++++------ src/services/auth/index.ts | 4 +- src/services/events/index.ts | 4 +- src/services/instance.ts | 9 ++-- src/services/profile/index.ts | 2 +- 9 files changed, 48 insertions(+), 53 deletions(-) diff --git a/next.config.mjs b/next.config.mjs index cfc9717..d1d59de 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -15,6 +15,11 @@ const nextConfig = { protocol: "https", hostname: "lms-be-development.hammercode.org", }, + { + protocol: "http", + port: "8000", + hostname: "localhost", + }, ], }, trailingSlash: true, diff --git a/src/domains/Events.ts b/src/domains/Events.ts index 6a47a9c..bd49130 100644 --- a/src/domains/Events.ts +++ b/src/domains/Events.ts @@ -45,8 +45,8 @@ export const eventSchema = z.object({ export type EventType = z.infer; export const registrationSchema = z.object({ - name: z.string({ required_error: "Name is required" }).min(1, "Name must be at least 1 character long"), - email: z.string({ required_error: "Email is required" }).email("Invalid email address"), + name: z.string().optional(), + email: z.string().optional(), phone_number: z .string({ required_error: "Phone number is required" }) .min(10, "Phone number must be at least 10 digits"), @@ -58,7 +58,6 @@ export const registrationSchema = z.object({ }), z.string().min(1, "Image proof payment is required"), ]), - net_amount: z.number({ required_error: "Net amount is required" }).min(1, "Net amount must be at least 1"), }); export type RegistrationForm = z.infer; diff --git a/src/features/events/components/EventCardV2.test.tsx b/src/features/events/components/EventCardV2.test.tsx index 5c199a6..8e08232 100644 --- a/src/features/events/components/EventCardV2.test.tsx +++ b/src/features/events/components/EventCardV2.test.tsx @@ -9,7 +9,7 @@ const mockData: EventType = { title: "Advanced Frontend Workshop", description: "A deep dive into modern frontend development techniques and best practices.", author: "user_001", - image_event: + image: "https://static01.nyt.com/images/2021/05/02/business/00google-office1/00google-office1-videoSixteenByNineJumbo1600.jpg", date: "2024-09-15", status: "closed", diff --git a/src/features/events/components/EventFormRegistration.tsx b/src/features/events/components/EventFormRegistration.tsx index 41de514..ed8913b 100644 --- a/src/features/events/components/EventFormRegistration.tsx +++ b/src/features/events/components/EventFormRegistration.tsx @@ -27,7 +27,6 @@ const EventFormRegistration = ({ data }: { data: EventType }) => { name: "", email: "", phone_number: "", - net_amount: 0, }, }); @@ -44,7 +43,7 @@ const EventFormRegistration = ({ data }: { data: EventType }) => { form.reset({ name: user.username || "", email: user.email || "", - net_amount: 0, + phone_number: "", }); } }, [user, form]); @@ -70,7 +69,7 @@ const EventFormRegistration = ({ data }: { data: EventType }) => { {t("EventRegistration.name.label")} - + @@ -83,7 +82,7 @@ const EventFormRegistration = ({ data }: { data: EventType }) => { {t("EventRegistration.email.label")} - + @@ -120,26 +119,6 @@ const EventFormRegistration = ({ data }: { data: EventType }) => { )} /> - ( - - {t("EventRegistration.net-amount.label")} - - { - field.onChange(Number(e.target.value || 0)); - }} - /> - - - - )} - /> diff --git a/src/features/events/hooks/useRegistEvent.ts b/src/features/events/hooks/useRegistEvent.ts index b0af813..405a42e 100644 --- a/src/features/events/hooks/useRegistEvent.ts +++ b/src/features/events/hooks/useRegistEvent.ts @@ -8,31 +8,46 @@ import { EventType, RegistrationForm } from "@/domains/Events"; export const useRegistEvent = (data: EventType) => { const t = useTranslations("EventsPage"); const [isLoading, setIsLoading] = useState(false); + const [nameImage, setNameImage] = useState(""); // const [isDialogOpen, setIsDialogOpen] = useState(false); const registEvent = async (formData: RegistrationForm) => { setIsLoading(true); try { - const { net_amount, image_proof_payment, ...registDetails } = formData; - const eventPrice = data?.price as number; + const { image_proof_payment, ...registDetails } = formData; - if (net_amount < eventPrice) { - throw new Error(t("EventRegistration.error.net-amount-low")); + interface NewPayload extends RegistrationForm { + event_id: number; } - const { - data: { file_name: uploadedImageFileName }, - } = await uploadsService.uploadImage(image_proof_payment as File, "payment", "event"); - - const registPayload = { + let registPayload: NewPayload = { + event_id: 0, + image_proof_payment: "", ...registDetails, - net_amount, - image_proof_payment: uploadedImageFileName, - event_id: data?.id as number, }; - const res = await eventsService.registEvent(registPayload); + if (!nameImage) { + console.log("image proof payment", image_proof_payment); + const { + data: { file_name: uploadedImageFileName }, + } = await uploadsService.uploadImage(image_proof_payment as File, "payment", "event"); + + setNameImage(uploadedImageFileName); + registPayload = { + ...registDetails, + image_proof_payment: uploadedImageFileName as string, + event_id: data?.id as number, + }; + } else { + registPayload = { + ...registDetails, + image_proof_payment: nameImage as string, + event_id: data?.id as number, + }; + } + + const res = await eventsService.registerEvent(registPayload); toast.success(`${t("EventRegistration.success.title")}`, { description: `${t("EventRegistration.success.description")} ${res.data.order_no}`, @@ -41,7 +56,7 @@ export const useRegistEvent = (data: EventType) => { setIsLoading(false); // setIsDialogOpen(false); } catch (error) { - console.log(error); + // console.log(error); toast.error(t("EventRegistration.failure.title"), { description: error instanceof Error ? error.message : t("EventRegistration.failure.description"), }); diff --git a/src/services/auth/index.ts b/src/services/auth/index.ts index cacf122..ebff70b 100644 --- a/src/services/auth/index.ts +++ b/src/services/auth/index.ts @@ -7,11 +7,11 @@ import axios from "axios"; export const authService = { login(payload: LoginForm): Promise> { - return axios.post("/api/login", payload); + return fetcher.post("auth/login", payload); }, logout(): Promise> { - return axios.post("/api/logout"); + return fetcher.post("logout"); }, getToken(payload: LoginForm): Promise { diff --git a/src/services/events/index.ts b/src/services/events/index.ts index c0699dd..925001f 100644 --- a/src/services/events/index.ts +++ b/src/services/events/index.ts @@ -11,8 +11,8 @@ export const eventsService = { return fetcher.get(`public/events/${id}`); }, - registEvent(payload: RegistrationForm): Promise> { - return fetcher.post("public/events/registrations", payload); + registerEvent(payload: RegistrationForm): Promise> { + return fetcher.post("events/registrations", payload); }, getMyEvents(page?: number, limit?: number): Promise> { diff --git a/src/services/instance.ts b/src/services/instance.ts index f26984b..771902c 100644 --- a/src/services/instance.ts +++ b/src/services/instance.ts @@ -10,10 +10,6 @@ const config = { const injectInterceptors = (instance: AxiosInstance): AxiosInstance => { instance.interceptors.request.use( (config: InternalAxiosRequestConfig) => { - const token = localStorage.getItem("accessToken"); - if (token) { - config.headers.Authorization = `Bearer ${token}`; - } return config; }, (error: AxiosError) => { @@ -26,7 +22,6 @@ const injectInterceptors = (instance: AxiosInstance): AxiosInstance => { return response.data; }, (error: AxiosError) => { - console.log({ error }); return Promise.reject(error?.response?.data); } ); @@ -36,7 +31,9 @@ const injectInterceptors = (instance: AxiosInstance): AxiosInstance => { export const fetcher: AxiosInstance = injectInterceptors( axios.create({ - baseURL: "https://lms-be-development.hammercode.org/api/v1/", + // baseURL: "https://lms-be-development.hammercode.org/api/v1/", + baseURL: "http://localhost:8000/api/v1/", + withCredentials: true, ...config, }) ); diff --git a/src/services/profile/index.ts b/src/services/profile/index.ts index 2481c15..5306caa 100644 --- a/src/services/profile/index.ts +++ b/src/services/profile/index.ts @@ -3,7 +3,7 @@ import { fetcher } from "../instance"; import { UserType } from "@/domains/Profile"; export const profileService = { - getUserId: async (): Promise> => { + getProfile: async (): Promise> => { return fetcher.get("user"); }, };