- Create EntitySelectionStep.vue for complete step 1 interface
* Dynamic step labeling based on context (giver/recipient/projects)
* EntityGrid integration for unified entity display
* Conflict detection and prevention with visual feedback
* Special entity handling (You, Unnamed) with proper conditions
* Show All navigation with context preservation through query params
* Cancel functionality with event delegation
* Comprehensive prop interface for all dialog contexts
- Create GiftDetailsStep.vue for complete step 2 interface
* Entity summary display using EntitySummaryButton components
* Gift description input with placeholder support
* AmountInput integration with increment/decrement controls
* Unit code selection (HUR, USD, BTC, BX, ETH)
* Photo & more options navigation with computed route
* Conflict detection and warning display
* Form validation and submission with disabled states
* Local reactive state management with prop synchronization
* Edit entity functionality with structured events
- Update GiftedDialog-Decomposition-Plan.md
* Mark Phase 3 as completed with detailed specifications
* Add comprehensive integration examples for step components
* Update component count and progress tracking
* Add usage patterns for EntitySelectionStep and GiftDetailsStep
* Update project status to 'Integration Phase Ready'
Phase 3 completes the major UI section extraction, creating two
comprehensive step components that can directly replace the existing
step logic in GiftedDialog. These components maintain all existing
functionality while providing clean, testable interfaces.
Components: 9 total (4 Phase 1 + 3 Phase 2 + 2 Phase 3)
Next: Integration phase - Replace GiftedDialog step logic with new components
- Create EntityGrid.vue for unified entity grid layout
* Responsive grid layout for people and projects
* Integrates special entities (You, Unnamed) seamlessly
* Conflict detection integration with prop-based checker
* Empty state messaging based on entity type
* Show All navigation with query parameter support
* Event delegation for all entity selection types
* Configurable display limits and grid columns
- Create SpecialEntityCard.vue for special entity handling
* Handles 'You' and 'Unnamed' entity types
* FontAwesome icon integration with configurable styling
* Conflict state handling with visual feedback
* Entity-type-specific color schemes (blue for You, gray for Unnamed)
* Emits structured events with entity data
- Create ShowAllCard.vue for navigation functionality
* Router-link integration with query parameter passing
* Consistent visual styling with other entity cards
* Hover effects and animations
* Maintains context through configurable route params
- Update GiftedDialog-Decomposition-Plan.md
* Mark Phase 2 as completed
* Add comprehensive integration examples
* Update component specifications with actual props/emits
* Add EntityGrid, SpecialEntityCard, and ShowAllCard usage patterns
* Update project status and next steps
Phase 2 creates reusable layout components that can replace the complex
grid logic in GiftedDialog. The EntityGrid component provides a clean
API for entity selection while maintaining all existing functionality.
Components: 7 total (4 Phase 1 + 3 Phase 2)
Next: Integration phase - Update GiftedDialog to use new components
- Create PersonCard.vue for individual person entity display
* Handles selection states and conflict detection
* Includes time icon overlay for contacts
* Emits person-selected events
- Create ProjectCard.vue for individual project entity display
* Shows project icon, name, and issuer information
* Handles project selection events
* Reusable for project listings
- Create EntitySummaryButton.vue for selected entity display
* Supports both person and project entities
* Shows editable vs locked states with appropriate icons
* Handles edit-requested events for step 2 functionality
- Create AmountInput.vue for numeric input with controls
* Increment/decrement buttons with validation
* Configurable min/max values and step size
* v-model compatible for form integration
* Proper input validation and boundary checking
- Add comprehensive GiftedDialog-Decomposition-Plan.md
* Documents complete 4-phase refactoring strategy
* Provides implementation progress tracking
* Includes integration examples and migration strategy
* Outlines benefits: maintainability, testability, reusability
This Phase 1 extraction creates reusable display components that can be
immediately integrated into GiftedDialog and used throughout the app.
The incremental approach reduces refactoring risk while preparing for
future Pinia state management integration.
Next: Phase 2 - Extract layout components (EntityGrid, SpecialEntityCard)
- Ensures person-to-person gifting won't allow the same entity as giver and recipient
- Disable user item selection if it would create conflict
- Error messaging fallback
- Dialog now shows separate cards for giver and recipient
- Ability to change giver and/or recipient
- Project giver/recipient is locked in ProjectView (context reinforcement)
In GiftingDialog, project information is passed along if:
- Selecting "Show All" to go to ContactGiftingView
- Selecting "Photos and Other Options" to go to GiftedDetailsView
- Gifting dialog: added ability to pick a project to benefit from
- Project view: modified dialog calls in Project view to toggle between giving to and benefiting from a project
- Project view: removed redundant person selection
- Project view: benefiting from a project locks the project selection in dialog to enforce context.
- Break long CSS class strings into multiple concatenated lines
- Ensure all lines are under 100 characters for better readability
- Maintain same functionality and styling behavior
- Improve code maintainability and readability
Fixes: Long lines in conditional CSS class assignment
- Add comprehensive debug logging to identify contact list population issues
- Fix array indexing bug in contact mapping (someContactDbIndex -> 0)
- Clean up all console.log statements for production readiness
- Improve contact retrieval debugging for SQLite and Dexie databases
- Maintain core functionality while adding diagnostic capabilities
Debugging: Contact list population issues in GiftedPrompts component
Cleanup: Remove debug console.log statements
- Replace direct platform service calls with databaseUtil.updateDefaultSettings
- Remove manual SQL query construction in favor of centralized utility
- Improve code consistency and maintainability
- Add proper error handling through databaseUtil's built-in mechanisms
- Remove unused PlatformServiceFactory import
- Fix SQL syntax errors in clearAll and setAll methods (AND -> comma)
- Ensure both SQLite and Dexie databases are updated consistently
Improves: FeedFilters component architecture and error handling
Fixes: isNearby and filterFeedByVisible settings not being saved properly
- Add platform-agnostic parseJsonField utility for contactMethods handling
- Update contact export functions (contactsToExportJson, contactToCsvLine)
- Fix contact storage in QR scan views (ContactQRScanShowView, ContactQRScanFullView)
- Ensure consistent JSON string storage across web SQLite and Capacitor SQLite
- Prevents "[object Object] is not valid JSON" errors when switching platforms
- Maintains compatibility between auto-parsing web SQLite and raw string Capacitor SQLite
Fixes: contactMethods parsing errors in export and QR scan functionality
Related: searchBoxes field had similar issue (already fixed)
- Add platform-agnostic parseJsonField utility to handle different SQLite implementations
- Web SQLite (wa-sqlite/absurd-sql) auto-parses JSON strings to objects
- Capacitor SQLite returns raw strings requiring manual parsing
- Update searchBoxes parsing to use new utility for consistent behavior
- Fixes "[object Object] is not valid JSON" error when switching platforms
- Ensures compatibility between web and mobile SQLite implementations
Fixes: searchBoxes parsing errors in databaseUtil.ts
Related: contactMethods field has similar issue (needs same treatment)
- Stacked contact name and DID
- Text truncates to leave room for action buttons when visible
- Separated "from / to" heading from buttons to minimize width
- Various spacing and alignment adjustments
- Refactor importContacts to handle both Dexie and absurd-sql (SQLite) storage
- Add ContactDbRecord interface with all string fields strictly typed (never null)
- Add helper functions to coerce null/undefined to empty string for all string fields
- Guarantee contactMethods is always stored as a JSON string (never null)
- Add runtime validation for required fields (e.g., did)
- Ensure imported/updated contacts are type-safe and compatible with both backends
- Improve code documentation and maintainability
Security:
- No sensitive data exposed
- All fields validated and sanitized before database write
- Consistent data structure across storage backends
Testing:
- Import tested with both Dexie and absurd-sql backends
- Null/undefined fields correctly handled and coerced
- No linter/type errors remain
- Add contactsToExportJson utility function for standardized data export
- Replace CSV export with JSON format in DataExportSection
- Update file extension and MIME type to application/json
- Remove Dexie-specific export logic in favor of unified SQLite/Dexie approach
- Update success notifications to reflect JSON format
- Add TypeScript interfaces for export data structure
This change improves data portability and standardization by:
- Using a consistent JSON format for data export/import
- Supporting both SQLite and Dexie databases
- Including all contact fields in export
- Properly handling contactMethods as stringified JSON
- Maintaining backward compatibility with existing import tools
Security: No sensitive data exposure, maintains existing access controls
- Switched to CSS max() for proper conditional padding when dealing with screens that have a notch, dynamic island, gesture bar, etc.
- Top padding should now appear more compact in iOS
Enhance retrieveSettingsForActiveAccount with better error handling and logging
while maintaining core functionality. Changes focus on making the system more
debuggable and resilient without overcomplicating the logic.
Key improvements:
- Add structured error handling with specific try-catch blocks
- Implement detailed logging with [databaseUtil] prefix for easy filtering
- Add graceful fallbacks for searchBoxes parsing and missing settings
- Improve error recovery paths with safe defaults
- Maintain existing security model and data integrity
Security:
- No sensitive data in logs
- Safe JSON parsing with fallbacks
- Proper error boundaries
- Consistent state management
- Clear fallback paths
Testing:
- Verify settings retrieval works with/without active DID
- Check error handling for invalid searchBoxes
- Confirm logging provides clear debugging context
- Validate fallback to default settings works