useFolderOperations Hook
The useFolderOperations
hook provides a comprehensive set of operations for managing folders and files, including moving, deleting, starring, and updating permissions.
Usage
import { useFolderOperations } from '@hooks/useFolderOperations'
function MyComponent() {
const {
moveToFolder,
moveToProject,
deleteFolder,
updatePermissions,
starItem,
unstarItem,
renameItem,
deleteItem,
createFolder
} = useFolderOperations()
const handleMove = async () => {
try {
await moveToFolder({
fileId: 'file-id',
folderId: 'target-folder-id',
fileType: 'canvas'
})
} catch (error) {
console.error('Failed to move:', error)
}
}
}
API Reference
moveToFolder
Moves a file or folder to a target folder.
const moveToFolder: ({
fileId,
fileType,
folderId
}: {
fileId: string
fileType: string
folderId: string
}) => Promise<void>
moveToProject
Moves a file or folder to a different project.
const moveToProject: ({
fileId,
fileType,
folderId
}: {
fileId: string
fileType: string
folderId: string
}) => Promise<void>
createFolder
Creates a new folder.
const createFolder: ({
name,
parent,
project
}: CreateFolderParams) => Promise<void>
interface CreateFolderParams {
name: string
parent?: string | null
project: string
}
deleteFolder
Deletes a folder and optionally its contents.
const deleteFolder: (folderId: string) => Promise<void>
updatePermissions
Updates folder permissions.
const updatePermissions: ({
id,
permissions
}: {
id: string
permissions: UpdateFolderPermissionsRequest
}) => Promise<void>
interface UpdateFolderPermissionsRequest {
users: { user: string; role: FolderRole }[]
teams: { team: string; role: FolderRole }[]
inheritPermissions: boolean
}
starItem/unstarItem
Manage starred items.
const starItem: ({
itemId,
itemType
}: {
itemId: string
itemType: StarredItemType
}) => Promise<void>
const unstarItem: ({
itemId,
itemType
}: {
itemId: string
itemType: StarredItemType
}) => Promise<void>
renameItem
Rename a file or folder.
const renameItem: (
file: { _id: string; type: string },
newName: string
) => Promise<void>
deleteItem
Delete a file or folder.
const deleteItem: (
file: { _id: string; type: string }
) => Promise<void>
Implementation Details
The hook uses React Query's useMutation
for managing server state and cache invalidation:
const moveToFolderMutation = useMutation({
mutationFn: ({
fileId,
fileType,
folderId
}: {
fileId: string
fileType: string
folderId: string
}) => moveFolder({ id: fileId, newParentId: folderId, itemType: fileType }),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: [FOLDER_QUERY_KEY] })
queryClient.invalidateQueries({ queryKey: ['folder'] })
},
onError: (error) => {
showError({
title: 'Failed to Move',
message: error instanceof Error ? error.message : 'Failed to move item'
})
}
})
Error Handling
All operations include proper error handling with descriptive error messages:
try {
await starItem({ itemId: 'file-id', itemType: 'canvas' })
} catch (error) {
showError({
title: 'Failed to Star',
message: error instanceof Error ? error.message : 'Failed to star item'
})
}
Cache Management
The hook automatically manages the cache for:
- Folder tree data
- Individual folder data
- Starred items
- Project data
Each mutation includes appropriate cache invalidation to ensure UI consistency.
Example with Multiple Operations
function FolderManager() {
const {
moveToFolder,
moveToProject,
deleteFolder,
updatePermissions,
starItem,
unstarItem,
renameItem,
deleteItem,
createFolder
} = useFolderOperations()
const handleFileOperations = async () => {
try {
// Move file to a folder
await moveToFolder({
fileId: 'file-1',
folderId: 'folder-1',
fileType: 'canvas'
})
// Update permissions
await updatePermissions('folder-1', {
users: ['user-1'],
permissions: ['read', 'write']
})
} catch (error) {
console.error('Failed to perform operations:', error)
}
}
return <button onClick={handleFileOperations}>Manage Files</button>
}