Skip to content

Commit 07e7670

Browse files
authored
improvement(sidebar): remove unnecessary useCallback and useMemo wrappers (#4357)
* fix(sidebar): show skeleton on tasks error state, not 'New task' placeholder * improvement(sidebar): remove unnecessary useCallback and useMemo wrappers * fix(sidebar): use data-first pattern for tasks loading guard
1 parent d94f4c9 commit 07e7670

1 file changed

Lines changed: 58 additions & 81 deletions

File tree

  • apps/sim/app/workspace/[workspaceId]/w/components/sidebar

apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx

Lines changed: 58 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,14 @@ const SidebarNavItem = memo(function SidebarNavItem({
321321
/** Event name for sidebar scroll operations - centralized for consistency */
322322
export const SIDEBAR_SCROLL_EVENT = 'sidebar-scroll-to-item'
323323

324+
const HIDDEN_STYLE = { display: 'none' } as const
325+
326+
const WORKFLOW_ICON_STYLE: React.CSSProperties = {
327+
backgroundColor: 'var(--text-icon)',
328+
borderColor: 'color-mix(in srgb, var(--text-icon) 60%, transparent)',
329+
backgroundClip: 'padding-box',
330+
}
331+
324332
/**
325333
* Sidebar component with resizable width that persists across page refreshes.
326334
*
@@ -368,7 +376,7 @@ export const Sidebar = memo(function Sidebar() {
368376
isCollapsedRef.current = isCollapsed
369377
}, [isCollapsed])
370378

371-
const isMac = useMemo(() => isMacPlatform(), [])
379+
const isMac = isMacPlatform()
372380

373381
const [showCollapsedTooltips, setShowCollapsedTooltips] = useState(isCollapsed)
374382

@@ -775,19 +783,20 @@ export const Sidebar = memo(function Sidebar() {
775783
[navigateToSettings, getSettingsHref, setSidebarWidth]
776784
)
777785

778-
const handleStartTour = useCallback(() => {
786+
const handleStartTour = () => {
779787
window.dispatchEvent(
780788
new CustomEvent(isOnWorkflowPage ? START_WORKFLOW_TOUR_EVENT : START_NAV_TOUR_EVENT)
781789
)
782-
}, [isOnWorkflowPage])
790+
}
783791

784-
const { data: fetchedTasks = [], isLoading: tasksLoading } = useTasks(workspaceId)
792+
const { data: fetchedTasks } = useTasks(workspaceId)
793+
const tasksLoading = fetchedTasks === undefined
785794

786795
useTaskEvents(workspaceId)
787796

788797
const tasks = useMemo(
789798
() =>
790-
fetchedTasks.length > 0
799+
fetchedTasks && fetchedTasks.length > 0
791800
? fetchedTasks.map((t) => ({
792801
...t,
793802
href: `/workspace/${workspaceId}/task/${t.id}`,
@@ -874,7 +883,7 @@ export const Sidebar = memo(function Sidebar() {
874883
[setSidebarWidth, router]
875884
)
876885

877-
const handleConfirmDeleteTasks = useCallback(() => {
886+
const handleConfirmDeleteTasks = () => {
878887
const { taskIds: taskIdsToDelete } = contextMenuSelectionRef.current
879888
if (taskIdsToDelete.length === 0) return
880889

@@ -896,7 +905,7 @@ export const Sidebar = memo(function Sidebar() {
896905
deleteTasksMutation.mutate(taskIdsToDelete, { onSuccess: onDeleteSuccess })
897906
}
898907
setIsTaskDeleteModalOpen(false)
899-
}, [pathname, workspaceId, navigateToPage])
908+
}
900909

901910
const [visibleTaskCount, setVisibleTaskCount] = useState(5)
902911
const taskFlyoutRename = useFlyoutInlineRename({
@@ -1033,9 +1042,9 @@ export const Sidebar = memo(function Sidebar() {
10331042
}
10341043
}, [createFolder])
10351044

1036-
const handleImportWorkflow = useCallback(() => {
1045+
const handleImportWorkflow = () => {
10371046
fileInputRef.current?.click()
1038-
}, [])
1047+
}
10391048

10401049
const handleWorkspaceSwitch = useCallback(
10411050
async (workspace: Workspace) => {
@@ -1049,17 +1058,14 @@ export const Sidebar = memo(function Sidebar() {
10491058
[workspaceId, switchWorkspace]
10501059
)
10511060

1052-
const handleSidebarClick = useCallback(
1053-
(e: React.MouseEvent<HTMLElement>) => {
1054-
const target = e.target as HTMLElement
1055-
if (target.tagName === 'BUTTON' || target.closest('button, [role="button"], a')) {
1056-
return
1057-
}
1058-
const { selectOnly, clearAllSelection } = useFolderStore.getState()
1059-
workflowId ? selectOnly(workflowId) : clearAllSelection()
1060-
},
1061-
[workflowId]
1062-
)
1061+
const handleSidebarClick = (e: React.MouseEvent<HTMLElement>) => {
1062+
const target = e.target as HTMLElement
1063+
if (target.tagName === 'BUTTON' || target.closest('button, [role="button"], a')) {
1064+
return
1065+
}
1066+
const { selectOnly, clearAllSelection } = useFolderStore.getState()
1067+
workflowId ? selectOnly(workflowId) : clearAllSelection()
1068+
}
10631069

10641070
const handleRenameWorkspace = useCallback(
10651071
async (workspaceIdToRename: string, newName: string) => {
@@ -1122,43 +1128,31 @@ export const Sidebar = memo(function Sidebar() {
11221128
workspaceFileInputRef.current?.click()
11231129
}, [])
11241130

1125-
const handleWorkspaceFileChange = useCallback(
1126-
async (event: React.ChangeEvent<HTMLInputElement>) => {
1127-
const files = event.target.files
1128-
if (!files || files.length === 0) return
1131+
const handleWorkspaceFileChange = async (event: React.ChangeEvent<HTMLInputElement>) => {
1132+
const files = event.target.files
1133+
if (!files || files.length === 0) return
11291134

1130-
const zipFile = files[0]
1131-
await importWorkspace(zipFile)
1135+
const zipFile = files[0]
1136+
await importWorkspace(zipFile)
11321137

1133-
if (event.target) {
1134-
event.target.value = ''
1135-
}
1136-
},
1137-
[importWorkspace]
1138-
)
1138+
if (event.target) {
1139+
event.target.value = ''
1140+
}
1141+
}
11391142

11401143
const tasksCollapsedIcon = useMemo(
11411144
() => <Blimp className='h-[16px] w-[16px] flex-shrink-0 text-[var(--text-icon)]' />,
11421145
[]
11431146
)
11441147

1145-
const workflowIconStyle = useMemo<React.CSSProperties>(
1146-
() => ({
1147-
backgroundColor: 'var(--text-icon)',
1148-
borderColor: 'color-mix(in srgb, var(--text-icon) 60%, transparent)',
1149-
backgroundClip: 'padding-box',
1150-
}),
1151-
[]
1152-
)
1153-
11541148
const workflowsCollapsedIcon = useMemo(
11551149
() => (
11561150
<div
11571151
className='h-[16px] w-[16px] flex-shrink-0 rounded-sm border-[2.5px]'
1158-
style={workflowIconStyle}
1152+
style={WORKFLOW_ICON_STYLE}
11591153
/>
11601154
),
1161-
[workflowIconStyle]
1155+
[]
11621156
)
11631157

11641158
const tasksPrimaryAction = useMemo(
@@ -1177,53 +1171,36 @@ export const Sidebar = memo(function Sidebar() {
11771171
[handleCreateWorkflow]
11781172
)
11791173

1180-
const handleExpandSidebar = useCallback(
1181-
(e: React.MouseEvent) => {
1182-
e.preventDefault()
1183-
toggleCollapsed()
1184-
},
1185-
[toggleCollapsed]
1186-
)
1174+
const handleExpandSidebar = (e: React.MouseEvent) => {
1175+
e.preventDefault()
1176+
toggleCollapsed()
1177+
}
11871178

1188-
const handleNewTask = useCallback(
1189-
() => navigateToPage(`/workspace/${workspaceId}/home`),
1190-
[navigateToPage, workspaceId]
1191-
)
1179+
const handleNewTask = () => navigateToPage(`/workspace/${workspaceId}/home`)
11921180

1193-
const handleSeeMoreTasks = useCallback(() => setVisibleTaskCount((prev) => prev + 5), [])
1181+
const handleSeeMoreTasks = () => setVisibleTaskCount((prev) => prev + 5)
11941182

1195-
const handleCloseTaskDeleteModal = useCallback(() => setIsTaskDeleteModalOpen(false), [])
1183+
const handleCloseTaskDeleteModal = () => setIsTaskDeleteModalOpen(false)
11961184

1197-
const handleEdgeKeyDown = useCallback(
1198-
(e: React.KeyboardEvent) => {
1199-
if (isCollapsed && (e.key === 'Enter' || e.key === ' ')) {
1200-
e.preventDefault()
1201-
toggleCollapsed()
1202-
}
1203-
},
1204-
[isCollapsed, toggleCollapsed]
1205-
)
1185+
const handleEdgeKeyDown = (e: React.KeyboardEvent) => {
1186+
if (isCollapsed && (e.key === 'Enter' || e.key === ' ')) {
1187+
e.preventDefault()
1188+
toggleCollapsed()
1189+
}
1190+
}
12061191

1207-
const handleOpenHelpFromMenu = useCallback(() => setIsHelpModalOpen(true), [])
1192+
const handleOpenHelpFromMenu = () => setIsHelpModalOpen(true)
12081193

1209-
const handleOpenDocs = useCallback(() => {
1194+
const handleOpenDocs = () => {
12101195
window.open('https://docs.sim.ai', '_blank', 'noopener,noreferrer')
12111196
captureEvent(posthog, 'docs_opened', { source: 'help_menu' })
1212-
}, [posthog])
1213-
1214-
const handleTaskRenameBlur = useCallback(
1215-
() => void taskFlyoutRename.saveRename(),
1216-
[taskFlyoutRename.saveRename]
1217-
)
1197+
}
12181198

1219-
const handleWorkflowRenameBlur = useCallback(
1220-
() => void workflowFlyoutRename.saveRename(),
1221-
[workflowFlyoutRename.saveRename]
1222-
)
1199+
const handleTaskRenameBlur = () => void taskFlyoutRename.saveRename()
12231200

1224-
const hiddenStyle = useMemo(() => ({ display: 'none' }) as const, [])
1201+
const handleWorkflowRenameBlur = () => void workflowFlyoutRename.saveRename()
12251202

1226-
const resolveWorkspaceIdFromPath = useCallback((): string | undefined => {
1203+
const resolveWorkspaceIdFromPath = (): string | undefined => {
12271204
if (workspaceId) return workspaceId
12281205
if (typeof window === 'undefined') return undefined
12291206

@@ -1232,7 +1209,7 @@ export const Sidebar = memo(function Sidebar() {
12321209
if (idx === -1) return undefined
12331210

12341211
return parts[idx + 1]
1235-
}, [workspaceId])
1212+
}
12361213

12371214
useRegisterGlobalCommands(() =>
12381215
createCommands([
@@ -1888,7 +1865,7 @@ export const Sidebar = memo(function Sidebar() {
18881865
ref={workspaceFileInputRef}
18891866
type='file'
18901867
accept='.zip'
1891-
style={hiddenStyle}
1868+
style={HIDDEN_STYLE}
18921869
onChange={handleWorkspaceFileChange}
18931870
/>
18941871
</>

0 commit comments

Comments
 (0)