From 5ef63160364a64e67b71c0fe7d719a677f3aa2fe Mon Sep 17 00:00:00 2001 From: 50/50 <80717571+50n50@users.noreply.github.com> Date: Sun, 15 Jun 2025 21:33:38 +0200 Subject: [PATCH] IBH bug report fixes (Read description) (#197) --- .../AccentColor.colorset/Contents.json | 12 +- Sora/Utils/Drops/DropManager.swift | 4 +- .../Modules/ModuleAdditionSettingsView.swift | 2 +- Sora/Views/DownloadView.swift | 10 +- Sora/Views/LibraryView/AllWatching.swift | 2 +- .../BookmarkComponents/BookmarkGridView.swift | 2 +- .../BookmarksDetailView.swift | 2 +- Sora/Views/LibraryView/LibraryView.swift | 2 +- .../AnilistMatchPopupView.swift | 2 +- .../CustomMatching/TMDBMatchPopupView.swift | 2 +- Sora/Views/MediaInfoView/MediaInfoView.swift | 2 +- Sora/Views/SearchView/SearchResultsGrid.swift | 137 ++++++++++++------ Sora/Views/SearchView/SearchView.swift | 2 +- .../SettingsSubViews/SettingsViewAbout.swift | 2 +- .../SettingsSubViews/SettingsViewData.swift | 3 +- .../SettingsViewDownloads.swift | 6 +- .../SettingsViewGeneral.swift | 5 +- .../SettingsSubViews/SettingsViewLogger.swift | 2 +- .../SettingsViewLoggerFilter.swift | 2 +- .../SettingsSubViews/SettingsViewModule.swift | 2 +- .../SettingsSubViews/SettingsViewPlayer.swift | 2 +- .../SettingsViewTrackers.swift | 2 +- Sora/Views/SettingsView/SettingsView.swift | 19 +-- 23 files changed, 139 insertions(+), 87 deletions(-) diff --git a/Sora/Assets.xcassets/AccentColor.colorset/Contents.json b/Sora/Assets.xcassets/AccentColor.colorset/Contents.json index 0425637..d890719 100644 --- a/Sora/Assets.xcassets/AccentColor.colorset/Contents.json +++ b/Sora/Assets.xcassets/AccentColor.colorset/Contents.json @@ -5,9 +5,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "1.000", - "green" : "1.000", - "red" : "1.000" + "blue" : "0.000", + "green" : "0.000", + "red" : "0.000" } }, "idiom" : "universal" @@ -23,9 +23,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "0.000", - "green" : "0.000", - "red" : "0.000" + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" } }, "idiom" : "universal" diff --git a/Sora/Utils/Drops/DropManager.swift b/Sora/Utils/Drops/DropManager.swift index 9170158..a05138d 100644 --- a/Sora/Utils/Drops/DropManager.swift +++ b/Sora/Utils/Drops/DropManager.swift @@ -7,6 +7,7 @@ import Drops import UIKit +import SwiftUI class DropManager { static let shared = DropManager() @@ -59,7 +60,8 @@ class DropManager { } func info(_ message: String, duration: TimeInterval = 2.0) { - let icon = UIImage(systemName: "info.circle.fill")?.withTintColor(.blue, renderingMode: .alwaysOriginal) + let accentColor = UIColor(Color.accentColor) + let icon = UIImage(systemName: "info.circle.fill")?.withTintColor(accentColor, renderingMode: .alwaysOriginal) showDrop(title: "Info", subtitle: message, duration: duration, icon: icon) } diff --git a/Sora/Utils/Modules/ModuleAdditionSettingsView.swift b/Sora/Utils/Modules/ModuleAdditionSettingsView.swift index c05c734..2398ca2 100644 --- a/Sora/Utils/Modules/ModuleAdditionSettingsView.swift +++ b/Sora/Utils/Modules/ModuleAdditionSettingsView.swift @@ -41,7 +41,7 @@ struct ModuleAdditionSettingsView: View { } .padding(.bottom, 8) - ScrollView { + ScrollView(showsIndicators: false) { VStack(spacing: 24) { if let metadata = moduleMetadata { VStack(spacing: 0) { diff --git a/Sora/Views/DownloadView.swift b/Sora/Views/DownloadView.swift index 6233474..020603c 100644 --- a/Sora/Views/DownloadView.swift +++ b/Sora/Views/DownloadView.swift @@ -79,7 +79,7 @@ struct DownloadView: View { if jsController.activeDownloads.isEmpty && jsController.downloadQueue.isEmpty { emptyActiveDownloadsView } else { - ScrollView { + ScrollView(showsIndicators: false) { VStack(spacing: 20) { if !jsController.downloadQueue.isEmpty { DownloadSectionView( @@ -109,7 +109,7 @@ struct DownloadView: View { if filteredAndSortedAssets.isEmpty { emptyDownloadsView } else { - ScrollView { + ScrollView(showsIndicators: false) { VStack(spacing: 20) { DownloadSummaryCard( totalShows: groupedAssets.count, @@ -888,7 +888,7 @@ struct EnhancedDownloadGroupCard: View { .foregroundStyle(.primary) HStack(spacing: 16) { - Label("\(group.assetCount)", systemImage: "play.rectangle") + Label("\(group.assetCount) \(group.assetCount == 1 ? "Episode" : "Episodes")", systemImage: "play.rectangle") .font(.subheadline) .foregroundStyle(.secondary) @@ -956,7 +956,7 @@ struct EnhancedShowEpisodesView: View { } var body: some View { - ScrollView { + ScrollView(showsIndicators: false) { VStack(spacing: 24) { VStack(spacing: 20) { HStack(alignment: .top, spacing: 20) { @@ -997,7 +997,7 @@ struct EnhancedShowEpisodesView: View { HStack { Image(systemName: "play.rectangle.fill") .foregroundColor(.accentColor) - Text("\(group.assetCount) Episodes") + Text("\(group.assetCount) \(group.assetCount == 1 ? "Episode" : "Episodes")") .font(.headline) .foregroundColor(.secondary) } diff --git a/Sora/Views/LibraryView/AllWatching.swift b/Sora/Views/LibraryView/AllWatching.swift index 0921bdf..6e56855 100644 --- a/Sora/Views/LibraryView/AllWatching.swift +++ b/Sora/Views/LibraryView/AllWatching.swift @@ -105,7 +105,7 @@ struct AllWatchingView: View { .padding(.horizontal) .padding(.top) - ScrollView { + ScrollView(showsIndicators: false) { LazyVStack(spacing: 12) { ForEach(sortedItems) { item in FullWidthContinueWatchingCell( diff --git a/Sora/Views/LibraryView/BookmarkComponents/BookmarkGridView.swift b/Sora/Views/LibraryView/BookmarkComponents/BookmarkGridView.swift index 12289c6..e3321cf 100644 --- a/Sora/Views/LibraryView/BookmarkComponents/BookmarkGridView.swift +++ b/Sora/Views/LibraryView/BookmarkComponents/BookmarkGridView.swift @@ -16,7 +16,7 @@ struct BookmarkGridView: View { ] var body: some View { - ScrollView { + ScrollView(showsIndicators: false) { LazyVGrid(columns: columns, spacing: 16) { ForEach(bookmarks) { bookmark in BookmarkGridItemView( diff --git a/Sora/Views/LibraryView/BookmarkComponents/BookmarksDetailView.swift b/Sora/Views/LibraryView/BookmarkComponents/BookmarksDetailView.swift index e9a0dcd..94109d9 100644 --- a/Sora/Views/LibraryView/BookmarkComponents/BookmarksDetailView.swift +++ b/Sora/Views/LibraryView/BookmarkComponents/BookmarksDetailView.swift @@ -109,7 +109,7 @@ private struct BookmarksDetailGrid: View { let moduleManager: ModuleManager private let columns = [GridItem(.adaptive(minimum: 150))] var body: some View { - ScrollView { + ScrollView(showsIndicators: false) { LazyVGrid(columns: columns, spacing: 16) { ForEach(bookmarks) { bookmark in BookmarksDetailGridCell(bookmark: bookmark, moduleManager: moduleManager) diff --git a/Sora/Views/LibraryView/LibraryView.swift b/Sora/Views/LibraryView/LibraryView.swift index 66e282a..bad055c 100644 --- a/Sora/Views/LibraryView/LibraryView.swift +++ b/Sora/Views/LibraryView/LibraryView.swift @@ -56,7 +56,7 @@ struct LibraryView: View { var body: some View { NavigationView { ZStack { - ScrollView { + ScrollView(showsIndicators: false) { VStack(alignment: .leading, spacing: 20) { Text("Library") .font(.largeTitle) diff --git a/Sora/Views/MediaInfoView/CustomMatching/AnilistMatchPopupView.swift b/Sora/Views/MediaInfoView/CustomMatching/AnilistMatchPopupView.swift index 8e05e38..35e996a 100644 --- a/Sora/Views/MediaInfoView/CustomMatching/AnilistMatchPopupView.swift +++ b/Sora/Views/MediaInfoView/CustomMatching/AnilistMatchPopupView.swift @@ -29,7 +29,7 @@ struct AnilistMatchPopupView: View { var body: some View { NavigationView { - ScrollView { + ScrollView(showsIndicators: false) { VStack(alignment: .leading, spacing: 4) { Text("".uppercased()) .font(.footnote) diff --git a/Sora/Views/MediaInfoView/CustomMatching/TMDBMatchPopupView.swift b/Sora/Views/MediaInfoView/CustomMatching/TMDBMatchPopupView.swift index d34bc69..251abe8 100644 --- a/Sora/Views/MediaInfoView/CustomMatching/TMDBMatchPopupView.swift +++ b/Sora/Views/MediaInfoView/CustomMatching/TMDBMatchPopupView.swift @@ -38,7 +38,7 @@ struct TMDBMatchPopupView: View { var body: some View { NavigationView { - ScrollView { + ScrollView(showsIndicators: false) { VStack(spacing: 0) { if isLoading { ProgressView() diff --git a/Sora/Views/MediaInfoView/MediaInfoView.swift b/Sora/Views/MediaInfoView/MediaInfoView.swift index 0f0b7ff..3f864da 100644 --- a/Sora/Views/MediaInfoView/MediaInfoView.swift +++ b/Sora/Views/MediaInfoView/MediaInfoView.swift @@ -226,7 +226,7 @@ struct MediaInfoView: View { @ViewBuilder private var mainScrollView: some View { - ScrollView { + ScrollView(showsIndicators: false) { ZStack(alignment: .top) { heroImageSection contentContainer diff --git a/Sora/Views/SearchView/SearchResultsGrid.swift b/Sora/Views/SearchView/SearchResultsGrid.swift index 78b93cf..a3a90c1 100644 --- a/Sora/Views/SearchView/SearchResultsGrid.swift +++ b/Sora/Views/SearchView/SearchResultsGrid.swift @@ -12,6 +12,10 @@ struct SearchResultsGrid: View { @AppStorage("mediaColumnsPortrait") private var mediaColumnsPortrait: Int = 2 @AppStorage("mediaColumnsLandscape") private var mediaColumnsLandscape: Int = 4 @Environment(\.verticalSizeClass) var verticalSizeClass + @EnvironmentObject private var libraryManager: LibraryManager + @EnvironmentObject private var moduleManager: ModuleManager + @State private var showBookmarkToast: Bool = false + @State private var toastMessage: String = "" let items: [SearchItem] let columns: [GridItem] @@ -28,57 +32,100 @@ struct SearchResultsGrid: View { } var body: some View { - LazyVGrid(columns: Array(repeating: GridItem(.flexible(), spacing: 12), count: columnsCount), spacing: 12) { - ForEach(items) { item in - NavigationLink(destination: MediaInfoView(title: item.title, imageUrl: item.imageUrl, href: item.href, module: selectedModule)) { - ZStack { - LazyImage(url: URL(string: item.imageUrl)) { state in - if let uiImage = state.imageContainer?.image { - Image(uiImage: uiImage) - .resizable() - .aspectRatio(0.72, contentMode: .fill) - .frame(width: cellWidth, height: cellWidth * 1.5) - .cornerRadius(12) - .clipped() - } else { - Rectangle() - .fill(.tertiary) - .frame(width: cellWidth, height: cellWidth * 1.5) - .cornerRadius(12) - .clipped() + ZStack { + LazyVGrid(columns: Array(repeating: GridItem(.flexible(), spacing: 12), count: columnsCount), spacing: 12) { + ForEach(items) { item in + NavigationLink(destination: MediaInfoView(title: item.title, imageUrl: item.imageUrl, href: item.href, module: selectedModule)) { + ZStack { + LazyImage(url: URL(string: item.imageUrl)) { state in + if let uiImage = state.imageContainer?.image { + Image(uiImage: uiImage) + .resizable() + .aspectRatio(0.72, contentMode: .fill) + .frame(width: cellWidth, height: cellWidth * 1.5) + .cornerRadius(12) + .clipped() + } else { + Rectangle() + .fill(.tertiary) + .frame(width: cellWidth, height: cellWidth * 1.5) + .cornerRadius(12) + .clipped() + } } - } - - VStack { - Spacer() - HStack { - Text(item.title) - .lineLimit(2) - .foregroundColor(.white) - .multilineTextAlignment(.leading) + + VStack { Spacer() - } - .padding(12) - .background( - LinearGradient( - colors: [ - .black.opacity(0.7), - .black.opacity(0.0) - ], - startPoint: .bottom, - endPoint: .top + HStack { + Text(item.title) + .lineLimit(2) + .foregroundColor(.white) + .multilineTextAlignment(.leading) + Spacer() + } + .padding(12) + .background( + LinearGradient( + colors: [ + .black.opacity(0.7), + .black.opacity(0.0) + ], + startPoint: .bottom, + endPoint: .top + ) + .shadow(color: .black, radius: 4, x: 0, y: 2) ) - .shadow(color: .black, radius: 4, x: 0, y: 2) - ) + } + .frame(width: cellWidth) } - .frame(width: cellWidth) + .clipShape(RoundedRectangle(cornerRadius: 12)) + .padding(4) } - .clipShape(RoundedRectangle(cornerRadius: 12)) - .padding(4) - }.id(item.href) + .id(item.href) + .contextMenu { + Button(action: { + let isBookmarked = libraryManager.isBookmarked(href: item.href, moduleName: selectedModule.metadata.sourceName) + libraryManager.toggleBookmark( + title: item.title, + imageUrl: item.imageUrl, + href: item.href, + moduleId: selectedModule.id.uuidString, + moduleName: selectedModule.metadata.sourceName + ) + DropManager.shared.showDrop( + title: isBookmarked ? "Removed from Bookmarks" : "Bookmarked!", + subtitle: item.title, + duration: 1.0, + icon: UIImage(systemName: isBookmarked ? "bookmark.slash" : "bookmark.fill") + ) + }) { + Label(libraryManager.isBookmarked(href: item.href, moduleName: selectedModule.metadata.sourceName) ? "Remove Bookmark" : "Bookmark", + systemImage: libraryManager.isBookmarked(href: item.href, moduleName: selectedModule.metadata.sourceName) ? "bookmark.slash" : "bookmark") + } + } + } + } + .padding(.top) + .padding() + + if showBookmarkToast { + VStack { + Spacer() + Text(toastMessage) + .font(.headline) + .padding() + .background(Color.black.opacity(0.8)) + .foregroundColor(.white) + .cornerRadius(12) + .padding(.bottom, 40) + .transition(.move(edge: .bottom).combined(with: .opacity)) + } + .onAppear { + DispatchQueue.main.asyncAfter(deadline: .now() + 1.2) { + withAnimation { showBookmarkToast = false } + } + } } } - .padding(.top) - .padding() } } diff --git a/Sora/Views/SearchView/SearchView.swift b/Sora/Views/SearchView/SearchView.swift index 622968b..a3cbfca 100644 --- a/Sora/Views/SearchView/SearchView.swift +++ b/Sora/Views/SearchView/SearchView.swift @@ -93,7 +93,7 @@ struct SearchView: View { .padding(.horizontal, 20) .padding(.top, 20) - ScrollView { + ScrollView(showsIndicators: false) { SearchContent( selectedModule: selectedModule, searchQuery: searchQuery, diff --git a/Sora/Views/SettingsView/SettingsSubViews/SettingsViewAbout.swift b/Sora/Views/SettingsView/SettingsSubViews/SettingsViewAbout.swift index 2982a74..9192206 100644 --- a/Sora/Views/SettingsView/SettingsSubViews/SettingsViewAbout.swift +++ b/Sora/Views/SettingsView/SettingsSubViews/SettingsViewAbout.swift @@ -60,7 +60,7 @@ fileprivate struct SettingsSection: View { struct SettingsViewAbout: View { var body: some View { - ScrollView { + ScrollView(showsIndicators: false) { VStack(spacing: 24) { SettingsSection(title: "App Info", footer: "Sora/Sulfur will always remain free with no ads!") { HStack(alignment: .center, spacing: 16) { diff --git a/Sora/Views/SettingsView/SettingsSubViews/SettingsViewData.swift b/Sora/Views/SettingsView/SettingsSubViews/SettingsViewData.swift index a6f67ad..3f7ac87 100644 --- a/Sora/Views/SettingsView/SettingsSubViews/SettingsViewData.swift +++ b/Sora/Views/SettingsView/SettingsSubViews/SettingsViewData.swift @@ -149,7 +149,7 @@ struct SettingsViewData: View { @State private var activeAlert: ActiveAlert = .eraseData var body: some View { - return ScrollView { + return ScrollView(showsIndicators: false) { VStack(spacing: 24) { SettingsSection( title: NSLocalizedString("App Storage", comment: ""), @@ -191,6 +191,7 @@ struct SettingsViewData: View { } } } + .padding(.vertical, 20) .scrollViewBottomPadding() .navigationTitle(NSLocalizedString("App Data", comment: "")) .onAppear { diff --git a/Sora/Views/SettingsView/SettingsSubViews/SettingsViewDownloads.swift b/Sora/Views/SettingsView/SettingsSubViews/SettingsViewDownloads.swift index 684466b..122143b 100644 --- a/Sora/Views/SettingsView/SettingsSubViews/SettingsViewDownloads.swift +++ b/Sora/Views/SettingsView/SettingsSubViews/SettingsViewDownloads.swift @@ -161,7 +161,7 @@ struct SettingsViewDownloads: View { @State private var isCalculating: Bool = false var body: some View { - ScrollView { + ScrollView(showsIndicators: false) { VStack(spacing: 24) { SettingsSection( title: String(localized: "Download Settings"), @@ -309,9 +309,9 @@ struct SettingsViewDownloads: View { } } .padding(.vertical, 20) + .scrollViewBottomPadding() + .navigationTitle(String(localized: "Downloads")) } - .navigationTitle(String(localized: "Downloads")) - .scrollViewBottomPadding() .alert(String(localized: "Delete All Downloads"), isPresented: $showClearConfirmation) { Button(String(localized: "Cancel"), role: .cancel) { } Button(String(localized: "Delete All"), role: .destructive) { diff --git a/Sora/Views/SettingsView/SettingsSubViews/SettingsViewGeneral.swift b/Sora/Views/SettingsView/SettingsSubViews/SettingsViewGeneral.swift index 1109491..04ebe21 100644 --- a/Sora/Views/SettingsView/SettingsSubViews/SettingsViewGeneral.swift +++ b/Sora/Views/SettingsView/SettingsSubViews/SettingsViewGeneral.swift @@ -173,7 +173,7 @@ struct SettingsViewGeneral: View { @State private var showRestartAlert = false var body: some View { - ScrollView { + ScrollView(showsIndicators: false) { VStack(spacing: 24) { SettingsSection(title: NSLocalizedString("Interface", comment: "")) { SettingsPickerRow( @@ -347,8 +347,9 @@ struct SettingsViewGeneral: View { ) } } - .navigationTitle("General") + .padding(.vertical, 20) .scrollViewBottomPadding() + .navigationTitle("General") } .navigationTitle(NSLocalizedString("General", comment: "")) .scrollViewBottomPadding() diff --git a/Sora/Views/SettingsView/SettingsSubViews/SettingsViewLogger.swift b/Sora/Views/SettingsView/SettingsSubViews/SettingsViewLogger.swift index ddb935b..e140412 100644 --- a/Sora/Views/SettingsView/SettingsSubViews/SettingsViewLogger.swift +++ b/Sora/Views/SettingsView/SettingsSubViews/SettingsViewLogger.swift @@ -74,7 +74,7 @@ struct SettingsViewLogger: View { } var body: some View { - ScrollView { + ScrollView(showsIndicators: false) { VStack(spacing: 24) { SettingsSection(title: NSLocalizedString("Logs", comment: "")) { if isLoading { diff --git a/Sora/Views/SettingsView/SettingsSubViews/SettingsViewLoggerFilter.swift b/Sora/Views/SettingsView/SettingsSubViews/SettingsViewLoggerFilter.swift index 3b6e3c7..b3e85e8 100644 --- a/Sora/Views/SettingsView/SettingsSubViews/SettingsViewLoggerFilter.swift +++ b/Sora/Views/SettingsView/SettingsSubViews/SettingsViewLoggerFilter.swift @@ -177,7 +177,7 @@ struct SettingsViewLoggerFilter: View { } var body: some View { - ScrollView { + ScrollView(showsIndicators: false) { VStack(spacing: 24) { SettingsSection(title: NSLocalizedString("Log Types", comment: "")) { ForEach($viewModel.filters) { $filter in diff --git a/Sora/Views/SettingsView/SettingsSubViews/SettingsViewModule.swift b/Sora/Views/SettingsView/SettingsSubViews/SettingsViewModule.swift index 9e03433..b8ac26b 100644 --- a/Sora/Views/SettingsView/SettingsSubViews/SettingsViewModule.swift +++ b/Sora/Views/SettingsView/SettingsSubViews/SettingsViewModule.swift @@ -160,7 +160,7 @@ struct SettingsViewModule: View { @State private var showLibrary = false var body: some View { - ScrollView { + ScrollView(showsIndicators: false) { VStack(spacing: 24) { if moduleManager.modules.isEmpty { SettingsSection(title: NSLocalizedString("Modules", comment: "")) { diff --git a/Sora/Views/SettingsView/SettingsSubViews/SettingsViewPlayer.swift b/Sora/Views/SettingsView/SettingsSubViews/SettingsViewPlayer.swift index 501128a..468c17f 100644 --- a/Sora/Views/SettingsView/SettingsSubViews/SettingsViewPlayer.swift +++ b/Sora/Views/SettingsView/SettingsSubViews/SettingsViewPlayer.swift @@ -212,7 +212,7 @@ struct SettingsViewPlayer: View { private let qualityOptions = VideoQualityPreference.allCases.map { $0.rawValue } var body: some View { - ScrollView { + ScrollView(showsIndicators: false) { VStack(spacing: 24) { SettingsSection( title: NSLocalizedString("Media Player", comment: ""), diff --git a/Sora/Views/SettingsView/SettingsSubViews/SettingsViewTrackers.swift b/Sora/Views/SettingsView/SettingsSubViews/SettingsViewTrackers.swift index 0ff5bab..65c489e 100644 --- a/Sora/Views/SettingsView/SettingsSubViews/SettingsViewTrackers.swift +++ b/Sora/Views/SettingsView/SettingsSubViews/SettingsViewTrackers.swift @@ -115,7 +115,7 @@ struct SettingsViewTrackers: View { @State private var isTraktLoading: Bool = false var body: some View { - ScrollView { + ScrollView(showsIndicators: false) { VStack(spacing: 24) { SettingsSection(title: NSLocalizedString("AniList", comment: "")) { VStack(spacing: 0) { diff --git a/Sora/Views/SettingsView/SettingsView.swift b/Sora/Views/SettingsView/SettingsView.swift index 9c01e25..e50f899 100644 --- a/Sora/Views/SettingsView/SettingsView.swift +++ b/Sora/Views/SettingsView/SettingsView.swift @@ -131,10 +131,11 @@ struct SettingsView: View { @Environment(\.colorScheme) var colorScheme @StateObject var settings = Settings() @EnvironmentObject var moduleManager: ModuleManager + @State private var isNavigationActive = false var body: some View { NavigationView { - ScrollView { + ScrollView(showsIndicators: false) { VStack(spacing: 24) { Text("Settings") .font(.largeTitle) @@ -150,7 +151,7 @@ struct SettingsView: View { .foregroundStyle(.gray) .padding(.horizontal, 20) - NavigationLink(destination: SettingsViewModule()) { + NavigationLink(destination: SettingsViewModule().navigationBarBackButtonHidden(false)) { ModulePreviewRow() } .padding(.horizontal, 20) @@ -163,22 +164,22 @@ struct SettingsView: View { .padding(.horizontal, 20) VStack(spacing: 0) { - NavigationLink(destination: SettingsViewGeneral()) { + NavigationLink(destination: SettingsViewGeneral().navigationBarBackButtonHidden(false)) { SettingsNavigationRow(icon: "gearshape", titleKey: "General Preferences") } Divider().padding(.horizontal, 16) - NavigationLink(destination: SettingsViewPlayer()) { + NavigationLink(destination: SettingsViewPlayer().navigationBarBackButtonHidden(false)) { SettingsNavigationRow(icon: "play.circle", titleKey: "Video Player") } Divider().padding(.horizontal, 16) - NavigationLink(destination: SettingsViewDownloads()) { + NavigationLink(destination: SettingsViewDownloads().navigationBarBackButtonHidden(false)) { SettingsNavigationRow(icon: "arrow.down.circle", titleKey: "Downloads") } Divider().padding(.horizontal, 16) - NavigationLink(destination: SettingsViewTrackers()) { + NavigationLink(destination: SettingsViewTrackers().navigationBarBackButtonHidden(false)) { SettingsNavigationRow(icon: "square.stack.3d.up", titleKey: "Trackers") } } @@ -208,12 +209,12 @@ struct SettingsView: View { .padding(.horizontal, 20) VStack(spacing: 0) { - NavigationLink(destination: SettingsViewData()) { + NavigationLink(destination: SettingsViewData().navigationBarBackButtonHidden(false)) { SettingsNavigationRow(icon: "folder", titleKey: "Data") } Divider().padding(.horizontal, 16) - NavigationLink(destination: SettingsViewLogger()) { + NavigationLink(destination: SettingsViewLogger().navigationBarBackButtonHidden(false)) { SettingsNavigationRow(icon: "doc.text", titleKey: "Logs") } } @@ -243,7 +244,7 @@ struct SettingsView: View { .padding(.horizontal, 20) VStack(spacing: 0) { - NavigationLink(destination: SettingsViewAbout()) { + NavigationLink(destination: SettingsViewAbout().navigationBarBackButtonHidden(false)) { SettingsNavigationRow(icon: "info.circle", titleKey: "About Sora") } Divider().padding(.horizontal, 16)