Skip to content

Commit 8ce9622

Browse files
committed
Added SwiftUI library of helpers
1 parent b7b55b5 commit 8ce9622

File tree

4 files changed

+72
-8
lines changed

4 files changed

+72
-8
lines changed

DJSwiftHelpers.xcodeproj/project.pbxproj

+17-4
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
6220B4C325ADDDC40064B9EB /* Collection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6220B4C225ADDDC40064B9EB /* Collection.swift */; };
2929
6220B4C425ADDDC40064B9EB /* Collection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6220B4C225ADDDC40064B9EB /* Collection.swift */; };
3030
6220B4C525ADDDC40064B9EB /* Collection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6220B4C225ADDDC40064B9EB /* Collection.swift */; };
31+
622E8B3829167B14009F7A8D /* OnFirstAppear.swift in Sources */ = {isa = PBXBuildFile; fileRef = 622E8B3729167B14009F7A8D /* OnFirstAppear.swift */; };
32+
622E8B3A29167B79009F7A8D /* OpenInSafari.swift in Sources */ = {isa = PBXBuildFile; fileRef = 622E8B3929167B79009F7A8D /* OpenInSafari.swift */; };
3133
6241494328F338EB00161522 /* NSMutableAttributedString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6241494228F338EB00161522 /* NSMutableAttributedString.swift */; };
3234
625380722594BCE900C58B2F /* CLLocationCoordinate2D.swift in Sources */ = {isa = PBXBuildFile; fileRef = 625380712594BCE900C58B2F /* CLLocationCoordinate2D.swift */; };
3335
625380762594BDDD00C58B2F /* CLLocationCoordinate2D.swift in Sources */ = {isa = PBXBuildFile; fileRef = 625380712594BCE900C58B2F /* CLLocationCoordinate2D.swift */; };
@@ -83,7 +85,6 @@
8385
62DF50AD256E9AA800C88FF7 /* URLSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6206C950256D6FF8003F3A67 /* URLSession.swift */; };
8486
62DF50B1256E9AAA00C88FF7 /* UserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 620F6A4D250BBCE900B10032 /* UserDefaults.swift */; };
8587
62DF50B5256E9AAD00C88FF7 /* Decodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D6CDE8255BFCCB00ABD216 /* Decodable.swift */; };
86-
62E392382710620F008C9C89 /* UIActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62E392372710620F008C9C89 /* UIActivity.swift */; };
8788
62EC880526F8DACE00211A6A /* Locale.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62EC880426F8DACE00211A6A /* Locale.swift */; };
8889
62EC880626F8DACE00211A6A /* Locale.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62EC880426F8DACE00211A6A /* Locale.swift */; };
8990
62EC880726F8DACE00211A6A /* Locale.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62EC880426F8DACE00211A6A /* Locale.swift */; };
@@ -105,6 +106,8 @@
105106
620F6A4D250BBCE900B10032 /* UserDefaults.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserDefaults.swift; sourceTree = "<group>"; };
106107
621B3C35255D467000A5E77F /* DJSwiftHelpers_Extension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DJSwiftHelpers_Extension.framework; sourceTree = BUILT_PRODUCTS_DIR; };
107108
6220B4C225ADDDC40064B9EB /* Collection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Collection.swift; sourceTree = "<group>"; };
109+
622E8B3729167B14009F7A8D /* OnFirstAppear.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnFirstAppear.swift; sourceTree = "<group>"; };
110+
622E8B3929167B79009F7A8D /* OpenInSafari.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenInSafari.swift; sourceTree = "<group>"; };
108111
6241494228F338EB00161522 /* NSMutableAttributedString.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSMutableAttributedString.swift; sourceTree = "<group>"; };
109112
625380712594BCE900C58B2F /* CLLocationCoordinate2D.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CLLocationCoordinate2D.swift; sourceTree = "<group>"; };
110113
625380812594CE9B00C58B2F /* Double.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Double.swift; sourceTree = "<group>"; };
@@ -130,7 +133,6 @@
130133
62D6CDF1255C002B00ABD216 /* URLRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URLRequest.swift; sourceTree = "<group>"; };
131134
62DEDA482636D40A00771544 /* FileManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileManager.swift; sourceTree = "<group>"; };
132135
62DF505D256E99DB00C88FF7 /* DJSwiftHelpers.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DJSwiftHelpers.framework; sourceTree = BUILT_PRODUCTS_DIR; };
133-
62E392372710620F008C9C89 /* UIActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIActivity.swift; sourceTree = "<group>"; };
134136
62EC880426F8DACE00211A6A /* Locale.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Locale.swift; sourceTree = "<group>"; };
135137
62F315EA27A186F0003D2906 /* Task.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Task.swift; sourceTree = "<group>"; };
136138
/* End PBXFileReference section */
@@ -170,6 +172,7 @@
170172
620F6A1C250BB75500B10032 = {
171173
isa = PBXGroup;
172174
children = (
175+
622E8B36291679A8009F7A8D /* SwiftUI */,
173176
6267B87626A07017009A31B1 /* Non_Extension */,
174177
620F6A31250BB76900B10032 /* Common */,
175178
620F6A28250BB75500B10032 /* DJSwiftHelpers */,
@@ -223,6 +226,16 @@
223226
path = Sources/Common;
224227
sourceTree = "<group>";
225228
};
229+
622E8B36291679A8009F7A8D /* SwiftUI */ = {
230+
isa = PBXGroup;
231+
children = (
232+
622E8B3729167B14009F7A8D /* OnFirstAppear.swift */,
233+
622E8B3929167B79009F7A8D /* OpenInSafari.swift */,
234+
);
235+
name = SwiftUI;
236+
path = Sources/SwiftUI;
237+
sourceTree = "<group>";
238+
};
226239
6266547F25F2765C00696303 /* DJSwiftHelpers_MacOS */ = {
227240
isa = PBXGroup;
228241
children = (
@@ -237,7 +250,6 @@
237250
children = (
238251
62BFAA93273ECDE600DAC879 /* Gradient.swift */,
239252
6241494228F338EB00161522 /* NSMutableAttributedString.swift */,
240-
62E392372710620F008C9C89 /* UIActivity.swift */,
241253
6267B87826A07017009A31B1 /* UIApplication.swift */,
242254
6278E8432861A8590004DF29 /* UIColor.swift */,
243255
6278E8492861A8590004DF29 /* UIDevice.swift */,
@@ -445,18 +457,19 @@
445457
62F315EB27A186F0003D2906 /* Task.swift in Sources */,
446458
6267B87C26A07017009A31B1 /* UIApplication.swift in Sources */,
447459
620F6A39250BB78200B10032 /* String.swift in Sources */,
460+
622E8B3A29167B79009F7A8D /* OpenInSafari.swift in Sources */,
448461
62D6CDF2255C002B00ABD216 /* URLRequest.swift in Sources */,
449462
62BFAA94273ECDE600DAC879 /* Gradient.swift in Sources */,
450463
6206C951256D6FF8003F3A67 /* URLSession.swift in Sources */,
451464
620F6A37250BB78200B10032 /* Array.swift in Sources */,
452465
62EC880526F8DACE00211A6A /* Locale.swift in Sources */,
453466
620F6A4E250BBCE900B10032 /* UserDefaults.swift in Sources */,
454467
625380822594CE9B00C58B2F /* Double.swift in Sources */,
468+
622E8B3829167B14009F7A8D /* OnFirstAppear.swift in Sources */,
455469
62018FE725DEB40F002B71A5 /* AsyncOperation.swift in Sources */,
456470
62D6CDEF255BFFA300ABD216 /* URLResponse.swift in Sources */,
457471
6220B4C325ADDDC40064B9EB /* Collection.swift in Sources */,
458472
62D6CDEC255BFDA900ABD216 /* Date.swift in Sources */,
459-
62E392382710620F008C9C89 /* UIActivity.swift in Sources */,
460473
62DEDA492636D40A00771544 /* FileManager.swift in Sources */,
461474
62754BA625E691E200F2F489 /* Codable.swift in Sources */,
462475
6267B87926A07017009A31B1 /* UIWindow.swift in Sources */,

Package.swift

+8
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ let package = Package(
1919
.library(
2020
name: "DJSwiftHelpers_UIKit",
2121
targets: ["DJSwiftHelpers_UIKit"]
22+
),
23+
.library(
24+
name: "DJSwiftHelpers_SwiftUI",
25+
targets: ["DJSwiftHelpers_SwiftUI"]
2226
)
2327
],
2428
targets: [
@@ -34,6 +38,10 @@ let package = Package(
3438
.target(
3539
name: "DJSwiftHelpers_UIKit",
3640
path: "Sources/Non_Extension/"
41+
),
42+
.target(
43+
name: "DJSwiftHelpers_SwiftUI",
44+
path: "Sources/SwiftUI/"
3745
)
3846
]
3947
)

Sources/SwiftUI/OnFirstAppear.swift

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
//
2+
// OnFirstAppear.swift
3+
// DJSwiftHelpers
4+
//
5+
// Created by Darren Jones on 05/11/2022.
6+
// Copyright © 2022 Dappological Ltd. All rights reserved.
7+
//
8+
9+
import SwiftUI
10+
11+
@available(iOS 13.0, *)
12+
public
13+
extension View {
14+
15+
/**
16+
A SwiftUI view modifier that executes a block of code only once during the first display of the view
17+
- Parameters:
18+
- action: A block of code to execute during the views first `onAppear`
19+
20+
Note that this will stop the re-execution of code after navigating away and back to the view, however it should re-run if the view is re-drawn.
21+
*/
22+
func onFirstAppear(_ action: @escaping () -> ()) -> some View {
23+
modifier(FirstAppear(action: action))
24+
}
25+
}
26+
27+
@available(iOS 13.0, *)
28+
private
29+
struct FirstAppear: ViewModifier {
30+
let action: () -> ()
31+
32+
// Use this to only fire your block one time
33+
@State private var hasAppeared = false
34+
35+
func body(content: Content) -> some View {
36+
// And then, track it here
37+
content.onAppear {
38+
guard !hasAppeared else { return }
39+
hasAppeared = true
40+
action()
41+
}
42+
}
43+
}

Sources/Non_Extension/UIActivity.swift Sources/SwiftUI/OpenInSafari.swift

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
//
2-
// UIActivity.swift
2+
// OpenInSafari.swift
33
// DJSwiftHelpers
44
//
5-
// Created by Darren Jones on 08/10/2021.
6-
// Copyright © 2021 Dappological Ltd. All rights reserved.
5+
// Created by Darren Jones on 05/11/2022.
6+
// Copyright © 2022 Dappological Ltd. All rights reserved.
77
//
88

99
#if os(iOS)
@@ -62,7 +62,7 @@ struct SafariActivityView: UIViewControllerRepresentable {
6262
A `UIActivity` that adds an `Open in Safari` activity to a share sheet.
6363
*/
6464
@available(iOS 13, *)
65-
public
65+
private
6666
class SafariActivity: UIActivity {
6767

6868
public var url: URL?

0 commit comments

Comments
 (0)