# ContactQRScanFullView.vue Enhanced Triple Migration Pattern Pre-Migration Audit **Migration Candidate:** `src/views/ContactQRScanFullView.vue` **Audit Date:** 2025-07-09 **Status:** 🔄 **PRE-MIGRATION AUDIT** **Risk Level:** High (complex QR scanner with database operations) **File Size:** 636 lines **Estimated Time:** 20-30 minutes --- ## 🔍 **Component Overview** ContactQRScanFullView.vue is a full-screen QR code scanner component that enables users to scan contact QR codes and add them to their contact database. It provides comprehensive QR code scanning functionality with camera management, JWT processing, and contact storage operations. ### **Core Functionality** 1. **QR Code Scanning**: Full-screen camera scanner with mobile-optimized debouncing 2. **Contact Processing**: JWT and CSV contact format processing 3. **Database Operations**: Contact existence checking and insertion 4. **Visibility Management**: Contact visibility setting through endorser API 5. **QR Code Generation**: User's own contact QR code display 6. **Camera Management**: Permissions, lifecycle management, and error handling ### **User Experience Impact** - **Critical**: Primary method for adding contacts via QR codes - **Platform-Specific**: Different behavior on mobile vs web platforms - **Permission-Dependent**: Requires camera permissions for functionality - **Performance-Sensitive**: Real-time camera processing with debouncing --- ## 📋 **Enhanced Triple Migration Pattern Analysis** ### **📊 Phase 1: Database Migration (Estimated: 10-15 minutes)** **Target:** Replace legacy database patterns with PlatformServiceMixin **Legacy Patterns Found:** - ✅ **databaseUtil Import**: `import * as databaseUtil from "../db/databaseUtil";` - ✅ **Settings Retrieval**: `databaseUtil.retrieveSettingsForActiveAccount()` in `created()` - ✅ **Data Mapping**: `databaseUtil.mapQueryResultToValues()` in `addNewContact()` - ✅ **SQL Generation**: `databaseUtil.generateInsertStatement()` in `addNewContact()` - ✅ **JSON Parsing**: `parseJsonField` from databaseUtil - ✅ **Direct Platform Service**: `PlatformServiceFactory.getInstance()` calls - ✅ **Raw SQL Queries**: Direct `dbQuery()` and `dbExec()` calls **Migration Actions Required:** 1. Add PlatformServiceMixin to component mixins 2. Replace `databaseUtil.retrieveSettingsForActiveAccount()` with `this.$accountSettings()` 3. Replace `databaseUtil.mapQueryResultToValues()` with service methods 4. Replace `databaseUtil.generateInsertStatement()` with `this.$insertContact()` 5. Replace `parseJsonField` with service layer JSON handling 6. Replace direct platform service calls with mixin methods 7. Replace raw SQL queries with service methods like `this.$getContact()` 8. Remove legacy database imports 9. Add comprehensive component documentation **Impact:** Major modernization of database access patterns, improved type safety and error handling --- ### **📊 Phase 2: SQL Abstraction (Estimated: 5-8 minutes)** **Target:** Replace raw SQL queries with service methods **Current SQL Patterns Found:** - ✅ **Raw SELECT Query**: `"SELECT * FROM contacts WHERE did = ?"` in `addNewContact()` - ✅ **Dynamic INSERT**: Generated SQL insert statement for contacts table - ✅ **Direct Database Calls**: `platformService.dbQuery()` and `platformService.dbExec()` **Migration Actions Required:** 1. Replace `SELECT * FROM contacts WHERE did = ?` with `this.$getContact(did)` 2. Replace generated INSERT statement with `this.$insertContact(contact)` 3. Replace direct database calls with service layer methods 4. Ensure proper error handling for service operations 5. Add validation for contact data before insertion **Impact:** Eliminate SQL injection risks, improve maintainability, standardize database operations --- ### **📊 Phase 3: Notification Migration (Estimated: 5-7 minutes)** **Target:** Replace $notify calls with helper methods + centralized constants **Current Notification Patterns:** ```typescript // 🔴 Direct $notify calls with object syntax this.$notify({ group: "alert", type: "danger", title: "Initialization Error", text: "Failed to initialize QR scanner. Please try again.", }); // 🔴 Hard-coded timeout values this.$notify(notification, 5000); this.$notify(notification, 3000); this.$notify(notification, 2000); ``` **Notification Types Found:** - `danger`: Initialization errors, invalid QR codes, contact errors - `warning`: HTTPS required, camera permission denied, contact exists - `success`: Contact added successfully - `info`: QR code help, DID copied - `toast`: Contact URL copied **Migration Actions Required:** 1. Add notification constants to `src/constants/notifications.ts`: - `NOTIFY_QR_SCANNER_INIT_ERROR` - `NOTIFY_QR_SCANNER_HTTPS_REQUIRED` - `NOTIFY_QR_SCANNER_PERMISSION_DENIED` - `NOTIFY_QR_INVALID_CODE` - `NOTIFY_QR_CONTACT_EXISTS` - `NOTIFY_QR_CONTACT_ADDED` - `NOTIFY_QR_CONTACT_ERROR` - `NOTIFY_QR_HELP_INFO` - `NOTIFY_QR_DID_COPIED` - `NOTIFY_QR_URL_COPIED` 2. Import `createNotifyHelpers` from constants 3. Replace all direct `$notify` calls with helper methods 4. Add timeout constants for consistent timing 5. Create helper functions for complex notification scenarios **Impact:** Centralized notification management, consistent messaging, improved maintainability --- ### **📊 Phase 4: Template Streamlining (Estimated: 3-5 minutes)** **Target:** Extract complex template logic to computed properties and methods **Current Template Analysis:** The component template is relatively clean with primarily basic bindings and event handlers. Main areas for improvement: ```vue @click="handleBack()" @click="toastQRCodeHelp()" @click="onCopyUrlToClipboard()" @click="onCopyDidToClipboard()" @click="openUserNameDialog()" @click="startScanning()" @click="stopScanning()"