Live location tracking and playback for the game "manhunt"

Vite just recipe

bwc9876.dev aaa78e33 afc1f9ae

verified
+32 -24
-1
TODO.md
··· 1 1 # TODO 2 2 3 3 - [ ] Start on start game and game settings buttons 4 -
+9 -8
frontend/src/components/LoadingCover.tsx
··· 2 2 import LoadingSpinner from "./LoadingSpinner"; 3 3 4 4 export type LoadingCoverProps = { 5 - text?: string; 6 - show: boolean; 5 + text?: string; 6 + show: boolean; 7 7 }; 8 8 9 - export default function LoadingCover({show, text}: LoadingCoverProps) { 10 - return <div className="screen-cover" style={{display: show ? undefined : "none"}}> 11 - <LoadingSpinner /> 12 - {text && <strong>{text}</strong>} 13 - </div> 9 + export default function LoadingCover({ show, text }: LoadingCoverProps) { 10 + return ( 11 + <div className="screen-cover" style={{ display: show ? undefined : "none" }}> 12 + <LoadingSpinner /> 13 + {text && <strong>{text}</strong>} 14 + </div> 15 + ); 14 16 } 15 -
+3 -4
frontend/src/components/LoadingSpinner.tsx
··· 1 1 import React from "react"; 2 2 3 3 export type LoadingSpinnerProps = { 4 - className?: string; 4 + className?: string; 5 5 }; 6 6 7 - export default function LoadingSpinner({className}: LoadingSpinnerProps) { 8 - return <span className={`spinner ${className ?? ""}`}></span>; 7 + export default function LoadingSpinner({ className }: LoadingSpinnerProps) { 8 + return <span className={`spinner ${className ?? ""}`}></span>; 9 9 } 10 -
+13 -8
frontend/src/components/MenuScreen.tsx
··· 61 61 return; 62 62 } 63 63 const cleanedCode = code.toUpperCase().trim(); 64 - commands.checkRoomCode(cleanedCode).then((valid) => { 65 - if (valid) { 66 - commands.startLobby(cleanedCode, tempSettings).finally(() => { 64 + commands 65 + .checkRoomCode(cleanedCode) 66 + .then((valid) => { 67 + if (valid) { 68 + commands.startLobby(cleanedCode, tempSettings).finally(() => { 69 + setLoadingCover(false); 70 + }); 71 + } else { 72 + message("Invalid Join Code", { kind: "error", title: "Failed to Join" }); 67 73 setLoadingCover(false); 68 - }); 69 - } else { 70 - message("Invalid Join Code", { kind: "error", title: "Failed to Join" }); 74 + } 75 + }) 76 + .catch(() => { 71 77 setLoadingCover(false); 72 - } 73 - }).catch(() => { setLoadingCover(false); }); 78 + }); 74 79 }, []); 75 80 76 81 const onEditName = () => {
+2 -3
frontend/src/style.css
··· 101 101 } 102 102 } 103 103 104 - &.lobby>div.frame { 104 + &.lobby > div.frame { 105 105 flex-grow: 1; 106 106 background-color: #aaa; 107 107 position: relative; ··· 206 206 } 207 207 } 208 208 209 - 210 209 span.spinner { 211 210 width: 1em; 212 211 height: 1em; 213 212 filter: drop-shadow(0 0 10px #000a); 214 - border: solid .1em gray; 213 + border: solid 0.1em gray; 215 214 border-bottom-color: white; 216 215 border-radius: 50%; 217 216 display: inline-block;
+5
justfile
··· 10 10 dev: 11 11 cargo tauri dev 12 12 13 + # Start a frontend server *ON ALL INTERFACES!!!!* 14 + [working-directory('frontend')] 15 + dev-front: 16 + HOST_OVERRIDE="0.0.0.0" npm run dev 17 + 13 18 # Start a webview window *without* running the frontend, only one frontend needs to run at once 14 19 dev-window: 15 20 cargo run -p manhunt-app