mirror of
https://github.com/mastodon/mastodon-ios
synced 2025-04-11 22:58:02 +02:00

* New translations app.json (Thai) * New translations app.json (Spanish) * New translations Localizable.stringsdict (Spanish) * New translations app.json (Thai) * New translations app.json (Thai) * feat: adapt the app to async & await. Update timeline UI * fix: update the Xcode version to fix the CI failure * fix: remove unavailable framework import * fix: project dependency issue * feat: add content warning for post spoiler * feat: add content warning for post media * chore: update version to 1.3.0 (92) * New translations app.json (French) * New translations Intents.strings (French) * New translations app.json (Thai) * feat: update report flow * feat: update setting scene UI * feat: update status content warning UI * feat: add notification gap fetcher * chore: update version to 1.3.0 (93) * feat: add video player for audio/video kind media * chore: update version to 1.3.0 (94) * fix: text strip wrong color in the Dark Mode issue * chore: remove spoiler toggle animation for table cell * fix: add missing shadow for compose publish button * fix: add missing margin for timeline with horizontal regular size class * fix: profile segmented controls missing margin issue * fix: the profile segmented control use wrong selection tint color under force light UI style issue * fix: add notification count clear logic back * fix: add missing home timeline bottom fetcher * fix: [WIP] add suggestion account scene back * New translations app.json (Kabyle) * New translations ios-infoPlist.json (Kabyle) * New translations Localizable.stringsdict (Kabyle) * New translations Intents.strings (Kabyle) * New translations Intents.stringsdict (Kabyle) * feat: make the home timeline readable for VoiceOver * chore: update version to 1.3.0 (95) * New translations app.json (French) * New translations Intents.strings (French) * New translations app.json (Kabyle) * New translations ios-infoPlist.json (Kabyle) * New translations Localizable.stringsdict (Kabyle) * New translations Intents.strings (Kabyle) * New translations Intents.stringsdict (Kabyle) * New translations Localizable.stringsdict (French) * New translations app.json (Kabyle) * New translations app.json (French) * chore: update action toolbar icons * fix: instal state missing issue * fix: follow push notification deep-link not works issue * fix: foreground notification not trigger tab bell icon update issue * feat: add notification timeline fetcher * feat: add content warning toggle button * chore: update version to 1.3.0 (96) * New translations app.json (Thai) * New translations app.json (Russian) * New translations app.json (Kurmanji (Kurdish)) * New translations app.json (Scottish Gaelic) * New translations app.json (Welsh) * New translations app.json (Hindi) * New translations app.json (Spanish, Argentina) * New translations app.json (Indonesian) * New translations app.json (Portuguese, Brazilian) * New translations app.json (English) * New translations app.json (Chinese Traditional) * New translations app.json (Chinese Simplified) * New translations app.json (Swedish) * New translations app.json (Portuguese) * New translations app.json (Dutch) * New translations app.json (Korean) * New translations app.json (Japanese) * New translations app.json (Basque) * New translations app.json (German) * New translations app.json (Danish) * New translations app.json (Catalan) * New translations app.json (Arabic) * New translations app.json (Spanish) * New translations app.json (Romanian) * New translations app.json (Kabyle) * New translations app.json (French) * New translations app.json (Swedish, Finland) * New translations app.json (Spanish, Argentina) * New translations app.json (Kurmanji (Kurdish)) * fix: notification i18n word typo * New translations app.json (Thai) * New translations app.json (Swedish) * New translations Localizable.stringsdict (Swedish) * New translations app.json (Swedish, Finland) * New translations app.json (Kurmanji (Kurdish)) * New translations app.json (Scottish Gaelic) * New translations app.json (Welsh) * New translations app.json (Hindi) * New translations app.json (Indonesian) * New translations app.json (Portuguese, Brazilian) * New translations app.json (English) * New translations app.json (Chinese Traditional) * New translations app.json (Chinese Simplified) * New translations app.json (Russian) * New translations app.json (Portuguese) * New translations app.json (Dutch) * New translations app.json (Korean) * New translations app.json (Japanese) * New translations app.json (Basque) * New translations app.json (German) * New translations app.json (Danish) * New translations app.json (Catalan) * New translations app.json (Arabic) * New translations app.json (Spanish) * New translations app.json (Romanian) * New translations app.json (Kabyle) * New translations app.json (French) * New translations Intents.strings (Swedish) * New translations app.json (Swedish) * New translations Localizable.stringsdict (Japanese) * New translations app.json (Thai) * New translations app.json (Thai) * New translations Localizable.stringsdict (Swedish) * New translations app.json (Kabyle) * New translations ios-infoPlist.json (Kabyle) * New translations app.json (Kabyle) * New translations app.json (French) * New translations app.json (French) * feat: restore scroll-to-top tap gesture for TabBar * feat: add cell height cache for user timeline * feat: display no results when profile field empty * New translations app.json (Chinese Traditional) * New translations app.json (Chinese Traditional) * New translations Intents.strings (Japanese) * feat: make status detail accessible * chore: restore the appearance settings * chore: update version to 1.3.0 (97) * New translations app.json (Kabyle) * New translations Intents.strings (Japanese) * New translations app.json (Swedish) * New translations app.json (Basque) * New translations app.json (Basque) * chore: add a11y hint for profile dashboard * feat: add media interaction for notification timeline * New translations app.json (Chinese Simplified) * New translations app.json (Chinese Simplified) * chore: update i18n strings * fix: setting switch use wrong tint color issue * chore: restore RTL layout for post content * chore: update profile relationship button UI * chore: update color panel * fix: post reblog header may display empty reblogger name issue * fix: wrong reply header redirect logic issue * feat: restore post filter supports * chore: update version to 1.3.0 (98) * chore: update post content sensitive style * fix: blurhash image not display during image loading issue * chore: update version to 1.3.0 (99) * feat: restore user recommend scene * chore: update badge tint color * feat: restore keyboard shortcut supports * chore: update version to 1.3.0 (100) * fix: relationship background use wrong color when force dark style * fix: player button icon not reset issue * chore: update version to 1.3.0 (101) * fix: profile relationship button fill the width on iPad issue * fix: inputAssistantItem duplicate setup issue * chore: update textView minimum height from 88 to 64 * chore: update version to 1.3.0 (102) * chore: update status timeline margin * chore: update sidebar background color * fix: split view column state after size class transition not stable issue * chore: update notification timeline margin * chore: update profile header and segmented bar margin * fix: profile segmented bar use wrong tint color when force Dark Mode issue * chore: update horizontal compact mode notification timeline margin looks like * chore: update version to 1.3.0 (103) * feat: dismiss image preview when tap empty area * chore: update version to 1.3.0 (104) * New translations app.json (Italian) * New translations ios-infoPlist.json (Italian) * New translations Localizable.stringsdict (Italian) * New translations Intents.strings (Italian) * New translations Intents.stringsdict (Italian) * New translations app.json (Kabyle) * New translations app.json (Kabyle) * New translations app.json (Kabyle) * New translations app.json (Kabyle) * New translations app.json (Kabyle) * New translations app.json (Kabyle) * New translations app.json (Japanese) * New translations app.json (Kabyle) * New translations app.json (Kabyle) * New translations app.json (Kabyle) * New translations app.json (Kabyle) * New translations app.json (Kabyle) * New translations app.json (Kabyle) * New translations app.json (Kabyle) * New translations app.json (Spanish) * New translations app.json (Kabyle) * New translations app.json (Kabyle) * New translations app.json (Kabyle) * New translations ios-infoPlist.json (Kabyle) * New translations Localizable.stringsdict (Kabyle) * New translations Localizable.stringsdict (Kabyle) * New translations Intents.strings (Kabyle) * New translations app.json (Kabyle) * New translations Intents.strings (Kabyle) * New translations Intents.stringsdict (Kabyle) * New translations app.json (Kabyle) * New translations app.json (Scottish Gaelic) * New translations app.json (Scottish Gaelic) * New translations app.json (Thai) * New translations app.json (Thai) * feat: add UITests for snapshots * feat: add snapshot UITest and document * New translations app.json (Thai) * feat: add notification snapshot * chore: add domain and update guide for the snapshot UITest * chore: use the first photo for compose snapshot * New translations app.json (Thai) * New translations app.json (German) * New translations app.json (German) * chore: update settings scene UI * chore: update i18n for open link words * chore: update i18n resources * fix: share extension not accept plaintext content issue. resolve #335 * chore: update version to 1.3.0 (105) * New translations app.json (Japanese) * New translations app.json (Japanese) * New translations app.json (Japanese) * feat: add onion domain ATS exception rule. resolve #338 * chore: update app version footer and i18n strings * chore: update version to 1.3.0 (106) * chore: update version to 1.3.0 (108) * Handle onboarding authentication errors in /api/v1/instance * New translations app.json (Kurmanji (Kurdish)) * New translations app.json (Kurmanji (Kurdish)) * chore: update Xcode schemes index * chore: update the snapshot documents and UITests * chore: update i18n resources. resolve #343 * chore: retain the API model semantic * fix: force LTR for some text fields. #318 * fix: textView break IME input issue. resolve #342 * chore: update version to 1.3.0 (109) * chore: update README * chore: fix typo * chore: add bug report template and contributing document Co-authored-by: Eugen Rochko <eugen@zeonfederated.com> Co-authored-by: Zac West <zacwest@gmail.com>
199 lines
5.2 KiB
Swift
199 lines
5.2 KiB
Swift
//
|
|
// Feed.swift
|
|
// CoreDataStack
|
|
//
|
|
// Created by MainasuK on 2022-1-11.
|
|
//
|
|
|
|
import Foundation
|
|
import CoreData
|
|
|
|
final public class Feed: NSManagedObject {
|
|
|
|
@NSManaged public private(set) var acctRaw: String
|
|
// sourcery: autoGenerateProperty
|
|
public var acct: Acct {
|
|
get {
|
|
Acct(rawValue: acctRaw) ?? .none
|
|
}
|
|
set {
|
|
acctRaw = newValue.rawValue
|
|
}
|
|
}
|
|
|
|
@NSManaged public private(set) var kindRaw: String
|
|
// sourcery: autoGenerateProperty
|
|
public var kind: Kind {
|
|
get {
|
|
Kind(rawValue: kindRaw) ?? .none
|
|
}
|
|
set {
|
|
kindRaw = newValue.rawValue
|
|
}
|
|
}
|
|
|
|
// sourcery: autoUpdatableObject, autoGenerateProperty
|
|
@NSManaged public private(set) var hasMore: Bool
|
|
// sourcery: autoUpdatableObject
|
|
@NSManaged public private(set) var isLoadingMore: Bool
|
|
|
|
// sourcery: autoUpdatableObject, autoGenerateProperty
|
|
@NSManaged public private(set) var createdAt: Date
|
|
// sourcery: autoUpdatableObject, autoGenerateProperty
|
|
@NSManaged public private(set) var updatedAt: Date
|
|
|
|
// one-to-one relationship
|
|
@NSManaged public private(set) var status: Status?
|
|
@NSManaged public private(set) var notification: Notification?
|
|
|
|
}
|
|
|
|
extension Feed {
|
|
|
|
@discardableResult
|
|
public static func insert(
|
|
into context: NSManagedObjectContext,
|
|
property: Property
|
|
) -> Feed {
|
|
let object: Feed = context.insertObject()
|
|
object.configure(property: property)
|
|
return object
|
|
}
|
|
|
|
}
|
|
|
|
extension Feed: Managed {
|
|
public static var defaultSortDescriptors: [NSSortDescriptor] {
|
|
return [NSSortDescriptor(keyPath: \Feed.createdAt, ascending: false)]
|
|
}
|
|
}
|
|
|
|
extension Feed {
|
|
|
|
static func predicate(kind: Kind) -> NSPredicate {
|
|
return NSPredicate(format: "%K == %@", #keyPath(Feed.kindRaw), kind.rawValue)
|
|
}
|
|
|
|
public static func predicate(acct: Acct) -> NSPredicate {
|
|
return NSPredicate(format: "%K == %@", #keyPath(Feed.acctRaw), acct.rawValue)
|
|
}
|
|
|
|
public static func predicate(kind: Kind, acct: Acct) -> NSPredicate {
|
|
return NSCompoundPredicate(andPredicateWithSubpredicates: [
|
|
Feed.predicate(kind: kind),
|
|
Feed.predicate(acct: acct)
|
|
])
|
|
}
|
|
|
|
public static func nonePredicate() -> NSPredicate {
|
|
return predicate(kind: .none, acct: .none)
|
|
}
|
|
|
|
public static func hasMorePredicate() -> NSPredicate {
|
|
return NSPredicate(format: "%K == YES", #keyPath(Feed.hasMore))
|
|
}
|
|
|
|
public static func hasNotificationPredicate() -> NSPredicate {
|
|
return NSPredicate(format: "%K != nil", #keyPath(Feed.notification))
|
|
}
|
|
|
|
public static func notificationTypePredicate(types: [MastodonNotificationType]) -> NSPredicate {
|
|
return NSCompoundPredicate(andPredicateWithSubpredicates: [
|
|
hasNotificationPredicate(),
|
|
NSPredicate(
|
|
format: "%K.%K IN %@",
|
|
#keyPath(Feed.notification),
|
|
#keyPath(Notification.typeRaw),
|
|
types.map { $0.rawValue }
|
|
)
|
|
])
|
|
}
|
|
|
|
}
|
|
|
|
// MARK: - AutoGenerateProperty
|
|
extension Feed: AutoGenerateProperty {
|
|
// sourcery:inline:Feed.AutoGenerateProperty
|
|
|
|
// Generated using Sourcery
|
|
// DO NOT EDIT
|
|
public struct Property {
|
|
public let acct: Acct
|
|
public let kind: Kind
|
|
public let hasMore: Bool
|
|
public let createdAt: Date
|
|
public let updatedAt: Date
|
|
|
|
public init(
|
|
acct: Acct,
|
|
kind: Kind,
|
|
hasMore: Bool,
|
|
createdAt: Date,
|
|
updatedAt: Date
|
|
) {
|
|
self.acct = acct
|
|
self.kind = kind
|
|
self.hasMore = hasMore
|
|
self.createdAt = createdAt
|
|
self.updatedAt = updatedAt
|
|
}
|
|
}
|
|
|
|
public func configure(property: Property) {
|
|
self.acct = property.acct
|
|
self.kind = property.kind
|
|
self.hasMore = property.hasMore
|
|
self.createdAt = property.createdAt
|
|
self.updatedAt = property.updatedAt
|
|
}
|
|
|
|
public func update(property: Property) {
|
|
update(hasMore: property.hasMore)
|
|
update(createdAt: property.createdAt)
|
|
update(updatedAt: property.updatedAt)
|
|
}
|
|
// sourcery:end
|
|
}
|
|
|
|
// MARK: - AutoUpdatableObject
|
|
extension Feed: AutoUpdatableObject {
|
|
// sourcery:inline:Feed.AutoUpdatableObject
|
|
|
|
// Generated using Sourcery
|
|
// DO NOT EDIT
|
|
public func update(hasMore: Bool) {
|
|
if self.hasMore != hasMore {
|
|
self.hasMore = hasMore
|
|
}
|
|
}
|
|
public func update(isLoadingMore: Bool) {
|
|
if self.isLoadingMore != isLoadingMore {
|
|
self.isLoadingMore = isLoadingMore
|
|
}
|
|
}
|
|
public func update(createdAt: Date) {
|
|
if self.createdAt != createdAt {
|
|
self.createdAt = createdAt
|
|
}
|
|
}
|
|
public func update(updatedAt: Date) {
|
|
if self.updatedAt != updatedAt {
|
|
self.updatedAt = updatedAt
|
|
}
|
|
}
|
|
// sourcery:end
|
|
}
|
|
|
|
public protocol FeedIndexable {
|
|
var feeds: Set<Feed> { get }
|
|
func feed(kind: Feed.Kind, acct: Feed.Acct) -> Feed?
|
|
}
|
|
|
|
extension FeedIndexable {
|
|
public func feed(kind: Feed.Kind, acct: Feed.Acct) -> Feed? {
|
|
return feeds.first(where: { feed in
|
|
feed.kind == kind && feed.acct == acct
|
|
})
|
|
}
|
|
}
|