2026-04-10 14:47:27 +00:00
|
|
|
import type { Event } from "@opencode-ai/sdk/v2"
|
|
|
|
|
import { useProject } from "./project"
|
|
|
|
|
import { useSDK } from "./sdk"
|
|
|
|
|
|
2026-05-12 03:42:04 +00:00
|
|
|
type EventMetadata = {
|
|
|
|
|
workspace: string | undefined
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-10 14:47:27 +00:00
|
|
|
export function useEvent() {
|
|
|
|
|
const project = useProject()
|
|
|
|
|
const sdk = useSDK()
|
|
|
|
|
|
2026-05-12 03:42:04 +00:00
|
|
|
function subscribe(handler: (event: Event, metadata: EventMetadata) => void) {
|
2026-04-10 14:47:27 +00:00
|
|
|
return sdk.event.on("event", (event) => {
|
2026-04-13 20:51:59 +00:00
|
|
|
if (event.payload.type === "sync") {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-12 03:42:04 +00:00
|
|
|
if (event.directory === "global" || event.project === project.project()) {
|
|
|
|
|
handler(event.payload, { workspace: event.workspace })
|
2026-04-10 14:47:27 +00:00
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-12 03:42:04 +00:00
|
|
|
function on<T extends Event["type"]>(
|
|
|
|
|
type: T,
|
|
|
|
|
handler: (event: Extract<Event, { type: T }>, metadata: EventMetadata) => void,
|
|
|
|
|
) {
|
|
|
|
|
return subscribe((event: Event, metadata: EventMetadata) => {
|
2026-04-10 14:47:27 +00:00
|
|
|
if (event.type !== type) return
|
2026-05-12 03:42:04 +00:00
|
|
|
handler(event as Extract<Event, { type: T }>, metadata)
|
2026-04-10 14:47:27 +00:00
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
subscribe,
|
|
|
|
|
on,
|
|
|
|
|
}
|
|
|
|
|
}
|