signture +

This commit is contained in:
hamid zarghami
2025-07-13 16:32:21 +03:30
parent 257b287dfd
commit 94a6b2beba
7 changed files with 195 additions and 101 deletions
+81 -5
View File
@@ -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;
};
+23
View File
@@ -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;
};
}