251 lines
7.5 KiB
Swift
251 lines
7.5 KiB
Swift
//
|
||
// ScannerViewController.swift
|
||
// Runner
|
||
//
|
||
// Created by Ivan Murashov on 13/07/2017.
|
||
// Copyright © 2017 The Chromium Authors. All rights reserved.
|
||
//
|
||
|
||
import UIKit
|
||
import Flutter
|
||
|
||
extension ZBarSymbolSet: Sequence {
|
||
//public typealias Element = ZBarSymbol
|
||
//public typealias Iterator = NSFastEnumerationIterator
|
||
|
||
public func makeIterator() -> NSFastEnumerationIterator {
|
||
return NSFastEnumerationIterator(self)
|
||
}
|
||
}
|
||
|
||
@objc class ScannerViewController: UIViewController, ZBarReaderDelegate, UITextFieldDelegate {
|
||
|
||
enum AppLocale {
|
||
case ru
|
||
case en
|
||
}
|
||
|
||
enum ButtonState {
|
||
case card
|
||
case phone
|
||
|
||
var icon: UIImage {
|
||
|
||
switch self {
|
||
case .card: return UIImage(named: "card")!
|
||
case .phone: return UIImage(named: "phone")!
|
||
}
|
||
}
|
||
|
||
var searchType: String {
|
||
switch self {
|
||
case .card: return "card"
|
||
case .phone: return "phone"
|
||
}
|
||
}
|
||
}
|
||
|
||
var appLocale: AppLocale
|
||
var buttonState: ButtonState = .card
|
||
|
||
var platformChannel: FlutterMethodChannel?
|
||
let readerViewController = ZBarReaderViewController()
|
||
|
||
|
||
//Вьюшка для верхнего меню
|
||
let topView = UIView()
|
||
|
||
//Окно ввода кода
|
||
let textField = UITextField()
|
||
|
||
//Кнопка настроек
|
||
var settingButton: UIButton!
|
||
|
||
required init?(coder aDecoder: NSCoder) {
|
||
self.appLocale = .en
|
||
super.init(coder: aDecoder)
|
||
}
|
||
|
||
init(locale: String) {
|
||
switch locale {
|
||
case "ru": self.appLocale = .ru; break
|
||
default: self.appLocale = .en
|
||
}
|
||
super.init(nibName: nil, bundle: nil)
|
||
}
|
||
|
||
func getCardHint() -> String {
|
||
switch self.appLocale {
|
||
case .ru: return "Ввести номер карты вручную"
|
||
default: return "Enter the barcode manually"
|
||
}
|
||
}
|
||
|
||
func getPhoneHint() -> String {
|
||
switch self.appLocale {
|
||
case .ru: return "Ввести номер телефона вручную"
|
||
default: return "Enter the phone manually"
|
||
}
|
||
}
|
||
|
||
func getInputHint() -> String {
|
||
switch self.buttonState {
|
||
case .card: return self.getCardHint()
|
||
case .phone: return self.getPhoneHint()
|
||
}
|
||
}
|
||
|
||
func getErrorTitle() -> String {
|
||
switch self.appLocale {
|
||
case .ru: return "Ошибка"
|
||
default: return "Error"
|
||
}
|
||
}
|
||
|
||
func getCardErrorText() -> String {
|
||
switch self.appLocale {
|
||
case .ru: return "Пользователь с номером карты %@ не найден"
|
||
default: return "User with card number %@ not found"
|
||
}
|
||
}
|
||
|
||
func getPhoneErrorText() -> String {
|
||
switch self.appLocale {
|
||
case .ru: return "Пользователь с номером телефона %@ не найден"
|
||
default: return "User with phone number %@ not found"
|
||
}
|
||
}
|
||
|
||
func getErrorText() -> String {
|
||
switch self.buttonState {
|
||
case .card: return self.getCardErrorText()
|
||
case .phone: return self.getPhoneErrorText()
|
||
}
|
||
}
|
||
|
||
func getDismissText() -> String {
|
||
switch self.appLocale {
|
||
case .ru: return "Скрыть"
|
||
default: return "Dismiss"
|
||
}
|
||
}
|
||
|
||
override func viewDidLoad() {
|
||
super.viewDidLoad()
|
||
|
||
readerViewController.readerDelegate = self
|
||
readerViewController.readerView.zoom = 1.0
|
||
readerViewController.showsZBarControls = false
|
||
|
||
settingButton = UIButton(type: .system)
|
||
settingButton.addTarget(self, action: #selector(ScannerViewController.buttonTouch), for: .touchUpInside)
|
||
|
||
self.addChildViewController(readerViewController)
|
||
self.view.addSubview(readerViewController.view)
|
||
readerViewController.didMove(toParentViewController: self)
|
||
|
||
readerViewController.view.addSubview(topView)
|
||
topView.addSubview(textField)
|
||
topView.addSubview(settingButton)
|
||
|
||
textField.delegate = self
|
||
//textField.keyboardType = .numberPad
|
||
|
||
//Looks for single or multiple taps.
|
||
let tap = UITapGestureRecognizer(target: self, action: #selector(ScannerViewController.hideKeyboard))
|
||
readerViewController.view.addGestureRecognizer(tap)
|
||
|
||
settingButton.setImage(self.buttonState.icon, for: .normal)
|
||
textField.placeholder = self.getInputHint()
|
||
|
||
}
|
||
|
||
func hideKeyboard() {
|
||
view.endEditing(false)
|
||
}
|
||
|
||
func buttonTouch(){
|
||
|
||
switch self.buttonState {
|
||
case .card: self.buttonState = .phone
|
||
case .phone: self.buttonState = .card
|
||
}
|
||
settingButton.setImage(self.buttonState.icon, for: .normal)
|
||
textField.placeholder = self.getInputHint()
|
||
}
|
||
|
||
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
|
||
|
||
sendResult(textField.text!)
|
||
|
||
return true
|
||
}
|
||
|
||
func sendResult(_ str: String) {
|
||
platformChannel?.invokeMethod("findUser", arguments: [str, buttonState.searchType], result: { (result: Any?) in
|
||
if result is FlutterError {
|
||
self.showErrorAlert(str)
|
||
} else {
|
||
|
||
self.dismiss(animated: true) {
|
||
self.platformChannel?.invokeMethod("purchase", arguments: [result, str])
|
||
}
|
||
}
|
||
print("result: \(result.debugDescription )")
|
||
})
|
||
|
||
}
|
||
|
||
func showErrorAlert(_ str: String) {
|
||
let alertController = UIAlertController(
|
||
title: self.getErrorTitle(),
|
||
message: String(format: self.getErrorText(), str),
|
||
preferredStyle: UIAlertControllerStyle.alert
|
||
)
|
||
alertController.addAction(UIAlertAction(title: self.getDismissText(), style: UIAlertActionStyle.default,handler: nil))
|
||
|
||
// if let appDelegate = UIApplication.shared.delegate as? FlutterAppDelegate {
|
||
// appDelegate.window.rootViewController?.present(alertController, animated: true, completion: nil)
|
||
// }
|
||
self.present(alertController, animated: true, completion: nil)
|
||
|
||
}
|
||
|
||
override func viewWillAppear(_ animated: Bool) {
|
||
topView.backgroundColor = UIColor.white
|
||
textField.borderStyle = .roundedRect
|
||
super.viewWillAppear(animated)
|
||
}
|
||
|
||
override func viewDidAppear(_ animated: Bool) {
|
||
super.viewDidAppear(animated)
|
||
}
|
||
|
||
override func viewWillLayoutSubviews() {
|
||
|
||
readerViewController.view.frame = view.bounds
|
||
topView.frame = CGRect(x: 0, y: 0, width: readerViewController.view.frame.size.width, height: 40)
|
||
textField.frame = CGRect(x: settingButton.frame.maxX + 8 + 20 + 5, y: 5, width: readerViewController.view.frame.size.width - 50, height: 30)
|
||
settingButton.frame = CGRect(x: 8, y: 10, width: 20, height: 20)
|
||
|
||
}
|
||
|
||
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
|
||
guard let symbols = info[ZBarReaderControllerResults] as? ZBarSymbolSet else { return }
|
||
|
||
for symbol in symbols {
|
||
|
||
if let symbol = symbol as? ZBarSymbol, let data = symbol.data {
|
||
sendResult(data)
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
override func didReceiveMemoryWarning() {
|
||
super.didReceiveMemoryWarning()
|
||
}
|
||
|
||
}
|