import type {ComponentType} from "svelte" import {readable, writable} from "svelte/store" import type {FlyParams} from "svelte/transition" import {fly as baseFly} from "svelte/transition" import {randomId} from "@welshman/lib" import {pushState} from "$app/navigation" // Animations export const fly = (node: Element, params?: FlyParams | undefined) => baseFly(node, {y: 20, ...params}) // Toast export type Toast = { id: number message: string options: ToastOptions } export type ToastOptions = { timeout?: number } export const toast = writable(null) export const pushToast = ( {message = "", id = Math.random()}: Partial, options: ToastOptions, ) => { toast.set({id, message, options}) setTimeout(() => popToast(id), options.timeout || 5000) return id } export const popToast = (id: number) => toast.update($t => ($t?.id === id ? null : $t)) // Modals export const modals = new Map() export const pushModal = (component: ComponentType, props: Record) => { const id = randomId() // TODO: fix memory leak here by listening to history somehow modals.set(id, {component, props}) pushState("", {modal: id}) return id } export const popModal = (id: string) => { modals.delete(id) history.back() } // App state export const spaces = readable([ { id: "test", name: "Test", picture: "https://images.unsplash.com/photo-1721853046219-209921be684e?w=800&auto=format&fit=crop&q=60&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxmZWF0dXJlZC1waG90b3MtZmVlZHw0fHx8ZW58MHx8fHx8", }, ])