Skip to content

Commit fb2bfb1

Browse files
committed
Рефактор зависимостей
Заношу все небольшие разрозненные утилиты в один локальный пакет, который потом пригодится при разработке "сотки"
1 parent 89adf75 commit fb2bfb1

File tree

22 files changed

+295
-208
lines changed

22 files changed

+295
-208
lines changed

SwiftUI-WorkoutApp.xcodeproj/project.pbxproj

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414
67138D942974854F00BBF450 /* XCTestCase+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67138D932974854F00BBF450 /* XCTestCase+.swift */; };
1515
6718BCA42AD5327F002846A6 /* SnapshotHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6718BCA32AD5327F002846A6 /* SnapshotHelper.swift */; };
1616
671D7DEC28210D2F0068E728 /* EmptyContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 671D7DEB28210D2F0068E728 /* EmptyContentView.swift */; };
17-
6725E3552D4CB7300070B323 /* Date+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6725E3542D4CB7300070B323 /* Date+.swift */; };
18-
674023402B0BC01600A7311A /* FeedbackSender.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6740233F2B0BC01600A7311A /* FeedbackSender.swift */; };
1917
67419ACF282E70B9004F5339 /* ParksListScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67419ACE282E70B9004F5339 /* ParksListScreen.swift */; };
2018
6747575628113419002F0A24 /* ChangePasswordScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6747575528113419002F0A24 /* ChangePasswordScreen.swift */; };
2119
6747575928128603002F0A24 /* ParkDetailScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6747575828128603002F0A24 /* ParkDetailScreen.swift */; };
@@ -60,7 +58,6 @@
6058
6798AA79280BE8E200DB76F1 /* countries.json in Resources */ = {isa = PBXBuildFile; fileRef = 6798AA75280BE8E200DB76F1 /* countries.json */; };
6159
6798AA7B280BE8E200DB76F1 /* oldParks.json in Resources */ = {isa = PBXBuildFile; fileRef = 6798AA77280BE8E200DB76F1 /* oldParks.json */; };
6260
6798AA84280C0F7D00DB76F1 /* EditProfileScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6798AA83280C0F7D00DB76F1 /* EditProfileScreen.swift */; };
63-
679F3B03296841DD00BB3590 /* URLOpener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 679F3B02296841DD00BB3590 /* URLOpener.swift */; };
6461
67A079F22A758E7D005EAF70 /* PickedPhotoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67A079F12A758E7D005EAF70 /* PickedPhotoView.swift */; };
6562
67A4710D2AEED8F8004D341D /* PastEventStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67A4710C2AEED8F8004D341D /* PastEventStorage.swift */; };
6663
67A64A242AC83A0F00CBDD5F /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 67A64A232AC83A0F00CBDD5F /* Localizable.xcstrings */; };
@@ -73,9 +70,7 @@
7370
67BAF3F6283620ED00DB40D9 /* ParkLocationInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67BAF3F5283620ED00DB40D9 /* ParkLocationInfoView.swift */; };
7471
67BAF3F82836245100DB40D9 /* CommentsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67BAF3F72836245100DB40D9 /* CommentsView.swift */; };
7572
67BD2D012AF7D21B00F44064 /* ParksManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67BD2D002AF7D21B00F44064 /* ParksManager.swift */; };
76-
67CB32D1297BE0F8009380DF /* NetworkStatus in Frameworks */ = {isa = PBXBuildFile; productRef = 67CB32D0297BE0F8009380DF /* NetworkStatus */; };
7773
67D322972AE993F90045B92F /* MapView991 in Frameworks */ = {isa = PBXBuildFile; productRef = 67D322962AE993F90045B92F /* MapView991 */; };
78-
67D67DE22AE84D9700F7A8B0 /* FileManager991 in Frameworks */ = {isa = PBXBuildFile; productRef = 67D67DE12AE84D9700F7A8B0 /* FileManager991 */; };
7974
67D67DE52AE8526600F7A8B0 /* SWDesignSystem in Frameworks */ = {isa = PBXBuildFile; productRef = 67D67DE42AE8526600F7A8B0 /* SWDesignSystem */; };
8075
67D916812838E2460098D3CB /* DialogsListScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67D916802838E2460098D3CB /* DialogsListScreen.swift */; };
8176
67D916862838F0DD0098D3CB /* DialogScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67D916852838F0DD0098D3CB /* DialogScreen.swift */; };
@@ -104,8 +99,6 @@
10499
67138D932974854F00BBF450 /* XCTestCase+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "XCTestCase+.swift"; sourceTree = "<group>"; };
105100
6718BCA32AD5327F002846A6 /* SnapshotHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SnapshotHelper.swift; path = fastlane/SnapshotHelper.swift; sourceTree = SOURCE_ROOT; };
106101
671D7DEB28210D2F0068E728 /* EmptyContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyContentView.swift; sourceTree = "<group>"; };
107-
6725E3542D4CB7300070B323 /* Date+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+.swift"; sourceTree = "<group>"; };
108-
6740233F2B0BC01600A7311A /* FeedbackSender.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbackSender.swift; sourceTree = "<group>"; };
109102
67419ACE282E70B9004F5339 /* ParksListScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParksListScreen.swift; sourceTree = "<group>"; };
110103
6747575528113419002F0A24 /* ChangePasswordScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangePasswordScreen.swift; sourceTree = "<group>"; };
111104
6747575828128603002F0A24 /* ParkDetailScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParkDetailScreen.swift; sourceTree = "<group>"; };
@@ -151,7 +144,6 @@
151144
6798AA75280BE8E200DB76F1 /* countries.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = countries.json; sourceTree = "<group>"; };
152145
6798AA77280BE8E200DB76F1 /* oldParks.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = oldParks.json; sourceTree = "<group>"; };
153146
6798AA83280C0F7D00DB76F1 /* EditProfileScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditProfileScreen.swift; sourceTree = "<group>"; };
154-
679F3B02296841DD00BB3590 /* URLOpener.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLOpener.swift; sourceTree = "<group>"; };
155147
67A079F12A758E7D005EAF70 /* PickedPhotoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PickedPhotoView.swift; sourceTree = "<group>"; };
156148
67A4710C2AEED8F8004D341D /* PastEventStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PastEventStorage.swift; sourceTree = "<group>"; };
157149
67A64A232AC83A0F00CBDD5F /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = "<group>"; };
@@ -189,12 +181,10 @@
189181
67795FB22D1C05D90087132F /* SWModels in Frameworks */,
190182
67D67DE52AE8526600F7A8B0 /* SWDesignSystem in Frameworks */,
191183
67D322972AE993F90045B92F /* MapView991 in Frameworks */,
192-
67D67DE22AE84D9700F7A8B0 /* FileManager991 in Frameworks */,
193184
67795FB42D1C05D90087132F /* SWNetworkClient in Frameworks */,
194185
67F9534F2964A5700077DFDC /* ImagePicker in Frameworks */,
195186
67A85EDE2D4802C600DCFBBD /* SWAlert in Frameworks */,
196187
67795FB62D1C05D90087132F /* Utils in Frameworks */,
197-
67CB32D1297BE0F8009380DF /* NetworkStatus in Frameworks */,
198188
);
199189
runOnlyForDeploymentPostprocessing = 0;
200190
};
@@ -289,7 +279,6 @@
289279
674DF03F2B11257D00828016 /* NavigationLink+.swift */,
290280
6765B2552D451771006164AB /* UIImage+toMediaFile.swift */,
291281
676D5A602D48BF0700EE5E9E /* String+localized.swift */,
292-
6725E3542D4CB7300070B323 /* Date+.swift */,
293282
);
294283
path = Extensions;
295284
sourceTree = "<group>";
@@ -396,11 +385,9 @@
396385
isa = PBXGroup;
397386
children = (
398387
67B78711281D654C008B104F /* DefaultsService.swift */,
399-
679F3B02296841DD00BB3590 /* URLOpener.swift */,
400388
67551C352AEC338600084A35 /* SWAddress.swift */,
401389
67A4710C2AEED8F8004D341D /* PastEventStorage.swift */,
402390
67BD2D002AF7D21B00F44064 /* ParksManager.swift */,
403-
6740233F2B0BC01600A7311A /* FeedbackSender.swift */,
404391
);
405392
path = Services;
406393
sourceTree = "<group>";
@@ -511,8 +498,6 @@
511498
name = "SwiftUI-WorkoutApp";
512499
packageProductDependencies = (
513500
67F9534E2964A5700077DFDC /* ImagePicker */,
514-
67CB32D0297BE0F8009380DF /* NetworkStatus */,
515-
67D67DE12AE84D9700F7A8B0 /* FileManager991 */,
516501
67D67DE42AE8526600F7A8B0 /* SWDesignSystem */,
517502
67D322962AE993F90045B92F /* MapView991 */,
518503
67795FB12D1C05D90087132F /* SWModels */,
@@ -555,8 +540,6 @@
555540
mainGroup = 6798AA31280AEDC900DB76F1;
556541
packageReferences = (
557542
67F9534D2964A5700077DFDC /* XCRemoteSwiftPackageReference "ImagePicker" */,
558-
67CB32CF297BE0F8009380DF /* XCRemoteSwiftPackageReference "NetworkStatus" */,
559-
67D67DE02AE84D9700F7A8B0 /* XCRemoteSwiftPackageReference "FileManager991" */,
560543
67D67DE32AE8526600F7A8B0 /* XCRemoteSwiftPackageReference "SWDesignSystem" */,
561544
67D322952AE993F90045B92F /* XCRemoteSwiftPackageReference "MapView991" */,
562545
);
@@ -610,23 +593,20 @@
610593
isa = PBXSourcesBuildPhase;
611594
buildActionMask = 2147483647;
612595
files = (
613-
674023402B0BC01600A7311A /* FeedbackSender.swift in Sources */,
614596
674D31592D44103300A2EFE8 /* UserFlagsEnvironmentKey.swift in Sources */,
615597
67A9C90828427DEA005D6A36 /* ParkFilterScreen.swift in Sources */,
616598
6758463F2965B7F2000BA5E0 /* PDFViewRepresentable.swift in Sources */,
617599
67BAF3F428361BC400DB40D9 /* PhotoSectionView.swift in Sources */,
618600
67BAF3F82836245100DB40D9 /* CommentsView.swift in Sources */,
619601
67A079F22A758E7D005EAF70 /* PickedPhotoView.swift in Sources */,
620602
6798AA66280B232F00DB76F1 /* IncognitoProfileView.swift in Sources */,
621-
679F3B03296841DD00BB3590 /* URLOpener.swift in Sources */,
622603
67BAF3F6283620ED00DB40D9 /* ParkLocationInfoView.swift in Sources */,
623604
67627755283A4C77009C203F /* JournalEntriesScreen.swift in Sources */,
624605
674E704E2B24D382008AE9D0 /* LoggerScreen.swift in Sources */,
625606
67B78716281D8006008B104F /* ParksMapScreen+ViewModel.swift in Sources */,
626607
671D7DEC28210D2F0068E728 /* EmptyContentView.swift in Sources */,
627608
6773111A2965FFAA003CD13A /* PreviewContent.swift in Sources */,
628609
67551C362AEC338600084A35 /* SWAddress.swift in Sources */,
629-
6725E3552D4CB7300070B323 /* Date+.swift in Sources */,
630610
6798AA59280AF4B100DB76F1 /* ParksMapScreen.swift in Sources */,
631611
6798AA68280B23B700DB76F1 /* UserDetailsScreen.swift in Sources */,
632612
67AE072A2D1B1E3B0097B59F /* NetworkStatusEnvironmentKey.swift in Sources */,
@@ -988,14 +968,6 @@
988968
/* End XCConfigurationList section */
989969

990970
/* Begin XCRemoteSwiftPackageReference section */
991-
67CB32CF297BE0F8009380DF /* XCRemoteSwiftPackageReference "NetworkStatus" */ = {
992-
isa = XCRemoteSwiftPackageReference;
993-
repositoryURL = "https://github.com/OlegEremenko991/NetworkStatus";
994-
requirement = {
995-
kind = upToNextMajorVersion;
996-
minimumVersion = 1.1.0;
997-
};
998-
};
999971
67D322952AE993F90045B92F /* XCRemoteSwiftPackageReference "MapView991" */ = {
1000972
isa = XCRemoteSwiftPackageReference;
1001973
repositoryURL = "https://github.com/OlegEremenko991/MapView991";
@@ -1004,14 +976,6 @@
1004976
minimumVersion = 1.0.0;
1005977
};
1006978
};
1007-
67D67DE02AE84D9700F7A8B0 /* XCRemoteSwiftPackageReference "FileManager991" */ = {
1008-
isa = XCRemoteSwiftPackageReference;
1009-
repositoryURL = "https://github.com/OlegEremenko991/FileManager991";
1010-
requirement = {
1011-
kind = upToNextMajorVersion;
1012-
minimumVersion = 1.0.0;
1013-
};
1014-
};
1015979
67D67DE32AE8526600F7A8B0 /* XCRemoteSwiftPackageReference "SWDesignSystem" */ = {
1016980
isa = XCRemoteSwiftPackageReference;
1017981
repositoryURL = "https://github.com/OlegEremenko991/SWDesignSystem";
@@ -1047,21 +1011,11 @@
10471011
isa = XCSwiftPackageProductDependency;
10481012
productName = SWAlert;
10491013
};
1050-
67CB32D0297BE0F8009380DF /* NetworkStatus */ = {
1051-
isa = XCSwiftPackageProductDependency;
1052-
package = 67CB32CF297BE0F8009380DF /* XCRemoteSwiftPackageReference "NetworkStatus" */;
1053-
productName = NetworkStatus;
1054-
};
10551014
67D322962AE993F90045B92F /* MapView991 */ = {
10561015
isa = XCSwiftPackageProductDependency;
10571016
package = 67D322952AE993F90045B92F /* XCRemoteSwiftPackageReference "MapView991" */;
10581017
productName = MapView991;
10591018
};
1060-
67D67DE12AE84D9700F7A8B0 /* FileManager991 */ = {
1061-
isa = XCSwiftPackageProductDependency;
1062-
package = 67D67DE02AE84D9700F7A8B0 /* XCRemoteSwiftPackageReference "FileManager991" */;
1063-
productName = FileManager991;
1064-
};
10651019
67D67DE42AE8526600F7A8B0 /* SWDesignSystem */ = {
10661020
isa = XCSwiftPackageProductDependency;
10671021
package = 67D67DE32AE8526600F7A8B0 /* XCRemoteSwiftPackageReference "SWDesignSystem" */;

SwiftUI-WorkoutApp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved

Lines changed: 0 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

SwiftUI-WorkoutApp/Services/FeedbackSender.swift renamed to SwiftUI-WorkoutApp/Libraries/Utils/Sources/Utils/FeedbackSender.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
import Foundation
22

3-
enum FeedbackSender {
3+
public enum FeedbackSender {
44
/// Открывает диплинк `mailto` для создания письма
55
/// - Parameters:
66
/// - subject: Тема письма
77
/// - messageBody: Тело письма
88
/// - recipients: Получатели
99
@MainActor
10-
static func sendFeedback(subject: String, messageBody: String, recipients: [String]) {
10+
public static func sendFeedback(
11+
subject: String,
12+
messageBody: String,
13+
recipients: [String]
14+
) {
1115
let encodedSubject = subject.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) ?? "Feedback"
1216
let encodedBody = messageBody.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) ?? ""
1317
if let firstRecipient = recipients.first {
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import Foundation
2+
import Network
3+
4+
public final class NetworkStatus: ObservableObject {
5+
private let monitor = NWPathMonitor()
6+
private let queue = DispatchQueue.global(qos: .background)
7+
8+
/// `true` - there is a network connection, `false` - no network connection
9+
@Published public private(set) var isConnected = false
10+
11+
public init() {
12+
monitor.pathUpdateHandler = { path in
13+
Task { @MainActor in
14+
self.isConnected = path.status == .satisfied
15+
}
16+
}
17+
monitor.start(queue: queue)
18+
}
19+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import Foundation
2+
3+
/// Обертка над `FileManager`
4+
public struct SWFileManager {
5+
private var documentDirectoryURL: URL {
6+
FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
7+
}
8+
9+
private let fileName: String
10+
11+
/// Инициализатор
12+
/// - Parameter fileName: Название файла с расширением, например `MyFile.json`
13+
public init(fileName: String) {
14+
self.fileName = fileName
15+
}
16+
17+
/// Проверяет существование сохраненного файла
18+
public var documentExists: Bool {
19+
let path: String = if #available(iOS 16.0, *) {
20+
documentDirectoryURL.appendingPathComponent(fileName).path()
21+
} else {
22+
documentDirectoryURL.appendingPathComponent(fileName).path
23+
}
24+
return FileManager().fileExists(atPath: path)
25+
}
26+
27+
/// Сохраняет `Encodable`-объект
28+
public func save(_ object: some Encodable) throws {
29+
let encodedData = try JSONEncoder().encode(object)
30+
let jsonString = String(decoding: encodedData, as: UTF8.self)
31+
let url = documentDirectoryURL.appendingPathComponent(fileName)
32+
try jsonString.write(to: url, atomically: true, encoding: .utf8)
33+
}
34+
35+
/// Загружает данные из ранее сохраненного файла
36+
public func get<T: Decodable>() throws -> T {
37+
let url = documentDirectoryURL.appendingPathComponent(fileName)
38+
let data = try Data(contentsOf: url)
39+
return try JSONDecoder().decode(T.self, from: data)
40+
}
41+
42+
/// Удаляет сохраненный файл
43+
///
44+
/// Если файл не существовал перед удалением, выбросит ошибку
45+
public func removeFile() throws {
46+
try FileManager.default.removeItem(at: documentDirectoryURL.appendingPathComponent(fileName))
47+
}
48+
}

SwiftUI-WorkoutApp/Services/URLOpener.swift renamed to SwiftUI-WorkoutApp/Libraries/Utils/Sources/Utils/URLOpener.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import UIKit
1+
import UIKit.UIApplication
22

3-
enum URLOpener {
3+
public enum URLOpener {
44
@MainActor
5-
static func open(_ url: URL?) {
5+
public static func open(_ url: URL?) {
66
if let url, UIApplication.shared.canOpenURL(url) {
77
UIApplication.shared.open(url)
88
}

0 commit comments

Comments
 (0)