Compare commits
34 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6be169e676 | ||
|
|
33d81438f5 | ||
|
|
21fcb9af4a | ||
|
|
f5fd715e3e | ||
|
|
1f17414db4 | ||
|
|
806c04bcc4 | ||
|
|
18e098141d | ||
|
|
16c798c31c | ||
|
|
713f206714 | ||
|
|
59f1da6b87 | ||
|
|
496c34a89f | ||
|
|
a7f5161e5e | ||
|
|
30eb15950a | ||
|
|
be8c1bf6bd | ||
|
|
b3a386cde7 | ||
|
|
9e941f01a5 | ||
|
|
625e2244df | ||
|
|
e0f9938367 | ||
|
|
5cd4ad6d74 | ||
|
|
cca1543856 | ||
|
|
a5bff85223 | ||
|
|
1a731e2fad | ||
|
|
d3a78ee599 | ||
|
|
1d3419d5df | ||
|
|
ee57d253bc | ||
|
|
a76df252db | ||
|
|
4033fba38c | ||
|
|
76cef40423 | ||
|
|
061548b8b4 | ||
|
|
deb238bb21 | ||
|
|
273298e4c9 | ||
|
|
a0ad8da8df | ||
|
|
1779eb3efe | ||
|
|
153e5919ce |
1
Modules/BusX
Symbolic link
1
Modules/BusX
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../../../../u/Modules/BusX
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
import Combine
|
|
||||||
|
|
||||||
public extension Bus {
|
|
||||||
final class Async<Src, Dst> {
|
|
||||||
let v = PassthroughSubject<Src, Never>()
|
|
||||||
var subscriptions = [AnyCancellable]()
|
|
||||||
|
|
||||||
public init(
|
|
||||||
_ handler: @escaping ((Src) -> Dst?),
|
|
||||||
_ src: String,
|
|
||||||
_ dst: String
|
|
||||||
) {
|
|
||||||
// Вход.
|
|
||||||
Bus.receiveSync(
|
|
||||||
[src],
|
|
||||||
{ [weak self] _, v in self?.v.send(v) },
|
|
||||||
&subscriptions
|
|
||||||
)
|
|
||||||
// Выход.
|
|
||||||
Bus.sendSync(
|
|
||||||
dst,
|
|
||||||
v
|
|
||||||
.compactMap { (v: Src) in handler(v) }
|
|
||||||
// Асинхронно.
|
|
||||||
.receive(on: DispatchQueue.main)
|
|
||||||
.eraseToAnyPublisher(),
|
|
||||||
&subscriptions
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
public extension Bus {
|
|
||||||
/// Пропускаем далее единственный ключ.
|
|
||||||
static func convertKeyValue<T>(
|
|
||||||
_ key: String,
|
|
||||||
_ v: (key: String, value: Any)
|
|
||||||
) -> (String, T)? {
|
|
||||||
guard
|
|
||||||
key == v.key,
|
|
||||||
let value = v.value as? T
|
|
||||||
else {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return (key, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Пропускаем далее множество ключей.
|
|
||||||
static func convertKeyValue<T>(
|
|
||||||
_ keys: Set<String>,
|
|
||||||
_ v: (key: String, value: Any)
|
|
||||||
) -> (String, T)? {
|
|
||||||
guard
|
|
||||||
keys.contains(v.key),
|
|
||||||
let value = v.value as? T
|
|
||||||
else {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return (v.key, value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
import Combine
|
|
||||||
|
|
||||||
public extension Bus {
|
|
||||||
final class Debounce<Src, Dst> {
|
|
||||||
let v = PassthroughSubject<Src, Never>()
|
|
||||||
var subscriptions = [AnyCancellable]()
|
|
||||||
|
|
||||||
public init(
|
|
||||||
_ handler: @escaping ((Src) -> Dst?),
|
|
||||||
_ sec: Double,
|
|
||||||
_ src: String,
|
|
||||||
_ dst: String
|
|
||||||
) {
|
|
||||||
// Вход.
|
|
||||||
Bus.receiveSync(
|
|
||||||
[src],
|
|
||||||
{ [weak self] _, v in self?.v.send(v) },
|
|
||||||
&subscriptions
|
|
||||||
)
|
|
||||||
// Выход.
|
|
||||||
Bus.sendSync(
|
|
||||||
dst,
|
|
||||||
v
|
|
||||||
.debounce(for: .seconds(sec), scheduler: DispatchQueue.main)
|
|
||||||
.compactMap { (v: Src) in handler(v) }
|
|
||||||
.eraseToAnyPublisher(),
|
|
||||||
&subscriptions
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
import Combine
|
|
||||||
|
|
||||||
public extension Bus {
|
|
||||||
final class Delay<Src, Dst> {
|
|
||||||
let v = PassthroughSubject<Src, Never>()
|
|
||||||
var subscriptions = [AnyCancellable]()
|
|
||||||
|
|
||||||
public init(
|
|
||||||
_ handler: @escaping ((Src) -> Dst?),
|
|
||||||
_ sec: Double,
|
|
||||||
_ src: String,
|
|
||||||
_ dst: String
|
|
||||||
) {
|
|
||||||
// Вход.
|
|
||||||
Bus.receiveSync(
|
|
||||||
[src],
|
|
||||||
{ [weak self] _, v in self?.v.send(v) },
|
|
||||||
&subscriptions
|
|
||||||
)
|
|
||||||
// Выход.
|
|
||||||
Bus.sendSync(
|
|
||||||
dst,
|
|
||||||
v
|
|
||||||
.delay(for: .seconds(sec), scheduler: DispatchQueue.main)
|
|
||||||
.compactMap { (v: Src) in handler(v) }
|
|
||||||
.eraseToAnyPublisher(),
|
|
||||||
&subscriptions
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
import Combine
|
|
||||||
|
|
||||||
public extension Bus {
|
|
||||||
final class Sync<Src, Dst> {
|
|
||||||
let v = PassthroughSubject<Src, Never>()
|
|
||||||
var subscriptions = [AnyCancellable]()
|
|
||||||
|
|
||||||
public init(
|
|
||||||
_ handler: @escaping ((Src) -> Dst?),
|
|
||||||
_ src: String,
|
|
||||||
_ dst: String
|
|
||||||
) {
|
|
||||||
// Вход.
|
|
||||||
Bus.receiveSync(
|
|
||||||
[src],
|
|
||||||
{ [weak self] _, v in self?.v.send(v) },
|
|
||||||
&subscriptions
|
|
||||||
)
|
|
||||||
// Выход.
|
|
||||||
Bus.sendSync(
|
|
||||||
dst,
|
|
||||||
v
|
|
||||||
.compactMap { (v: Src) in handler(v) }
|
|
||||||
.eraseToAnyPublisher(),
|
|
||||||
&subscriptions
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
import Combine
|
|
||||||
import Foundation
|
|
||||||
|
|
||||||
public enum Bus {
|
|
||||||
private static let e = PassthroughSubject<(key: String, value: Any), Never>()
|
|
||||||
|
|
||||||
public static var events: AnyPublisher<(key: String, value: Any), Never> {
|
|
||||||
e.eraseToAnyPublisher()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public extension Bus {
|
|
||||||
/// Асинхронно обрабатываем входящие события из шины.
|
|
||||||
static func receiveAsync<T>(
|
|
||||||
_ keys: Set<String>,
|
|
||||||
_ handler: @escaping ((String, T) -> Void),
|
|
||||||
_ subscriptions: inout [AnyCancellable]
|
|
||||||
) {
|
|
||||||
e
|
|
||||||
.compactMap { convertKeyValue(keys, $0) }
|
|
||||||
.receive(on: DispatchQueue.main)
|
|
||||||
.sink { v in handler(v.0, v.1) }
|
|
||||||
.store(in: &subscriptions)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Синхронно обрабатываем входящие события из шины.
|
|
||||||
static func receiveSync<T>(
|
|
||||||
_ keys: Set<String>,
|
|
||||||
_ handler: @escaping ((String, T) -> Void),
|
|
||||||
_ subscriptions: inout [AnyCancellable]
|
|
||||||
) {
|
|
||||||
e
|
|
||||||
.compactMap { convertKeyValue(keys, $0) }
|
|
||||||
.sink { v in handler(v.0, v.1) }
|
|
||||||
.store(in: &subscriptions)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Синхронно отправляем события из узла в шину.
|
|
||||||
///
|
|
||||||
/// Для асинхронной отправки достаточно добавить оператор `receive(on:)`
|
|
||||||
/// в цепочке параметра `node`
|
|
||||||
static func sendSync<T>(
|
|
||||||
_ key: String,
|
|
||||||
_ node: AnyPublisher<T, Never>,
|
|
||||||
_ subscriptions: inout [AnyCancellable]
|
|
||||||
) {
|
|
||||||
node
|
|
||||||
.sink { v in e.send((key, v)) }
|
|
||||||
.store(in: &subscriptions)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Единоразово синхронно отправляем событие в шину.
|
|
||||||
static func send(_ key: String, _ value: Any) {
|
|
||||||
e.send((key, value))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
extension BusUI {
|
|
||||||
/// Пропускаем лишь значения от UI
|
|
||||||
///
|
|
||||||
/// - Returns: Значение без префиксов "a:"/"u:"
|
|
||||||
static func onlyUIText(_ s: String) -> String? {
|
|
||||||
guard s.hasPrefix("u:") else { return nil }
|
|
||||||
return String(s.dropFirst(2))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
import Combine
|
|
||||||
|
|
||||||
extension BusUI {
|
|
||||||
public final class Button: ObservableObject {
|
|
||||||
public let v = PassthroughSubject<Void, Never>()
|
|
||||||
var subscriptions = [AnyCancellable]()
|
|
||||||
|
|
||||||
public init(_ key: String) {
|
|
||||||
Bus.sendSync(
|
|
||||||
key,
|
|
||||||
v.map { true }.eraseToAnyPublisher(),
|
|
||||||
&subscriptions
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
import Combine
|
|
||||||
import SwiftUI
|
|
||||||
|
|
||||||
extension BusUI {
|
|
||||||
public final class TextField: ObservableObject {
|
|
||||||
@Published public var v = "a:"
|
|
||||||
var subscriptions = [AnyCancellable]()
|
|
||||||
|
|
||||||
public init(
|
|
||||||
_ textApp: String,
|
|
||||||
_ textUI: String
|
|
||||||
) {
|
|
||||||
Bus.sendSync(
|
|
||||||
textUI,
|
|
||||||
$v
|
|
||||||
.removeDuplicates()
|
|
||||||
.compactMap(onlyUIText)
|
|
||||||
.eraseToAnyPublisher(),
|
|
||||||
&subscriptions
|
|
||||||
)
|
|
||||||
|
|
||||||
Bus.receiveSync(
|
|
||||||
[textApp],
|
|
||||||
{ [weak self] (_, v: String) in self?.v = "a:\(v)" },
|
|
||||||
&subscriptions
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
import Foundation
|
|
||||||
|
|
||||||
extension BusUI {
|
|
||||||
public final class TextFieldSource: Formatter {
|
|
||||||
/// Выдаём для отображения очищенную от источника строку.
|
|
||||||
public override func string(for obj: Any?) -> String? {
|
|
||||||
guard let str = obj as? String else { return nil }
|
|
||||||
return String(str.dropFirst(2))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Выдаём для использования кодом строку с указанием источника
|
|
||||||
/// в виде пользователя `u:`
|
|
||||||
public override func getObjectValue(
|
|
||||||
_ obj: AutoreleasingUnsafeMutablePointer<AnyObject?>?,
|
|
||||||
for string: String,
|
|
||||||
errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>?
|
|
||||||
) -> Bool {
|
|
||||||
obj?.pointee = "u:\(string)" as AnyObject
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
import Combine
|
|
||||||
|
|
||||||
extension BusUI {
|
|
||||||
public final class Value<T>: ObservableObject {
|
|
||||||
@Published public var v: T
|
|
||||||
var subscriptions = [AnyCancellable]()
|
|
||||||
|
|
||||||
public init(
|
|
||||||
_ key: String,
|
|
||||||
_ defaultValue: T
|
|
||||||
) {
|
|
||||||
v = defaultValue
|
|
||||||
Bus.receiveSync(
|
|
||||||
[key],
|
|
||||||
{ [weak self] (_, v: T) in self?.v = v },
|
|
||||||
&subscriptions
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
public enum BusUI { }
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
Pod::Spec.new do |s|
|
|
||||||
|
|
||||||
s.name = 'BusX'
|
|
||||||
s.version = '2023.12.30'
|
|
||||||
s.license = 'IVCS'
|
|
||||||
s.summary = 'Шина общения элементов приложения'
|
|
||||||
s.homepage = 'IVCS'
|
|
||||||
s.author = 'IVCS'
|
|
||||||
s.source = { :git => 'https://fake.com/FAKE.git', :tag => s.version }
|
|
||||||
s.source_files = '**/**/*.swift'
|
|
||||||
s.swift_version = '5.2'
|
|
||||||
s.ios.deployment_target = '14.0'
|
|
||||||
|
|
||||||
end
|
|
||||||
@@ -11,8 +11,8 @@ extension MeetupId {
|
|||||||
|
|
||||||
public init() {
|
public init() {
|
||||||
processors = [
|
processors = [
|
||||||
Bus.Debounce(shouldResetText, 0.2, K.M, K.textApp),
|
Bus.ConstDebounce(shouldResetText, 0.2, K.M, K.textApp),
|
||||||
Bus.Delay(shouldFinishLoading, 5, K.M, K.finishLoading),
|
Bus.ConstDelay(shouldFinishLoading, 5, K.M, K.finishLoading),
|
||||||
Bus.Sync(shouldEnableJoin, K.M, K.isJoinAvailable),
|
Bus.Sync(shouldEnableJoin, K.M, K.isJoinAvailable),
|
||||||
Bus.Sync(shouldResetLoading, K.M, K.isLoading)
|
Bus.Sync(shouldResetLoading, K.M, K.isLoading)
|
||||||
]
|
]
|
||||||
|
|||||||
8
Modules/MicX/Mic/src/Mic.K.swift
Normal file
8
Modules/MicX/Mic/src/Mic.K.swift
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
public extension Mic {
|
||||||
|
enum K {
|
||||||
|
public static let activityDate = "Mic.activityDate"
|
||||||
|
public static let isActive = "Mic.isActive"
|
||||||
|
public static let MI = "Mic.Model.Item"
|
||||||
|
public static let timeout = "Mic.timeout"
|
||||||
|
}
|
||||||
|
}
|
||||||
1
Modules/MicX/Mic/src/Mic.swift
Normal file
1
Modules/MicX/Mic/src/Mic.swift
Normal file
@@ -0,0 +1 @@
|
|||||||
|
public enum Mic { }
|
||||||
29
Modules/MicX/MicItem/src/MicItem.Shoulds.swift
Normal file
29
Modules/MicX/MicItem/src/MicItem.Shoulds.swift
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
public extension MicItem {
|
||||||
|
static func shouldResetActivity(_ c: MicItemContext) -> Bool? {
|
||||||
|
if
|
||||||
|
c.activityDate.isRecent,
|
||||||
|
let end = c.activityDate.value
|
||||||
|
{
|
||||||
|
let now = Date()
|
||||||
|
return now < end
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.timeout {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
static func shouldResetTimeout(_ c: MicItemContext) -> TimeInterval? {
|
||||||
|
if
|
||||||
|
c.activityDate.isRecent,
|
||||||
|
let end = c.activityDate.value
|
||||||
|
{
|
||||||
|
let timeout = end.timeIntervalSinceNow
|
||||||
|
return timeout > 0 ? timeout : nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
35
Modules/MicX/MicItem/src/MicItem.V.swift
Normal file
35
Modules/MicX/MicItem/src/MicItem.V.swift
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import BusX
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
extension MicItem {
|
||||||
|
public struct V: View {
|
||||||
|
var id: String?
|
||||||
|
@StateObject var isActive = BusUI.Value(K.isActive, false)
|
||||||
|
let proc: [Any]
|
||||||
|
|
||||||
|
public init(_ id: String? = nil) {
|
||||||
|
self.id = id
|
||||||
|
self.proc = [
|
||||||
|
Bus.Delay(shouldResetTimeout, K.MI, K.timeout, id),
|
||||||
|
Bus.Sync(shouldResetActivity, K.MI, K.isActive, id),
|
||||||
|
MicItem.Controller(id)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
public var body: some View {
|
||||||
|
Text("Mic activity")
|
||||||
|
.padding(8)
|
||||||
|
.border(
|
||||||
|
isActive.v ? Color.black : Color.gray,
|
||||||
|
width: isActive.v ? 3 : 1
|
||||||
|
)
|
||||||
|
.animation(.easeInOut(duration: 0.3))
|
||||||
|
.onAppear {
|
||||||
|
isActive.id = id
|
||||||
|
}
|
||||||
|
.onChange(of: id) { newValue in
|
||||||
|
isActive.id = newValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
57
Modules/MicX/MicItem/src/MicItem.WillBe.swift
Normal file
57
Modules/MicX/MicItem/src/MicItem.WillBe.swift
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
import BusX
|
||||||
|
import MPAKX
|
||||||
|
|
||||||
|
public protocol MicItemContext {
|
||||||
|
var activityDate: MPAK.Recent<Date?> { get }
|
||||||
|
var timeout: Bool { get }
|
||||||
|
}
|
||||||
|
|
||||||
|
extension MicItem {
|
||||||
|
public struct Model: MicItemContext {
|
||||||
|
public var activityDate: MPAK.Recent<Date?> = .init(nil)
|
||||||
|
public var timeout: Bool = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension MicItem {
|
||||||
|
final class Controller: MPAK.Controller<MicItem.Model> {
|
||||||
|
init(_ id: String? = nil) {
|
||||||
|
var sid = ""
|
||||||
|
if let id {
|
||||||
|
sid = " : \(id)"
|
||||||
|
}
|
||||||
|
/**/print("MicIC.init\(sid)")
|
||||||
|
super.init(
|
||||||
|
MicItem.Model(),
|
||||||
|
debugClassName: "MicICtrl",
|
||||||
|
debugLog: { print("\($0)\(sid)") }
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
// Нижеследующее предстоит сгенерить.
|
||||||
|
m
|
||||||
|
.sink { v in Bus.send(Bus.keyId(K.MI, id), v) }
|
||||||
|
.store(in: &subscriptions)
|
||||||
|
|
||||||
|
pipeValue(
|
||||||
|
dbg: "activityD",
|
||||||
|
sub: nil,
|
||||||
|
Bus.events.compactMap { Bus.convertKeyValue(Bus.keyId(K.activityDate, id), $0) }.map { (k: String, v: Date?) in v }.eraseToAnyPublisher(),
|
||||||
|
{
|
||||||
|
$0.activityDate.value = $1
|
||||||
|
$0.activityDate.isRecent = true
|
||||||
|
},
|
||||||
|
{ m, _ in m.activityDate.isRecent = false }
|
||||||
|
)
|
||||||
|
|
||||||
|
pipe(
|
||||||
|
dbg: "timeout",
|
||||||
|
sub: nil,
|
||||||
|
Bus.events.compactMap { Bus.convertKeyValue(Bus.keyId(K.timeout, id), $0) }.map { (k: String, v: Bool) in v }.eraseToAnyPublisher(),
|
||||||
|
{ $0.timeout = true },
|
||||||
|
{ $0.timeout = false }
|
||||||
|
)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
3
Modules/MicX/MicItem/src/MicItem.swift
Normal file
3
Modules/MicX/MicItem/src/MicItem.swift
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
public enum MicItem { }
|
||||||
|
|
||||||
|
typealias K = Mic.K
|
||||||
17
Modules/MicX/MicX.podspec
Normal file
17
Modules/MicX/MicX.podspec
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
Pod::Spec.new do |s|
|
||||||
|
|
||||||
|
s.name = 'MicX'
|
||||||
|
s.version = '2024.01.15'
|
||||||
|
s.license = 'IVCS'
|
||||||
|
s.summary = 'Отображение звуковой активности участника'
|
||||||
|
s.homepage = 'IVCS'
|
||||||
|
s.author = 'IVCS'
|
||||||
|
s.source = { :git => 'https://fake.com/FAKE.git', :tag => s.version }
|
||||||
|
s.source_files = '**/**/*.{swift,yml}'
|
||||||
|
s.swift_version = '5.2'
|
||||||
|
s.ios.deployment_target = '14.0'
|
||||||
|
s.dependency 'AELog'
|
||||||
|
s.dependency 'BusX'
|
||||||
|
s.dependency 'MPAKX'
|
||||||
|
|
||||||
|
end
|
||||||
@@ -6,6 +6,7 @@ pod 'AELog'
|
|||||||
|
|
||||||
pod 'BusX', :path => '../Modules/BusX'
|
pod 'BusX', :path => '../Modules/BusX'
|
||||||
pod 'MeetupIdX', :path => '../Modules/MeetupIdX'
|
pod 'MeetupIdX', :path => '../Modules/MeetupIdX'
|
||||||
|
pod 'MicX', :path => '../Modules/MicX'
|
||||||
pod 'MPAKX', :path => '../Modules/MPAKX'
|
pod 'MPAKX', :path => '../Modules/MPAKX'
|
||||||
|
|
||||||
target 'pesochnicza' do
|
target 'pesochnicza' do
|
||||||
|
|||||||
@@ -1,16 +1,21 @@
|
|||||||
PODS:
|
PODS:
|
||||||
- AELog (0.6.3)
|
- AELog (0.6.3)
|
||||||
- BusX (2023.12.30)
|
- BusX (2024.01.16)
|
||||||
- MeetupIdX (2023.12.31):
|
- MeetupIdX (2023.12.31):
|
||||||
- AELog
|
- AELog
|
||||||
- BusX
|
- BusX
|
||||||
- MPAKX
|
- MPAKX
|
||||||
|
- MicX (2024.01.15):
|
||||||
|
- AELog
|
||||||
|
- BusX
|
||||||
|
- MPAKX
|
||||||
- MPAKX (2023.12.15)
|
- MPAKX (2023.12.15)
|
||||||
|
|
||||||
DEPENDENCIES:
|
DEPENDENCIES:
|
||||||
- AELog
|
- AELog
|
||||||
- BusX (from `../Modules/BusX`)
|
- BusX (from `../Modules/BusX`)
|
||||||
- MeetupIdX (from `../Modules/MeetupIdX`)
|
- MeetupIdX (from `../Modules/MeetupIdX`)
|
||||||
|
- MicX (from `../Modules/MicX`)
|
||||||
- MPAKX (from `../Modules/MPAKX`)
|
- MPAKX (from `../Modules/MPAKX`)
|
||||||
|
|
||||||
SPEC REPOS:
|
SPEC REPOS:
|
||||||
@@ -22,15 +27,18 @@ EXTERNAL SOURCES:
|
|||||||
:path: "../Modules/BusX"
|
:path: "../Modules/BusX"
|
||||||
MeetupIdX:
|
MeetupIdX:
|
||||||
:path: "../Modules/MeetupIdX"
|
:path: "../Modules/MeetupIdX"
|
||||||
|
MicX:
|
||||||
|
:path: "../Modules/MicX"
|
||||||
MPAKX:
|
MPAKX:
|
||||||
:path: "../Modules/MPAKX"
|
:path: "../Modules/MPAKX"
|
||||||
|
|
||||||
SPEC CHECKSUMS:
|
SPEC CHECKSUMS:
|
||||||
AELog: f732b70f7a9d1b4c6a3676304192b3908f362133
|
AELog: f732b70f7a9d1b4c6a3676304192b3908f362133
|
||||||
BusX: d11e857e9cb762f649ee9f88fd5a4f8fbf5bf96b
|
BusX: 7c7675152d44023781c7d46cda3617ceee41312f
|
||||||
MeetupIdX: 2fa9fb27717aa8878ff495c1abe960c96e524308
|
MeetupIdX: 2fa9fb27717aa8878ff495c1abe960c96e524308
|
||||||
|
MicX: 6ffa81f29a477a66cde277e3ade3de8ce2d47b91
|
||||||
MPAKX: dc592434f55edf34709f6e4f37c9ec90dcd95185
|
MPAKX: dc592434f55edf34709f6e4f37c9ec90dcd95185
|
||||||
|
|
||||||
PODFILE CHECKSUM: ff31073a9b868750f1cfabf6c1c740dbf32d4cb1
|
PODFILE CHECKSUM: 392946a4062b4b9d773ce17e4479d0040d242551
|
||||||
|
|
||||||
COCOAPODS: 1.13.0
|
COCOAPODS: 1.13.0
|
||||||
|
|||||||
@@ -1,35 +1,79 @@
|
|||||||
|
import BusX
|
||||||
|
import Combine
|
||||||
import MeetupIdX
|
import MeetupIdX
|
||||||
|
import MicX
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
struct Content: View {
|
struct Content: View {
|
||||||
var body: some View {
|
var body: some View {
|
||||||
MeetupId.V()
|
MicItem.V()
|
||||||
Divider()
|
MicItem.V("1")
|
||||||
MeetupId.V()
|
MicItem.V("2")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@UIApplicationMain
|
@UIApplicationMain
|
||||||
class AppDelegate: UIResponder, UIApplicationDelegate
|
class AppDelegate: UIResponder, UIApplicationDelegate
|
||||||
{
|
{
|
||||||
let meetupIS = MeetupId.Service(.init())
|
let meetupIS = MeetupId.Service(.init())
|
||||||
var window: UIWindow?
|
var window: UIWindow?
|
||||||
|
|
||||||
func application(
|
func application(
|
||||||
_ application: UIApplication,
|
_ application: UIApplication,
|
||||||
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
|
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
|
||||||
) -> Bool {
|
) -> Bool {
|
||||||
window = UIWindow(frame: UIScreen.main.bounds)
|
window = UIWindow(frame: UIScreen.main.bounds)
|
||||||
let vc = UIViewController()
|
let vc = UIViewController()
|
||||||
addSwiftUIViewAsChild(swiftUIView: Content(), parent: vc.view)
|
addSwiftUIViewAsChild(swiftUIView: Content(), parent: vc.view)
|
||||||
vc.view.backgroundColor = .white
|
vc.view.backgroundColor = .white
|
||||||
window?.rootViewController = vc
|
window?.rootViewController = vc
|
||||||
window?.backgroundColor = UIColor.white
|
window?.backgroundColor = UIColor.white
|
||||||
window?.makeKeyAndVisible()
|
window?.makeKeyAndVisible()
|
||||||
|
|
||||||
/**/print("ИГР UUID:", UUID().uuidString)
|
/**/print("ИГР App.didFLWO")
|
||||||
|
testMic1()
|
||||||
return true
|
//testMic2()
|
||||||
|
testMic2_id("1")
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
|
||||||
|
self.testMic2_id("2")
|
||||||
}
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func testMic1() {
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
|
||||||
|
Bus.send(Mic.K.isActive, true)
|
||||||
|
}
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now() + 4) {
|
||||||
|
Bus.send(Mic.K.isActive, false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func testMic2() {
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
|
||||||
|
Bus.send(Mic.K.activityDate, Date() + 2)
|
||||||
|
}
|
||||||
|
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
|
||||||
|
Bus.send(Mic.K.activityDate, Date() + 2)
|
||||||
|
}
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now() + 6) {
|
||||||
|
Bus.send(Mic.K.activityDate, Date() + 7)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var subscriptions = [AnyCancellable]()
|
||||||
|
func testMic2_id(_ id: String) {
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
|
||||||
|
Bus.send(Bus.keyId(Mic.K.activityDate, id), Date() + 2)
|
||||||
|
}
|
||||||
|
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
|
||||||
|
Bus.send(Bus.keyId(Mic.K.activityDate, id), Date() + 2)
|
||||||
|
}
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now() + 6) {
|
||||||
|
Bus.send(Bus.keyId(Mic.K.activityDate, id), Date() + 3)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user