Renamed the InputAlertView component in the Browse module as InputAlert.
This commit is contained in:
parent
fbef849423
commit
692fd99c5d
134
Modules/Sources/Browse/UI/Components/InputAlert.swift
Normal file
134
Modules/Sources/Browse/UI/Components/InputAlert.swift
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
//
|
||||||
|
// InputAlert.swift
|
||||||
|
// Browse
|
||||||
|
//
|
||||||
|
// Created by Javier Cicchelli on 16/12/2022.
|
||||||
|
// Copyright © 2022 Röck+Cöde. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import DataModels
|
||||||
|
import SwiftUI
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
struct InputAlert: UIViewControllerRepresentable {
|
||||||
|
|
||||||
|
// MARK: Bindings
|
||||||
|
|
||||||
|
@Binding private var isPresenting: Bool
|
||||||
|
@Binding private var textFieldString: String
|
||||||
|
|
||||||
|
// MARK: Properties
|
||||||
|
|
||||||
|
private let title: String
|
||||||
|
private let message: String
|
||||||
|
private let textFieldPlaceholder: String
|
||||||
|
private let actions: [UIAlertAction]
|
||||||
|
|
||||||
|
// MARK: Initialisers
|
||||||
|
|
||||||
|
init(
|
||||||
|
isPresenting: Binding<Bool>,
|
||||||
|
title: String,
|
||||||
|
message: String,
|
||||||
|
textFieldPlaceholder: String,
|
||||||
|
textFieldString: Binding<String>,
|
||||||
|
actions: [UIAlertAction]
|
||||||
|
) {
|
||||||
|
self.title = title
|
||||||
|
self.message = message
|
||||||
|
self.textFieldPlaceholder = textFieldPlaceholder
|
||||||
|
self.actions = actions
|
||||||
|
|
||||||
|
self._isPresenting = isPresenting
|
||||||
|
self._textFieldString = textFieldString
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: Functions
|
||||||
|
|
||||||
|
func makeUIViewController(
|
||||||
|
context: UIViewControllerRepresentableContext<InputAlert>
|
||||||
|
) -> UIViewController {
|
||||||
|
.init()
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateUIViewController(
|
||||||
|
_ viewController: UIViewController,
|
||||||
|
context: UIViewControllerRepresentableContext<InputAlert>
|
||||||
|
) {
|
||||||
|
guard
|
||||||
|
context.coordinator.alert == nil,
|
||||||
|
isPresenting
|
||||||
|
else { return }
|
||||||
|
|
||||||
|
let alertController = {
|
||||||
|
let alert = UIAlertController(
|
||||||
|
title: title,
|
||||||
|
message: message,
|
||||||
|
preferredStyle: .alert
|
||||||
|
)
|
||||||
|
|
||||||
|
alert.addTextField { textField in
|
||||||
|
textField.placeholder = textFieldPlaceholder
|
||||||
|
textField.text = textFieldString
|
||||||
|
textField.delegate = context.coordinator
|
||||||
|
}
|
||||||
|
|
||||||
|
actions.forEach { action in
|
||||||
|
alert.addAction(action)
|
||||||
|
}
|
||||||
|
|
||||||
|
return alert
|
||||||
|
}()
|
||||||
|
|
||||||
|
context.coordinator.alert = alertController
|
||||||
|
|
||||||
|
Task { @MainActor in
|
||||||
|
viewController.present(
|
||||||
|
alertController,
|
||||||
|
animated: true
|
||||||
|
) {
|
||||||
|
isPresenting = false
|
||||||
|
context.coordinator.alert = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeCoordinator() -> Coordinator {
|
||||||
|
.init(self)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Coordinator
|
||||||
|
|
||||||
|
extension InputAlert {
|
||||||
|
class Coordinator: NSObject, UITextFieldDelegate {
|
||||||
|
|
||||||
|
// MARK: Properties
|
||||||
|
|
||||||
|
var alert: UIAlertController?
|
||||||
|
|
||||||
|
private let parent: InputAlert
|
||||||
|
|
||||||
|
// MARK: Initialisers
|
||||||
|
|
||||||
|
init(_ parent: InputAlert) {
|
||||||
|
self.parent = parent
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: UITextFieldDelegate
|
||||||
|
|
||||||
|
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
|
||||||
|
parent.textFieldString = {
|
||||||
|
if let text = textField.text as NSString? {
|
||||||
|
return text.replacingCharacters(in: range, with: string)
|
||||||
|
} else {
|
||||||
|
return .empty
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user