advent22/ui/src/lib/helpers.ts
Jörn-Michael Miehe 7cca8c4825 🔧 ui: minor changes to helpers
- rename `Like` -> `VueLike` (also `unwrap_like` -> `unwrap_vuelike`)
- rename `ensure_loaded` -> `unwrap_loading`
- make `unwrap_loading` throw `null` on error instead of `""`
2025-12-28 01:24:31 +00:00

58 lines
1.1 KiB
TypeScript

import { nextTick, UnwrapRef } from "vue";
import { APIError } from "./api_error";
export function objForEach<T>(
obj: T,
f: (k: keyof T, v: T[keyof T]) => void,
): void {
for (const k in obj) {
if (Object.prototype.hasOwnProperty.call(obj, k)) {
f(k, obj[k]);
}
}
}
export type VueLike<T> = T | UnwrapRef<T>;
export function unwrap_vuelike<T>(value: VueLike<T>): T {
return value as T;
}
export type Loading<T> = T | "loading" | "error";
export function loading_success<T>(o: Loading<T>): o is T {
if (o === "loading") return false;
if (o === "error") return false;
return true;
}
export function unwrap_loading<T>(o: Loading<T>): T {
if (!loading_success(o)) throw null;
return o;
}
export function wait_for(condition: () => boolean, action: () => void) {
const do_action = () => {
if (!condition()) {
nextTick(do_action);
return;
}
action();
};
do_action();
}
export function handle_error(error: unknown) {
if (error instanceof APIError) {
error.alert();
} else {
console.error(error);
}
}
export function name_door(day: number): string {
return `Türchen ${day}`;
}