procurement-frontend2/src/app/[locale]/contacts/page.tsx
2024-09-17 16:00:23 +06:00

190 lines
6.9 KiB
TypeScript

"use client";
import { apiInstance } from "@/shared/config/apiConfig";
import { Container, Title } from "@/shared/ui";
import Loader from "@/shared/ui/Loader/Loader";
import { zodResolver } from "@hookform/resolvers/zod";
import { AxiosError } from "axios";
import { useTranslations } from "next-intl";
import { useState } from "react";
import { useForm } from "react-hook-form";
import { toast } from "react-toastify";
import { z } from "zod";
export default function Contacts() {
const t = useTranslations("contacts");
const [error, setError] = useState<string>("");
const [loader, setLoader] = useState<boolean>(false);
const appealFormScheme = z.object({
first_name: z.string(),
last_name: z.string(),
email: z.string(),
phone_number: z.string(),
message: z.string(),
});
type FormFields = z.infer<typeof appealFormScheme>;
const {
register,
handleSubmit,
formState: { errors, isSubmitting },
} = useForm<FormFields>({
resolver: zodResolver(appealFormScheme),
});
const onSubmit = async (data: FormFields) => {
try {
setError("");
setLoader(true);
const response = await apiInstance.post("/appeal_response/", data);
console.log(response);
toast.success(t("successMessage"));
} catch (error) {
if (error instanceof AxiosError) {
if (
[500, 501, 502, 503, 504].includes(error.response?.status as number)
) {
toast.error(t("serverError"));
}
}
} finally {
setLoader(false);
}
};
return (
<section className="bg-[#FAFCFF]">
<Container className="py-[100px] ">
<iframe
className="w-full h-[403px] object-cover"
src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d365.45703047807825!2d74.58569311654689!3d42.88009923942027!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x389ec9b187c8ff21%3A0xa3266b2f825613d5!2sTransparency%20International%20Kyrgyzstan!5e0!3m2!1sru!2skg!4v1716976752985!5m2!1sru!2skg"
></iframe>
<section className="flex items-center justify-between mb-[152px] mt-[64px]">
<div className="max-w-[384px] max-h-[106px] flex flex-col items-center px-7">
<Title text={t("addressTitle")} className="font-extrabold mb-2" />
<p className="text-grey-text">{t("address")}</p>
</div>
<div className="max-w-[384px] max-h-[106px] flex flex-col items-center px-7">
<Title text={t("phoneTitle")} className="font-extrabold mb-2" />
<p className="text-grey-text">(0312) 39 40 38</p>
</div>
<div className="max-w-[384px] max-h-[106px] flex flex-col items-center px-7">
<Title text="Email" className="font-extrabold mb-2" />
<p className="text-grey-text">kyrgyzstan@transparency.org</p>
</div>
</section>
<form
onSubmit={handleSubmit(onSubmit)}
className="w-[480px] my-0 mx-auto"
>
<div className="flex items-center flex-col mt-[96px] mb-[96px]">
<h1 className="text-gray-900 text-[36px]">{t("title")}</h1>
<div className="flex flex-col items-center gap-6 mt-[64px]">
<div className="flex gap-8 w-full">
<div className="w-[224px] flex flex-col">
<label htmlFor="firstName" className="mb-[6px]">
{t("name")}
</label>
<input
type="text"
className="w-full h-[48px] bg-white py-3 px-4 rounded-md shadow-sm border border-gray"
placeholder={t("name")}
id="firstName"
required
{...register("first_name", { required: true })}
/>
</div>
<div className="w-[224px] flex flex-col">
<label htmlFor="lastName" className="mb-[6px]">
{t("surname")}
</label>
<input
type="text"
className="w-full h-[48px] bg-white py-3 px-4 rounded-md shadow-sm border border-gray"
placeholder={t("surname")}
id="lastName"
required
{...register("last_name", { required: true })}
/>
</div>
</div>
<div className="w-full">
<label htmlFor="email" className="mb-[6px]">
Email
</label>
<input
type="text"
placeholder="user@gmail.com"
className="w-full h-[48px] bg-white py-3 px-4 rounded-md shadow-sm border border-gray"
id="email"
{...register("email", { required: true })}
/>
</div>
<div className="w-full">
<label htmlFor="phoneNumber" className="mb-[6px]">
{t("phone")}
</label>
<input
type="text"
className="w-full h-[48px] bg-white py-3 px-4 rounded-md shadow-sm border border-gray"
placeholder="+996"
id="phoneNumber"
required
{...register("phone_number", { required: true })}
/>
</div>
<div className="w-full">
<label htmlFor="message" className="mb-[6px]">
{t("message")}
</label>
<textarea
className="h-[120px] resize-none w-full bg-white py-3 px-4 rounded-md shadow-sm border border-gray"
id="message"
required
{...register("message", { required: true })}
></textarea>
</div>
<div className="w-full">
<input
className="border-none"
type="checkbox"
id="consentCheckbox"
name="consent"
required
/>
<label
htmlFor="consentCheckbox"
className="text-[#667085] ml-[10px]"
>
{t("checkbox")}
</label>
</div>
{errors.root && (
<p className="text-sm leading-5 text-red-500">
{errors.root.message}
</p>
)}
{error ? (
<p className="text-red-500 leading-5 text-sm">{error}</p>
) : null}
<div className="w-full">
<button
type="submit"
className="bg-blue text-white w-full h-[48px] rounded-md "
>
{loader ? <Loader /> : t("send")}
</button>
</div>
</div>
</div>
</form>
</Container>
</section>
);
}