signture +
This commit is contained in:
@@ -1,11 +1,70 @@
|
||||
import Input from '@/components/Input'
|
||||
import Textarea from '@/components/Textarea'
|
||||
import UploadBox from '@/components/UploadBox'
|
||||
import { FC } from 'react'
|
||||
import Button from '@/components/Button'
|
||||
import { FC, useEffect, useState } from 'react'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import { useSignatureData, useCreateSignature, useUpdateSignature } from './hooks/useSignatureData'
|
||||
import { SignatureData } from './types/Types'
|
||||
|
||||
const Signture: FC = () => {
|
||||
|
||||
const { t } = useTranslation()
|
||||
const { data: signatureData, isLoading } = useSignatureData()
|
||||
const createSignatureMutation = useCreateSignature()
|
||||
const updateSignatureMutation = useUpdateSignature()
|
||||
|
||||
const [formData, setFormData] = useState<SignatureData>({
|
||||
name: '',
|
||||
textContent: ''
|
||||
})
|
||||
|
||||
const [isSubmitting, setIsSubmitting] = useState(false)
|
||||
|
||||
useEffect(() => {
|
||||
if (signatureData?.data?.signature) {
|
||||
setFormData({
|
||||
name: signatureData.data.signature.name || '',
|
||||
textContent: signatureData.data.signature.textContent || ''
|
||||
})
|
||||
}
|
||||
}, [signatureData])
|
||||
|
||||
const handleSubmit = async () => {
|
||||
if (!formData.name.trim() || !formData.textContent.trim()) {
|
||||
return
|
||||
}
|
||||
|
||||
setIsSubmitting(true)
|
||||
|
||||
try {
|
||||
if (signatureData?.data?.signature?.id) {
|
||||
await updateSignatureMutation.mutateAsync(formData)
|
||||
} else {
|
||||
await createSignatureMutation.mutateAsync(formData)
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error saving signature:', error)
|
||||
} finally {
|
||||
setIsSubmitting(false)
|
||||
}
|
||||
}
|
||||
|
||||
const handleInputChange = (field: keyof SignatureData, value: string) => {
|
||||
setFormData(prev => ({
|
||||
...prev,
|
||||
[field]: value
|
||||
}))
|
||||
}
|
||||
|
||||
if (isLoading) {
|
||||
return (
|
||||
<div className='bg-white rounded-4xl p-8 mt-9'>
|
||||
<div className='text-center py-8'>
|
||||
در حال بارگذاری...
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
return (
|
||||
<div className='bg-white rounded-4xl p-8 mt-9'>
|
||||
<div className='mt-9'>
|
||||
@@ -20,14 +79,31 @@ const Signture: FC = () => {
|
||||
</div>
|
||||
|
||||
<div className='flex-1 mt-4 xl:mt-0'>
|
||||
<UploadBox
|
||||
label={t('setting.upload_sign')}
|
||||
<Input
|
||||
label={t('setting.name_sign')}
|
||||
value={formData.name}
|
||||
onChange={(e) => handleInputChange('name', e.target.value)}
|
||||
placeholder="نام امضا را وارد کنید"
|
||||
/>
|
||||
<div className='xl:mt-8 mt-5'>
|
||||
<Textarea
|
||||
label={t('setting.description_sign')}
|
||||
value={formData.textContent}
|
||||
onChange={(e) => handleInputChange('textContent', e.target.value)}
|
||||
placeholder="محتوای امضا را وارد کنید"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className='mt-6 flex justify-end'>
|
||||
<Button
|
||||
onClick={handleSubmit}
|
||||
disabled={isSubmitting || !formData.name.trim() || !formData.textContent.trim()}
|
||||
loading={isSubmitting}
|
||||
className='px-8 w-auto'
|
||||
>
|
||||
{signatureData?.data?.signature?.id ? 'بهروزرسانی امضا' : 'ایجاد امضا'}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
||||
import {
|
||||
createSignature,
|
||||
getSignature,
|
||||
updateSignature,
|
||||
} from "../service/Service";
|
||||
import type { SignatureData } from "../types/Types";
|
||||
|
||||
export const useSignatureData = () => {
|
||||
return useQuery({
|
||||
queryKey: ["signature-data"],
|
||||
queryFn: getSignature,
|
||||
retry: false,
|
||||
});
|
||||
};
|
||||
|
||||
export const useCreateSignature = () => {
|
||||
const queryClient = useQueryClient();
|
||||
|
||||
return useMutation({
|
||||
mutationFn: (data: SignatureData) => createSignature(data),
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ["signature-data"] });
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
export const useUpdateSignature = () => {
|
||||
const queryClient = useQueryClient();
|
||||
|
||||
return useMutation({
|
||||
mutationFn: (data: SignatureData) => updateSignature(data),
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ["signature-data"] });
|
||||
},
|
||||
});
|
||||
};
|
||||
@@ -0,0 +1,21 @@
|
||||
import axios from "@/config/axios";
|
||||
import { SignatureData, SignatureResponse } from "../types/Types";
|
||||
|
||||
export const getSignature = async (): Promise<SignatureResponse> => {
|
||||
const { data } = await axios.get("/email-signatures");
|
||||
return data;
|
||||
};
|
||||
|
||||
export const createSignature = async (
|
||||
params: SignatureData
|
||||
): Promise<SignatureResponse> => {
|
||||
const { data } = await axios.post("/email-signatures", params);
|
||||
return data;
|
||||
};
|
||||
|
||||
export const updateSignature = async (
|
||||
params: SignatureData
|
||||
): Promise<SignatureResponse> => {
|
||||
const { data } = await axios.patch("/email-signatures", params);
|
||||
return data;
|
||||
};
|
||||
@@ -0,0 +1,23 @@
|
||||
export interface SignatureData {
|
||||
name: string;
|
||||
textContent: string;
|
||||
}
|
||||
|
||||
export interface SignatureItem {
|
||||
id: string;
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
deletedAt: string | null;
|
||||
business: string;
|
||||
name: string;
|
||||
textContent: string;
|
||||
isActive: boolean;
|
||||
}
|
||||
|
||||
export interface SignatureResponse {
|
||||
statusCode: number;
|
||||
success: boolean;
|
||||
data: {
|
||||
signature: SignatureItem;
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user