Wake lock (Prevent Sleep) toggles now persist across reloads via localStorage in both AdminView and DisplayView. Buttons repositioned inline in AdminView campaigns header bar (was floating overlay causing overlap on tablets). DisplayView buttons persist localStorage too. Wake lock acquire failure now shows toast with fix hint (HTTPS or Chrome flag). Fullscreenchange listener re-acquires wake lock (Android discards on screen off). dev-start.sh: auto-detects LAN IP (en0/en1), frontend binds 0.0.0.0, backend URL inlined as LAN IP so phones reach backend. DANGEROUSLY_DISABLE_HOST_CHECK for LAN access. Outputs LAN URL + wake lock flag instructions. Docs: README 'Prevent Sleep (Wake Lock)' section covering secure context requirement, Android Chrome flag workaround for LAN testing, iOS Safari standalone PWA bug. DEVELOPMENT.md LAN access + wake lock note.
66 lines
2.2 KiB
Bash
Executable File
66 lines
2.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Start local dev stack: node backend (sqlite) + react frontend, server storage mode.
|
|
# Usage: ./scripts/dev-start.sh
|
|
# Stop: ./scripts/dev-stop.sh
|
|
set -euo pipefail
|
|
cd "$(dirname "$0")/.."
|
|
mkdir -p tmp data
|
|
|
|
# kill anything on the ports (zombies)
|
|
for port in 3999 4001; do
|
|
pids=$(lsof -ti :$port 2>/dev/null || true)
|
|
if [ -n "$pids" ]; then
|
|
echo "port $port in use by: $pids — leaving as-is."
|
|
echo " (run ./scripts/dev-stop.sh first to restart clean)"
|
|
fi
|
|
done
|
|
|
|
# backend: better-sqlite3, :4001
|
|
if ! lsof -ti :4001 >/dev/null 2>&1; then
|
|
echo "starting backend :4001..."
|
|
DB_PATH=$(pwd)/data/tracker.sqlite PORT=4001 ALLOW_DEV_ENDPOINTS=1 \
|
|
nohup npm run server:dev > tmp/server.log 2>&1 &
|
|
echo $! > tmp/server.pid
|
|
else
|
|
echo "backend already on :4001"
|
|
fi
|
|
|
|
# frontend: server storage, :3999
|
|
if ! lsof -ti :3999 >/dev/null 2>&1; then
|
|
# detect LAN ip so other devices (phones) can reach backend
|
|
LAN_IP=$(ipconfig getifaddr en0 2>/dev/null || ipconfig getifaddr en1 2>/dev/null || echo 127.0.0.1)
|
|
echo "starting frontend :3999 (lan ip: $LAN_IP)..."
|
|
NODE_ENV=development REACT_APP_DEV_TOOLS=1 \
|
|
REACT_APP_STORAGE=server \
|
|
REACT_APP_BACKEND_URL=http://${LAN_IP}:4001 \
|
|
REACT_APP_BACKEND_REALTIME_URL=ws://${LAN_IP}:4001/ws \
|
|
DANGEROUSLY_DISABLE_HOST_CHECK=true \
|
|
HOST=0.0.0.0 \
|
|
BROWSER=none PORT=3999 \
|
|
nohup npm start > tmp/fe.log 2>&1 &
|
|
echo $! > tmp/fe.pid
|
|
else
|
|
echo "frontend already on :3999"
|
|
fi
|
|
|
|
# wait for ports to listen
|
|
echo "waiting for ports..."
|
|
for port in 4001 3999; do
|
|
for i in {1..30}; do
|
|
lsof -ti :$port >/dev/null 2>&1 && break
|
|
sleep 1
|
|
done
|
|
done
|
|
|
|
echo ""
|
|
echo "backend : http://127.0.0.1:4001 (curl http://127.0.0.1:4001/health)"
|
|
echo "frontend : http://127.0.0.1:3999 (admin / player /display)"
|
|
echo "lan url : http://${LAN_IP}:3999 (phones/other devices on network)"
|
|
echo "logs : tmp/server.log tmp/fe.log"
|
|
echo "stop : ./scripts/dev-stop.sh"
|
|
echo ""
|
|
echo "NOTE: Prevent Sleep (wake lock) requires secure context (HTTPS/localhost)."
|
|
echo " LAN IP (http) won't work unless Android Chrome flag set:"
|
|
echo " chrome://flags/#unsafely-treat-insecure-origin-as-secure"
|
|
echo " Add: http://${LAN_IP}:3999 (include port)"
|