blob: da0e435676bc146ddc6214eae39f3ac36f239225 [file] [log] [blame]
/* eslint-disable @typescript-eslint/no-explicit-any */
/**
* Demo module for sketch-container-status component
*/
import { DemoModule } from "./demo-framework/types";
import {
demoUtils,
sampleContainerState,
lightUsageState,
heavyUsageState,
} from "./demo-fixtures/index";
const demo: DemoModule = {
title: "Container Status Demo",
description: "Display container status information with usage statistics",
imports: ["../sketch-container-status"],
styles: ["/dist/tailwind.css"],
setup: async (container: HTMLElement) => {
// Create demo sections
const basicSection = demoUtils.createDemoSection(
"Basic Container Status",
"Shows current container state with usage information",
);
const variationsSection = demoUtils.createDemoSection(
"Usage Variations",
"Different usage levels and states",
);
// Basic status component
const basicStatus = document.createElement(
"sketch-container-status",
) as any;
basicStatus.id = "basic-status";
basicStatus.state = sampleContainerState;
// Light usage status
const lightStatus = document.createElement(
"sketch-container-status",
) as any;
lightStatus.id = "light-status";
lightStatus.state = lightUsageState;
const lightLabel = document.createElement("h4");
lightLabel.textContent = "Light Usage";
lightLabel.style.cssText = "margin: 20px 0 10px 0; color: #24292f;";
// Heavy usage status
const heavyStatus = document.createElement(
"sketch-container-status",
) as any;
heavyStatus.id = "heavy-status";
heavyStatus.state = heavyUsageState;
heavyStatus.lastCommit = {
hash: "deadbeef",
pushedBranch: "user/sketch/really-long-branch-name-that-stains-layout",
};
const heavyLabel = document.createElement("h4");
heavyLabel.textContent = "Heavy Usage";
heavyLabel.style.cssText = "margin: 20px 0 10px 0; color: #24292f;";
// Control buttons for interaction
const controlsDiv = document.createElement("div");
controlsDiv.style.cssText = "margin-top: 20px;";
const updateBasicButton = demoUtils.createButton(
"Update Basic Status",
() => {
const updatedState = {
...sampleContainerState,
message_count: sampleContainerState.message_count + 1,
total_usage: {
...sampleContainerState.total_usage!,
messages: sampleContainerState.total_usage!.messages + 1,
total_cost_usd: Number(
(sampleContainerState.total_usage!.total_cost_usd + 0.05).toFixed(
2,
),
),
},
};
basicStatus.state = updatedState;
},
);
const toggleSSHButton = demoUtils.createButton("Toggle SSH Status", () => {
const currentState = basicStatus.state;
basicStatus.state = {
...currentState,
ssh_available: !currentState.ssh_available,
ssh_error: currentState.ssh_available ? "Connection failed" : undefined,
};
});
const resetButton = demoUtils.createButton("Reset to Defaults", () => {
basicStatus.state = sampleContainerState;
lightStatus.state = lightUsageState;
heavyStatus.state = heavyUsageState;
});
controlsDiv.appendChild(updateBasicButton);
controlsDiv.appendChild(toggleSSHButton);
controlsDiv.appendChild(resetButton);
// Assemble the demo
basicSection.appendChild(basicStatus);
basicSection.appendChild(controlsDiv);
variationsSection.appendChild(lightLabel);
variationsSection.appendChild(lightStatus);
variationsSection.appendChild(heavyLabel);
variationsSection.appendChild(heavyStatus);
container.appendChild(basicSection);
container.appendChild(variationsSection);
// Add some real-time updates
const updateInterval = setInterval(() => {
const states = [basicStatus, lightStatus, heavyStatus];
states.forEach((status) => {
if (status.state) {
const updatedState = {
...status.state,
message_count:
status.state.message_count + Math.floor(Math.random() * 2),
};
if (Math.random() > 0.7) {
// 30% chance to update
status.state = updatedState;
}
}
});
}, 3000);
// Store interval for cleanup
(container as any).demoInterval = updateInterval;
},
cleanup: async () => {
// Clear any intervals
const container = document.getElementById("demo-container");
if (container && (container as any).demoInterval) {
clearInterval((container as any).demoInterval);
delete (container as any).demoInterval;
}
},
};
export default demo;