mastodon-app-ufficiale-ipho.../Mastodon/Diffable/Notification/NotificationSection.swift

112 lines
4.1 KiB
Swift
Raw Normal View History

2021-04-12 10:31:53 +02:00
//
// NotificationSection.swift
// Mastodon
//
// Created by sxiaojian on 2021/4/13.
//
2021-04-15 04:16:30 +02:00
import Combine
2021-04-12 10:31:53 +02:00
import CoreData
import CoreDataStack
import Foundation
import MastodonSDK
import UIKit
2021-07-23 13:10:27 +02:00
import MetaTextKit
import MastodonMeta
import MastodonAsset
2022-10-08 07:43:06 +02:00
import MastodonCore
import MastodonUI
import MastodonLocalization
2021-04-12 10:31:53 +02:00
enum NotificationSection: Equatable, Hashable {
case main
}
extension NotificationSection {
struct Configuration {
let authContext: AuthContext
weak var notificationTableViewCellDelegate: NotificationTableViewCellDelegate?
2022-02-15 12:44:45 +01:00
let filterContext: Mastodon.Entity.Filter.Context?
let activeFilters: Published<[Mastodon.Entity.Filter]>.Publisher?
}
static func diffableDataSource(
tableView: UITableView,
context: AppContext,
configuration: Configuration
2021-04-12 10:31:53 +02:00
) -> UITableViewDiffableDataSource<NotificationSection, NotificationItem> {
tableView.register(NotificationTableViewCell.self, forCellReuseIdentifier: String(describing: NotificationTableViewCell.self))
tableView.register(TimelineBottomLoaderTableViewCell.self, forCellReuseIdentifier: String(describing: TimelineBottomLoaderTableViewCell.self))
return UITableViewDiffableDataSource(tableView: tableView) { tableView, indexPath, item -> UITableViewCell? in
switch item {
case .feed(let feed):
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: NotificationTableViewCell.self), for: indexPath) as! NotificationTableViewCell
context.managedObjectContext.performAndWait {
configure(
context: context,
tableView: tableView,
cell: cell,
viewModel: NotificationTableViewCell.ViewModel(value: .feed(feed)),
configuration: configuration
)
}
return cell
2022-02-08 13:07:50 +01:00
case .feedLoader:
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: TimelineBottomLoaderTableViewCell.self), for: indexPath) as! TimelineBottomLoaderTableViewCell
cell.activityIndicatorView.startAnimating()
return cell
2021-04-12 10:31:53 +02:00
case .bottomLoader:
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: TimelineBottomLoaderTableViewCell.self), for: indexPath) as! TimelineBottomLoaderTableViewCell
cell.activityIndicatorView.startAnimating()
2021-04-12 10:31:53 +02:00
return cell
}
}
}
}
2021-04-14 09:00:48 +02:00
extension NotificationSection {
static func configure(
context: AppContext,
tableView: UITableView,
cell: NotificationTableViewCell,
viewModel: NotificationTableViewCell.ViewModel,
configuration: Configuration
) {
cell.notificationView.viewModel.context = context
cell.notificationView.viewModel.authContext = configuration.authContext
StatusSection.setupStatusPollDataSource(
context: context,
authContext: configuration.authContext,
statusView: cell.notificationView.statusView
)
StatusSection.setupStatusPollDataSource(
context: context,
authContext: configuration.authContext,
statusView: cell.notificationView.quoteStatusView
)
cell.configure(
tableView: tableView,
viewModel: viewModel,
delegate: configuration.notificationTableViewCellDelegate
)
2022-02-15 12:44:45 +01:00
cell.notificationView.statusView.viewModel.filterContext = configuration.filterContext
cell.notificationView.quoteStatusView.viewModel.filterContext = configuration.filterContext
configuration.activeFilters?
.assign(to: \.activeFilters, on: cell.notificationView.statusView.viewModel)
.store(in: &cell.disposeBag)
configuration.activeFilters?
.assign(to: \.activeFilters, on: cell.notificationView.quoteStatusView.viewModel)
.store(in: &cell.disposeBag)
}
}