Minor fixes
This commit is contained in:
@@ -5,7 +5,7 @@ public extension View {
|
||||
func presentationDetentsIfAvailable() -> some View {
|
||||
#if os(iOS) || os(tvOS)
|
||||
if #available(iOS 16.0, tvOS 17.0, *) {
|
||||
self.presentationDetents([.large])
|
||||
presentationDetents([.large])
|
||||
.presentationDragIndicator(.visible)
|
||||
} else {
|
||||
self
|
||||
@@ -31,7 +31,7 @@ public extension View {
|
||||
ActionButtonWrapper { self }
|
||||
#else
|
||||
if #available(iOS 26.0, macOS 26.0, *) {
|
||||
self.frame(width: 44, height: 32)
|
||||
frame(width: 44, height: 32)
|
||||
.glassEffect(.regular.interactive(), in: .rect(cornerRadius: 8))
|
||||
} else {
|
||||
frame(width: 44, height: 32)
|
||||
|
||||
@@ -81,7 +81,7 @@ private extension View {
|
||||
@ViewBuilder
|
||||
func selectorBackground() -> some View {
|
||||
if #available(iOS 26.0, macOS 26.0, tvOS 26.0, *) {
|
||||
self.glassEffect(.regular.interactive(), in: .rect(cornerRadius: 12))
|
||||
glassEffect(.regular.interactive(), in: .rect(cornerRadius: 12))
|
||||
} else {
|
||||
background(
|
||||
RoundedRectangle(cornerRadius: 12)
|
||||
|
||||
@@ -41,6 +41,7 @@ public struct StartStopButton: View {
|
||||
@EnvironmentObject private var profile: ExtensionProfile
|
||||
@State private var alert: AlertState?
|
||||
@State private var currentTime = Date()
|
||||
@State private var isStarting = false
|
||||
|
||||
private let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
|
||||
|
||||
@@ -109,6 +110,21 @@ public struct StartStopButton: View {
|
||||
.onReceive(timer) { _ in
|
||||
currentTime = Date()
|
||||
}
|
||||
.onChangeCompat(of: profile.status) { status in
|
||||
if isStarting {
|
||||
if status == .disconnected {
|
||||
isStarting = false
|
||||
if #available(iOS 16.0, macOS 13.0, tvOS 17.0, *) {
|
||||
Task {
|
||||
await checkStartupError()
|
||||
}
|
||||
}
|
||||
} else if status.isConnectedStrict {
|
||||
isStarting = false
|
||||
environments.commandClient.connect()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if os(iOS)
|
||||
@@ -136,16 +152,26 @@ public struct StartStopButton: View {
|
||||
}
|
||||
}
|
||||
|
||||
@available(iOS 16.0, macOS 13.0, tvOS 17.0, *)
|
||||
private func checkStartupError() async {
|
||||
do {
|
||||
try await profile.fetchLastDisconnectError()
|
||||
} catch {
|
||||
alert = AlertState(title: String(localized: "Service Error"), message: error.localizedDescription)
|
||||
}
|
||||
}
|
||||
|
||||
private nonisolated func switchProfile(_ isEnabled: Bool) async {
|
||||
do {
|
||||
if isEnabled {
|
||||
await MainActor.run { isStarting = true }
|
||||
try await profile.start()
|
||||
await environments.commandClient.connect()
|
||||
} else {
|
||||
try await profile.stop()
|
||||
}
|
||||
} catch {
|
||||
await MainActor.run {
|
||||
isStarting = false
|
||||
alert = AlertState(error: error)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -147,8 +147,8 @@ class LogCoordinator {
|
||||
ScrollView {
|
||||
LogUITextView(logs: logs, searchText: searchText)
|
||||
.font(font)
|
||||
// Explicit height ensures navigation bar large title collapse animation works correctly with UITextView
|
||||
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading)
|
||||
.fixedSize(horizontal: false, vertical: true)
|
||||
.frame(maxWidth: .infinity, alignment: .topLeading)
|
||||
.padding()
|
||||
.id("logContent")
|
||||
}
|
||||
@@ -226,6 +226,15 @@ class LogCoordinator {
|
||||
// Update cache to full content
|
||||
context.coordinator.cachedAttributedString = NSAttributedString(attributedString: textStorage)
|
||||
}
|
||||
|
||||
textView.invalidateIntrinsicContentSize()
|
||||
}
|
||||
|
||||
@available(iOS 16.0, *)
|
||||
func sizeThatFits(_ proposal: ProposedViewSize, uiView: UITextView, context _: Context) -> CGSize? {
|
||||
guard let width = proposal.width, width > 0 else { return nil }
|
||||
let size = uiView.sizeThatFits(CGSize(width: width, height: .greatestFiniteMagnitude))
|
||||
return CGSize(width: width, height: size.height)
|
||||
}
|
||||
|
||||
func makeCoordinator() -> LogCoordinator {
|
||||
@@ -302,6 +311,10 @@ class LogCoordinator {
|
||||
context.coordinator.cachedAttributedString = NSAttributedString(attributedString: textStorage)
|
||||
}
|
||||
|
||||
if let textContainer = textView.textContainer {
|
||||
textView.layoutManager?.ensureLayout(for: textContainer)
|
||||
}
|
||||
|
||||
let shouldScroll = shouldAutoScroll && logs.count != lastCount
|
||||
if shouldScroll {
|
||||
DispatchQueue.main.async {
|
||||
|
||||
@@ -87,7 +87,7 @@ public struct NavigationSheet<Content: View>: View {
|
||||
@ViewBuilder
|
||||
func sheetDetent(_ size: SheetSize) -> some View {
|
||||
if #available(iOS 16.0, tvOS 17.0, *) {
|
||||
self.presentationDetents([size.presentationDetent])
|
||||
presentationDetents([size.presentationDetent])
|
||||
.presentationDragIndicator(.visible)
|
||||
} else {
|
||||
self
|
||||
|
||||
Reference in New Issue
Block a user