Show Tailscale sign-in in an in-app web view

This commit is contained in:
Ian Gulliver
2026-10-22 07:03:56 -07:00
parent eac5db5dad
commit 0a53017319
+33
View File
@@ -3,6 +3,9 @@ import Network
import Observation import Observation
import SwiftUI import SwiftUI
import TailscaleKit import TailscaleKit
#if os(iOS)
import SafariServices
#endif
func slug(_ text: String) -> String { func slug(_ text: String) -> String {
var out = "" var out = ""
@@ -288,6 +291,7 @@ private struct NodeLoginRow: View {
let role: String let role: String
let state: String let state: String
let authURL: URL? let authURL: URL?
@State private var signingIn = false
var body: some View { var body: some View {
HStack(alignment: .center, spacing: 12) { HStack(alignment: .center, spacing: 12) {
@@ -307,9 +311,13 @@ private struct NodeLoginRow: View {
.frame(maxWidth: .infinity, alignment: .leading) .frame(maxWidth: .infinity, alignment: .leading)
if state != "Running" { if state != "Running" {
Button("Sign in") { Button("Sign in") {
#if os(macOS)
if let authURL { if let authURL {
openExternal(authURL) openExternal(authURL)
} }
#else
signingIn = true
#endif
} }
.buttonStyle(WebButtonStyle(primary: true)) .buttonStyle(WebButtonStyle(primary: true))
.disabled(authURL == nil) .disabled(authURL == nil)
@@ -319,5 +327,30 @@ private struct NodeLoginRow: View {
.padding(12) .padding(12)
.background(Palette.bg, in: RoundedRectangle(cornerRadius: 8)) .background(Palette.bg, in: RoundedRectangle(cornerRadius: 8))
.overlay(RoundedRectangle(cornerRadius: 8).stroke(Palette.border)) .overlay(RoundedRectangle(cornerRadius: 8).stroke(Palette.border))
#if os(iOS)
.sheet(isPresented: $signingIn) {
if let authURL {
SafariView(url: authURL)
.ignoresSafeArea()
}
}
.onChange(of: state) {
if state == "Running" {
signingIn = false
}
}
#endif
} }
} }
#if os(iOS)
private struct SafariView: UIViewControllerRepresentable {
let url: URL
func makeUIViewController(context: Context) -> SFSafariViewController {
SFSafariViewController(url: url)
}
func updateUIViewController(_ controller: SFSafariViewController, context: Context) {}
}
#endif