Skip to main content

useFolderData Hook

The useFolderData hook manages the data fetching and state management for folders. It provides an easy way to access and manipulate folder data throughout the application.

Usage

import { useFolderData } from '@hooks/useFolderData'

function MyComponent() {
const { data, isLoading, error, move, rename, create } = useFolderData('folder-id', 'project-id')

const handleMove = async () => {
try {
await move('new-parent-id', 'canvas')
} catch (error) {
console.error('Failed to move:', error)
}
}

if (isLoading) return <div>Loading...</div>
if (error) return <div>Error: {error.message}</div>

return (
<div>
<h1>{data.name}</h1>
<button onClick={handleMove}>Move</button>
</div>
)
}

API Reference

Hook Parameters

NameTypeRequiredDescription
folderIdstringNoThe ID of the folder to fetch. If not provided, fetches root folder
projectIdstringNoThe ID of the project to scope the folder operations to
optionsUseQueryOptionsNoReact Query options for customizing the query behavior

Return Value

interface UseFolderDataReturn {
data: FolderData | undefined
isLoading: boolean
isError: boolean
error: Error | null
move: (newParentId: string, itemType: string) => Promise<void>
rename: (newName: string) => Promise<void>
create: (name: string) => Promise<void>
remove: () => Promise<void>
invalidateFolder: () => void
}

interface FolderData {
_id: string
name: string
parent: string | null
project: string
owner: string
users: string[]
children: FolderChild[]
inheritPermissions: boolean
createdAt: string
updateDate: string
}

Features

Data Fetching

The hook handles data fetching with caching and automatic revalidation:

const { data, isLoading, error } = useFolderData(folderId, projectId)

if (isLoading) return <div>Loading...</div>
if (error) return <div>Error: {error.message}</div>

console.log('Folder name:', data.name)

Move Operation

Move a folder to a new parent:

const { move } = useFolderData(folderId)

try {
// Move the folder
await move('new-parent-id', 'folder')
} catch (error) {
console.error('Failed to move folder:', error)
}

Rename Operation

Rename a folder:

const { rename } = useFolderData(folderId)

try {
// Rename the folder
await rename('New Folder Name')
} catch (error) {
console.error('Failed to rename folder:', error)
}

Create Operation

Create a new folder:

const { create } = useFolderData(folderId)

try {
// Create a new subfolder
await create('New Subfolder')
} catch (error) {
console.error('Failed to create folder:', error)
}

Remove Operation

Remove a folder:

const { remove } = useFolderData(folderId)

try {
// Remove the folder
await remove()
} catch (error) {
console.error('Failed to remove folder:', error)
}

Cache Invalidation

Manually invalidate the folder cache:

const { invalidateFolder } = useFolderData(folderId)

// Invalidate the cache after external changes
invalidateFolder()

Implementation Details

The hook uses React Query for data fetching and cache management:

export function useFolderData(folderId?: string, projectId?: string) {
const queryClient = useQueryClient()

const {
data: folder,
isLoading,
error
} = useQuery({
queryKey: [FOLDER_QUERY_KEY, 'detail', folderId],
queryFn: () => (folderId ? getFolder({ id: folderId }) : null),
enabled: !!folderId
})

const invalidateFolder = () => {
queryClient.invalidateQueries({ queryKey: [FOLDER_QUERY_KEY] })
}

// Error handling wrapper
const handleOperation = async <T>(operation: () => Promise<T>) => {
try {
await operation()
invalidateFolder()
} catch (error) {
console.error('Folder operation failed:', error)
throw error
}
}

return {
data: folder,
isLoading,
error,
move: (newParentId, itemType) =>
handleOperation(() => moveFolder({ id: folderId, newParentId, itemType })),
rename: (newName) =>
handleOperation(() => editFolderName({ id: folderId, name: newName })),
create: (name) =>
handleOperation(() => createFolder({ name, parent: folderId, project: projectId })),
remove: () =>
handleOperation(() => removeFolder({ id: folderId })),
invalidateFolder
}
}