Sfoglia il codice sorgente

Add GIDSignInButton wrapper for SwiftUI

Matthew Mathias 4 anni fa
parent
commit
a799d187ab
2 ha cambiato i file con 69 aggiunte e 1 eliminazioni
  1. 55 0
      GoogleSignIn/SwiftUI_Sources/GIDSignInButtonWrapper.swift
  2. 14 1
      Package.swift

+ 55 - 0
GoogleSignIn/SwiftUI_Sources/GIDSignInButtonWrapper.swift

@@ -0,0 +1,55 @@
+/*
+ * Copyright 2021 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import SwiftUI
+import GoogleSignIn
+
+/// A wrapper for `GIDSignInButton` so that it can be used in SwiftUI.
+@available(iOS 13.0, *)
+public struct GIDSignInButtonWrapper: UIViewRepresentable {
+  public let handler: () -> Void
+
+  public init(handler: @escaping () -> Void) {
+    self.handler = handler
+  }
+
+  public func makeCoordinator() -> Coordinator {
+    return Coordinator()
+  }
+
+  public func makeUIView(context: Context) -> GIDSignInButton {
+    let signInButton = GIDSignInButton()
+    signInButton.addTarget(context.coordinator,
+                           action: #selector(Coordinator.callHandler),
+                           for: .touchUpInside)
+    return signInButton
+  }
+
+  public func updateUIView(_ uiView: UIViewType, context: Context) {
+    context.coordinator.handler = handler
+  }
+}
+
+@available(iOS 13.0, *)
+public extension GIDSignInButtonWrapper {
+  class Coordinator {
+    var handler: (() -> Void)?
+
+    @objc func callHandler() {
+      handler?()
+    }
+  }
+}

+ 14 - 1
Package.swift

@@ -26,7 +26,10 @@ let package = Package(
   products: [
     .library(
       name: "GoogleSignIn",
-      targets: ["GoogleSignIn"]
+      targets: [
+        "GoogleSignIn",
+        "GIDSignInButton_SwiftUI"
+      ]
     ),
   ],
   dependencies: [
@@ -78,6 +81,16 @@ let package = Package(
         .linkedFramework("UIKit"),
       ]
     ),
+    .target(
+      name: "GIDSignInButton_SwiftUI",
+      dependencies: [
+        "GoogleSignIn"
+      ],
+      path: "GoogleSignIn/SwiftUI_Sources",
+      linkerSettings: [
+        .linkedLibrary("SwiftUI")
+      ]
+    ),
     .testTarget(
       name: "GoogleSignIn-UnitTests",
       dependencies: [