Skip to content

Commit 68aeb69

Browse files
committed
refactor(files): cleanup pass — effect, callback, state, and design fixes
- text-editor: replace sync-external useEffect with "adjust during render" pattern so the state machine advances immediately instead of after a paint - text-editor: remove unnecessary useCallback from markSavedContent (no observer) - files: narrow deleteTargetFile state to {id, name} — only those fields are used - files: remove uploadFile (mutation object) from useCallback deps — .mutateAsync is stable - files: remove unnecessary useCallback from handleNavigateToFiles (no observer) - files: replace raw <button> with emcn Button for "Clear all filters" action
1 parent 87aa8f6 commit 68aeb69

2 files changed

Lines changed: 27 additions & 23 deletions

File tree

apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/text-editor.tsx

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -276,25 +276,26 @@ function resolveMonacoLanguage(file: { type: string; name: string }): string {
276276
function useTextEditorContentState(options: SyncTextEditorContentStateOptions) {
277277
const [state, dispatch] = useReducer(textEditorContentReducer, INITIAL_TEXT_EDITOR_CONTENT_STATE)
278278

279-
useEffect(() => {
280-
dispatch({
281-
type: 'sync-external',
282-
...options,
283-
})
284-
}, [
285-
options.canReconcileToFetchedContent,
286-
options.fetchedContent,
287-
options.streamingContent,
288-
options.streamingMode,
289-
])
279+
const prevOptionsRef = useRef<SyncTextEditorContentStateOptions | null>(null)
280+
const prev = prevOptionsRef.current
281+
if (
282+
prev === null ||
283+
prev.canReconcileToFetchedContent !== options.canReconcileToFetchedContent ||
284+
prev.fetchedContent !== options.fetchedContent ||
285+
prev.streamingContent !== options.streamingContent ||
286+
prev.streamingMode !== options.streamingMode
287+
) {
288+
prevOptionsRef.current = options
289+
dispatch({ type: 'sync-external', ...options })
290+
}
290291

291292
const setDraftContent = useCallback((content: string) => {
292293
dispatch({ type: 'edit', content })
293294
}, [])
294295

295-
const markSavedContent = useCallback((content: string) => {
296+
const markSavedContent = (content: string) => {
296297
dispatch({ type: 'save-success', content })
297-
}, [])
298+
}
298299

299300
return {
300301
content: state.content,

apps/sim/app/workspace/[workspaceId]/files/files.tsx

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,9 @@ export function Files() {
208208
const [showUnsavedChangesAlert, setShowUnsavedChangesAlert] = useState(false)
209209
const [showDeleteConfirm, setShowDeleteConfirm] = useState(false)
210210
const contextMenuFileRef = useRef<WorkspaceFileRecord | null>(null)
211-
const [deleteTargetFile, setDeleteTargetFile] = useState<WorkspaceFileRecord | null>(null)
211+
const [deleteTargetFile, setDeleteTargetFile] = useState<{ id: string; name: string } | null>(
212+
null
213+
)
212214

213215
const listRename = useInlineRename({
214216
onSave: (fileId, name) => renameFile.mutate({ workspaceId, fileId, name }),
@@ -408,7 +410,7 @@ export function Files() {
408410
setUploadProgress({ completed: 0, total: 0 })
409411
}
410412
},
411-
[workspaceId, uploadFile]
413+
[workspaceId]
412414
)
413415

414416
const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {
@@ -508,7 +510,7 @@ export function Files() {
508510
const handleDeleteSelected = useCallback(() => {
509511
const file = selectedFileRef.current
510512
if (file) {
511-
setDeleteTargetFile(file)
513+
setDeleteTargetFile({ id: file.id, name: file.name })
512514
setShowDeleteConfirm(true)
513515
}
514516
}, [])
@@ -634,7 +636,7 @@ export function Files() {
634636
const handleContextMenuDelete = useCallback(() => {
635637
const file = contextMenuFileRef.current
636638
if (!file) return
637-
setDeleteTargetFile(file)
639+
setDeleteTargetFile({ id: file.id, name: file.name })
638640
setShowDeleteConfirm(true)
639641
closeContextMenu()
640642
}, [closeContextMenu])
@@ -841,9 +843,9 @@ export function Files() {
841843
[uploadButtonLabel, handleUploadClick]
842844
)
843845

844-
const handleNavigateToFiles = useCallback(() => {
846+
const handleNavigateToFiles = () => {
845847
router.push(`/workspace/${workspaceId}/files`)
846-
}, [router, workspaceId])
848+
}
847849

848850
const loadingBreadcrumbs = [{ label: 'Files', onClick: handleNavigateToFiles }, { label: '...' }]
849851

@@ -981,17 +983,18 @@ export function Files() {
981983
</div>
982984
)}
983985
{hasActiveFilters && (
984-
<button
985-
type='button'
986+
<Button
987+
variant='ghost'
988+
size='sm'
986989
onClick={() => {
987990
setTypeFilter([])
988991
setSizeFilter([])
989992
setUploadedByFilter([])
990993
}}
991-
className='flex h-[32px] w-full items-center justify-center rounded-md text-[var(--text-secondary)] text-caption transition-colors hover-hover:bg-[var(--surface-active)]'
994+
className='h-[32px] w-full text-[var(--text-secondary)] text-caption hover-hover:bg-[var(--surface-active)]'
992995
>
993996
Clear all filters
994-
</button>
997+
</Button>
995998
)}
996999
</div>
9971000
)

0 commit comments

Comments
 (0)