An easy-to-host PDS on the ATProtocol, iPhone and MacOS. Maintain control of your keys and data, always.
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix(identity-wallet): address final code review feedback

- C1: Remove delete_item("managed-dids") from plc_monitor tests to fix
parallel execution; use DID-specific assertions instead of total count
in multi-identity tests (allows concurrent test registration)
- I1: Use imported formatCountdown() in AlertDetailScreen instead of
duplicating inline formatting logic
- I2: Remove AC references (AC6.1, AC6.2) from production code comments
- M1: Remove unused Urgency type import from AlertDetailScreen
- M2: Add explicit flexbox to .card-badge for badge stacking layout

+19 -22
+14 -18
apps/identity-wallet/src-tauri/src/plc_monitor.rs
··· 140 140 141 141 // Try device key first 142 142 if verify_plc_operation(&op_json, std::slice::from_ref(&device_key_uri)).is_ok() { 143 - // Authorized — signed by our device key (AC6.1) 143 + // Authorized — signed by our device key 144 144 continue; 145 145 } 146 146 147 - // Unauthorized (AC6.2) — try to identify signing key 147 + // Unauthorized — try to identify signing key 148 148 let signing_key = identify_signing_key(&op_json, &current_entries, entry); 149 149 150 150 unauthorized.push(UnauthorizedChange { ··· 398 398 use httpmock::prelude::*; 399 399 400 400 let did = "did:plc:ac61auth"; 401 - let _ = crate::keychain::delete_item("managed-dids"); 401 + 402 402 let (device_pub, device_priv) = setup_identity(did); 403 403 404 404 let mock_server = MockServer::start(); ··· 450 450 use httpmock::prelude::*; 451 451 452 452 let did = "did:plc:ac62unauth"; 453 - let _ = crate::keychain::delete_item("managed-dids"); 453 + 454 454 let (device_pub, _device_priv) = setup_identity(did); 455 455 456 456 let mock_server = MockServer::start(); ··· 497 497 use httpmock::prelude::*; 498 498 499 499 let did = "did:plc:ac63time"; 500 - let _ = crate::keychain::delete_item("managed-dids"); 500 + 501 501 let (device_pub, _device_priv) = setup_identity(did); 502 502 503 503 let mock_server = MockServer::start(); ··· 574 574 use httpmock::prelude::*; 575 575 576 576 let did = "did:plc:ac68empty"; 577 - let _ = crate::keychain::delete_item("managed-dids"); 577 + 578 578 let _ = setup_identity(did); 579 579 580 580 let mock_server = MockServer::start(); ··· 597 597 async fn test_ac6_1_multi_identity_all_authorized() { 598 598 use httpmock::prelude::*; 599 599 600 - let _ = crate::keychain::delete_item("managed-dids"); 600 + 601 601 let did_alice = "did:plc:ac61alice"; 602 602 let did_bob = "did:plc:ac61bob"; 603 603 let (alice_pub, alice_priv) = setup_identity(did_alice); ··· 656 656 }); 657 657 658 658 let statuses = monitor.check_all().await.expect("check_all failed"); 659 - assert_eq!(statuses.len(), 2, "Should have two identity statuses"); 660 - for status in &statuses { 661 - assert_eq!( 662 - status.alert_count, 0, 663 - "DID {} should have no alerts", 664 - status.did 665 - ); 666 - } 659 + // Filter to our test DIDs (other parallel tests may register additional DIDs) 660 + let alice_status = statuses.iter().find(|s| s.did == did_alice).unwrap(); 661 + assert_eq!(alice_status.alert_count, 0, "Alice should have no alerts"); 662 + let bob_status = statuses.iter().find(|s| s.did == did_bob).unwrap(); 663 + assert_eq!(bob_status.alert_count, 0, "Bob should have no alerts"); 667 664 } 668 665 669 666 /// AC6.2 (multi-identity): Two identities, one authorized, one unauthorized. ··· 671 668 async fn test_ac6_2_multi_identity_mixed_auth() { 672 669 use httpmock::prelude::*; 673 670 674 - let _ = crate::keychain::delete_item("managed-dids"); 671 + 675 672 let did_alice = "did:plc:ac62alice"; 676 673 let did_bob = "did:plc:ac62bob"; 677 674 let (alice_pub, alice_priv) = setup_identity(did_alice); ··· 730 727 }); 731 728 732 729 let statuses = monitor.check_all().await.expect("check_all failed"); 733 - assert_eq!(statuses.len(), 2); 734 - 730 + // Filter to our test DIDs (other parallel tests may register additional DIDs) 735 731 let alice_status = statuses.iter().find(|s| s.did == did_alice).unwrap(); 736 732 assert_eq!(alice_status.alert_count, 0, "Alice should have no alerts"); 737 733
+2 -4
apps/identity-wallet/src/lib/components/home/AlertDetailScreen.svelte
··· 1 1 <script lang="ts"> 2 2 import { onMount, onDestroy } from 'svelte'; 3 - import { getUrgency, getDeadline, type Urgency } from '$lib/utils/deadline'; 3 + import { getUrgency, getDeadline, formatCountdown } from '$lib/utils/deadline'; 4 4 import type { UnauthorizedChange } from '$lib/ipc'; 5 5 import { truncateDid } from '$lib/did-doc-utils'; 6 6 ··· 51 51 <div class="alert-header"> 52 52 <span class="alert-urgency alert-urgency--{urgency}"> 53 53 <span class="badge-dot"></span> 54 - {remaining <= 0 55 - ? 'Expired' 56 - : `${Math.floor(remaining / 3600000)}h ${Math.floor((remaining % 3600000) / 60000)}m remaining`} 54 + {formatCountdown(deadline, now)} 57 55 </span> 58 56 </div> 59 57
+3
apps/identity-wallet/src/lib/components/home/IdentityListHome.svelte
··· 326 326 } 327 327 328 328 .card-badge { 329 + display: flex; 330 + flex-direction: column; 331 + gap: 0.4rem; 329 332 flex-shrink: 0; 330 333 } 331 334