Add contractor sharing feature and move settings to navigation bar

Contractor Sharing:
- Add .casera file format for sharing contractors between users
- Create SharedContractor model with JSON serialization
- Implement ContractorSharingManager for iOS (Swift) and Android (Kotlin)
- Register .casera file type in iOS Info.plist and Android manifest
- Add share button to ContractorDetailView (iOS) and ContractorDetailScreen (Android)
- Add import confirmation, success, and error dialogs
- Create expect/actual platform implementations for sharing and import handling

Navigation Changes:
- Remove Profile tab from bottom tab bar (iOS and Android)
- Add settings gear icon to left side of "My Properties" title
- Settings gear opens Profile/Settings screen as sheet (iOS) or navigates (Android)
- Add property button to top right action bar

Bug Fixes:
- Fix ResidenceUsersResponse to match API's flat array response format
- Fix GenerateShareCodeResponse handling to access nested shareCode property
- Update ManageUsersDialog to accept residenceOwnerId parameter

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Trey t
2025-12-05 22:30:19 -06:00
parent 2965ec4031
commit 859a6679ed
43 changed files with 1848 additions and 148 deletions
+49 -4
View File
@@ -39,6 +39,10 @@
}
}
},
"%@ has been added to your contacts." : {
"comment" : "A message displayed when a contractor is successfully imported to the user's contacts. The placeholder is replaced with the name of the imported contractor.",
"isCommentAutoGenerated" : true
},
"%@, %@" : {
"comment" : "A city and state combination.",
"isCommentAutoGenerated" : true,
@@ -4747,6 +4751,17 @@
}
}
},
"common_import" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Import"
}
}
}
},
"common_loading" : {
"extractionState" : "manual",
"localizations" : {
@@ -5072,6 +5087,17 @@
}
}
},
"common_share" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Share"
}
}
}
},
"common_success" : {
"extractionState" : "manual",
"localizations" : {
@@ -5229,6 +5255,9 @@
},
"Continue with Free" : {
},
"Contractor Imported" : {
},
"Contractors" : {
"comment" : "A tab label for the contractors section.",
@@ -17315,6 +17344,18 @@
}
}
},
"Import" : {
"comment" : "The text on a button that triggers the import action.",
"isCommentAutoGenerated" : true
},
"Import Contractor" : {
"comment" : "The title of an alert dialog that appears when a user attempts to import a contractor.",
"isCommentAutoGenerated" : true
},
"Import Failed" : {
"comment" : "A dialog title when importing a contractor fails.",
"isCommentAutoGenerated" : true
},
"In Progress" : {
"comment" : "A label displayed next to an image of a play button, indicating that a task is currently in progress.",
"isCommentAutoGenerated" : true
@@ -17381,6 +17422,10 @@
"comment" : "A message displayed when no task templates match a search query.",
"isCommentAutoGenerated" : true
},
"OK" : {
"comment" : "A button that dismisses the success dialog.",
"isCommentAutoGenerated" : true
},
"or" : {
},
@@ -17406,10 +17451,6 @@
"comment" : "The title of the \"Pro\" plan in the feature comparison view.",
"isCommentAutoGenerated" : true
},
"Profile" : {
"comment" : "A label for the \"Profile\" tab in the main tab view.",
"isCommentAutoGenerated" : true
},
"profile_account" : {
"extractionState" : "manual",
"localizations" : {
@@ -29636,6 +29677,10 @@
"comment" : "The title of the welcome screen in the preview.",
"isCommentAutoGenerated" : true
},
"Would you like to import this contractor to your contacts?" : {
"comment" : "A message displayed in an alert when a user imports a contractor.",
"isCommentAutoGenerated" : true
},
"You now have full access to all Pro features!" : {
"comment" : "A message displayed to users after successfully upgrading to the Pro version of the app.",
"isCommentAutoGenerated" : true