diff options
| -rw-r--r-- | src/Pages/Index.cshtml | 105 | ||||
| -rw-r--r-- | src/Pages/Index.cshtml.cs | 34 | ||||
| -rw-r--r-- | src/Pages/Read.cshtml | 50 | ||||
| -rw-r--r-- | src/Pages/Read.cshtml.cs | 24 |
4 files changed, 116 insertions, 97 deletions
diff --git a/src/Pages/Index.cshtml b/src/Pages/Index.cshtml index f01b263..0501e3e 100644 --- a/src/Pages/Index.cshtml +++ b/src/Pages/Index.cshtml @@ -1,21 +1,94 @@ @page "{site?}" @model IndexModel @{ - ViewData["Title"] = Model.Source.Name; + ViewData["Title"] = Model.PageTitle; } +@if (Model.FrontPage != default) { + foreach (var article in Model.FrontPage.Articles) { + <section class="news-link"> + <a href="/@Model.FrontPage.Name?url=@article.Href"> + <h2>@Html.Raw(article.Title)</h2> + </a> + <div class="bar"> + <div class="from-the-left"> + <button class="reset link" onclick="hide_article(this)">Gjem</button> | + </div> + <div class="from-the-right"> + <a href="@article.Href" class="source-link" rel="noreferrer">Les på nrk.no</a> + </div> + </div> + </section> + } + <footer> + <p> + <small> + @Model.FrontPage.Attribution © @Model.FrontPage.Name, @(DateTime.UtcNow.Subtract(Model.FrontPage.Created).Minutes) minutter siden + </small> + </p> + </footer> + @section scripts { + <script> + const ignoreSessionStorageKey = "frontpage_ignores"; + function hide_article(el) { + const linkEl = el.closest(".news-link"); + const ignoreLink = new URL(linkEl.querySelector("a").href).searchParams.get("url"); + const currentIgnores = sessionStorage.getItem(ignoreSessionStorageKey); + let newIgnores = []; + if (currentIgnores) newIgnores = JSON.parse(currentIgnores); + newIgnores.push(ignoreLink) + sessionStorage.setItem(ignoreSessionStorageKey, JSON.stringify(newIgnores)); + linkEl.remove() + } + + const ignores = sessionStorage.getItem(ignoreSessionStorageKey) + if (ignores) { + for (const ignore of JSON.parse(ignores)) { + console.log(ignore) + document.querySelector("a[href*='"+ignore+"']").closest(".news-link").remove(); + } + } + </script> + } + } else if (Model.Article != default) { + <div id="art-header" style="display: flex; justify-content: space-between"> + <div> + <h1>@Model.Article.Title</h1> + <p>@Model.Article.Subtitle</p> + </div> + </div> -@foreach (var article in Model.Source.Articles) { - <section class="news-link"> - <a href="/les/@Model.Source.Name?url=@article.Href"> - <h2>@Html.Raw(article.Title)</h2> - </a> - <a href="@article.Href" class="source-link" rel="noreferrer">Les på nrk.no</a> - </section> -} -<footer> - <p> - <small> - @Model.Source.Attribution © @Model.Source.Name, @(DateTime.UtcNow.Subtract(Model.Source.Created).Minutes) minutter siden - </small> - </p> -</footer>
\ No newline at end of file + <article id="art-body"> + @Html.Raw(Model.Article.Content) + </article> + + <footer> + <div style="flex-direction:column"> + @foreach (var author in Model.Article.Authors) { + <small style="white-space: nowrap"><b>@author.Name</b>: @author.Title</small> + <br/> + } + </div> + <div style="flex-direction: column"> + @if (Model.Article.PublishedAt != default) { + <small style="white-space: nowrap">Publisert: @Model.Article.PublishedAt.ToString("dd-MM-yyyy hh:mm:ss")</small> + } + @if (Model.Article.UpdatedAt != default) { + <br/> + <small style="white-space: nowrap">Oppdatert: @Model.Article.UpdatedAt.ToString("dd-MM-yyyy hh:mm:ss")</small> + } + <br/> + <small> + <a href="@Model.Article.Href" no-interception>Les på nrk.no</a> + </small> + </div> + </footer> + +@section scripts { + <script> + document.addEventListener("DOMContentLoaded", () => { + document.querySelectorAll("a:not([no-interception])").forEach(el => { + if (el.href.indexOf("nrk.no") !== -1) el.href = "/nrk?url=" + el.href; + }); + }) + </script> +}}
\ No newline at end of file diff --git a/src/Pages/Index.cshtml.cs b/src/Pages/Index.cshtml.cs index 80b0ed0..666c75e 100644 --- a/src/Pages/Index.cshtml.cs +++ b/src/Pages/Index.cshtml.cs @@ -13,16 +13,36 @@ public class IndexModel : PageModel _grabber = grabber; } - public NewsSource Source { get; set; } + public NewsSource FrontPage { get; set; } + public NewsArticle Article { get; set; } + public string PageTitle { get; set; } - public async Task<ActionResult> OnGet(string site) { - Source = site switch { - "nrk" => await _grabber.GrabNrkAsync(), - _ => default + public async Task<ActionResult> OnGet([FromRoute] string site, [FromQuery] string url = default) { + PageTitle = site switch { + "nrk" => "NRK", + _ => "" }; - if (Source == default) { - return Redirect("/nrk"); + if (url.IsNullOrWhiteSpace()) { + FrontPage = site switch { + "nrk" => await _grabber.GrabNrkAsync(), + _ => default + }; + + if (FrontPage == default) { + return Redirect("/nrk"); + } + } else { + Article = site switch { + "nrk" => await _grabber.GrabNrkArticleAsync(url), + _ => default + }; + + if (Article == default) { + return Redirect(url); + } + + PageTitle = PageTitle + " - " + Article.Title; } return Page(); diff --git a/src/Pages/Read.cshtml b/src/Pages/Read.cshtml deleted file mode 100644 index 9cff853..0000000 --- a/src/Pages/Read.cshtml +++ /dev/null @@ -1,50 +0,0 @@ -@page "/les/{site}" -@model ReadModel -@{ - ViewData["Title"] = Model.Source.Title; -} - -<div id="art-header" style="display: flex; justify-content: space-between"> - <div> - <h1>@Model.Source.Title</h1> - <p>@Model.Source.Subtitle</p> - </div> -</div> - -<article id="art-body"> - @Html.Raw(Model.Source.Content) -</article> - -<footer> - <p> - <div style="display: flex; flex-direction: column; flex-wrap: nowrap;"> - <div style="flex-direction:column"> - @foreach (var author in Model.Source.Authors) { - <small style="white-space: nowrap"><b>@author.Name</b>: @author.Title</small> - <br/> - } - </div> - <div style="flex-direction: column"> - @if (Model.Source.PublishedAt != default) { - <small style="white-space: nowrap">Publisert: @Model.Source.PublishedAt.ToString("dd-MM-yyyy hh:mm:ss")</small> - } - @if (Model.Source.UpdatedAt != default) { - <br/> - <small style="white-space: nowrap">Oppdatert: @Model.Source.UpdatedAt.ToString("dd-MM-yyyy hh:mm:ss")</small> - } - <br/> - <small> - <a href="@Model.Source.Href" no-interception>Les på nrk.no</a> - </small> - </div> - </div> - </p> -</footer> - -<script> -document.addEventListener("DOMContentLoaded", () => { - document.querySelectorAll("a:not([no-interception])").forEach(el => { - if (el.href.indexOf("nrk.no") !== -1) el.href = "/les/nrk?url=" + el.href; - }); -}) -</script>
\ No newline at end of file diff --git a/src/Pages/Read.cshtml.cs b/src/Pages/Read.cshtml.cs deleted file mode 100644 index 1a13ec0..0000000 --- a/src/Pages/Read.cshtml.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.RazorPages; - -namespace I2R.LightNews.Pages; - -public class ReadModel : PageModel -{ - private readonly GrabberService _grabber; - - public NewsArticle Source { get; set; } - - public ReadModel(GrabberService grabber) { - _grabber = grabber; - } - - public async Task<ActionResult> OnGet([FromRoute] string site, [FromQuery] string url) { - Source = site switch { - "nrk" => await _grabber.GrabNrkArticleAsync(url), - _ => default - }; - if (Source == default) return Redirect(url); - return Page(); - } -}
\ No newline at end of file |
