Skip to content

Commit e0a900a

Browse files
AmanKumar225gmagpayo
authored andcommitted
Revert "Create an album stage 2 - Naming logic"
1 parent 1448413 commit e0a900a

File tree

12 files changed

+55
-157
lines changed

12 files changed

+55
-157
lines changed

MEGAUnitTests/Album/AlbumListViewModelTests.swift

Lines changed: 4 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ final class AlbumListViewModelTests: XCTestCase {
1313
let rawAlbum = AlbumEntity(id: 3, name: "", coverNode: NodeEntity(handle: 2), count: 1, type: .raw)
1414
let userAlbum = AlbumEntity(id: 3, name: "Custom Name", coverNode: NodeEntity(handle: 3), count: 1, type: .user)
1515
let useCase = MockAlbumListUseCase(albums: [favouriteAlbum, gifAlbum, rawAlbum, userAlbum])
16-
let sut = AlbumListViewModel(usecase: useCase, alertViewModel: alertViewModel())
16+
let sut = AlbumListViewModel(usecase: useCase)
1717

1818
let exp = expectation(description: "albums titles are updated when retrieved")
1919
sut.$albums
@@ -33,7 +33,7 @@ final class AlbumListViewModelTests: XCTestCase {
3333
}
3434

3535
func testLoadAlbums_onAlbumsLoadedFinsihed_shouldLoadSetToFalse() async throws {
36-
let sut = AlbumListViewModel(usecase: MockAlbumListUseCase(), alertViewModel: alertViewModel())
36+
let sut = AlbumListViewModel(usecase: MockAlbumListUseCase())
3737
let exp = expectation(description: "should load set after album load")
3838

3939
sut.$shouldLoad
@@ -50,7 +50,7 @@ final class AlbumListViewModelTests: XCTestCase {
5050

5151
func testCancelLoading_stopMonitoringForNodeUpdates() async throws {
5252
let useCase = MockAlbumListUseCase()
53-
let sut = AlbumListViewModel(usecase: useCase, alertViewModel: alertViewModel())
53+
let sut = AlbumListViewModel(usecase: useCase)
5454
XCTAssertTrue(useCase.startMonitoringNodesUpdateCalled == 0)
5555
XCTAssertTrue(useCase.stopMonitoringNodesUpdateCalled == 0)
5656
await sut.loadAlbums()
@@ -63,7 +63,7 @@ final class AlbumListViewModelTests: XCTestCase {
6363
func testCreateUserAlbum_shouldCreateUserAlbum() {
6464
let exp = expectation(description: "should load album at first after creating")
6565
let useCase = MockAlbumListUseCase()
66-
let sut = AlbumListViewModel(usecase: useCase, alertViewModel: alertViewModel())
66+
let sut = AlbumListViewModel(usecase: useCase)
6767
sut.createUserAlbum(with: "userAlbum")
6868
sut.$shouldLoad
6969
.dropFirst()
@@ -77,65 +77,5 @@ final class AlbumListViewModelTests: XCTestCase {
7777
XCTAssertEqual(sut.albums.last?.type, .user)
7878
XCTAssertEqual(sut.albums.last?.count, 0)
7979
}
80-
81-
func testNewAlbumName_whenAlbumContainsNoNewAlbum() async {
82-
let useCase = MockAlbumListUseCase()
83-
let sut = AlbumListViewModel(usecase: useCase, alertViewModel: alertViewModel())
84-
await sut.loadAlbums()
85-
await sut.albumLoadingTask?.value
86-
XCTAssertEqual(sut.newAlbumName(), Strings.Localizable.CameraUploads.Albums.Create.Alert.placeholder)
87-
}
88-
89-
func testNewAlbumName_whenAlbumContainsNewAlbum() async {
90-
let newAlbum = MockAlbumListUseCase.sampleUserAlbum(name: Strings.Localizable.CameraUploads.Albums.Create.Alert.placeholder)
91-
let useCase = MockAlbumListUseCase(albums: [newAlbum])
92-
let sut = AlbumListViewModel(usecase: useCase, alertViewModel: alertViewModel())
93-
await sut.loadAlbums()
94-
await sut.albumLoadingTask?.value
95-
XCTAssertEqual(sut.albums.count, 1)
96-
XCTAssertEqual(sut.newAlbumName(), Strings.Localizable.CameraUploads.Albums.Create.Alert.placeholder + " \("(1)")")
97-
}
98-
99-
func testValidateAlbum_whenAlbumNameIsNil_returnsNil() {
100-
let sut = AlbumListViewModel(usecase: MockAlbumListUseCase(), alertViewModel: alertViewModel())
101-
XCTAssertNil(sut.validateAlbum(name: nil))
102-
}
103-
104-
func testValidateAlbum_whenAlbumNameIsEmpty_returnsNil() {
105-
let sut = AlbumListViewModel(usecase: MockAlbumListUseCase(), alertViewModel: alertViewModel())
106-
XCTAssertNil(sut.validateAlbum(name: ""))
107-
}
108-
109-
func testValidateAlbum_whenAlbumNameContainsInvalidChars_returnsErrorMessage() {
110-
let sut = AlbumListViewModel(usecase: MockAlbumListUseCase(), alertViewModel: alertViewModel())
111-
XCTAssertNotNil(sut.validateAlbum(name: "userAlbum:/;"))
112-
}
113-
114-
func testValidateAlbum_whenAlbumNameIsSameAsExistingUserAlbum_returnsErrorMessage() async {
115-
let newAlbum = MockAlbumListUseCase.sampleUserAlbum(name: "userAlbum")
116-
let useCase = MockAlbumListUseCase(albums: [newAlbum])
117-
let sut = AlbumListViewModel(usecase: useCase, alertViewModel: alertViewModel())
118-
await sut.loadAlbums()
119-
await sut.albumLoadingTask?.value
120-
XCTAssertEqual(sut.albums.count, 1)
121-
XCTAssertNotNil(sut.validateAlbum(name: newAlbum.name))
122-
}
123-
124-
func testValidateAlbum_whenAlbumNameIsSameAsExistingSystemAlbum_returnsErrorMessage() async {
125-
let newSysAlbum = AlbumEntity(id: AlbumIdEntity.favourite.rawValue, name: Strings.Localizable.CameraUploads.Albums.Favourites.title, coverNode: NodeEntity(handle: AlbumIdEntity.favourite.rawValue), count: 0, type: .favourite)
126-
let useCase = MockAlbumListUseCase(albums: [newSysAlbum])
127-
let sut = AlbumListViewModel(usecase: useCase, alertViewModel: alertViewModel())
128-
await sut.loadAlbums()
129-
await sut.albumLoadingTask?.value
130-
XCTAssertEqual(sut.albums.count, 1)
131-
XCTAssertNotNil(sut.validateAlbum(name: newSysAlbum.name))
132-
}
133-
134-
private func alertViewModel() -> TextFieldAlertViewModel {
135-
TextFieldAlertViewModel(title: Strings.Localizable.CameraUploads.Albums.Create.Alert.title,
136-
placeholderText: Strings.Localizable.CameraUploads.Albums.Create.Alert.placeholder,
137-
affirmativeButtonTitle: Strings.Localizable.createFolderButton,
138-
message: nil)
139-
}
14080
}
14181

Modules/MEGADomain/Sources/MEGADomainMock/MockUseCases/MockAlbumListUseCase.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ public final class MockAlbumListUseCase: AlbumListUseCaseProtocol {
88
public var startMonitoringNodesUpdateCalled = 0
99
public var stopMonitoringNodesUpdateCalled = 0
1010

11-
public static func sampleUserAlbum(name: String) -> AlbumEntity {
12-
AlbumEntity(id: 4, name: name, coverNode: NodeEntity(handle: 4), count: 0, type: .user)
11+
private var sampleUserAlbum: AlbumEntity {
12+
AlbumEntity(id: 4, name: "Custom Name", coverNode: NodeEntity(handle: 4), count: 0, type: .user)
1313
}
1414

1515
public init(cameraUploadNode: NodeEntity? = nil, albums: [AlbumEntity] = []) {
@@ -34,6 +34,6 @@ public final class MockAlbumListUseCase: AlbumListUseCaseProtocol {
3434
}
3535

3636
public func createUserAlbum(with name: String?) async throws -> AlbumEntity {
37-
MockAlbumListUseCase.sampleUserAlbum(name: name ?? "Custom Name")
37+
sampleUserAlbum.update(name: name ?? "")
3838
}
3939
}

iMEGA/Languages/Base.lproj/Localizable.strings

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -530,10 +530,6 @@
530530
"cameraUploads.albums.create.alert.title"="Enter album name";
531531
/* Used in create album popup. */
532532
"cameraUploads.albums.create.alert.placeholder"="New album";
533-
/* Used in create album popup user album name validation*/
534-
"cameraUploads.albums.create.alert.userAlbumExists"="An album with that name already exists";
535-
/* Used in create album popup system album name validation*/
536-
"cameraUploads.albums.create.alert.systemAlbumExists"="This album name is not allowed";
537533
/* Used in add content album view. */
538534
"cameraUploads.albums.create.location"="Add items to";
539535
/* Used in empty album view. */

iMEGA/Languages/en.lproj/Localizable.strings

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -530,10 +530,6 @@
530530
"cameraUploads.albums.create.alert.title"="Enter album name";
531531
/* Used in create album popup. */
532532
"cameraUploads.albums.create.alert.placeholder"="New album";
533-
/* Used in create album popup user album name validation*/
534-
"cameraUploads.albums.create.alert.userAlbumExists"="An album with that name already exists";
535-
/* Used in create album popup system album name validation*/
536-
"cameraUploads.albums.create.alert.systemAlbumExists"="This album name is not allowed";
537533
/* Used in add content album view. */
538534
"cameraUploads.albums.create.location"="Add items to";
539535
/* Used in empty album view. */

iMEGA/Media Consumption/Album Library/AlbumContentAdditionView.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,10 @@ struct AlbumContentAdditionView: View {
2525
var navigationBar: some View {
2626
VStack(spacing: 0) {
2727
Text(viewModel.navigationTitle)
28-
.lineLimit(1)
2928
.font(.footnote)
3029
.foregroundColor(.primary)
3130
.padding(.bottom, 14)
3231
.padding(.top, 18)
33-
.padding(.horizontal, 30)
3432

3533
HStack {
3634
Button {

iMEGA/Media Consumption/Album Library/AlbumListView.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import SwiftUI
33
struct AlbumListView: View {
44
@StateObject var viewModel: AlbumListViewModel
55
@ObservedObject var createAlbumCellViewModel: CreateAlbumCellViewModel
6+
@State var alertViewModel: TextFieldAlertViewModel
7+
68
var router: AlbumListViewRouting
79

810
var body: some View {
@@ -26,7 +28,7 @@ struct AlbumListView: View {
2628
}
2729
.padding(.horizontal, 6)
2830
}
29-
.alert(isPresented: $viewModel.showCreateAlbumAlert, viewModel.alertViewModel)
31+
.alert(isPresented: $viewModel.showCreateAlbumAlert, alertViewModel)
3032
.overlay(viewModel.shouldLoad ? ProgressView()
3133
.scaleEffect(1.5) : nil)
3234
.fullScreenCover(item: $viewModel.album) {

iMEGA/Media Consumption/Album Library/AlbumListViewModel.swift

Lines changed: 24 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,27 @@ import SwiftUI
33
import MEGADomain
44

55
final class AlbumListViewModel: NSObject, ObservableObject {
6+
var columns: [GridItem] = Array(
7+
repeating: .init(.flexible(), spacing: 10),
8+
count: 3
9+
)
10+
611
@Published var cameraUploadNode: NodeEntity?
712
@Published var album: AlbumEntity?
813
@Published var shouldLoad = true
914
@Published var albums = [AlbumEntity]()
1015
@Published var showCreateAlbumAlert = false
1116
@Published var newlyAddedAlbum: AlbumEntity?
12-
var columns: [GridItem] = Array(
13-
repeating: .init(.flexible(), spacing: 10),
14-
count: 3
15-
)
17+
1618
var albumLoadingTask: Task<Void, Never>?
19+
private let usecase: AlbumListUseCaseProtocol
20+
1721
var isCreateAlbumFeatureFlagEnabled: Bool {
1822
FeatureFlagProvider().isFeatureFlagEnabled(for: .createAlbum)
1923
}
2024

21-
private let usecase: AlbumListUseCaseProtocol
22-
private(set) var alertViewModel: TextFieldAlertViewModel
23-
24-
init(usecase: AlbumListUseCaseProtocol, alertViewModel: TextFieldAlertViewModel) {
25+
init(usecase: AlbumListUseCaseProtocol) {
2526
self.usecase = usecase
26-
self.alertViewModel = alertViewModel
27-
super.init()
28-
self.alertViewModel.action = { newAlbumName in
29-
Task { await self.createUserAlbum(with: newAlbumName) }
30-
}
31-
self.alertViewModel.validator = validateAlbum
3227
}
3328

3429
@MainActor
@@ -44,29 +39,8 @@ final class AlbumListViewModel: NSObject, ObservableObject {
4439
albumLoadingTask?.cancel()
4540
}
4641

47-
@MainActor
48-
func createUserAlbum(with name: String?) {
49-
guard let name = name else { return }
50-
guard name.isNotEmpty else {
51-
createUserAlbum(with: newAlbumName())
52-
return
53-
}
54-
55-
shouldLoad = true
56-
Task {
57-
do {
58-
let newAlbum = try await usecase.createUserAlbum(with: name)
59-
albums.append(newAlbum)
60-
albums.sort(by: { $0.name < $1.name })
61-
newlyAddedAlbum = newAlbum
62-
} catch {
63-
MEGALogError("Error creating album: \(error.localizedDescription)")
64-
}
65-
shouldLoad = false
66-
}
67-
}
68-
6942
// MARK: - Private
43+
7044
@MainActor
7145
private func loadAllAlbums() {
7246
albumLoadingTask = Task {
@@ -93,23 +67,20 @@ final class AlbumListViewModel: NSObject, ObservableObject {
9367
}
9468
}
9569

96-
func newAlbumName() -> String {
97-
var newAlbumName = Strings.Localizable.CameraUploads.Albums.Create.Alert.placeholder
98-
let count = self.albums.filter({ $0.name.hasPrefix(newAlbumName) }).count
99-
if count > 0 {
100-
newAlbumName += " (\(count))"
101-
}
102-
return newAlbumName
103-
}
104-
105-
func validateAlbum(name: String?) -> String? {
106-
guard let name = name, name.isNotEmpty else { return nil }
107-
if name.mnz_containsInvalidChars() {
108-
return Strings.Localizable.General.Error.charactersNotAllowed(String.Constants.invalidFileFolderNameCharacters)
109-
}
110-
if let existingAlbum = self.albums.first(where: { $0.name.lowercased() == name.lowercased() }) {
111-
return existingAlbum.type == .user ? Strings.Localizable.CameraUploads.Albums.Create.Alert.userAlbumExists : Strings.Localizable.CameraUploads.Albums.Create.Alert.systemAlbumExists
70+
@MainActor
71+
func createUserAlbum(with name: String?) {
72+
guard let name = name, !name.isEmpty else { return }
73+
shouldLoad = true
74+
Task {
75+
do {
76+
let newAlbum = try await usecase.createUserAlbum(with: name)
77+
albums.append(newAlbum)
78+
albums.sort(by: { $0.name < $1.name })
79+
newlyAddedAlbum = newAlbum
80+
} catch {
81+
MEGALogError("Error creating album: \(error.localizedDescription)")
82+
}
83+
shouldLoad = false
11284
}
113-
return nil
11485
}
11586
}

iMEGA/Media Consumption/Album Library/AlbumListViewRouter.swift

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,20 @@ struct AlbumListViewRouter: AlbumListViewRouting, Routing {
2727
userAlbumRepository: UserAlbumRepository.newRepo,
2828
fileSearchRepository: FileSearchRepository.newRepo,
2929
mediaUseCase: MediaUseCase()
30-
), alertViewModel: TextFieldAlertViewModel(title: Strings.Localizable.CameraUploads.Albums.Create.Alert.title,
31-
placeholderText: Strings.Localizable.CameraUploads.Albums.Create.Alert.placeholder,
32-
affirmativeButtonTitle: Strings.Localizable.createFolderButton,
33-
message: nil)
30+
)
3431
)
3532

33+
let alertVm = TextFieldAlertViewModel(title: Strings.Localizable.CameraUploads.Albums.Create.Alert.title,
34+
invalidTextTitle: Strings.Localizable.General.Error.charactersNotAllowed(String.Constants.invalidFileFolderNameCharacters),
35+
placeholderText: Strings.Localizable.CameraUploads.Albums.Create.Alert.placeholder,
36+
affirmativeButtonTitle: Strings.Localizable.createFolderButton,
37+
message: nil) { newAlbumName in
38+
Task { await vm.createUserAlbum(with: newAlbumName) }
39+
}
40+
3641
let content = AlbumListView(viewModel: vm,
3742
createAlbumCellViewModel: CreateAlbumCellViewModel(),
43+
alertViewModel: alertVm,
3844
router: self)
3945

4046
return UIHostingController(rootView: content)
Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
import Foundation
22

3-
typealias TextFieldAlertError = String?
4-
53
public struct TextFieldAlertViewModel {
64
let textString: String = ""
75
let title: String
6+
let invalidTextTitle: String
87
let placeholderText: String
98
let affirmativeButtonTitle: String
109
let message: String?
11-
var action: ((String?) -> Void)?
12-
var validator: ((String?) -> TextFieldAlertError)?
10+
var action: (String?) -> ()
1311
}

iMEGA/Media Consumption/Album Library/Alert/TextFieldAlertViewWrapper.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ struct TextFieldAlertWrapper<Content: View>: UIViewControllerRepresentable {
2626
var alert = self.alert
2727
alert.action = {
2828
self.isPresented = false
29-
self.alert.action?($0)
29+
self.alert.action($0)
3030
}
3131
context.coordinator.alertController = UIAlertController(alert: alert)
3232
uiViewController.present(context.coordinator.alertController!, animated: true)

0 commit comments

Comments
 (0)