Skip to content

Commit b2618e5

Browse files
authored
Feature/improvement profile/main (#72)
* Feature/improvement profile/my profile view (#69) * feat: delete existing view * feat: delete myprofileview navigation * fix: DI * fix: DI * feat: present profileview * feat: pass binding * feat: draggable profile view * Feature/improvement profile/view UI (#70) * feat * feat * feat * feat * feat * feat * chore * Feature/improvement profile/view UI (#71) * feat * feat * feat * feat * feat * feat * chore * feat * feat * feat * feat: friend loading * chore * feat: FullScreenImageView * feat: binding url * feat * delete friend profile view * feat * feat * feat: navigation * chore * chore * chore * chore * feat: MyProfileEditView * feat: DI * feat: viewModel * feat: BackgroundImageView * feat: refactor name * feat: DI * feat: PhotosPicker * feat: delete legacy * feat: init background image * feat: update background photo * feat: add cancel button * feat: configure user image * feat: profile image view * chore * feat: WhiteUnderlineTextLabel * feat: displaying display name * feat: ProfileTextInputView * feat: focus * feat: edit profile * chore: update fastlane * feat: change ui * fix: animation * fix: animation * fix: animation * fix: animation * feat: present fullscreen image on friend profile * feat: fetch link * feat: ui * feat: MakeStringFromURLUsecase * feat: delete background image * feat: delete photo * chore * feat: update profile * chore * chore * fix test * Feature/improvement profile/button (#73) * myview * fix: friend list * chore
1 parent dfd32d8 commit b2618e5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+1636
-553
lines changed

Gemfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22

33
source "https://rubygems.org"
44

5-
gem "fastlane", "~>2.221.0"
5+
gem "fastlane", "~>2.222.0"
66
# TODO: update ruby version

Gemfile.lock

+15-15
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,20 @@ GEM
1010
artifactory (3.0.17)
1111
atomos (0.1.3)
1212
aws-eventstream (1.3.0)
13-
aws-partitions (1.947.0)
14-
aws-sdk-core (3.199.0)
13+
aws-partitions (1.961.0)
14+
aws-sdk-core (3.201.3)
1515
aws-eventstream (~> 1, >= 1.3.0)
1616
aws-partitions (~> 1, >= 1.651.0)
1717
aws-sigv4 (~> 1.8)
1818
jmespath (~> 1, >= 1.6.1)
19-
aws-sdk-kms (1.87.0)
20-
aws-sdk-core (~> 3, >= 3.199.0)
21-
aws-sigv4 (~> 1.1)
22-
aws-sdk-s3 (1.154.0)
23-
aws-sdk-core (~> 3, >= 3.199.0)
19+
aws-sdk-kms (1.88.0)
20+
aws-sdk-core (~> 3, >= 3.201.0)
21+
aws-sigv4 (~> 1.5)
22+
aws-sdk-s3 (1.157.0)
23+
aws-sdk-core (~> 3, >= 3.201.0)
2424
aws-sdk-kms (~> 1)
25-
aws-sigv4 (~> 1.8)
26-
aws-sigv4 (1.8.0)
25+
aws-sigv4 (~> 1.5)
26+
aws-sigv4 (1.9.1)
2727
aws-eventstream (~> 1, >= 1.0.2)
2828
babosa (1.0.4)
2929
base64 (0.2.0)
@@ -38,7 +38,7 @@ GEM
3838
domain_name (0.6.20240107)
3939
dotenv (2.8.1)
4040
emoji_regex (3.2.3)
41-
excon (0.110.0)
41+
excon (0.111.0)
4242
faraday (1.10.3)
4343
faraday-em_http (~> 1.0)
4444
faraday-em_synchrony (~> 1.0)
@@ -60,15 +60,15 @@ GEM
6060
faraday-httpclient (1.0.1)
6161
faraday-multipart (1.0.4)
6262
multipart-post (~> 2)
63-
faraday-net_http (1.0.1)
63+
faraday-net_http (1.0.2)
6464
faraday-net_http_persistent (1.2.0)
6565
faraday-patron (1.0.0)
6666
faraday-rack (1.0.0)
6767
faraday-retry (1.0.3)
6868
faraday_middleware (1.2.0)
6969
faraday (~> 1.0)
7070
fastimage (2.3.1)
71-
fastlane (2.221.1)
71+
fastlane (2.222.0)
7272
CFPropertyList (>= 2.3, < 4.0.0)
7373
addressable (>= 2.8, < 3.0.0)
7474
artifactory (~> 3.0)
@@ -154,7 +154,7 @@ GEM
154154
json (2.7.2)
155155
jwt (2.8.2)
156156
base64
157-
mini_magick (4.13.1)
157+
mini_magick (4.13.2)
158158
mini_mime (1.1.5)
159159
multi_json (1.15.0)
160160
multipart-post (2.4.1)
@@ -164,7 +164,7 @@ GEM
164164
optparse (0.5.0)
165165
os (1.1.4)
166166
plist (3.7.1)
167-
public_suffix (6.0.0)
167+
public_suffix (6.0.1)
168168
rake (13.2.1)
169169
representable (3.2.0)
170170
declarative (< 0.1.0)
@@ -214,7 +214,7 @@ PLATFORMS
214214
ruby
215215

216216
DEPENDENCIES
217-
fastlane (~> 2.221.0)
217+
fastlane (~> 2.222.0)
218218

219219
BUNDLED WITH
220220
2.5.9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//
2+
// MakeStringFromURLUsecaseTests.swift
3+
// AppTests
4+
//
5+
// Created by 신동규 on 8/3/24.
6+
//
7+
8+
import XCTest
9+
import Domain
10+
11+
final class MakeStringFromURLUsecaseTests: XCTestCase {
12+
13+
let usecase = MakeStringFromURLUsecase()
14+
15+
func testHttps() {
16+
let url = URL(string: "https://www.naver.com")!
17+
XCTAssertEqual("www.naver.com", usecase.implement(url: url))
18+
}
19+
20+
func testHttp() {
21+
let url = URL(string: "http://www.naver.com")!
22+
XCTAssertEqual("www.naver.com", usecase.implement(url: url))
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
//
2+
// MakeURLFromStringUsecaseTests.swift
3+
// AppTests
4+
//
5+
// Created by 신동규 on 8/3/24.
6+
//
7+
8+
import XCTest
9+
import Domain
10+
11+
final class MakeURLFromStringUsecaseTests: XCTestCase {
12+
13+
let usecase = MakeURLFromStringUsecase()
14+
15+
func testWithoutPrefix() {
16+
XCTAssertNotNil(usecase.implement(link: "www.naver.com"))
17+
}
18+
19+
func testWithPrefix() {
20+
XCTAssertNotNil(usecase.implement(link: "https://www.naver.com"))
21+
XCTAssertNotNil(usecase.implement(link: "http://www.naver.com"))
22+
}
23+
24+
func testEmpty() {
25+
XCTAssertNil(usecase.implement(link: ""))
26+
}
27+
28+
func testFail() {
29+
XCTAssertNil(usecase.implement(link: " "))
30+
}
31+
}

dg-muscle-ios/sources/App/DI/HistoryAssembly.swift

+17
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,23 @@ import Presentation
1414
public struct HistoryAssembly: Assembly {
1515

1616
public func assemble(container: Swinject.Container) {
17+
18+
container.register(HistoryListView.self) { (resolver, today: Date) in
19+
20+
let historyRepository = resolver.resolve(HistoryRepository.self)!
21+
let exerciseRepository = resolver.resolve(ExerciseRepository.self)!
22+
let heatMapRepository = resolver.resolve(HeatMapRepository.self)!
23+
let userRepository = resolver.resolve(UserRepository.self)!
24+
25+
return HistoryListView(
26+
today: today,
27+
historyRepository: historyRepository,
28+
exerciseRepository: exerciseRepository,
29+
heatMapRepository: heatMapRepository,
30+
userRepository: userRepository
31+
)
32+
}
33+
1734
container.register(HeatMapColorSelectView.self) { resolver in
1835
let userRepository = resolver.resolve(UserRepository.self)!
1936
return HeatMapColorSelectView(userRepository: userRepository)

dg-muscle-ios/sources/App/DI/HomeAssembly.swift

+5-11
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,18 @@ import Swinject
99
import Domain
1010
import Presentation
1111
import Foundation
12+
import My
13+
import History
1214

1315
public struct HomeAssembly: Assembly {
1416
public func assemble(container: Swinject.Container) {
1517
container.register(HomeView.self) { (resolver, today: Date) in
1618

17-
let historyRepository = resolver.resolve(HistoryRepository.self)!
18-
let exerciseRepository = resolver.resolve(ExerciseRepository.self)!
19-
let heatMapRepository = resolver.resolve(HeatMapRepository.self)!
20-
let userRepository = resolver.resolve(UserRepository.self)!
21-
let logRepository = resolver.resolve(LogRepository.self)!
22-
2319
return HomeView(
2420
today: today,
25-
historyRepository: historyRepository,
26-
exerciseRepository: exerciseRepository,
27-
heatMapRepository: heatMapRepository,
28-
userRepository: userRepository,
29-
logRepository: logRepository
21+
historyListFactory: { today in resolver.resolve(HistoryListView.self, argument: today)! },
22+
myViewFactory: { presentProfileAction in resolver.resolve(MyView.self, argument: presentProfileAction)! },
23+
myProfileViewFactory: { shows in resolver.resolve(MyProfileView.self, argument: shows)! }
3024
)
3125
}
3226
}

dg-muscle-ios/sources/App/DI/MainAssembly.swift

-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ public struct MainAssembly: Assembly {
3737
setDurationFactory: { duration in resolver.resolve(SetDurationView.self, argument: duration)! },
3838
manageMemoFactory: { memo in resolver.resolve(ManageMemoView.self, argument: memo)! },
3939
dateToSelectHistoryFactory: { resolver.resolve(DateToSelectHistoryView.self)! },
40-
myProfileFactory: { resolver.resolve(MyProfileView.self)! },
4140
deleteAccountConfirmFactory: { resolver.resolve(DeleteAccountConfirmView.self)! },
4241
logsFactory: { resolver.resolve(LogsView.self)! },
4342
friendMainFactory: { anchor in resolver.resolve(FriendMainView.self, argument: anchor)! },

dg-muscle-ios/sources/App/DI/MyAssembly.swift

+27-10
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,45 @@ import Swinject
99
import Domain
1010
import Presentation
1111
import My
12+
import SwiftUI
1213

1314
public struct MyAssembly: Assembly {
1415
public func assemble(container: Swinject.Container) {
15-
container.register(MyProfileView.self) { resolver in
16-
16+
container.register(MyView.self) { (resolver, presentProfileViewAction: (() -> Void)?) in
17+
1718
let userRepository = resolver.resolve(UserRepository.self)!
18-
19-
return MyProfileView(userRepository: userRepository)
19+
let logRepository = resolver.resolve(LogRepository.self)!
20+
21+
return MyView(
22+
userRepository: userRepository,
23+
logRepository: logRepository,
24+
presentProfileViewAction: presentProfileViewAction
25+
)
2026
}
21-
27+
28+
container.register(MyProfileView.self) { (resolver, shows: Binding<Bool>) in
29+
let userRepository = resolver.resolve(UserRepository.self)!
30+
return MyProfileView(
31+
shows: shows,
32+
userRepository: userRepository,
33+
myProfileEditFactory: { isEditing in
34+
MyProfileEditView(userRepository: userRepository, isEditing: isEditing)
35+
}
36+
)
37+
}
38+
2239
container.register(DeleteAccountConfirmView.self) { resolver in
23-
40+
2441
let userRepository = resolver.resolve(UserRepository.self)!
25-
42+
2643
return DeleteAccountConfirmView(userRepository: userRepository)
2744
}
28-
45+
2946
container.register(LogsView.self) { resolver in
30-
47+
3148
let logRepository = resolver.resolve(LogRepository.self)!
3249
let friendRepository = resolver.resolve(FriendRepository.self)!
33-
50+
3451
return LogsView(
3552
logRepository: logRepository,
3653
friendRepository: friendRepository

dg-muscle-ios/sources/App/Delegate/SceneDelegate.swift

-2
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,6 @@ class SceneDelegate: NSObject, UIWindowSceneDelegate {
7272
case "friendhistory":
7373
guard let friendId = URLManager.shared.getParameter(url: url, name: "id") else { return }
7474
coordinator?.friend.friendHistory(friendId: friendId)
75-
case "profile":
76-
coordinator?.my.profile()
7775
case "exercisemanage":
7876
coordinator?.exercise.exerciseManage()
7977
case "heatmapcolorselect":

dg-muscle-ios/sources/DataLayer/Friend/Repository/FriendRepositoryImpl.swift

+6-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ import Combine
1212
public final class FriendRepositoryImpl: FriendRepository {
1313
public static let shared = FriendRepositoryImpl()
1414

15+
public var loading: AnyPublisher<Bool, Never> { $_loading.eraseToAnyPublisher() }
16+
@Published var _loading: Bool = true
17+
1518
public var friends: AnyPublisher<[Domain.User], Never> { $_friends.eraseToAnyPublisher() }
1619
@Published var _friends: [Domain.User] = []
1720

@@ -142,12 +145,14 @@ public final class FriendRepositoryImpl: FriendRepository {
142145

143146
self._friends = friends
144147
self._requests = requests
148+
self._loading = false
145149

146150
let friendIds = friends.map({ $0.uid })
147151

148152
for id in friendIds {
149153
Task {
150-
try? await getHistories(friendId: id)
154+
let _ = try? await getHistories(friendId: id)
155+
let _ = try? await getExercises(friendId: id)
151156
}
152157
}
153158
}

dg-muscle-ios/sources/DataLayer/Rapid/Repository/RapidRepositoryImpl.swift

+4-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,10 @@ public final class RapidRepositoryImpl: RapidRepository {
3838
logRepository: LogRepositoryImpl.shared,
3939
userRepository: UserRepositoryImpl.shared
4040
)
41-
.implement(message: error.localizedDescription, category: .error)
41+
.implement(message: """
42+
location is RapidRepositoryImpl
43+
\(error.localizedDescription)
44+
""", category: .error)
4245
}
4346
_exercisesLoading = false
4447
}

dg-muscle-ios/sources/Domain/Friend/Repository/FriendRepository.swift

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import Foundation
99
import Combine
1010

1111
public protocol FriendRepository {
12+
var loading: AnyPublisher<Bool, Never> { get }
1213
var friends: AnyPublisher<[User], Never> { get }
1314
var requests: AnyPublisher<[FriendRequest], Never> { get }
1415
var users: AnyPublisher<[User], Never> { get }

dg-muscle-ios/sources/Domain/Friend/Usecase/SearchUsersExceptForMyFriendsUsecase.swift

+1-2
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,12 @@ public final class SearchUsersExceptForMyFriendsUsecase {
4545

4646
users = users
4747
.filter({ !excludeIds.contains($0.uid) })
48-
.filter({ $0.displayName?.isEmpty == false })
4948
.sorted(by: { user1, user2 in
5049
if user1.photoURL != nil && user2.photoURL == nil {
5150
return true
5251
}
5352

54-
if user1.displayName != nil && user2.displayName == nil {
53+
if (user1.displayName?.isEmpty == false) && (user2.displayName?.isEmpty != false) {
5554
return true
5655
}
5756

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//
2+
// SubscribeFetchingFriendLoadingUsecase.swift
3+
// Domain
4+
//
5+
// Created by 신동규 on 7/29/24.
6+
//
7+
8+
import Foundation
9+
import Combine
10+
11+
public final class SubscribeFetchingFriendLoadingUsecase {
12+
let friendRepository: FriendRepository
13+
14+
public init(friendRepository: FriendRepository) {
15+
self.friendRepository = friendRepository
16+
}
17+
18+
public func implement() -> AnyPublisher<Bool, Never> {
19+
friendRepository.loading
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//
2+
// MakeStringFromURLUsecase.swift
3+
// Domain
4+
//
5+
// Created by 신동규 on 8/3/24.
6+
//
7+
8+
import Foundation
9+
10+
public final class MakeStringFromURLUsecase {
11+
public init() { }
12+
13+
public func implement(url: URL) -> String {
14+
var result: String = url.absoluteString
15+
16+
let http = "http://"
17+
let https = "https://"
18+
19+
var prefix: String?
20+
21+
if result.hasPrefix(http) {
22+
prefix = http
23+
}
24+
25+
if result.hasPrefix(https) {
26+
prefix = https
27+
}
28+
29+
if let prefix {
30+
result.removeFirst(prefix.count)
31+
}
32+
33+
return result
34+
}
35+
}

0 commit comments

Comments
 (0)