From 99ecb0fa9f1c49a129addabcc9c616270736ed8d Mon Sep 17 00:00:00 2001 From: aramesh-site deploy Date: Wed, 7 Oct 2026 08:07:54 +0000 Subject: [PATCH] =?UTF-8?q?fix(blog):=20=D8=B2=D8=A8=D8=A7=D9=86=20=D9=88?= =?UTF-8?q?=DB=8C=D8=B1=D8=A7=DB=8C=D8=B4=20=D8=A8=D9=87=E2=80=8C=D8=A7?= =?UTF-8?q?=D8=B2=D8=A7=DB=8C=20=D9=87=D8=B1=20=D9=85=D9=82=D8=A7=D9=84?= =?UTF-8?q?=D9=87=20=D8=A8=D9=87=E2=80=8C=D8=AE=D8=A7=D8=B7=D8=B1=20=D8=B3?= =?UTF-8?q?=D9=BE=D8=B1=D8=AF=D9=87=20=D9=85=DB=8C=E2=80=8C=D8=B4=D9=88?= =?UTF-8?q?=D8=AF=D8=8C=20=D8=B4=D9=85=D8=A7=D8=B1=D9=86=D8=AF=D9=87=D9=94?= =?UTF-8?q?=20=D9=85=D8=AA=D8=A7=20=D8=B1=D9=88=DB=8C=20=D8=B2=D8=A8=D8=A7?= =?UTF-8?q?=D9=86=20=D9=81=D8=B9=D8=A7=D9=84=D8=8C=20=D8=AC=D9=87=D8=AA=20?= =?UTF-8?q?=D9=85=D8=AD=D8=AA=D9=88=D8=A7=DB=8C=20=D8=A7=D8=AF=DB=8C=D8=AA?= =?UTF-8?q?=D9=88=D8=B1=20=D8=A7=D8=B2=20=D8=B2=D8=A8=D8=A7=D9=86=20=D9=88?= =?UTF-8?q?=DB=8C=D8=B1=D8=A7=DB=8C=D8=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/admin/ArticleWritePage.tsx | 28 +++++++++++++++++-- .../src/components/admin/ArticleEditor.tsx | 9 +++++- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/frontend/src/admin/ArticleWritePage.tsx b/frontend/src/admin/ArticleWritePage.tsx index b6874d4..df6696c 100644 --- a/frontend/src/admin/ArticleWritePage.tsx +++ b/frontend/src/admin/ArticleWritePage.tsx @@ -134,7 +134,7 @@ const STATUS_TEXT: Record = { * مسیرها: /admin/write (مقاله جدید) و /admin/write/:id (ویرایش). */ export function ArticleWritePage() { - const { isAuthenticated, saveStatus, runSave, editLang, toggleEditLang, role } = useAdmin() + const { isAuthenticated, saveStatus, runSave, editLang, toggleEditLang, syncEditLang, role } = useAdmin() const { id } = useParams<{ id: string }>() const navigate = useNavigate() const { data, updateSite } = useSiteData() @@ -219,6 +219,23 @@ export function ArticleWritePage() { const article = existing ?? fetched + // زبان ویرایش این مقاله به‌ازای خودش به‌خاطر سپرده می‌شود — رفرش تب را عوض نکند + useEffect(() => { + if (!id) return + const saved = localStorage.getItem(`aramesh_write_lang_${id}`) + if (saved === 'en' || saved === 'fa') { + syncEditLang(saved) + return + } + const art = existing ?? null + if (art) { + const hasEn = Boolean((art as Draft).title_en?.trim()) || Boolean((art as Draft).body_en as unknown) + const hasFa = Boolean((art as Draft).title?.trim()) + if (hasEn && !hasFa) syncEditLang('en') + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [id, Boolean(article)]) + // وقتی مقاله موجود شناخته شد، فرم و شناسه ساخته‌شده یک‌بار مقداردهی می‌شود useEffect(() => { if (!article || createdRef.current) return @@ -338,7 +355,6 @@ export function ArticleWritePage() { queueSave({ [name]: e.target.value }), }) - const metaLength = (draft.meta_description ?? '').trim().length // در زبان انگلیسی، فیلدهای متنی به ستون‌های _en می‌روند؛ اسلاگ/تصویر/وضعیت مشترک‌اند const suf = (name: N) => `${name}${editLang === 'en' ? '_en' : ''}` as keyof Draft // مقدار فعال فیلد دوزبانه — برای value ورودی‌ها و چک‌لیست سئو @@ -353,6 +369,7 @@ export function ArticleWritePage() { const activeVal = (name: 'title' | 'slug' | 'author' | 'seo_keyphrase' | 'meta_description' | 'excerpt'): string => String((editLang === 'en' ? draft[`${name}_en` as keyof Draft] : draft[name]) ?? '') + const metaLength = activeVal('meta_description').trim().length // متن جایگزین تصویر شاخص — با watch('title') به‌صورت زنده ساخته می‌شود const imageAltFallback = [watchedTitle.trim(), FEATURED_IMAGE_ALT_SUFFIX] @@ -376,7 +393,11 @@ export function ArticleWritePage() {