2026-02-12 21:59:41 +00:00
|
|
|
import { nextTick, type UnwrapRef } from "vue";
|
2024-08-23 18:21:32 +00:00
|
|
|
import { APIError } from "./api_error";
|
|
|
|
|
|
2024-08-23 16:38:04 +00:00
|
|
|
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]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-08-23 18:21:32 +00:00
|
|
|
|
2025-12-28 01:24:31 +00:00
|
|
|
export type VueLike<T> = T | UnwrapRef<T>;
|
2025-12-25 19:56:25 +00:00
|
|
|
|
2025-12-28 01:24:31 +00:00
|
|
|
export function unwrap_vuelike<T>(value: VueLike<T>): T {
|
2025-12-25 19:56:25 +00:00
|
|
|
return value as T;
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-23 18:21:32 +00:00
|
|
|
export type Loading<T> = T | "loading" | "error";
|
|
|
|
|
|
2025-12-28 01:24:31 +00:00
|
|
|
export function unwrap_loading<T>(o: Loading<T>): T {
|
2025-12-28 02:34:41 +00:00
|
|
|
if (o === "loading" || o === "error") throw null;
|
2024-08-26 14:14:07 +00:00
|
|
|
|
|
|
|
|
return o;
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-28 16:35:10 +00:00
|
|
|
export function wait_for(condition: () => boolean, action: () => void): void {
|
2025-12-28 02:34:41 +00:00
|
|
|
const enqueue_action = () => {
|
2025-12-25 19:56:25 +00:00
|
|
|
if (!condition()) {
|
2025-12-28 02:34:41 +00:00
|
|
|
nextTick(enqueue_action);
|
2025-12-25 19:56:25 +00:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
action();
|
|
|
|
|
};
|
2025-12-28 02:34:41 +00:00
|
|
|
enqueue_action();
|
2025-12-25 19:56:25 +00:00
|
|
|
}
|
|
|
|
|
|
2025-12-28 16:35:10 +00:00
|
|
|
export function handle_error(error: unknown): void {
|
2024-08-23 18:21:32 +00:00
|
|
|
if (error instanceof APIError) {
|
|
|
|
|
error.alert();
|
|
|
|
|
} else {
|
|
|
|
|
console.error(error);
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-08-26 14:14:07 +00:00
|
|
|
|
|
|
|
|
export function name_door(day: number): string {
|
|
|
|
|
return `Türchen ${day}`;
|
|
|
|
|
}
|