move user/next_door call to "store"

This commit is contained in:
Jörn-Michael Miehe 2023-11-03 17:07:25 +00:00
parent 4fbdb94caa
commit ca8df3ba10
5 changed files with 36 additions and 44 deletions

View file

@ -4,10 +4,6 @@
<figure> <figure>
<figcaption class="has-text-primary-dark"> <figcaption class="has-text-primary-dark">
{{ figure_caption }} {{ figure_caption }}
<template v-if="next_door !== null">
<br />
Zeit zum nächsten Türchen: <CountDown :millis="next_door" />
</template>
</figcaption> </figcaption>
<div class="image is-unselectable"> <div class="image is-unselectable">
<img :src="$advent22.api_url('user/background_image')" /> <img :src="$advent22.api_url('user/background_image')" />
@ -33,7 +29,6 @@ import { Door } from "@/lib/door";
import { advent22Store } from "@/plugins/store"; import { advent22Store } from "@/plugins/store";
import { Options, Vue } from "vue-class-component"; import { Options, Vue } from "vue-class-component";
import CountDown from "./CountDown.vue";
import MultiModal from "./MultiModal.vue"; import MultiModal from "./MultiModal.vue";
import BulmaButton from "./bulma/Button.vue"; import BulmaButton from "./bulma/Button.vue";
import CalendarDoor from "./calendar/CalendarDoor.vue"; import CalendarDoor from "./calendar/CalendarDoor.vue";
@ -41,7 +36,6 @@ import ThouCanvas from "./calendar/ThouCanvas.vue";
@Options({ @Options({
components: { components: {
CountDown,
MultiModal, MultiModal,
BulmaButton, BulmaButton,
ThouCanvas, ThouCanvas,
@ -58,14 +52,6 @@ export default class extends Vue {
private multi_modal?: MultiModal; private multi_modal?: MultiModal;
public figure_caption = this.idle_caption; public figure_caption = this.idle_caption;
public next_door: number | null = null;
public mounted(): void {
this.$advent22
.api_get<number | null>("user/next_door")
.then((next_door) => (this.next_door = next_door))
.catch(this.$advent22.alert_user_error);
}
public modal_handle(modal: MultiModal) { public modal_handle(modal: MultiModal) {
this.multi_modal = modal; this.multi_modal = modal;

View file

@ -8,7 +8,7 @@ import { Options, Vue } from "vue-class-component";
@Options({ @Options({
props: { props: {
millis: Number, until: Number,
tick_time: { tick_time: {
type: Number, type: Number,
default: 200, default: 200,
@ -16,18 +16,14 @@ import { Options, Vue } from "vue-class-component";
}, },
}) })
export default class extends Vue { export default class extends Vue {
private millis!: number; private until!: number;
private tick_time!: number; private tick_time!: number;
private interval_id: number | null = null; private interval_id: number | null = null;
public string_repr = ""; public string_repr = "";
private get target_date_ms(): number {
return Date.now() + this.millis;
}
private tick(): void { private tick(): void {
const distance_ms = this.target_date_ms - Date.now(); const distance_ms = this.until - Date.now();
if (distance_ms <= 0) { if (distance_ms <= 0) {
this.string_repr = "Jetzt!"; this.string_repr = "Jetzt!";

View file

@ -1,34 +1,32 @@
<template> <template>
<Calendar :doors="doors" /> <Calendar :doors="doors" />
<hr /> <hr />
<div class="content"> <div class="content" v-html="store.site_config.content" />
<h3>Anleitung</h3> <template v-if="store.next_door_target !== null">
<p> <hr />
Hier findest Du für jedes Türchen des Adventskalenders ein kleines <div class="content has-text-primary">
farbiges Bildchen. Diese werden automatisch am jeweiligen Tag anklickbar Zeit zum nächsten Türchen: <CountDown :until="store.next_door_target" />
und zeigen Dir das neue jeweilige dahinter versteckte Bild.
</p>
<p>
Welches Bildchen zu welchem Tag gehört, erfährst Du, indem Du Deine Maus
darüber bewegst: Bei den bereits freigeschalteten Bildern wird angezeigt,
um welchen Tag es sich handelt.
</p>
</div> </div>
</template> </template>
</template>
<script lang="ts"> <script lang="ts">
import { DoorsSaved } from "@/lib/api"; import { DoorsSaved } from "@/lib/api";
import { Door } from "@/lib/door"; import { Door } from "@/lib/door";
import { advent22Store } from "@/plugins/store";
import { Options, Vue } from "vue-class-component"; import { Options, Vue } from "vue-class-component";
import Calendar from "./Calendar.vue"; import Calendar from "./Calendar.vue";
import CountDown from "./CountDown.vue";
@Options({ @Options({
components: { components: {
Calendar, Calendar,
CountDown,
}, },
}) })
export default class extends Vue { export default class extends Vue {
public readonly store = advent22Store();
public doors: Door[] = []; public doors: Door[] = [];
public mounted(): void { public mounted(): void {

View file

@ -41,8 +41,10 @@
<dd>{{ num_user_doors }}</dd> <dd>{{ num_user_doors }}</dd>
<dt>Zeit zum nächsten Türchen</dt> <dt>Zeit zum nächsten Türchen</dt>
<dd v-if="next_door === null">Kein nächstes Türchen</dd> <dd v-if="store.next_door_target === null">
<dd v-else><CountDown :millis="next_door" /></dd> Kein nächstes Türchen
</dd>
<dd v-else><CountDown :until="store.next_door_target" /></dd>
<dt>Erstes Türchen</dt> <dt>Erstes Türchen</dt>
<dd>{{ fmt_puzzle_date("first") }}</dd> <dd>{{ fmt_puzzle_date("first") }}</dd>
@ -160,6 +162,7 @@
<script lang="ts"> <script lang="ts">
import { AdminConfigModel, Credentials, DoorsSaved } from "@/lib/api"; import { AdminConfigModel, Credentials, DoorsSaved } from "@/lib/api";
import { advent22Store } from "@/plugins/store";
import { DateTime } from "luxon"; import { DateTime } from "luxon";
import { Options, Vue } from "vue-class-component"; import { Options, Vue } from "vue-class-component";
@ -175,6 +178,8 @@ import CountDown from "../CountDown.vue";
}, },
}) })
export default class extends Vue { export default class extends Vue {
public readonly store = advent22Store();
public admin_config_model: AdminConfigModel = { public admin_config_model: AdminConfigModel = {
solution: { solution: {
value: "ABCDEFGHIJKLMNOPQRSTUVWXYZ", value: "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
@ -213,7 +218,6 @@ export default class extends Vue {
}; };
public doors: DoorsSaved = []; public doors: DoorsSaved = [];
public num_user_doors = 0; public num_user_doors = 0;
public next_door: number | null = null;
public dav_credentials: Credentials = ["", ""]; public dav_credentials: Credentials = ["", ""];
public ui_credentials: Credentials = ["", ""]; public ui_credentials: Credentials = ["", ""];
@ -229,13 +233,11 @@ export default class extends Vue {
this.$advent22.api_get<AdminConfigModel>("admin/config_model"), this.$advent22.api_get<AdminConfigModel>("admin/config_model"),
this.$advent22.api_get<DoorsSaved>("admin/doors"), this.$advent22.api_get<DoorsSaved>("admin/doors"),
this.$advent22.api_get<DoorsSaved>("user/doors"), this.$advent22.api_get<DoorsSaved>("user/doors"),
this.$advent22.api_get<number | null>("user/next_door"),
]) ])
.then(([admin_config_model, doors, user_doors, next_door]) => { .then(([admin_config_model, doors, user_doors]) => {
this.admin_config_model = admin_config_model; this.admin_config_model = admin_config_model;
this.doors = doors; this.doors = doors;
this.num_user_doors = user_doors.length; this.num_user_doors = user_doors.length;
this.next_door = next_door;
ready(); ready();
}) })

View file

@ -11,6 +11,7 @@ export const advent22Store = defineStore({
state: () => ({ state: () => ({
api_creds: empty_creds(), api_creds: empty_creds(),
is_touch_device: check_touch_device(),
is_admin: false, is_admin: false,
site_config: { site_config: {
title: "Adventskalender", title: "Adventskalender",
@ -18,7 +19,7 @@ export const advent22Store = defineStore({
content: "", content: "",
footer: "", footer: "",
} as SiteConfigModel, } as SiteConfigModel,
is_touch_device: check_touch_device(), next_door_target: null as number | null,
}), }),
getters: { getters: {
@ -44,10 +45,19 @@ export const advent22Store = defineStore({
}) })
.catch(() => {}); .catch(() => {});
ADVENT22.api_get<SiteConfigModel>("user/site_config") Promise.all([
.then((site_config) => { ADVENT22.api_get<SiteConfigModel>("user/site_config"),
document.title = `${site_config.title} ${site_config.subtitle}`; ADVENT22.api_get<number | null>("user/next_door"),
])
.then(([site_config, next_door]) => {
document.title = site_config.title;
if (site_config.subtitle !== "")
document.title += " " + site_config.subtitle;
this.site_config = site_config; this.site_config = site_config;
if (next_door !== null)
this.next_door_target = Date.now() + next_door;
}) })
.catch(ADVENT22.alert_user_error); .catch(ADVENT22.alert_user_error);
}, },