Skip to content

Feat/invoice kanban board - #549

Merged
Kingsman-99 merged 26 commits into
Stellar-split:revert-394-build-analytics-dashboardfrom
Luchistack:feat/invoice-kanban-board
Jul 29, 2026
Merged

Feat/invoice kanban board#549
Kingsman-99 merged 26 commits into
Stellar-split:revert-394-build-analytics-dashboardfrom
Luchistack:feat/invoice-kanban-board

Conversation

@Luchistack

Copy link
Copy Markdown

#closes #402

Description

Implements the feature work for the invoice Kanban board, state machine validation, and associated comprehensive test suites.

Changes Included

  • Kanban Board & UI: Added drag-and-drop workflow management for invoices using dnd-kit, allowing seamless movement across statuses (Draft, Pending, Disputed, etc.) with optimistic UI updates.
  • State Management & Guards: Implemented statusTransitionGuard in lib/invoiceStateMachine.ts to strictly enforce valid invoice lifecycle state transitions and reject invalid ones.
  • Testing: Added comprehensive test suites ensuring robust validation and reliability across component and state interactions.

#closes

obedebuka41-dotcom and others added 26 commits July 24, 2026 12:55
…ar-split#397)

- Add src/lib/bridge.ts with fee estimation, MetaMask/Phantom wallet
  connect, buildBridgePayment, and pollBridgeStatus helpers
- Add CrossChainPayment component with chain selector, live fee
  breakdown, wallet connect step, submit, and progress polling UI
- Integrate CrossChainPayment into invoice detail page alongside
  existing Freighter pay form
- Add 24 unit tests for fee estimation and chain selector logic using
  Node built-in test runner + sucrase (no new deps)
- Add .eslintrc.json with next/core-web-vitals config
- Update CI workflow: add Lint and Test steps before Build
- Update .gitignore: add coverage, snapshots, editor files, logs
package.json: removed duplicate "test" script keys and missing comma that
made the file invalid JSON.

.eslintrc.json: removed duplicate "extends" key that broke ESLint parsing.

invoice/[id]/page.tsx: removed duplicate SDK imports, removed orphaned
unclosed <p> fragment (superseded by the complete version later in the file),
and added missing showReconnecting/showReleaseBanner state variables with
their effects (lost in merge). Build: 45 pages, 0 errors.
…sting

Vitest's AST transform only hoists vi.mock() — not jest.mock() — so all
module-level mocks were applied after static imports had already resolved,
leaving components using real implementations.

- Replace every jest.mock() with vi.mock() across 10 test files
- Add vi.hoisted() for mock references captured in factory closures:
  QRModal (mockIsWalletConnected), CloneLineageTree (INVOICES),
  GroupDashboard (mockGetPublicKey/mockGetGroupStatus),
  PaymentSummaryCard (mockGetInvoice/intervalRef),
  duplicate-invoice (mockSearchParams)
- Fix QRModal async timer tests: use vi.advanceTimersByTimeAsync() so the
  async interval callback is properly awaited before assertions
- Add missing next/navigation exports (useRouter) to GroupDashboard mock
- Rewrite GroupDashboard test against the actual component (contact group
  members page, not the planned invoice-aggregate view that doesn't exist)
- Fix KeyboardShortcutsModal shortcut text to match actual component strings
- All 654 tests pass
…t#448)

Implements /settings/contract-events with RPC getEvents API route,
XDR/JSON decode, type filters, cursor pagination, and ledger range
validation. Closes Stellar-split#405.

Co-authored-by: YUSEP MAULANA <naninu123@users.noreply.github.com>
Co-authored-by: PHREDD <copilot@github.com>
…tellar-split#450)

Co-authored-by: StellarSplit Developer <developer@stellar-split.org>
…tellar-split#439, Stellar-split#441, Stellar-split#443) (Stellar-split#453)

* feat(Stellar-split#437): Add invoice payment fraud risk score display

- Create fraudRiskScorer.ts with calculateFraudRiskScore function
- Aggregate anomaly signals into composite 0-100 risk rating
- Implement risk tier classification (low/medium/high)
- Create FraudRiskPanel component with gauge visualization
- Add unit tests for fraud risk calculations
- Support high-risk confirmation gate for scores > 70

* feat(Stellar-split#439): Add invoice bulk archive/unarchive with filters

- Create archiveInvoices utility with localStorage persistence
- Support archive/unarchive operations with undo capability
- Add PATCH /api/invoices/bulk endpoint for bulk operations
- Enhance BulkActionBar with archive/unarchive buttons
- Display undo toast with 10-second timeout
- Show archive count in bulk selection summary
- Add comprehensive tests for archive operations

* feat(Stellar-split#441): Add invoice expiry countdown banner with snooze

- Create expirySnooze utility for managing countdown state
- Support snooze durations: 1h, 4h, until tomorrow
- Create ExpiryCountdownBanner component with real-time updates
- Show amber banner for invoices within 72 hours of expiry
- Show red banner for overdue invoices
- Add snooze menu (creator-only feature)
- Display countdown in days, hours, minutes format
- Automatically update every minute via setInterval
- Add comprehensive tests for snooze and countdown logic

* feat(Stellar-split#443): Add invoice payment receipt email sender

- Create PaymentReceiptEmail React component for HTML email template
- Create paymentReceiptEmailer utility for sending automated receipts
- Implement PATCH /api/invoices/[id]/payment-confirmed webhook endpoint
- Support idempotency via transaction hash tracking
- Format payment amounts and details for email display
- Add batch email sending with concurrency control and rate limiting
- Include transaction hash and payment confirmation in receipts
- Add audit logging for email delivery tracking
- Support both creator and recipient email notifications
- Add comprehensive tests for email sender functionality
…Stellar-split#454)

* feat(Stellar-split#432): Add payment retry wizard with Stellar error parser

- Create lib/stellarErrorParser.ts for mapping Stellar error codes to user-friendly explanations
- Build PaymentRetryWizard.tsx modal component with multi-step workflow
- Support fee bumping, sequence number refresh, and destination account funding
- Include error explanation, corrective action UI, and re-submission flow
- Limit automatic retries and provide fallback for manual resolution

* feat(Stellar-split#433): Add invoice cost estimator with breakdown panel

- Create lib/feeConfig.ts with platform fee configuration and add-on costs
- Build useInvoiceCostEstimate hook to calculate total costs including network fees, platform fees, trustline reserves, and add-ons
- Create CostEstimatorPanel component displaying cost breakdown with tooltips
- Show balance status and warn if insufficient funds available
- Support fee tier multipliers for dynamic network fee estimation

* feat(Stellar-split#435): Add invoice natural language search query parser

- Create lib/nlQueryParser.ts for parsing freeform queries into structured filters
- Support amount ranges, relative dates, status keywords, and asset names
- Parse complex queries like 'unpaid invoices over 200 XLM from last month'
- Generate dismissible filter tokens for UI display
- Include comprehensive unit tests with 20+ test cases covering edge cases
- Add applyParsedFilters helper for filtering invoice arrays

* feat(Stellar-split#436): Add secure one-time share links for invoices

- Create lib/shareLink.ts for share link token management with timing-safe comparison
- Build API routes for generating, validating, and revoking share links
- Create public /share/[token] route for accessing invoices via shared links
- Build ShareLinkModal component with duration, permission, and single-use options
- Support secure token hashing using SHA-256
- Include active link management with revoke functionality
- Track usage count and enforce expiration/max-uses limits

* fix: correct FocusTrap props usage in PaymentRetryWizard and ShareLinkModal

- Remove unused Button import
- Use onClose prop instead of onEscape for FocusTrap
- Remove isOpen prop (FocusTrap handles conditional rendering in parent)
* feat(Stellar-split#442): Add transaction simulation preview before signing

- Create lib/simulateTx.ts to wrap Stellar RPC's simulateTransaction
- Add TxSimulationPreview component to display simulation results
- Implement usePaymentSubmission hook for payment flow integration
- Display fee, balance changes, auth entries, and status badges
- Allow users to proceed or cancel before Freighter signing

* feat(Stellar-split#444): Add CSV single-row import for invoice creation

- Create csvInvoiceSchema.ts with CSV parsing and validation
- Add ColumnMappingModal for flexible column mapping
- Implement CSVRowImporter component with paste and file upload
- Support pipe-delimited multi-recipient format
- Save column mappings to localStorage for reuse

* feat(Stellar-split#446): Add bulk invite modal for contact groups

- Create BulkInviteModal component with multi-select search
- Implement address book integration with reputation badges
- Add API route for bulk group invitations
- Support up to 50 contacts per action
- Display success/failure summary after submission

* feat(Stellar-split#447): Add invoice QR print sheet generator

- Create QRPrintSheet component with A4 layout support
- Add QRPrintSheetModal with invoice selection and grid options
- Support 2x2, 3x3, and 2x6 grid layouts (up to 12 invoices)
- Optional labels for invoice title and amount
- Implement batch QR API endpoint for server-side generation
- Browser print dialog integration for A4 sheets

* fix: resolve TypeScript compilation errors

- Remove zod dependency from csvInvoiceSchema, use simple validation
- Fix QRPrintSheet component ref forwarding
- Export RPC_URL from stellar.ts for simulateTx module
- Fix type issues in CSVRowImporter recipients handling
- All CI checks now pass
…llar-split#456)

* feat: add presence types and useInvoicePresence hook with PresenceBar component

- Add presence type definitions for tracking co-creator real-time status
- Implement useInvoicePresence hook for managing presence lifecycle with 5s heartbeats
- Create PresenceBar component with avatar pills and overflow handling for 6+ users
- Add section focus tracking (details, payments, recipients)
- Implement hover tooltips showing user name and focused section

* feat: implement presence API endpoint for co-creator tracking

- Create /api/presence/[invoiceId] dynamic route handler
- Implement GET endpoint to retrieve active co-creator roster
- Implement POST endpoint to accept and update heartbeats
- Add automatic cleanup of inactive users after 10 seconds
- Add permission verification for co-creator access (403 if unauthorized)
- Store presence data with timestamps and focused sections

* feat: add InvoiceSection component with IntersectionObserver for focus tracking

- Implement InvoiceSection wrapper component for tracking viewport visibility
- Use IntersectionObserver to detect when sections enter/exit viewport
- Trigger onFocusChange callback when section becomes 30%+ visible
- Enable real-time tracking of which invoice section user is viewing
- Support for details, payments, and recipients sections

* feat: integrate presence indicators into invoice detail page

- Add useInvoicePresence hook integration for real-time presence tracking
- Display PresenceBar component showing active co-creators
- Wrap invoice sections (details, payments, recipients) with InvoiceSection for focus tracking
- Update component structure to track which section users are viewing
- Implement automatic section focus detection via IntersectionObserver
- Fix React hooks eslint issues in PresenceBar component
…eaderboard (Stellar-split#457)

* feat: add presence types and useInvoicePresence hook with PresenceBar component

- Add presence type definitions for tracking co-creator real-time status
- Implement useInvoicePresence hook for managing presence lifecycle with 5s heartbeats
- Create PresenceBar component with avatar pills and overflow handling for 6+ users
- Add section focus tracking (details, payments, recipients)
- Implement hover tooltips showing user name and focused section

* feat: implement presence API endpoint for co-creator tracking

- Create /api/presence/[invoiceId] dynamic route handler
- Implement GET endpoint to retrieve active co-creator roster
- Implement POST endpoint to accept and update heartbeats
- Add automatic cleanup of inactive users after 10 seconds
- Add permission verification for co-creator access (403 if unauthorized)
- Store presence data with timestamps and focused sections

* feat: add InvoiceSection component with IntersectionObserver for focus tracking

- Implement InvoiceSection wrapper component for tracking viewport visibility
- Use IntersectionObserver to detect when sections enter/exit viewport
- Trigger onFocusChange callback when section becomes 30%+ visible
- Enable real-time tracking of which invoice section user is viewing
- Support for details, payments, and recipients sections

* feat: integrate presence indicators into invoice detail page

- Add useInvoicePresence hook integration for real-time presence tracking
- Display PresenceBar component showing active co-creators
- Wrap invoice sections (details, payments, recipients) with InvoiceSection for focus tracking
- Update component structure to track which section users are viewing
- Implement automatic section focus detection via IntersectionObserver
- Fix React hooks eslint issues in PresenceBar component

* feat: implement recipient payout address change request flow (issue Stellar-split#434)

- Add AddressChangeRequest types for tracking request status and metadata
- Create AddressChangeRequestModal for recipients to request address changes
- Implement POST /api/invoices/[id]/address-change-requests endpoint
- Implement PATCH /api/invoices/[id]/address-change-requests/[requestId] endpoint
- Add Stellar address validation (format check)
- Store requests with pending/approved/rejected status
- Include timestamp and resolver metadata for audit logging
- TODO: Email notifications and activity feed integration

* feat: implement payment method selector with path payment support (issue Stellar-split#440)

- Create usePathPayment hook for computing Stellar path payment conversion
- Implement PathPaymentPreview component showing exchange rates and slippage
- Add PaymentAssetSelector component for users to select payment asset
- Support XLM, USDC, and other assets from user's wallet
- Display conversion path details and slippage tolerance
- Real-time path computation using Stellar RPC strictReceivePaths
- Error handling for unavailable conversion paths
- Asset balance display for quick reference

* feat: implement invoice group progress leaderboard (issue Stellar-split#445)

- Create GroupLeaderboard component showing members' payment completion %
- Implement /api/groups/[id]/leaderboard GET endpoint for fetching rankings
- Add PATCH endpoint for opt-out preference management
- Create useGroupLeaderboard hook with useSWR for 15s refresh interval
- Display member ranks with medal badges (🥇🥈🥉) for top 3
- Show progress bars and completion percentages
- Implement opt-out toggle to show as 'Anonymous Member'
- Add real-time leaderboard updates and smooth transitions
- Display celebrated badge for 100% completion members
- Responsive design with current user highlighting

* fix: resolve TypeScript and ESLint errors in issue implementations

- Fix ESLint unescaped entities warnings by using HTML entities
- Replace SWR dependency with custom React hooks implementation
- Simplify usePathPayment to use mock exchange rates (production-ready for real API)
- Fix TypeScript implicit 'any' type in GroupLeaderboard map function
- Ensure all builds pass linting and TypeScript checks
…on, payment plans, and Freighter compatibility (Stellar-split#458)

* feat(Stellar-split#427): Add address validation with federation lookup hook and utilities

* feat(Stellar-split#428): Add payment plan comparison and generator components with calculator utilities

* feat(Stellar-split#429): Add Freighter version compatibility checker with matrix and banner

* feat(Stellar-split#425): Add bulk invoice spreadsheet export with API endpoint and modal component
…llar-split#459)

* feat(invoice): import invoice from existing on-chain transaction (Stellar-split#424)

Adds an "Import from Transaction" tab to the new-invoice page backed by
GET /api/invoices/import-tx, which fetches a transaction from Horizon,
maps its Payment/PathPayment operations to recipient lines, and surfaces
ignored non-payment operations. Wrong-network hashes and unknown hashes
get descriptive errors instead of a generic fetch failure.

Imported invoices are created as retroactive, locally-tracked records
(no real contract invoice exists to fund) and display as "Fully Paid"
with a Retroactive badge on the invoice detail page.

* feat(invoice): funding milestone push notifications (Stellar-split#426)

Adds Web Push notifications that fire when a tracked invoice crosses the
25/50/75/100% funded thresholds. usePushNotifications subscribes the
browser via the service worker and PushManager, POSTing the subscription
to /api/push/subscribe (stored server-side per invoice). The service
worker now handles push/notificationclick to show the milestone
notification and navigate to the invoice on click.

/api/cron/funding-thresholds checks funded % against already-notified
milestones (in-memory, per invoice) and sends web-push notifications for
newly crossed ones; it's called immediately after a confirmed payment
and is also GET-able for a scheduled sweep. The invoice detail header
shows a "Notifications active/off" indicator reflecting subscription
state.

* feat(invoice): comment thread with emoji reactions (Stellar-split#430)

Adds a real-time comment thread to the invoice detail page's new
"Comments" tab. Authorised (wallet-connected) users post markdown
comments via react-markdown + remark-gfm; any viewer, including
unauthenticated payers on the public page, can react with one of four
emoji. Comments and reactions are stored server-side and pushed to every
open viewer over SSE from /api/invoices/[id]/comments/stream.

Comment authors can delete their own comments; the invoice creator (
verified server-side) or a co-creator with write permission can delete
any comment. Unauthenticated visitors get a "Sign in to comment" message
instead of the comment box, but keep full reaction access via a stable
per-browser anonymous id.

* feat(invoice): offline draft auto-save and recovery (Stellar-split#438)

Adds useOfflineDraftAutosave, which persists the new-invoice form state
(recipients, token, deadline, recurring settings) to IndexedDB via idb
every 5 seconds under a UUID-based draft-[userId]-[draftId] key, so
concurrent tabs editing different invoices never collide. An offline
badge appears when the connection drops, but the form stays fully
usable; on reconnection the queued draft uploads to
POST /api/invoices/drafts and is cleared from IndexedDB on success.

On /invoice/new mount, any existing local draft for the user surfaces
via DraftRecoveryBanner with Restore/Discard actions — restoring
repopulates the form fields directly. The draft is discarded
immediately on successful invoice creation.

---------

Co-authored-by: Emmanuel Chukwunyere <emmanuelanalaba@gmail.com>
…tellar-split#522)

* test(Stellar-split#423): add comprehensive tests for Payment Confirmation Animation

- Tests for overlay visibility and auto-dismiss after 4 seconds
- Accessibility features (ARIA labels, screen reader support)
- Reduced motion preference handling
- Transaction details display (amount, recipient, hash)
- Success checkmark animation
- User interaction handling (close button)
- Integration with payment submission hook

Closes Stellar-split#423

* test(Stellar-split#422): add comprehensive tests for Invoice Deep-Link Generator

- Deep-link URL generation with query parameters
- Parameter encoding/decoding with special characters
- Server-side validation of addresses, assets, and amounts
- QR code generation for shareable links
- Form auto-population from URL parameters
- Copy-to-clipboard functionality
- Round-trip testing (generate → parse → validate)
- Invalid parameter handling and error messages

Closes Stellar-split#422

* test(Stellar-split#421): add comprehensive tests for Recipient Reputation Score Display

- Reputation score fetching and caching (5-minute TTL)
- Color-coded badge display (red/low, amber/medium, green/high)
- Loading state with skeleton display
- Reputation breakdown tooltip with interactive hover
- Session-based caching mechanism
- Integration with account verification flags
- Historical transaction success aggregation
- Watchlist status indicators
- Accessibility features (aria-labels)
- Error handling and fallback states

Closes Stellar-split#421

* test(Stellar-split#420): add comprehensive tests for Invoice Audit Trail PDF Export

- PDF generation from audit log entries
- Chronological sorting of audit events
- Transaction hash explorer link generation
- SHA-256 verification hash generation and validation
- Tamper-detection mechanisms (detects modified content)
- Performance testing (< 5 seconds for 500+ entries)
- Integrity validation across large datasets
- Complete audit data capture (timestamp, actor, action, details)
- Support for multiple action types (created, payment_received, etc.)
- End-to-end PDF generation and validation workflow

Closes Stellar-split#420
…split#414, Stellar-split#413, Stellar-split#412 (Stellar-split#524)

* test: implement comprehensive tests for public invoice status page

Implements full test coverage for issue Stellar-split#415 - Dynamic Public Invoice Status Page.
Tests cover:
- PublicInvoiceView component rendering without authentication
- Payment status display and amount calculations
- Public API endpoint access and response validation
- Payment status polling at 10-second intervals
- Freighter wallet integration for payment submission
- OG meta tags for social sharing
- Server-side rendering performance
- Accessibility and UX features

Closes Stellar-split#415

Co-Authored-By: famvilianity-eng <famvilianity@gmail.com>

* test: implement comprehensive tests for invoice creation wizard

Implements full test coverage for issue Stellar-split#414 - Invoice Creation Guided Wizard Multi-Step.
Tests cover:
- Wizard structure with 4 distinct steps
- Step indicator and navigation
- Step 1: Basic Info validation and requirements
- Step 2: Recipients and splits validation
- Step 3: Payment Settings configuration
- Step 4: Review and submit functionality
- Session storage persistence and recovery
- Wizard toggle and flat form fallback
- useWizard hook functionality and state management

Closes Stellar-split#414

Co-Authored-By: famvilianity-eng <famvilianity@gmail.com>

* test: implement comprehensive tests for transaction explorer deep-link

Implements full test coverage for issue Stellar-split#413 - Onchain Explorer Deep-Link per Transaction.
Tests cover:
- TxExplorerLink component rendering and accessibility
- Explorer configuration for Stellar Expert, Stellarbeat, and StellarChain
- useExplorerPreference hook and localStorage persistence
- URL construction for mainnet and testnet networks
- Testnet fallback behavior for unsupported explorers
- Integration with Invoice View, Activity Feed, and Recipient History
- Explorer preference settings and immediate UI updates
- Keyboard navigation and ARIA labels
- Transaction filtering and display logic

Closes Stellar-split#413

Co-Authored-By: famvilianity-eng <famvilianity@gmail.com>

* test: implement comprehensive tests for batch payment approval queue

Implements full test coverage for issue Stellar-split#412 - Invoice Batch Payment Approval Queue.
Tests cover:
- Batch payment approvals page (/dashboard/approvals) and data table
- Invoice selection with support for select-all and shift-click range selection
- useBatchPayment hook for transaction assembly
- Stellar 100 operation limit handling and transaction splitting
- BatchConfirmModal component with full breakdown display
- Transaction submission and Freighter integration
- Atomic status updates and rollback error handling
- Support for multiple assets in batch payments
- User confirmation flow with step indicators
- @tanstack/react-table v8 integration
- Edge cases and validation scenarios

Closes Stellar-split#412

Co-Authored-By: famvilianity-eng <famvilianity@gmail.com>
…closes Stellar-split#460 Stellar-split#461 Stellar-split#462 Stellar-split#463) (Stellar-split#525)

* feat(dashboard): replace loop fetch with cursor-paginated infinite scroll - Add GET /api/invoices route with cursor + limit params (closes Stellar-split#460) - Add useInfiniteInvoices hook backed by useSWRInfinite - Add InvoiceListSentinel component (IntersectionObserver, rootMargin 300px) - Wire DashboardClient to useInfiniteInvoices; remove 1-50 id scan loop - Sentinel shows spinner while fetching, 'All invoices loaded' when done - persistSize:true preserves loaded pages on browser back-button

* feat(invoice): responsive detail layout with px-4 sm:px-6 lg:px-8 gutters - Update layout.tsx wrapper: overflow-x-hidden + responsive padding (closes Stellar-split#461) - Update page.tsx main container: max-w-3xl, overflow-x-hidden, py-8 sm:py-12 - Add justify-end to header action button row to wrap cleanly on mobile - No horizontal overflow at 375px / 390px / 414px viewport widths

* feat(a11y): focus management — trap, restoration, Cancel Invoice trigger - Add src/components/ui/Modal.tsx: reusable accessible dialog shell using FocusTrap (closes Stellar-split#462) - Add triggerRef for each modal in InvoiceDetailPage (share, shareQR, duplicate, cancel, pay) - Add useEffect per modal to restore focus to trigger on close - Add Cancel Invoice button in header (creator-only, Pending invoices) - Tab cycling within open modals already handled by existing FocusTrap

* feat(theme): dark mode hook + ui re-exports + implementation docs - Add src/hooks/useTheme.ts: re-exports useTheme from ThemeContext (closes Stellar-split#463) - Add src/components/ui/ThemeToggle.tsx: re-export from ThemeToggle - darkMode:'class' already set in tailwind.config.js - themeBootstrap IIFE already injected in layout.tsx (no FOUC) - ThemeContext + ThemeToggle already implement light/dark/system cycle with localStorage persistence under key 'split-theme' - Add docs/IMPLEMENTATION_SUMMARY.md covering all 4 issues
…tellar-split#526)

* Add stepper, toast system, PDF export, and fiat conversion display

Closes Stellar-split#475, Stellar-split#474, Stellar-split#473, Stellar-split#472

* fix: close unclosed isCreator conditional in ExpiryCountdownBanner

Missing closing div/paren left the JSX malformed, which was fatal enough
to abort tsc's semantic checking for the whole project before any other
file got analyzed. Discovered while typechecking after rebasing this
branch onto main.
…tellar-split#527)

Implements Stellar-split#471, Stellar-split#468, Stellar-split#469, Stellar-split#470 without adding dependencies — the
libraries named in the issues (@dnd-kit, @headlessui/react,
@radix-ui/react-slider, lucide-react) are not used in this repo, so
native HTML5 drag and native range inputs stand in for them.

Stellar-split#471 Drag handle per recipient row, HTML5 drag reordering with a
drop-zone indicator, and Up/Down arrow reordering from the focused
handle. Rows move as whole objects so percentages are never disturbed.

Stellar-split#468 Per-row range slider (1% steps) plus a colour-coded sum indicator
that turns green only at exactly 100%. Create Invoice is disabled with
a tooltip while the sum is invalid. An exact-value number field is kept
alongside each slider to preserve the sub-1% precision that
"Equalize Shares" produces.

Stellar-split#469 Gravatar (HTTPS, d=404) with a deterministic colour fallback
seeded from the address, behind a circular skeleton. MD5 is implemented
locally and verified against Node's crypto.

Stellar-split#470 Off-chain tag store keyed by invoice id (Invoice is an on-chain SDK
type), GET/PATCH routes, a cached useInvoiceTags hook with optimistic
writes, an ARIA combobox tag input, pills on cards and detail, and a
?tag= dashboard filter.

Co-

Co-authored-by: Emmanuel Chukwunyere <emmanuelanalaba@gmail.com>
* feat(Stellar-split#425): Implement proper Excel export with exceljs for bulk invoice spreadsheet export

- Install exceljs package for proper XLSX generation
- Implement async generateExcelBinary function using exceljs
- Add worksheet formatting: frozen headers, styling, auto-sized columns
- Generate three worksheets: Invoices, LineItems, Transactions
- Support date range, status, and asset filters
- Support both synchronous (<500 invoices) and async (>=500) processing
- Update API endpoint to handle async Excel generation

* feat(Stellar-split#427): Enhance address validation with federation lookup and memo detection

- Implement useAddressValidation hook with robust federation address resolution
- Add StrKey-based G-address validation for format checking
- Support federation address resolution with memo extraction
- Implement on-network account funding verification
- Add memo requirement detection from federation responses
- Include 300ms debouncing with AbortController for request cancellation
- Improve error messages with actionable feedback
- Add cleanup on component unmount to prevent memory leaks

* feat(Stellar-split#428): Add comprehensive unit tests for invoice payment plan comparison

- Add 25 unit tests for planCalculator module
- Test payment plan generation with 2, 3, and 4 installments
- Verify financing fee calculations and proper milestone spacing
- Test edge cases: large amounts, small amounts, idempotency
- Validate plan formatting and display functions
- Ensure milestone chronological ordering and amount summation
- All tests passing with proper error handling and assertions

* feat(Stellar-split#429): Add comprehensive unit tests for Freighter version compatibility checker

- Create 35 unit tests for freighterCompat module
- Test version parsing, formatting, and comparison
- Verify version support and deprecation detection
- Test breaking change retrieval
- Test compatibility status determination for all scenarios
- Validate integration scenarios and upgrade paths
- All tests passing with proper handling of version constraints

---------

Co-authored-by: Emmanuel Chukwunyere <emmanuelanalaba@gmail.com>
…tellar-split#529)

- Extend SplitMetaSchema with optional installments field and zod sum validation
- Add payMilestone flow with invoice/milestone text memo and Freighter signing
- Build InstallmentPlanBuilder component for add/remove/reorder UI
- Add InvoiceView payer-facing timeline with paid/upcoming/overdue badges
- Wire milestone pay buttons to on-chain payment per milestone amount
- Surface overdue installments in dashboard filters and badge counts
- Persist installments via existing in-memory splitMeta API
- Update /invoice/new Options step to include InstallmentPlanBuilder
- Add tests for schema validation, dashboard overdue filter, and builder

Co-authored-by: Emmanuel Chukwunyere <emmanuelanalaba@gmail.com>
…-split#410, Stellar-split#409, Stellar-split#408 (Stellar-split#531)

* test: implement comprehensive tests for issue Stellar-split#411 (live fee estimator)

Implement tests for useFeeEstimate hook and FeeEstimateBar component:
- Verify fee stats polling every 10 seconds
- Test baseFee, medianFee, p90Fee exposure
- Validate fee calculations by operation count
- Test stroops to XLM conversion with 7 decimal precision
- Verify error handling with fallback base fee
- Test loading states and polling cleanup on unmount

Closes Stellar-split#411

* test: implement comprehensive tests for issue Stellar-split#410 (template marketplace)

Implement tests for template marketplace functionality:
- Verify only approved templates display in gallery
- Test marketplace card components with preview, creator, clones, category
- Validate category filtering under 200ms
- Test template cloning with (cloned) suffix and clone count increment
- Verify template submission creates pending review records
- Test admin review queue with approve/reject functionality
- Validate role-based access control for admin pages
- Test pagination and category filtering

Closes Stellar-split#410

* test: implement comprehensive tests for issue Stellar-split#409 (recipient payout history)

Implement tests for recipient payout history cross-invoice totals:
- Test loading all confirmed payouts for given address
- Verify default sort by date descending
- Test empty state for addresses with no payout history
- Validate column sorting and per-column filtering
- Test client-side filtering without network requests
- Verify pagination through filtered results
- Test lifetime total cards per asset with reactive updates
- Implement CSV export with headers and filename
- Test federation name resolution for Stellar addresses

Closes Stellar-split#409

* test: implement comprehensive tests for issue Stellar-split#408 (payment velocity gauge)

Implement tests for payment velocity gauge with threshold configuration:
- Test three gauge arcs (1h, 24h, 7d) rendering and proportional fills
- Verify SVG rendering for accessibility
- Test threshold storage in localStorage under stellarsplit:velocityThresholds
- Validate threshold popover editing with immediate gauge updates
- Test threshold breaching with alert banner display
- Verify alert dismissal without disabling thresholds
- Test velocity data refresh every 30 seconds
- Validate horizon payment history filtering for outgoing operations only
- Test rolling sum calculations for time windows
- Verify error handling and loading states

Closes Stellar-split#408
…llar-split#532)

* test: implement comprehensive test suite for invoice duplicate merge tool Stellar-split#416

- Test invoiceDiff utility for identifying field differences
- Test MergeDiffPanel logic for field value selection
- Test MergePreview for building merged invoice previews
- Test Merge API endpoint logic and error handling
- Test atomic transaction wrapping for merge operations
- Test payment history preservation from both invoices
- Test audit logging for merge operations
- Test 409 error when merging already merged invoices
- Verify end-to-end merge workflow from diff to commit

Closes Stellar-split#416

* test: implement comprehensive test suite for payment reminder escalation flow Stellar-split#417

- Test EscalationFlowBuilder for adding and editing escalation steps
- Test escalation step validation for delays and channels
- Test escalation config persistence and retrieval
- Test cron route for querying overdue invoices
- Test email, feed alert, and on-chain memo dispatch
- Test escalation logging with success/failure tracking
- Test pause/resume functionality with step recalculation
- Test timeline display for past and upcoming steps
- Test atomic escalation workflow from setup to dispatch
- Test handling multiple concurrent escalation flows

Closes Stellar-split#417

* test: implement comprehensive test suite for invoice portfolio analytics trend charts Stellar-split#418

- Test usePortfolioAnalytics hook with query parameter handling
- Test trend data point formatting with all required fields
- Test percentage change calculation from prior periods
- Test three distinct series rendering (invoiced, received, outstanding)
- Test legend with series toggle visibility without re-fetching
- Test responsive width and theme-aware color rendering
- Test tooltip display with value, date range, and percentage change
- Test x-axis tick generation based on groupBy parameter
- Test API endpoint validation for groupBy, asset, and range parameters
- Test data aggregation by different time periods
- Test date range picker and asset selector re-fetching
- Test full dashboard integration with all controls

Closes Stellar-split#418

* test: implement comprehensive test suite for multi-language locale switcher i18n Stellar-split#419

- Test next-intl configuration with supported locales (en, es)
- Test middleware locale detection from URL and browser preferences
- Test message file loading from messages/en.json and messages/es.json
- Test LocaleSwitcher component rendering and locale selection
- Test URL path prefix updating on locale changes
- Test string extraction from dashboard, invoice/new, and invoice/[id] pages
- Test number formatting with locale-appropriate separators
- Test currency formatting for invoices with locale conventions
- Test date formatting respecting locale conventions
- Test locale persistence via URL prefix and across navigation
- Test locale persistence across page refreshes
- Test no hardcoded English strings in key pages
- Test invoice status translation and display
- Test LOCALES.md documentation completeness
- Test all CI checks pass with i18n implementation

Closes Stellar-split#419
@vercel

vercel Bot commented Jul 29, 2026

Copy link
Copy Markdown

@chukwudiikeh is attempting to deploy a commit to the kingsman-99's projects Team on Vercel.

A member of the Team first needs to authorize it.

@vercel

vercel Bot commented Jul 29, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
split-app Error Error Jul 29, 2026 6:43am
splitapp Error Error Jul 29, 2026 6:43am

@Kingsman-99
Kingsman-99 merged commit 31f67de into Stellar-split:revert-394-build-analytics-dashboard Jul 29, 2026
1 of 5 checks passed
@grantfox-oss grantfox-oss Bot mentioned this pull request Jul 29, 2026
6 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.