// // AutocompleteController.swift // ComposeUI // // Created by Shadowfacts on 3/25/23. // import SwiftUI import Combine class AutocompleteController: ViewController { unowned let parent: ComposeController @Published var mode: Mode? init(parent: ComposeController) { self.parent = parent parent.$currentInput .compactMap { $0 } .flatMap { $0.autocompleteStatePublisher } .map { switch $0 { case .mention(_): return Mode.mention case .emoji(_): return Mode.emoji case .hashtag(_): return Mode.hashtag case nil: return nil } } .assign(to: &$mode) } var view: some View { AutocompleteView() } struct AutocompleteView: View { @EnvironmentObject private var parent: ComposeController @EnvironmentObject private var controller: AutocompleteController @Environment(\.colorScheme) private var colorScheme: ColorScheme var body: some View { if let mode = controller.mode { VStack(spacing: 0) { Divider() suggestionsView(mode: mode) } .background(backgroundColor) } } @ViewBuilder private func suggestionsView(mode: Mode) -> some View { switch mode { case .mention: ControllerView(controller: { AutocompleteMentionsController(composeController: parent) }) case .emoji: ControllerView(controller: { AutocompleteEmojisController(composeController: parent) }) case .hashtag: ControllerView(controller: { AutocompleteHashtagsController(composeController: parent) }) } } private var backgroundColor: Color { Color(white: colorScheme == .light ? 0.98 : 0.15) } private var borderColor: Color { Color(white: colorScheme == .light ? 0.85 : 0.25) } } enum Mode { case mention case emoji case hashtag } }