master
Raw Download raw file
 1import React from "react";
 2import { Navigate, useParams } from "react-router-dom";
 3
 4import { useSecret } from "./useSecret";
 5
 6import styles from "./Secret.module.scss";
 7
 8export const Secret = () => {
 9	const { id } = useParams();
10	const [copied, setCopied] = React.useState(false);
11
12	if (id === undefined) {
13		return <Navigate to="/" />;
14	}
15
16	const state = useSecret(id);
17
18	const copyCallback = React.useCallback(() => {
19		navigator.clipboard.writeText(window.location.href);
20		setCopied(true);
21	}, []);
22
23	const copyButton = (
24		<a href="#" onClick={copyCallback} className={styles.copyButton}>
25			{copied ? "Copied!" : "Copy Link"}
26		</a>
27	);
28
29	switch (state.kind) {
30		case "Connecting":
31		case "Connected": {
32			return (
33				<div className={styles.secret}>
34					<h1>...</h1>
35					<div className={styles.message}>Loading...</div>
36				</div>
37			);
38		}
39
40		case "Watching": {
41			return (
42				<div className={styles.secret}>
43					<h1>{state.name}</h1>
44					<div className={styles.message}>Waiting for reveal</div>
45					{copyButton}
46				</div>
47			);
48		}
49
50		case "Waiting": {
51			return (
52				<div className={styles.secret}>
53					<h1>{state.name}</h1>
54					<div className={styles.timer}>Will be revealed in {state.time}</div>
55					{copyButton}
56				</div>
57			);
58		}
59
60		case "Revealed": {
61			return (
62				<div className={styles.secret}>
63					<h1>{state.name}</h1>
64					<div className={styles.content}>{state.secret}</div>
65					{copyButton}
66				</div>
67			);
68		}
69
70		default: {
71			return (
72				<div className={styles.secret}>
73					<h1>Error</h1>
74					<div className={styles.message}>An error occurred</div>
75				</div>
76			);
77		}
78	}
79};