diff --git a/app/components/UI/Predict/constants/feedConfig.ts b/app/components/UI/Predict/constants/feedConfig.ts index 9fef011b20d..96123142416 100644 --- a/app/components/UI/Predict/constants/feedConfig.ts +++ b/app/components/UI/Predict/constants/feedConfig.ts @@ -44,6 +44,8 @@ export interface PredictFeedTabConfig { export interface PredictFeedConfig { id: PredictFeedId; titleKey: string; + /** Whether the feed exposes user-selectable filter chips. Defaults to true. */ + showFilterBar?: boolean; header: { showBackButton: boolean; showSearchButton: boolean; @@ -189,6 +191,7 @@ export const PREDICT_FEED_REGISTRY: Record = { live: { id: 'live', titleKey: 'predict.feed.live', + showFilterBar: false, header: { showBackButton: true, showSearchButton: true, diff --git a/app/components/UI/Predict/hooks/usePredictFeedConfig.test.ts b/app/components/UI/Predict/hooks/usePredictFeedConfig.test.ts index 935e6c5f393..129b509bdd8 100644 --- a/app/components/UI/Predict/hooks/usePredictFeedConfig.test.ts +++ b/app/components/UI/Predict/hooks/usePredictFeedConfig.test.ts @@ -90,11 +90,23 @@ describe('usePredictFeedConfig', () => { }); describe('static-only feeds', () => { + it('hides the filter bar for the Live feed', () => { + const { result } = renderHook(() => usePredictFeedConfig('live')); + + expect(result.current.showFilterBar).toBe(false); + }); + it('exposes static filters and disables dynamic fetching', () => { const { result } = renderHook(() => usePredictFeedConfig('live')); expect(ids(result.current.filters)).toEqual(['live']); expect(result.current.filters[0].isDynamic).toBe(false); + expect(result.current.activeFilter?.params).toEqual({ + status: 'open', + order: 'volume24hr', + limit: 10, + live: true, + }); expect(result.current.dynamicFilters.status).toBe('idle'); expect(mockUsePredictFilterOptions).toHaveBeenCalledWith( { source: 'related-tags' }, diff --git a/app/components/UI/Predict/hooks/usePredictFeedConfig.ts b/app/components/UI/Predict/hooks/usePredictFeedConfig.ts index 6c1b34216a2..27395e57f1f 100644 --- a/app/components/UI/Predict/hooks/usePredictFeedConfig.ts +++ b/app/components/UI/Predict/hooks/usePredictFeedConfig.ts @@ -55,6 +55,8 @@ export interface PredictFeedConfigResult { tabs: PredictFeedTabSummary[]; /** Hidden for single-tab feeds; filters still render for that one tab. */ showTabBar: boolean; + /** Hidden when the active feed has no user-selectable filters. */ + showFilterBar: boolean; activeTabId?: string; setActiveTabId: (id: string) => void; /** Static + deduped dynamic filters for the active tab. */ @@ -356,6 +358,7 @@ export const usePredictFeedConfig = ( header: config?.header, tabs, showTabBar: tabs.length > 1, + showFilterBar: config?.showFilterBar ?? true, activeTabId: resolvedActiveTabId, setActiveTabId, filters, diff --git a/app/components/UI/Predict/views/PredictFeedView/PredictFeedView.test.tsx b/app/components/UI/Predict/views/PredictFeedView/PredictFeedView.test.tsx index 0f28fb762a3..7ecfaada68c 100644 --- a/app/components/UI/Predict/views/PredictFeedView/PredictFeedView.test.tsx +++ b/app/components/UI/Predict/views/PredictFeedView/PredictFeedView.test.tsx @@ -170,6 +170,7 @@ const feedConfigResult = ( { id: 'tennis', titleKey: 'predict.feed.tabs.tennis' }, ], showTabBar: true, + showFilterBar: true, activeTabId: 'basketball', setActiveTabId: mockSetActiveTabId, filters: [ @@ -295,13 +296,14 @@ describe('PredictFeedView', () => { expect(screen.getAllByText('Tennis').length).toBeGreaterThan(0); }); - it('hides the tab bar for a single-tab feed but still renders filters', () => { + it('hides the tab and filter bars for the Live feed', () => { mockUsePredictFeedConfig.mockReturnValue( feedConfigResult({ feedId: 'live', titleKey: 'predict.feed.live', tabs: [{ id: 'live', titleKey: 'predict.feed.live' }], showTabBar: false, + showFilterBar: false, activeTabId: 'live', filters: [ { @@ -321,8 +323,8 @@ describe('PredictFeedView', () => { screen.queryByTestId(PredictFeedViewSelectorsIDs.TABS), ).not.toBeOnTheScreen(); expect( - screen.getByTestId(PredictFeedViewSelectorsIDs.FILTERS), - ).toBeOnTheScreen(); + screen.queryByTestId(PredictFeedViewSelectorsIDs.FILTERS), + ).not.toBeOnTheScreen(); }); }); diff --git a/app/components/UI/Predict/views/PredictFeedView/PredictFeedView.tsx b/app/components/UI/Predict/views/PredictFeedView/PredictFeedView.tsx index f8525809aca..080320d548b 100644 --- a/app/components/UI/Predict/views/PredictFeedView/PredictFeedView.tsx +++ b/app/components/UI/Predict/views/PredictFeedView/PredictFeedView.tsx @@ -67,6 +67,7 @@ const PredictFeedView: React.FC = () => { header, tabs, showTabBar, + showFilterBar, activeTabId, setActiveTabId, filters, @@ -391,12 +392,14 @@ const PredictFeedView: React.FC = () => { /> )} - + {showFilterBar && ( + + )} {renderContent()} diff --git a/app/components/UI/Predict/views/PredictFeedView/PredictFeedView.view.test.tsx b/app/components/UI/Predict/views/PredictFeedView/PredictFeedView.view.test.tsx index 22a88ee9cb3..ce5a438eaab 100644 --- a/app/components/UI/Predict/views/PredictFeedView/PredictFeedView.view.test.tsx +++ b/app/components/UI/Predict/views/PredictFeedView/PredictFeedView.view.test.tsx @@ -101,4 +101,23 @@ describe('PredictFeedView (component view)', () => { ), ).toBeOnTheScreen(); }); + + it('hides Live filter chips while requesting only live markets', async () => { + const { findByTestId, queryByTestId } = renderPredictFeedView({ + initialParams: { feedId: 'live' }, + }); + + await findByTestId( + PredictFeedViewSelectorsIDs.EMPTY_STATE, + {}, + { timeout: 10000 }, + ); + + expect( + queryByTestId(PredictFeedViewSelectorsIDs.FILTERS), + ).not.toBeOnTheScreen(); + expect(Engine.context.PredictController.listMarkets).toHaveBeenCalledWith( + expect.objectContaining({ live: true }), + ); + }); });