135 lines
4.5 KiB
Swift
135 lines
4.5 KiB
Swift
//
|
|
// PollComposeItem.swift
|
|
//
|
|
//
|
|
// Created by MainasuK on 2021-11-29.
|
|
//
|
|
|
|
import UIKit
|
|
import Combine
|
|
import MastodonLocalization
|
|
|
|
public enum PollComposeItem: Hashable {
|
|
case option(Option)
|
|
case expireConfiguration(ExpireConfiguration)
|
|
case multipleConfiguration(MultipleConfiguration)
|
|
}
|
|
|
|
extension PollComposeItem {
|
|
public final class Option: NSObject, Identifiable, ObservableObject {
|
|
public let id = UUID()
|
|
|
|
public weak var textField: UITextField?
|
|
|
|
// input
|
|
@Published public var text = ""
|
|
@Published public var shouldBecomeFirstResponder = false
|
|
|
|
// output
|
|
@Published public var backgroundColor = ThemeService.shared.currentTheme.value.composePollRowBackgroundColor
|
|
|
|
public override init() {
|
|
super.init()
|
|
|
|
ThemeService.shared.currentTheme
|
|
.map { $0.composePollRowBackgroundColor }
|
|
.assign(to: &$backgroundColor)
|
|
}
|
|
}
|
|
}
|
|
|
|
extension PollComposeItem {
|
|
public final class ExpireConfiguration: Identifiable, Hashable, ObservableObject {
|
|
public let id = UUID()
|
|
|
|
@Published public var option: Option = .oneDay // Mastodon
|
|
|
|
public init() {
|
|
// end init
|
|
}
|
|
|
|
public static func == (lhs: ExpireConfiguration, rhs: ExpireConfiguration) -> Bool {
|
|
return lhs.id == rhs.id
|
|
&& lhs.option == rhs.option
|
|
}
|
|
|
|
public func hash(into hasher: inout Hasher) {
|
|
hasher.combine(id)
|
|
}
|
|
|
|
public enum Option: String, Hashable, CaseIterable {
|
|
case thirtyMinutes
|
|
case oneHour
|
|
case sixHours
|
|
case oneDay
|
|
case threeDays
|
|
case sevenDays
|
|
|
|
public var title: String {
|
|
switch self {
|
|
case .thirtyMinutes: return L10n.Scene.Compose.Poll.thirtyMinutes
|
|
case .oneHour: return L10n.Scene.Compose.Poll.oneHour
|
|
case .sixHours: return L10n.Scene.Compose.Poll.sixHours
|
|
case .oneDay: return L10n.Scene.Compose.Poll.oneDay
|
|
case .threeDays: return L10n.Scene.Compose.Poll.threeDays
|
|
case .sevenDays: return L10n.Scene.Compose.Poll.sevenDays
|
|
}
|
|
}
|
|
|
|
public var seconds: Int {
|
|
switch self {
|
|
case .thirtyMinutes: return 60 * 30
|
|
case .oneHour: return 60 * 60 * 1
|
|
case .sixHours: return 60 * 60 * 6
|
|
case .oneDay: return 60 * 60 * 24
|
|
case .threeDays: return 60 * 60 * 24 * 3
|
|
case .sevenDays: return 60 * 60 * 24 * 7
|
|
}
|
|
}
|
|
|
|
public init(closestDateToExpiry date: Date) {
|
|
let expiresInSeconds = Int(date.timeIntervalSince(.now))
|
|
switch expiresInSeconds {
|
|
case _ where expiresInSeconds <= Self.thirtyMinutes.seconds:
|
|
self = .thirtyMinutes
|
|
case _ where expiresInSeconds > Self.thirtyMinutes.seconds && expiresInSeconds <= Self.oneHour.seconds:
|
|
self = .oneHour
|
|
case _ where expiresInSeconds > Self.oneHour.seconds && expiresInSeconds <= Self.sixHours.seconds:
|
|
self = .sixHours
|
|
case _ where expiresInSeconds > Self.sixHours.seconds && expiresInSeconds <= Self.oneDay.seconds:
|
|
self = .oneDay
|
|
case _ where expiresInSeconds > Self.oneDay.seconds && expiresInSeconds <= Self.threeDays.seconds:
|
|
self = .threeDays
|
|
case _ where expiresInSeconds > Self.threeDays.seconds && expiresInSeconds <= Self.sevenDays.seconds:
|
|
self = .sevenDays
|
|
default:
|
|
self = .oneDay
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
extension PollComposeItem {
|
|
public final class MultipleConfiguration: Hashable, ObservableObject {
|
|
private let id = UUID()
|
|
|
|
@Published public var isMultiple: Option = false
|
|
|
|
public init() {
|
|
// end init
|
|
}
|
|
|
|
public typealias Option = Bool
|
|
|
|
public static func == (lhs: MultipleConfiguration, rhs: MultipleConfiguration) -> Bool {
|
|
return lhs.id == rhs.id
|
|
&& lhs.isMultiple == rhs.isMultiple
|
|
}
|
|
|
|
public func hash(into hasher: inout Hasher) {
|
|
hasher.combine(id)
|
|
}
|
|
}
|
|
}
|