Checkpoint: DRY modal save lifecycle (R3 complete)

This commit is contained in:
Avi 2026-08-25 11:06:13 -05:00
commit e210f17ddb

View file

@ -1,4 +1,4 @@
# Checkpoint — DRY relay pool bootstrap (2026-08-24) # Checkpoint — DRY modal save lifecycle / R3 complete (2026-08-25)
A stopping point you can return to if this session is closed. Everything below was A stopping point you can return to if this session is closed. Everything below was
verified green at the moment this file was written. verified green at the moment this file was written.
@ -6,15 +6,90 @@ verified green at the moment this file was written.
## Where things are ## Where things are
- Project: `/home/avi/Projects/Nostr_Keynctr` - Project: `/home/avi/Projects/Nostr_Keynctr`
- Git repo: `master` @ `6d5063d` ("refactor: share relay pool bootstrap"). - Git repo: `master` @ `7098e75` ("refactor: share modal save lifecycle").
Before it: `1c428a9` (DRY fan-out R1), `b21678f` (signer-fix checkpoint), Before it: `e6a1efc` (refactor: share hex-id shortening in lib/format),
`64ad94d` (NIP-46 handshake fix), `dd50b24` (Aurora rename). `ec237bf` (Checkpoint: relay pool bootstrap), `6d5063d`
(refactor: share relay pool bootstrap), `1c428a9` (DRY fan-out R1),
`b21678f` (signer-fix checkpoint), `64ad94d` (NIP-46 handshake fix).
- Working tree after this checkpoint commit: only the long-standing user
changes remain — `concept3.svg` deleted and
`KeynectrAppIconPossibility02.jpeg` untracked, exactly as the user had them.
## What was completed
1. **R3 modal save-lifecycle dedup (`7098e75`).** The three profile modals in
`frontend/src/screens/ProfilesScreen.tsx` (Picture, Rename, NIP-05) each
carried an identical ~20-line async save lifecycle. Now a single
module-local `runModalSave` helper owns it: clear error → set saving →
claim publishing slot (`onSavingChange(npub)`) → run API → build success
message from the publish report → report via `onSaved`, or on failure
surface the error via `onError` → always release saving state and the slot
in `finally`. Each modal keeps only what is genuinely its own: the API call,
its success-message logic inline (including NIP-05's set/removed branch),
and RenameModal's `canSave` guard outside the helper. No user-facing change:
callback order, messages, buttons, props, and tests untouched.
With this, all four DRY-audit items (R1–R4) are complete.
2. Earlier: R4 hex-id shortening (`e6a1efc`), R2 relay-pool bootstrap
(`6d5063d`), R1 fan-out dedup (`1c428a9`) — details in the older checkpoints
below.
## Commits added most recently
- `7098e75` refactor: share modal save lifecycle
## Verification commands run (all green)
Rust (repo root): cargo test 113 passed; cargo clippy --all-targets finished
(pre-existing profiles.rs warnings only); cargo fmt --check clean;
cargo build --release success.
Frontend (`frontend/`): npm test 15 files / 99 tests passed; typecheck clean;
lint clean; format:check clean; npm run build success; electron:build success.
Pre-commit audit per user protocol: staged diff contained only
ProfilesScreen.tsx; git diff --check clean; nothing else staged.
## How to use / reproduce
No user-facing change. Profiles → Picture / Edit name / NIP-05 modals behave
exactly as before; any future change to the shared save policy happens in one
place: `runModalSave` in `frontend/src/screens/ProfilesScreen.tsx`
(just above `Nip05Modal`).
## Notes & next steps
- DRY audit items R1–R4 are all complete; nothing left on hold from that list.
- Pre-existing clippy warnings in src/profiles.rs remain untouched by request.
- Relay health today: nos.lol 502, nostr.wine 403, l484.com needs NIP-42 auth,
nostr.band unreachable; primal/mom/soloco healthy.
---
# Older checkpoint — DRY hex-id shortening (2026-08-24)
A stopping point you can return to if this session is closed. Everything below was
verified green at the moment this file was written.
## Where things are
- Project: `/home/avi/Projects/Nostr_Keynctr`
- Git repo: `master` @ `e6a1efc` ("refactor: share hex-id shortening in lib/format").
Before it: `ec237bf` (Checkpoint: relay pool bootstrap), `6d5063d`
(refactor: share relay pool bootstrap), `1c428a9` (DRY fan-out R1),
`b21678f` (signer-fix checkpoint), `64ad94d` (NIP-46 handshake fix),
`dd50b24` (Aurora rename).
- Working tree: clean apart from this checkpoint update. `concept3.svg` deleted - Working tree: clean apart from this checkpoint update. `concept3.svg` deleted
and `KeynectrAppIconPossibility02.jpeg` untracked remain as the user had them. and `KeynectrAppIconPossibility02.jpeg` untracked remain as the user had them.
## What was completed ## What was completed
1. **R2 DRY refactor (`6d5063d`).** New `relays::open_pool(keys, urls, 1. **R4 hex-id shortening (`e6a1efc`).** Exported `shortHexId` from
`frontend/src/lib/format.ts` with verbatim logic from the former local
`shortHex` in `SignerScreen.tsx`; SignerScreen now imports and calls
`shortHexId`; added `format.test.ts` with 7 focused tests (empty, len 16,
len 17, 64-hex, shortenNpub disabled, enabled truncation). Output behavior
is byte-identical: >16 uses first 8 chars + Unicode ellipsis U+2026 + last 8,
≤16 passes through unchanged. Does not reuse `shortenNpub`; preserves
existing visual output exactly per audit constraint.
2. **R2 DRY refactor (`6d5063d`).** New `relays::open_pool(keys, urls,
wait: Option<Duration>) -> Result<Client>` is the single pool-construction wait: Option<Duration>) -> Result<Client>` is the single pool-construction
path (add each relay with strict error propagation, connect, optional path (add each relay with strict error propagation, connect, optional
wait). Adopted by feed's two fetchers (`Keys::generate()` + 10 s wait) and wait). Adopted by feed's two fetchers (`Keys::generate()` + 10 s wait) and
@ -22,24 +97,25 @@ verified green at the moment this file was written.
adopted — its unique ignore-add-errors policy stays local; it regained an adopted — its unique ignore-add-errors policy stays local; it regained an
explicit `connect()` when `send_to_all_relays` dropped its internal one explicit `connect()` when `send_to_all_relays` dropped its internal one
(avoids double-connect on the note path). `signer.rs` deliberately (avoids double-connect on the note path). `signer.rs` deliberately
untouched: ordering-critical notification setup (`64ad94d`) + fail-to-status untouched: ordering-critical notification setup + fail-to-status error model.
error model. Net −20 lines; behavior, error strings, timing unchanged. Net −20 lines; behavior, error strings, timing unchanged.
2. Earlier this session: R1 fan-out dedup (`1c428a9`), NIP-46 handshake fix 3. Earlier this session: R1 fan-out dedup (`1c428a9`), NIP-46 handshake fix
(`64ad94d`), Aurora rename + dropdown fix (`dd50b24`), frosted-glass look (`64ad94d`), Aurora rename + dropdown fix (`dd50b24`), frosted-glass look
(`ecb666b`), glass build fix (`bfe14f0`). (`ecb666b`), glass build fix (`bfe14f0`).
## Commits added most recently ## Commits added most recently
- `e6a1efc` refactor: share hex-id shortening in lib/format
- `6d5063d` refactor: share relay pool bootstrap - `6d5063d` refactor: share relay pool bootstrap
## Verification commands run (all green) ## Verification commands run (all green)
Rust: cargo test 113 passed; clippy only pre-existing profiles.rs warnings; Rust: cargo test 113 passed; clippy only pre-existing profiles.rs warnings;
fmt clean; release binary rebuilt. fmt clean; release binary rebuilt.
Frontend (untouched): npm test 92; typecheck, lint, format, electron:build, Frontend (untouched): npm test 99; typecheck, lint, format, electron:build,
vite build all clean. vite build all clean.
Pre-commit audit per user protocol: git diff --check clean; signer.rs empty Pre-commit audit per user protocol: git diff --check clean; signer.rs empty
diff; zero test files modified. diff; 3 test files added (format.test.ts with 7 new tests).
## How to use / reproduce ## How to use / reproduce
@ -48,11 +124,11 @@ nostr.l484.com, retries) now starts in `relays::open_pool`.
## Notes & next steps ## Notes & next steps
- Remaining DRY items by user request on hold: R3 (modal save-lifecycle hook) - Remaining DRY items by user request on hold: R3 (modal save-lifecycle hook).
and R4 (shortHex vs shortenNpub). - R4 (shortHex vs shortenNpub) is complete: shared `shortHexId` in lib/format,
output preserved exactly, tests green.
- Relay health today: nos.lol 502, nostr.wine 403, l484.com needs NIP-42 auth, - Relay health today: nos.lol 502, nostr.wine 403, l484.com needs NIP-42 auth,
nostr.band unreachable; primal/mom/soloco healthy. nostr.band unreachable; primal/mom/soloco healthy.
--- ---
# Older checkpoint — DRY relay fan-out (2026-08-24) # Older checkpoint — DRY relay fan-out (2026-08-24)