@basictech/cli
Version:
Basic CLI for creating & managing your projects
90 lines • 3.11 kB
JavaScript
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