Files
ddidderr 5df82aa4f3 fix(ui): derive operation status from snapshots
The launcher was mixing lifecycle event handlers with the games-list snapshot
when deciding the card status. That left multiple writers for the same
install_status field and made event ordering visible in React.

Make games-list-updated active_operations the authoritative source for busy
status. Lifecycle events no longer mutate the card status; they only keep their
non-status side effects such as rescans and error messages. The only remaining
optimistic status is CheckingPeers before the backend emits its next snapshot.

Add a frontend reducer test that proves an install stays in Installing while an
active install snapshot exists, then settles to Installed only after the active
operation clears with installed local state.

Test Plan:
- git diff --check
- just fmt
- just frontend-test
- just build

Refs: local install/download status snapshot cleanup
2026-05-20 07:03:38 +02:00

103 lines
3.2 KiB
Makefile

export RUSTFLAGS := "-C target-cpu=native"
export WEBKIT_DISABLE_COMPOSITING_MODE := "1"
export DOCKER_CONFIG := env_var_or_default("DOCKER_CONFIG", ".lanspread-peer-cli/docker-config")
run:
cargo tauri dev --release
build:
cargo tauri build --no-bundle #-- --profile dev
bundle:
cargo tauri build -- --profile production
fmt:
cargo +nightly fmt
just --fmt
_fix:
cargo fix
cargo clippy --fix
fix: _fix fmt
clippy:
cargo clippy
test:
cargo test --workspace
frontend-test:
cd crates/lanspread-tauri-deno-ts && deno test --unstable-sloppy-imports tests
clean:
cargo clean
peer-cli-build:
cargo build -p lanspread-peer-cli
peer-cli-image:
mkdir -p "$DOCKER_CONFIG"
docker build -f crates/lanspread-peer-cli/Dockerfile -t lanspread-peer-cli:dev .
# macvlan: each peer container gets its own MAC/IP on the real LAN.
# Override on the command line if your LAN differs, e.g.
# just LANSPREAD_PARENT_IFACE=enp4s0 LANSPREAD_SUBNET=10.0.0.0/24 LANSPREAD_GATEWAY=10.0.0.1 peer-cli-net
LANSPREAD_NET := "lanspread"
LANSPREAD_PARENT_IFACE := "eth0"
LANSPREAD_SUBNET := "192.168.1.0/24"
LANSPREAD_GATEWAY := "192.168.1.1"
peer-cli-net:
mkdir -p "$DOCKER_CONFIG"
docker network inspect {{ LANSPREAD_NET }} >/dev/null 2>&1 || \
docker network create -d macvlan \
--subnet={{ LANSPREAD_SUBNET }} \
--gateway={{ LANSPREAD_GATEWAY }} \
-o parent={{ LANSPREAD_PARENT_IFACE }} \
{{ LANSPREAD_NET }}
peer-cli-run NAME: peer-cli-net
mkdir -p ".lanspread-peer-cli/{{ NAME }}/state" ".lanspread-peer-cli/{{ NAME }}/games"
docker run --rm --init --network {{ LANSPREAD_NET }} --name "lanspread-peer-cli-{{ NAME }}" -i \
-v "$PWD/.lanspread-peer-cli/{{ NAME }}/state:/state" \
-v "$PWD/.lanspread-peer-cli/{{ NAME }}/games:/games" \
lanspread-peer-cli:dev \
--name "{{ NAME }}" \
--games-dir /games \
--state-dir /state \
--catalog-db /app/game.db
peer-cli-alpha: peer-cli-net
mkdir -p ".lanspread-peer-cli/alpha/state"
docker run --rm --init --network lanspread --name "lanspread-peer-cli-alpha" -i \
-v "$PWD/.lanspread-peer-cli/alpha/state:/state" \
-v "$PWD/crates/lanspread-peer-cli/fixtures/fixture-alpha:/games:ro" \
lanspread-peer-cli:dev \
--name "alpha" \
--games-dir /games \
--state-dir /state \
--catalog-db /app/game.db
peer-cli-bravo: peer-cli-net
mkdir -p ".lanspread-peer-cli/bravo/state"
docker run --rm --init --network lanspread --name "lanspread-peer-cli-bravo" -i \
-v "$PWD/.lanspread-peer-cli/bravo/state:/state" \
-v "$PWD/crates/lanspread-peer-cli/fixtures/fixture-bravo:/games:ro" \
lanspread-peer-cli:dev \
--name "bravo" \
--games-dir /games \
--state-dir /state \
--catalog-db /app/game.db
peer-cli-charlie: peer-cli-net
mkdir -p ".lanspread-peer-cli/charlie/state"
docker run --rm --init --network lanspread --name "lanspread-peer-cli-charlie" -i \
-v "$PWD/.lanspread-peer-cli/charlie/state:/state" \
-v "$PWD/crates/lanspread-peer-cli/fixtures/fixture-charlie:/games:ro" \
lanspread-peer-cli:dev \
--name "charlie" \
--games-dir /games \
--state-dir /state \
--catalog-db /app/game.db