All files / webview/hooks useSettingsState.ts

63.63% Statements 28/44
9.09% Branches 2/22
45.45% Functions 5/11
69.23% Lines 27/39

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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98                29x 29x 29x 29x 29x             29x     29x 29x 29x 29x           29x 29x 6x 6x     29x                       29x 6x 6x     29x       29x 5x     29x 4x     29x       29x       29x               29x                              
import { useCallback, useRef, useState } from 'react'
import { vscode } from '../lib/vscode'
import type { MessageRouter } from './useMessageRouter'
 
type SessionMode = 'default' | 'plan' | 'yolo'
type CommandInfo = { name: string; description: string; aliases?: string[] }
 
export function useSettingsState(router: MessageRouter) {
  const [environment, setEnvironment] = useState('')
  const [mode, setMode] = useState<SessionMode>('default')
  const [availableModes, setAvailableModes] = useState<string[]>(['default', 'plan', 'yolo'])
  const [cliCommands, setCliCommands] = useState<CommandInfo[]>([])
  const [currentModel, setCurrentModel] = useState<{
    name: string
    displayName: string
    contextWindow?: number
    tokenScalingFactor?: number
    vendor?: string
  } | null>(null)
  const [availableModels, setAvailableModels] = useState<
    { name: string; displayName: string; contextWindow?: number; tokenScalingFactor?: number; vendor?: string }[]
  >([])
  const [logoTheme, setLogoTheme] = useState<'red' | 'blue'>('blue')
  const [showPerMessageTokens, setShowPerMessageTokens] = useState(false)
  const [progressAnimationStyle, setProgressAnimationStyle] = useState<number>(2)
  const [aboutInfo, setAboutInfo] = useState<{
    extensionVersion: string
    cliVersion: string
    latestCliVersion: string | null
  } | null>(null)
 
  const modeRef = useRef<SessionMode>('default')
  const updateMode = useCallback((m: SessionMode) => {
    modeRef.current = m
    setMode(m)
  }, [])
 
  router.register('session', (msg) => {
    setEnvironment(msg.environment as string)
    if (msg.commands) setCliCommands(msg.commands as CommandInfo[])
    if (msg.modes && Array.isArray(msg.modes)) setAvailableModes(msg.modes as string[])
    if (msg.availableModels && Array.isArray(msg.availableModels))
      setAvailableModels(msg.availableModels as typeof availableModels)
    const savedMode = localStorage.getItem('bzcode-mode')
    if (savedMode && savedMode !== 'default') {
      vscode.postMessage({ type: 'setMode', mode: savedMode })
    }
  })
 
  router.register('status', (msg) => {
    Eif (msg.mode) updateMode(msg.mode as SessionMode)
    Iif ((msg.model as { displayName?: string })?.displayName) setCurrentModel(msg.model as typeof currentModel)
  })
 
  router.register('initialModel', (msg) => {
    setCurrentModel((prev) => prev ?? { name: msg.model as string, displayName: msg.model as string })
  })
 
  router.register('availableModels', (msg) => {
    setAvailableModels(msg.models as typeof availableModels)
  })
 
  router.register('logoTheme', (msg) => {
    setLogoTheme(msg.theme as 'red' | 'blue')
  })
 
  router.register('showPerMessageTokens', (msg) => {
    setShowPerMessageTokens(msg.show as boolean)
  })
 
  router.register('progressAnimationStyle', (msg) => {
    setProgressAnimationStyle(msg.style as number)
  })
 
  router.register('aboutInfo', (msg) => {
    setAboutInfo({
      extensionVersion: msg.extensionVersion as string,
      cliVersion: msg.cliVersion as string,
      latestCliVersion: (msg.latestCliVersion as string) ?? null,
    })
  })
 
  return {
    environment,
    mode,
    availableModes,
    cliCommands,
    currentModel,
    availableModels,
    logoTheme,
    showPerMessageTokens,
    progressAnimationStyle,
    setProgressAnimationStyle,
    aboutInfo,
    setAboutInfo,
  }
}