Localized title

This commit is contained in:
Justin Mazzocchi 2020-12-02 17:41:22 -08:00
parent acfd127672
commit a6d959a6b9
No known key found for this signature in database
GPG key ID: E223E6937AAFB01C
8 changed files with 41 additions and 3 deletions

View file

@ -1,10 +1,12 @@
// Copyright © 2020 Metabolist. All rights reserved.
"account.%@-followers" = "%@'s Followers";
"account.block" = "Block";
"account.field.verified" = "Verified %@";
"account.follow" = "Follow";
"account.following" = "Following";
"account.following-count" = "%ld Following";
"account.followed-by-%@" = "Followed by %@";
"account.hide-reblogs" = "Hide boosts";
"account.mute" = "Mute";
"account.request" = "Request";

View file

@ -15,13 +15,18 @@ public struct AccountListService {
private let endpoint: AccountsEndpoint
private let mastodonAPIClient: MastodonAPIClient
private let contentDatabase: ContentDatabase
private let titleComponents: [String]?
private let nextPageMaxIdSubject = PassthroughSubject<String, Never>()
init(endpoint: AccountsEndpoint, mastodonAPIClient: MastodonAPIClient, contentDatabase: ContentDatabase) {
init(endpoint: AccountsEndpoint,
mastodonAPIClient: MastodonAPIClient,
contentDatabase: ContentDatabase,
titleComponents: [String]? = nil) {
list = AccountList()
self.endpoint = endpoint
self.mastodonAPIClient = mastodonAPIClient
self.contentDatabase = contentDatabase
self.titleComponents = titleComponents
sections = contentDatabase.accountListPublisher(list)
.map { [$0.map(CollectionItem.account)] }
.eraseToAnyPublisher()
@ -41,4 +46,12 @@ extension AccountListService: CollectionService {
.flatMap { contentDatabase.append(accounts: $0.result, toList: list) }
.eraseToAnyPublisher()
}
public var titleLocalizationComponents: AnyPublisher<[String], Never> {
if let titleComponents = titleComponents {
return Just(titleComponents).eraseToAnyPublisher()
} else {
return Empty().eraseToAnyPublisher()
}
}
}

View file

@ -95,14 +95,16 @@ public extension AccountService {
AccountListService(
endpoint: .accountsFollowing(id: account.id),
mastodonAPIClient: mastodonAPIClient,
contentDatabase: contentDatabase)
contentDatabase: contentDatabase,
titleComponents: ["account.followed-by-%@", "@".appending(account.acct)])
}
func followersService() -> AccountListService {
AccountListService(
endpoint: .accountsFollowers(id: account.id),
mastodonAPIClient: mastodonAPIClient,
contentDatabase: contentDatabase)
contentDatabase: contentDatabase,
titleComponents: ["account.%@-followers", "@".appending(account.acct)])
}
}

View file

@ -7,6 +7,7 @@ public protocol CollectionService {
var sections: AnyPublisher<[[CollectionItem]], Error> { get }
var nextPageMaxId: AnyPublisher<String, Never> { get }
var title: AnyPublisher<String, Never> { get }
var titleLocalizationComponents: AnyPublisher<[String], Never> { get }
var navigationService: NavigationService { get }
var markerTimeline: Marker.Timeline? { get }
func request(maxId: String?, minId: String?) -> AnyPublisher<Never, Error>
@ -17,5 +18,7 @@ extension CollectionService {
public var title: AnyPublisher<String, Never> { Empty().eraseToAnyPublisher() }
public var titleLocalizationComponents: AnyPublisher<[String], Never> { Empty().eraseToAnyPublisher() }
public var markerTimeline: Marker.Timeline? { nil }
}

View file

@ -228,6 +228,15 @@ private extension TableViewController {
func setupViewModelBindings() {
viewModel.title.sink { [weak self] in self?.navigationItem.title = $0 }.store(in: &cancellables)
viewModel.titleLocalizationComponents.sink { [weak self] in
guard let key = $0.first else { return }
self?.navigationItem.title = String(
format: NSLocalizedString(key, comment: ""),
arguments: Array($0.suffix(from: 1)))
}
.store(in: &cancellables)
viewModel.updates.sink { [weak self] in self?.update($0) }.store(in: &cancellables)
viewModel.events.receive(on: DispatchQueue.main)

View file

@ -66,6 +66,10 @@ extension CollectionItemsViewModel: CollectionViewModel {
public var title: AnyPublisher<String, Never> { collectionService.title }
public var titleLocalizationComponents: AnyPublisher<[String], Never> {
collectionService.titleLocalizationComponents
}
public var expandAll: AnyPublisher<ExpandAllState, Never> {
expandAllSubject.eraseToAnyPublisher()
}

View file

@ -6,6 +6,7 @@ import Foundation
public protocol CollectionViewModel {
var updates: AnyPublisher<CollectionUpdate, Never> { get }
var title: AnyPublisher<String, Never> { get }
var titleLocalizationComponents: AnyPublisher<[String], Never> { get }
var expandAll: AnyPublisher<ExpandAllState, Never> { get }
var alertItems: AnyPublisher<AlertItem, Never> { get }
var loading: AnyPublisher<Bool, Never> { get }

View file

@ -70,6 +70,10 @@ extension ProfileViewModel: CollectionViewModel {
$accountViewModel.compactMap { $0?.accountName }.eraseToAnyPublisher()
}
public var titleLocalizationComponents: AnyPublisher<[String], Never> {
collectionViewModel.flatMap(\.titleLocalizationComponents).eraseToAnyPublisher()
}
public var expandAll: AnyPublisher<ExpandAllState, Never> {
Empty().eraseToAnyPublisher()
}