diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 7fe87256..22fcf935 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -6,7 +6,7 @@ on: types: [closed] env: DEVELOPER_DIR: /Applications/Xcode_14.1.app - APP_VERSION: '2.5.0' + APP_VERSION: '2.5.1' SCHEME_NAME: 'EhPanda' ALTSTORE_JSON_PATH: './AltStore.json' BUILDS_PATH: '/tmp/action-builds' diff --git a/EhPanda/App/Constant.strings b/EhPanda/App/Constant.strings index b0eaa43a..0e022ce4 100644 --- a/EhPanda/App/Constant.strings +++ b/EhPanda/App/Constant.strings @@ -41,7 +41,7 @@ "ehpanda.code.level.contributors.link.xioxin" = "https://github.com/xioxin"; "ehpanda.code.level.contributors.link.EthanChinCN" = "https://github.com/EthanChinCN"; "ehpanda.code.level.contributors.link.leng-yue" = "https://github.com/leng-yue"; -"ehpanda.code.level.contributors.text.tatsuz0u" = "Tatsuzou Araki"; +"ehpanda.code.level.contributors.text.tatsuz0u" = "Tatsuzo Araki"; "ehpanda.code.level.contributors.text.chihchy" = "Chihchy"; "ehpanda.code.level.contributors.text.xioxin" = "xioxin"; "ehpanda.code.level.contributors.text.EthanChinCN" = "Ethan Chin"; @@ -52,7 +52,7 @@ "ehpanda.translation.contributors.link.PaulHaeussler" = "https://github.com/PaulHaeussler"; "ehpanda.translation.contributors.link.caxerx" = "https://github.com/caxerx"; "ehpanda.translation.contributors.link.nyaanim" = "https://github.com/nyaanim"; -"ehpanda.translation.contributors.text.tatsuz0u" = "Tatsuzou Araki"; +"ehpanda.translation.contributors.text.tatsuz0u" = "Tatsuzo Araki"; "ehpanda.translation.contributors.text.PaulHaeussler" = "PaulHaeussler"; "ehpanda.translation.contributors.text.caxerx" = "caxerx"; "ehpanda.translation.contributors.text.nyaanim" = "nyaanim"; diff --git a/EhPanda/App/Icons/AppIcon_Developer@2x.png b/EhPanda/App/Icons/AppIcon_Developer@2x.png index 9b1abb79..8719f7fc 100644 Binary files a/EhPanda/App/Icons/AppIcon_Developer@2x.png and b/EhPanda/App/Icons/AppIcon_Developer@2x.png differ diff --git a/EhPanda/App/Icons/AppIcon_Developer@3x.png b/EhPanda/App/Icons/AppIcon_Developer@3x.png index 33936b74..8b4bd077 100644 Binary files a/EhPanda/App/Icons/AppIcon_Developer@3x.png and b/EhPanda/App/Icons/AppIcon_Developer@3x.png differ diff --git a/EhPanda/App/Icons/AppIcon_Developer_iPad.png b/EhPanda/App/Icons/AppIcon_Developer_iPad.png index 75a11e4f..783456cf 100644 Binary files a/EhPanda/App/Icons/AppIcon_Developer_iPad.png and b/EhPanda/App/Icons/AppIcon_Developer_iPad.png differ diff --git a/EhPanda/App/Icons/AppIcon_Developer_iPad@2x.png b/EhPanda/App/Icons/AppIcon_Developer_iPad@2x.png index 71059b9d..98feb406 100644 Binary files a/EhPanda/App/Icons/AppIcon_Developer_iPad@2x.png and b/EhPanda/App/Icons/AppIcon_Developer_iPad@2x.png differ diff --git a/EhPanda/App/Icons/AppIcon_Developer_iPad_Pro@2x.png b/EhPanda/App/Icons/AppIcon_Developer_iPad_Pro@2x.png index f36c9a3b..155947de 100644 Binary files a/EhPanda/App/Icons/AppIcon_Developer_iPad_Pro@2x.png and b/EhPanda/App/Icons/AppIcon_Developer_iPad_Pro@2x.png differ diff --git a/EhPanda/App/Tools/Utilities/URLUtil.swift b/EhPanda/App/Tools/Utilities/URLUtil.swift index ebd5b419..82b618a1 100644 --- a/EhPanda/App/Tools/Utilities/URLUtil.swift +++ b/EhPanda/App/Tools/Utilities/URLUtil.swift @@ -9,66 +9,36 @@ import Foundation struct URLUtil { // Fetch - static func searchList(keyword: String, filter: Filter, pageNum: Int? = nil) -> URL { - var queryItems: [Defaults.URL.Component.Key: String] = [.fSearch: keyword] - if let pageNum = pageNum { - queryItems[.page] = String(pageNum) - } - return Defaults.URL.host.appending(queryItems: queryItems).applyingFilter(filter) + static func searchList(keyword: String, filter: Filter) -> URL { + Defaults.URL.host.appending(queryItems: [.fSearch: keyword]).applyingFilter(filter) } - static func moreSearchList(keyword: String, filter: Filter, pageNum: Int, lastID: String) -> URL { - var queryItems: [Defaults.URL.Component.Key: String] = [.fSearch: keyword] - if AppUtil.galleryHost == .ehentai { - queryItems[.page] = String(pageNum) - queryItems[.from] = lastID - } else { - queryItems[.next] = lastID - } - return Defaults.URL.host.appending(queryItems: queryItems).applyingFilter(filter) + static func moreSearchList(keyword: String, filter: Filter, lastID: String) -> URL { + Defaults.URL.host.appending(queryItems: [.fSearch: keyword, .next: lastID]).applyingFilter(filter) } - static func frontpageList(filter: Filter, pageNum: Int? = nil) -> URL { - var url = Defaults.URL.host - if let pageNum = pageNum { - url.append(queryItems: [.page: String(pageNum)]) - } - return url.applyingFilter(filter) + static func frontpageList(filter: Filter) -> URL { + Defaults.URL.host.applyingFilter(filter) } - static func moreFrontpageList(filter: Filter, pageNum: Int, lastID: String) -> URL { - var queryItems = [Defaults.URL.Component.Key: String]() - if AppUtil.galleryHost == .ehentai { - queryItems[.page] = String(pageNum) - queryItems[.from] = lastID - } else { - queryItems[.next] = lastID - } - return Defaults.URL.host.appending(queryItems: queryItems).applyingFilter(filter) + static func moreFrontpageList(filter: Filter, lastID: String) -> URL { + Defaults.URL.host.appending(queryItems: [.next: lastID]).applyingFilter(filter) } static func popularList(filter: Filter) -> URL { Defaults.URL.popular.applyingFilter(filter) } - static func watchedList(filter: Filter, pageNum: Int? = nil, keyword: String = "") -> URL { + static func watchedList(filter: Filter, keyword: String = "") -> URL { var url = Defaults.URL.watched - if let pageNum = pageNum { - url.append(queryItems: [.page: String(pageNum)]) - } if !keyword.isEmpty { url.append(queryItems: [.fSearch: keyword]) } return url.applyingFilter(filter) } - static func moreWatchedList(filter: Filter, pageNum: Int, lastID: String, keyword: String = "") -> URL { - var url: URL - if AppUtil.galleryHost == .ehentai { - url = Defaults.URL.watched.appending(queryItems: [.page: String(pageNum), .from: lastID]) - } else { - url = Defaults.URL.watched.appending(queryItems: [.next: lastID]) - } + static func moreWatchedList(filter: Filter, lastID: String, keyword: String = "") -> URL { + var url = Defaults.URL.watched.appending(queryItems: [.next: lastID]) if !keyword.isEmpty { url.append(queryItems: [.fSearch: keyword]) } @@ -77,7 +47,6 @@ struct URLUtil { static func favoritesList( favIndex: Int, - pageNum: Int? = nil, keyword: String = "", sortOrder: FavoritesSortOrder? = nil ) -> URL { @@ -87,9 +56,6 @@ struct URLUtil { } else { url.append(queryItems: [.favcat: .all]) } - if let pageNum = pageNum { - url.append(queryItems: [.page: String(pageNum)]) - } if !keyword.isEmpty { url.append(queryItems: [.fSearch: keyword]) url.append(queryItems: [.sn: .filterOn, .st: .filterOn, .sf: .filterOn]) @@ -105,23 +71,11 @@ struct URLUtil { static func moreFavoritesList( favIndex: Int, - pageNum: Int, lastID: String, - lastTimestamp: String? = nil, + lastTimestamp: String, keyword: String = "" ) -> URL { - var url: URL - if AppUtil.galleryHost == .ehentai { - url = Defaults.URL.favorites.appending(queryItems: [.page: String(pageNum), .from: lastID]) - } else { - var queryItems: [Defaults.URL.Component.Key: String] - if let lastTimestamp { - queryItems = [.next: [lastID, lastTimestamp].joined(separator: "-")] - } else { - queryItems = [.next: lastID] - } - url = Defaults.URL.favorites.appending(queryItems: queryItems) - } + var url = Defaults.URL.favorites.appending(queryItems: [.next: [lastID, lastTimestamp].joined(separator: "-")]) if favIndex != -1 { url.append(queryItems: [.favcat: String(favIndex)]) } else { diff --git a/EhPanda/Models/Support/Misc.swift b/EhPanda/Models/Support/Misc.swift index 6c59902c..d84560c0 100644 --- a/EhPanda/Models/Support/Misc.swift +++ b/EhPanda/Models/Support/Misc.swift @@ -29,15 +29,13 @@ struct PageNumber: Equatable { var current = 0 var maximum = 0 var lastItemTimestamp: String? - var isNextButtonEnabled = true + var isNextButtonEnabled = false var isSinglePage: Bool { current == 0 && maximum == 0 } - var hasNextPage: Bool { - AppUtil.galleryHost == .ehentai - ? current < maximum - : isNextButtonEnabled + func hasNextPage(isNumericBased: Bool = false) -> Bool { + isNumericBased ? current < maximum : isNextButtonEnabled } mutating func resetPages() { self = Self() diff --git a/EhPanda/Network/Request.swift b/EhPanda/Network/Request.swift index 98f6e1fa..d6858032 100644 --- a/EhPanda/Network/Request.swift +++ b/EhPanda/Network/Request.swift @@ -138,11 +138,10 @@ struct TagTranslatorRequest: Request { struct SearchGalleriesRequest: Request { let keyword: String let filter: Filter - var pageNum: Int? var publisher: AnyPublisher<(PageNumber, [Gallery]), AppError> { URLSession.shared.dataTaskPublisher( - for: URLUtil.searchList(keyword: keyword, filter: filter, pageNum: pageNum) + for: URLUtil.searchList(keyword: keyword, filter: filter) ) .genericRetry() .tryMap { try Kanna.HTML(html: $0.data, encoding: .utf8) } @@ -156,13 +155,10 @@ struct MoreSearchGalleriesRequest: Request { let keyword: String let filter: Filter let lastID: String - let pageNum: Int var publisher: AnyPublisher<(PageNumber, [Gallery]), AppError> { URLSession.shared.dataTaskPublisher( - for: URLUtil.moreSearchList( - keyword: keyword, filter: filter, pageNum: pageNum, lastID: lastID - ) + for: URLUtil.moreSearchList(keyword: keyword, filter: filter, lastID: lastID) ) .genericRetry() .tryMap { try Kanna.HTML(html: $0.data, encoding: .utf8) } @@ -174,10 +170,9 @@ struct MoreSearchGalleriesRequest: Request { struct FrontpageGalleriesRequest: Request { let filter: Filter - var pageNum: Int? var publisher: AnyPublisher<(PageNumber, [Gallery]), AppError> { - URLSession.shared.dataTaskPublisher(for: URLUtil.frontpageList(filter: filter, pageNum: pageNum)) + URLSession.shared.dataTaskPublisher(for: URLUtil.frontpageList(filter: filter)) .genericRetry() .tryMap { try Kanna.HTML(html: $0.data, encoding: .utf8) } .tryMap { (Parser.parsePageNum(doc: $0), try Parser.parseGalleries(doc: $0)) } @@ -189,19 +184,14 @@ struct FrontpageGalleriesRequest: Request { struct MoreFrontpageGalleriesRequest: Request { let filter: Filter let lastID: String - let pageNum: Int var publisher: AnyPublisher<(PageNumber, [Gallery]), AppError> { - URLSession.shared.dataTaskPublisher( - for: URLUtil.moreFrontpageList( - filter: filter, pageNum: pageNum, lastID: lastID - ) - ) - .genericRetry() - .tryMap { try Kanna.HTML(html: $0.data, encoding: .utf8) } - .tryMap { (Parser.parsePageNum(doc: $0), try Parser.parseGalleries(doc: $0)) } - .mapError(mapAppError) - .eraseToAnyPublisher() + URLSession.shared.dataTaskPublisher(for: URLUtil.moreFrontpageList(filter: filter, lastID: lastID)) + .genericRetry() + .tryMap { try Kanna.HTML(html: $0.data, encoding: .utf8) } + .tryMap { (Parser.parsePageNum(doc: $0), try Parser.parseGalleries(doc: $0)) } + .mapError(mapAppError) + .eraseToAnyPublisher() } } @@ -220,34 +210,26 @@ struct PopularGalleriesRequest: Request { struct WatchedGalleriesRequest: Request { let filter: Filter - var pageNum: Int? let keyword: String var publisher: AnyPublisher<(PageNumber, [Gallery]), AppError> { - URLSession.shared.dataTaskPublisher( - for: URLUtil.watchedList( - filter: filter, pageNum: pageNum, keyword: keyword - ) - ) - .genericRetry() - .tryMap { try Kanna.HTML(html: $0.data, encoding: .utf8) } - .tryMap { (Parser.parsePageNum(doc: $0), try Parser.parseGalleries(doc: $0)) } - .mapError(mapAppError) - .eraseToAnyPublisher() + URLSession.shared.dataTaskPublisher(for: URLUtil.watchedList(filter: filter, keyword: keyword)) + .genericRetry() + .tryMap { try Kanna.HTML(html: $0.data, encoding: .utf8) } + .tryMap { (Parser.parsePageNum(doc: $0), try Parser.parseGalleries(doc: $0)) } + .mapError(mapAppError) + .eraseToAnyPublisher() } } struct MoreWatchedGalleriesRequest: Request { let filter: Filter let lastID: String - let pageNum: Int let keyword: String var publisher: AnyPublisher<(PageNumber, [Gallery]), AppError> { URLSession.shared.dataTaskPublisher( - for: URLUtil.moreWatchedList( - filter: filter, pageNum: pageNum, lastID: lastID, keyword: keyword - ) + for: URLUtil.moreWatchedList(filter: filter, lastID: lastID, keyword: keyword) ) .genericRetry() .tryMap { try Kanna.HTML(html: $0.data, encoding: .utf8) } @@ -259,13 +241,12 @@ struct MoreWatchedGalleriesRequest: Request { struct FavoritesGalleriesRequest: Request { let favIndex: Int - var pageNum: Int? let keyword: String var sortOrder: FavoritesSortOrder? var publisher: AnyPublisher<(PageNumber, FavoritesSortOrder?, [Gallery]), AppError> { URLSession.shared.dataTaskPublisher( - for: URLUtil.favoritesList(favIndex: favIndex, pageNum: pageNum, keyword: keyword, sortOrder: sortOrder) + for: URLUtil.favoritesList(favIndex: favIndex, keyword: keyword, sortOrder: sortOrder) ) .genericRetry() .tryMap { try Kanna.HTML(html: $0.data, encoding: .utf8) } @@ -284,14 +265,13 @@ struct FavoritesGalleriesRequest: Request { struct MoreFavoritesGalleriesRequest: Request { let favIndex: Int let lastID: String - var lastTimestamp: String? - let pageNum: Int + var lastTimestamp: String let keyword: String var publisher: AnyPublisher<(PageNumber, FavoritesSortOrder?, [Gallery]), AppError> { URLSession.shared.dataTaskPublisher( for: URLUtil.moreFavoritesList( - favIndex: favIndex, pageNum: pageNum, lastID: lastID, lastTimestamp: lastTimestamp, keyword: keyword + favIndex: favIndex, lastID: lastID, lastTimestamp: lastTimestamp, keyword: keyword ) ) .genericRetry() diff --git a/EhPanda/View/Detail/DataFlow/DetailSearchStore.swift b/EhPanda/View/Detail/DataFlow/DetailSearchStore.swift index 7b379e0d..3c91db39 100644 --- a/EhPanda/View/Detail/DataFlow/DetailSearchStore.swift +++ b/EhPanda/View/Detail/DataFlow/DetailSearchStore.swift @@ -24,9 +24,6 @@ struct DetailSearchState: Equatable { @BindableState var route: Route? @BindableState var keyword = "" var lastKeyword = "" - @BindableState var jumpPageIndex = "" - @BindableState var jumpPageAlertFocused = false - @BindableState var jumpPageAlertPresented = false var galleries = [Gallery]() var pageNumber = PageNumber() @@ -51,12 +48,8 @@ enum DetailSearchAction: BindableAction { case setNavigation(DetailSearchState.Route?) case clearSubStates - case performJumpPage - case presentJumpPageAlert - case setJumpPageAlertFocused(Bool) - case teardown - case fetchGalleries(Int? = nil, String? = nil) + case fetchGalleries(String? = nil) case fetchGalleriesDone(Result<(PageNumber, [Gallery]), AppError>) case fetchMoreGalleries case fetchMoreGalleriesDone(Result<(PageNumber, [Gallery]), AppError>) @@ -85,12 +78,6 @@ let detailSearchReducer = Reducer 0, index <= state.pageNumber.maximum + 1 else { - return environment.hapticClient.generateNotificationFeedback(.error).fireAndForget() - } - return .init(value: .fetchGalleries(index - 1)) - - case .presentJumpPageAlert: - state.jumpPageAlertPresented = true - return environment.hapticClient.generateFeedback(.light).fireAndForget() - - case .setJumpPageAlertFocused(let isFocused): - state.jumpPageAlertFocused = isFocused - return .none - case .teardown: return .cancel(id: DetailSearchState.CancelID()) - case .fetchGalleries(let pageNum, let keyword): + case .fetchGalleries(let keyword): guard state.loadingState != .loading else { return .none } if let keyword = keyword { state.keyword = keyword @@ -139,8 +112,8 @@ let detailSearchReducer = Reducer] = [ environment.databaseClient.cacheGalleries(galleries).fireAndForget() ] - if galleries.isEmpty, pageNumber.hasNextPage { + if galleries.isEmpty, pageNumber.hasNextPage() { effects.append(.init(value: .fetchMoreGalleries)) } else if !galleries.isEmpty { state.loadingState = .idle diff --git a/EhPanda/View/Detail/DetailSearchView.swift b/EhPanda/View/Detail/DetailSearchView.swift index e3e081b1..8460d664 100644 --- a/EhPanda/View/Detail/DetailSearchView.swift +++ b/EhPanda/View/Detail/DetailSearchView.swift @@ -63,7 +63,7 @@ struct DetailSearchView: View { store: store.scope(state: \.quickDetailSearchState, action: DetailSearchAction.quickSearch) ) { keyword in viewStore.send(.setNavigation(nil)) - viewStore.send(.fetchGalleries(nil, keyword)) + viewStore.send(.fetchGalleries(keyword)) } .accentColor(setting.accentColor) .autoBlur(radius: blurRadius) @@ -72,14 +72,6 @@ struct DetailSearchView: View { FiltersView(store: store.scope(state: \.filtersState, action: DetailSearchAction.filters)) .accentColor(setting.accentColor).autoBlur(radius: blurRadius) } - .jumpPageAlert( - index: viewStore.binding(\.$jumpPageIndex), - isPresented: viewStore.binding(\.$jumpPageAlertPresented), - isFocused: viewStore.binding(\.$jumpPageAlertFocused), - pageNumber: viewStore.pageNumber, - jumpAction: { viewStore.send(.performJumpPage) } - ) - .animation(.default, value: viewStore.jumpPageAlertPresented) .searchable(text: viewStore.binding(\.$keyword)) { TagSuggestionView( keyword: viewStore.binding(\.$keyword), translations: tagTranslator.translations, @@ -92,7 +84,7 @@ struct DetailSearchView: View { .onAppear { if viewStore.galleries.isEmpty { DispatchQueue.main.async { - viewStore.send(.fetchGalleries(nil, keyword)) + viewStore.send(.fetchGalleries(keyword)) } } } @@ -113,7 +105,7 @@ struct DetailSearchView: View { } } private func toolbar() -> some ToolbarContent { - CustomToolbarItem(disabled: viewStore.jumpPageAlertPresented) { + CustomToolbarItem { ToolbarFeaturesMenu { FiltersButton { viewStore.send(.setNavigation(.filters)) @@ -121,14 +113,6 @@ struct DetailSearchView: View { QuickSearchButton { viewStore.send(.setNavigation(.quickSearch)) } - if AppUtil.galleryHost == .ehentai { - JumpPageButton(pageNumber: viewStore.pageNumber) { - viewStore.send(.presentJumpPageAlert) - DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { - viewStore.send(.setJumpPageAlertFocused(true)) - } - } - } } } } diff --git a/EhPanda/View/Favorites/FavoritesStore.swift b/EhPanda/View/Favorites/FavoritesStore.swift index 4fce53e6..e7f5d89e 100644 --- a/EhPanda/View/Favorites/FavoritesStore.swift +++ b/EhPanda/View/Favorites/FavoritesStore.swift @@ -22,9 +22,6 @@ struct FavoritesState: Equatable { @BindableState var route: Route? @BindableState var keyword = "" - @BindableState var jumpPageIndex = "" - @BindableState var jumpPageAlertFocused = false - @BindableState var jumpPageAlertPresented = false var index = -1 var sortOrder: FavoritesSortOrder? @@ -67,11 +64,7 @@ enum FavoritesAction: BindableAction { case clearSubStates case onNotLoginViewButtonTapped - case performJumpPage - case presentJumpPageAlert - case setJumpPageAlertFocused(Bool) - - case fetchGalleries(Int? = nil, String? = nil, FavoritesSortOrder? = nil) + case fetchGalleries(String? = nil, FavoritesSortOrder? = nil) case fetchGalleriesDone(Int, Result<(PageNumber, FavoritesSortOrder?, [Gallery]), AppError>) case fetchMoreGalleries case fetchMoreGalleriesDone(Int, Result<(PageNumber, FavoritesSortOrder?, [Gallery]), AppError>) @@ -102,12 +95,6 @@ let favoritesReducer = Reducer 0, index <= pageNumber.maximum + 1 - else { - return environment.hapticClient.generateNotificationFeedback(.error).fireAndForget() - } - return .init(value: .fetchGalleries(index - 1)) - - case .presentJumpPageAlert: - state.jumpPageAlertPresented = true - return environment.hapticClient.generateFeedback(.light).fireAndForget() - - case .setJumpPageAlertFocused(let isFocused): - state.jumpPageAlertFocused = isFocused - return .none - - case .fetchGalleries(let pageNum, let keyword, let sortOrder): + case .fetchGalleries(let keyword, let sortOrder): guard state.loadingState != .loading else { return .none } state.rawLoadingState[state.index] = .loading if let keyword = keyword { @@ -156,7 +126,7 @@ let favoritesReducer = Reducer] = [ environment.databaseClient.cacheGalleries(galleries).fireAndForget() ] - if galleries.isEmpty, pageNumber.hasNextPage { + if galleries.isEmpty, pageNumber.hasNextPage() { effects.append(.init(value: .fetchMoreGalleries)) } else if !galleries.isEmpty { state.rawLoadingState[targetFavIndex] = .idle diff --git a/EhPanda/View/Favorites/FavoritesView.swift b/EhPanda/View/Favorites/FavoritesView.swift index fd75f540..8c70e7f9 100644 --- a/EhPanda/View/Favorites/FavoritesView.swift +++ b/EhPanda/View/Favorites/FavoritesView.swift @@ -74,19 +74,11 @@ struct FavoritesView: View { store: store.scope(state: \.quickSearchState, action: FavoritesAction.quickSearch) ) { keyword in viewStore.send(.setNavigation(nil)) - viewStore.send(.fetchGalleries(nil, keyword)) + viewStore.send(.fetchGalleries(keyword)) } .accentColor(setting.accentColor) .autoBlur(radius: blurRadius) } - .jumpPageAlert( - index: viewStore.binding(\.$jumpPageIndex), - isPresented: viewStore.binding(\.$jumpPageAlertPresented), - isFocused: viewStore.binding(\.$jumpPageAlertFocused), - pageNumber: viewStore.pageNumber ?? .init(), - jumpAction: { viewStore.send(.performJumpPage) } - ) - .animation(.default, value: viewStore.jumpPageAlertPresented) .searchable(text: viewStore.binding(\.$keyword)) { TagSuggestionView( keyword: viewStore.binding(\.$keyword), translations: tagTranslator.translations, @@ -121,7 +113,7 @@ struct FavoritesView: View { } } private func toolbar() -> some ToolbarContent { - CustomToolbarItem(tint: .primary, disabled: viewStore.jumpPageAlertPresented) { + CustomToolbarItem(tint: .primary) { FavoritesIndexMenu(user: user, index: viewStore.index) { index in if index != viewStore.index { viewStore.send(.setFavoritesIndex(index)) @@ -129,21 +121,11 @@ struct FavoritesView: View { } SortOrderMenu(sortOrder: viewStore.sortOrder) { order in if viewStore.sortOrder != order { - viewStore.send(.fetchGalleries(nil, nil, order)) + viewStore.send(.fetchGalleries(nil, order)) } } - ToolbarFeaturesMenu(symbolRenderingMode: .hierarchical) { - QuickSearchButton { - viewStore.send(.setNavigation(.quickSearch)) - } - if AppUtil.galleryHost == .ehentai { - JumpPageButton(pageNumber: viewStore.pageNumber ?? .init()) { - viewStore.send(.presentJumpPageAlert) - DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { - viewStore.send(.setJumpPageAlertFocused(true)) - } - } - } + QuickSearchButton(hideText: true) { + viewStore.send(.setNavigation(.quickSearch)) } } } diff --git a/EhPanda/View/Home/DataFlow/FrontpageStore.swift b/EhPanda/View/Home/DataFlow/FrontpageStore.swift index 169d97d6..de934c37 100644 --- a/EhPanda/View/Home/DataFlow/FrontpageStore.swift +++ b/EhPanda/View/Home/DataFlow/FrontpageStore.swift @@ -22,9 +22,6 @@ struct FrontpageState: Equatable { @BindableState var route: Route? @BindableState var keyword = "" - @BindableState var jumpPageIndex = "" - @BindableState var jumpPageAlertFocused = false - @BindableState var jumpPageAlertPresented = false var filteredGalleries: [Gallery] { guard !keyword.isEmpty else { return galleries } @@ -52,12 +49,8 @@ enum FrontpageAction: BindableAction { case setNavigation(FrontpageState.Route?) case clearSubStates - case performJumpPage - case presentJumpPageAlert - case setJumpPageAlertFocused(Bool) - case teardown - case fetchGalleries(Int? = nil) + case fetchGalleries case fetchGalleriesDone(Result<(PageNumber, [Gallery]), AppError>) case fetchMoreGalleries case fetchMoreGalleriesDone(Result<(PageNumber, [Gallery]), AppError>) @@ -85,12 +78,6 @@ let frontpageReducer = Reducer 0, index <= state.pageNumber.maximum + 1 else { - return environment.hapticClient.generateNotificationFeedback(.error).fireAndForget() - } - return .init(value: .fetchGalleries(index - 1)) - - case .presentJumpPageAlert: - state.jumpPageAlertPresented = true - return environment.hapticClient.generateFeedback(.light).fireAndForget() - - case .setJumpPageAlertFocused(let isFocused): - state.jumpPageAlertFocused = isFocused - return .none - case .teardown: return .cancel(id: FrontpageState.CancelID()) - case .fetchGalleries(let pageNum): + case .fetchGalleries: guard state.loadingState != .loading else { return .none } state.loadingState = .loading state.pageNumber.resetPages() let filter = environment.databaseClient.fetchFilterSynchronously(range: .global) - return FrontpageGalleriesRequest(filter: filter, pageNum: pageNum) - .effect.map(FrontpageAction.fetchGalleriesDone).cancellable(id: FrontpageState.CancelID()) + return FrontpageGalleriesRequest(filter: filter).effect + .map(FrontpageAction.fetchGalleriesDone) + .cancellable(id: FrontpageState.CancelID()) case .fetchGalleriesDone(let result): state.loadingState = .idle @@ -134,7 +108,7 @@ let frontpageReducer = Reducer] = [ environment.databaseClient.cacheGalleries(galleries).fireAndForget() ] - if galleries.isEmpty, pageNumber.hasNextPage { + if galleries.isEmpty, pageNumber.hasNextPage() { effects.append(.init(value: .fetchMoreGalleries)) } else if !galleries.isEmpty { state.loadingState = .idle diff --git a/EhPanda/View/Home/DataFlow/HomeStore.swift b/EhPanda/View/Home/DataFlow/HomeStore.swift index f90c6cc9..a51fc357 100644 --- a/EhPanda/View/Home/DataFlow/HomeStore.swift +++ b/EhPanda/View/Home/DataFlow/HomeStore.swift @@ -75,7 +75,7 @@ enum HomeAction: BindableAction { case fetchAllToplistsGalleries case fetchPopularGalleries case fetchPopularGalleriesDone(Result<[Gallery], AppError>) - case fetchFrontpageGalleries(Int? = nil) + case fetchFrontpageGalleries case fetchFrontpageGalleriesDone(Result<(PageNumber, [Gallery]), AppError>) case fetchToplistsGalleries(Int, Int? = nil) case fetchToplistsGalleriesDone(Int, Result<(PageNumber, [Gallery]), AppError>) @@ -145,7 +145,7 @@ let homeReducer = Reducer.combine( case .fetchAllGalleries: return .merge( .init(value: .fetchPopularGalleries), - .init(value: .fetchFrontpageGalleries()), + .init(value: .fetchFrontpageGalleries), .init(value: .fetchAllToplistsGalleries) ) @@ -178,11 +178,11 @@ let homeReducer = Reducer.combine( } return .none - case .fetchFrontpageGalleries(let pageNum): + case .fetchFrontpageGalleries: guard state.frontpageLoadingState != .loading else { return .none } state.frontpageLoadingState = .loading let filter = environment.databaseClient.fetchFilterSynchronously(range: .global) - return FrontpageGalleriesRequest(filter: filter, pageNum: pageNum) + return FrontpageGalleriesRequest(filter: filter) .effect.map(HomeAction.fetchFrontpageGalleriesDone) case .fetchFrontpageGalleriesDone(let result): diff --git a/EhPanda/View/Home/DataFlow/ToplistsStore.swift b/EhPanda/View/Home/DataFlow/ToplistsStore.swift index bfcd2eae..281a4f39 100644 --- a/EhPanda/View/Home/DataFlow/ToplistsStore.swift +++ b/EhPanda/View/Home/DataFlow/ToplistsStore.swift @@ -158,7 +158,7 @@ let toplistsReducer = Reducer] = [ environment.databaseClient.cacheGalleries(galleries).fireAndForget() ] - if galleries.isEmpty, pageNumber.hasNextPage { + if galleries.isEmpty, pageNumber.hasNextPage() { effects.append(.init(value: .fetchMoreGalleries)) } else if !galleries.isEmpty { state.rawLoadingState[type] = .idle diff --git a/EhPanda/View/Home/DataFlow/WatchedStore.swift b/EhPanda/View/Home/DataFlow/WatchedStore.swift index 905fbe81..ca63cd39 100644 --- a/EhPanda/View/Home/DataFlow/WatchedStore.swift +++ b/EhPanda/View/Home/DataFlow/WatchedStore.swift @@ -23,9 +23,6 @@ struct WatchedState: Equatable { @BindableState var route: Route? @BindableState var keyword = "" - @BindableState var jumpPageIndex = "" - @BindableState var jumpPageAlertFocused = false - @BindableState var jumpPageAlertPresented = false var galleries = [Gallery]() var pageNumber = PageNumber() @@ -51,12 +48,8 @@ enum WatchedAction: BindableAction { case clearSubStates case onNotLoginViewButtonTapped - case performJumpPage - case presentJumpPageAlert - case setJumpPageAlertFocused(Bool) - case teardown - case fetchGalleries(Int? = nil, String? = nil) + case fetchGalleries(String? = nil) case fetchGalleriesDone(Result<(PageNumber, [Gallery]), AppError>) case fetchMoreGalleries case fetchMoreGalleriesDone(Result<(PageNumber, [Gallery]), AppError>) @@ -85,12 +78,6 @@ let watchedReducer = Reducer.co case .binding(\.$route): return state.route == nil ? .init(value: .clearSubStates) : .none - case .binding(\.$jumpPageAlertPresented): - if !state.jumpPageAlertPresented { - state.jumpPageAlertFocused = false - } - return .none - case .binding: return .none @@ -110,24 +97,10 @@ let watchedReducer = Reducer.co case .onNotLoginViewButtonTapped: return .none - case .performJumpPage: - guard let index = Int(state.jumpPageIndex), index > 0, index <= state.pageNumber.maximum + 1 else { - return environment.hapticClient.generateNotificationFeedback(.error).fireAndForget() - } - return .init(value: .fetchGalleries(index - 1)) - - case .presentJumpPageAlert: - state.jumpPageAlertPresented = true - return environment.hapticClient.generateFeedback(.light).fireAndForget() - - case .setJumpPageAlertFocused(let isFocused): - state.jumpPageAlertFocused = isFocused - return .none - case .teardown: return .cancel(id: WatchedState.CancelID()) - case .fetchGalleries(let pageNum, let keyword): + case .fetchGalleries(let keyword): guard state.loadingState != .loading else { return .none } if let keyword = keyword { state.keyword = keyword @@ -135,7 +108,7 @@ let watchedReducer = Reducer.co state.loadingState = .loading state.pageNumber.resetPages() let filter = environment.databaseClient.fetchFilterSynchronously(range: .watched) - return WatchedGalleriesRequest(filter: filter, pageNum: pageNum, keyword: state.keyword) + return WatchedGalleriesRequest(filter: filter, keyword: state.keyword) .effect.map(WatchedAction.fetchGalleriesDone).cancellable(id: WatchedState.CancelID()) case .fetchGalleriesDone(let result): @@ -144,7 +117,7 @@ let watchedReducer = Reducer.co case .success(let (pageNumber, galleries)): guard !galleries.isEmpty else { state.loadingState = .failed(.notFound) - guard pageNumber.hasNextPage else { return .none } + guard pageNumber.hasNextPage() else { return .none } return .init(value: .fetchMoreGalleries) } state.pageNumber = pageNumber @@ -157,17 +130,15 @@ let watchedReducer = Reducer.co case .fetchMoreGalleries: let pageNumber = state.pageNumber - guard pageNumber.hasNextPage, + guard pageNumber.hasNextPage(), state.footerLoadingState != .loading, let lastID = state.galleries.last?.id else { return .none } state.footerLoadingState = .loading - let pageNum = pageNumber.current + 1 let filter = environment.databaseClient.fetchFilterSynchronously(range: .watched) - return MoreWatchedGalleriesRequest( - filter: filter, lastID: lastID, pageNum: pageNum, keyword: state.keyword - ) - .effect.map(WatchedAction.fetchMoreGalleriesDone).cancellable(id: WatchedState.CancelID()) + return MoreWatchedGalleriesRequest(filter: filter, lastID: lastID, keyword: state.keyword).effect + .map(WatchedAction.fetchMoreGalleriesDone) + .cancellable(id: WatchedState.CancelID()) case .fetchMoreGalleriesDone(let result): state.footerLoadingState = .idle @@ -179,7 +150,7 @@ let watchedReducer = Reducer.co var effects: [Effect] = [ environment.databaseClient.cacheGalleries(galleries).fireAndForget() ] - if galleries.isEmpty, pageNumber.hasNextPage { + if galleries.isEmpty, pageNumber.hasNextPage() { effects.append(.init(value: .fetchMoreGalleries)) } else if !galleries.isEmpty { state.loadingState = .idle diff --git a/EhPanda/View/Home/FrontpageView.swift b/EhPanda/View/Home/FrontpageView.swift index 4886ef45..e5a4150e 100644 --- a/EhPanda/View/Home/FrontpageView.swift +++ b/EhPanda/View/Home/FrontpageView.swift @@ -36,7 +36,7 @@ struct FrontpageView: View { pageNumber: viewStore.pageNumber, loadingState: viewStore.loadingState, footerLoadingState: viewStore.footerLoadingState, - fetchAction: { viewStore.send(.fetchGalleries()) }, + fetchAction: { viewStore.send(.fetchGalleries) }, fetchMoreAction: { viewStore.send(.fetchMoreGalleries) }, navigateAction: { viewStore.send(.setNavigation(.detail($0))) }, translateAction: { @@ -61,20 +61,11 @@ struct FrontpageView: View { FiltersView(store: store.scope(state: \.filtersState, action: FrontpageAction.filters)) .autoBlur(radius: blurRadius).environment(\.inSheet, true) } - .jumpPageAlert( - index: viewStore.binding(\.$jumpPageIndex), - isPresented: viewStore.binding(\.$jumpPageAlertPresented), - isFocused: viewStore.binding(\.$jumpPageAlertFocused), - pageNumber: viewStore.pageNumber, - jumpAction: { viewStore.send(.performJumpPage) } - ) .searchable(text: viewStore.binding(\.$keyword), prompt: R.string.localizable.searchablePromptFilter()) - .navigationBarBackButtonHidden(viewStore.jumpPageAlertPresented) - .animation(.default, value: viewStore.jumpPageAlertPresented) .onAppear { if viewStore.galleries.isEmpty { DispatchQueue.main.async { - viewStore.send(.fetchGalleries()) + viewStore.send(.fetchGalleries) } } } @@ -95,19 +86,9 @@ struct FrontpageView: View { } } private func toolbar() -> some ToolbarContent { - CustomToolbarItem(disabled: viewStore.jumpPageAlertPresented) { - ToolbarFeaturesMenu { - FiltersButton { - viewStore.send(.setNavigation(.filters)) - } - if AppUtil.galleryHost == .ehentai { - JumpPageButton(pageNumber: viewStore.pageNumber) { - viewStore.send(.presentJumpPageAlert) - DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { - viewStore.send(.setJumpPageAlertFocused(true)) - } - } - } + CustomToolbarItem { + FiltersButton(hideText: true) { + viewStore.send(.setNavigation(.filters)) } } } diff --git a/EhPanda/View/Home/HomeView.swift b/EhPanda/View/Home/HomeView.swift index b308e2da..638968b4 100644 --- a/EhPanda/View/Home/HomeView.swift +++ b/EhPanda/View/Home/HomeView.swift @@ -57,7 +57,7 @@ struct HomeView: View { isLoading: viewStore.frontpageLoadingState == .loading, navigateAction: navigateTo(gid:), showAllAction: { viewStore.send(.setNavigation(.section(.frontpage))) }, - reloadAction: { viewStore.send(.fetchFrontpageGalleries()) } + reloadAction: { viewStore.send(.fetchFrontpageGalleries) } ) } ToplistsSection( diff --git a/EhPanda/View/Home/WatchedView.swift b/EhPanda/View/Home/WatchedView.swift index bfc9819f..9e50266d 100644 --- a/EhPanda/View/Home/WatchedView.swift +++ b/EhPanda/View/Home/WatchedView.swift @@ -67,7 +67,7 @@ struct WatchedView: View { store: store.scope(state: \.quickSearchState, action: WatchedAction.quickSearch) ) { keyword in viewStore.send(.setNavigation(nil)) - viewStore.send(.fetchGalleries(nil, keyword)) + viewStore.send(.fetchGalleries(keyword)) } .accentColor(setting.accentColor) .autoBlur(radius: blurRadius) @@ -76,15 +76,6 @@ struct WatchedView: View { FiltersView(store: store.scope(state: \.filtersState, action: WatchedAction.filters)) .autoBlur(radius: blurRadius).environment(\.inSheet, true) } - .jumpPageAlert( - index: viewStore.binding(\.$jumpPageIndex), - isPresented: viewStore.binding(\.$jumpPageAlertPresented), - isFocused: viewStore.binding(\.$jumpPageAlertFocused), - pageNumber: viewStore.pageNumber, - jumpAction: { viewStore.send(.performJumpPage) } - ) - .animation(.default, value: viewStore.jumpPageAlertPresented) - .navigationBarBackButtonHidden(viewStore.jumpPageAlertPresented) .searchable(text: viewStore.binding(\.$keyword)) { TagSuggestionView( keyword: viewStore.binding(\.$keyword), translations: tagTranslator.translations, @@ -118,7 +109,7 @@ struct WatchedView: View { } } private func toolbar() -> some ToolbarContent { - CustomToolbarItem(disabled: viewStore.jumpPageAlertPresented) { + CustomToolbarItem { ToolbarFeaturesMenu { FiltersButton { viewStore.send(.setNavigation(.filters)) @@ -126,14 +117,6 @@ struct WatchedView: View { QuickSearchButton { viewStore.send(.setNavigation(.quickSearch)) } - if AppUtil.galleryHost == .ehentai { - JumpPageButton(pageNumber: viewStore.pageNumber) { - viewStore.send(.presentJumpPageAlert) - DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { - viewStore.send(.setJumpPageAlertFocused(true)) - } - } - } } } } diff --git a/EhPanda/View/Search/SearchRootStore.swift b/EhPanda/View/Search/SearchRootStore.swift index 9c6d40bd..aeb71a50 100644 --- a/EhPanda/View/Search/SearchRootStore.swift +++ b/EhPanda/View/Search/SearchRootStore.swift @@ -159,7 +159,7 @@ let searchRootReducer = Reducer) case fetchMoreGalleries case fetchMoreGalleriesDone(Result<(PageNumber, [Gallery]), AppError>) @@ -85,12 +78,6 @@ let searchReducer = Reducer.combin case .binding(\.$route): return state.route == nil ? .init(value: .clearSubStates) : .none - case .binding(\.$jumpPageAlertPresented): - if !state.jumpPageAlertPresented { - state.jumpPageAlertFocused = false - } - return .none - case .binding(\.$keyword): if !state.keyword.isEmpty { state.lastKeyword = state.keyword @@ -113,24 +100,10 @@ let searchReducer = Reducer.combin .init(value: .quickSearch(.teardown)) ) - case .performJumpPage: - guard let index = Int(state.jumpPageIndex), index > 0, index <= state.pageNumber.maximum + 1 else { - return environment.hapticClient.generateNotificationFeedback(.error).fireAndForget() - } - return .init(value: .fetchGalleries(index - 1)) - - case .presentJumpPageAlert: - state.jumpPageAlertPresented = true - return environment.hapticClient.generateFeedback(.light).fireAndForget() - - case .setJumpPageAlertFocused(let isFocused): - state.jumpPageAlertFocused = isFocused - return .none - case .teardown: return .cancel(id: SearchState.CancelID()) - case .fetchGalleries(let pageNum, let keyword): + case .fetchGalleries(let keyword): guard state.loadingState != .loading else { return .none } if let keyword = keyword { state.keyword = keyword @@ -139,8 +112,9 @@ let searchReducer = Reducer.combin state.loadingState = .loading state.pageNumber.resetPages() let filter = environment.databaseClient.fetchFilterSynchronously(range: .search) - return SearchGalleriesRequest(keyword: state.lastKeyword, filter: filter, pageNum: pageNum) - .effect.map(SearchAction.fetchGalleriesDone).cancellable(id: SearchState.CancelID()) + return SearchGalleriesRequest(keyword: state.lastKeyword, filter: filter).effect + .map(SearchAction.fetchGalleriesDone) + .cancellable(id: SearchState.CancelID()) case .fetchGalleriesDone(let result): state.loadingState = .idle @@ -148,7 +122,7 @@ let searchReducer = Reducer.combin case .success(let (pageNumber, galleries)): guard !galleries.isEmpty else { state.loadingState = .failed(.notFound) - guard pageNumber.hasNextPage else { return .none } + guard pageNumber.hasNextPage() else { return .none } return .init(value: .fetchMoreGalleries) } state.pageNumber = pageNumber @@ -161,17 +135,15 @@ let searchReducer = Reducer.combin case .fetchMoreGalleries: let pageNumber = state.pageNumber - guard pageNumber.hasNextPage, + guard pageNumber.hasNextPage(), state.footerLoadingState != .loading, let lastID = state.galleries.last?.id else { return .none } state.footerLoadingState = .loading - let pageNum = pageNumber.current + 1 let filter = environment.databaseClient.fetchFilterSynchronously(range: .search) - return MoreSearchGalleriesRequest( - keyword: state.lastKeyword, filter: filter, lastID: lastID, pageNum: pageNum - ) - .effect.map(SearchAction.fetchMoreGalleriesDone).cancellable(id: SearchState.CancelID()) + return MoreSearchGalleriesRequest(keyword: state.lastKeyword, filter: filter, lastID: lastID).effect + .map(SearchAction.fetchMoreGalleriesDone) + .cancellable(id: SearchState.CancelID()) case .fetchMoreGalleriesDone(let result): state.footerLoadingState = .idle @@ -183,7 +155,7 @@ let searchReducer = Reducer.combin var effects: [Effect] = [ environment.databaseClient.cacheGalleries(galleries).fireAndForget() ] - if galleries.isEmpty, pageNumber.hasNextPage { + if galleries.isEmpty, pageNumber.hasNextPage() { effects.append(.init(value: .fetchMoreGalleries)) } else if !galleries.isEmpty { state.loadingState = .idle diff --git a/EhPanda/View/Search/SearchView.swift b/EhPanda/View/Search/SearchView.swift index a9b7e69d..ceca4976 100644 --- a/EhPanda/View/Search/SearchView.swift +++ b/EhPanda/View/Search/SearchView.swift @@ -63,7 +63,7 @@ struct SearchView: View { store: store.scope(state: \.quickSearchState, action: SearchAction.quickSearch) ) { keyword in viewStore.send(.setNavigation(nil)) - viewStore.send(.fetchGalleries(nil, keyword)) + viewStore.send(.fetchGalleries(keyword)) } .accentColor(setting.accentColor) .autoBlur(radius: blurRadius) @@ -72,14 +72,6 @@ struct SearchView: View { FiltersView(store: store.scope(state: \.filtersState, action: SearchAction.filters)) .accentColor(setting.accentColor).autoBlur(radius: blurRadius) } - .jumpPageAlert( - index: viewStore.binding(\.$jumpPageIndex), - isPresented: viewStore.binding(\.$jumpPageAlertPresented), - isFocused: viewStore.binding(\.$jumpPageAlertFocused), - pageNumber: viewStore.pageNumber, - jumpAction: { viewStore.send(.performJumpPage) } - ) - .animation(.default, value: viewStore.jumpPageAlertPresented) .searchable(text: viewStore.binding(\.$keyword)) { TagSuggestionView( keyword: viewStore.binding(\.$keyword), translations: tagTranslator.translations, @@ -92,7 +84,7 @@ struct SearchView: View { .onAppear { if viewStore.galleries.isEmpty { DispatchQueue.main.async { - viewStore.send(.fetchGalleries(nil, keyword)) + viewStore.send(.fetchGalleries(keyword)) } } } @@ -113,7 +105,7 @@ struct SearchView: View { } } private func toolbar() -> some ToolbarContent { - CustomToolbarItem(disabled: viewStore.jumpPageAlertPresented) { + CustomToolbarItem { ToolbarFeaturesMenu { FiltersButton { viewStore.send(.setNavigation(.filters)) @@ -121,14 +113,6 @@ struct SearchView: View { QuickSearchButton { viewStore.send(.setNavigation(.quickSearch)) } - if AppUtil.galleryHost == .ehentai { - JumpPageButton(pageNumber: viewStore.pageNumber) { - viewStore.send(.presentJumpPageAlert) - DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { - viewStore.send(.setJumpPageAlertFocused(true)) - } - } - } } } } diff --git a/EhPanda/View/Support/Components/GenericList.swift b/EhPanda/View/Support/Components/GenericList.swift index b5c13631..71e98d91 100644 --- a/EhPanda/View/Support/Components/GenericList.swift +++ b/EhPanda/View/Support/Components/GenericList.swift @@ -99,7 +99,7 @@ private struct DetailList: View { guard let pageNumber = pageNumber else { return false } let isLastGallery = gallery == galleries.last - let isPageNumberValid = pageNumber.hasNextPage + let isPageNumberValid = pageNumber.hasNextPage() let isLoadingStateIdle = footerLoadingState == .idle return isLastGallery && isPageNumberValid && !isLoadingStateIdle @@ -145,7 +145,7 @@ private struct WaterfallList: View { private var shouldShowFooter: Bool { guard let pageNumber = pageNumber else { return false } - let isPageNumberValid = pageNumber.hasNextPage + let isPageNumberValid = pageNumber.hasNextPage() let isLoadingStateIdle = footerLoadingState == .idle return !isLoadingStateIdle && isPageNumberValid diff --git a/EhPanda/View/Support/Components/ToolbarItems.swift b/EhPanda/View/Support/Components/ToolbarItems.swift index 7845052c..9a86c7c3 100644 --- a/EhPanda/View/Support/Components/ToolbarItems.swift +++ b/EhPanda/View/Support/Components/ToolbarItems.swift @@ -72,16 +72,20 @@ struct FiltersButton: View { } struct QuickSearchButton: View { + private let hideText: Bool private let action: () -> Void - init(action: @escaping () -> Void) { + init(hideText: Bool = false, action: @escaping () -> Void) { + self.hideText = hideText self.action = action } var body: some View { Button(action: action) { Image(systemSymbol: .magnifyingglass) - Text(R.string.localizable.toolbarItemButtonQuickSearch()) + if !hideText { + Text(R.string.localizable.toolbarItemButtonQuickSearch()) + } } } }