Rework the search UI and add (#174)

* Add search tab and move icon to footer

* Remove subtitles from view header

* Remove unused code

* Clean up UI of search screen

* Search: give better user feedback to UI state and add a cancel button

* Add WhoToFollow section to search

* Add a temporary SuggestedPosts solution using the patented 'bsky team algo'

* Trigger reload of suggested content in search on open

* Wait five min between reloading discovery content

* Reduce weight of solid search icon in footer

* Fix lint

* Fix tests
This commit is contained in:
Paul Frazee
2023-02-08 18:01:29 -06:00
committed by GitHub
parent 3c70bdf791
commit 00d41c9168
22 changed files with 745 additions and 295 deletions
+47 -46
View File
@@ -15,7 +15,7 @@ describe('NavigationModel', () => {
it('should clear() to the correct base state', async () => {
await model.clear()
expect(model.tabCount).toBe(2)
expect(model.tabCount).toBe(3)
expect(model.tab).toEqual({
fixedTabPurpose: 0,
history: [
@@ -64,7 +64,7 @@ describe('NavigationModel', () => {
})
it('should call the tabCount getter', () => {
expect(model.tabCount).toBe(2)
expect(model.tabCount).toBe(3)
})
describe('tabs not enabled', () => {
@@ -87,7 +87,7 @@ describe('NavigationModel', () => {
it('should not change the active tab', () => {
// @ts-expect-error
flags.TABS_ENABLED = false
model.setActiveTab(2)
model.setActiveTab(3)
expect(model.tabIndex).toBe(0)
})
@@ -95,57 +95,58 @@ describe('NavigationModel', () => {
// @ts-expect-error
flags.TABS_ENABLED = false
model.closeTab(0)
expect(model.tabCount).toBe(2)
expect(model.tabCount).toBe(3)
})
})
describe('tabs enabled', () => {
jest.mock('../../../src/build-flags', () => ({
TABS_ENABLED: true,
}))
// TODO restore when tabs get re-enabled
// describe('tabs enabled', () => {
// jest.mock('../../../src/build-flags', () => ({
// TABS_ENABLED: true,
// }))
afterAll(() => {
jest.clearAllMocks()
})
// afterAll(() => {
// jest.clearAllMocks()
// })
it('should create new tabs', () => {
// @ts-expect-error
flags.TABS_ENABLED = true
// it('should create new tabs', () => {
// // @ts-expect-error
// flags.TABS_ENABLED = true
model.newTab('testurl', 'title')
expect(model.tab.isNewTab).toBe(true)
expect(model.tabIndex).toBe(2)
})
// model.newTab('testurl', 'title')
// expect(model.tab.isNewTab).toBe(true)
// expect(model.tabIndex).toBe(2)
// })
it('should change the current tab', () => {
// @ts-expect-error
flags.TABS_ENABLED = true
// it('should change the current tab', () => {
// // @ts-expect-error
// flags.TABS_ENABLED = true
model.setActiveTab(0)
expect(model.tabIndex).toBe(0)
})
// model.setActiveTab(0)
// expect(model.tabIndex).toBe(0)
// })
it('should close tabs', () => {
// @ts-expect-error
flags.TABS_ENABLED = true
// it('should close tabs', () => {
// // @ts-expect-error
// flags.TABS_ENABLED = true
model.closeTab(0)
expect(model.tabs).toEqual([
{
fixedTabPurpose: 1,
history: [
{
id: expect.anything(),
ts: expect.anything(),
url: '/notifications',
},
],
id: expect.anything(),
index: 0,
isNewTab: false,
},
])
expect(model.tabIndex).toBe(0)
})
})
// model.closeTab(0)
// expect(model.tabs).toEqual([
// {
// fixedTabPurpose: 1,
// history: [
// {
// id: expect.anything(),
// ts: expect.anything(),
// url: '/notifications',
// },
// ],
// id: expect.anything(),
// index: 0,
// isNewTab: false,
// },
// ])
// expect(model.tabIndex).toBe(0)
// })
// })
})
+13
View File
@@ -36,6 +36,19 @@ describe('rootStore', () => {
},
{
fixedTabPurpose: 1,
history: [
{
id: expect.anything(),
ts: expect.anything(),
url: '/search',
},
],
id: expect.anything(),
index: 0,
isNewTab: false,
},
{
fixedTabPurpose: 2,
history: [
{
id: expect.anything(),
-30
View File
@@ -1,30 +0,0 @@
import React from 'react'
import {Search} from '../../../src/view/screens/Search'
import {cleanup, fireEvent, render} from '../../../jest/test-utils'
describe('Search', () => {
jest.useFakeTimers()
const mockedProps = {
navIdx: [0, 0] as [number, number],
params: {
name: 'test name',
},
visible: true,
}
afterAll(() => {
jest.clearAllMocks()
cleanup()
})
it('renders with query', async () => {
const {findByTestId} = render(<Search {...mockedProps} />)
const searchTextInput = await findByTestId('searchTextInput')
expect(searchTextInput).toBeTruthy()
fireEvent.changeText(searchTextInput, 'test')
const searchScrollView = await findByTestId('searchScrollView')
expect(searchScrollView).toBeTruthy()
})
})
+2 -3
View File
@@ -41,8 +41,7 @@ describe('Menu', () => {
fireEvent.press(searchBtn)
expect(onCloseMock).toHaveBeenCalled()
expect(mockedNavigationStore.switchTo).toHaveBeenCalledWith(0, true)
expect(mockedNavigationStore.navigate).toHaveBeenCalledWith('/search')
expect(mockedNavigationStore.switchTo).toHaveBeenCalledWith(1, true)
})
it("presses notifications menu item' button", () => {
@@ -52,6 +51,6 @@ describe('Menu', () => {
fireEvent.press(menuItemButton)
expect(onCloseMock).toHaveBeenCalled()
expect(mockedNavigationStore.switchTo).toHaveBeenCalledWith(1, true)
expect(mockedNavigationStore.switchTo).toHaveBeenCalledWith(2, true)
})
})