From 90ed853a2624014353d8bc52fdd8ffcfd0082b99 Mon Sep 17 00:00:00 2001 From: Matt Van Horn <455140+mvanhorn@users.noreply.github.com> Date: Wed, 8 Apr 2026 01:36:24 -0700 Subject: [PATCH] perf: remove unnecessary useMemo wrapping simple boolean expressions Replace useMemo calls that wrap trivial boolean checks with plain const expressions. The memo overhead exceeds the cost of these simple permission checks and mode comparisons. Fixes #1052 --- .../components/new-chat/chat-share-button.tsx | 9 +++------ .../components/new-chat/model-selector.tsx | 12 ++++-------- .../public-chat-snapshots-manager.tsx | 14 ++++---------- .../settings/image-model-manager.tsx | 14 ++++---------- .../settings/model-config-manager.tsx | 18 +++--------------- 5 files changed, 18 insertions(+), 49 deletions(-) diff --git a/surfsense_web/components/new-chat/chat-share-button.tsx b/surfsense_web/components/new-chat/chat-share-button.tsx index 4fc35aba1..2f16ab860 100644 --- a/surfsense_web/components/new-chat/chat-share-button.tsx +++ b/surfsense_web/components/new-chat/chat-share-button.tsx @@ -4,7 +4,7 @@ import { useQuery, useQueryClient } from "@tanstack/react-query"; import { useAtomValue, useSetAtom } from "jotai"; import { Earth, User, Users } from "lucide-react"; -import { useCallback, useMemo, useState } from "react"; +import { useCallback, useState } from "react"; import { toast } from "sonner"; import { currentThreadAtom, setThreadVisibilityAtom } from "@/atoms/chat/current-thread.atom"; import { myAccessAtom } from "@/atoms/members/members-query.atoms"; @@ -63,11 +63,8 @@ export function ChatShareButton({ thread, onVisibilityChange, className }: ChatS // Permission check for public sharing const { data: access } = useAtomValue(myAccessAtom); - const canCreatePublicLink = useMemo(() => { - if (!access) return false; - if (access.is_owner) return true; - return access.permissions?.includes("public_sharing:create") ?? false; - }, [access]); + const canCreatePublicLink = + !!access && (access.is_owner || (access.permissions?.includes("public_sharing:create") ?? false)); // Query to check if thread has public snapshots const { data: snapshotsData } = useQuery({ diff --git a/surfsense_web/components/new-chat/model-selector.tsx b/surfsense_web/components/new-chat/model-selector.tsx index 46b4a2c3a..ec5bf6760 100644 --- a/surfsense_web/components/new-chat/model-selector.tsx +++ b/surfsense_web/components/new-chat/model-selector.tsx @@ -121,9 +121,8 @@ export function ModelSelector({ return llmUserConfigs?.find((c) => c.id === agentLlmId) ?? null; }, [preferences, llmGlobalConfigs, llmUserConfigs]); - const isLLMAutoMode = useMemo(() => { - return currentLLMConfig && "is_auto_mode" in currentLLMConfig && currentLLMConfig.is_auto_mode; - }, [currentLLMConfig]); + const isLLMAutoMode = + currentLLMConfig && "is_auto_mode" in currentLLMConfig && currentLLMConfig.is_auto_mode; // ─── Image current config ─── const currentImageConfig = useMemo(() => { @@ -135,11 +134,8 @@ export function ModelSelector({ return imageUserConfigs?.find((c) => c.id === id) ?? null; }, [preferences, imageGlobalConfigs, imageUserConfigs]); - const isImageAutoMode = useMemo(() => { - return ( - currentImageConfig && "is_auto_mode" in currentImageConfig && currentImageConfig.is_auto_mode - ); - }, [currentImageConfig]); + const isImageAutoMode = + currentImageConfig && "is_auto_mode" in currentImageConfig && currentImageConfig.is_auto_mode; // ─── Vision current config ─── const currentVisionConfig = useMemo(() => { diff --git a/surfsense_web/components/public-chat-snapshots/public-chat-snapshots-manager.tsx b/surfsense_web/components/public-chat-snapshots/public-chat-snapshots-manager.tsx index 24d801409..7f8cd1b01 100644 --- a/surfsense_web/components/public-chat-snapshots/public-chat-snapshots-manager.tsx +++ b/surfsense_web/components/public-chat-snapshots/public-chat-snapshots-manager.tsx @@ -43,17 +43,11 @@ export function PublicChatSnapshotsManager({ // Permissions const { data: access } = useAtomValue(myAccessAtom); - const canView = useMemo(() => { - if (!access) return false; - if (access.is_owner) return true; - return access.permissions?.includes("public_sharing:view") ?? false; - }, [access]); + const canView = + !!access && (access.is_owner || (access.permissions?.includes("public_sharing:view") ?? false)); - const canDelete = useMemo(() => { - if (!access) return false; - if (access.is_owner) return true; - return access.permissions?.includes("public_sharing:delete") ?? false; - }, [access]); + const canDelete = + !!access && (access.is_owner || (access.permissions?.includes("public_sharing:delete") ?? false)); // Mutations const { mutateAsync: deleteSnapshot } = useAtomValue(deletePublicChatSnapshotMutationAtom); diff --git a/surfsense_web/components/settings/image-model-manager.tsx b/surfsense_web/components/settings/image-model-manager.tsx index 23162b629..977e42efc 100644 --- a/surfsense_web/components/settings/image-model-manager.tsx +++ b/surfsense_web/components/settings/image-model-manager.tsx @@ -78,16 +78,10 @@ export function ImageModelManager({ searchSpaceId }: ImageModelManagerProps) { }, [members]); const { data: access } = useAtomValue(myAccessAtom); - const canCreate = useMemo(() => { - if (!access) return false; - if (access.is_owner) return true; - return access.permissions?.includes("image_generations:create") ?? false; - }, [access]); - const canDelete = useMemo(() => { - if (!access) return false; - if (access.is_owner) return true; - return access.permissions?.includes("image_generations:delete") ?? false; - }, [access]); + const canCreate = + !!access && (access.is_owner || (access.permissions?.includes("image_generations:create") ?? false)); + const canDelete = + !!access && (access.is_owner || (access.permissions?.includes("image_generations:delete") ?? false)); const canUpdate = canCreate; const isReadOnly = !canCreate && !canDelete; diff --git a/surfsense_web/components/settings/model-config-manager.tsx b/surfsense_web/components/settings/model-config-manager.tsx index db4f169f8..82464a0ed 100644 --- a/surfsense_web/components/settings/model-config-manager.tsx +++ b/surfsense_web/components/settings/model-config-manager.tsx @@ -89,21 +89,9 @@ export function ModelConfigManager({ searchSpaceId }: ModelConfigManagerProps) { // Permissions const { data: access } = useAtomValue(myAccessAtom); - const canCreate = useMemo(() => { - if (!access) return false; - if (access.is_owner) return true; - return access.permissions?.includes("llm_configs:create") ?? false; - }, [access]); - const canUpdate = useMemo(() => { - if (!access) return false; - if (access.is_owner) return true; - return access.permissions?.includes("llm_configs:update") ?? false; - }, [access]); - const canDelete = useMemo(() => { - if (!access) return false; - if (access.is_owner) return true; - return access.permissions?.includes("llm_configs:delete") ?? false; - }, [access]); + const canCreate = !!access && (access.is_owner || (access.permissions?.includes("llm_configs:create") ?? false)); + const canUpdate = !!access && (access.is_owner || (access.permissions?.includes("llm_configs:update") ?? false)); + const canDelete = !!access && (access.is_owner || (access.permissions?.includes("llm_configs:delete") ?? false)); const isReadOnly = !canCreate && !canUpdate && !canDelete; // Local state