Jon/workspace (#3175)

This commit is contained in:
Jonathan Dobson
2025-08-13 14:13:00 -04:00
committed by GitHub
parent 75b7a8ac4c
commit 97993cbede
10 changed files with 754 additions and 563 deletions

View File

@@ -0,0 +1,46 @@
import { useState, useMemo, useCallback } from "react";
interface RankedItems {
[key: string]: number;
}
interface UseRankerReturn {
rankedItems: RankedItems;
promote: (name: string) => void;
orderedNames: string[];
}
function useRanker(initialNames: string[]): UseRankerReturn {
const [orderedNames, setOrderedNames] = useState<string[]>(initialNames);
const rankedItems = useMemo<RankedItems>(() => {
const items: RankedItems = {};
const maxRank = orderedNames.length;
orderedNames.forEach((name, index) => {
items[name] = maxRank - index;
});
return items;
}, [orderedNames]);
const promote = useCallback((name: string) => {
setOrderedNames((prevNames) => {
if (!prevNames.includes(name)) {
console.warn(`Name "${name}" not found in ranked list`);
return prevNames;
}
const filteredNames = prevNames.filter((n) => n !== name);
return [name, ...filteredNames];
});
}, []);
return {
rankedItems,
promote,
orderedNames,
};
}
export { useRanker, type RankedItems };