This PR delivers frontend work for issuer multisig detection (partial signing awareness), theme persistence hardening, and an employer dashboard shell aligned with the Stellar Design System. It also fixes Prettier formatting on touched files so npx prettier . --check passes in CI (as in .github/workflows/build.yml).
Closes: #389, #392, #26 (or link your fork’s issue numbers as appropriate)
getHorizonUrlForNetwork()— Chooses testnet vs public Horizon whenPUBLIC_STELLAR_HORIZON_URLis unset, matching the connected wallet network.detectMultisig(accountId, { horizonUrl? })— Optional Horizon override for issuer checks.useConfiguredIssuerMultisig— Fetches multisig metadata for all configured issuers inSUPPORTED_ASSETS.IssuerMultisigBanner— SDSAlerton payroll, bulk upload, and cross-asset payment flows when issuers require multiple signatures.appendPartialSigningHint/useWalletSigning— Common auth failures (tx_bad_auth,op_bad_auth, etc.) surface multisig / XDR follow-up guidance in notifications and local error state.
- Theme remains under
localStoragekeypayd-theme. - Validates stored values (
light|darkonly). - Applies theme in
useLayoutEffectto reduce flash;storagelistener keeps tabs in sync.
EmployerLayout— Responsive sidebar (drawer on small viewports), top bar withVITE_ORG_DISPLAY_NAME(fallback “Organization”), native XLM balance via Horizon, Connect / theme / language; SDS Button, Heading, Text; nav icons via lucide-react (consistent withAppNav).- Routes under
/employer— Payroll, employees, reports, cross-asset, transactions, revenue split, analytics, bulk upload, settings; index redirects to payroll. AppNav— Link to/employer./admin— Route wired toAdminPanel(nav already pointed here).
- README — Short notes on
/employer,payd-theme, issuer multisig, and WSL2 Windows setup. .env.example— OptionalVITE_ORG_DISPLAY_NAME.
- Issue #349 — Timestamp for Soft-deleted Records: Validated the
023_add_deleted_at_to_organizations.sqlschema implementation that provides thedeleted_atsoft-delete field instead of hard record drops. - Issue #361 — Refactor Database Migrations: Resolved the rollbacks mismatch by adding
026_create_payroll_schedules.sqland027_create_org_audit_log.sqlinto thebackend/src/db/rollbacksdirectory. - Issue #365 — Webhook Retry Exponential Backoff: Enabled true asynchronous polling by adding a
setInterval()invocation forwebhookNotificationService.processPendingRetries()in the BullMQ worker index. - Issue #404 — Improve Windows Installation Guide: Explicit documentation added under
README.md's Quick Start for WSL2-native docker operations.
ThemeProvider.test.tsx,EmployerLayout.test.tsx,multisigHorizon.test.ts,signingErrors.test.ts.
- Ran the workflow’s frontend steps locally:
npm ci --legacy-peer-deps,npm run lint,npx prettier . --check,npm run build,npm test. Prettier required a--writepass on five files; all steps now succeed.
- From
frontend/:
npm ci --legacy-peer-deps && npm run lint && npx prettier . --check && npm run build && npm test - Open
/employer— sidebar, org title, balance (with wallet connected). - Toggle theme, refresh — preference should persist; open a second tab and toggle — tabs should stay aligned.
- On payroll / bulk upload / cross-asset pages — if configured issuers are multisig on the active network, the warning banner appears.
- Lint passes
- Prettier check passes
- Production build passes
- Vitest passes