From 5dc48738e6f2800fde963a7581e200bd4de18463 Mon Sep 17 00:00:00 2001
From: Jakob Stendahl <jakob.stendahl@outlook.com>
Date: Thu, 28 Apr 2022 10:51:09 +0200
Subject: Add 27-day outlook

---
 .../OutlookTwentySevenDay.svelte                   | 81 ++++++++++++++++++++++
 1 file changed, 81 insertions(+)
 create mode 100644 src/components/Forecast/OutlookTwentySevenDay/OutlookTwentySevenDay.svelte

(limited to 'src/components/Forecast/OutlookTwentySevenDay/OutlookTwentySevenDay.svelte')

diff --git a/src/components/Forecast/OutlookTwentySevenDay/OutlookTwentySevenDay.svelte b/src/components/Forecast/OutlookTwentySevenDay/OutlookTwentySevenDay.svelte
new file mode 100644
index 0000000..824433d
--- /dev/null
+++ b/src/components/Forecast/OutlookTwentySevenDay/OutlookTwentySevenDay.svelte
@@ -0,0 +1,81 @@
+<script lang="ts">
+    import PredictionItem from './PredictionItem.svelte';
+
+    import { onMount } from 'svelte';
+    import { earth_weather, space_weather } from '../../../stores';
+
+    const monthNames = ["January", "February", "March", "April", "May", "June",
+      "July", "August", "September", "October", "November", "December"
+    ];
+
+    let predictions;
+
+    space_weather.subscribe(assembleWeatherData);
+    earth_weather.subscribe(assembleWeatherData);
+
+    async function assembleWeatherData() {
+        if ($space_weather.updating || $earth_weather.updating) {
+            predictions = null;
+            return;
+        }
+
+        // First just reorganize the space_weather data
+        let forecast = $space_weather.usnoaa_data_raw.outlook_27_day.filter(x => x.time >= new Date());
+        predictions = forecast.map(
+            pred => ({
+                "time": pred.time,
+                "kp": pred.kindex,
+                "temp": null,
+                "clouds": null,
+                "hasNOMETData": $earth_weather.available
+            })
+        );
+
+        // Add earth weather data if it is available
+        if ($earth_weather.available) {
+            predictions.forEach((pred, i) => {
+                let closestDate = new Date(0,0,0);
+                let temp;
+                let clouds;
+                let weatherData = true;
+
+                $earth_weather.yr_data_raw.properties.timeseries.forEach((earth_pred, i) => {
+                    let predDate = new Date(earth_pred.time);
+                    if (Math.abs(predDate.getTime() - pred.time.getTime()) < Math.abs(closestDate.getTime() - pred.time.getTime())) {
+                        if ((Math.abs(predDate.getTime() - pred.time.getTime())) > (86400 * 1000)) {
+                            weatherData = false;
+                            return;
+                        }
+                        closestDate = predDate;
+                        temp = (earth_pred["data"]["instant"]["details"]["air_temperature"]);
+                        clouds = earth_pred["data"]["instant"]["details"]["cloud_area_fraction"];
+                    }
+                });
+
+                predictions[i] = {
+                    ...predictions[i], "temp": temp, "clouds": clouds, "hasNOMETData": weatherData
+                }
+            });
+        }
+
+    }
+
+</script>
+
+<style>
+    .prediction-table {
+        height: 100%;
+        overflow-y: scroll;
+        padding-bottom: 1rem;
+    }
+
+    .prediction-table::-webkit-scrollbar {
+        display: none;
+    }
+</style>
+
+<div class="prediction-table">
+    {#each predictions as prediction, i}
+        <PredictionItem {prediction}/>
+    {/each}
+</div>
-- 
cgit v1.2.3

