AuroraStatsEndpoint.vala 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using Astralis;
  2. using Inversion;
  3. using Spry;
  4. /**
  5. * AuroraStatsEndpoint - Returns the aurora stats for HTMX polling
  6. *
  7. * This component is polled every 5 seconds alongside the canvas.
  8. * It renders the stats display with polling attributes to continue polling.
  9. */
  10. public class AuroraStatsEndpoint : Component {
  11. private AuroraState aurora_state = inject<AuroraState>();
  12. public override string markup { get {
  13. return """
  14. <div class="aurora-stats" sid="aurora-stats"
  15. spry-action="AuroraStatsEndpoint:Poll"
  16. hx-trigger="every 5s"
  17. hx-swap="outerHTML">
  18. <div class="aurora-stat">
  19. <div class="aurora-stat-value" sid="solar-wind"></div>
  20. <div class="aurora-stat-label">Solar Wind</div>
  21. </div>
  22. <div class="aurora-stat">
  23. <div class="aurora-stat-value" sid="wave-count"></div>
  24. <div class="aurora-stat-label">Waves</div>
  25. </div>
  26. <div class="aurora-stat">
  27. <div class="aurora-stat-value" sid="intensity"></div>
  28. <div class="aurora-stat-label">Intensity</div>
  29. </div>
  30. <div class="aurora-stat">
  31. <div class="aurora-stat-value" sid="color-mode"></div>
  32. <div class="aurora-stat-label">Color Mode</div>
  33. </div>
  34. </div>
  35. """;
  36. }}
  37. public override async void prepare() throws Error {
  38. this["solar-wind"].text_content = "%.1f km/s".printf(aurora_state.solar_wind_speed);
  39. this["wave-count"].text_content = aurora_state.wave_count.to_string();
  40. this["intensity"].text_content = "%.0f%%".printf(aurora_state.intensity * 100);
  41. this["color-mode"].text_content = aurora_state.color_mode;
  42. }
  43. public async override void handle_action(string action) throws Error {
  44. if (action == "Poll") {
  45. // Stats are updated in prepare() automatically
  46. // No additional state changes needed here
  47. }
  48. }
  49. }