aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/Endpoints/CreateRadioIndex.cs18
-rw-r--r--src/Endpoints/GetRadioSeriesList.cs13
-rw-r--r--src/wwwroot/radio.js60
3 files changed, 71 insertions, 20 deletions
diff --git a/src/Endpoints/CreateRadioIndex.cs b/src/Endpoints/CreateRadioIndex.cs
deleted file mode 100644
index 1ef19ab..0000000
--- a/src/Endpoints/CreateRadioIndex.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using Microsoft.AspNetCore.Mvc;
-
-namespace I2R.LightNews.Endpoints;
-
-public class RadioSearchEndpoint : EndpointBase
-{
- private readonly NrkRadioService _radio;
-
- public RadioSearchEndpoint(NrkRadioService radio) {
- _radio = radio;
- }
-
- [HttpGet("~/create-radio-index")]
- public async Task<ActionResult> HandleASync() {
- await _radio.CreateIndex();
- return Ok();
- }
-} \ No newline at end of file
diff --git a/src/Endpoints/GetRadioSeriesList.cs b/src/Endpoints/GetRadioSeriesList.cs
new file mode 100644
index 0000000..7898f25
--- /dev/null
+++ b/src/Endpoints/GetRadioSeriesList.cs
@@ -0,0 +1,13 @@
+using Microsoft.AspNetCore.Mvc;
+
+namespace I2R.LightNews.Endpoints;
+
+public class RadioSearchEndpoint : EndpointBase
+{
+ public RadioSearchEndpoint() { }
+
+ [HttpGet("~/radio-series")]
+ public async Task<ActionResult> HandleAsync(string q) {
+ return Ok(RadioIndexDb.GetSeries(q));
+ }
+} \ No newline at end of file
diff --git a/src/wwwroot/radio.js b/src/wwwroot/radio.js
index d0e3fdd..3edc99e 100644
--- a/src/wwwroot/radio.js
+++ b/src/wwwroot/radio.js
@@ -1,4 +1,60 @@
const app = document.getElementById("app");
-const appData = document.getElementById("app-data");
+let series;
-app.innerText = "Laster...";
+async function get_series() {
+ app.innerHTML = "<i>Laster...</i>";
+ const response = await fetch("/radio-series");
+ if (response.ok) {
+ series = await response.json();
+ return series;
+ }
+ app.innerHTML = "<strong style='color:red;'>Kunne ikke hente data, prøv igjen snart!</strong>";
+ return null;
+}
+
+function search(query) {
+ if (!query) {
+ document.querySelectorAll("#series li").forEach(el => el.style.display = "list-item");
+ return;
+ }
+ console.log("Searching for " + query);
+ const results = fuzzysort.go(query, series, {key: "name"});
+ console.log("Found " + results.length + " results");
+ const ids = results.map(x => x.obj.id);
+ for (const seriesEl of document.querySelectorAll("#series li")) {
+ seriesEl.style.display = ids.includes(parseInt(seriesEl.dataset.id)) ? "list-item" : "none";
+ }
+}
+
+function build_frontpage(series) {
+ const listEl = document.createElement("ul");
+ listEl.id = "series";
+ listEl.style.listStyle = "none";
+ listEl.style.maxHeight = "70vh";
+ listEl.style.overflow = "auto";
+ listEl.style.padding = "0";
+ for (const serie of series) {
+ const listItemEl = document.createElement("li");
+ const listItemDetailsEl = document.createElement("details");
+ const listItemDetailsSummaryEl = document.createElement("summary");
+ listItemEl.dataset.id = serie.id;
+ listItemDetailsSummaryEl.innerText = serie.name;
+ listItemDetailsEl.appendChild(listItemDetailsSummaryEl);
+ listItemEl.appendChild(listItemDetailsEl);
+ listEl.appendChild(listItemEl);
+ }
+
+ const searchInputEl = document.createElement("input");
+ searchInputEl.id = "series-searcher";
+ searchInputEl.placeholder = "Søk her";
+ searchInputEl.oninput = (event) => {
+ search(event.target.value);
+ };
+ app.innerHTML = "";
+ app.appendChild(searchInputEl);
+ app.appendChild(listEl);
+}
+
+document.addEventListener("DOMContentLoaded", () => {
+ get_series().then(build_frontpage);
+}) \ No newline at end of file