Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 48x 48x 48x 11079x 993x 11079x 11079x 48x 47x 47x 527x 527x 527x 527x 47x 47x 47x 48x | import { useCallback, useEffect, useRef } from 'react'
import { vscode } from '../lib/vscode'
export type MessageHandler = (msg: Record<string, unknown>) => void
export interface MessageRouter {
register(type: string, handler: MessageHandler): void
}
export function useMessageRouter(): MessageRouter {
const handlers = useRef(new Map<string, MessageHandler[]>())
const initialized = useRef(false)
const register = useCallback((type: string, handler: MessageHandler) => {
if (initialized.current) return
const existing = handlers.current.get(type) ?? []
existing.push(handler)
handlers.current.set(type, existing)
}, [])
useEffect(() => {
initialized.current = true
const listener = (event: MessageEvent) => {
const msg = event.data
const list = handlers.current.get(msg.type)
Eif (list) {
for (const handler of list) handler(msg)
}
}
window.addEventListener('message', listener)
vscode.postMessage({ type: 'webviewReady' })
return () => window.removeEventListener('message', listener)
}, [])
return { register }
}
|