Skip to content

Commit e05c689

Browse files
committed
Adds further support for ShareLink
1 parent c036065 commit e05c689

21 files changed

Lines changed: 665 additions & 436 deletions

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ Environment:
8484
- `requestReview`
8585
- `Refreshable` – includes pull-to-refresh 
8686
- `ScaledMetric`
87+
- `ShareLink`
8788
- `StateObject`
8889
- `scrollDisabled`
8990
- `scrollDismissesKeyboard`

Sources/SwiftUIBackports/Internal/Inspect+UIKit.swift

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,5 @@
11
import SwiftUI
22

3-
#if os(iOS)
4-
internal typealias PlatformView = UIView
5-
internal typealias PlatformViewController = UIViewController
6-
#elseif os(macOS)
7-
internal typealias PlatformView = NSView
8-
internal typealias PlatformViewController = NSViewController
9-
#endif
10-
113
#if os(iOS) || os(macOS)
124
internal extension PlatformView {
135
func ancestor<ViewType: PlatformView>(ofType type: ViewType.Type) -> ViewType? {

Sources/SwiftUIBackports/Internal/OwningController.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ import AppKit
2222
public extension NSView {
2323

2424
var parentController: NSViewController? {
25-
if let responder = self.next as? NSViewController {
25+
if let responder = self.nextResponder as? NSViewController {
2626
return responder
27-
} else if let responder = self.next as? NSView {
27+
} else if let responder = self.nextResponder as? NSView {
2828
return responder.parentController
2929
} else {
3030
return nil
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#if os(iOS)
2+
3+
import UIKit
4+
5+
public typealias PlatformImage = UIImage
6+
7+
internal typealias PlatformView = UIView
8+
internal typealias PlatformViewController = UIViewController
9+
10+
#elseif os(macOS)
11+
12+
import AppKit
13+
14+
public typealias PlatformImage = NSImage
15+
16+
internal typealias PlatformView = NSView
17+
internal typealias PlatformViewController = NSViewController
18+
19+
#endif
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import SwiftUI
2+
3+
extension String {
4+
internal init?(_ stringKey: LocalizedStringKey) {
5+
guard let key = Mirror(reflecting: stringKey).children
6+
.first(where: { $0.label == "key" })?.value as? String else {
7+
return nil
8+
}
9+
10+
self = NSLocalizedString(key, comment: "")
11+
}
12+
}

Sources/SwiftUIBackports/Shared/Label/Label.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ extension Backport where Wrapped == Any {
9797
}
9898

9999
@MainActor public var body: some View {
100-
if #available(iOS 14, *) {
100+
if #available(iOS 14, macOS 11, *) {
101101
SwiftUI.Label {
102102
config.title
103103
} icon: {

Sources/SwiftUIBackports/Shared/Label/Styles/DefaultLabelStyle.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@ extension Backport where Wrapped == Any {
1919
IconOnlyLabelStyle().makeBody(configuration: configuration)
2020
} else {
2121
TitleAndIconLabelStyle().makeBody(configuration: configuration)
22+
#if os(iOS)
2223
.inspect { inspector in
2324
inspector.ancestor(ofType: UINavigationBar.self)
2425
} customize: { _ in
2526
isToolbarElement = true
2627
}
28+
#endif
2729
}
2830
}
2931
}

Sources/SwiftUIBackports/Shared/ShareLink/ActivityView.swift

Lines changed: 0 additions & 115 deletions
This file was deleted.

Sources/SwiftUIBackports/Shared/ShareLink/DefaultShareLinkLabel.swift

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import SwiftUI
22

33
public struct DefaultShareLinkLabel: View {
44
let text: Text
5+
private static let shareIcon = "square.and.arrow.up"
56

67
init() {
78
text = .init("Share")
@@ -20,10 +21,25 @@ public struct DefaultShareLinkLabel: View {
2021
}
2122

2223
public var body: some View {
23-
Backport.Label {
24-
text
25-
} icon: {
26-
Image(systemName: "square.and.arrow.up")
24+
if #available(iOS 14, macOS 11, watchOS 7, tvOS 14, *) {
25+
Label {
26+
text
27+
} icon: {
28+
Image(systemName: Self.shareIcon)
29+
}
30+
} else {
31+
Backport.Label {
32+
text
33+
} icon: {
34+
#if os(macOS)
35+
// no icon on earlier macOS versions
36+
if #available(macOS 11, *) {
37+
Image(systemName: Self.shareIcon)
38+
}
39+
#else
40+
Image(systemName: Self.shareIcon)
41+
#endif
42+
}
2743
}
2844
}
2945
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import SwiftUI
2+
3+
@available(iOS, deprecated: 16)
4+
@available(macOS, deprecated: 13)
5+
@available(watchOS, deprecated: 9)
6+
@available(tvOS, unavailable)
7+
public extension Backport.ShareLink where Wrapped == Any {
8+
init<S: StringProtocol>(_ title: S, items: Data, subject: String? = nil, message: String? = nil, preview: @escaping (Data.Element) -> SharePreview<PreviewImage, PreviewIcon>)
9+
where Data.Element: BackportTransferable, Label == DefaultShareLinkLabel
10+
{
11+
self.label = .init(title)
12+
self.data = items
13+
self.subject = subject
14+
self.message = message
15+
self.preview = preview
16+
}
17+
18+
init(_ titleKey: LocalizedStringKey, items: Data, subject: String? = nil, message: String? = nil, preview: @escaping (Data.Element) -> SharePreview<PreviewImage, PreviewIcon>)
19+
where Data.Element: BackportTransferable, Label == DefaultShareLinkLabel
20+
{
21+
self.label = .init(titleKey)
22+
self.data = items
23+
self.subject = subject
24+
self.message = message
25+
self.preview = preview
26+
}
27+
28+
init(_ title: Text, items: Data, subject: String? = nil, message: String? = nil, preview: @escaping (Data.Element) -> SharePreview<PreviewImage, PreviewIcon>)
29+
where Data.Element: BackportTransferable, Label == DefaultShareLinkLabel
30+
{
31+
self.label = .init(title)
32+
self.data = items
33+
self.subject = subject
34+
self.message = message
35+
self.preview = preview
36+
}
37+
}

0 commit comments

Comments
 (0)