|
1 |
| -import type { GlobPattern } from 'vscode' |
| 1 | +import type { MaybeRefOrGetter, ShallowReactive } from '@reactive-vscode/reactivity' |
| 2 | +import { onScopeDispose, shallowReactive, toValue, watchEffect } from '@reactive-vscode/reactivity' |
| 3 | +import type { Event, FileSystemWatcher, GlobPattern, Uri } from 'vscode' |
2 | 4 | import { workspace } from 'vscode'
|
3 |
| -import { useDisposable } from './useDisposable' |
4 |
| -import { useEvent } from './useEvent' |
| 5 | +import type { MaybeNullableRefOrGetter } from '../utils' |
| 6 | +import { useEventEmitter } from './useEventEmitter' |
| 7 | + |
| 8 | +export interface UseFSWatcher { |
| 9 | + readonly watchers: ShallowReactive<Map<GlobPattern, FileSystemWatcher>> |
| 10 | + readonly onDidCreate: Event<Uri> |
| 11 | + readonly onDidChange: Event<Uri> |
| 12 | + readonly onDidDelete: Event<Uri> |
| 13 | +} |
5 | 14 |
|
6 | 15 | /**
|
7 | 16 | * @reactive `workspace.createFileSystemWatcher`
|
8 | 17 | */
|
9 |
| -export function useFsWatcher(globPattern: GlobPattern, ignoreCreateEvents?: boolean | undefined, ignoreChangeEvents?: boolean | undefined, ignoreDeleteEvents?: boolean | undefined) { |
10 |
| - const watcher = useDisposable(workspace.createFileSystemWatcher(globPattern, ignoreCreateEvents, ignoreChangeEvents, ignoreDeleteEvents)) |
| 18 | +export function useFsWatcher( |
| 19 | + globPattern: MaybeRefOrGetter<GlobPattern | GlobPattern[]>, |
| 20 | + ignoreCreateEvents?: MaybeNullableRefOrGetter<boolean>, |
| 21 | + ignoreChangeEvents?: MaybeNullableRefOrGetter<boolean>, |
| 22 | + ignoreDeleteEvents?: MaybeNullableRefOrGetter<boolean>, |
| 23 | +): UseFSWatcher { |
| 24 | + const watchers = shallowReactive(new Map<GlobPattern, FileSystemWatcher>()) |
| 25 | + const createEmitter = useEventEmitter<Uri>() |
| 26 | + const changeEmitter = useEventEmitter<Uri>() |
| 27 | + const deleteEmitter = useEventEmitter<Uri>() |
| 28 | + |
| 29 | + watchEffect(() => { |
| 30 | + const globPatternValue = toValue(globPattern) |
| 31 | + const newPatterns = Array.isArray(globPatternValue) ? globPatternValue : [globPatternValue] |
| 32 | + for (const [pattern, watcher] of watchers) { |
| 33 | + if (!newPatterns.includes(pattern)) { |
| 34 | + watcher.dispose() |
| 35 | + } |
| 36 | + } |
| 37 | + for (const pattern of newPatterns) { |
| 38 | + if (!watchers.has(pattern)) { |
| 39 | + const w = workspace.createFileSystemWatcher( |
| 40 | + pattern, |
| 41 | + toValue(ignoreCreateEvents) || false, |
| 42 | + toValue(ignoreChangeEvents) || false, |
| 43 | + toValue(ignoreDeleteEvents) || false, |
| 44 | + ) |
| 45 | + w.onDidCreate(createEmitter.fire) |
| 46 | + w.onDidChange(changeEmitter.fire) |
| 47 | + w.onDidDelete(deleteEmitter.fire) |
| 48 | + } |
| 49 | + } |
| 50 | + }) |
| 51 | + |
| 52 | + onScopeDispose(() => { |
| 53 | + for (const watcher of watchers.values()) { |
| 54 | + watcher.dispose() |
| 55 | + } |
| 56 | + }) |
11 | 57 |
|
12 | 58 | return {
|
13 |
| - ...watcher, |
14 |
| - onDidCreate: useEvent(watcher.onDidCreate), |
15 |
| - onDidChange: useEvent(watcher.onDidChange), |
16 |
| - onDidDelete: useEvent(watcher.onDidDelete), |
| 59 | + watchers, |
| 60 | + onDidCreate: createEmitter.event, |
| 61 | + onDidChange: changeEmitter.event, |
| 62 | + onDidDelete: deleteEmitter.event, |
17 | 63 | }
|
18 | 64 | }
|
0 commit comments