From 622bdaef14bea967a8785c26c25968d4e6170f15 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 11 Sep 2026 20:47:02 +0000 Subject: [PATCH] Fix create-post composer losing focus and cursor position CreatePostForm created a brand-new derived jotai atom (and a new array) on every render instead of memoizing it, which put the component into a continuous render loop. The churn from that loop raced with the browser's native focus/selection handling: clicking into the editor or pressing Home/End no longer reliably moved the caret (new text kept landing at the end instead), while Slate's own synchronously-handled arrow keys were unaffected. Memoizing the derived atom on selectedFiles stops the loop and fixes the focus/ cursor behavior. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01PTvu9CJynDZnCKonytghnF --- src/app/features/create-post/CreatePost.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/app/features/create-post/CreatePost.tsx b/src/app/features/create-post/CreatePost.tsx index 613649c3..7b6c43c0 100644 --- a/src/app/features/create-post/CreatePost.tsx +++ b/src/app/features/create-post/CreatePost.tsx @@ -106,9 +106,13 @@ export function CreatePostForm({ defaultRoomId, onCreate }: CreatePostFormProps) const [menuAnchor, setMenuAnchor] = useState(); const [selectedFiles, setSelectedFiles] = useState([]); - const uploadFamilyObserverAtom = createUploadFamilyObserverAtom( - roomUploadAtomFamily, - selectedFiles.map((f) => f.file) + const uploadFamilyObserverAtom = useMemo( + () => + createUploadFamilyObserverAtom( + roomUploadAtomFamily, + selectedFiles.map((f) => f.file) + ), + [selectedFiles] ); const uploads = useAtomValue(uploadFamilyObserverAtom); const uploadsPending = uploads.some((upload) => upload.status !== UploadStatus.Success);