Newer
Older
import {
Modal,
ModalBody,
ModalContent,
ModalHeader,
useDisclosure,
} from "@nextui-org/react";
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import { Canvas } from "../lib/canvas";
import { useEffect, useState } from "react";
import { ClientConfig } from "@sc07-canvas/lib/src/net";
const getTimeLeft = (pixels: { available: number }, config: ClientConfig) => {
// this implementation matches the server's implementation
const cooldown = CanvasLib.getPixelCooldown(pixels.available + 1, config);
const pixelExpiresAt =
Canvas.instance?.lastPlace && Canvas.instance.lastPlace + cooldown * 1000;
const pixelCooldown = pixelExpiresAt && (Date.now() - pixelExpiresAt) / 1000;
if (!pixelCooldown) return undefined;
if (pixelCooldown > 0) return 0;
return Math.abs(pixelCooldown).toFixed(1);
};
const PlaceCountdown = () => {
const { pixels, config } = useAppContext();
const [timeLeft, setTimeLeft] = useState(getTimeLeft(pixels, config));
useEffect(() => {
const timer = setInterval(() => {
setTimeLeft(getTimeLeft(pixels, config));
}, 100);
return () => {
clearInterval(timer);
};
}, [pixels]);
return (
<>{pixels.available + 1 < config.canvas.pixel.maxStack && timeLeft + "s"}</>
);
};
const { canvasPosition, cursorPosition, pixels, config } = useAppContext();
const { isOpen, onOpen, onOpenChange } = useDisclosure();
return (
<>
<div id="canvas-meta">
{canvasPosition && (
<span>
<button className="btn-link" onClick={onOpen}>
({canvasPosition.x}, {canvasPosition.y})
</button>
{cursorPosition && (
<>
{" "}
<span className="canvas-meta--cursor-pos">
(Cursor: {cursorPosition.x}, {cursorPosition.y})
</span>
</>
)}
Pixels:{" "}
<span>
{pixels.available}/{config.canvas.pixel.maxStack}
</span>{" "}
<PlaceCountdown />
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
</span>
<span>
Users Online: <span>321</span>
</span>
</div>
<ShareModal isOpen={isOpen} onOpenChange={onOpenChange} />
</>
);
};
const ShareModal = ({
isOpen,
onOpenChange,
}: {
isOpen: boolean;
onOpenChange: () => void;
}) => {
return (
<Modal isOpen={isOpen} onOpenChange={onOpenChange}>
<ModalContent>
{() => (
<>
<ModalHeader className="flex flex-col gap-1">
share modal
</ModalHeader>
<ModalBody>
<p>share the current zoom level & position as a url</p>
<p>
params would be not a hash so the server can generate an oembed
</p>
</ModalBody>
</>
)}
</ModalContent>
</Modal>
);
};