OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-tps / distribute / hypertps-win64 / lib / input-box.js

83 lines · javascript ref:
export function handleInputKey (model, key) {
  const buf = model.inputBuffer || ''
  const pos = model.cursorPos != null ? model.cursorPos : buf.length

  if (key.name === 'return') {
    if (buf.trim()) {
      return { send: buf.trim(), inputBuffer: '', cursorPos: 0 }
    }
    return null
  }

  if (key.name === 'backspace') {
    if (pos > 0) {
      return {
        inputBuffer: buf.slice(0, pos - 1) + buf.slice(pos),
        cursorPos: pos - 1
      }
    }
    return null
  }

  if (key.name === 'delete') {
    if (pos < buf.length) {
      return {
        inputBuffer: buf.slice(0, pos) + buf.slice(pos + 1),
        cursorPos: pos
      }
    }
    return null
  }

  if (key.name === 'left') {
    if (pos > 0) return { cursorPos: pos - 1 }
    return null
  }

  if (key.name === 'right') {
    if (pos < buf.length) return { cursorPos: pos + 1 }
    return null
  }

  if (key.name === 'home' || (key.name === 'a' && key.ctrl)) {
    return { cursorPos: 0 }
  }

  if (key.name === 'end' || (key.name === 'e' && key.ctrl)) {
    return { cursorPos: buf.length }
  }

  // Ctrl+U: clear line
  if (key.name === 'u' && key.ctrl) {
    return { inputBuffer: '', cursorPos: 0 }
  }

  // Ctrl+W: delete word back
  if (key.name === 'w' && key.ctrl) {
    const before = buf.slice(0, pos)
    const trimmed = before.replace(/\s*\S+\s*$/, '')
    return {
      inputBuffer: trimmed + buf.slice(pos),
      cursorPos: trimmed.length
    }
  }

  // Regular character input
  if (!key.ctrl && !key.meta && key.sequence && key.sequence.length === 1 && key.sequence >= ' ') {
    return {
      inputBuffer: buf.slice(0, pos) + key.sequence + buf.slice(pos),
      cursorPos: pos + 1
    }
  }

  // Multi-byte chars (emoji, unicode)
  if (!key.ctrl && !key.meta && key.sequence && key.sequence.length > 1 && !key.sequence.startsWith('\x1b')) {
    return {
      inputBuffer: buf.slice(0, pos) + key.sequence + buf.slice(pos),
      cursorPos: pos + key.sequence.length
    }
  }

  return null
}