Cleanup (IOS-192)
This commit is contained in:
parent
a170a462ee
commit
f6e630aa66
@ -57,7 +57,7 @@ extension ProfileCardView.ViewModel {
|
||||
private func bindHeader(view: ProfileCardView) {
|
||||
$authorBannerImageURL
|
||||
.sink { url in
|
||||
guard let url = url, !url.absoluteString.hasSuffix(Mastodon.Entity.Account.missingImageName) else {
|
||||
guard let url, !url.absoluteString.hasSuffix(Mastodon.Entity.Account.missingImageName) else {
|
||||
view.bannerImageView.image = .placeholder(color: .systemGray3)
|
||||
return
|
||||
}
|
||||
|
@ -46,7 +46,6 @@ final class DiscoveryPostsViewModel {
|
||||
self.context = context
|
||||
self.authContext = authContext
|
||||
self.dataController = StatusDataController()
|
||||
// end init
|
||||
|
||||
Task {
|
||||
await checkServerEndpoint()
|
||||
|
@ -25,7 +25,6 @@ extension NotificationTimelineViewController: DataSourceProvider {
|
||||
let item: DataSourceItem? = {
|
||||
guard feed.kind == .notificationAll || feed.kind == .notificationMentions else { return nil }
|
||||
|
||||
//TODO: Get relationship
|
||||
if let notification = feed.notification {
|
||||
let mastodonNotification = MastodonNotification.fromEntity(notification, relationship: nil)
|
||||
return .notification(record: mastodonNotification)
|
||||
|
@ -56,7 +56,6 @@ final class NotificationTimelineViewModel {
|
||||
|
||||
switch scope {
|
||||
case .everything:
|
||||
//TODO: I need the relationship here, too
|
||||
self.dataController.records = (try? FileManager.default.cachedNotificationsAll(for: authContext.mastodonAuthenticationBox))?.map({ notification in
|
||||
MastodonFeed.fromNotification(notification, relationship: nil, kind: .notificationAll)
|
||||
}) ?? []
|
||||
|
@ -409,7 +409,6 @@ extension ProfileViewController {
|
||||
|
||||
guard let relationship else { return }
|
||||
|
||||
// they don't run as there's not a change, probably?
|
||||
self.viewModel.relationship = relationship
|
||||
self.viewModel.account = account
|
||||
}
|
||||
|
@ -127,17 +127,17 @@ extension MainTabBarController {
|
||||
.sink { [weak self] error in
|
||||
guard let self, let coordinator = self.coordinator else { return }
|
||||
switch error {
|
||||
case .implicit:
|
||||
break
|
||||
case .explicit:
|
||||
let alertController = UIAlertController(for: error, title: nil, preferredStyle: .alert)
|
||||
let okAction = UIAlertAction(title: "OK", style: .default, handler: nil)
|
||||
alertController.addAction(okAction)
|
||||
_ = coordinator.present(
|
||||
scene: .alertController(alertController: alertController),
|
||||
from: nil,
|
||||
transition: .alertController(animated: true, completion: nil)
|
||||
)
|
||||
case .implicit:
|
||||
break
|
||||
case .explicit:
|
||||
let alertController = UIAlertController(for: error, title: nil, preferredStyle: .alert)
|
||||
let okAction = UIAlertAction(title: "OK", style: .default, handler: nil)
|
||||
alertController.addAction(okAction)
|
||||
_ = coordinator.present(
|
||||
scene: .alertController(alertController: alertController),
|
||||
from: nil,
|
||||
transition: .alertController(animated: true, completion: nil)
|
||||
)
|
||||
}
|
||||
}
|
||||
.store(in: &disposeBag)
|
||||
|
@ -74,12 +74,12 @@ extension SidebarViewModel {
|
||||
|
||||
let imageURL: URL?
|
||||
switch item {
|
||||
case .me:
|
||||
let account = self.authContext?.mastodonAuthenticationBox.authentication.account()
|
||||
imageURL = account?.avatarImageURL()
|
||||
case .home, .search, .compose, .notifications:
|
||||
// no custom avatar for other tabs
|
||||
imageURL = nil
|
||||
case .me:
|
||||
let account = self.authContext?.mastodonAuthenticationBox.authentication.account()
|
||||
imageURL = account?.avatarImageURL()
|
||||
case .home, .search, .compose, .notifications:
|
||||
// no custom avatar for other tabs
|
||||
imageURL = nil
|
||||
}
|
||||
|
||||
cell.item = SidebarListContentView.Item(
|
||||
|
@ -267,77 +267,77 @@ extension SceneDelegate {
|
||||
print("source application = \(sendingAppID ?? "Unknown")")
|
||||
print("url = \(url)")
|
||||
#endif
|
||||
|
||||
|
||||
switch url.host {
|
||||
case "post":
|
||||
showComposeViewController()
|
||||
case "profile":
|
||||
let components = url.pathComponents
|
||||
guard
|
||||
components.count == 2,
|
||||
components[0] == "/",
|
||||
let authContext = coordinator?.authContext
|
||||
else { return }
|
||||
|
||||
Task {
|
||||
do {
|
||||
let authenticationBox = authContext.mastodonAuthenticationBox
|
||||
|
||||
guard let me = authContext.mastodonAuthenticationBox.authentication.account() else { return }
|
||||
|
||||
guard let account = try await AppContext.shared.apiService.search(
|
||||
query: .init(q: components[1], type: .accounts, resolve: true),
|
||||
authenticationBox: authenticationBox
|
||||
).value.accounts.first else { return }
|
||||
|
||||
guard let relationship = try await AppContext.shared.apiService.relationship(
|
||||
forAccounts: [account],
|
||||
authenticationBox: authenticationBox
|
||||
).value.first else { return }
|
||||
|
||||
let profileViewModel = ProfileViewModel(
|
||||
context: AppContext.shared,
|
||||
authContext: authContext,
|
||||
account: account,
|
||||
relationship: relationship,
|
||||
me: me
|
||||
)
|
||||
|
||||
self.coordinator?.present(
|
||||
scene: .profile(viewModel: profileViewModel),
|
||||
from: nil,
|
||||
transition: .show
|
||||
)
|
||||
} catch {
|
||||
// fail silently
|
||||
}
|
||||
case "post":
|
||||
showComposeViewController()
|
||||
case "profile":
|
||||
let components = url.pathComponents
|
||||
guard
|
||||
components.count == 2,
|
||||
components[0] == "/",
|
||||
let authContext = coordinator?.authContext
|
||||
else { return }
|
||||
|
||||
Task {
|
||||
do {
|
||||
let authenticationBox = authContext.mastodonAuthenticationBox
|
||||
|
||||
guard let me = authContext.mastodonAuthenticationBox.authentication.account() else { return }
|
||||
|
||||
guard let account = try await AppContext.shared.apiService.search(
|
||||
query: .init(q: components[1], type: .accounts, resolve: true),
|
||||
authenticationBox: authenticationBox
|
||||
).value.accounts.first else { return }
|
||||
|
||||
guard let relationship = try await AppContext.shared.apiService.relationship(
|
||||
forAccounts: [account],
|
||||
authenticationBox: authenticationBox
|
||||
).value.first else { return }
|
||||
|
||||
let profileViewModel = ProfileViewModel(
|
||||
context: AppContext.shared,
|
||||
authContext: authContext,
|
||||
account: account,
|
||||
relationship: relationship,
|
||||
me: me
|
||||
)
|
||||
|
||||
self.coordinator?.present(
|
||||
scene: .profile(viewModel: profileViewModel),
|
||||
from: nil,
|
||||
transition: .show
|
||||
)
|
||||
} catch {
|
||||
// fail silently
|
||||
}
|
||||
case "status":
|
||||
let components = url.pathComponents
|
||||
guard
|
||||
components.count == 2,
|
||||
components[0] == "/",
|
||||
let authContext = coordinator?.authContext
|
||||
else { return }
|
||||
let statusId = components[1]
|
||||
// View post from user
|
||||
let threadViewModel = RemoteThreadViewModel(
|
||||
context: AppContext.shared,
|
||||
authContext: authContext,
|
||||
statusID: statusId
|
||||
)
|
||||
coordinator?.present(scene: .thread(viewModel: threadViewModel), from: nil, transition: .show)
|
||||
case "search":
|
||||
let queryItems = URLComponents(url: url, resolvingAgainstBaseURL: false)?.queryItems
|
||||
guard
|
||||
let authContext = coordinator?.authContext,
|
||||
let searchQuery = queryItems?.first(where: { $0.name == "query" })?.value
|
||||
else { return }
|
||||
|
||||
let viewModel = SearchDetailViewModel(authContext: authContext, initialSearchText: searchQuery)
|
||||
coordinator?.present(scene: .searchDetail(viewModel: viewModel), from: nil, transition: .show)
|
||||
default:
|
||||
return
|
||||
}
|
||||
case "status":
|
||||
let components = url.pathComponents
|
||||
guard
|
||||
components.count == 2,
|
||||
components[0] == "/",
|
||||
let authContext = coordinator?.authContext
|
||||
else { return }
|
||||
let statusId = components[1]
|
||||
// View post from user
|
||||
let threadViewModel = RemoteThreadViewModel(
|
||||
context: AppContext.shared,
|
||||
authContext: authContext,
|
||||
statusID: statusId
|
||||
)
|
||||
coordinator?.present(scene: .thread(viewModel: threadViewModel), from: nil, transition: .show)
|
||||
case "search":
|
||||
let queryItems = URLComponents(url: url, resolvingAgainstBaseURL: false)?.queryItems
|
||||
guard
|
||||
let authContext = coordinator?.authContext,
|
||||
let searchQuery = queryItems?.first(where: { $0.name == "query" })?.value
|
||||
else { return }
|
||||
|
||||
let viewModel = SearchDetailViewModel(authContext: authContext, initialSearchText: searchQuery)
|
||||
coordinator?.present(scene: .searchDetail(viewModel: viewModel), from: nil, transition: .show)
|
||||
default:
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -22,7 +22,7 @@ public enum Persistence {
|
||||
private var filename: String {
|
||||
switch self {
|
||||
case .searchHistory(let userIdentifier):
|
||||
return "search_history_\(uniqueUserDomainIdentifier(for: userIdentifier))" // todo: @zeitschlag should this be user-scoped as well?
|
||||
return "search_history_\(uniqueUserDomainIdentifier(for: userIdentifier))"
|
||||
case let .homeTimeline(userIdentifier):
|
||||
return "home_timeline_\(uniqueUserDomainIdentifier(for: userIdentifier))"
|
||||
case let .notificationsMentions(userIdentifier):
|
||||
|
@ -97,33 +97,30 @@ extension NotificationService {
|
||||
extension NotificationService {
|
||||
public func unreadApplicationShortcutItems() async throws -> [UIApplicationShortcutItem] {
|
||||
guard let authenticationService = self.authenticationService else { return [] }
|
||||
let managedObjectContext = authenticationService.managedObjectContext
|
||||
return try await managedObjectContext.perform {
|
||||
var items: [UIApplicationShortcutItem] = []
|
||||
for authentication in AuthenticationServiceProvider.shared.authentications {
|
||||
guard let account = authentication.account() else { continue }
|
||||
let accessToken = authentication.userAccessToken
|
||||
let count = UserDefaults.shared.getNotificationCountWithAccessToken(accessToken: accessToken)
|
||||
guard count > 0 else { continue }
|
||||
|
||||
let title = "@\(account.acctWithDomain)"
|
||||
let subtitle = L10n.A11y.Plural.Count.Unread.notification(count)
|
||||
|
||||
let item = UIApplicationShortcutItem(
|
||||
type: NotificationService.unreadShortcutItemIdentifier,
|
||||
localizedTitle: title,
|
||||
localizedSubtitle: subtitle,
|
||||
icon: nil,
|
||||
userInfo: [
|
||||
"accessToken": accessToken as NSSecureCoding
|
||||
]
|
||||
)
|
||||
items.append(item)
|
||||
}
|
||||
return items
|
||||
|
||||
var items: [UIApplicationShortcutItem] = []
|
||||
for authentication in AuthenticationServiceProvider.shared.authentications {
|
||||
guard let account = authentication.account() else { continue }
|
||||
let accessToken = authentication.userAccessToken
|
||||
let count = UserDefaults.shared.getNotificationCountWithAccessToken(accessToken: accessToken)
|
||||
guard count > 0 else { continue }
|
||||
|
||||
let title = "@\(account.acctWithDomain)"
|
||||
let subtitle = L10n.A11y.Plural.Count.Unread.notification(count)
|
||||
|
||||
let item = UIApplicationShortcutItem(
|
||||
type: NotificationService.unreadShortcutItemIdentifier,
|
||||
localizedTitle: title,
|
||||
localizedSubtitle: subtitle,
|
||||
icon: nil,
|
||||
userInfo: [
|
||||
"accessToken": accessToken as NSSecureCoding
|
||||
]
|
||||
)
|
||||
items.append(item)
|
||||
}
|
||||
}
|
||||
}
|
||||
return items
|
||||
}}
|
||||
|
||||
extension NotificationService {
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user