From e74d0b6713586a0862c9d802cb98754c6633de7b Mon Sep 17 00:00:00 2001 From: Euigyom Kim Date: Wed, 14 Jan 2026 13:09:19 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EA=B3=B5=EA=B0=9C=20=EB=B2=94=EC=9C=84?= =?UTF-8?q?=20=EC=84=A4=EC=A0=95=20=EC=A0=80=EC=9E=A5=20=EB=AC=B8=EC=A0=9C?= =?UTF-8?q?=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - useEffect 간의 레이스 컨디션 제거 - visibility와 visibilityAccountId 상태를 통합하여 visibilityState 객체로 관리 - 계정 변경시에만 상태를 다시 로드하도록 최적화 - "전체 공개"에서 "미등록"으로 변경시 저장되지 않던 문제 해결 --- src/ui/components/ComposeBox.tsx | 39 ++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/ui/components/ComposeBox.tsx b/src/ui/components/ComposeBox.tsx index c3c71d5..7ac1c6d 100644 --- a/src/ui/components/ComposeBox.tsx +++ b/src/ui/components/ComposeBox.tsx @@ -65,8 +65,14 @@ export const ComposeBox = ({ const [cwEnabled, setCwEnabled] = useState(false); const [cwText, setCwText] = useState(""); const [isSubmitting, setIsSubmitting] = useState(false); - const [visibility, setVisibility] = useState("public"); - const [visibilityAccountId, setVisibilityAccountId] = useState(account?.id ?? null); + const [visibilityState, setVisibilityState] = useState(() => { + const accountId = account?.id ?? null; + const stored = parseVisibility(localStorage.getItem(getVisibilityStorageKey(accountId))); + return { + visibility: stored ?? "public" as Visibility, + accountId + }; + }); const [attachments, setAttachments] = useState< { id: string; file: File; previewUrl: string }[] >([]); @@ -141,18 +147,21 @@ export const ComposeBox = ({ }, [activeImage]); useEffect(() => { - const accountId = account?.id ?? null; - const stored = parseVisibility(localStorage.getItem(getVisibilityStorageKey(accountId))); - setVisibility(stored ?? "public"); - setVisibilityAccountId(accountId); - }, [account?.id]); + if (account?.id !== visibilityState.accountId) { + const accountId = account?.id ?? null; + const stored = parseVisibility(localStorage.getItem(getVisibilityStorageKey(accountId))); + setVisibilityState({ + visibility: stored ?? "public", + accountId + }); + } + }, [account?.id, visibilityState.accountId]); useEffect(() => { - if (!account || visibilityAccountId !== account.id) { - return; + if (account?.id && visibilityState.accountId === account.id) { + localStorage.setItem(getVisibilityStorageKey(account.id), visibilityState.visibility); } - localStorage.setItem(getVisibilityStorageKey(account.id), visibility); - }, [account?.id, visibility, visibilityAccountId]); + }, [account?.id, visibilityState]); // 계정 변경 시 인스턴스 정보 로드 useEffect(() => { @@ -208,7 +217,7 @@ export const ComposeBox = ({ try { const ok = await onSubmit({ text: text.trim(), - visibility, + visibility: visibilityState.visibility, inReplyToId: replyingTo?.id, files: attachments.map((item) => item.file), spoilerText: cwEnabled ? cwText.trim() : "" @@ -607,15 +616,15 @@ export const ComposeBox = ({ )} - {visibility === "public" ? ( + {visibilityState.visibility === "public" ? (

전체 공개로 게시됩니다. 민감한 내용은 주의해주세요.

) : null}