63 lines
2.0 KiB
Swift
63 lines
2.0 KiB
Swift
//
|
|
// StatusStateResolver.swift
|
|
// Tusker
|
|
//
|
|
// Created by Shadowfacts on 9/15/20.
|
|
// Copyright © 2020 Shadowfacts. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import Pachyderm
|
|
|
|
protocol CollapseStateResolving {
|
|
var spoilerText: String { get }
|
|
}
|
|
|
|
extension StatusMO: CollapseStateResolving {}
|
|
extension StatusEdit: CollapseStateResolving {}
|
|
|
|
extension CollapseState {
|
|
|
|
func resolveFor(status: CollapseStateResolving, height: () -> CGFloat, textLength: Int? = nil) -> Bool {
|
|
let newHash = hashStatusProperties(status: status)
|
|
guard unknown || statusPropertiesHash != newHash else {
|
|
return false
|
|
}
|
|
|
|
let longEnoughToCollapse: Bool
|
|
if Preferences.shared.collapseLongPosts,
|
|
height() > 600 || (textLength != nil && textLength! > 500) {
|
|
longEnoughToCollapse = true
|
|
} else {
|
|
longEnoughToCollapse = false
|
|
}
|
|
|
|
let contentWarningCollapsible = !status.spoilerText.isEmpty
|
|
|
|
let collapseDueToContentWarning: Bool?
|
|
if contentWarningCollapsible {
|
|
let lowercased = status.spoilerText.lowercased()
|
|
let opposite = Preferences.shared.oppositeCollapseKeywords.contains { lowercased.contains($0.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()) }
|
|
|
|
if Preferences.shared.expandAllContentWarnings {
|
|
collapseDueToContentWarning = opposite
|
|
} else {
|
|
collapseDueToContentWarning = !opposite
|
|
}
|
|
} else {
|
|
collapseDueToContentWarning = nil
|
|
}
|
|
|
|
self.collapsible = contentWarningCollapsible || longEnoughToCollapse
|
|
// use ?? instead of || because the content warnig pref takes priority over length
|
|
self.collapsed = collapseDueToContentWarning ?? longEnoughToCollapse
|
|
self.statusPropertiesHash = newHash
|
|
return true
|
|
}
|
|
|
|
}
|
|
|
|
private func hashStatusProperties(status: CollapseStateResolving) -> Int {
|
|
status.spoilerText.hashValue
|
|
}
|