aura-ai
Version:
AI-powered marketing strategist CLI tool for developers
156 lines (141 loc) • 4.26 kB
JSX
import React, { useState, useEffect } from 'react'
import { Box, Text } from 'ink'
import SelectInput from 'ink-select-input'
import TextInput from 'ink-text-input'
import fs from 'fs/promises'
/**
* Settings Page - Configure Aura avatars
*/
const SettingsPage = ({ onBack }) => {
const [mode, setMode] = useState('menu') // menu | input
const [inputValue, setInputValue] = useState('')
const [currentSetting, setCurrentSetting] = useState('')
const [settings, setSettings] = useState({
avatars: { aura: '🌀', user: '>' }
})
// 載入設定
useEffect(() => {
loadSettings()
}, [])
// 載入設定函數
const loadSettings = async () => {
try {
const data = await fs.readFile('./.aura.json', 'utf-8')
setSettings(JSON.parse(data))
} catch {
// 使用預設值
}
}
// 儲存設定函數
const saveSettings = async (newSettings) => {
try {
await fs.writeFile('./.aura.json', JSON.stringify(newSettings, null, 2))
} catch (error) {
console.error('Failed to save settings:', error)
}
}
// 選單項目
const menuItems = [
{
label: `${settings.avatars.aura} Set Aura avatar`,
value: 'setAura'
},
{
label: `${settings.avatars.user} Set User avatar`,
value: 'setUser'
},
{
label: 'Reset to defaults',
value: 'reset'
},
{
label: 'Exit',
value: 'exit'
}
]
// 處理選單選擇
const handleSelect = async (item) => {
if (item.value === 'exit') {
onBack()
} else if (item.value === 'reset') {
const defaultSettings = { avatars: { aura: '🌀', user: '>' } }
await saveSettings(defaultSettings)
setSettings(defaultSettings)
onBack()
} else {
setCurrentSetting(item.value)
setMode('input')
setInputValue('')
}
}
// 處理頭像輸入
const handleAvatarSubmit = async (value) => {
if (value && value.length > 0) {
// 取得第一個完整的字符(包括 emoji)
const char = value.trim()
const newSettings = { ...settings }
if (currentSetting === 'setAura') {
newSettings.avatars.aura = char
} else if (currentSetting === 'setUser') {
newSettings.avatars.user = char
}
await saveSettings(newSettings)
setSettings(newSettings)
setMode('menu')
setInputValue('')
}
}
// 根據模式渲染不同介面
if (mode === 'input') {
return (
<Box flexDirection="column" padding={1}>
<Box paddingY={1} paddingX={2} borderColor='blue' borderStyle='round' width={'100%'}>
<Text>
<Text bold>Settings</Text> - Avatar Configuration
</Text>
</Box>
<Box marginTop={2} flexDirection="column">
<Text>
{currentSetting === 'setAura'
? 'Enter new Aura avatar (emoji or text):'
: 'Enter new User avatar (emoji or text):'}
</Text>
<Box marginTop={1} paddingX={1} borderColor='gray' borderStyle='single'>
<Text color='blue'>{'> '}</Text>
<TextInput
value={inputValue}
onChange={setInputValue}
onSubmit={handleAvatarSubmit}
placeholder="Enter avatar (e.g., 🐤, >, 👾)..."
focus={true}
/>
</Box>
<Box marginTop={1}>
<Text dimColor>Press Enter to save, or Ctrl+C to cancel</Text>
</Box>
</Box>
</Box>
)
}
return (
<Box flexDirection="column" padding={1}>
<Box paddingY={1} paddingX={2} borderColor='blue' borderStyle='round' width={'100%'}>
<Text>
<Text bold>Settings</Text> - Avatar Configuration
</Text>
</Box>
<Box marginTop={2} flexDirection="column">
<Text color='yellow'>Select an option:</Text>
<Box marginTop={1}>
<SelectInput items={menuItems} onSelect={handleSelect} />
</Box>
</Box>
<Box marginTop={2}>
<Text dimColor>
Current: Aura = {settings.avatars.aura} User = {settings.avatars.user}
</Text>
</Box>
</Box>
)
}
export default SettingsPage