UNPKG

@graphteon/juricode

Version:

We are forging the future with lines of digital steel

102 lines 4.82 kB
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import React, { useState } from 'react'; import { Box, Text, useInput, useApp } from 'ink'; import TasksTUI from './TasksTUI'; import SuggestedTasksTUI from './SuggestedTasksTUI'; import RepositoriesTUI from './RepositoriesTUI'; import CreateTaskTUI from './CreateTaskTUI'; import ConversationTUI from './ConversationTUI'; import OpenHands from '../api/open-hands'; const MainMenuTUI = () => { const [currentScreen, setCurrentScreen] = useState('main'); const [selectedIndex, setSelectedIndex] = useState(0); const [conversationId, setConversationId] = useState(''); const { exit } = useApp(); const menuItems = [ { title: '📋 View All Tasks', value: 'tasks' }, { title: '💡 Suggested Tasks', value: 'suggested' }, { title: '📚 Browse Repositories', value: 'repositories' }, { title: '📝 Create New Task', value: 'create' }, { title: '🚪 Exit', value: 'exit' } ]; useInput((input, key) => { if (currentScreen !== 'main') return; if (key.escape) { exit(); return; } if (key.upArrow && selectedIndex > 0) { setSelectedIndex(selectedIndex - 1); } if (key.downArrow && selectedIndex < menuItems.length - 1) { setSelectedIndex(selectedIndex + 1); } if (key.return) { const selectedItem = menuItems[selectedIndex]; if (selectedItem.value === 'exit') { exit(); } else { setCurrentScreen(selectedItem.value); } } if (input === 'q') { exit(); } }); const handleBack = () => { setCurrentScreen('main'); setSelectedIndex(0); }; const handleSelectTask = (taskId) => { setConversationId(taskId); setCurrentScreen('conversation'); }; const handleSelectSuggestedTask = async (task) => { try { const conversation = await OpenHands.createConversationFromSuggestedTask(task); setConversationId(conversation.conversation_id); setCurrentScreen('conversation'); } catch (error) { console.error('Failed to create conversation from suggested task:', error); handleBack(); } }; const handleSelectRepository = async (repo, branch) => { try { const conversation = await OpenHands.createConversation(repo.full_name, repo.git_provider, undefined, [], undefined, branch || 'main'); setConversationId(conversation.conversation_id); setCurrentScreen('conversation'); } catch (error) { console.error('Failed to create conversation from repository:', error); handleBack(); } }; const handleTaskCreated = (newConversationId) => { setConversationId(newConversationId); setCurrentScreen('conversation'); }; const renderScreen = () => { switch (currentScreen) { case 'tasks': return (_jsx(TasksTUI, { onBack: handleBack, onSelectTask: handleSelectTask })); case 'suggested': return (_jsx(SuggestedTasksTUI, { onBack: handleBack, onSelectTask: handleSelectSuggestedTask })); case 'repositories': return (_jsx(RepositoriesTUI, { onBack: handleBack, onSelectRepository: handleSelectRepository })); case 'create': return (_jsx(CreateTaskTUI, { onBack: handleBack, onTaskCreated: handleTaskCreated })); case 'conversation': return (_jsx(ConversationTUI, { taskId: conversationId })); case 'main': default: return (_jsxs(Box, { flexDirection: "column", height: "100%", children: [_jsx(Box, { borderStyle: "single", borderColor: "blue", paddingX: 1, children: _jsx(Text, { color: "blue", bold: true, children: "\uD83C\uDFE0 JuriCode Main Menu" }) }), _jsx(Box, { flexDirection: "column", flexGrow: 1, paddingX: 1, paddingY: 1, children: menuItems.map((item, index) => (_jsx(Box, { marginBottom: 1, children: _jsx(Box, { borderStyle: "single", borderColor: index === selectedIndex ? 'green' : 'gray', paddingX: 1, paddingY: 0, children: _jsxs(Text, { color: index === selectedIndex ? 'green' : 'white', bold: true, children: [index === selectedIndex ? '▶ ' : ' ', item.title] }) }) }, item.value))) }), _jsx(Box, { borderStyle: "single", borderColor: "gray", paddingX: 1, children: _jsx(Text, { color: "gray", children: "\u2191\u2193 Navigate \u2022 Enter Select \u2022 Q Quit" }) })] })); } }; return renderScreen(); }; export default MainMenuTUI; //# sourceMappingURL=MainMenuTUI.js.map