MCPcopy
hub / github.com/anomalyco/opencode / createOpencodeModeStack

Function createOpencodeModeStack

packages/tui/src/keymap.tsx:53–100  ·  view source on GitHub ↗
(keymap: OpenTuiKeymap)

Source from the content-addressed store, hash-verified

51}
52
53export function createOpencodeModeStack(keymap: OpenTuiKeymap) {
54 keymap.setData(OPENCODE_MODE_KEY, OPENCODE_BASE_MODE)
55
56 const offFields = keymap.registerLayerFields({
57 mode(value, ctx) {
58 ctx.require(OPENCODE_MODE_KEY, value)
59 },
60 })
61
62 const stack: { id: symbol; mode: string }[] = []
63 let disposed = false
64
65 const update = () => {
66 keymap.setData(OPENCODE_MODE_KEY, stack.at(-1)?.mode ?? OPENCODE_BASE_MODE)
67 }
68
69 const stackApi = {
70 current() {
71 return stack.at(-1)?.mode ?? OPENCODE_BASE_MODE
72 },
73 push(mode: string) {
74 if (disposed) return () => {}
75 const id = Symbol(mode)
76 let active = true
77 stack.push({ id, mode })
78 update()
79
80 return () => {
81 if (!active) return
82 active = false
83 const index = stack.findIndex((item) => item.id === id)
84 if (index !== -1) stack.splice(index, 1)
85 update()
86 }
87 },
88 dispose() {
89 if (disposed) return
90 disposed = true
91 stack.length = 0
92 offFields()
93 keymap.setData(OPENCODE_MODE_KEY, undefined)
94 modeStacks.delete(keymap)
95 },
96 }
97
98 modeStacks.set(keymap, stackApi)
99 return stackApi
100}
101
102export function useOpencodeModeStack() {
103 return getOpencodeModeStack(useOpencodeKeymap())

Callers 1

registerOpencodeKeymapFunction · 0.85

Calls 1

setMethod · 0.45

Tested by

no test coverage detected