From f8532f05f41bfe96b03e98bd23211b523a6fd463 Mon Sep 17 00:00:00 2001 From: makinosp Date: Mon, 23 Sep 2024 21:22:35 +0900 Subject: [PATCH 1/8] fix: issue crashing preview --- harmonie/Views/Friend/FriendsView.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/harmonie/Views/Friend/FriendsView.swift b/harmonie/Views/Friend/FriendsView.swift index 58c5d47..988c0e1 100644 --- a/harmonie/Views/Friend/FriendsView.swift +++ b/harmonie/Views/Friend/FriendsView.swift @@ -52,6 +52,7 @@ struct FriendsView: View { let friendVM = FriendViewModel(user: PreviewDataProvider.shared.previewUser) let favoriteVM = FavoriteViewModel() FriendsView() + .environment(appVM) .environment(friendVM) .environment(favoriteVM) .task { From f609c3b9127aa4bd23ad1361ea44d12f2e081f2c Mon Sep 17 00:00:00 2001 From: makinosp Date: Mon, 23 Sep 2024 21:23:17 +0900 Subject: [PATCH 2/8] refact: bindable --- harmonie/Views/Favorite/FavoritesView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/harmonie/Views/Favorite/FavoritesView.swift b/harmonie/Views/Favorite/FavoritesView.swift index 919a6b4..debfbed 100644 --- a/harmonie/Views/Favorite/FavoritesView.swift +++ b/harmonie/Views/Favorite/FavoritesView.swift @@ -13,6 +13,7 @@ struct FavoritesView: View { @State private var selected: Selected? var body: some View { + @Bindable var favoriteVM = favoriteVM NavigationSplitView(columnVisibility: .constant(.all)) { Group { if favoriteVM.segment == .friend { @@ -23,7 +24,6 @@ struct FavoritesView: View { } .toolbar { ToolbarItem(placement: .status) { - @Bindable var favoriteVM = favoriteVM Picker("", selection: $favoriteVM.segment) { ForEach(Segment.allCases) { segment in Text(segment.description).tag(segment) From 0013bd087c0c0b325194d46b87acf4c49c403420 Mon Sep 17 00:00:00 2001 From: makinosp Date: Mon, 23 Sep 2024 21:35:10 +0900 Subject: [PATCH 3/8] feat: replace Section to DsclosureGroup in FavoriteFriendListView --- harmonie/Views/Favorite/FavoriteFriendListView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/harmonie/Views/Favorite/FavoriteFriendListView.swift b/harmonie/Views/Favorite/FavoriteFriendListView.swift index bd54063..673a456 100644 --- a/harmonie/Views/Favorite/FavoriteFriendListView.swift +++ b/harmonie/Views/Favorite/FavoriteFriendListView.swift @@ -19,7 +19,7 @@ struct FavoriteFriendListView: View { var body: some View { List(favoriteVM.favoriteFriendGroups, selection: $selected) { group in if let friends = favoriteVM.getFavoriteFriends(group.id) { - Section(header: Text(group.displayName)) { + DisclosureGroup(group.displayName) { ForEach(friends) { friend in NavigationLabel { Label { From 6b4e51dae234051a7d9a23a8c1fa05f4804b093e Mon Sep 17 00:00:00 2001 From: makinosp Date: Mon, 23 Sep 2024 22:44:27 +0900 Subject: [PATCH 4/8] fix: grouping favorite world, segment picker in FavoritesView --- harmonie/Models/FavoriteFriendModel.swift | 11 +++++++- harmonie/ViewModels/FavoriteViewModel.swift | 19 ++++++++++++++ .../Favorite/FavoriteWorldListView.swift | 12 +++------ harmonie/Views/Favorite/FavoritesView.swift | 26 +++++++++---------- 4 files changed, 46 insertions(+), 22 deletions(-) diff --git a/harmonie/Models/FavoriteFriendModel.swift b/harmonie/Models/FavoriteFriendModel.swift index acab502..57f29b4 100644 --- a/harmonie/Models/FavoriteFriendModel.swift +++ b/harmonie/Models/FavoriteFriendModel.swift @@ -7,7 +7,16 @@ import VRCKit -struct FavoriteFriend: Hashable { +struct FavoriteFriend: Sendable, Hashable { let favoriteGroupId: String var friends: [Friend] } + +struct FavoriteWorld: Sendable, Hashable { + let group: FavoriteGroup? + var worlds: [World] +} + +extension FavoriteWorld: Identifiable { + var id: Int { hashValue } +} diff --git a/harmonie/ViewModels/FavoriteViewModel.swift b/harmonie/ViewModels/FavoriteViewModel.swift index 6ee0458..de9d2f4 100644 --- a/harmonie/ViewModels/FavoriteViewModel.swift +++ b/harmonie/ViewModels/FavoriteViewModel.swift @@ -23,6 +23,14 @@ final class FavoriteViewModel { favoriteGroups.filter { $0.type == .friend } } + func getFavoriteGroup(id: String) -> FavoriteGroup? { + favoriteGroups.first { $0.id == id } + } + + func getFavoriteGroup(name: String) -> FavoriteGroup? { + favoriteGroups.first { $0.name == name } + } + /// Asynchronously fetches and updates the favorite groups and their details. /// - Throws: An error if any network request or decoding operation fails. func fetchFavorite(service: FavoriteServiceProtocol, friendVM: FriendViewModel) async throws { @@ -121,4 +129,15 @@ final class FavoriteViewModel { func fetchFavoritedWorlds(service: WorldServiceProtocol) async throws { favoriteWorlds = try await service.fetchFavoritedWorlds() } + + var groupedFavoriteWorlds: [FavoriteWorld] { + Dictionary(grouping: favoriteWorlds, by: { $0.favoriteGroup ?? "Unknown" }) + .sorted { $0.key < $1.key } + .map { dictionary in + FavoriteWorld( + group: getFavoriteGroup(name: dictionary.key), + worlds: dictionary.value + ) + } + } } diff --git a/harmonie/Views/Favorite/FavoriteWorldListView.swift b/harmonie/Views/Favorite/FavoriteWorldListView.swift index dca3f10..1d69a5a 100644 --- a/harmonie/Views/Favorite/FavoriteWorldListView.swift +++ b/harmonie/Views/Favorite/FavoriteWorldListView.swift @@ -17,10 +17,10 @@ struct FavoriteWorldListView: View { } var body: some View { - List(groupedWorlds.keys.sorted(), id: \.hashValue, selection: $selected) { group in - if let worlds = groupedWorlds[group] { - Section(header: Text(group)) { - ForEach(worlds) { world in + List(favoriteVM.groupedFavoriteWorlds, selection: $selected) { favoriteWorlds in + if let group = favoriteWorlds.group { + DisclosureGroup(group.displayName) { + ForEach(favoriteWorlds.worlds) { world in worldItem(world) .tag(Selected(id: world.id)) } @@ -29,10 +29,6 @@ struct FavoriteWorldListView: View { } } - private var groupedWorlds: [String: [World]] { - Dictionary(grouping: favoriteVM.favoriteWorlds, by: { $0.favoriteGroup ?? "Unknown" }) - } - private func worldItem(_ world: World) -> some View { HStack(spacing: 12) { SquareURLImage( diff --git a/harmonie/Views/Favorite/FavoritesView.swift b/harmonie/Views/Favorite/FavoritesView.swift index debfbed..57a9712 100644 --- a/harmonie/Views/Favorite/FavoritesView.swift +++ b/harmonie/Views/Favorite/FavoritesView.swift @@ -15,22 +15,22 @@ struct FavoritesView: View { var body: some View { @Bindable var favoriteVM = favoriteVM NavigationSplitView(columnVisibility: .constant(.all)) { - Group { - if favoriteVM.segment == .friend { - FavoriteFriendListView(selected: $selected) - } else if favoriteVM.segment == .world { - FavoriteWorldListView(selected: $selected) + VStack { + Picker("", selection: $favoriteVM.segment) { + ForEach(Segment.allCases) { segment in + Text(segment.description).tag(segment) + } } - } - .toolbar { - ToolbarItem(placement: .status) { - Picker("", selection: $favoriteVM.segment) { - ForEach(Segment.allCases) { segment in - Text(segment.description).tag(segment) - } + .pickerStyle(.segmented) + .padding(.horizontal, 20) + Group { + if favoriteVM.segment == .friend { + FavoriteFriendListView(selected: $selected) + } else if favoriteVM.segment == .world { + FavoriteWorldListView(selected: $selected) } - .pickerStyle(SegmentedPickerStyle()) } + .contentMargins(.top, 0) } .navigationTitle("Favorites") } detail: { From 419e3d6560ce96151fa94c8406e28f08c5e13c5d Mon Sep 17 00:00:00 2001 From: makinosp Date: Mon, 23 Sep 2024 22:45:00 +0900 Subject: [PATCH 5/8] refact: filename --- .../Models/{FavoriteFriendModel.swift => FavoriteModel.swift} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename harmonie/Models/{FavoriteFriendModel.swift => FavoriteModel.swift} (92%) diff --git a/harmonie/Models/FavoriteFriendModel.swift b/harmonie/Models/FavoriteModel.swift similarity index 92% rename from harmonie/Models/FavoriteFriendModel.swift rename to harmonie/Models/FavoriteModel.swift index 57f29b4..faaedbc 100644 --- a/harmonie/Models/FavoriteFriendModel.swift +++ b/harmonie/Models/FavoriteModel.swift @@ -1,5 +1,5 @@ // -// FavoriteFriendModel.swift +// FavoriteModel.swift // Harmonie // // Created by makinosp on 2024/09/16. From 4dd4e2728115ce07b0e3c3bf237857f60514f1ee Mon Sep 17 00:00:00 2001 From: makinosp Date: Mon, 23 Sep 2024 22:46:35 +0900 Subject: [PATCH 6/8] update: package dependencies --- .../project.xcworkspace/xcshareddata/swiftpm/Package.resolved | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Harmonie.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Harmonie.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 1165221..8a1ed48 100644 --- a/Harmonie.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Harmonie.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -106,7 +106,7 @@ "location" : "https://github.com/makinosp/vrckit", "state" : { "branch" : "develop", - "revision" : "3e8473947c3044297be4647d8230381c16921090" + "revision" : "bc261c16c86f2738501799f3c86d1d581f5f2cb9" } }, { From c57f41687605fb5c66aebcb402699c99de645cc7 Mon Sep 17 00:00:00 2001 From: makinosp Date: Mon, 23 Sep 2024 22:52:06 +0900 Subject: [PATCH 7/8] fix: parameter of fetchFavoriteWorlds --- harmonie/ViewModels/FavoriteViewModel.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/harmonie/ViewModels/FavoriteViewModel.swift b/harmonie/ViewModels/FavoriteViewModel.swift index de9d2f4..98b1a8b 100644 --- a/harmonie/ViewModels/FavoriteViewModel.swift +++ b/harmonie/ViewModels/FavoriteViewModel.swift @@ -127,7 +127,7 @@ final class FavoriteViewModel { } func fetchFavoritedWorlds(service: WorldServiceProtocol) async throws { - favoriteWorlds = try await service.fetchFavoritedWorlds() + favoriteWorlds = try await service.fetchFavoritedWorlds(n: 100) } var groupedFavoriteWorlds: [FavoriteWorld] { From 8336bcdebce06fd41de51eb53a5d749a88116f57 Mon Sep 17 00:00:00 2001 From: makinosp Date: Mon, 23 Sep 2024 22:53:19 +0900 Subject: [PATCH 8/8] update: bump up to 0.7.3 --- Harmonie.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Harmonie.xcodeproj/project.pbxproj b/Harmonie.xcodeproj/project.pbxproj index 5d68a32..1ab7eb3 100644 --- a/Harmonie.xcodeproj/project.pbxproj +++ b/Harmonie.xcodeproj/project.pbxproj @@ -470,7 +470,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 0.7.2; + MARKETING_VERSION = 0.7.3; PRODUCT_BUNDLE_IDENTIFIER = jp.mknn.harmonie; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; @@ -506,7 +506,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 0.7.2; + MARKETING_VERSION = 0.7.3; PRODUCT_BUNDLE_IDENTIFIER = jp.mknn.harmonie; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES;