feat: alive UI wave, galaxy presence, spread and fleet enhancements
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
Dashboard ambient layer, comrade presence, Mission Deck and War Room, Emberwake supply chain, spread/docs publishing, fleet policy and modules API, CI docker mining, and refreshed USB pack.
This commit is contained in:
@@ -108,6 +108,45 @@ function DeleteButton({ buildId, onDeleted, onError }: { buildId: string; onDele
|
||||
);
|
||||
}
|
||||
|
||||
function PublicButton({
|
||||
buildId,
|
||||
isPublic,
|
||||
onToggled,
|
||||
onError,
|
||||
}: {
|
||||
buildId: string;
|
||||
isPublic: boolean;
|
||||
onToggled: () => void;
|
||||
onError: (msg: string) => void;
|
||||
}) {
|
||||
const [busy, setBusy] = useState(false);
|
||||
|
||||
const handleClick = async () => {
|
||||
if (busy) return;
|
||||
setBusy(true);
|
||||
try {
|
||||
await api.setBuildPublic(buildId, !isPublic);
|
||||
onToggled();
|
||||
} catch (e) {
|
||||
onError(e instanceof Error ? e.message : 'Failed to update public flag');
|
||||
} finally {
|
||||
setBusy(false);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<button
|
||||
type="button"
|
||||
className={`bm-public-btn${isPublic ? ' bm-public-btn-active' : ''}`}
|
||||
disabled={busy}
|
||||
onClick={() => void handleClick()}
|
||||
title={isPublic ? 'Remove from login-page public builds list' : 'Expose on unauthenticated public builds API'}
|
||||
>
|
||||
{busy ? '…' : isPublic ? '🌐 Public' : '🌐 Mark public'}
|
||||
</button>
|
||||
);
|
||||
}
|
||||
|
||||
function PinButton({
|
||||
buildId,
|
||||
pinned,
|
||||
@@ -177,7 +216,7 @@ function BuildCard({
|
||||
const sh = `curl -sL ${serverBase}/install.sh | bash`;
|
||||
|
||||
return (
|
||||
<NeonCard accent={build.pinned ? 'green' : 'brass'} className={`bm-card${build.pinned ? ' bm-card-pinned' : ''}`}>
|
||||
<NeonCard accent={build.pinned ? 'green' : 'brass'} className={`bm-card operator-deck-card operator-interactive${build.pinned ? ' bm-card-pinned' : ''}`}>
|
||||
{/* ── Pinned banner ── */}
|
||||
{build.pinned && (
|
||||
<div className="bm-pinned-banner">
|
||||
@@ -195,6 +234,7 @@ function BuildCard({
|
||||
>
|
||||
{platformLabel(build.platform)}
|
||||
</span>
|
||||
{build.public && <span className="bm-tag bm-tag-public">PUBLIC</span>}
|
||||
{isFusion && <span className="bm-tag bm-tag-fusion">FUSION</span>}
|
||||
{isUniversal && !isFusion && <span className="bm-tag bm-tag-universal">UNIVERSAL</span>}
|
||||
</div>
|
||||
@@ -294,6 +334,7 @@ function BuildCard({
|
||||
<span className="bm-qr-label">Scan to download</span>
|
||||
</div>
|
||||
<div className="bm-action-btns">
|
||||
<PublicButton buildId={build.id} isPublic={!!build.public} onToggled={onPinned} onError={onActionError} />
|
||||
<PinButton buildId={build.id} pinned={!!build.pinned} onPinned={onPinned} onError={onActionError} />
|
||||
<button
|
||||
type="button"
|
||||
@@ -349,7 +390,7 @@ export default function BuildManagerPage() {
|
||||
}, [navigate]);
|
||||
|
||||
return (
|
||||
<div className="page fade-in bm-page">
|
||||
<div className="page fade-in bm-page operator-deck-page">
|
||||
<div className="bm-header">
|
||||
<div>
|
||||
<h1 className="font-display bm-title">Build Manager</h1>
|
||||
|
||||
Reference in New Issue
Block a user