Cleanup (IOS-192)

This commit is contained in:
Nathan Mattes 2024-02-20 17:41:10 +01:00
parent a170a462ee
commit f6e630aa66
10 changed files with 111 additions and 118 deletions

View File

@ -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
}

View File

@ -46,7 +46,6 @@ final class DiscoveryPostsViewModel {
self.context = context
self.authContext = authContext
self.dataController = StatusDataController()
// end init
Task {
await checkServerEndpoint()

View File

@ -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)

View File

@ -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)
}) ?? []

View File

@ -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
}

View File

@ -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)

View File

@ -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(

View File

@ -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
}
}
}

View File

@ -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):

View File

@ -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 {