authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-02-15 16:23:11-08:00
committergravatar for jmarminge@gmail.comJulius Marminge <jmarminge@gmail.com> 2026-02-15 16:27:25-08:00
logb7fb0b8fed3c523cee60ebd90da8aa4ba5862767
tree36dcc1cae5ffefa549e113fba8bc68a82535ef4e
parent5656f294d05eaa6e1fcbe82b9749bf1af61793dc

Memoize ChatView selection handlers with useCallback

- Wrap model, effort, and env mode handlers in `useCallback` - Stabilize callback identities while preserving composer focus behavior

1 files changed, 26 insertions(+), 17 deletions(-)

apps/web/src/components/ChatView.tsx+26-17
......@@ -897,23 +897,32 @@ export default function ChatView() {
897897 }
898898 };
899899
900 const onModelSelect = (model: ModelSlug) => {
901 if (!activeThread) return;
902 dispatch({
903 type: "SET_THREAD_MODEL",
904 threadId: activeThread.id,
905 model: resolveModelSlug(model),
906 });
907 scheduleComposerFocus();
908 };
909 const onEffortSelect = (effort: ReasoningEffort) => {
910 setSelectedEffort(effort);
911 scheduleComposerFocus();
912 };
913 const onEnvModeChange = (mode: "local" | "worktree") => {
914 setEnvMode(mode);
915 scheduleComposerFocus();
916 };
900 const onModelSelect = useCallback(
901 (model: ModelSlug) => {
902 if (!activeThread) return;
903 dispatch({
904 type: "SET_THREAD_MODEL",
905 threadId: activeThread.id,
906 model: resolveModelSlug(model),
907 });
908 scheduleComposerFocus();
909 },
910 [activeThread, dispatch, scheduleComposerFocus],
911 );
912 const onEffortSelect = useCallback(
913 (effort: ReasoningEffort) => {
914 setSelectedEffort(effort);
915 scheduleComposerFocus();
916 },
917 [scheduleComposerFocus],
918 );
919 const onEnvModeChange = useCallback(
920 (mode: "local" | "worktree") => {
921 setEnvMode(mode);
922 scheduleComposerFocus();
923 },
924 [scheduleComposerFocus],
925 );
917926
918927 const onKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {
919928 if (e.key === "Enter" && !e.shiftKey) {