@page "/" @attribute [Authorize] @inject OverzichtService Overzichten @inject LegacyService NalatenschapService @inject AdvertentieService Adverteren @inject AccountService Accounts @inject SamenvoegService Samenvoegen @rendermode InteractiveServer MijnBesluit @* Het beginscherm, met dezelfde indeling als in de app: eerst wat er speelt, dan de tegels. De aantallen staan achter de titel in plaats van op een regel eronder, zodat de tegels laag blijven. *@

@Begroeting(auth.User.Naam())

@if (Fout is not null) {
@Fout
} @if (Melding is not null) {
@Melding
} @* Heeft iemand een profiel voor je aangemaakt op jouw adres? Dan staat die vraag hier, bovenaan, tot je hem beantwoordt. Alleen jij kunt zeggen of dat over jou gaat; koppelen op e-mailadres doet MijnBesluit niet. Zie docs/Identiteit.md. *@ @foreach (var aantekening in Aantekeningen) {

Ben jij dit?

@aantekening.Van heeft een profiel voor je aangemaakt op jouw e-mailadres@(aantekening.Relatie is { Length: > 0 } r ? $", als {r.ToLowerInvariant()}" : "").

Ben jij dat, dan voegen we het bij je eigen profiel: wat hij over je heeft ingevuld komt bij jou te staan, en vanaf dat moment bepaal jij wat er staat. Ben jij het niet, dan blijft alles zoals het is en vragen we het niet nog eens.

} @if (Gegevens is { Regels.Count: > 0 }) {
@foreach (var regel in Gegevens.Regels) {
@Teken(regel.Soort)
@regel.Tekst
@if (regel.Datum is { } datum) {
@Datums.MetDag(datum)
}
}
@if (Gegevens.Regels.Any(r => r.Soort == "overlijden")) { } } @* De advertentie staat hier en niet bovenaan: "wat er speelt" gaat voor. Iemand die net leest dat er een overlijden op zijn naam is gemeld, hoort daar geen reclame boven te zien. Zie docs/Adverteren.md. *@ @if (Reclame is not null) { @if (Reclame.HeeftAfbeelding) { } Advertentie @Reclame.Tekst }
Mijn kluis @(Gegevens?.AantalKluis ?? 0) Mijn mensen @(Gegevens?.AantalFamilie ?? 0) @* Twee richtingen, dus twee aantallen; die staan achter de titel in hetzelfde rondje als de andere tegels, met hun naam erbij zodat je niet hoeft te raden welke welke is. Zo past de tegel op één regel, even hoog als de andere drie. *@ Momenten ↓@(Gegevens?.AantalVoorMij ?? 0) · ↑@(Gegevens?.AantalVanMij ?? 0) @if (Gegevens is { AantalNieuweBerichten: > 0 }) { @Gegevens.AantalNieuweBerichten } Nalatenschap @(Gegevens?.AantalBeheerders ?? 0)
@if (Gegevens is not null) {
Hoe ver vooruit wil je kijken?

Hierboven zie je wat er de komende tijd voor je klaarstaat. Zet het op 0 als je liever verrast wordt.

} @* Dezelfde uitleg als in de app en op de pagina /watismijnbesluit, maar hier als popup: je hoeft dan niet weg van je overzicht en weer terug. De privacyverklaring staat er om dezelfde reden bij, en op dezelfde plek als in de app. Er is ook een pagina /privacy - die is er voor wie hem los wil kunnen delen en voor Google Play, dat een adres wil dat je kunt aanklikken. Maar wie hier zit, hoort hem te kunnen lezen zonder zijn overzicht kwijt te raken. De tekst zelf staat in Privacytekst.razor, hetzelfde onderdeel dat /privacy en de app gebruiken. *@



@if (Uitleg) { } @if (Privacy) { } @* Zelfde tekst als in de app: Versiehistorie.razor staat twee keer op schijf en een zelfcontrole vergelijkt ze letterlijk. *@ @if (VersiehistorieOpen) { }

Waar is MijnBesluit voor?

Voor alles wat je zou willen doorgeven maar wat nu alleen in jouw hoofd zit.

  • Je kluis — wachtwoorden, de pincode van je telefoon, polissen, documenten, je uitvaartwensen. Alles versleuteld, en jij bepaalt per onderdeel of het alleen voor jou is, pas na je overlijden vrijkomt, of op een datum die je zelf kiest.
  • Je mensen — familie en vrienden die je toevoegt en uitnodigt. Zolang iemand de uitnodiging niet heeft aangenomen, beheer jij dat profiel; daarna is het van hem of haar.
  • Momenten — een tekst- of videobericht dat je klaarzet voor iemand. Te bezorgen op een datum die jij kiest, of pas na je overlijden. Een verjaardag die je niet meer meemaakt, of gewoon iets wat je nog wilt zeggen.
  • Je nalatenschap — wie er straks mag regelen wat er geregeld moet worden. Die persoon krijgt pas toegang als je overlijden is bevestigd door meerdere mensen én jij er zelf niet op hebt gereageerd.
@code { [CascadingParameter] private Task? AuthState { get; set; } private long _gebruikerId, _persoonId; private Overzicht? Gegevens; private int Dagen = 30; /// Profielen die anderen op mijn adres hebben aangemaakt; alleen ik kan zeggen of ik dat ben. private IReadOnlyList Aantekeningen = Array.Empty(); /// Staat de uitleg open? private bool Uitleg; /// Staat de privacyverklaring open? private bool Privacy; private bool VersiehistorieOpen; /// De advertentie voor deze keer, of null als er geen is. private Campagne? Reclame; private bool Bezig; private string? Fout, Melding; protected override async Task OnInitializedAsync() { if (AuthState is null) return; var user = (await AuthState).User; _gebruikerId = user.UserId() ?? 0; _persoonId = user.PersonId() ?? 0; await Laden(); } private async Task Laden() { if (_gebruikerId == 0) return; var uitkomst = await Overzichten.VoorAsync(_gebruikerId); if (!uitkomst.Succeeded) { Fout = uitkomst.Error; return; } Fout = null; Gegevens = uitkomst.Value; Dagen = Gegevens!.VooruitblikDagen; // De keuze en het tellen horen bij elkaar: wat hier wordt uitgekozen komt ook echt in // beeld. Eén advertentie per keer dat het overzicht wordt geopend; zie docs/Adverteren.md. // // Gaat er hier iets mis, dan hoort het overzicht er gewoon te staan. Reclame is het // minst belangrijke op dit scherm. try { Reclame = await Adverteren.KiesAsync(); if (Reclame is not null) await Adverteren.TelVertoningAsync(Reclame.Id); } catch (Exception) { Reclame = null; } // Heeft iemand een profiel voor mij aangemaakt? Apart opgehaald, en een fout hier hoort // het overzicht niet weg te houden: dit is een vraag die best een keer later mag komen. try { Aantekeningen = await Accounts.AantekeningenOverMijAsync(_gebruikerId); } catch (Exception) { Aantekeningen = Array.Empty(); } } /// "Ja, dat ben ik." Daarna staat alles wat die ander over je had bij jou. private async Task Overnemen(long persoonId) { Bezig = true; try { var uitkomst = await Accounts.NeemAantekeningOverAsync(persoonId, _gebruikerId, Samenvoegen); Fout = uitkomst.Succeeded ? null : uitkomst.Error; Melding = uitkomst.Succeeded ? "Klaar. Het profiel staat nu bij jou." : null; if (uitkomst.Succeeded) await Laden(); } finally { Bezig = false; } } /// "Nee, dat ben ik niet." De vraag komt niet terug. private async Task Afwijzen(long persoonId) { Bezig = true; try { var uitkomst = await Accounts.WijsAantekeningAfAsync(persoonId, _gebruikerId); Fout = uitkomst.Succeeded ? null : uitkomst.Error; if (uitkomst.Succeeded) Aantekeningen = Aantekeningen.Where(a => a.PersoonId != persoonId).ToList(); } finally { Bezig = false; } } private async Task VooruitblikOpslaan() { Bezig = true; try { var uitkomst = await Overzichten.VooruitblikAsync(_gebruikerId, Dagen); if (!uitkomst.Succeeded) { Fout = uitkomst.Error; return; } await Laden(); } finally { Bezig = false; } } private async Task IkBenErNog() { Bezig = true; try { var uitkomst = await NalatenschapService.ObjectAsync(_persoonId, _gebruikerId); Melding = uitkomst.Succeeded ? "Genoteerd. De melding is ingetrokken." : null; Fout = uitkomst.Succeeded ? null : uitkomst.Error; if (uitkomst.Succeeded) await Laden(); } finally { Bezig = false; } } private static string Teken(string soort) => soort switch { "beheerder" => "\U0001F33F", // blad: iemand beheert jouw nalatenschap "beheer-voor" => "\U0001F91D", // handdruk: jij beheert die van een ander "moment" => "✉", // envelop "overlijden" => "⚠", // waarschuwing _ => "•" }; /// /// "Dag Jonathan" als we de naam kennen, anders alleen "Welkom". Nooit het e-mailadres: /// dat is geen naam, en het staat raar boven een scherm over je nalatenschap. /// private static string Begroeting(string naam) { var voornaam = naam.Split(' ', StringSplitOptions.RemoveEmptyEntries).FirstOrDefault(); return string.IsNullOrWhiteSpace(voornaam) ? "Welkom" : $"Dag {voornaam}"; } }