forked from shadowfacts/Tusker
Fix follow button never activating on Pixelfed
Caused by not being able to decode Relationship due to missing fields. Also disable actions that are unsupported on Pixelfed. Closes #481
This commit is contained in:
parent
0f2a85b108
commit
4dc484c3c2
|
@ -217,6 +217,18 @@ public final class InstanceFeatures: ObservableObject {
|
||||||
instanceType.isPleroma
|
instanceType.isPleroma
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public var muteNotifications: Bool {
|
||||||
|
!instanceType.isPixelfed
|
||||||
|
}
|
||||||
|
|
||||||
|
public var blockDomains: Bool {
|
||||||
|
!instanceType.isPixelfed
|
||||||
|
}
|
||||||
|
|
||||||
|
public var hideReblogs: Bool {
|
||||||
|
!instanceType.isPixelfed
|
||||||
|
}
|
||||||
|
|
||||||
public init() {
|
public init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -338,6 +350,14 @@ extension InstanceFeatures {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var isPixelfed: Bool {
|
||||||
|
if case .pixelfed = self {
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@_spi(InstanceType) public enum MastodonType {
|
@_spi(InstanceType) public enum MastodonType {
|
||||||
|
|
|
@ -27,10 +27,13 @@ public struct Relationship: RelationshipProtocol, Decodable, Sendable {
|
||||||
self.followedBy = try container.decode(Bool.self, forKey: .followedBy)
|
self.followedBy = try container.decode(Bool.self, forKey: .followedBy)
|
||||||
self.blocking = try container.decode(Bool.self, forKey: .blocking)
|
self.blocking = try container.decode(Bool.self, forKey: .blocking)
|
||||||
self.muting = try container.decode(Bool.self, forKey: .muting)
|
self.muting = try container.decode(Bool.self, forKey: .muting)
|
||||||
self.mutingNotifications = try container.decode(Bool.self, forKey: .mutingNotifications)
|
// not supported on pixelfed
|
||||||
|
self.mutingNotifications = try container.decodeIfPresent(Bool.self, forKey: .mutingNotifications) ?? false
|
||||||
self.followRequested = try container.decode(Bool.self, forKey: .followRequested)
|
self.followRequested = try container.decode(Bool.self, forKey: .followRequested)
|
||||||
self.domainBlocking = try container.decode(Bool.self, forKey: .domainBlocking)
|
// not supported on pixelfed
|
||||||
self.showingReblogs = try container.decode(Bool.self, forKey: .showingReblogs)
|
self.domainBlocking = try container.decodeIfPresent(Bool.self, forKey: .domainBlocking) ?? false
|
||||||
|
// not supported on pixelfed
|
||||||
|
self.showingReblogs = try container.decodeIfPresent(Bool.self, forKey: .showingReblogs) ?? true
|
||||||
self.endorsed = try container.decodeIfPresent(Bool.self, forKey: .endorsed) ?? false
|
self.endorsed = try container.decodeIfPresent(Bool.self, forKey: .endorsed) ?? false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -78,18 +78,20 @@ struct MuteAccountView: View {
|
||||||
}
|
}
|
||||||
.accessibilityHidden(true)
|
.accessibilityHidden(true)
|
||||||
|
|
||||||
Section {
|
if mastodonController.instanceFeatures.muteNotifications {
|
||||||
Toggle(isOn: $muteNotifications) {
|
Section {
|
||||||
Text("Hide notifications from this person")
|
Toggle(isOn: $muteNotifications) {
|
||||||
}
|
Text("Hide notifications from this person")
|
||||||
} footer: {
|
}
|
||||||
if muteNotifications {
|
} footer: {
|
||||||
Text("This user's posts and notifications will be hidden.")
|
if muteNotifications {
|
||||||
} else {
|
Text("This user's posts and notifications will be hidden.")
|
||||||
Text("This user's posts will be hidden from your timeline. You can still receive notifications from them.")
|
} else {
|
||||||
|
Text("This user's posts will be hidden from your timeline. You can still receive notifications from them.")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
.appGroupedListRowBackground()
|
||||||
}
|
}
|
||||||
.appGroupedListRowBackground()
|
|
||||||
|
|
||||||
Section {
|
Section {
|
||||||
Picker(selection: $duration) {
|
Picker(selection: $duration) {
|
||||||
|
|
|
@ -9,6 +9,12 @@
|
||||||
import UIKit
|
import UIKit
|
||||||
import Pachyderm
|
import Pachyderm
|
||||||
import Combine
|
import Combine
|
||||||
|
import OSLog
|
||||||
|
#if canImport(Sentry)
|
||||||
|
import Sentry
|
||||||
|
#endif
|
||||||
|
|
||||||
|
private let logger = Logger(subsystem: Bundle.main.bundleIdentifier!, category: "ProfileStatusesViewController")
|
||||||
|
|
||||||
class ProfileStatusesViewController: UIViewController, TimelineLikeCollectionViewController, CollectionViewController {
|
class ProfileStatusesViewController: UIViewController, TimelineLikeCollectionViewController, CollectionViewController {
|
||||||
|
|
||||||
|
@ -250,9 +256,16 @@ class ProfileStatusesViewController: UIViewController, TimelineLikeCollectionVie
|
||||||
state = .setupInitialSnapshot
|
state = .setupInitialSnapshot
|
||||||
|
|
||||||
Task {
|
Task {
|
||||||
if let (all, _) = try? await mastodonController.run(Client.getRelationships(accounts: [accountID])),
|
do {
|
||||||
let relationship = all.first {
|
let (all, _) = try await mastodonController.run(Client.getRelationships(accounts: [accountID]))
|
||||||
self.mastodonController.persistentContainer.addOrUpdate(relationship: relationship)
|
if let relationship = all.first {
|
||||||
|
self.mastodonController.persistentContainer.addOrUpdate(relationship: relationship)
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
logger.error("Error fetching relationship: \(String(describing: error))")
|
||||||
|
#if canImport(Sentry)
|
||||||
|
SentrySDK.capture(error: error)
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -557,11 +557,14 @@ extension MenuActionProvider {
|
||||||
return createAction(identifier: "block", title: "Unblock \(displayName)", systemImageName: "circle.slash", handler: handler(false))
|
return createAction(identifier: "block", title: "Unblock \(displayName)", systemImageName: "circle.slash", handler: handler(false))
|
||||||
} else {
|
} else {
|
||||||
let image = UIImage(systemName: "circle.slash")
|
let image = UIImage(systemName: "circle.slash")
|
||||||
return UIMenu(title: "Block", image: image, children: [
|
var children = [
|
||||||
UIAction(title: "Cancel", handler: { _ in }),
|
UIAction(title: "Cancel", handler: { _ in }),
|
||||||
UIAction(title: "Block \(displayName)", image: image, attributes: .destructive, handler: handler(true)),
|
UIAction(title: "Block \(displayName)", image: image, attributes: .destructive, handler: handler(true)),
|
||||||
UIAction(title: "Block \(host)", image: image, attributes: .destructive, handler: domainHandler(true))
|
]
|
||||||
])
|
if mastodonController.instanceFeatures.blockDomains {
|
||||||
|
children.append(UIAction(title: "Block \(host)", image: image, attributes: .destructive, handler: domainHandler(true)))
|
||||||
|
}
|
||||||
|
return UIMenu(title: "Block", image: image, children: children)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -592,7 +595,8 @@ extension MenuActionProvider {
|
||||||
@MainActor
|
@MainActor
|
||||||
private func hideReblogsAction(for relationship: RelationshipMO, mastodonController: MastodonController) -> UIMenuElement? {
|
private func hideReblogsAction(for relationship: RelationshipMO, mastodonController: MastodonController) -> UIMenuElement? {
|
||||||
// don't show action for people that the user isn't following and isn't already hiding reblogs for
|
// don't show action for people that the user isn't following and isn't already hiding reblogs for
|
||||||
guard relationship.following || relationship.showingReblogs else {
|
guard relationship.following || relationship.showingReblogs,
|
||||||
|
mastodonController.instanceFeatures.hideReblogs else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
let title = relationship.showingReblogs ? "Hide Reblogs" : "Show Reblogs"
|
let title = relationship.showingReblogs ? "Hide Reblogs" : "Show Reblogs"
|
||||||
|
|
Loading…
Reference in New Issue