(keymap: OpenTuiKeymap)
| 51 | } |
| 52 | |
| 53 | export 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 | |
| 102 | export function useOpencodeModeStack() { |
| 103 | return getOpencodeModeStack(useOpencodeKeymap()) |
no test coverage detected