/ src / hooks / useSettingsChange.ts
useSettingsChange.ts
 1  import { useCallback, useEffect } from 'react'
 2  import { settingsChangeDetector } from '../utils/settings/changeDetector.js'
 3  import type { SettingSource } from '../utils/settings/constants.js'
 4  import { getSettings_DEPRECATED } from '../utils/settings/settings.js'
 5  import type { SettingsJson } from '../utils/settings/types.js'
 6  
 7  export function useSettingsChange(
 8    onChange: (source: SettingSource, settings: SettingsJson) => void,
 9  ): void {
10    const handleChange = useCallback(
11      (source: SettingSource) => {
12        // Cache is already reset by the notifier (changeDetector.fanOut) —
13        // resetting here caused N-way thrashing with N subscribers: each
14        // cleared the cache, re-read from disk, then the next cleared again.
15        const newSettings = getSettings_DEPRECATED()
16        onChange(source, newSettings)
17      },
18      [onChange],
19    )
20  
21    useEffect(
22      () => settingsChangeDetector.subscribe(handleChange),
23      [handleChange],
24    )
25  }