From 44ac523f3315ee4e81dc58915f56eb7b8c8d7430 Mon Sep 17 00:00:00 2001 From: shannon Date: Wed, 12 Feb 2025 10:44:41 -0500 Subject: [PATCH] Implement quiet public as a default post visibility option Update code to handle the additional .unlisted post visibility option. And make sure to fetch full account info, which includes any custom privacy settings. Fixes #1395 [BUG] Implement Quit Public post privacy like the Android app --- Localization/app.json | 5 +---- .../Privacy and Safety/PrivacySafetyViewModel.swift | 8 ++++---- .../MastodonCore/Service/API/APIService+Account.swift | 7 +------ .../Sources/MastodonLocalization/Generated/Strings.swift | 6 ------ .../Resources/Base.lproj/Localizable.strings | 3 --- .../ComposeContent/ComposeContentViewController.swift | 1 + .../Scene/ComposeContent/ComposeContentViewModel.swift | 6 +++++- 7 files changed, 12 insertions(+), 24 deletions(-) diff --git a/Localization/app.json b/Localization/app.json index 81aee4d5e..b63f51433 100644 --- a/Localization/app.json +++ b/Localization/app.json @@ -873,10 +873,7 @@ "custom": "Custom" }, "default_post_visibility": { - "title": "Default Post Visibility", - "public": "Public", - "followers_only": "Followers Only", - "only_people_mentioned": "Only People Mentioned" + "title": "Default Post Visibility" }, "manually_approve_follow_requests": "Manually Approve Follow Requests", "show_followers_and_following": "Show Followers & Following", diff --git a/Mastodon/Scene/Settings/Privacy and Safety/PrivacySafetyViewModel.swift b/Mastodon/Scene/Settings/Privacy and Safety/PrivacySafetyViewModel.swift index 0249635b7..0381cfe4c 100644 --- a/Mastodon/Scene/Settings/Privacy and Safety/PrivacySafetyViewModel.swift +++ b/Mastodon/Scene/Settings/Privacy and Safety/PrivacySafetyViewModel.swift @@ -25,13 +25,13 @@ class PrivacySafetyViewModel: ObservableObject, PrivacySafetySettingApplicable { var title: String { switch self { case .public: - return L10n.Scene.Settings.PrivacySafety.DefaultPostVisibility.public + return L10n.Scene.Compose.Visibility.public case .unlisted: - return L10n.Scene.Settings.PrivacySafety.DefaultPostVisibility.unlisted + return L10n.Scene.Compose.Visibility.unlisted case .followersOnly: - return L10n.Scene.Settings.PrivacySafety.DefaultPostVisibility.followersOnly + return L10n.Scene.Compose.Visibility.private case .onlyPeopleMentioned: - return L10n.Scene.Settings.PrivacySafety.DefaultPostVisibility.onlyPeopleMentioned + return L10n.Scene.Compose.Visibility.direct } } diff --git a/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Account.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Account.swift index 3a29d8925..ebbd49685 100644 --- a/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Account.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Account.swift @@ -14,12 +14,7 @@ import MastodonSDK extension APIService { public func accountInfo(_ authenticationBox: MastodonAuthenticationBox ) async throws -> Mastodon.Entity.Account { - let account = try await Mastodon.API.Account.accountInfo( - session: session, - domain: authenticationBox.domain, - userID: authenticationBox.userID, - authorization: authenticationBox.userAuthorization - ).singleOutput().value + let account = try await Mastodon.API.Account.verifyCredentials(session: session, domain: authenticationBox.domain, authorization: authenticationBox.userAuthorization) PersistenceManager.shared.cacheAccount(account, forUserID: authenticationBox.authentication.userIdentifier()) diff --git a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift index 1385a7756..2613487ea 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift +++ b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift @@ -1717,12 +1717,6 @@ public enum L10n { /// Privacy & Safety public static let title = L10n.tr("Localizable", "Scene.Settings.PrivacySafety.Title", fallback: "Privacy & Safety") public enum DefaultPostVisibility { - /// Followers Only - public static let followersOnly = L10n.tr("Localizable", "Scene.Settings.PrivacySafety.DefaultPostVisibility.FollowersOnly", fallback: "Followers Only") - /// Only People Mentioned - public static let onlyPeopleMentioned = L10n.tr("Localizable", "Scene.Settings.PrivacySafety.DefaultPostVisibility.OnlyPeopleMentioned", fallback: "Only People Mentioned") - /// Public - public static let `public` = L10n.tr("Localizable", "Scene.Settings.PrivacySafety.DefaultPostVisibility.Public", fallback: "Public") /// Default Post Visibility public static let title = L10n.tr("Localizable", "Scene.Settings.PrivacySafety.DefaultPostVisibility.Title", fallback: "Default Post Visibility") } diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings index 0cad1e22f..07651d419 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings @@ -598,9 +598,6 @@ If you disagree with the policy for **%@**, you can go back and pick a different "Scene.Settings.Overview.SupportMastodon" = "Donate to Mastodon"; "Scene.Settings.Overview.Title" = "Settings"; "Scene.Settings.PrivacySafety.AppearInSearchEngines" = "Appear in Search Engines"; -"Scene.Settings.PrivacySafety.DefaultPostVisibility.FollowersOnly" = "Followers Only"; -"Scene.Settings.PrivacySafety.DefaultPostVisibility.OnlyPeopleMentioned" = "Only People Mentioned"; -"Scene.Settings.PrivacySafety.DefaultPostVisibility.Public" = "Public"; "Scene.Settings.PrivacySafety.DefaultPostVisibility.Title" = "Default Post Visibility"; "Scene.Settings.PrivacySafety.ManuallyApproveFollowRequests" = "Manually Approve Follow Requests"; "Scene.Settings.PrivacySafety.Preset.Custom" = "Custom"; diff --git a/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentViewController.swift b/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentViewController.swift index c01d84d48..cd40f6318 100644 --- a/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentViewController.swift +++ b/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentViewController.swift @@ -362,6 +362,7 @@ extension ComposeContentViewController { viewModel.$recentLanguages.assign(to: &composeContentToolbarViewModel.$recentLanguages) // bind back to source due to visibility not update via delegate + composeContentToolbarViewModel.visibility = viewModel.visibility composeContentToolbarViewModel.$visibility .dropFirst() .receive(on: DispatchQueue.main) diff --git a/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentViewModel.swift b/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentViewModel.swift index da58b40f1..4327d73b5 100644 --- a/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentViewModel.swift +++ b/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentViewModel.swift @@ -156,7 +156,11 @@ public final class ComposeContentViewModel: NSObject, ObservableObject { guard let author = authenticationBox.cachedAccount else { return .public } - return author.locked ? .private : .public + if let defaultPrivacy = author.source?.privacy, let statusPrivacy = Mastodon.Entity.Status.Visibility(rawValue: defaultPrivacy.rawValue) { + return statusPrivacy + } else { + return author.locked ? .private : .public + } }() // set visibility for reply post if case .reply(let record) = destination {