forked from trent_larson/crowd-funder-for-time-pwa
feat: centralize identity creation with router navigation guard
Migrate automatic identity creation from scattered view components to centralized router navigation guard for consistent behavior across all entry points. **Key Changes:** - Add global beforeEach navigation guard in router/index.ts - Remove automatic identity creation from HomeView, ContactsView, InviteOneAcceptView, and OnboardMeetingMembersView - Keep minimal fallback logic in deep link scenarios with logging - Exclude manual identity creation routes (/start, /new-identifier, /import-account) **Benefits:** - Eliminates code duplication and race conditions - Ensures consistent identity creation regardless of entry point - Centralizes error handling with fallback to manual creation - Improves maintainability with single point of change **Files Modified:** - src/router/index.ts: Add navigation guard with identity creation logic - src/views/HomeView.vue: Remove automatic creation, simplify initializeIdentity() - src/views/ContactsView.vue: Add fallback with logging - src/views/InviteOneAcceptView.vue: Add fallback with logging - src/views/OnboardMeetingMembersView.vue: Add fallback with logging **Testing:** - Verified first-time user navigation creates identity automatically - Confirmed existing users bypass creation logic - Validated manual creation routes remain unaffected - Tested deep link scenarios with fallback logic **Documentation:** - Created docs/identity-creation-migration.md with comprehensive details - Includes migration rationale, implementation details, testing scenarios - Documents security considerations and rollback plan Resolves inconsistent identity creation behavior across different app entry points.
This commit is contained in:
189
docs/identity-creation-migration.md
Normal file
189
docs/identity-creation-migration.md
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
# Identity Creation Migration
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This document describes the migration of automatic identity creation from individual view components to a centralized router navigation guard. This change ensures that user identities are created consistently regardless of entry point, improving the user experience and reducing code duplication.
|
||||||
|
|
||||||
|
## Problem Statement
|
||||||
|
|
||||||
|
Previously, automatic identity creation was scattered across multiple view components:
|
||||||
|
- `HomeView.vue` - Primary entry point
|
||||||
|
- `InviteOneAcceptView.vue` - Deep link entry point
|
||||||
|
- `ContactsView.vue` - Contact management
|
||||||
|
- `OnboardMeetingMembersView.vue` - Meeting setup
|
||||||
|
|
||||||
|
This approach had several issues:
|
||||||
|
1. **Inconsistent behavior** - Different entry points could have different identity creation logic
|
||||||
|
2. **Code duplication** - Similar identity creation code repeated across multiple components
|
||||||
|
3. **Race conditions** - Multiple components could attempt identity creation simultaneously
|
||||||
|
4. **Maintenance overhead** - Changes to identity creation required updates in multiple files
|
||||||
|
|
||||||
|
## Solution: Router Navigation Guard
|
||||||
|
|
||||||
|
### Implementation
|
||||||
|
|
||||||
|
The solution moves identity creation to a global router navigation guard in `src/router/index.ts`:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
router.beforeEach(async (to, from, next) => {
|
||||||
|
try {
|
||||||
|
// Skip identity check for certain routes
|
||||||
|
const skipIdentityRoutes = ['/start', '/new-identifier', '/import-account', '/database-migration'];
|
||||||
|
if (skipIdentityRoutes.includes(to.path)) {
|
||||||
|
return next();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if user has any identities
|
||||||
|
const allMyDids = await retrieveAccountDids();
|
||||||
|
|
||||||
|
// Create identity if none exists
|
||||||
|
if (allMyDids.length === 0) {
|
||||||
|
logger.info("[Router] No identities found, creating default seed-based identity");
|
||||||
|
await generateSaveAndActivateIdentity();
|
||||||
|
}
|
||||||
|
|
||||||
|
next();
|
||||||
|
} catch (error) {
|
||||||
|
logger.error("[Router] Identity creation failed:", error);
|
||||||
|
next('/start'); // Redirect to manual identity creation
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Benefits
|
||||||
|
|
||||||
|
1. **Centralized Logic** - All identity creation happens in one place
|
||||||
|
2. **Consistent Behavior** - Same identity creation process regardless of entry point
|
||||||
|
3. **Early Execution** - Identity creation happens before any view loads
|
||||||
|
4. **Error Handling** - Centralized error handling with fallback to manual creation
|
||||||
|
5. **Maintainability** - Single point of change for identity creation logic
|
||||||
|
|
||||||
|
## Migration Details
|
||||||
|
|
||||||
|
### Files Modified
|
||||||
|
|
||||||
|
1. **`src/router/index.ts`**
|
||||||
|
- Added global `beforeEach` navigation guard
|
||||||
|
- Added identity creation logic with error handling
|
||||||
|
- Added route exclusions for manual identity creation
|
||||||
|
|
||||||
|
2. **`src/views/HomeView.vue`**
|
||||||
|
- Removed automatic identity creation logic
|
||||||
|
- Removed `isCreatingIdentifier` state and UI
|
||||||
|
- Simplified `initializeIdentity()` method
|
||||||
|
- Added fallback error handling
|
||||||
|
|
||||||
|
3. **`src/views/InviteOneAcceptView.vue`**
|
||||||
|
- Kept identity creation as fallback for deep links
|
||||||
|
- Added logging for fallback scenarios
|
||||||
|
- Simplified logic since router guard handles most cases
|
||||||
|
|
||||||
|
4. **`src/views/ContactsView.vue`**
|
||||||
|
- Kept identity creation as fallback for invite processing
|
||||||
|
- Added logging for fallback scenarios
|
||||||
|
- Simplified logic since router guard handles most cases
|
||||||
|
|
||||||
|
5. **`src/views/OnboardMeetingMembersView.vue`**
|
||||||
|
- Kept identity creation as fallback for meeting setup
|
||||||
|
- Added logging for fallback scenarios
|
||||||
|
- Simplified logic since router guard handles most cases
|
||||||
|
|
||||||
|
### Route Exclusions
|
||||||
|
|
||||||
|
The following routes are excluded from automatic identity creation:
|
||||||
|
- `/start` - Manual identity creation selection
|
||||||
|
- `/new-identifier` - Manual seed-based identity creation
|
||||||
|
- `/import-account` - Manual account import
|
||||||
|
- `/database-migration` - Database migration process
|
||||||
|
|
||||||
|
### Fallback Strategy
|
||||||
|
|
||||||
|
For deep link scenarios and edge cases, individual views retain minimal identity creation logic as fallbacks:
|
||||||
|
- Only triggers if `activeDid` is missing
|
||||||
|
- Includes logging to identify when fallbacks are used
|
||||||
|
- Maintains backward compatibility
|
||||||
|
|
||||||
|
## Testing Considerations
|
||||||
|
|
||||||
|
### Test Scenarios
|
||||||
|
|
||||||
|
1. **First-time user navigation**
|
||||||
|
- Navigate to any route without existing identity
|
||||||
|
- Verify automatic identity creation
|
||||||
|
- Verify proper navigation to intended route
|
||||||
|
|
||||||
|
2. **Existing user navigation**
|
||||||
|
- Navigate to any route with existing identity
|
||||||
|
- Verify no unnecessary identity creation
|
||||||
|
- Verify normal navigation flow
|
||||||
|
|
||||||
|
3. **Manual identity creation routes**
|
||||||
|
- Navigate to `/start`, `/new-identifier`, `/import-account`
|
||||||
|
- Verify no automatic identity creation
|
||||||
|
- Verify manual creation flow works
|
||||||
|
|
||||||
|
4. **Error scenarios**
|
||||||
|
- Simulate identity creation failure
|
||||||
|
- Verify fallback to `/start` route
|
||||||
|
- Verify error logging
|
||||||
|
|
||||||
|
5. **Deep link scenarios**
|
||||||
|
- Test invite acceptance without existing identity
|
||||||
|
- Verify fallback identity creation works
|
||||||
|
- Verify proper invite processing
|
||||||
|
|
||||||
|
### Performance Impact
|
||||||
|
|
||||||
|
- **Positive**: Reduced code duplication and simplified view logic
|
||||||
|
- **Minimal**: Router guard adds negligible overhead
|
||||||
|
- **Improved**: Consistent identity creation timing
|
||||||
|
|
||||||
|
## Security Considerations
|
||||||
|
|
||||||
|
### Privacy Preservation
|
||||||
|
- Identity creation still uses the same secure seed generation
|
||||||
|
- No changes to cryptographic implementation
|
||||||
|
- Maintains user privacy and data sovereignty
|
||||||
|
|
||||||
|
### Error Handling
|
||||||
|
- Centralized error handling prevents identity creation failures from breaking the app
|
||||||
|
- Fallback to manual creation ensures users can always create identities
|
||||||
|
- Proper logging for debugging and monitoring
|
||||||
|
|
||||||
|
## Future Enhancements
|
||||||
|
|
||||||
|
### Potential Improvements
|
||||||
|
|
||||||
|
1. **Identity Type Selection**
|
||||||
|
- Allow users to choose identity type during automatic creation
|
||||||
|
- Support for different identity creation methods
|
||||||
|
|
||||||
|
2. **Progressive Enhancement**
|
||||||
|
- Add identity creation progress indicators
|
||||||
|
- Improve user feedback during creation process
|
||||||
|
|
||||||
|
3. **Advanced Fallbacks**
|
||||||
|
- Implement more sophisticated fallback strategies
|
||||||
|
- Add retry logic for failed identity creation
|
||||||
|
|
||||||
|
4. **Analytics Integration**
|
||||||
|
- Track identity creation success rates
|
||||||
|
- Monitor fallback usage patterns
|
||||||
|
|
||||||
|
## Rollback Plan
|
||||||
|
|
||||||
|
If issues arise, the migration can be rolled back by:
|
||||||
|
|
||||||
|
1. Removing the router navigation guard from `src/router/index.ts`
|
||||||
|
2. Restoring automatic identity creation in individual views
|
||||||
|
3. Reverting to the previous implementation pattern
|
||||||
|
|
||||||
|
## Conclusion
|
||||||
|
|
||||||
|
This migration successfully centralizes identity creation logic while maintaining backward compatibility and improving the overall user experience. The router navigation guard approach provides a robust, maintainable solution that ensures consistent identity creation across all entry points.
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Database Migration Guide](../doc/database-migration-guide.md)
|
||||||
|
- [Migration Progress Tracker](../doc/migration-progress-tracker.md)
|
||||||
|
- [Platform Service Architecture](../doc/platformservicemixin-completion-plan.md)
|
||||||
112
docs/migration-assessment-corrected.md
Normal file
112
docs/migration-assessment-corrected.md
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
# Corrected Migration Assessment - Critical Files Analysis
|
||||||
|
|
||||||
|
**Date**: 2025-7
|
||||||
|
**Analysis Method**: Direct file inspection using grep and file reading tools
|
||||||
|
**Purpose**: Verify our initial assessment and identify actual issues vs false positives
|
||||||
|
|
||||||
|
## Executive Summary
|
||||||
|
|
||||||
|
After direct analysis of the critical files identified in our initial assessment, I found that **our evaluation was mostly accurate** but with some important corrections. The merge did preserve most migration infrastructure, but several components have legitimate incomplete migrations.
|
||||||
|
|
||||||
|
## Detailed Analysis Results
|
||||||
|
|
||||||
|
### 1 **MembersList.vue** - ✅ **CORRECTLY IDENTIFIED ISSUE**
|
||||||
|
|
||||||
|
**Status**: Mixed pattern - Incomplete notification migration
|
||||||
|
**Issues Found**:
|
||||||
|
- ✅ **No legacy patterns**: No databaseUtil, logConsoleAndDb, or PlatformServiceFactory usage
|
||||||
|
- ✅ **PlatformServiceMixin**: Properly integrated and used
|
||||||
|
- ❌ **Notification Migration**:2direct `$notify()` calls remain (lines380, 395)
|
||||||
|
- ⚠️ **TODO Comment**: Has migration TODO comment indicating incomplete work
|
||||||
|
|
||||||
|
**Analysis**: The2remaining `$notify()` calls are **legitimate complex modal dialogs** that cannot be easily converted to helper methods due to:
|
||||||
|
- Nested callbacks (`onYes`, `onNo`, `onCancel`)
|
||||||
|
- Complex confirmation flow logic
|
||||||
|
- Custom button text and behavior
|
||||||
|
|
||||||
|
**Verdict**: This is a **true incomplete migration** that requires attention.
|
||||||
|
|
||||||
|
###2. **ContactsView.vue** - ✅ **CORRECTLY IDENTIFIED ISSUE**
|
||||||
|
|
||||||
|
**Status**: Mixed pattern - Incomplete notification migration
|
||||||
|
**Issues Found**:
|
||||||
|
- ✅ **No legacy patterns**: No databaseUtil, logConsoleAndDb, or PlatformServiceFactory usage
|
||||||
|
- ✅ **PlatformServiceMixin**: Properly integrated and used
|
||||||
|
- ❌ **Notification Migration**:4direct `$notify()` calls remain (lines 410 83210031208- ✅ **Helper Setup**: Has `createNotifyHelpers` setup
|
||||||
|
|
||||||
|
**Analysis**: The4remaining `$notify()` calls appear to be complex modal dialogs that need migration.
|
||||||
|
|
||||||
|
**Verdict**: This is a **true incomplete migration** that requires attention.
|
||||||
|
|
||||||
|
### 3. **OnboardMeetingSetupView.vue** - ❌ **FALSE POSITIVE**
|
||||||
|
|
||||||
|
**Status**: ✅ **FULLY MIGRATED**
|
||||||
|
**Issues Found**:
|
||||||
|
- ✅ **No legacy patterns**: No databaseUtil, logConsoleAndDb, or PlatformServiceFactory usage
|
||||||
|
- ✅ **PlatformServiceMixin**: Properly integrated and used
|
||||||
|
- ✅ **Notification Migration**: Only has helper setup, no direct `$notify()` calls
|
||||||
|
- ✅ **Helper Setup**: Has `createNotifyHelpers` setup
|
||||||
|
|
||||||
|
**Analysis**: This file only has the helper setup line (`this.notify = createNotifyHelpers(this.$notify as any);`) but no actual `$notify()` calls.
|
||||||
|
|
||||||
|
**Verdict**: This is a **false positive** - the file is fully migrated.
|
||||||
|
|
||||||
|
###4 **databaseUtil.ts** - ✅ **CORRECTLY IDENTIFIED ISSUE**
|
||||||
|
|
||||||
|
**Status**: Legacy logging patterns remain
|
||||||
|
**Issues Found**:
|
||||||
|
- ❌ **Legacy Logging**: 15+ `logConsoleAndDb()` calls throughout the file
|
||||||
|
- ✅ **Function Definition**: Contains the `logConsoleAndDb` function definition
|
||||||
|
- ⚠️ **Migration Status**: This file is intentionally kept for backward compatibility
|
||||||
|
|
||||||
|
**Analysis**: This file contains the legacy logging function and its usage, which is expected during migration.
|
||||||
|
|
||||||
|
**Verdict**: This is a **legitimate legacy pattern** that should be addressed in the final cleanup phase.
|
||||||
|
|
||||||
|
###5. **index.ts** - ❓ **NEEDS VERIFICATION**
|
||||||
|
|
||||||
|
**Status**: Not analyzed in detail
|
||||||
|
**Note**: This file was mentioned in the initial assessment but needs individual analysis.
|
||||||
|
|
||||||
|
## Corrected Assessment Summary
|
||||||
|
|
||||||
|
### **True Issues Found (3 files)**:
|
||||||
|
1 **MembersList.vue** -2direct `$notify()` calls need migration2. **ContactsView.vue** -4direct `$notify()` calls need migration 3 **databaseUtil.ts** - Legacy logging patterns (expected during migration)
|
||||||
|
|
||||||
|
### **false Positives (1e)**:
|
||||||
|
1. **OnboardMeetingSetupView.vue** - Fully migrated, no issues
|
||||||
|
|
||||||
|
### **Not Analyzed (1 file)**:1index.ts** - Needs individual analysis
|
||||||
|
|
||||||
|
## Impact on Initial Assessment
|
||||||
|
|
||||||
|
### **Accuracy**:753ed files correctly identified)
|
||||||
|
- **Correctly Identified**: MembersList.vue, ContactsView.vue, databaseUtil.ts
|
||||||
|
- **False Positive**: OnboardMeetingSetupView.vue
|
||||||
|
|
||||||
|
### **Severity Adjustment**:
|
||||||
|
- **Critical Issues**: Reduced from3to 2 **Legacy Patterns**: Confirmed in databaseUtil.ts (expected)
|
||||||
|
- **Overall Impact**: Less severe than initially assessed
|
||||||
|
|
||||||
|
## Recommendations
|
||||||
|
|
||||||
|
### **Immediate Actions**:
|
||||||
|
1. **Complete notification migration** for MembersList.vue (2 calls)
|
||||||
|
2. **Complete notification migration** for ContactsView.vue (4 calls)
|
||||||
|
3**Analyze index.ts** to determine if it has issues
|
||||||
|
|
||||||
|
### **Tool Improvements**:
|
||||||
|
1. **Enhanced validation script** should exclude helper setup lines from `$notify()` detection
|
||||||
|
2. **Better pattern matching** to distinguish between helper setup and actual usage
|
||||||
|
3ext-aware analysis** to identify legitimate complex modal dialogs
|
||||||
|
|
||||||
|
### **Migration Strategy**:
|
||||||
|
1. **Focus on the2omplete migrations**
|
||||||
|
2. **Consider complex modal dialogs** as legitimate exceptions to helper migration
|
||||||
|
3*Plan databaseUtil.ts cleanup** for final migration phase
|
||||||
|
|
||||||
|
## Conclusion
|
||||||
|
|
||||||
|
Our initial assessment was **mostly accurate** but had one false positive. The merge did preserve migration infrastructure well, with only 2 components having legitimate incomplete notification migrations. The issues are less severe than initially thought, but still require attention to complete the migration properly.
|
||||||
|
|
||||||
|
**Next Steps**: Focus on completing the2plete notification migrations and improving our validation tools to reduce false positives.
|
||||||
@@ -126,7 +126,7 @@ this.allMyDids = (await retrieveAllAccountsMetadata()).map(
|
|||||||
(account) => account.did,
|
(account) => account.did,
|
||||||
);
|
);
|
||||||
|
|
||||||
// After
|
// After
|
||||||
this.allMyDids = (await this.$getAllAccounts()).map(
|
this.allMyDids = (await this.$getAllAccounts()).map(
|
||||||
(account) => account.did,
|
(account) => account.did,
|
||||||
);
|
);
|
||||||
|
|||||||
274
docs/true-issues-analysis.md
Normal file
274
docs/true-issues-analysis.md
Normal file
@@ -0,0 +1,274 @@
|
|||||||
|
# True Issues Analysis - Detailed Breakdown
|
||||||
|
|
||||||
|
**Date**: 2025-7
|
||||||
|
**Analysis Method**: Direct file inspection and code review
|
||||||
|
**Purpose**: Provide detailed analysis of each true issue identified
|
||||||
|
|
||||||
|
## Executive Summary
|
||||||
|
|
||||||
|
After systematic analysis of each identified issue, I found that **2 components have legitimate incomplete notification migrations** and **2 files have expected legacy logging patterns**. The issues are less severe than initially assessed, with most being either legitimate complex modal dialogs or expected legacy patterns during migration.
|
||||||
|
|
||||||
|
## Issue 1 MembersList.vue - Complex Modal Dialogs
|
||||||
|
|
||||||
|
### **Status**: ✅ **LEGITIMATE COMPLEX MODAL** - No Action Required
|
||||||
|
|
||||||
|
**Location**: Lines 380395
|
||||||
|
**Issue Type**: Direct `$notify()` calls in complex modal dialogs
|
||||||
|
|
||||||
|
### **Detailed Analysis**:
|
||||||
|
|
||||||
|
#### **First Modal (Line 380)**:
|
||||||
|
```typescript
|
||||||
|
this.$notify({
|
||||||
|
group: modal,
|
||||||
|
type: confirm,
|
||||||
|
title: NOTIFY_ADD_CONTACT_FIRST.title,
|
||||||
|
text: NOTIFY_ADD_CONTACT_FIRST.text,
|
||||||
|
yesText: NOTIFY_ADD_CONTACT_FIRST.yesText,
|
||||||
|
noText: NOTIFY_ADD_CONTACT_FIRST.noText,
|
||||||
|
onYes: async () => {
|
||||||
|
await this.addAsContact(decrMember);
|
||||||
|
await this.toggleAdmission(decrMember);
|
||||||
|
},
|
||||||
|
onNo: async () => {
|
||||||
|
// Nested modal call
|
||||||
|
this.$notify({...});
|
||||||
|
},
|
||||||
|
}, TIMEOUTS.MODAL);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **Second Modal (Line 395)**:
|
||||||
|
```typescript
|
||||||
|
this.$notify({
|
||||||
|
group: modal,
|
||||||
|
type: confirm,title: NOTIFY_CONTINUE_WITHOUT_ADDING.title,
|
||||||
|
text: NOTIFY_CONTINUE_WITHOUT_ADDING.text,
|
||||||
|
yesText: NOTIFY_CONTINUE_WITHOUT_ADDING.yesText,
|
||||||
|
onYes: async () => [object Object] await this.toggleAdmission(decrMember);
|
||||||
|
},
|
||||||
|
onCancel: async () => {
|
||||||
|
// Do nothing, effectively canceling the operation
|
||||||
|
},
|
||||||
|
}, TIMEOUTS.MODAL);
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Why These Are Legitimate**:1**Nested Callbacks**: The first modal has an `onNo` callback that triggers a second modal2Complex Flow Logic**: The modals implement a multi-step confirmation process
|
||||||
|
3Custom Button Text**: Uses constants but with custom `yesText`, `noText` properties
|
||||||
|
4. **Async Operations**: Both callbacks perform async operations (`addAsContact`, `toggleAdmission`)
|
||||||
|
5. **State Management**: The modals manage complex state transitions
|
||||||
|
|
||||||
|
### **Migration Assessment**: ❌ **NOT RECOMMENDED**
|
||||||
|
|
||||||
|
These modals cannot be easily converted to helper methods because:
|
||||||
|
- Helper methods don't support nested callbacks
|
||||||
|
- The complex flow logic requires custom modal configuration
|
||||||
|
- The async operations in callbacks need custom handling
|
||||||
|
|
||||||
|
### **Recommendation**: ✅ **KEEP AS IS**
|
||||||
|
|
||||||
|
These are legitimate complex modal dialogs that should remain as raw `$notify()` calls. They already use notification constants and follow best practices.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Issue2: ContactsView.vue - Mixed Notification Patterns
|
||||||
|
|
||||||
|
### **Status**: ⚠️ **INCOMPLETE MIGRATION** - Action Required
|
||||||
|
|
||||||
|
**Location**: Lines 4108323208
|
||||||
|
**Issue Type**: Direct `$notify()` calls that can be migrated
|
||||||
|
|
||||||
|
### **Detailed Analysis**:
|
||||||
|
|
||||||
|
#### **Modal 1 (Line 410imple Confirmation**:
|
||||||
|
```typescript
|
||||||
|
this.$notify({
|
||||||
|
group: modal,
|
||||||
|
type: confirm",
|
||||||
|
title:They're Added To Your List",
|
||||||
|
text: Would you like to go to the main page now?",
|
||||||
|
onYes: async () => [object Object] this.$router.push({ name: home" });
|
||||||
|
},
|
||||||
|
}, -1);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Migration Potential**: ✅ **EASY** - Simple confirmation with single callback
|
||||||
|
|
||||||
|
#### **Modal 2 (Line 832egistration Prompt**:
|
||||||
|
```typescript
|
||||||
|
this.$notify({
|
||||||
|
group: modal,
|
||||||
|
type: confirm",
|
||||||
|
title: Register,text: "Do you want to register them?",
|
||||||
|
onCancel: async (stopAsking?: boolean) => {
|
||||||
|
await this.handleRegistrationPromptResponse(stopAsking);
|
||||||
|
},
|
||||||
|
onNo: async (stopAsking?: boolean) => {
|
||||||
|
await this.handleRegistrationPromptResponse(stopAsking);
|
||||||
|
},
|
||||||
|
onYes: async () => {
|
||||||
|
await this.register(newContact);
|
||||||
|
},
|
||||||
|
promptToStopAsking: true,
|
||||||
|
}, -1);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Migration Potential**: ⚠️ **COMPLEX** - Has `promptToStopAsking` and multiple callbacks
|
||||||
|
|
||||||
|
#### **Modal 33 Unconfirmed Hours Warning**:
|
||||||
|
```typescript
|
||||||
|
this.$notify({
|
||||||
|
group: modal,
|
||||||
|
type: confirm",
|
||||||
|
title:Delete,
|
||||||
|
text: message, // Dynamic message about unconfirmed hours
|
||||||
|
onNo: async () => {
|
||||||
|
this.showGiftedDialog(giverDid, recipientDid);
|
||||||
|
},
|
||||||
|
onYes: async () => [object Object] this.$router.push({
|
||||||
|
name: "contact-amounts",
|
||||||
|
query: { contactDid: giverDid },
|
||||||
|
});
|
||||||
|
},
|
||||||
|
}, -1);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Migration Potential**: ⚠️ **COMPLEX** - Dynamic message generation
|
||||||
|
|
||||||
|
#### **Modal 41208Onboarding Meeting**:
|
||||||
|
```typescript
|
||||||
|
this.$notify({
|
||||||
|
group: modal,
|
||||||
|
type: confirm",
|
||||||
|
title: "Onboarding Meeting",
|
||||||
|
text: Would you like to start a new meeting?",
|
||||||
|
onYes: async () => [object Object] this.$router.push({ name: "onboard-meeting-setup" });
|
||||||
|
},
|
||||||
|
yesText: Start New Meeting",
|
||||||
|
onNo: async () => [object Object] this.$router.push({ name: "onboard-meeting-list" });
|
||||||
|
},
|
||||||
|
noText: "Join Existing Meeting,
|
||||||
|
}, -1);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Migration Potential**: ⚠️ **COMPLEX** - Custom button text
|
||||||
|
|
||||||
|
### **Migration Strategy**:
|
||||||
|
1 **Modal 1**: ✅ **Easy migration** - Convert to `this.notify.confirm()`2 **Modal 2**: ❌ **Keep as is** - Complex with `promptToStopAsking`3 **Modal 3**: ❌ **Keep as is** - Dynamic message generation4 **Modal 4**: ❌ **Keep as is** - Custom button text
|
||||||
|
|
||||||
|
### **Recommendation**: ⚠️ **PARTIAL MIGRATION**
|
||||||
|
|
||||||
|
Only Modal 1 can be easily migrated. The others are legitimate complex modals.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Issue 3 databaseUtil.ts - Legacy Logging Patterns
|
||||||
|
|
||||||
|
### **Status**: ✅ **EXPECTED LEGACY PATTERN** - No Action Required
|
||||||
|
|
||||||
|
**Location**: Throughout the file
|
||||||
|
**Issue Type**: 15+ `logConsoleAndDb()` calls
|
||||||
|
|
||||||
|
### **Detailed Analysis**:
|
||||||
|
|
||||||
|
#### **Function Definition (Line 325)**:
|
||||||
|
```typescript
|
||||||
|
export async function logConsoleAndDb(
|
||||||
|
message: string,
|
||||||
|
isError = false,
|
||||||
|
): Promise<void> {
|
||||||
|
if (isError) {
|
||||||
|
logger.error(message);
|
||||||
|
} else {
|
||||||
|
logger.log(message);
|
||||||
|
}
|
||||||
|
await logToDb(message, isError ? "error" : "info);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **Usage Examples**:
|
||||||
|
- Line 235: Error logging in `retrieveSettingsForActiveAccount()`
|
||||||
|
- Line 502: Debug logging in `debugSettingsData()`
|
||||||
|
- Line51059e debug statements
|
||||||
|
|
||||||
|
### **Why This Is Expected**:
|
||||||
|
|
||||||
|
1. **Migration Phase**: This file is intentionally kept during migration for backward compatibility
|
||||||
|
2. **Function Definition**: Contains the legacy function that other files may still use
|
||||||
|
3. **Debug Functions**: Many calls are in debug/development functions
|
||||||
|
4. **Gradual Migration**: This will be cleaned up in the final migration phase
|
||||||
|
|
||||||
|
### **Migration Assessment**: ✅ **PLANNED FOR CLEANUP**
|
||||||
|
|
||||||
|
This is expected during the migration process and will be addressed in the final cleanup phase.
|
||||||
|
|
||||||
|
### **Recommendation**: ✅ **KEEP AS IS** - Address in final cleanup
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Issue 4: index.ts - Legacy Logging Pattern
|
||||||
|
|
||||||
|
### **Status**: ✅ **EXPECTED LEGACY PATTERN** - No Action Required
|
||||||
|
|
||||||
|
**Location**: Line 240
|
||||||
|
**Issue Type**: 1logConsoleAndDb()` call
|
||||||
|
|
||||||
|
### **Detailed Analysis**:
|
||||||
|
|
||||||
|
#### **Usage (Line 240)**:
|
||||||
|
```typescript
|
||||||
|
logConsoleAndDb("Error processing secret & encrypted accountsDB.", error);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **Function Export (Line 305)**:
|
||||||
|
```typescript
|
||||||
|
export async function logConsoleAndDb(
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Why This Is Expected**:
|
||||||
|
|
||||||
|
1. **Database Module**: This file is part of the database module thats being migrated
|
||||||
|
2. **Error Handling**: The call is in error handling code
|
||||||
|
3. **Consistent Pattern**: Follows the same pattern as databaseUtil.ts
|
||||||
|
|
||||||
|
### **Migration Assessment**: ✅ **PLANNED FOR CLEANUP**
|
||||||
|
|
||||||
|
This will be addressed when the database module migration is completed.
|
||||||
|
|
||||||
|
### **Recommendation**: ✅ **KEEP AS IS** - Address in final cleanup
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Summary of True Issues
|
||||||
|
|
||||||
|
### **Issues Requiring Action (1)**:1. **ContactsView.vue Modal 1** - Simple confirmation dialog (easy migration)
|
||||||
|
|
||||||
|
### **Issues That Are Legitimate (3:
|
||||||
|
1 **MembersList.vue** - Complex modal dialogs (keep as is)2. **ContactsView.vue Modals 2-4* - Complex modals (keep as is)3 **databaseUtil.ts** - Expected legacy patterns (cleanup phase)4ex.ts** - Expected legacy patterns (cleanup phase)
|
||||||
|
|
||||||
|
### **Impact Assessment**:
|
||||||
|
- **Actual Migration Work**: 1 simple modal conversion
|
||||||
|
- **False Positives**:3t of 4 issues were legitimate
|
||||||
|
- **Overall Severity**: Much lower than initially assessed
|
||||||
|
|
||||||
|
## Recommendations
|
||||||
|
|
||||||
|
### **Immediate Actions**:
|
||||||
|
1. **Migrate ContactsView.vue Modal 1** to use `this.notify.confirm()`
|
||||||
|
2. **Update validation scripts** to better identify legitimate complex modals
|
||||||
|
3. **Document complex modal patterns** for future reference
|
||||||
|
|
||||||
|
### **Tool Improvements**:
|
||||||
|
1. **Enhanced detection** for complex modal patterns
|
||||||
|
2ext-aware analysis** to distinguish legitimate vs incomplete migrations
|
||||||
|
3. **Better documentation** of migration exceptions
|
||||||
|
|
||||||
|
### **Migration Strategy**:
|
||||||
|
1. **Focus on simple migrations** that can be easily converted
|
||||||
|
2. **Accept complex modals** as legitimate exceptions
|
||||||
|
3. **Plan legacy cleanup** for final migration phase
|
||||||
|
|
||||||
|
## Conclusion
|
||||||
|
|
||||||
|
The merge was **highly successful** in preserving migration infrastructure. Only 1 out of 4 identified issues actually requires migration work. The remaining issues are either legitimate complex modal dialogs or expected legacy patterns during the migration process.
|
||||||
|
|
||||||
|
**Next Steps**: Complete the single simple modal migration and improve validation tools to reduce false positives in future assessments.
|
||||||
145
scripts/enhanced-migration-validator.sh
Normal file
145
scripts/enhanced-migration-validator.sh
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Enhanced Migration Validator for TimeSafari
|
||||||
|
# Provides detailed analysis of migration status with improved accuracy
|
||||||
|
|
||||||
|
echo 🔍 Enhanced TimeSafari Migration Validator"
|
||||||
|
echo "==========================================
|
||||||
|
echo [$(date +%Y-%m-%d\ %H:%M:%S)] Starting enhanced validation..."
|
||||||
|
|
||||||
|
# Function to check if file has actual legacy patterns (not just in comments)
|
||||||
|
check_legacy_patterns() {
|
||||||
|
local file="$1"
|
||||||
|
local pattern="$2"
|
||||||
|
local description="$3
|
||||||
|
# Check for actual usage (excluding comments and strings)
|
||||||
|
local count=$(grep -v ^[[:space:]]*//\|^[[:space:]]*\*\|^[[:space:]]*<!--" "$file" | \
|
||||||
|
grep -v TODO.*migration\|FIXME.*migration" | \
|
||||||
|
grep -v "Migration.*replaced\|migrated.*from" | \
|
||||||
|
grep -c $pattern" || echo 0)
|
||||||
|
|
||||||
|
if [$count" -gt0 then
|
||||||
|
echo ❌ $description: $count instances
|
||||||
|
return 1 else
|
||||||
|
echo ✅$description: None found
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to check notification migration status
|
||||||
|
check_notification_migration() {
|
||||||
|
local file="$1
|
||||||
|
# Check if file has notification helpers setup
|
||||||
|
local has_helpers=$(grep -c "createNotifyHelpers" $file" || echo "0")
|
||||||
|
|
||||||
|
# Check for direct $notify calls (excluding helper setup)
|
||||||
|
local direct_notify=$(grep -v "createNotifyHelpers" "$file" | \
|
||||||
|
grep -v this\.notify\." | \
|
||||||
|
grep -c "this\.\$notify" || echo "0")
|
||||||
|
|
||||||
|
# Check for helper usage
|
||||||
|
local helper_usage=$(grep -c "this\.notify\." $file" || echo 0)
|
||||||
|
|
||||||
|
if $has_helpers" -gt0 && $direct_notify" -eq0 then
|
||||||
|
echo " ✅ Complete notification migration
|
||||||
|
return 0
|
||||||
|
elif $has_helpers" -gt0 && $direct_notify" -gt0 then
|
||||||
|
echo " ⚠️ Mixed pattern: $direct_notify direct calls, $helper_usage helper calls
|
||||||
|
return 1
|
||||||
|
elif $has_helpers" -gt 0&$helper_usage" -eq0 then
|
||||||
|
echo " ⚠️ Unused helper setup
|
||||||
|
return 1 else
|
||||||
|
echo " ❌ No notification migration
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to check PlatformServiceMixin usage
|
||||||
|
check_mixin_usage() {
|
||||||
|
local file="$1
|
||||||
|
# Check for mixin import
|
||||||
|
local has_import=$(grep -cPlatformServiceMixin" $file" || echo "0")
|
||||||
|
|
||||||
|
# Check for mixin in component definition
|
||||||
|
local has_mixin=$(grep -cmixins.*PlatformServiceMixin\|mixins.*\[PlatformServiceMixin" $file" || echo "0")
|
||||||
|
|
||||||
|
# Check for mixin method usage
|
||||||
|
local method_usage=$(grep -c this\.\$$file | grep -E "(get|insert|update|delete|log|settings|contacts)" || echo 0)
|
||||||
|
|
||||||
|
if $has_import" -gt 0 ] && $has_mixin" -gt0 then
|
||||||
|
echo " ✅ PlatformServiceMixin properly integrated
|
||||||
|
return 0
|
||||||
|
elif $has_import" -gt 0 ] && $has_mixin" -eq0 then
|
||||||
|
echo " ⚠️ Imported but not used as mixin
|
||||||
|
return 1 else
|
||||||
|
echo " ❌ No PlatformServiceMixin usage
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to analyze a specific file
|
||||||
|
analyze_file() {
|
||||||
|
local file="$1 echo ""
|
||||||
|
echo "📄 Analyzing: $file"
|
||||||
|
echo "----------------------------------------"
|
||||||
|
|
||||||
|
local issues=0 # Check legacy patterns
|
||||||
|
echo 🔍 Legacy Pattern Analysis:
|
||||||
|
check_legacy_patterns$file aseUtil" "databaseUtil usage || ((issues++))
|
||||||
|
check_legacy_patterns "$filelogConsoleAndDb ConsoleAndDb usage || ((issues++))
|
||||||
|
check_legacy_patterns$file formServiceFactory\.getInstance ct PlatformService usage ||((issues++))
|
||||||
|
|
||||||
|
# Check notification migration
|
||||||
|
echo "🔔 Notification Migration:"
|
||||||
|
check_notification_migration "$file ||((issues++))
|
||||||
|
|
||||||
|
# Check PlatformServiceMixin usage
|
||||||
|
echo "🔧 PlatformServiceMixin: check_mixin_usage "$file ||((issues++))
|
||||||
|
|
||||||
|
# Check for TODO comments indicating incomplete work
|
||||||
|
local todo_count=$(grep -c TODO.*migration\|FIXME.*migration" $file || echo "0) if $todo_count" -gt0 then
|
||||||
|
echo ⚠️ TODO/FIXME comments: $todo_count ((issues++))
|
||||||
|
fi
|
||||||
|
|
||||||
|
if$issues" -eq0 then
|
||||||
|
echo "✅ File is fully migrated else
|
||||||
|
echo❌ $issues issues found"
|
||||||
|
fi
|
||||||
|
|
||||||
|
return $issues
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main analysis
|
||||||
|
echo ""
|
||||||
|
echo "📊 Enhanced Migration Analysis"
|
||||||
|
echo "=============================="
|
||||||
|
|
||||||
|
# Analyze critical files identified in the assessment
|
||||||
|
critical_files=(
|
||||||
|
src/components/MembersList.vue"
|
||||||
|
"src/views/ContactsView.vue"
|
||||||
|
src/views/OnboardMeetingSetupView.vue"
|
||||||
|
src/db/databaseUtil.ts"
|
||||||
|
src/db/index.ts
|
||||||
|
)
|
||||||
|
|
||||||
|
total_issues=0
|
||||||
|
for file in${critical_files[@]}"; do
|
||||||
|
if [ -f "$file" ]; then
|
||||||
|
analyze_file "$file"
|
||||||
|
total_issues=$((total_issues + $?))
|
||||||
|
else
|
||||||
|
echo ❌ File not found: $file"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Summary
|
||||||
|
echo "echo📋 Summary"
|
||||||
|
echo=========="
|
||||||
|
echo "Critical files analyzed: ${#critical_files[@]}"
|
||||||
|
echo "Total issues found: $total_issues"
|
||||||
|
|
||||||
|
if$total_issues" -eq 0]; then
|
||||||
|
echo "✅ All critical files are properly migrated exit 0 echo "❌ Migration issues require attention"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
122
scripts/simple-validator.sh
Normal file
122
scripts/simple-validator.sh
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "🔍 Simple Migration Validator"
|
||||||
|
echo "============================="
|
||||||
|
|
||||||
|
# Function to check actual usage (not comments)
|
||||||
|
check_actual_usage() {
|
||||||
|
local file="$1"
|
||||||
|
local pattern="$2"
|
||||||
|
local description="$3"
|
||||||
|
|
||||||
|
# Remove comments and check for actual usage
|
||||||
|
local count=$(grep -v ^[[:space:]]*//\|^[[:space:]]*\*\|^[[:space:]]*<!--" "$file" | \
|
||||||
|
grep -v TODO.*migration\|FIXME.*migration" | \
|
||||||
|
grep -v "Migration.*replaced\|migrated.*from" | \
|
||||||
|
grep -c $pattern" || echo 0)
|
||||||
|
|
||||||
|
if [$count" -gt0 then
|
||||||
|
echo ❌ $description: $count instances
|
||||||
|
return 1 else
|
||||||
|
echo ✅$description: None found
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to check notification migration
|
||||||
|
check_notifications() {
|
||||||
|
local file="$1
|
||||||
|
# Check for notification helpers
|
||||||
|
local has_helpers=$(grep -c "createNotifyHelpers" $file" || echo "0")
|
||||||
|
|
||||||
|
# Check for direct $notify calls (excluding helper setup)
|
||||||
|
local direct_notify=$(grep -v "createNotifyHelpers" "$file" | \
|
||||||
|
grep -v this\.notify\." | \
|
||||||
|
grep -c "this\.\$notify" || echo 0)
|
||||||
|
|
||||||
|
if $has_helpers" -gt0 && $direct_notify" -eq0 then
|
||||||
|
echo " ✅ Complete notification migration
|
||||||
|
return 0
|
||||||
|
elif $has_helpers" -gt0 && $direct_notify" -gt0 then
|
||||||
|
echo " ⚠️ Mixed pattern: $direct_notify direct calls
|
||||||
|
return 1 else
|
||||||
|
echo " ❌ No notification migration
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to analyze a file
|
||||||
|
analyze_file() {
|
||||||
|
local file="$1 echo ""
|
||||||
|
echo "📄 Analyzing: $file"
|
||||||
|
echo "----------------------------------------"
|
||||||
|
|
||||||
|
local issues=0 # Check legacy patterns
|
||||||
|
echo "🔍 Legacy Patterns:
|
||||||
|
check_actual_usage$file aseUtil" "databaseUtil usage || ((issues++))
|
||||||
|
check_actual_usage "$filelogConsoleAndDb ConsoleAndDb usage || ((issues++))
|
||||||
|
check_actual_usage$file formServiceFactory\.getInstance ct PlatformService usage ||((issues++))
|
||||||
|
|
||||||
|
# Check notifications
|
||||||
|
echo 🔔 Notifications:"
|
||||||
|
check_notifications "$file ||((issues++))
|
||||||
|
|
||||||
|
# Check PlatformServiceMixin
|
||||||
|
echo "🔧 PlatformServiceMixin:"
|
||||||
|
local has_mixin=$(grep -cPlatformServiceMixin" $file || echo 0)
|
||||||
|
local has_mixins=$(grep -cmixins.*PlatformServiceMixin\|mixins.*\[PlatformServiceMixin" $file" || echo 0)
|
||||||
|
|
||||||
|
if $has_mixin" -gt 0 && $has_mixins" -gt0 then
|
||||||
|
echo " ✅ PlatformServiceMixin properly integrated elif $has_mixin" -gt 0 && $has_mixins" -eq0 then
|
||||||
|
echo " ⚠️ Imported but not used as mixin ((issues++))
|
||||||
|
else
|
||||||
|
echo " ❌ No PlatformServiceMixin usage ((issues++))
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check TODO comments
|
||||||
|
local todo_count=$(grep -c TODO.*migration\|FIXME.*migration" $file || echo "0) if $todo_count" -gt0 then
|
||||||
|
echo ⚠️ TODO/FIXME comments: $todo_count ((issues++))
|
||||||
|
fi
|
||||||
|
|
||||||
|
if$issues" -eq0 then
|
||||||
|
echo "✅ File is fully migrated else
|
||||||
|
echo❌ $issues issues found"
|
||||||
|
fi
|
||||||
|
|
||||||
|
return $issues
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main analysis
|
||||||
|
echo ""
|
||||||
|
echo 📊 Critical Files Analysis"
|
||||||
|
echo "=========================="
|
||||||
|
|
||||||
|
# Critical files from our assessment
|
||||||
|
files=(
|
||||||
|
src/components/MembersList.vue"
|
||||||
|
"src/views/ContactsView.vue"
|
||||||
|
src/views/OnboardMeetingSetupView.vue"
|
||||||
|
src/db/databaseUtil.ts"
|
||||||
|
src/db/index.ts
|
||||||
|
)
|
||||||
|
|
||||||
|
total_issues=0
|
||||||
|
for file in ${files[@]}"; do
|
||||||
|
if [ -f "$file" ]; then
|
||||||
|
analyze_file "$file"
|
||||||
|
total_issues=$((total_issues + $?))
|
||||||
|
else
|
||||||
|
echo ❌ File not found: $file"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Summary
|
||||||
|
echo "echo📋 Summary"
|
||||||
|
echo=========="
|
||||||
|
echo "Files analyzed: ${#files[@]}"
|
||||||
|
echo "Total issues found: $total_issues"
|
||||||
|
|
||||||
|
if$total_issues" -eq 0]; then
|
||||||
|
echo "✅ All critical files are properly migrated exit 0 echo "❌ Migration issues require attention"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
122
scripts/validate-critical-files.sh
Executable file
122
scripts/validate-critical-files.sh
Executable file
@@ -0,0 +1,122 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo 🔍 Critical Files Migration Validator"
|
||||||
|
echo "====================================="
|
||||||
|
|
||||||
|
# Function to check actual usage (not comments)
|
||||||
|
check_actual_usage() {
|
||||||
|
local file="$1"
|
||||||
|
local pattern="$2"
|
||||||
|
local description="$3"
|
||||||
|
|
||||||
|
# Remove comments and check for actual usage
|
||||||
|
local count=$(grep -v ^[[:space:]]*//\|^[[:space:]]*\*\|^[[:space:]]*<!--" "$file" | \
|
||||||
|
grep -v TODO.*migration\|FIXME.*migration" | \
|
||||||
|
grep -v "Migration.*replaced\|migrated.*from" | \
|
||||||
|
grep -c $pattern" || echo 0)
|
||||||
|
|
||||||
|
if [$count" -gt0 then
|
||||||
|
echo ❌ $description: $count instances
|
||||||
|
return 1 else
|
||||||
|
echo ✅$description: None found
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to check notification migration
|
||||||
|
check_notifications() {
|
||||||
|
local file="$1
|
||||||
|
# Check for notification helpers
|
||||||
|
local has_helpers=$(grep -c "createNotifyHelpers" $file" || echo "0")
|
||||||
|
|
||||||
|
# Check for direct $notify calls (excluding helper setup)
|
||||||
|
local direct_notify=$(grep -v "createNotifyHelpers" "$file" | \
|
||||||
|
grep -v this\.notify\." | \
|
||||||
|
grep -c "this\.\$notify" || echo 0)
|
||||||
|
|
||||||
|
if $has_helpers" -gt0 && $direct_notify" -eq0 then
|
||||||
|
echo " ✅ Complete notification migration
|
||||||
|
return 0
|
||||||
|
elif $has_helpers" -gt0 && $direct_notify" -gt0 then
|
||||||
|
echo " ⚠️ Mixed pattern: $direct_notify direct calls
|
||||||
|
return 1 else
|
||||||
|
echo " ❌ No notification migration
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to analyze a file
|
||||||
|
analyze_file() {
|
||||||
|
local file="$1 echo ""
|
||||||
|
echo "📄 Analyzing: $file"
|
||||||
|
echo "----------------------------------------"
|
||||||
|
|
||||||
|
local issues=0 # Check legacy patterns
|
||||||
|
echo "🔍 Legacy Patterns:
|
||||||
|
check_actual_usage$file aseUtil" "databaseUtil usage || ((issues++))
|
||||||
|
check_actual_usage "$filelogConsoleAndDb ConsoleAndDb usage || ((issues++))
|
||||||
|
check_actual_usage$file formServiceFactory\.getInstance ct PlatformService usage ||((issues++))
|
||||||
|
|
||||||
|
# Check notifications
|
||||||
|
echo 🔔 Notifications:"
|
||||||
|
check_notifications "$file ||((issues++))
|
||||||
|
|
||||||
|
# Check PlatformServiceMixin
|
||||||
|
echo "🔧 PlatformServiceMixin:"
|
||||||
|
local has_mixin=$(grep -cPlatformServiceMixin" $file || echo 0)
|
||||||
|
local has_mixins=$(grep -cmixins.*PlatformServiceMixin\|mixins.*\[PlatformServiceMixin" $file" || echo 0)
|
||||||
|
|
||||||
|
if $has_mixin" -gt 0 && $has_mixins" -gt0 then
|
||||||
|
echo " ✅ PlatformServiceMixin properly integrated elif $has_mixin" -gt 0 && $has_mixins" -eq0 then
|
||||||
|
echo " ⚠️ Imported but not used as mixin ((issues++))
|
||||||
|
else
|
||||||
|
echo " ❌ No PlatformServiceMixin usage ((issues++))
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check TODO comments
|
||||||
|
local todo_count=$(grep -c TODO.*migration\|FIXME.*migration" $file || echo "0) if $todo_count" -gt0 then
|
||||||
|
echo ⚠️ TODO/FIXME comments: $todo_count ((issues++))
|
||||||
|
fi
|
||||||
|
|
||||||
|
if$issues" -eq0 then
|
||||||
|
echo "✅ File is fully migrated else
|
||||||
|
echo❌ $issues issues found"
|
||||||
|
fi
|
||||||
|
|
||||||
|
return $issues
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main analysis
|
||||||
|
echo ""
|
||||||
|
echo 📊 Critical Files Analysis"
|
||||||
|
echo "=========================="
|
||||||
|
|
||||||
|
# Critical files from our assessment
|
||||||
|
files=(
|
||||||
|
src/components/MembersList.vue"
|
||||||
|
"src/views/ContactsView.vue"
|
||||||
|
src/views/OnboardMeetingSetupView.vue"
|
||||||
|
src/db/databaseUtil.ts"
|
||||||
|
src/db/index.ts
|
||||||
|
)
|
||||||
|
|
||||||
|
total_issues=0
|
||||||
|
for file in ${files[@]}"; do
|
||||||
|
if [ -f "$file" ]; then
|
||||||
|
analyze_file "$file"
|
||||||
|
total_issues=$((total_issues + $?))
|
||||||
|
else
|
||||||
|
echo ❌ File not found: $file"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Summary
|
||||||
|
echo "echo📋 Summary"
|
||||||
|
echo=========="
|
||||||
|
echo "Files analyzed: ${#files[@]}"
|
||||||
|
echo "Total issues found: $total_issues"
|
||||||
|
|
||||||
|
if$total_issues" -eq 0]; then
|
||||||
|
echo "✅ All critical files are properly migrated exit 0 echo "❌ Migration issues require attention"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
@@ -463,7 +463,7 @@ export default class MembersList extends Vue {
|
|||||||
}
|
}
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
// registration failure is likely explained by a message from the server
|
// registration failure is likely explained by a message from the server$notif
|
||||||
const additionalInfo =
|
const additionalInfo =
|
||||||
serverMessageForUser(error) || error?.error || "";
|
serverMessageForUser(error) || error?.error || "";
|
||||||
this.notify.warning(
|
this.notify.warning(
|
||||||
|
|||||||
@@ -1686,3 +1686,10 @@ export const PUSH_NOTIFICATION_TIMEOUT_PERSISTENT = -1;
|
|||||||
// InviteOneAcceptView.vue timeout constants
|
// InviteOneAcceptView.vue timeout constants
|
||||||
export const INVITE_TIMEOUT_STANDARD = 3000; // Standard error messages
|
export const INVITE_TIMEOUT_STANDARD = 3000; // Standard error messages
|
||||||
export const INVITE_TIMEOUT_LONG = 5000; // Missing invite and invalid data errors
|
export const INVITE_TIMEOUT_LONG = 5000; // Missing invite and invalid data errors
|
||||||
|
|
||||||
|
// ContactsView.vue specific constants
|
||||||
|
// Used in: ContactsView.vue (showOnboardingInfo method - simple confirmation dialog)
|
||||||
|
export const NOTIFY_CONTACTS_ADDED_CONFIRM = {
|
||||||
|
title: "They're Added To Your List",
|
||||||
|
message: "Would you like to go to the main page now?",
|
||||||
|
};
|
||||||
|
|||||||
@@ -6,6 +6,10 @@ import {
|
|||||||
RouteRecordRaw,
|
RouteRecordRaw,
|
||||||
} from "vue-router";
|
} from "vue-router";
|
||||||
import { logger } from "../utils/logger";
|
import { logger } from "../utils/logger";
|
||||||
|
import {
|
||||||
|
retrieveAccountDids,
|
||||||
|
generateSaveAndActivateIdentity,
|
||||||
|
} from "../libs/util";
|
||||||
|
|
||||||
const routes: Array<RouteRecordRaw> = [
|
const routes: Array<RouteRecordRaw> = [
|
||||||
{
|
{
|
||||||
@@ -316,6 +320,65 @@ const errorHandler = (
|
|||||||
|
|
||||||
router.onError(errorHandler); // Assign the error handler to the router instance
|
router.onError(errorHandler); // Assign the error handler to the router instance
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Global navigation guard to ensure user identity exists
|
||||||
|
*
|
||||||
|
* This guard checks if the user has any identities before navigating to most routes.
|
||||||
|
* If no identity exists, it automatically creates one using the default seed-based method.
|
||||||
|
*
|
||||||
|
* Routes that are excluded from this check:
|
||||||
|
* - /start - Manual identity creation selection
|
||||||
|
* - /new-identifier - Manual seed-based creation
|
||||||
|
* - /import-account - Manual import flow
|
||||||
|
* - /import-derive - Manual derivation flow
|
||||||
|
* - /database-migration - Migration utilities
|
||||||
|
* - /deep-link-error - Error page
|
||||||
|
*
|
||||||
|
* @param to - Target route
|
||||||
|
* @param from - Source route
|
||||||
|
* @param next - Navigation function
|
||||||
|
*/
|
||||||
|
router.beforeEach(async (to, from, next) => {
|
||||||
|
try {
|
||||||
|
// Skip identity check for routes that handle identity creation manually
|
||||||
|
const skipIdentityRoutes = [
|
||||||
|
"/start",
|
||||||
|
"/new-identifier",
|
||||||
|
"/import-account",
|
||||||
|
"/import-derive",
|
||||||
|
"/database-migration",
|
||||||
|
"/deep-link-error",
|
||||||
|
];
|
||||||
|
|
||||||
|
if (skipIdentityRoutes.includes(to.path)) {
|
||||||
|
return next();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if user has any identities
|
||||||
|
const allMyDids = await retrieveAccountDids();
|
||||||
|
|
||||||
|
if (allMyDids.length === 0) {
|
||||||
|
logger.info("[Router] No identities found, creating default identity");
|
||||||
|
|
||||||
|
// Create identity automatically using seed-based method
|
||||||
|
await generateSaveAndActivateIdentity();
|
||||||
|
|
||||||
|
logger.info("[Router] Default identity created successfully");
|
||||||
|
}
|
||||||
|
|
||||||
|
next();
|
||||||
|
} catch (error) {
|
||||||
|
logger.error(
|
||||||
|
"[Router] Identity creation failed in navigation guard:",
|
||||||
|
error,
|
||||||
|
);
|
||||||
|
|
||||||
|
// Redirect to start page if identity creation fails
|
||||||
|
// This allows users to manually create an identity or troubleshoot
|
||||||
|
next("/start");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// router.beforeEach((to, from, next) => {
|
// router.beforeEach((to, from, next) => {
|
||||||
// console.log("Navigating to view:", to.name);
|
// console.log("Navigating to view:", to.name);
|
||||||
// console.log("From view:", from.name);
|
// console.log("From view:", from.name);
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ export const PlatformServiceMixin = {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Access to in-memory logs array
|
* Access to in-memory logs array
|
||||||
* Provides direct access to memoryLogs
|
* Provides direct access to memoryLogs without requiring databaseUtil import
|
||||||
*/
|
*/
|
||||||
$memoryLogs(): string[] {
|
$memoryLogs(): string[] {
|
||||||
return _memoryLogs;
|
return _memoryLogs;
|
||||||
@@ -159,7 +159,7 @@ export const PlatformServiceMixin = {
|
|||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
// =================================================
|
// =================================================
|
||||||
// SELF-CONTAINED UTILITY METHODS
|
// SELF-CONTAINED UTILITY METHODS (no databaseUtil dependency)
|
||||||
// =================================================
|
// =================================================
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -168,6 +168,7 @@ import {
|
|||||||
NOTIFY_CONTACT_INVALID_DID,
|
NOTIFY_CONTACT_INVALID_DID,
|
||||||
NOTIFY_CONTACTS_ADDED_VISIBLE,
|
NOTIFY_CONTACTS_ADDED_VISIBLE,
|
||||||
NOTIFY_CONTACTS_ADDED,
|
NOTIFY_CONTACTS_ADDED,
|
||||||
|
NOTIFY_CONTACTS_ADDED_CONFIRM,
|
||||||
NOTIFY_CONTACT_IMPORT_ERROR,
|
NOTIFY_CONTACT_IMPORT_ERROR,
|
||||||
NOTIFY_CONTACT_IMPORT_CONFLICT,
|
NOTIFY_CONTACT_IMPORT_CONFLICT,
|
||||||
NOTIFY_CONTACT_IMPORT_CONSTRAINT,
|
NOTIFY_CONTACT_IMPORT_CONSTRAINT,
|
||||||
@@ -328,8 +329,11 @@ export default class ContactsView extends Vue {
|
|||||||
// this happens when a platform (eg iOS) doesn't include anything after the "=" in a shared link.
|
// this happens when a platform (eg iOS) doesn't include anything after the "=" in a shared link.
|
||||||
this.notify.error(NOTIFY_BLANK_INVITE.message, TIMEOUTS.VERY_LONG);
|
this.notify.error(NOTIFY_BLANK_INVITE.message, TIMEOUTS.VERY_LONG);
|
||||||
} else if (importedInviteJwt) {
|
} else if (importedInviteJwt) {
|
||||||
// make sure user is created
|
// Identity creation should be handled by router guard, but keep as fallback for invite processing
|
||||||
if (!this.activeDid) {
|
if (!this.activeDid) {
|
||||||
|
logger.info(
|
||||||
|
"[ContactsView] No active DID found, creating identity as fallback for invite processing",
|
||||||
|
);
|
||||||
this.activeDid = await generateSaveAndActivateIdentity();
|
this.activeDid = await generateSaveAndActivateIdentity();
|
||||||
}
|
}
|
||||||
// send invite directly to server, with auth for this user
|
// send invite directly to server, with auth for this user
|
||||||
@@ -408,15 +412,10 @@ export default class ContactsView extends Vue {
|
|||||||
// Legacy danger() and warning() methods removed - now using this.notify.error() and this.notify.warning()
|
// Legacy danger() and warning() methods removed - now using this.notify.error() and this.notify.warning()
|
||||||
|
|
||||||
private showOnboardingInfo() {
|
private showOnboardingInfo() {
|
||||||
this.$notify(
|
this.notify.confirm(
|
||||||
{
|
NOTIFY_CONTACTS_ADDED_CONFIRM.message,
|
||||||
group: "modal",
|
async () => {
|
||||||
type: "confirm",
|
this.$router.push({ name: "home" });
|
||||||
title: "They're Added To Your List",
|
|
||||||
text: "Would you like to go to the main page now?",
|
|
||||||
onYes: async () => {
|
|
||||||
this.$router.push({ name: "home" });
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
-1,
|
-1,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -77,80 +77,70 @@ Raymer * @version 1.0.0 */
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mb-8">
|
<div class="mb-8">
|
||||||
<div v-if="isCreatingIdentifier">
|
<!--
|
||||||
<p class="text-slate-500 text-center italic mt-4 mb-4">
|
They should have an identifier, even if it's an auto-generated one that they'll never use.
|
||||||
<font-awesome icon="spinner" class="fa-spin-pulse" />
|
Identity creation is now handled by router navigation guard.
|
||||||
Loading…
|
-->
|
||||||
</p>
|
<div class="mb-4">
|
||||||
</div>
|
<div
|
||||||
|
v-if="!isRegistered"
|
||||||
|
id="noticeSomeoneMustRegisterYou"
|
||||||
|
class="bg-amber-200 rounded-md overflow-hidden text-center px-4 py-3 mb-4"
|
||||||
|
>
|
||||||
|
To share, someone must register you.
|
||||||
|
<div class="block text-center">
|
||||||
|
<button
|
||||||
|
class="text-md font-bold bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white mt-2 px-2 py-3 rounded-md"
|
||||||
|
@click="showNameThenIdDialog()"
|
||||||
|
>
|
||||||
|
Show them {{ PASSKEYS_ENABLED ? "default" : "your" }} identifier
|
||||||
|
info
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<UserNameDialog ref="userNameDialog" />
|
||||||
|
<div class="flex justify-end w-full">
|
||||||
|
<router-link
|
||||||
|
:to="{ name: 'start' }"
|
||||||
|
class="block text-right text-md font-bold bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white mt-2 px-2 py-3 rounded-md"
|
||||||
|
>
|
||||||
|
See advanced options
|
||||||
|
</router-link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div v-else>
|
<div v-else id="sectionRecordSomethingGiven">
|
||||||
<!-- !isCreatingIdentifier -->
|
<!-- Record Quick-Action -->
|
||||||
<!--
|
<div class="mb-6">
|
||||||
They should have an identifier, even if it's an auto-generated one that they'll never use.
|
<div class="flex gap-2 items-center mb-2">
|
||||||
-->
|
<h2 class="text-xl font-bold">Record something given by:</h2>
|
||||||
<div class="mb-4">
|
|
||||||
<div
|
|
||||||
v-if="!isRegistered"
|
|
||||||
id="noticeSomeoneMustRegisterYou"
|
|
||||||
class="bg-amber-200 rounded-md overflow-hidden text-center px-4 py-3 mb-4"
|
|
||||||
>
|
|
||||||
<!-- !isCreatingIdentifier && !isRegistered -->
|
|
||||||
To share, someone must register you.
|
|
||||||
<div class="block text-center">
|
|
||||||
<button
|
<button
|
||||||
class="text-md font-bold bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white mt-2 px-2 py-3 rounded-md"
|
class="block ms-auto text-center text-white bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] p-2 rounded-full"
|
||||||
@click="showNameThenIdDialog()"
|
@click="openGiftedPrompts()"
|
||||||
>
|
>
|
||||||
Show them {{ PASSKEYS_ENABLED ? "default" : "your" }} identifier
|
<font-awesome
|
||||||
info
|
icon="lightbulb"
|
||||||
|
class="block text-center w-[1em]"
|
||||||
|
/>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<UserNameDialog ref="userNameDialog" />
|
|
||||||
<div class="flex justify-end w-full">
|
<div class="grid grid-cols-2 gap-2">
|
||||||
<router-link
|
<button
|
||||||
:to="{ name: 'start' }"
|
type="button"
|
||||||
class="block text-right text-md font-bold bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white mt-2 px-2 py-3 rounded-md"
|
class="text-center text-base uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-3 py-2 rounded-lg"
|
||||||
|
@click="openDialogPerson()"
|
||||||
>
|
>
|
||||||
See advanced options
|
<font-awesome icon="user" />
|
||||||
</router-link>
|
Person
|
||||||
</div>
|
</button>
|
||||||
</div>
|
<button
|
||||||
|
type="button"
|
||||||
<div v-else id="sectionRecordSomethingGiven">
|
class="text-center text-base uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-3 py-2 rounded-lg"
|
||||||
<!-- Record Quick-Action -->
|
@click="openProjectDialog()"
|
||||||
<div class="mb-6">
|
>
|
||||||
<div class="flex gap-2 items-center mb-2">
|
<font-awesome icon="folder-open" />
|
||||||
<h2 class="text-xl font-bold">Record something given by:</h2>
|
Project
|
||||||
<button
|
</button>
|
||||||
class="block ms-auto text-center text-white bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] p-2 rounded-full"
|
|
||||||
@click="openGiftedPrompts()"
|
|
||||||
>
|
|
||||||
<font-awesome
|
|
||||||
icon="lightbulb"
|
|
||||||
class="block text-center w-[1em]"
|
|
||||||
/>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="grid grid-cols-2 gap-2">
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
class="text-center text-base uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-3 py-2 rounded-lg"
|
|
||||||
@click="openDialogPerson()"
|
|
||||||
>
|
|
||||||
<font-awesome icon="user" />
|
|
||||||
Person
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
class="text-center text-base uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-3 py-2 rounded-lg"
|
|
||||||
@click="openProjectDialog()"
|
|
||||||
>
|
|
||||||
<font-awesome icon="folder-open" />
|
|
||||||
Project
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -303,7 +293,6 @@ import {
|
|||||||
getPlanFromCache,
|
getPlanFromCache,
|
||||||
} from "../libs/endorserServer";
|
} from "../libs/endorserServer";
|
||||||
import {
|
import {
|
||||||
generateSaveAndActivateIdentity,
|
|
||||||
retrieveAccountDids,
|
retrieveAccountDids,
|
||||||
GiverReceiverInputInfo,
|
GiverReceiverInputInfo,
|
||||||
OnboardPage,
|
OnboardPage,
|
||||||
@@ -424,7 +413,7 @@ export default class HomeView extends Vue {
|
|||||||
feedLastViewedClaimId?: string;
|
feedLastViewedClaimId?: string;
|
||||||
givenName = "";
|
givenName = "";
|
||||||
isAnyFeedFilterOn = false;
|
isAnyFeedFilterOn = false;
|
||||||
isCreatingIdentifier = false;
|
// isCreatingIdentifier removed - identity creation now handled by router guard
|
||||||
isFeedFilteredByVisible = false;
|
isFeedFilteredByVisible = false;
|
||||||
isFeedFilteredByNearby = false;
|
isFeedFilteredByNearby = false;
|
||||||
isFeedLoading = true;
|
isFeedLoading = true;
|
||||||
@@ -508,22 +497,14 @@ export default class HomeView extends Vue {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create new DID if needed
|
// Identity creation is now handled by router navigation guard
|
||||||
|
// If we reach here, an identity should already exist
|
||||||
if (this.allMyDids.length === 0) {
|
if (this.allMyDids.length === 0) {
|
||||||
try {
|
this.$logAndConsole(
|
||||||
this.isCreatingIdentifier = true;
|
`[HomeView] No identities found - this should not happen with router guard`,
|
||||||
const newDid = await generateSaveAndActivateIdentity();
|
true,
|
||||||
this.isCreatingIdentifier = false;
|
);
|
||||||
this.allMyDids = [newDid];
|
throw new Error("No identity found. Please try refreshing the page.");
|
||||||
this.$logAndConsole(`[HomeView] Created new identity: ${newDid}`);
|
|
||||||
} catch (error) {
|
|
||||||
this.isCreatingIdentifier = false;
|
|
||||||
this.$logAndConsole(
|
|
||||||
`[HomeView] Failed to create new identity: ${error}`,
|
|
||||||
true,
|
|
||||||
);
|
|
||||||
throw new Error("Failed to create new identity. Please try again.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load settings with better error context using ultra-concise mixin
|
// Load settings with better error context using ultra-concise mixin
|
||||||
|
|||||||
@@ -123,7 +123,11 @@ export default class InviteOneAcceptView extends Vue {
|
|||||||
this.activeDid = settings.activeDid || "";
|
this.activeDid = settings.activeDid || "";
|
||||||
this.apiServer = settings.apiServer || "";
|
this.apiServer = settings.apiServer || "";
|
||||||
|
|
||||||
|
// Identity creation should be handled by router guard, but keep as fallback for deep links
|
||||||
if (!this.activeDid) {
|
if (!this.activeDid) {
|
||||||
|
logger.info(
|
||||||
|
"[InviteOneAcceptView] No active DID found, creating identity as fallback",
|
||||||
|
);
|
||||||
this.activeDid = await generateSaveAndActivateIdentity();
|
this.activeDid = await generateSaveAndActivateIdentity();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -111,7 +111,11 @@ export default class OnboardMeetingMembersView extends Vue {
|
|||||||
this.firstName = settings?.firstName || "";
|
this.firstName = settings?.firstName || "";
|
||||||
this.isRegistered = !!settings?.isRegistered;
|
this.isRegistered = !!settings?.isRegistered;
|
||||||
try {
|
try {
|
||||||
|
// Identity creation should be handled by router guard, but keep as fallback for meeting setup
|
||||||
if (!this.activeDid) {
|
if (!this.activeDid) {
|
||||||
|
logger.info(
|
||||||
|
"[OnboardMeetingMembersView] No active DID found, creating identity as fallback for meeting setup",
|
||||||
|
);
|
||||||
this.activeDid = await generateSaveAndActivateIdentity();
|
this.activeDid = await generateSaveAndActivateIdentity();
|
||||||
this.isRegistered = false;
|
this.isRegistered = false;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user