| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- using Astralis;
- using Inversion;
- using Spry;
- /**
- * AuroraStatsEndpoint - Returns the aurora stats for HTMX polling
- *
- * This component is polled every 5 seconds alongside the canvas.
- * It renders the stats display with polling attributes to continue polling.
- */
- public class AuroraStatsEndpoint : Component {
-
- private AuroraState aurora_state = inject<AuroraState>();
-
- public override string markup { get {
- return """
- <div class="aurora-stats" sid="aurora-stats"
- spry-action="AuroraStatsEndpoint:Poll"
- hx-trigger="every 5s"
- hx-swap="outerHTML">
- <div class="aurora-stat">
- <div class="aurora-stat-value" sid="solar-wind"></div>
- <div class="aurora-stat-label">Solar Wind</div>
- </div>
- <div class="aurora-stat">
- <div class="aurora-stat-value" sid="wave-count"></div>
- <div class="aurora-stat-label">Waves</div>
- </div>
- <div class="aurora-stat">
- <div class="aurora-stat-value" sid="intensity"></div>
- <div class="aurora-stat-label">Intensity</div>
- </div>
- <div class="aurora-stat">
- <div class="aurora-stat-value" sid="color-mode"></div>
- <div class="aurora-stat-label">Color Mode</div>
- </div>
- </div>
- """;
- }}
-
- public override async void prepare() throws Error {
- this["solar-wind"].text_content = "%.1f km/s".printf(aurora_state.solar_wind_speed);
- this["wave-count"].text_content = aurora_state.wave_count.to_string();
- this["intensity"].text_content = "%.0f%%".printf(aurora_state.intensity * 100);
- this["color-mode"].text_content = aurora_state.color_mode;
- }
-
- public async override void handle_action(string action) throws Error {
- if (action == "Poll") {
- // Stats are updated in prepare() automatically
- // No additional state changes needed here
- }
- }
- }
|