@@ -321,6 +321,14 @@ const SidebarNavItem = memo(function SidebarNavItem({
321321/** Event name for sidebar scroll operations - centralized for consistency */
322322export 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