---
title: useDocumentWorkspace
description: Manage document lists, refreshes, lazy previews, and workspace events.
---
# useDocumentWorkspace
`useDocumentWorkspace()` provides headless state for document browsers backed by local or remote storage.
It manages:
- initial, manual, focused-window, reconnect, and interval refreshes
- deduplicated refresh requests and source invalidation events
- lazy preview loading with bounded concurrency
- preview object URL creation and cleanup
- per-preview errors
## Usage
```ts
import { useDocumentWorkspace } from '@open-pencil/vue'
const workspace = useDocumentWorkspace({
source: {
refresh: () => documentService.list(),
loadPreview: (id) => documentService.loadPreview(id),
subscribe: (listener) => documentService.subscribe(listener),
},
refreshInterval: 60_000,
})
```
The source must return items with `id`, `name`, and `updatedAt`. A changed `updatedAt` value invalidates an existing or in-flight preview.
## Lazy previews
Apply `previewDirective` to the element that should trigger loading, then resolve the current object URL with `previewURL()`:
```vue
```
When `IntersectionObserver` is unavailable, the directive loads the preview immediately.
## Errors
`error` contains the latest document-list refresh failure. Preview failures are available by document ID through `previewErrors`; use `onPreviewError` when errors should also be reported to an application service.
```ts
const workspace = useDocumentWorkspace({
source,
onPreviewError(id, error) {
reportPreviewError({ id, error })
},
})
```
Calling `loadPreview(id)` retries a failed preview. Successful loads clear the corresponding preview error.
## Cleanup
The composable revokes generated object URLs and unsubscribes from the source when its component unmounts. Call `clearPreviews()` when switching an external workspace or provider without unmounting the component.