@graphteon/juricode
Version:
We are forging the future with lines of digital steel
102 lines • 4.82 kB
JavaScript
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