Total rebrand across KMM project: - Kotlin package: com.example.casera -> com.tt.honeyDue (dirs + declarations) - Gradle: rootProject.name, namespace, applicationId - Android: manifest, strings.xml (all languages), widget resources - iOS: pbxproj bundle IDs, Info.plist, entitlements, xcconfig - iOS directories: Casera/ -> HoneyDue/, CaseraTests/ -> HoneyDueTests/, etc. - Swift source: all class/struct/enum renames - Deep links: casera:// -> honeydue://, .casera -> .honeydue - App icons replaced with honeyDue honeycomb icon - Domains: casera.treytartt.com -> honeyDue.treytartt.com - Bundle IDs: com.tt.casera -> com.tt.honeyDue - Database table names preserved Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
4.2 KiB
Accessibility Identifiers - Duplicate Fix
Issue
The original AccessibilityIdentifiers.swift file had duplicate cancelButton declarations within the same struct, causing a compiler error:
Invalid redeclaration of 'cancelButton'
Root Cause
Multiple forms within the same feature area (e.g., Task) had cancel buttons, and they were all named cancelButton:
Task.cancelButton(line 103) - for TaskFormTask.cancelButton(line 111) - for TaskDetail
This occurred in multiple structs:
Authentication.cancelButton(Register)Residence.cancelButton(Form)Task.cancelButton(Form) ❌ DuplicateTask.cancelButton(Detail) ❌ DuplicateContractor.cancelButton(Form)Document.cancelButton(Form)Alert.cancelButton(Generic alerts)
Solution
Renamed context-specific cancel buttons to be more descriptive:
Authentication Struct
// Before
static let cancelButton = "Register.CancelButton"
// After
static let registerCancelButton = "Register.CancelButton"
Residence Struct
// Before
static let cancelButton = "ResidenceForm.CancelButton"
// After
static let formCancelButton = "ResidenceForm.CancelButton"
Task Struct
// Before (DUPLICATE ERROR)
static let cancelButton = "TaskForm.CancelButton" // Line 103
static let cancelButton = "TaskDetail.CancelButton" // Line 111 ❌
// After (FIXED)
static let formCancelButton = "TaskForm.CancelButton"
static let detailCancelButton = "TaskDetail.CancelButton"
Contractor Struct
// Before
static let cancelButton = "ContractorForm.CancelButton"
// After
static let formCancelButton = "ContractorForm.CancelButton"
Document Struct
// Before
static let cancelButton = "DocumentForm.CancelButton"
// After
static let formCancelButton = "DocumentForm.CancelButton"
Alert Struct (Unchanged)
// Generic cancel button for alerts - no conflict
static let cancelButton = "Alert.CancelButton"
Files Modified
-
iosApp/Helpers/AccessibilityIdentifiers.swift- Renamed 6 cancel button identifiers to be context-specific
-
iosApp/HoneyDueTests/ComprehensiveResidenceTests.swift- Updated reference from
Residence.cancelButton→Residence.formCancelButton
- Updated reference from
Usage Examples
Before (Would cause conflicts)
// Task Form
Button("Cancel") { }
.accessibilityIdentifier(AccessibilityIdentifiers.Task.cancelButton) // ❌ Which one?
// Task Detail
Button("Cancel") { }
.accessibilityIdentifier(AccessibilityIdentifiers.Task.cancelButton) // ❌ Duplicate!
After (Clear and unambiguous)
// Task Form
Button("Cancel") { }
.accessibilityIdentifier(AccessibilityIdentifiers.Task.formCancelButton) // ✅ Clear
// Task Detail
Button("Cancel") { }
.accessibilityIdentifier(AccessibilityIdentifiers.Task.detailCancelButton) // ✅ Clear
Naming Convention
For cancel buttons in different contexts:
- Forms:
formCancelButton - Detail/View screens:
detailCancelButton - Registration:
registerCancelButton - Generic alerts:
cancelButton(in Alert struct)
Test Updates Required
When adding identifiers to views, use the updated names:
// Residence Form
Button("Cancel") { dismiss() }
.accessibilityIdentifier(AccessibilityIdentifiers.Residence.formCancelButton)
// Task Form
Button("Cancel") { dismiss() }
.accessibilityIdentifier(AccessibilityIdentifiers.Task.formCancelButton)
// Task Detail
Button("Cancel Task") { }
.accessibilityIdentifier(AccessibilityIdentifiers.Task.detailCancelButton)
Verification
The file should now compile without errors. To verify:
cd /Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp
xcodebuild -project iosApp.xcodeproj -scheme iosApp -destination 'generic/platform=iOS Simulator' clean build
Or simply build in Xcode (⌘+B).
Status
✅ Fixed - All duplicate identifiers resolved ✅ Test files updated - ComprehensiveResidenceTests uses new names ✅ No breaking changes - Only internal identifier names changed, not the actual string values
Last Updated: November 18, 2025 Issue: Duplicate cancelButton declarations Resolution: Renamed to context-specific names (formCancelButton, detailCancelButton, etc.)