23 lines
1.2 KiB
TypeScript
23 lines
1.2 KiB
TypeScript
import type { Dish, Extra, Settings } from '~/server/utils/store'
|
|
|
|
// Carte + réglages du resto, partagés par toutes les pages client.
|
|
// Rafraîchis toutes les 10 s pour refléter les changements faits dans le dashboard (rupture, pause…).
|
|
export function useShop(opts: { poll?: boolean } = {}) {
|
|
const menu = useFetch<{ dishes: Dish[], extras: Extra[] }>('/api/menu', { key: 'menu', default: () => ({ dishes: [], extras: [] }) })
|
|
const settings = useFetch<Settings>('/api/settings', { key: 'settings' })
|
|
|
|
if (import.meta.client && opts.poll) {
|
|
const t = setInterval(() => { menu.refresh(); settings.refresh() }, 10000)
|
|
onScopeDispose(() => clearInterval(t))
|
|
}
|
|
|
|
const dishes = computed(() => menu.data.value?.dishes || [])
|
|
const extras = computed(() => menu.data.value?.extras || [])
|
|
const open = computed(() => settings.data.value?.open ?? true)
|
|
const wait = computed(() => settings.data.value?.wait ?? 20)
|
|
return { dishes, extras, settings: settings.data, open, wait }
|
|
}
|
|
|
|
export const priceOf = (d: Dish, s: 'L' | 'XL') => d.prices[s]
|
|
export const sizesOf = (d: Dish) => (['L', 'XL'] as const).filter(s => s in d.prices)
|
|
export const orderable = (d: Dish) => d.available && sizesOf(d).some(s => d.prices[s] != null)
|