Release 1.2.1: iCloud sync improvements + ASO multilingual metadata
iCloud sync: - Force viewContext.refreshAllObjects() on remote change notifications so data from other devices is picked up immediately without app restart - Call refreshFromCloudKit() on foreground to merge any changes made while the device was inactive - Wait up to 10s for initial CloudKit sync on launch before showing onboarding (shows "Checking iCloud..." during the wait) - New OnboardingICloudCheckView: shown on fresh installs with iCloud available, lets user restore from iCloud before starting onboarding from scratch Localization: - Added de, fr, it, ja, pt-BR lproj folders - New iCloud onboarding strings in en + es-ES (+ button literals) ASO metadata (fastlane): - Updated en-US: new subtitle, keywords, description (fixed "no cloud sync" claim), promotional text, release notes - Added full metadata for es-ES, de-DE, fr-FR, it, ja, pt-BR (63 files total) - All keyword fields validated ≤100 Unicode chars Infrastructure: - Gemfile + Gemfile.lock for fastlane - Scripts/archive_and_upload_appstore.sh for CI/CD Version: 1.2.1 (build 7) Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -518,6 +518,28 @@ struct EvolutionChartView: View {
|
||||
var id: String { rawValue }
|
||||
}
|
||||
|
||||
private static let compactXAxisDateFormatter: DateFormatter = {
|
||||
let formatter = DateFormatter()
|
||||
formatter.locale = .autoupdatingCurrent
|
||||
formatter.setLocalizedDateFormatFromTemplate("MMM yy")
|
||||
return formatter
|
||||
}()
|
||||
|
||||
private var xAxisMonthStride: Int {
|
||||
switch data.count {
|
||||
case ...8:
|
||||
return 1
|
||||
case ...16:
|
||||
return 2
|
||||
case ...30:
|
||||
return 3
|
||||
case ...48:
|
||||
return 4
|
||||
default:
|
||||
return 6
|
||||
}
|
||||
}
|
||||
|
||||
private var stackedCategoryData: [CategoryEvolutionPoint] {
|
||||
guard !categoryData.isEmpty else { return [] }
|
||||
|
||||
@@ -622,8 +644,17 @@ struct EvolutionChartView: View {
|
||||
}
|
||||
.chartForegroundStyleScale(domain: chartCategoryNames, range: chartCategoryColors)
|
||||
.chartXAxis {
|
||||
AxisMarks(values: .stride(by: .month, count: 2)) { value in
|
||||
AxisValueLabel(format: .dateTime.month(.abbreviated).year())
|
||||
AxisMarks(values: .stride(by: .month, count: xAxisMonthStride)) { value in
|
||||
AxisGridLine(stroke: StrokeStyle(lineWidth: 0.8, dash: [3, 3]))
|
||||
.foregroundStyle(Color.secondary.opacity(0.2))
|
||||
AxisTick(stroke: StrokeStyle(lineWidth: 0.8))
|
||||
.foregroundStyle(Color.secondary.opacity(0.28))
|
||||
AxisValueLabel {
|
||||
if let date = value.as(Date.self) {
|
||||
Text(date, formatter: Self.compactXAxisDateFormatter)
|
||||
.font(.caption2)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.chartYAxis {
|
||||
|
||||
Reference in New Issue
Block a user