From 790b07896f4f484e614f8b9ff9027dbd087d3313 Mon Sep 17 00:00:00 2001 From: jay-jay-lama Date: Thu, 28 Aug 2025 14:15:32 +0200 Subject: [PATCH 1/4] Added MainActor marks --- Sources/Public/Extensions/Public+View.swift | 2 +- .../View Protocols/Public+DayView.swift | 28 +++++++++---------- .../View Protocols/Public+MonthLabel.swift | 6 ++-- .../View Protocols/Public+WeekdayLabel.swift | 6 ++-- .../View Protocols/Public+WeekdaysView.swift | 12 ++++---- 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/Sources/Public/Extensions/Public+View.swift b/Sources/Public/Extensions/Public+View.swift index 5097762..0d15b49 100644 --- a/Sources/Public/Extensions/Public+View.swift +++ b/Sources/Public/Extensions/Public+View.swift @@ -12,5 +12,5 @@ import SwiftUI public extension View { - func erased() -> AnyView { .init(self) } + @MainActor func erased() -> AnyView { .init(self) } } diff --git a/Sources/Public/View Protocols/Public+DayView.swift b/Sources/Public/View Protocols/Public+DayView.swift index d7c080e..37d927c 100644 --- a/Sources/Public/View Protocols/Public+DayView.swift +++ b/Sources/Public/View Protocols/Public+DayView.swift @@ -19,10 +19,10 @@ public protocol DayView: View { var selectedRange: Binding? { get } // MARK: View Customisation - func createContent() -> AnyView - func createDayLabel() -> AnyView - func createSelectionView() -> AnyView - func createRangeSelectionView() -> AnyView + @MainActor func createContent() -> AnyView + @MainActor func createDayLabel() -> AnyView + @MainActor func createSelectionView() -> AnyView + @MainActor func createRangeSelectionView() -> AnyView // MARK: Logic func onAppear() @@ -31,29 +31,29 @@ public protocol DayView: View { // MARK: - Default View Implementation public extension DayView { - func createContent() -> AnyView { createDefaultContent().erased() } - func createDayLabel() -> AnyView { createDefaultDayLabel().erased() } - func createSelectionView() -> AnyView { createDefaultSelectionView().erased() } - func createRangeSelectionView() -> AnyView { createDefaultRangeSelectionView().erased() } + @MainActor func createContent() -> AnyView { createDefaultContent().erased() } + @MainActor func createDayLabel() -> AnyView { createDefaultDayLabel().erased() } + @MainActor func createSelectionView() -> AnyView { createDefaultSelectionView().erased() } + @MainActor func createRangeSelectionView() -> AnyView { createDefaultRangeSelectionView().erased() } } private extension DayView { - func createDefaultContent() -> some View { ZStack { + @MainActor func createDefaultContent() -> some View { ZStack { createSelectionView() createRangeSelectionView() createDayLabel() }} - func createDefaultDayLabel() -> some View { + @MainActor func createDefaultDayLabel() -> some View { Text(getStringFromDay(format: "d")) .font(.system(size: 14, weight: .medium)) .foregroundColor(isSelected() ? .backgroundPrimary : .onBackgroundPrimary) } - func createDefaultSelectionView() -> some View { + @MainActor func createDefaultSelectionView() -> some View { Circle() .fill(Color.onBackgroundPrimary) .transition(.asymmetric(insertion: .scale(scale: 0.52).combined(with: .opacity), removal: .opacity)) .active(if: isSelected()) } - func createDefaultRangeSelectionView() -> some View { + @MainActor func createDefaultRangeSelectionView() -> some View { RoundedRectangle(corners: rangeSelectionViewCorners) .fill(Color.onBackgroundPrimary.opacity(0.12)) .transition(.opacity) @@ -103,13 +103,13 @@ public extension DayView { // MARK: - Others public extension DayView { - var body: some View { Group { + @MainActor var body: some View { Group { if isCurrentMonth { createBodyForCurrentMonth() } else { createBodyForOtherMonth() } }} } private extension DayView { - func createBodyForCurrentMonth() -> some View { + @MainActor func createBodyForCurrentMonth() -> some View { createContent() .frame(maxWidth: .infinity, maxHeight: .infinity) .aspectRatio(1.0, contentMode: .fit) diff --git a/Sources/Public/View Protocols/Public+MonthLabel.swift b/Sources/Public/View Protocols/Public+MonthLabel.swift index c8019d8..d645694 100644 --- a/Sources/Public/View Protocols/Public+MonthLabel.swift +++ b/Sources/Public/View Protocols/Public+MonthLabel.swift @@ -15,12 +15,12 @@ public protocol MonthLabel: View { var month: Date { get } // MARK: View Customisation - func createContent() -> AnyView + @MainActor func createContent() -> AnyView } // MARK: - Default View Implementation public extension MonthLabel { - func createContent() -> AnyView { createDefaultContent().erased() } + @MainActor func createContent() -> AnyView { createDefaultContent().erased() } } private extension MonthLabel { func createDefaultContent() -> some View { @@ -38,5 +38,5 @@ public extension MonthLabel { // MARK: - Others public extension MonthLabel { - var body: some View { createContent() } + @MainActor var body: some View { createContent() } } diff --git a/Sources/Public/View Protocols/Public+WeekdayLabel.swift b/Sources/Public/View Protocols/Public+WeekdayLabel.swift index 7e793b1..3bd76fe 100644 --- a/Sources/Public/View Protocols/Public+WeekdayLabel.swift +++ b/Sources/Public/View Protocols/Public+WeekdayLabel.swift @@ -15,12 +15,12 @@ public protocol WeekdayLabel: View { var weekday: MWeekday { get } // MARK: View Customisation - func createContent() -> AnyView + @MainActor func createContent() -> AnyView } // MARK: - Default View Implementation public extension WeekdayLabel { - func createContent() -> AnyView { createDefaultContent().erased() } + @MainActor func createContent() -> AnyView { createDefaultContent().erased() } } private extension WeekdayLabel { func createDefaultContent() -> some View { @@ -41,5 +41,5 @@ public extension WeekdayLabel { // MARK: - Others public extension WeekdayLabel { - var body: some View { createContent() } + @MainActor var body: some View { createContent() } } diff --git a/Sources/Public/View Protocols/Public+WeekdaysView.swift b/Sources/Public/View Protocols/Public+WeekdaysView.swift index 81b3f59..e7ce042 100644 --- a/Sources/Public/View Protocols/Public+WeekdaysView.swift +++ b/Sources/Public/View Protocols/Public+WeekdaysView.swift @@ -12,14 +12,14 @@ import SwiftUI public protocol WeekdaysView: View { // MARK: View Customisation - func createContent() -> AnyView - func createWeekdayLabel(_ weekday: MWeekday) -> AnyWeekdayLabel + @MainActor func createContent() -> AnyView + @MainActor func createWeekdayLabel(_ weekday: MWeekday) -> AnyWeekdayLabel } // MARK: - Default View Implementation public extension WeekdaysView { - func createContent() -> AnyView { createWeekdaysView().erased() } - func createWeekdayLabel(_ weekday: MWeekday) -> AnyWeekdayLabel { createDefaultWeekDayLabel(weekday).erased() } + @MainActor func createContent() -> AnyView { createWeekdaysView().erased() } + @MainActor func createWeekdayLabel(_ weekday: MWeekday) -> AnyWeekdayLabel { createDefaultWeekDayLabel(weekday).erased() } } private extension WeekdaysView { func createDefaultWeekDayLabel(_ weekday: MWeekday) -> DefaultWeekdayLabel { DefaultWeekdayLabel(weekday: weekday) } @@ -31,10 +31,10 @@ public extension WeekdaysView { func createWeekdaysView() -> some View { HStack(spacing: 0) { ForEach(MWeekday.allCases, id: \.self, content: createWeekdayItem) } } } private extension WeekdaysView { - func createWeekdayItem(_ weekday: MWeekday) -> some View { createWeekdayLabel(weekday).frame(maxWidth: .infinity) } + @MainActor func createWeekdayItem(_ weekday: MWeekday) -> some View { createWeekdayLabel(weekday).frame(maxWidth: .infinity) } } // MARK: - Others public extension WeekdaysView { - var body: some View { createContent() } + @MainActor var body: some View { createContent() } } From bb8ed28a90059e0fb67e196fe78a6ebc63f97e06 Mon Sep 17 00:00:00 2001 From: jay-jay-lama Date: Thu, 28 Aug 2025 14:41:30 +0200 Subject: [PATCH 2/4] Fix type of week label return type --- Sources/Public/View Protocols/Public+WeekdaysView.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/Public/View Protocols/Public+WeekdaysView.swift b/Sources/Public/View Protocols/Public+WeekdaysView.swift index e7ce042..4279c6a 100644 --- a/Sources/Public/View Protocols/Public+WeekdaysView.swift +++ b/Sources/Public/View Protocols/Public+WeekdaysView.swift @@ -13,13 +13,13 @@ import SwiftUI public protocol WeekdaysView: View { // MARK: View Customisation @MainActor func createContent() -> AnyView - @MainActor func createWeekdayLabel(_ weekday: MWeekday) -> AnyWeekdayLabel + @MainActor func createWeekdayLabel(_ weekday: MWeekday) -> AnyView } // MARK: - Default View Implementation public extension WeekdaysView { @MainActor func createContent() -> AnyView { createWeekdaysView().erased() } - @MainActor func createWeekdayLabel(_ weekday: MWeekday) -> AnyWeekdayLabel { createDefaultWeekDayLabel(weekday).erased() } + @MainActor func createWeekdayLabel(_ weekday: MWeekday) -> AnyView { createDefaultWeekDayLabel(weekday).erased() } } private extension WeekdaysView { func createDefaultWeekDayLabel(_ weekday: MWeekday) -> DefaultWeekdayLabel { DefaultWeekdayLabel(weekday: weekday) } From 94260d9a868a8e100361b2f067d2ca7b6b557498 Mon Sep 17 00:00:00 2001 From: jay-jay-lama Date: Mon, 1 Sep 2025 17:29:51 +0200 Subject: [PATCH 3/4] Updates - added semiShort date formatter - fixed problem with threads --- Sources/Internal/Helpers/MDateFormatter.swift | 1 + .../Enums/Public+WeekdaySymbolFormat.swift | 2 +- .../View Protocols/Public+DayView.swift | 26 +++++++++---------- .../View Protocols/Public+MonthLabel.swift | 8 +++--- .../View Protocols/Public+WeekdayLabel.swift | 8 +++--- .../View Protocols/Public+WeekdaysView.swift | 14 +++++----- 6 files changed, 30 insertions(+), 29 deletions(-) diff --git a/Sources/Internal/Helpers/MDateFormatter.swift b/Sources/Internal/Helpers/MDateFormatter.swift index 89b6c5d..29197f8 100644 --- a/Sources/Internal/Helpers/MDateFormatter.swift +++ b/Sources/Internal/Helpers/MDateFormatter.swift @@ -22,6 +22,7 @@ extension MDateFormatter { static func getString(for weekday: MWeekday, format: WeekdaySymbolFormat) -> String { switch format { case .veryShort: return getFormatter().veryShortWeekdaySymbols[weekday.rawValue - 1].capitalized + case .abbreviated: return getFormatter().standaloneWeekdaySymbols[weekday.rawValue - 1].prefix(2).capitalized case .short: return getFormatter().shortWeekdaySymbols[weekday.rawValue - 1].capitalized case .full: return getFormatter().standaloneWeekdaySymbols[weekday.rawValue - 1].capitalized } diff --git a/Sources/Public/Enums/Public+WeekdaySymbolFormat.swift b/Sources/Public/Enums/Public+WeekdaySymbolFormat.swift index 808f699..8f430ab 100644 --- a/Sources/Public/Enums/Public+WeekdaySymbolFormat.swift +++ b/Sources/Public/Enums/Public+WeekdaySymbolFormat.swift @@ -8,4 +8,4 @@ // Copyright ©2023 Mijick. Licensed under MIT License. -public enum WeekdaySymbolFormat { case veryShort, short, full } +public enum WeekdaySymbolFormat { case veryShort, abbreviated, short, full } diff --git a/Sources/Public/View Protocols/Public+DayView.swift b/Sources/Public/View Protocols/Public+DayView.swift index 37d927c..65f24c8 100644 --- a/Sources/Public/View Protocols/Public+DayView.swift +++ b/Sources/Public/View Protocols/Public+DayView.swift @@ -11,7 +11,7 @@ import SwiftUI -public protocol DayView: View { +@MainActor public protocol DayView: View { // MARK: Attributes var date: Date { get } var isCurrentMonth: Bool { get } @@ -19,10 +19,10 @@ public protocol DayView: View { var selectedRange: Binding? { get } // MARK: View Customisation - @MainActor func createContent() -> AnyView - @MainActor func createDayLabel() -> AnyView - @MainActor func createSelectionView() -> AnyView - @MainActor func createRangeSelectionView() -> AnyView + func createContent() -> AnyView + func createDayLabel() -> AnyView + func createSelectionView() -> AnyView + func createRangeSelectionView() -> AnyView // MARK: Logic func onAppear() @@ -31,29 +31,29 @@ public protocol DayView: View { // MARK: - Default View Implementation public extension DayView { - @MainActor func createContent() -> AnyView { createDefaultContent().erased() } - @MainActor func createDayLabel() -> AnyView { createDefaultDayLabel().erased() } - @MainActor func createSelectionView() -> AnyView { createDefaultSelectionView().erased() } - @MainActor func createRangeSelectionView() -> AnyView { createDefaultRangeSelectionView().erased() } + func createContent() -> AnyView { createDefaultContent().erased() } + func createDayLabel() -> AnyView { createDefaultDayLabel().erased() } + func createSelectionView() -> AnyView { createDefaultSelectionView().erased() } + func createRangeSelectionView() -> AnyView { createDefaultRangeSelectionView().erased() } } private extension DayView { - @MainActor func createDefaultContent() -> some View { ZStack { + func createDefaultContent() -> some View { ZStack { createSelectionView() createRangeSelectionView() createDayLabel() }} - @MainActor func createDefaultDayLabel() -> some View { + func createDefaultDayLabel() -> some View { Text(getStringFromDay(format: "d")) .font(.system(size: 14, weight: .medium)) .foregroundColor(isSelected() ? .backgroundPrimary : .onBackgroundPrimary) } - @MainActor func createDefaultSelectionView() -> some View { + func createDefaultSelectionView() -> some View { Circle() .fill(Color.onBackgroundPrimary) .transition(.asymmetric(insertion: .scale(scale: 0.52).combined(with: .opacity), removal: .opacity)) .active(if: isSelected()) } - @MainActor func createDefaultRangeSelectionView() -> some View { + func createDefaultRangeSelectionView() -> some View { RoundedRectangle(corners: rangeSelectionViewCorners) .fill(Color.onBackgroundPrimary.opacity(0.12)) .transition(.opacity) diff --git a/Sources/Public/View Protocols/Public+MonthLabel.swift b/Sources/Public/View Protocols/Public+MonthLabel.swift index d645694..adfd835 100644 --- a/Sources/Public/View Protocols/Public+MonthLabel.swift +++ b/Sources/Public/View Protocols/Public+MonthLabel.swift @@ -10,17 +10,17 @@ import SwiftUI -public protocol MonthLabel: View { +@MainActor public protocol MonthLabel: View { // MARK: Required Attributes var month: Date { get } // MARK: View Customisation - @MainActor func createContent() -> AnyView + func createContent() -> AnyView } // MARK: - Default View Implementation public extension MonthLabel { - @MainActor func createContent() -> AnyView { createDefaultContent().erased() } + func createContent() -> AnyView { createDefaultContent().erased() } } private extension MonthLabel { func createDefaultContent() -> some View { @@ -38,5 +38,5 @@ public extension MonthLabel { // MARK: - Others public extension MonthLabel { - @MainActor var body: some View { createContent() } + var body: some View { createContent() } } diff --git a/Sources/Public/View Protocols/Public+WeekdayLabel.swift b/Sources/Public/View Protocols/Public+WeekdayLabel.swift index 3bd76fe..ce9fa87 100644 --- a/Sources/Public/View Protocols/Public+WeekdayLabel.swift +++ b/Sources/Public/View Protocols/Public+WeekdayLabel.swift @@ -10,17 +10,17 @@ import SwiftUI -public protocol WeekdayLabel: View { +@MainActor public protocol WeekdayLabel: View { // MARK: Required Attributes var weekday: MWeekday { get } // MARK: View Customisation - @MainActor func createContent() -> AnyView + func createContent() -> AnyView } // MARK: - Default View Implementation public extension WeekdayLabel { - @MainActor func createContent() -> AnyView { createDefaultContent().erased() } + func createContent() -> AnyView { createDefaultContent().erased() } } private extension WeekdayLabel { func createDefaultContent() -> some View { @@ -41,5 +41,5 @@ public extension WeekdayLabel { // MARK: - Others public extension WeekdayLabel { - @MainActor var body: some View { createContent() } + var body: some View { createContent() } } diff --git a/Sources/Public/View Protocols/Public+WeekdaysView.swift b/Sources/Public/View Protocols/Public+WeekdaysView.swift index 4279c6a..61e902f 100644 --- a/Sources/Public/View Protocols/Public+WeekdaysView.swift +++ b/Sources/Public/View Protocols/Public+WeekdaysView.swift @@ -10,16 +10,16 @@ import SwiftUI -public protocol WeekdaysView: View { +@MainActor public protocol WeekdaysView: View { // MARK: View Customisation - @MainActor func createContent() -> AnyView - @MainActor func createWeekdayLabel(_ weekday: MWeekday) -> AnyView + func createContent() -> AnyView + func createWeekdayLabel(_ weekday: MWeekday) -> AnyWeekdayLabel } // MARK: - Default View Implementation public extension WeekdaysView { - @MainActor func createContent() -> AnyView { createWeekdaysView().erased() } - @MainActor func createWeekdayLabel(_ weekday: MWeekday) -> AnyView { createDefaultWeekDayLabel(weekday).erased() } + func createContent() -> AnyView { createWeekdaysView().erased() } + func createWeekdayLabel(_ weekday: MWeekday) -> AnyWeekdayLabel { createDefaultWeekDayLabel(weekday).erased() } } private extension WeekdaysView { func createDefaultWeekDayLabel(_ weekday: MWeekday) -> DefaultWeekdayLabel { DefaultWeekdayLabel(weekday: weekday) } @@ -31,10 +31,10 @@ public extension WeekdaysView { func createWeekdaysView() -> some View { HStack(spacing: 0) { ForEach(MWeekday.allCases, id: \.self, content: createWeekdayItem) } } } private extension WeekdaysView { - @MainActor func createWeekdayItem(_ weekday: MWeekday) -> some View { createWeekdayLabel(weekday).frame(maxWidth: .infinity) } + func createWeekdayItem(_ weekday: MWeekday) -> some View { createWeekdayLabel(weekday).frame(maxWidth: .infinity) } } // MARK: - Others public extension WeekdaysView { - @MainActor var body: some View { createContent() } + var body: some View { createContent() } } From 9f1c4ec3f56bd696f97c95d9a87ef4bc3835a9f4 Mon Sep 17 00:00:00 2001 From: jay-jay-lama Date: Thu, 4 Sep 2025 16:36:31 +0200 Subject: [PATCH 4/4] 1 --- Sources/Public/View Protocols/Public+DayView.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/Public/View Protocols/Public+DayView.swift b/Sources/Public/View Protocols/Public+DayView.swift index 65f24c8..684f52b 100644 --- a/Sources/Public/View Protocols/Public+DayView.swift +++ b/Sources/Public/View Protocols/Public+DayView.swift @@ -103,13 +103,13 @@ public extension DayView { // MARK: - Others public extension DayView { - @MainActor var body: some View { Group { + var body: some View { Group { if isCurrentMonth { createBodyForCurrentMonth() } else { createBodyForOtherMonth() } }} } private extension DayView { - @MainActor func createBodyForCurrentMonth() -> some View { + func createBodyForCurrentMonth() -> some View { createContent() .frame(maxWidth: .infinity, maxHeight: .infinity) .aspectRatio(1.0, contentMode: .fit)