Skip to content
This repository was archived by the owner on Jun 12, 2025. It is now read-only.

Commit 83ee079

Browse files
authored
Merge pull request #3 from easydev991/feature/updates
Доработки дизайн-системы
2 parents 553df13 + e94a81b commit 83ee079

File tree

7 files changed

+236
-12
lines changed

7 files changed

+236
-12
lines changed

Package.resolved

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

Package.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@ import PackageDescription
55

66
let package = Package(
77
name: "SWDesignSystem",
8+
defaultLocalization: "ru",
89
platforms: [.iOS(.v15)],
910
products: [
1011
.library(name: "SWDesignSystem", targets: ["SWDesignSystem"])
1112
],
1213
dependencies: [
13-
.package(url: "https://github.com/OlegEremenko991/CachedAsyncImage991", from: "1.2.0")
14+
.package(url: "https://github.com/OlegEremenko991/CachedAsyncImage991", from: "1.3.0")
1415
],
1516
targets: [
1617
.target(
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import Foundation
2+
import SwiftUI
3+
4+
struct LoadingEnvironmentKey: EnvironmentKey {
5+
static let defaultValue = false
6+
}
7+
8+
extension EnvironmentValues {
9+
/// `true` - находимся в состоянии загрузки, `false` - обычное состояние
10+
var isLoading: Bool {
11+
get { self[LoadingEnvironmentKey.self] }
12+
set { self[LoadingEnvironmentKey.self] = newValue }
13+
}
14+
}

Sources/SWDesignSystem/Internal/LoadingOverlayModifier.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ struct LoadingOverlayModifier: ViewModifier {
66
func body(content: Content) -> some View {
77
ZStack {
88
content
9+
.environment(\.isLoading, isLoading)
910
.opacity(isLoading ? 0.5 : 1)
1011
.disabled(isLoading)
1112
if isLoading {
Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
{
2+
"sourceLanguage" : "en",
3+
"strings" : {
4+
"" : {
5+
6+
},
7+
"Выбери город" : {
8+
"localizations" : {
9+
"en" : {
10+
"stringUnit" : {
11+
"state" : "translated",
12+
"value" : "Select a city"
13+
}
14+
},
15+
"ru" : {
16+
"stringUnit" : {
17+
"state" : "translated",
18+
"value" : "Выбери город"
19+
}
20+
}
21+
}
22+
},
23+
"Выбери страну" : {
24+
"localizations" : {
25+
"en" : {
26+
"stringUnit" : {
27+
"state" : "translated",
28+
"value" : "Select a country"
29+
}
30+
},
31+
"ru" : {
32+
"stringUnit" : {
33+
"state" : "translated",
34+
"value" : "Выбери страну"
35+
}
36+
}
37+
}
38+
},
39+
"Добавить" : {
40+
"comment" : "Принять заявку на добавление в друзья",
41+
"localizations" : {
42+
"en" : {
43+
"stringUnit" : {
44+
"state" : "translated",
45+
"value" : "Accept"
46+
}
47+
},
48+
"ru" : {
49+
"stringUnit" : {
50+
"state" : "translated",
51+
"value" : "Добавить"
52+
}
53+
}
54+
}
55+
},
56+
"Загрузка..." : {
57+
"extractionState" : "manual",
58+
"localizations" : {
59+
"en" : {
60+
"stringUnit" : {
61+
"state" : "translated",
62+
"value" : "Loading…"
63+
}
64+
},
65+
"ru" : {
66+
"stringUnit" : {
67+
"state" : "translated",
68+
"value" : "Загрузка..."
69+
}
70+
}
71+
}
72+
},
73+
"Закрыть" : {
74+
"localizations" : {
75+
"en" : {
76+
"stringUnit" : {
77+
"state" : "translated",
78+
"value" : "Close"
79+
}
80+
},
81+
"ru" : {
82+
"stringUnit" : {
83+
"state" : "translated",
84+
"value" : "Закрыть"
85+
}
86+
}
87+
}
88+
},
89+
"Изменить" : {
90+
"localizations" : {
91+
"en" : {
92+
"stringUnit" : {
93+
"state" : "translated",
94+
"value" : "Edit"
95+
}
96+
},
97+
"ru" : {
98+
"stringUnit" : {
99+
"state" : "translated",
100+
"value" : "Изменить"
101+
}
102+
}
103+
}
104+
},
105+
"Настроить" : {
106+
"localizations" : {
107+
"en" : {
108+
"stringUnit" : {
109+
"state" : "translated",
110+
"value" : "Configure"
111+
}
112+
},
113+
"ru" : {
114+
"stringUnit" : {
115+
"state" : "translated",
116+
"value" : "Настроить"
117+
}
118+
}
119+
}
120+
},
121+
"Отклонить" : {
122+
"localizations" : {
123+
"en" : {
124+
"stringUnit" : {
125+
"state" : "translated",
126+
"value" : "Decline"
127+
}
128+
},
129+
"ru" : {
130+
"stringUnit" : {
131+
"state" : "translated",
132+
"value" : "Отклонить"
133+
}
134+
}
135+
}
136+
},
137+
"Пожаловаться" : {
138+
"localizations" : {
139+
"en" : {
140+
"stringUnit" : {
141+
"state" : "translated",
142+
"value" : "Report"
143+
}
144+
},
145+
"ru" : {
146+
"stringUnit" : {
147+
"state" : "translated",
148+
"value" : "Пожаловаться"
149+
}
150+
}
151+
}
152+
},
153+
"Поиск" : {
154+
"localizations" : {
155+
"en" : {
156+
"stringUnit" : {
157+
"state" : "translated",
158+
"value" : "Search"
159+
}
160+
},
161+
"ru" : {
162+
"stringUnit" : {
163+
"state" : "translated",
164+
"value" : "Поиск"
165+
}
166+
}
167+
}
168+
},
169+
"Удалить" : {
170+
"localizations" : {
171+
"en" : {
172+
"stringUnit" : {
173+
"state" : "translated",
174+
"value" : "Delete"
175+
}
176+
},
177+
"ru" : {
178+
"stringUnit" : {
179+
"state" : "translated",
180+
"value" : "Удалить"
181+
}
182+
}
183+
}
184+
}
185+
},
186+
"version" : "1.0"
187+
}

Sources/SWDesignSystem/Public/ProfileView.swift

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import SwiftUI
44
///
55
/// Фото, пол, возраст, страна и город
66
public struct ProfileView: View {
7+
@Environment(\.isLoading) private var isLoading
78
private let imageURL: URL?
89
private let login: String
910
private let genderWithAge: String
@@ -41,23 +42,24 @@ public struct ProfileView: View {
4142
HStack(spacing: 8) {
4243
Icons.Regular.person.view
4344
.symbolVariant(.circle)
44-
Text(genderWithAge)
45+
Text(isLoading ? "Загрузка..." : genderWithAge)
4546
}
4647
HStack(spacing: 8) {
4748
Icons.Regular.location.view
4849
.symbolVariant(.circle)
49-
Text(countryAndCity)
50+
Text(isLoading ? "Загрузка..." : countryAndCity)
5051
.lineLimit(2)
5152
}
5253
}
54+
.redacted(reason: isLoading ? .placeholder : [])
5355
.foregroundStyle(Color.swSmallElements)
5456
}
5557
}
5658
}
5759
}
5860

5961
#if DEBUG
60-
#Preview {
62+
#Preview("Обычное состояние") {
6163
ProfileView(
6264
imageURL: nil,
6365
login: "Beautifulbutterfly101",
@@ -66,4 +68,15 @@ public struct ProfileView: View {
6668
)
6769
.padding(.horizontal, 40)
6870
}
71+
72+
#Preview("Состояние загрузки") {
73+
ProfileView(
74+
imageURL: nil,
75+
login: "Beautifulbutterfly101",
76+
genderWithAge: "Женщина, 30 лет",
77+
countryAndCity: "Россия, Краснодар"
78+
)
79+
.padding(.horizontal, 40)
80+
.loadingOverlay(if: true)
81+
}
6982
#endif

Sources/SWDesignSystem/Public/SWImagePicker.swift

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,25 @@ import SwiftUI
22

33
/// Пикер для одной фотографии с возможностью обрезки
44
public struct SWImagePicker: UIViewControllerRepresentable {
5-
let completion: (UIImage) -> Void
5+
private let sourceType: UIImagePickerController.SourceType
6+
private let completion: (UIImage) -> Void
67
@Environment(\.dismiss) private var dismiss
7-
8+
89
/// Инициализатор
9-
/// - Parameter completion: Возвращает выбранную фотографию
10-
public init(completion: @escaping (UIImage) -> Void) {
10+
/// - Parameters:
11+
/// - sourceType: Тип источника для пикера, по умолчанию галерея фото
12+
/// - completion: Возвращает выбранную фотографию
13+
public init(
14+
sourceType: UIImagePickerController.SourceType = .photoLibrary,
15+
completion: @escaping (UIImage) -> Void
16+
) {
17+
self.sourceType = sourceType
1118
self.completion = completion
1219
}
1320

1421
public func makeUIViewController(context: Context) -> UIImagePickerController {
1522
let picker = UIImagePickerController()
16-
picker.sourceType = .photoLibrary
23+
picker.sourceType = sourceType
1724
picker.allowsEditing = true
1825
picker.delegate = context.coordinator
1926
return picker

0 commit comments

Comments
 (0)