Skip to content

Instantly share code, notes, and snippets.

View wata's full-sized avatar

Wataru Nagasawa wata

View GitHub Profile
@IBAction func didTapEmailButton(_ sender: Any) {
let authUI = FUIAuth.defaultAuthUI()!
authUI.delegate = self
let settings = ActionCodeSettings()
settings.url = Constants.URLs.login
settings.handleCodeInApp = true
settings.setIOSBundleID(Constants.AppInfo.bundleIdentifier)
authUI.providers = [
FUIEmailAuth(
authAuthUI: authUI,
@wata
wata / ISOString.swift
Last active March 28, 2023 14:46
A simple ISO string parsing and converting library for Swift
public struct ISOString {
/// Parse ISO 6709 string.
/// e.g. "+34.0595-118.4460+091.541/"
/// SeeAlso: [ISO 6709](https://en.wikipedia.org/wiki/ISO_6709)
public static func parse(iso6709 text: String?) -> CLLocation? {
guard
let results = text?.capture(pattern: "([+-][0-9.]+)([+-][0-9.]+)"),
let latitude = results[safe: 1] as NSString?,
let longitude = results[safe: 2] as NSString?
else { return nil }
@wata
wata / BackgroundTask.swift
Created April 7, 2020 14:06
Avoid app termination without calling the `endBackgroundTask(_:)`.
import UIKit
final class BackgroundTask {
private var taskID = UIBackgroundTaskIdentifier.invalid
func begin(withName taskName: String = #function) {
taskID = UIApplication.shared.beginBackgroundTask(withName: taskName) {
UIApplication.shared.endBackgroundTask(self.taskID)
self.taskID = UIBackgroundTaskIdentifier.invalid
}
@wata
wata / DebuggableOptionSet.swift
Created April 7, 2020 04:27
An OptionSet suitable for debugging
protocol DebuggableOptionSet: OptionSet, CustomDebugStringConvertible {
static var allOptions: [Self] { get }
static var allOptionNames: [String] { get }
}
extension DebuggableOptionSet where Self == Self.Element {
var debugDescription: String {
var result = ""
for (index, element) in Self.allOptions.enumerated() {
if contains(element) {
@wata
wata / FirebaseError.swift
Last active March 24, 2023 05:57
A simple and convenience swift wrapper for firebase errors.
import Foundation
import FirebaseAuth
import FirebaseUI
import FirebaseFirestore
import FirebaseFunctions
import FirebaseStorage
struct FirebaseError: LocalizedError {
enum ErrorDomain {
case auth(code: AuthErrorCode, userInfo: [String: Any])
@wata
wata / ViewController.swift
Last active March 9, 2020 14:51
Batch uploader with UIActivityViewController
override func viewDidLoad() {
super.viewDidLoad()
let items: [[Any]] = [
["Foo", URL(string: "http://www.africau.edu/images/default/sample.pdf")!]
["Bar", URL(string: "http://www.africau.edu/images/default/sample.pdf")!]
]
presentActivityViewControllerRecursively(items: items) { (error, items) in
if let error = error, let items = items {
print("Failed to complete activity items: \(items)")
return
final class FadeAnimator: NSObject, UIViewControllerAnimatedTransitioning {
private let presenting: Bool
init(presenting: Bool) {
self.presenting = presenting
}
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.3
}
@wata
wata / JustTapGestureRecognizer.swift
Last active January 16, 2020 13:40
Touches shorter than 0.1 seconds are detected as a tap, and touches longer than 0.1 seconds are canceled.
import UIKit
final class JustTapGestureRecognizer: UITapGestureRecognizer {
private var timer: Timer?
private let cancellationTimeInterval = TimeInterval(0.1)
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
timer = Timer.scheduledTimer(withTimeInterval: cancellationTimeInterval, repeats: false) { [weak self] (_) in
self?.state = .cancelled
}
@wata
wata / SignInView.swift
Created January 7, 2020 02:40
Add sign-in to SwiftUI iOS app with FirebaseUI.
import SwiftUI
import FirebaseUI
struct SignInView: View {
@State private var user: FirebaseAuth.User?
var body: some View {
SignInViewController(user: $user)
}
}
enum PanAxis {
case none
case horizontal
case vertical
}
/// Returns only translation in either horizontal or vertical direction determined at `UIGestureRecognizer.State.began`.
class DirectionalPanGestureRecognizer: UIPanGestureRecognizer {
var axis = PanAxis.none
var directionalTranslation: CGPoint {