UNPKG

lorehub

Version:

Capture and surface the collective wisdom of your codebase

93 lines 3.54 kB
import React, { useEffect, useState } from 'react'; import { Box, Text } from 'ink'; import Spinner from 'ink-spinner'; export const ProgressIndicator = ({ task, current, total, isIndeterminate = false }) => { const [dots, setDots] = useState(0); useEffect(() => { const timer = setInterval(() => { setDots(d => (d + 1) % 4); }, 500); return () => clearInterval(timer); }, []); const renderProgress = () => { if (isIndeterminate) { return React.createElement(Spinner, { type: "dots" }); } if (current !== undefined && total !== undefined) { const percentage = Math.round((current / total) * 100); const barWidth = 20; const filled = Math.round((current / total) * barWidth); const empty = barWidth - filled; return (React.createElement(React.Fragment, null, React.createElement(Text, null, `[${'█'.repeat(filled)}${' '.repeat(empty)}] ${percentage}%`), React.createElement(Text, { dimColor: true }, " (", current, "/", total, ")"))); } return React.createElement(Text, { dimColor: true }, '.'.repeat(dots)); }; return (React.createElement(Box, null, React.createElement(Text, null, task, " "), renderProgress())); }; export const ProgressManager = ({ tasks }) => { return (React.createElement(Box, { flexDirection: "column" }, tasks.map(task => (React.createElement(Box, { key: task.id, marginBottom: 0 }, task.status === 'completed' && React.createElement(Text, { color: "green" }, "\u2713 "), task.status === 'failed' && React.createElement(Text, { color: "red" }, "\u2717 "), task.status === 'active' && React.createElement(Text, { color: "blue" }, "\u25B6 "), task.status === 'pending' && React.createElement(Text, { dimColor: true }, "\u25CB "), React.createElement(Text, { dimColor: task.status === 'pending' }, task.name), task.status === 'active' && task.total && (React.createElement(Text, { dimColor: true }, " (", task.current || 0, "/", task.total, ")"))))))); }; // Hook for managing progress state export function useProgress() { const [tasks, setTasks] = useState(new Map()); const addTask = (id, name, total) => { setTasks(prev => new Map(prev).set(id, { name, current: 0, total, status: 'pending' })); }; const updateTask = (id, current) => { setTasks(prev => { const next = new Map(prev); const task = next.get(id); if (task) { task.current = current; task.status = 'active'; if (current >= task.total) { task.status = 'completed'; } } return next; }); }; const failTask = (id) => { setTasks(prev => { const next = new Map(prev); const task = next.get(id); if (task) { task.status = 'failed'; } return next; }); }; const getTasks = () => Array.from(tasks.entries()).map(([id, task]) => ({ id, ...task })); return { addTask, updateTask, failTask, getTasks }; } //# sourceMappingURL=progress.js.map