Skip to content

Commit 7635502

Browse files
committed
feat(useFsWatcher): support watching reactive arrayable patterns
1 parent ad5f36b commit 7635502

File tree

1 file changed

+55
-9
lines changed

1 file changed

+55
-9
lines changed
+55-9
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,64 @@
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'
24
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+
}
514

615
/**
716
* @reactive `workspace.createFileSystemWatcher`
817
*/
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+
})
1157

1258
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,
1763
}
1864
}

0 commit comments

Comments
 (0)