lorehub
Version:
Capture and surface the collective wisdom of your codebase
93 lines • 3.54 kB
JavaScript
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