UNPKG

@basictech/cli

Version:

Basic CLI for creating & managing your projects

90 lines 3.11 kB
import { jsx as _jsx } from "react/jsx-runtime"; import React from 'react'; import { render, Text } from 'ink'; import { Table } from '../components/Table.js'; import { Spinner } from '../components/Spinner.js'; import { ApiClient } from '../lib/api.js'; import { AuthService } from '../lib/auth.js'; import { isOnline, openBrowser, copyToClipboard } from '../lib/platform.js'; import { MESSAGES } from '../lib/constants.js'; function ProjectsApp() { const [state, setState] = React.useState({ loading: true, projects: [], error: null }); React.useEffect(() => { async function loadProjects() { try { // Check if online if (!(await isOnline())) { setState(prev => ({ ...prev, loading: false, error: MESSAGES.OFFLINE })); return; } // Check if logged in const authService = AuthService.getInstance(); const token = await authService.getToken(); if (!token) { setState(prev => ({ ...prev, loading: false, error: MESSAGES.LOGGED_OUT })); return; } // Fetch projects const apiClient = ApiClient.getInstance(); const projects = await apiClient.getProjects(); setState({ loading: false, projects, error: null }); } catch (error) { setState({ loading: false, projects: [], error: error instanceof Error ? error.message : 'Failed to load projects' }); } } loadProjects(); }, []); const handleCopy = async (row) => { try { await copyToClipboard(row.id); } catch (error) { // Silent fail - notification already shown by Table component } }; const handleOpen = async (row) => { try { await openBrowser(`https://app.basic.tech/project/${row.id}`); } catch (error) { // Silent fail - browser opening is best effort } }; const handleExit = () => { process.exit(0); }; if (state.loading) { return _jsx(Spinner, { text: "Loading projects..." }); } if (state.error) { return _jsx(Text, { color: "red", children: state.error }); } const columns = [ { title: 'ID', width: 38, key: 'id' }, { title: 'Name', width: 25, key: 'name' }, { title: 'Team', width: 30, key: 'team_name' } ]; const rows = state.projects.map(project => ({ id: project.id, name: project.name, team_name: project.team_name })); return (_jsx(Table, { columns: columns, rows: rows, onCopy: handleCopy, onOpen: handleOpen, onExit: handleExit })); } export async function ProjectsCommand() { render(_jsx(ProjectsApp, {})); } //# sourceMappingURL=projects.js.map