chore: move core logic into package

This commit is contained in:
CMK 2022-10-08 13:43:06 +08:00
parent 64f3d2fe3a
commit fa27a28a60
232 changed files with 455 additions and 246 deletions

View File

@ -6,6 +6,7 @@
// //
import UIKit import UIKit
import MastodonCore
protocol NeedsDependency: AnyObject { protocol NeedsDependency: AnyObject {
var context: AppContext! { get set } var context: AppContext! { get set }

View File

@ -5,11 +5,11 @@
// Created by sxiaojian on 2021/4/22. // Created by sxiaojian on 2021/4/22.
// //
import UIKit
import CoreData import CoreData
import CoreDataStack import CoreDataStack
import Foundation import MastodonCore
import MastodonSDK import MastodonSDK
import UIKit
enum SelectedAccountSection: Equatable, Hashable { enum SelectedAccountSection: Equatable, Hashable {
case main case main

View File

@ -6,6 +6,7 @@
// //
import Foundation import Foundation
import MastodonCore
enum ComposeStatusAttachmentItem { enum ComposeStatusAttachmentItem {
case attachment(attachmentService: MastodonAttachmentService) case attachment(attachmentService: MastodonAttachmentService)

View File

@ -8,6 +8,7 @@
import Foundation import Foundation
import Combine import Combine
import CoreData import CoreData
import MastodonCore
import MastodonMeta import MastodonMeta
import CoreDataStack import CoreDataStack

View File

@ -21,7 +21,7 @@ enum ComposeStatusSection: Equatable, Hashable {
} }
extension ComposeStatusSection { extension ComposeStatusSection {
enum ComposeKind { public enum ComposeKind {
case post case post
case hashtag(hashtag: String) case hashtag(hashtag: String)
case mention(user: ManagedObjectRecord<MastodonUser>) case mention(user: ManagedObjectRecord<MastodonUser>)

View File

@ -7,6 +7,7 @@
import os.log import os.log
import UIKit import UIKit
import MastodonCore
import MastodonUI import MastodonUI
import MastodonSDK import MastodonSDK

View File

@ -14,6 +14,7 @@ import UIKit
import MetaTextKit import MetaTextKit
import MastodonMeta import MastodonMeta
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonLocalization import MastodonLocalization
enum NotificationSection: Equatable, Hashable { enum NotificationSection: Equatable, Hashable {

View File

@ -8,6 +8,7 @@
import os import os
import UIKit import UIKit
import Combine import Combine
import MastodonCore
import MastodonMeta import MastodonMeta
import MastodonLocalization import MastodonLocalization

View File

@ -13,6 +13,7 @@ import UIKit
import MetaTextKit import MetaTextKit
import MastodonMeta import MastodonMeta
import Combine import Combine
import MastodonCore
enum RecommendAccountSection: Equatable, Hashable { enum RecommendAccountSection: Equatable, Hashable {
case main case main

View File

@ -13,6 +13,7 @@ import MastodonSDK
import UIKit import UIKit
import os.log import os.log
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonLocalization import MastodonLocalization
enum ReportSection: Equatable, Hashable { enum ReportSection: Equatable, Hashable {

View File

@ -7,6 +7,7 @@
import UIKit import UIKit
import CoreDataStack import CoreDataStack
import MastodonCore
enum SearchHistorySection: Hashable { enum SearchHistorySection: Hashable {
case main case main

View File

@ -12,6 +12,7 @@ import UIKit
import CoreData import CoreData
import CoreDataStack import CoreDataStack
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonLocalization import MastodonLocalization
import MastodonUI import MastodonUI

View File

@ -7,6 +7,7 @@
import UIKit import UIKit
import MastodonSDK import MastodonSDK
import MastodonCore
import MastodonLocalization import MastodonLocalization
enum SearchSection: Hashable { enum SearchSection: Hashable {

View File

@ -9,6 +9,7 @@ import UIKit
import CoreData import CoreData
import CoreDataStack import CoreDataStack
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonLocalization import MastodonLocalization
enum SettingsSection: Hashable { enum SettingsSection: Hashable {
@ -124,7 +125,7 @@ extension SettingsSection {
extension SettingsSection { extension SettingsSection {
static func configureSettingToggle( public static func configureSettingToggle(
cell: SettingsToggleTableViewCell, cell: SettingsToggleTableViewCell,
item: SettingsItem, item: SettingsItem,
setting: Setting setting: Setting
@ -155,7 +156,7 @@ extension SettingsSection {
} }
} }
static func configureSettingToggle( public static func configureSettingToggle(
cell: SettingsToggleTableViewCell, cell: SettingsToggleTableViewCell,
switchMode: SettingsItem.NotificationSwitchMode, switchMode: SettingsItem.NotificationSwitchMode,
subscription: NotificationSubscription subscription: NotificationSubscription

View File

@ -15,6 +15,7 @@ import AlamofireImage
import MastodonMeta import MastodonMeta
import MastodonSDK import MastodonSDK
import NaturalLanguage import NaturalLanguage
import MastodonCore
import MastodonUI import MastodonUI
enum StatusSection: Equatable, Hashable { enum StatusSection: Equatable, Hashable {

View File

@ -9,6 +9,7 @@ import os.log
import UIKit import UIKit
import CoreData import CoreData
import CoreDataStack import CoreDataStack
import MastodonCore
import MetaTextKit import MetaTextKit
import MastodonMeta import MastodonMeta

View File

@ -7,6 +7,7 @@
import UIKit import UIKit
import CoreDataStack import CoreDataStack
import MastodonCore
extension DataSourceFacade { extension DataSourceFacade {
static func responseToUserBlockAction( static func responseToUserBlockAction(

View File

@ -8,9 +8,10 @@
import UIKit import UIKit
import CoreData import CoreData
import CoreDataStack import CoreDataStack
import MastodonCore
extension DataSourceFacade { extension DataSourceFacade {
static func responseToStatusBookmarkAction( public static func responseToStatusBookmarkAction(
provider: DataSourceProvider, provider: DataSourceProvider,
status: ManagedObjectRecord<Status>, status: ManagedObjectRecord<Status>,
authenticationBox: MastodonAuthenticationBox authenticationBox: MastodonAuthenticationBox

View File

@ -8,9 +8,10 @@
import UIKit import UIKit
import CoreData import CoreData
import CoreDataStack import CoreDataStack
import MastodonCore
extension DataSourceFacade { extension DataSourceFacade {
static func responseToStatusFavoriteAction( public static func responseToStatusFavoriteAction(
provider: DataSourceProvider, provider: DataSourceProvider,
status: ManagedObjectRecord<Status>, status: ManagedObjectRecord<Status>,
authenticationBox: MastodonAuthenticationBox authenticationBox: MastodonAuthenticationBox

View File

@ -8,6 +8,7 @@
import UIKit import UIKit
import CoreDataStack import CoreDataStack
import class CoreDataStack.Notification import class CoreDataStack.Notification
import MastodonCore
import MastodonSDK import MastodonSDK
import MastodonLocalization import MastodonLocalization

View File

@ -7,6 +7,7 @@
import UIKit import UIKit
import CoreDataStack import CoreDataStack
import MastodonCore
extension DataSourceFacade { extension DataSourceFacade {
static func responseToUserMuteAction( static func responseToUserMuteAction(

View File

@ -7,6 +7,7 @@
import UIKit import UIKit
import CoreDataStack import CoreDataStack
import MastodonCore
import MastodonUI import MastodonUI
extension DataSourceFacade { extension DataSourceFacade {

View File

@ -7,6 +7,7 @@
import Foundation import Foundation
import CoreDataStack import CoreDataStack
import MastodonCore
extension DataSourceFacade { extension DataSourceFacade {

View File

@ -7,6 +7,7 @@
import UIKit import UIKit
import CoreDataStack import CoreDataStack
import MastodonCore
import MastodonUI import MastodonUI
import MastodonLocalization import MastodonLocalization

View File

@ -8,6 +8,8 @@
import os.log import os.log
import UIKit import UIKit
import CoreDataStack import CoreDataStack
import MastodonCore
import MastodonUI
import MastodonLocalization import MastodonLocalization
extension UITableViewDelegate where Self: DataSourceProvider { extension UITableViewDelegate where Self: DataSourceProvider {

View File

@ -9,6 +9,7 @@ import UIKit
import Combine import Combine
import FLAnimatedImage import FLAnimatedImage
import MetaTextKit import MetaTextKit
import MastodonCore
import MastodonUI import MastodonUI
final class AccountListTableViewCell: UITableViewCell { final class AccountListTableViewCell: UITableViewCell {

View File

@ -8,6 +8,7 @@
import os.log import os.log
import UIKit import UIKit
import Combine import Combine
import MastodonCore
protocol AutoCompleteViewControllerDelegate: AnyObject { protocol AutoCompleteViewControllerDelegate: AnyObject {
func autoCompleteViewController(_ viewController: AutoCompleteViewController, didSelectItem item: AutoCompleteItem) func autoCompleteViewController(_ viewController: AutoCompleteViewController, didSelectItem item: AutoCompleteItem)

View File

@ -7,6 +7,8 @@
import UIKit import UIKit
import Combine import Combine
import MastodonCore
import MastodonUI
final class AutoCompleteTopChevronView: UIView { final class AutoCompleteTopChevronView: UIView {

View File

@ -9,6 +9,8 @@ import os.log
import UIKit import UIKit
import Combine import Combine
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonUI
import MastodonLocalization import MastodonLocalization
protocol ComposeStatusPollExpiresOptionCollectionViewCellDelegate: AnyObject { protocol ComposeStatusPollExpiresOptionCollectionViewCellDelegate: AnyObject {

View File

@ -8,6 +8,8 @@
import os.log import os.log
import UIKit import UIKit
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonUI
import MastodonLocalization import MastodonLocalization
protocol ComposeStatusPollOptionAppendEntryCollectionViewCellDelegate: AnyObject { protocol ComposeStatusPollOptionAppendEntryCollectionViewCellDelegate: AnyObject {

View File

@ -9,6 +9,7 @@ import os.log
import UIKit import UIKit
import Combine import Combine
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonLocalization import MastodonLocalization
import MastodonUI import MastodonUI

View File

@ -9,11 +9,12 @@ import os.log
import UIKit import UIKit
import Combine import Combine
import PhotosUI import PhotosUI
import Meta
import MetaTextKit import MetaTextKit
import MastodonMeta import MastodonMeta
import Meta
import MastodonUI
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonUI
import MastodonLocalization import MastodonLocalization
import MastodonSDK import MastodonSDK
@ -752,7 +753,10 @@ extension ComposeViewController {
// TODO: handle error // TODO: handle error
return return
} }
context.statusPublishService.publish(composeViewModel: viewModel)
// context.statusPublishService.publish(composeViewModel: viewModel)
assertionFailure()
dismiss(animated: true, completion: nil) dismiss(animated: true, completion: nil)
} }

View File

@ -9,11 +9,12 @@ import os.log
import UIKit import UIKit
import Combine import Combine
import CoreDataStack import CoreDataStack
import MastodonSDK
import MastodonMeta
import MetaTextKit import MetaTextKit
import MastodonMeta
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonLocalization import MastodonLocalization
import MastodonSDK
extension ComposeViewModel { extension ComposeViewModel {

View File

@ -13,6 +13,7 @@ import CoreDataStack
import GameplayKit import GameplayKit
import MastodonSDK import MastodonSDK
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonLocalization import MastodonLocalization
import MastodonMeta import MastodonMeta
import MastodonUI import MastodonUI

View File

@ -7,6 +7,7 @@
import UIKit import UIKit
import Combine import Combine
import MastodonUI
final class ComposeRepliedToStatusContentTableViewCell: UITableViewCell { final class ComposeRepliedToStatusContentTableViewCell: UITableViewCell {

View File

@ -6,8 +6,9 @@
// //
import UIKit import UIKit
import MastodonUI
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonUI
import MastodonLocalization import MastodonLocalization
extension AttachmentContainerView { extension AttachmentContainerView {

View File

@ -10,6 +10,8 @@ import UIKit
import Combine import Combine
import MastodonSDK import MastodonSDK
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonUI
import MastodonLocalization import MastodonLocalization
protocol ComposeToolbarViewDelegate: AnyObject { protocol ComposeToolbarViewDelegate: AnyObject {

View File

@ -8,6 +8,7 @@
import UIKit import UIKit
import MastodonUI import MastodonUI
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonLocalization import MastodonLocalization
final class StatusContentWarningEditorView: UIView { final class StatusContentWarningEditorView: UIView {

View File

@ -8,6 +8,7 @@
import os.log import os.log
import UIKit import UIKit
import Combine import Combine
import MastodonCore
import MastodonUI import MastodonUI
// Local Timeline // Local Timeline

View File

@ -164,7 +164,7 @@ extension DiscoveryCommunityViewModel.State {
self.maxID = newMaxID self.maxID = newMaxID
var hasNewStatusesAppend = false var hasNewStatusesAppend = false
var statusIDs = isReloading ? [] : viewModel.statusFetchedResultsController.statusIDs.value var statusIDs = isReloading ? [] : viewModel.statusFetchedResultsController.statusIDs
for status in response.value { for status in response.value {
guard !statusIDs.contains(status.id) else { continue } guard !statusIDs.contains(status.id) else { continue }
statusIDs.append(status.id) statusIDs.append(status.id)
@ -177,7 +177,7 @@ extension DiscoveryCommunityViewModel.State {
} else { } else {
await enter(state: NoMore.self) await enter(state: NoMore.self)
} }
viewModel.statusFetchedResultsController.statusIDs.value = statusIDs viewModel.statusFetchedResultsController.statusIDs = statusIDs
viewModel.didLoadLatest.send() viewModel.didLoadLatest.send()
} catch { } catch {

View File

@ -54,7 +54,7 @@ final class DiscoveryCommunityViewModel {
context.authenticationService.activeMastodonAuthentication context.authenticationService.activeMastodonAuthentication
.map { $0?.domain } .map { $0?.domain }
.assign(to: \.value, on: statusFetchedResultsController.domain) .assign(to: \.domain, on: statusFetchedResultsController)
.store(in: &disposeBag) .store(in: &disposeBag)
} }

View File

@ -11,6 +11,7 @@ import Combine
import Tabman import Tabman
import Pageboy import Pageboy
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonUI import MastodonUI
public class DiscoveryViewController: TabmanViewController, NeedsDependency { public class DiscoveryViewController: TabmanViewController, NeedsDependency {

View File

@ -9,6 +9,7 @@ import UIKit
import Combine import Combine
import Tabman import Tabman
import Pageboy import Pageboy
import MastodonCore
import MastodonLocalization import MastodonLocalization
final class DiscoveryViewModel { final class DiscoveryViewModel {

View File

@ -9,6 +9,7 @@ import os.log
import UIKit import UIKit
import Combine import Combine
import MastodonUI import MastodonUI
import MastodonCore
final class DiscoveryForYouViewController: UIViewController, NeedsDependency, MediaPreviewableViewController { final class DiscoveryForYouViewController: UIViewController, NeedsDependency, MediaPreviewableViewController {

View File

@ -12,6 +12,7 @@ import GameplayKit
import CoreData import CoreData
import CoreDataStack import CoreDataStack
import MastodonSDK import MastodonSDK
import MastodonCore
final class DiscoveryForYouViewModel { final class DiscoveryForYouViewModel {

View File

@ -8,6 +8,7 @@
import os.log import os.log
import UIKit import UIKit
import Combine import Combine
import MastodonCore
import MastodonUI import MastodonUI
final class DiscoveryHashtagsViewController: UIViewController, NeedsDependency, MediaPreviewableViewController { final class DiscoveryHashtagsViewController: UIViewController, NeedsDependency, MediaPreviewableViewController {

View File

@ -11,6 +11,7 @@ import Combine
import GameplayKit import GameplayKit
import CoreData import CoreData
import CoreDataStack import CoreDataStack
import MastodonCore
import MastodonSDK import MastodonSDK
final class DiscoveryHashtagsViewModel { final class DiscoveryHashtagsViewModel {

View File

@ -8,6 +8,7 @@
import os.log import os.log
import UIKit import UIKit
import Combine import Combine
import MastodonCore
import MastodonUI import MastodonUI
final class DiscoveryNewsViewController: UIViewController, NeedsDependency, MediaPreviewableViewController { final class DiscoveryNewsViewController: UIViewController, NeedsDependency, MediaPreviewableViewController {

View File

@ -12,6 +12,7 @@ import GameplayKit
import CoreData import CoreData
import CoreDataStack import CoreDataStack
import MastodonSDK import MastodonSDK
import MastodonCore
final class DiscoveryNewsViewModel { final class DiscoveryNewsViewModel {

View File

@ -8,6 +8,7 @@
import os.log import os.log
import UIKit import UIKit
import Combine import Combine
import MastodonCore
import MastodonUI import MastodonUI
final class DiscoveryPostsViewController: UIViewController, NeedsDependency, MediaPreviewableViewController { final class DiscoveryPostsViewController: UIViewController, NeedsDependency, MediaPreviewableViewController {

View File

@ -9,6 +9,7 @@ import os.log
import Foundation import Foundation
import GameplayKit import GameplayKit
import MastodonSDK import MastodonSDK
import MastodonCore
extension DiscoveryPostsViewModel { extension DiscoveryPostsViewModel {
class State: GKState, NamingState { class State: GKState, NamingState {
@ -166,7 +167,7 @@ extension DiscoveryPostsViewModel.State {
self.offset = newOffset self.offset = newOffset
var hasNewStatusesAppend = false var hasNewStatusesAppend = false
var statusIDs = isReloading ? [] : viewModel.statusFetchedResultsController.statusIDs.value var statusIDs = isReloading ? [] : viewModel.statusFetchedResultsController.statusIDs
for status in response.value { for status in response.value {
guard !statusIDs.contains(status.id) else { continue } guard !statusIDs.contains(status.id) else { continue }
statusIDs.append(status.id) statusIDs.append(status.id)
@ -178,7 +179,7 @@ extension DiscoveryPostsViewModel.State {
} else { } else {
await enter(state: NoMore.self) await enter(state: NoMore.self)
} }
viewModel.statusFetchedResultsController.statusIDs.value = statusIDs viewModel.statusFetchedResultsController.statusIDs = statusIDs
viewModel.didLoadLatest.send() viewModel.didLoadLatest.send()
} catch { } catch {

View File

@ -12,6 +12,7 @@ import GameplayKit
import CoreData import CoreData
import CoreDataStack import CoreDataStack
import MastodonSDK import MastodonSDK
import MastodonCore
final class DiscoveryPostsViewModel { final class DiscoveryPostsViewModel {
@ -51,7 +52,7 @@ final class DiscoveryPostsViewModel {
context.authenticationService.activeMastodonAuthentication context.authenticationService.activeMastodonAuthentication
.map { $0?.domain } .map { $0?.domain }
.assign(to: \.value, on: statusFetchedResultsController.domain) .assign(to: \.domain, on: statusFetchedResultsController)
.store(in: &disposeBag) .store(in: &disposeBag)
Task { Task {

View File

@ -9,6 +9,8 @@ import os.log
import UIKit import UIKit
import Combine import Combine
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonUI
import MastodonLocalization import MastodonLocalization
public protocol DiscoveryIntroBannerViewDelegate: AnyObject { public protocol DiscoveryIntroBannerViewDelegate: AnyObject {

View File

@ -12,6 +12,7 @@ import Combine
import GameplayKit import GameplayKit
import CoreData import CoreData
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonLocalization import MastodonLocalization
final class HashtagTimelineViewController: UIViewController, NeedsDependency, MediaPreviewableViewController { final class HashtagTimelineViewController: UIViewController, NeedsDependency, MediaPreviewableViewController {

View File

@ -167,7 +167,7 @@ extension HashtagTimelineViewModel.State {
self.maxID = newMaxID self.maxID = newMaxID
var hasNewStatusesAppend = false var hasNewStatusesAppend = false
var statusIDs = isReloading ? [] : viewModel.fetchedResultsController.statusIDs.value var statusIDs = isReloading ? [] : viewModel.fetchedResultsController.statusIDs
for status in response.value { for status in response.value {
guard !statusIDs.contains(status.id) else { continue } guard !statusIDs.contains(status.id) else { continue }
statusIDs.append(status.id) statusIDs.append(status.id)

View File

@ -12,7 +12,8 @@ import CoreData
import CoreDataStack import CoreDataStack
import GameplayKit import GameplayKit
import MastodonSDK import MastodonSDK
import MastodonCore
final class HashtagTimelineViewModel { final class HashtagTimelineViewModel {
let logger = Logger(subsystem: "HashtagTimelineViewModel", category: "ViewModel") let logger = Logger(subsystem: "HashtagTimelineViewModel", category: "ViewModel")
@ -63,7 +64,7 @@ final class HashtagTimelineViewModel {
context.authenticationService.activeMastodonAuthenticationBox context.authenticationService.activeMastodonAuthenticationBox
.map { $0?.domain } .map { $0?.domain }
.assign(to: \.value, on: fetchedResultsController.domain) .assign(to: \.domain, on: fetchedResultsController)
.store(in: &disposeBag) .store(in: &disposeBag)
} }

View File

@ -13,6 +13,7 @@ import CoreData
import CoreDataStack import CoreDataStack
import FLEX import FLEX
import SwiftUI import SwiftUI
import MastodonCore
import MastodonUI import MastodonUI
import MastodonSDK import MastodonSDK
import StoreKit import StoreKit

View File

@ -16,8 +16,9 @@ import MastodonSDK
import AlamofireImage import AlamofireImage
import StoreKit import StoreKit
import MastodonAsset import MastodonAsset
import MastodonLocalization import MastodonCore
import MastodonUI import MastodonUI
import MastodonLocalization
final class HomeTimelineViewController: UIViewController, NeedsDependency, MediaPreviewableViewController { final class HomeTimelineViewController: UIViewController, NeedsDependency, MediaPreviewableViewController {

View File

@ -11,6 +11,7 @@ import Foundation
import CoreData import CoreData
import CoreDataStack import CoreDataStack
import GameplayKit import GameplayKit
import MastodonCore
extension HomeTimelineViewModel { extension HomeTimelineViewModel {
class LoadLatestState: GKState { class LoadLatestState: GKState {

View File

@ -15,6 +15,7 @@ import CoreDataStack
import GameplayKit import GameplayKit
import AlamofireImage import AlamofireImage
import DateToolsSwift import DateToolsSwift
import MastodonCore
final class HomeTimelineViewModel: NSObject { final class HomeTimelineViewModel: NSObject {

View File

@ -8,6 +8,7 @@
import Combine import Combine
import Foundation import Foundation
import UIKit import UIKit
import MastodonCore
final class HomeTimelineNavigationBarTitleViewModel { final class HomeTimelineNavigationBarTitleViewModel {
@ -48,21 +49,21 @@ final class HomeTimelineNavigationBarTitleViewModel {
.assign(to: \.value, on: isOffline) .assign(to: \.value, on: isOffline)
.store(in: &disposeBag) .store(in: &disposeBag)
context.statusPublishService.latestPublishingComposeViewModel // context.statusPublishService.latestPublishingComposeViewModel
.receive(on: DispatchQueue.main) // .receive(on: DispatchQueue.main)
.sink { [weak self] composeViewModel in // .sink { [weak self] composeViewModel in
guard let self = self else { return } // guard let self = self else { return }
guard let composeViewModel = composeViewModel, // guard let composeViewModel = composeViewModel,
let state = composeViewModel.publishStateMachine.currentState else { // let state = composeViewModel.publishStateMachine.currentState else {
self.isPublishingPost.value = false // self.isPublishingPost.value = false
self.isPublished.value = false // self.isPublished.value = false
return // return
} // }
//
self.isPublishingPost.value = state is ComposeViewModel.PublishState.Publishing || state is ComposeViewModel.PublishState.Fail // self.isPublishingPost.value = state is ComposeViewModel.PublishState.Publishing || state is ComposeViewModel.PublishState.Fail
self.isPublished.value = state is ComposeViewModel.PublishState.Finish // self.isPublished.value = state is ComposeViewModel.PublishState.Finish
} // }
.store(in: &disposeBag) // .store(in: &disposeBag)
Publishers.CombineLatest4( Publishers.CombineLatest4(
hasNewPosts.eraseToAnyPublisher(), hasNewPosts.eraseToAnyPublisher(),

View File

@ -11,6 +11,7 @@ import Combine
import Alamofire import Alamofire
import AlamofireImage import AlamofireImage
import FLAnimatedImage import FLAnimatedImage
import MastodonCore
class MediaPreviewImageViewModel { class MediaPreviewImageViewModel {
@ -29,18 +30,18 @@ class MediaPreviewImageViewModel {
extension MediaPreviewImageViewModel { extension MediaPreviewImageViewModel {
enum ImagePreviewItem { public enum ImagePreviewItem {
case remote(RemoteImageContext) case remote(RemoteImageContext)
case local(LocalImageContext) case local(LocalImageContext)
} }
struct RemoteImageContext { public struct RemoteImageContext {
let assetURL: URL? let assetURL: URL?
let thumbnail: UIImage? let thumbnail: UIImage?
let altText: String? let altText: String?
} }
struct LocalImageContext { public struct LocalImageContext {
let image: UIImage let image: UIImage
} }

View File

@ -10,6 +10,8 @@ import UIKit
import Combine import Combine
import Pageboy import Pageboy
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonUI
import MastodonLocalization import MastodonLocalization
final class MediaPreviewViewController: UIViewController, NeedsDependency { final class MediaPreviewViewController: UIViewController, NeedsDependency {

View File

@ -10,6 +10,7 @@ import Combine
import CoreData import CoreData
import CoreDataStack import CoreDataStack
import Pageboy import Pageboy
import MastodonCore
final class MediaPreviewViewModel: NSObject { final class MediaPreviewViewModel: NSObject {

View File

@ -10,6 +10,7 @@ import UIKit
import AVKit import AVKit
import Combine import Combine
import AlamofireImage import AlamofireImage
import MastodonCore
final class MediaPreviewVideoViewModel { final class MediaPreviewVideoViewModel {

View File

@ -8,6 +8,7 @@
import os.log import os.log
import UIKit import UIKit
import Combine import Combine
import MastodonCore
import MastodonUI import MastodonUI
final class NotificationTableViewCell: UITableViewCell { final class NotificationTableViewCell: UITableViewCell {

View File

@ -9,6 +9,7 @@ import os.log
import UIKit import UIKit
import Combine import Combine
import CoreDataStack import CoreDataStack
import MastodonCore
import MastodonLocalization import MastodonLocalization
final class NotificationTimelineViewController: UIViewController, NeedsDependency, MediaPreviewableViewController { final class NotificationTimelineViewController: UIViewController, NeedsDependency, MediaPreviewableViewController {

View File

@ -11,6 +11,7 @@ import Combine
import CoreDataStack import CoreDataStack
import GameplayKit import GameplayKit
import MastodonSDK import MastodonSDK
import MastodonCore
final class NotificationTimelineViewModel { final class NotificationTimelineViewModel {
@ -78,7 +79,7 @@ final class NotificationTimelineViewModel {
extension NotificationTimelineViewModel { extension NotificationTimelineViewModel {
typealias Scope = APIService.NotificationScope typealias Scope = APIService.MastodonNotificationScope
static func feedPredicate( static func feedPredicate(
authenticationBox: MastodonAuthenticationBox, authenticationBox: MastodonAuthenticationBox,

View File

@ -12,6 +12,7 @@ import MastodonAsset
import MastodonLocalization import MastodonLocalization
import Tabman import Tabman
import Pageboy import Pageboy
import MastodonCore
final class NotificationViewController: TabmanViewController, NeedsDependency { final class NotificationViewController: TabmanViewController, NeedsDependency {

View File

@ -8,9 +8,10 @@
import os.log import os.log
import UIKit import UIKit
import Combine import Combine
import MastodonAsset
import MastodonLocalization
import Pageboy import Pageboy
import MastodonAsset
import MastodonCore
import MastodonLocalization
final class NotificationViewModel { final class NotificationViewModel {

View File

@ -11,6 +11,8 @@ import os.log
import ThirdPartyMailer import ThirdPartyMailer
import UIKit import UIKit
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonUI
import MastodonLocalization import MastodonLocalization
final class MastodonConfirmEmailViewController: UIViewController, NeedsDependency { final class MastodonConfirmEmailViewController: UIViewController, NeedsDependency {
@ -205,10 +207,10 @@ extension MastodonConfirmEmailViewController {
} }
func showEmailAppAlert() { func showEmailAppAlert() {
let clients = ThirdPartyMailClient.clients() let clients = ThirdPartyMailClient.clients
let application = UIApplication.shared let application = UIApplication.shared
let availableClients = clients.filter { client -> Bool in let availableClients = clients.filter { client -> Bool in
ThirdPartyMailer.application(application, isMailClientAvailable: client) ThirdPartyMailer.isMailClientAvailable(client)
} }
let alertController = UIAlertController(title: L10n.Scene.ConfirmEmail.OpenEmailApp.openEmailClient, message: nil, preferredStyle: .alert) let alertController = UIAlertController(title: L10n.Scene.ConfirmEmail.OpenEmailApp.openEmailClient, message: nil, preferredStyle: .alert)
@ -218,7 +220,7 @@ extension MastodonConfirmEmailViewController {
alertController.addAction(alertAction) alertController.addAction(alertAction)
_ = availableClients.compactMap { client -> UIAlertAction in _ = availableClients.compactMap { client -> UIAlertAction in
let alertAction = UIAlertAction(title: client.name, style: .default) { _ in let alertAction = UIAlertAction(title: client.name, style: .default) { _ in
_ = ThirdPartyMailer.application(application, openMailClient: client) _ = ThirdPartyMailer.open(client, completionHandler: nil)
} }
alertController.addAction(alertAction) alertController.addAction(alertAction)
return alertAction return alertAction

View File

@ -7,6 +7,7 @@
import Combine import Combine
import Foundation import Foundation
import MastodonCore
import MastodonSDK import MastodonSDK
final class MastodonConfirmEmailViewModel { final class MastodonConfirmEmailViewModel {

View File

@ -11,6 +11,7 @@ import Combine
import GameController import GameController
import AuthenticationServices import AuthenticationServices
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonLocalization import MastodonLocalization
import MastodonUI import MastodonUI
@ -281,7 +282,7 @@ extension MastodonPickServerViewController {
guard let info = AuthenticationViewModel.AuthenticateInfo( guard let info = AuthenticationViewModel.AuthenticateInfo(
domain: server.domain, domain: server.domain,
application: application, application: application,
redirectURI: response.value.redirectURI ?? MastodonAuthenticationController.callbackURL redirectURI: response.value.redirectURI ?? APIService.oauthCallbackURL
) else { ) else {
throw APIService.APIError.explicit(.badResponse) throw APIService.APIError.explicit(.badResponse)
} }

View File

@ -13,6 +13,8 @@ import MastodonSDK
import CoreDataStack import CoreDataStack
import OrderedCollections import OrderedCollections
import Tabman import Tabman
import MastodonCore
import MastodonUI
class MastodonPickServerViewModel: NSObject { class MastodonPickServerViewModel: NSObject {

View File

@ -8,6 +8,8 @@
import UIKit import UIKit
import Combine import Combine
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonUI
import MastodonLocalization import MastodonLocalization
final class PickServerLoaderTableViewCell: TimelineLoaderTableViewCell { final class PickServerLoaderTableViewCell: TimelineLoaderTableViewCell {

View File

@ -8,6 +8,7 @@
import UIKit import UIKit
import MastodonSDK import MastodonSDK
import MastodonAsset import MastodonAsset
import MastodonUI
import MastodonLocalization import MastodonLocalization
class PickServerCategoryView: UIView { class PickServerCategoryView: UIView {

View File

@ -7,6 +7,8 @@
import UIKit import UIKit
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonUI
import MastodonLocalization import MastodonLocalization
final class PickServerEmptyStateView: UIView { final class PickServerEmptyStateView: UIView {

View File

@ -14,6 +14,7 @@ import UIKit
import SwiftUI import SwiftUI
import MastodonUI import MastodonUI
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonLocalization import MastodonLocalization
final class MastodonRegisterViewController: UIViewController, NeedsDependency, OnboardingViewControllerAppearance { final class MastodonRegisterViewController: UIViewController, NeedsDependency, OnboardingViewControllerAppearance {

View File

@ -10,6 +10,7 @@ import Foundation
import MastodonSDK import MastodonSDK
import UIKit import UIKit
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonLocalization import MastodonLocalization
final class MastodonRegisterViewModel: ObservableObject { final class MastodonRegisterViewModel: ObservableObject {

View File

@ -9,6 +9,7 @@ import Combine
import os.log import os.log
import UIKit import UIKit
import WebKit import WebKit
import MastodonCore
final class MastodonResendEmailViewController: UIViewController, NeedsDependency { final class MastodonResendEmailViewController: UIViewController, NeedsDependency {

View File

@ -6,6 +6,7 @@
// //
import UIKit import UIKit
import MastodonCore
#if DEBUG #if DEBUG

View File

@ -12,6 +12,7 @@ import MastodonSDK
import SafariServices import SafariServices
import MetaTextKit import MetaTextKit
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonLocalization import MastodonLocalization
final class MastodonServerRulesViewController: UIViewController, NeedsDependency { final class MastodonServerRulesViewController: UIViewController, NeedsDependency {

View File

@ -11,6 +11,7 @@ import CoreData
import CoreDataStack import CoreDataStack
import Combine import Combine
import MastodonSDK import MastodonSDK
import MastodonCore
final class AuthenticationViewModel { final class AuthenticationViewModel {
@ -121,7 +122,7 @@ extension AuthenticationViewModel {
init?( init?(
domain: String, domain: String,
application: Mastodon.Entity.Application, application: Mastodon.Entity.Application,
redirectURI: String = MastodonAuthenticationController.callbackURL redirectURI: String = APIService.oauthCallbackURL
) { ) {
self.domain = domain self.domain = domain
guard let clientID = application.clientID, guard let clientID = application.clientID,

View File

@ -9,13 +9,14 @@ import os.log
import UIKit import UIKit
import Combine import Combine
import AuthenticationServices import AuthenticationServices
import MastodonCore
final class MastodonAuthenticationController { final class MastodonAuthenticationController {
var disposeBag = Set<AnyCancellable>() var disposeBag = Set<AnyCancellable>()
// input // input
var context: AppContext! var context: AppContext
let authenticateURL: URL let authenticateURL: URL
var authenticationSession: ASWebAuthenticationSession? var authenticationSession: ASWebAuthenticationSession?

View File

@ -7,6 +7,8 @@
import UIKit import UIKit
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonUI
import MastodonLocalization import MastodonLocalization
final class WelcomeIllustrationView: UIView { final class WelcomeIllustrationView: UIView {

View File

@ -9,6 +9,7 @@ import os.log
import UIKit import UIKit
import Combine import Combine
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonLocalization import MastodonLocalization
final class WelcomeViewController: UIViewController, NeedsDependency { final class WelcomeViewController: UIViewController, NeedsDependency {

View File

@ -7,6 +7,7 @@
import Foundation import Foundation
import Combine import Combine
import MastodonCore
final class WelcomeViewModel { final class WelcomeViewModel {

View File

@ -11,6 +11,7 @@ import Combine
import MastodonAsset import MastodonAsset
import MastodonLocalization import MastodonLocalization
import MetaTextKit import MetaTextKit
import MastodonCore
import MastodonUI import MastodonUI
final class ProfileFieldAddEntryCollectionViewCell: UICollectionViewCell { final class ProfileFieldAddEntryCollectionViewCell: UICollectionViewCell {

View File

@ -10,6 +10,8 @@ import UIKit
import Combine import Combine
import MetaTextKit import MetaTextKit
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonUI
import MastodonLocalization import MastodonLocalization
protocol ProfileFieldEditCollectionViewCellDelegate: AnyObject { protocol ProfileFieldEditCollectionViewCellDelegate: AnyObject {

View File

@ -12,6 +12,7 @@ import MetaTextKit
import MastodonLocalization import MastodonLocalization
import TabBarPager import TabBarPager
import XLPagerTabStrip import XLPagerTabStrip
import MastodonCore
protocol ProfileAboutViewControllerDelegate: AnyObject { protocol ProfileAboutViewControllerDelegate: AnyObject {
func profileAboutViewController(_ viewController: ProfileAboutViewController, profileFieldCollectionViewCell: ProfileFieldCollectionViewCell, metaLabel: MetaLabel, didSelectMeta meta: Meta) func profileAboutViewController(_ viewController: ProfileAboutViewController, profileFieldCollectionViewCell: ProfileFieldCollectionViewCell, metaLabel: MetaLabel, didSelectMeta meta: Meta)

View File

@ -11,6 +11,7 @@ import Combine
import CoreDataStack import CoreDataStack
import MastodonSDK import MastodonSDK
import MastodonMeta import MastodonMeta
import MastodonCore
import Kanna import Kanna
final class ProfileAboutViewModel { final class ProfileAboutViewModel {

View File

@ -11,6 +11,7 @@ import AVKit
import Combine import Combine
import GameplayKit import GameplayKit
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonLocalization import MastodonLocalization
final class BookmarkViewController: UIViewController, NeedsDependency, MediaPreviewableViewController { final class BookmarkViewController: UIViewController, NeedsDependency, MediaPreviewableViewController {

View File

@ -9,6 +9,7 @@ import os.log
import Foundation import Foundation
import GameplayKit import GameplayKit
import MastodonSDK import MastodonSDK
import MastodonCore
extension BookmarkViewModel { extension BookmarkViewModel {
class State: GKState, NamingState { class State: GKState, NamingState {
@ -72,7 +73,7 @@ extension BookmarkViewModel.State {
guard let viewModel = viewModel, let stateMachine = stateMachine else { return } guard let viewModel = viewModel, let stateMachine = stateMachine else { return }
// reset // reset
viewModel.statusFetchedResultsController.statusIDs.value = [] viewModel.statusFetchedResultsController.statusIDs = []
stateMachine.enter(Loading.self) stateMachine.enter(Loading.self)
} }
@ -150,7 +151,7 @@ extension BookmarkViewModel.State {
) )
var hasNewStatusesAppend = false var hasNewStatusesAppend = false
var statusIDs = viewModel.statusFetchedResultsController.statusIDs.value var statusIDs = viewModel.statusFetchedResultsController.statusIDs
for status in response.value { for status in response.value {
guard !statusIDs.contains(status.id) else { continue } guard !statusIDs.contains(status.id) else { continue }
statusIDs.append(status.id) statusIDs.append(status.id)
@ -169,7 +170,7 @@ extension BookmarkViewModel.State {
} else { } else {
await enter(state: NoMore.self) await enter(state: NoMore.self)
} }
viewModel.statusFetchedResultsController.statusIDs.value = statusIDs viewModel.statusFetchedResultsController.statusIDs = statusIDs
} catch { } catch {
logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): fetch user bookmarks fail: \(error.localizedDescription)") logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): fetch user bookmarks fail: \(error.localizedDescription)")
await enter(state: Fail.self) await enter(state: Fail.self)

View File

@ -10,6 +10,7 @@ import Combine
import CoreData import CoreData
import CoreDataStack import CoreDataStack
import GameplayKit import GameplayKit
import MastodonCore
final class BookmarkViewModel { final class BookmarkViewModel {
@ -51,7 +52,7 @@ final class BookmarkViewModel {
activeMastodonAuthenticationBox activeMastodonAuthenticationBox
.map { $0?.domain } .map { $0?.domain }
.assign(to: \.value, on: statusFetchedResultsController.domain) .assign(to: \.domain, on: statusFetchedResultsController)
.store(in: &disposeBag) .store(in: &disposeBag)
} }

View File

@ -7,6 +7,7 @@
import Foundation import Foundation
import CoreDataStack import CoreDataStack
import MastodonCore
final class CachedProfileViewModel: ProfileViewModel { final class CachedProfileViewModel: ProfileViewModel {

View File

@ -8,6 +8,7 @@
import os.log import os.log
import UIKit import UIKit
import Combine import Combine
import MastodonCore
import MastodonLocalization import MastodonLocalization
final class FamiliarFollowersViewController: UIViewController, NeedsDependency { final class FamiliarFollowersViewController: UIViewController, NeedsDependency {

View File

@ -7,6 +7,7 @@
import UIKit import UIKit
import Combine import Combine
import MastodonCore
import MastodonSDK import MastodonSDK
import CoreDataStack import CoreDataStack

View File

@ -14,6 +14,7 @@ import AVKit
import Combine import Combine
import GameplayKit import GameplayKit
import MastodonAsset import MastodonAsset
import MastodonCore
import MastodonLocalization import MastodonLocalization
final class FavoriteViewController: UIViewController, NeedsDependency, MediaPreviewableViewController { final class FavoriteViewController: UIViewController, NeedsDependency, MediaPreviewableViewController {

View File

@ -8,6 +8,7 @@
import os.log import os.log
import Foundation import Foundation
import GameplayKit import GameplayKit
import MastodonCore
import MastodonSDK import MastodonSDK
extension FavoriteViewModel { extension FavoriteViewModel {
@ -72,7 +73,7 @@ extension FavoriteViewModel.State {
guard let viewModel = viewModel, let stateMachine = stateMachine else { return } guard let viewModel = viewModel, let stateMachine = stateMachine else { return }
// reset // reset
viewModel.statusFetchedResultsController.statusIDs.value = [] viewModel.statusFetchedResultsController.statusIDs = []
stateMachine.enter(Loading.self) stateMachine.enter(Loading.self)
} }
@ -150,7 +151,7 @@ extension FavoriteViewModel.State {
) )
var hasNewStatusesAppend = false var hasNewStatusesAppend = false
var statusIDs = viewModel.statusFetchedResultsController.statusIDs.value var statusIDs = viewModel.statusFetchedResultsController.statusIDs
for status in response.value { for status in response.value {
guard !statusIDs.contains(status.id) else { continue } guard !statusIDs.contains(status.id) else { continue }
statusIDs.append(status.id) statusIDs.append(status.id)
@ -169,7 +170,7 @@ extension FavoriteViewModel.State {
} else { } else {
await enter(state: NoMore.self) await enter(state: NoMore.self)
} }
viewModel.statusFetchedResultsController.statusIDs.value = statusIDs viewModel.statusFetchedResultsController.statusIDs = statusIDs
} catch { } catch {
logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): fetch user favorites fail: \(error.localizedDescription)") logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): fetch user favorites fail: \(error.localizedDescription)")
await enter(state: Fail.self) await enter(state: Fail.self)

View File

@ -10,6 +10,7 @@ import Combine
import CoreData import CoreData
import CoreDataStack import CoreDataStack
import GameplayKit import GameplayKit
import MastodonCore
final class FavoriteViewModel { final class FavoriteViewModel {
@ -51,7 +52,7 @@ final class FavoriteViewModel {
activeMastodonAuthenticationBox activeMastodonAuthenticationBox
.map { $0?.domain } .map { $0?.domain }
.assign(to: \.value, on: statusFetchedResultsController.domain) .assign(to: \.domain, on: statusFetchedResultsController)
.store(in: &disposeBag) .store(in: &disposeBag)
} }

Some files were not shown because too many files have changed in this diff Show More