colored orders + ping sound

This commit is contained in:
2024-12-17 22:58:49 +01:00
parent 69bc5698bd
commit 948dbbca61
5 changed files with 59 additions and 8 deletions

View File

@ -83,7 +83,7 @@ class OrderViewSet(viewsets.ModelViewSet):
serializer_class = OrderSerializer serializer_class = OrderSerializer
filter_backends = [DjangoFilterBackend, filters.OrderingFilter] filter_backends = [DjangoFilterBackend, filters.OrderingFilter]
filterset_fields = ['waiter'] filterset_fields = ['waiter']
ordering = ['-updated_on'] ordering = ['-created_on']
def get_queryset(self): def get_queryset(self):
five_minutes_ago = timezone.now() + datetime.timedelta(minutes=-5) five_minutes_ago = timezone.now() + datetime.timedelta(minutes=-5)

View File

@ -3,6 +3,7 @@
import { fetcher } from '@/app/api/tools'; import { fetcher } from '@/app/api/tools';
import useSWR from 'swr'; import useSWR from 'swr';
import Link from 'next/link'; import Link from 'next/link';
import { useEffect, useRef, useState } from 'react';
type Order = { type Order = {
id: number; id: number;
@ -11,15 +12,44 @@ type Order = {
waiter: number; waiter: number;
waiter_name: string; waiter_name: string;
data: [{ item: string; additional_info: string; finished: boolean }]; data: [{ item: string; additional_info: string; finished: boolean }];
status: string; status: number;
status_name: string; status_name: string;
}; };
export default function Home() { export default function Home() {
const audioRef = useRef({} as HTMLAudioElement);
const [playedIDs, setPlayedIDs] = useState<number[]>([]);
const { data, mutate, error, isLoading } = useSWR(`/api/orders`, fetcher, { const { data, mutate, error, isLoading } = useSWR(`/api/orders`, fetcher, {
refreshInterval: 1000, refreshInterval: 1000,
}); });
const play = () => {
if (audioRef.current) {
audioRef.current.play();
} else {
// Throw error
}
};
useEffect(() => {
if (!data) return;
const justPlayed = (data as Order[])
.filter(
(o) =>
new Date(o.updated_on).getTime() - new Date(o.created_on).getTime() <
10000 && o.status == 1
)
.map((o) => o.id)
.filter((id) => !playedIDs.includes(id));
if (justPlayed.length > 0) {
play();
setPlayedIDs(playedIDs.concat(justPlayed));
}
}, [data]);
const update_finished = (o: number, i: number, v: boolean) => { const update_finished = (o: number, i: number, v: boolean) => {
let d = data; let d = data;
d[o].data[i].finished = v; d[o].data[i].finished = v;
@ -51,10 +81,21 @@ export default function Home() {
return ( return (
<> <>
<audio ref={audioRef} src="/ping.wav"></audio>
<p className="text-4xl">Zamówienia:</p> <p className="text-4xl">Zamówienia:</p>
<ul className="max-w-screen-md w-full"> <ul className="max-w-screen-md w-full">
{data?.map((order: Order, oi: number) => ( {data?.map((order: Order, oi: number) => (
<li key={order.id} className="m-2 p-2 border-2 bg-gray-100"> <li
key={order.id}
className={`m-2 p-2 rounded-md border-2 ${
{
1: 'bg-red-200 border-red-400',
2: 'bg-purple-200 border-purple-400',
3: 'bg-green-200 border-green-400',
4: 'bg-gray-100 border-gray-400',
}[order.status]
}`}
>
<h1 className="text-xl"> <h1 className="text-xl">
<span className="font-mono"> <span className="font-mono">
{'['} {'['}
@ -70,7 +111,7 @@ export default function Home() {
onChange={(e) => onChange={(e) =>
update_status(oi, e.target.value as unknown as number) update_status(oi, e.target.value as unknown as number)
} }
className='form' className="form border-2 border-gray-500"
> >
<option value="1">Zamówienie złożone</option> <option value="1">Zamówienie złożone</option>
<option value="2">Zamówienie w trakcie przygotowywania</option> <option value="2">Zamówienie w trakcie przygotowywania</option>
@ -83,7 +124,7 @@ export default function Home() {
{order.data.map((dish, i) => ( {order.data.map((dish, i) => (
<li <li
key={dish.item} key={dish.item}
className="p-2 m-2 flex gap-4 bg-gray-200 border-2 border-gray-400" className={`p-2 m-2 flex gap-4 border-2 bg-white border-gray-400`}
> >
<input <input
type="checkbox" type="checkbox"

View File

@ -40,7 +40,17 @@ export default function Home() {
status: string; status: string;
status_name: string; status_name: string;
}) => ( }) => (
<li key={order.id} className="m-2 p-2 border-2 bg-gray-100"> <li
key={order.id}
className={`m-2 p-2 rounded-md border-2 ${
{
1: 'bg-red-200 border-red-400',
2: 'bg-purple-200 border-purple-400',
3: 'bg-green-200 border-green-400',
4: 'bg-gray-100 border-gray-400',
}[order.status]
}`}
>
<h1 className="text-xl"> <h1 className="text-xl">
<span className="font-mono"> <span className="font-mono">
{'['} {'['}
@ -56,7 +66,7 @@ export default function Home() {
{order.data.map((dish) => ( {order.data.map((dish) => (
<li <li
key={dish.item} key={dish.item}
className="p-2 m-2 flex gap-4 bg-gray-200 border-2 border-gray-400" className="p-2 m-2 flex gap-4 bg-white border-2 border-gray-400"
> >
<input type="checkbox" checked={dish.finished} readOnly /> <input type="checkbox" checked={dish.finished} readOnly />
<div> <div>

BIN
frontend/public/ping.wav Normal file

Binary file not shown.

View File

@ -1,7 +1,7 @@
import type { Config } from "tailwindcss"; import type { Config } from "tailwindcss";
export default { export default {
darkMode: "class", darkMode: "selector",
content: [ content: [
"./pages/**/*.{js,ts,jsx,tsx,mdx}", "./pages/**/*.{js,ts,jsx,tsx,mdx}",
"./components/**/*.{js,ts,jsx,tsx,mdx}", "./components/**/*.{js,ts,jsx,tsx,mdx}",