set select fix + screen shot fix

This commit is contained in:
hamid zarghami
2025-07-16 13:03:30 +03:30
parent fe5b7de9b1
commit 2043daae39
6 changed files with 39 additions and 7 deletions
+1 -1
View File
@@ -8,7 +8,7 @@ type Props = {
const Radio: FC<Props> = (props: Props) => {
return (
<div onClick={() => props.onChange(props.value)} className='size-4 cursor-pointer rounded-full bg-[#EAEDF5] flex justify-center items-center'>
<div onClick={() => props.onChange(props.value)} className='size-4 min-w-4 cursor-pointer rounded-full bg-[#EAEDF5] flex justify-center items-center'>
{
props.isActive &&
<div className='size-2 bg-black rounded-full'></div>
+18 -3
View File
@@ -1,6 +1,6 @@
import Button from '@/components/Button'
import { AddCircle } from 'iconsax-react'
import { FC } from 'react'
import { FC, useState, useEffect } from 'react'
import { useGetTemplates } from './hooks/usePersonalityData'
import { Link } from 'react-router-dom'
import { Paths } from '@/utils/Paths'
@@ -9,12 +9,23 @@ import Templete from './components/Templete'
const List: FC = () => {
const { data } = useGetTemplates()
const [optimisticSelectedId, setOptimisticSelectedId] = useState<string | null>(null)
// پیدا کردن template انتخاب شده
const selectedTemplateId = data?.data?.templates?.find(
// پیدا کردن template انتخاب شده از سرور
const serverSelectedTemplateId = data?.data?.templates?.find(
(template: TemplateResponseType) => template.selected
)?.id
// استفاده از optimistic state یا server state
const selectedTemplateId = optimisticSelectedId || serverSelectedTemplateId
// وقتی داده‌های جدید از سرور می‌آید، optimistic state را پاک کن
useEffect(() => {
if (data?.data?.templates) {
setOptimisticSelectedId(null)
}
}, [data])
return (
<div className='mt-2 md:mt-4 px-2 md:px-0'>
<div className='flex justify-between items-center'>
@@ -41,10 +52,14 @@ const List: FC = () => {
key={item.id}
item={item}
selectedTemplateId={selectedTemplateId}
onOptimisticSelect={setOptimisticSelectedId}
/>
)
})
}
<div className='flex-1 rounded-3xl px-4'></div>
<div className='flex-1 rounded-3xl px-4'></div>
<div className='flex-1 rounded-3xl px-4'></div>
</div>
</div>
@@ -10,7 +10,8 @@ import ModalConfrim from '@/components/ModalConfrim'
const Templete: FC<{
item: TemplateResponseType
selectedTemplateId?: string
}> = ({ item, selectedTemplateId }) => {
onOptimisticSelect?: (id: string | null) => void
}> = ({ item, selectedTemplateId, onOptimisticSelect }) => {
const [isActive, setIsActive] = useState(item.selected)
const [isShowDeleteModal, setIsShowDeleteModal] = useState(false)
@@ -19,7 +20,16 @@ const Templete: FC<{
const { mutate: deleteTemplate, isPending: isDeleting } = useDeleteTemplate()
const handleChangeSelectedTemplate = (id: string) => {
// Optimistic update - بلافاصله UI را به‌روزرسانی کن
setIsActive(true)
onOptimisticSelect?.(id)
setSelectedTemplate(id, {
onError: () => {
// اگر خطا رخ داد، state را به حالت قبلی برگردان
setIsActive(item.selected)
onOptimisticSelect?.(null)
}
})
}
@@ -42,7 +52,9 @@ const Templete: FC<{
return (
<>
<div key={item.id} className='flex-1 bg-white rounded-3xl p-4'>
<div className='h-[140px] bg-gray-200 rounded-3xl'></div>
<div className='h-[140px] bg-gray-200 rounded-3xl'>
<img src={item.thumbnailUrl} alt={item.name} className='w-full h-full object-contain' />
</div>
<div className='mt-4 flex justify-between items-center'>
<div className='flex gap-2 items-center'>
<Radio isActive={isActive} onChange={handleChangeSelectedTemplate} value={item.id} />
@@ -20,8 +20,13 @@ export const useGetTemplates = () => {
};
export const useSetSelectedTemplate = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (id: string) => api.setSelectedTemplate(id),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ["templates"] });
},
});
};
@@ -316,6 +316,7 @@ export type TemplateResponseType = {
currentVersion: string;
selected: boolean;
business: BusinessType;
thumbnailUrl: string;
};
export type PagerType = {
@@ -38,7 +38,6 @@ export const captureScreenshotAsFile = async (
};
const dataUrl = await domtoimage.toPng(element, options);
// بازگردانی استایل‌های اصلی
htmlElement.style.transform = originalTransform;
htmlElement.style.position = originalPosition;