contact us
This commit is contained in:
@@ -0,0 +1,8 @@
|
|||||||
|
import { useMutation } from "@tanstack/react-query";
|
||||||
|
import * as api from "../service/Service";
|
||||||
|
|
||||||
|
export const useContactUs = () => {
|
||||||
|
return useMutation({
|
||||||
|
mutationFn: api.contactUs,
|
||||||
|
});
|
||||||
|
};
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
'use client'
|
||||||
import Input from '@/components/Input'
|
import Input from '@/components/Input'
|
||||||
import { Textarea } from '@/components/ui/textarea'
|
import { Textarea } from '@/components/ui/textarea'
|
||||||
import { Button } from '@/components/ui/button'
|
import { Button } from '@/components/ui/button'
|
||||||
@@ -5,8 +6,33 @@ import Layout from '@/hoc/Layout'
|
|||||||
import { NextPage } from 'next'
|
import { NextPage } from 'next'
|
||||||
import Image from 'next/image'
|
import Image from 'next/image'
|
||||||
import { Call, Location, Sms } from 'iconsax-react'
|
import { Call, Location, Sms } from 'iconsax-react'
|
||||||
|
import { useForm } from 'react-hook-form'
|
||||||
|
import { ContactUsType } from './types/Types'
|
||||||
|
import { useContactUs } from './hooks/useContactData'
|
||||||
|
import { useState } from 'react'
|
||||||
|
import { toast } from '@/components/Toast'
|
||||||
|
import { extractErrorMessage } from '@/helpers/errorUtils'
|
||||||
|
|
||||||
const ContactPage: NextPage = () => {
|
const ContactPage: NextPage = () => {
|
||||||
|
|
||||||
|
const { mutate: contactUs, isPending } = useContactUs()
|
||||||
|
const { register, handleSubmit, reset, formState: { errors } } = useForm<ContactUsType>()
|
||||||
|
const [successMessage, setSuccessMessage] = useState<string>('')
|
||||||
|
|
||||||
|
const onSubmit = (data: ContactUsType) => {
|
||||||
|
contactUs(data, {
|
||||||
|
onSuccess: () => {
|
||||||
|
toast('پیام شما با موفقیت ارسال شد.', 'success')
|
||||||
|
setSuccessMessage('پیام شما با موفقیت ارسال شد.')
|
||||||
|
reset()
|
||||||
|
setTimeout(() => setSuccessMessage(''), 5000)
|
||||||
|
},
|
||||||
|
onError: (error) => {
|
||||||
|
toast(extractErrorMessage(error), 'error')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Layout>
|
<Layout>
|
||||||
<div className='mt-14 px-4 sm:px-8 lg:px-20'>
|
<div className='mt-14 px-4 sm:px-8 lg:px-20'>
|
||||||
@@ -15,26 +41,47 @@ const ContactPage: NextPage = () => {
|
|||||||
<h1 className='font-black text-xl sm:text-2xl'>ارتباط با ما</h1>
|
<h1 className='font-black text-xl sm:text-2xl'>ارتباط با ما</h1>
|
||||||
<p className='text-[#7F7F7F] mt-3 font-light text-sm sm:text-base'>اطلاعات تماس و متن پیام خود را وارد کنید</p>
|
<p className='text-[#7F7F7F] mt-3 font-light text-sm sm:text-base'>اطلاعات تماس و متن پیام خود را وارد کنید</p>
|
||||||
|
|
||||||
<div className='mt-8 sm:mt-12'>
|
{successMessage && (
|
||||||
|
<div className='mt-4 p-3 bg-green-100 border border-green-400 text-green-700 rounded-md'>
|
||||||
|
{successMessage}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<form onSubmit={handleSubmit(onSubmit)} className='mt-8 sm:mt-12'>
|
||||||
<Input
|
<Input
|
||||||
placeholder='نام و نام خانوادگی'
|
placeholder='نام و نام خانوادگی'
|
||||||
|
{...register('fullName', { required: 'نام و نام خانوادگی الزامی است' })}
|
||||||
/>
|
/>
|
||||||
|
{errors.fullName && (
|
||||||
|
<p className='text-red-500 text-sm mt-1'>{errors.fullName.message}</p>
|
||||||
|
)}
|
||||||
|
|
||||||
<Input
|
<Input
|
||||||
placeholder='شماره تماس'
|
placeholder='شماره تماس یا ایمیل'
|
||||||
className='mt-4 sm:mt-6'
|
|
||||||
/>
|
|
||||||
<Input
|
|
||||||
placeholder='ایمیل'
|
|
||||||
className='mt-4 sm:mt-6'
|
className='mt-4 sm:mt-6'
|
||||||
|
{...register('email_phone', { required: 'شماره تماس یا ایمیل الزامی است' })}
|
||||||
/>
|
/>
|
||||||
|
{errors.email_phone && (
|
||||||
|
<p className='text-red-500 text-sm mt-1'>{errors.email_phone.message}</p>
|
||||||
|
)}
|
||||||
|
|
||||||
<Textarea
|
<Textarea
|
||||||
placeholder='متن پیام'
|
placeholder='متن پیام'
|
||||||
className='mt-4 sm:mt-6 h-[100px] sm:h-[120px]'
|
className='mt-4 sm:mt-6 h-[100px] sm:h-[120px]'
|
||||||
|
{...register('message', { required: 'متن پیام الزامی است' })}
|
||||||
/>
|
/>
|
||||||
|
{errors.message && (
|
||||||
|
<p className='text-red-500 text-sm mt-1'>{errors.message.message}</p>
|
||||||
|
)}
|
||||||
|
|
||||||
<Button className='mt-4 sm:mt-6 w-full'>ارسال پیام</Button>
|
<Button
|
||||||
</div>
|
type='submit'
|
||||||
|
className='mt-4 sm:mt-6 w-full'
|
||||||
|
disabled={isPending}
|
||||||
|
>
|
||||||
|
{isPending ? 'در حال ارسال...' : 'ارسال پیام'}
|
||||||
|
</Button>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='flex-1'>
|
<div className='flex-1'>
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
import axios from "@/config/axios";
|
||||||
|
import { ContactUsType } from "../types/Types";
|
||||||
|
|
||||||
|
export const contactUs = async (params: ContactUsType) => {
|
||||||
|
const { data } = await axios.post("/contact-us", params);
|
||||||
|
return data;
|
||||||
|
};
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
export type ContactUsType = {
|
||||||
|
fullName: string;
|
||||||
|
email_phone: string;
|
||||||
|
message: string;
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user