mirror of
https://github.com/ichmagmaus111/ghostgram.git
synced 2026-05-13 00:42:20 +02:00
feat: новые функции, исправлены критические ошибки сборки и баги интерфейса, больше подписей в файлах
This commit is contained in:
@@ -0,0 +1,148 @@
|
||||
import Foundation
|
||||
import UIKit
|
||||
import Display
|
||||
import SwiftSignalKit
|
||||
import TelegramCore
|
||||
import TelegramPresentationData
|
||||
import ItemListUI
|
||||
import AccountContext
|
||||
|
||||
// MARK: - Section / Entry definitions
|
||||
|
||||
private enum SendDelaySection: Int32 {
|
||||
case main
|
||||
}
|
||||
|
||||
private enum SendDelayEntry: ItemListNodeEntry {
|
||||
case toggle(PresentationTheme, String, Bool)
|
||||
case info(PresentationTheme, String)
|
||||
|
||||
var section: ItemListSectionId {
|
||||
return SendDelaySection.main.rawValue
|
||||
}
|
||||
|
||||
var stableId: Int32 {
|
||||
switch self {
|
||||
case .toggle: return 0
|
||||
case .info: return 1
|
||||
}
|
||||
}
|
||||
|
||||
static func ==(lhs: SendDelayEntry, rhs: SendDelayEntry) -> Bool {
|
||||
switch lhs {
|
||||
case let .toggle(lhsTheme, lhsText, lhsValue):
|
||||
if case let .toggle(rhsTheme, rhsText, rhsValue) = rhs,
|
||||
lhsTheme === rhsTheme, lhsText == rhsText, lhsValue == rhsValue {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
case let .info(lhsTheme, lhsText):
|
||||
if case let .info(rhsTheme, rhsText) = rhs,
|
||||
lhsTheme === rhsTheme, lhsText == rhsText {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
static func <(lhs: SendDelayEntry, rhs: SendDelayEntry) -> Bool {
|
||||
return lhs.stableId < rhs.stableId
|
||||
}
|
||||
|
||||
func item(presentationData: ItemListPresentationData, arguments: Any) -> ListViewItem {
|
||||
let arguments = arguments as! SendDelayControllerArguments
|
||||
switch self {
|
||||
case let .toggle(_, text, value):
|
||||
return ItemListSwitchItem(
|
||||
presentationData: presentationData,
|
||||
title: text,
|
||||
value: value,
|
||||
sectionId: self.section,
|
||||
style: .blocks,
|
||||
updated: { newValue in
|
||||
arguments.toggleEnabled(newValue)
|
||||
}
|
||||
)
|
||||
case let .info(_, text):
|
||||
return ItemListTextItem(presentationData: presentationData, text: .plain(text), sectionId: self.section)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Arguments
|
||||
|
||||
private final class SendDelayControllerArguments {
|
||||
let toggleEnabled: (Bool) -> Void
|
||||
init(toggleEnabled: @escaping (Bool) -> Void) {
|
||||
self.toggleEnabled = toggleEnabled
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - State
|
||||
|
||||
private struct SendDelayControllerState: Equatable {
|
||||
var isEnabled: Bool
|
||||
}
|
||||
|
||||
// MARK: - Entries builder
|
||||
|
||||
private func sendDelayControllerEntries(
|
||||
presentationData: PresentationData,
|
||||
state: SendDelayControllerState
|
||||
) -> [SendDelayEntry] {
|
||||
let theme = presentationData.theme
|
||||
return [
|
||||
.toggle(theme, "Использовать отложку", state.isEnabled),
|
||||
.info(theme, "Автоматически ставит задержку в ~12 секунд (дольше для сообщений с вложениями) при отправке сообщений. При использовании этой функции вы не будете появляться в сети.")
|
||||
]
|
||||
}
|
||||
|
||||
// MARK: - Controller
|
||||
|
||||
public func sendDelayController(context: AccountContext) -> ViewController {
|
||||
let statePromise = ValuePromise(
|
||||
SendDelayControllerState(isEnabled: SendDelayManager.shared.isEnabled),
|
||||
ignoreRepeated: true
|
||||
)
|
||||
let stateValue = Atomic(value: SendDelayControllerState(isEnabled: SendDelayManager.shared.isEnabled))
|
||||
|
||||
let updateState: ((inout SendDelayControllerState) -> Void) -> Void = { f in
|
||||
let result = stateValue.modify { state in
|
||||
var s = state; f(&s); return s
|
||||
}
|
||||
statePromise.set(result)
|
||||
}
|
||||
|
||||
let arguments = SendDelayControllerArguments(
|
||||
toggleEnabled: { value in
|
||||
SendDelayManager.shared.isEnabled = value
|
||||
updateState { $0.isEnabled = value }
|
||||
}
|
||||
)
|
||||
|
||||
let signal = combineLatest(
|
||||
context.sharedContext.presentationData,
|
||||
statePromise.get()
|
||||
)
|
||||
|> map { presentationData, state -> (ItemListControllerState, (ItemListNodeState, Any)) in
|
||||
let entries = sendDelayControllerEntries(presentationData: presentationData, state: state)
|
||||
|
||||
let controllerState = ItemListControllerState(
|
||||
presentationData: ItemListPresentationData(presentationData),
|
||||
title: .text("Отложка сообщений"),
|
||||
leftNavigationButton: nil,
|
||||
rightNavigationButton: nil,
|
||||
backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back),
|
||||
animateChanges: false
|
||||
)
|
||||
let listState = ItemListNodeState(
|
||||
presentationData: ItemListPresentationData(presentationData),
|
||||
entries: entries,
|
||||
style: .blocks,
|
||||
animateChanges: true
|
||||
)
|
||||
return (controllerState, (listState, arguments))
|
||||
}
|
||||
|
||||
return ItemListController(context: context, state: signal)
|
||||
}
|
||||
Reference in New Issue
Block a user