Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(ONYX-380): add colours filter to saved searches #9413

Merged
merged 30 commits into from
Oct 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
6f85a3e
feat: create new artwork filter store
MounirDhahri Oct 5, 2023
4eb5975
minor: separate filter data type
MounirDhahri Oct 5, 2023
f1cfd9d
feat: add filters screen wrapper
MounirDhahri Oct 5, 2023
cbfd7ce
feat: prepare your filters section
MounirDhahri Oct 5, 2023
d5319b9
refactor: move screen to savesearches directory
MounirDhahri Oct 5, 2023
432c702
feat: wrap the screen with the new artwork filters store
MounirDhahri Oct 5, 2023
c6df76b
feat: add rarity filter functionality
MounirDhahri Oct 5, 2023
a4dacd1
chore: improve UX of selecting pills 👌
MounirDhahri Oct 6, 2023
9c18b0f
chore: add rarity options tests
MounirDhahri Oct 6, 2023
4a15749
chore: minor integrity test improvement
MounirDhahri Oct 6, 2023
dbf0169
fix: useDebounce logic in pill
MounirDhahri Oct 6, 2023
e041a4c
feat: display the applied filters on your filters
MounirDhahri Oct 6, 2023
4827865
feat: add remove filter action
MounirDhahri Oct 6, 2023
5a83528
chore: add note to make sure to implement clear all
MounirDhahri Oct 6, 2023
ba5bb99
feat: add your filters tests
MounirDhahri Oct 6, 2023
c223b67
feat: add clear all button
MounirDhahri Oct 6, 2023
95a8b62
chore: add subtle animations: bring the screen to life
MounirDhahri Oct 6, 2023
b22ddb4
fix: revert disabled logic in clear all button
MounirDhahri Oct 6, 2023
2591c0f
chore: remove commented line
MounirDhahri Oct 6, 2023
322ed69
chore: remove unused fields from store
MounirDhahri Oct 6, 2023
c4038ad
refact: use SavedSearchStore for ClearAllButton
MounirDhahri Oct 12, 2023
68ec793
refactor: update Applied fitlers to use SavedSearchStore
MounirDhahri Oct 12, 2023
cd400b0
chore: do not allow artistIDs pills removal
MounirDhahri Oct 12, 2023
bcd561f
chore: do not count artistIDs for clear all button counts
MounirDhahri Oct 12, 2023
e5c2614
refactor: use SavedSearchStoreProvider for rarity
MounirDhahri Oct 12, 2023
f73a374
refactor: remove new filters store
MounirDhahri Oct 12, 2023
3449121
fix: rarity filter test
MounirDhahri Oct 12, 2023
76dd082
chore: address review comments
MounirDhahri Oct 12, 2023
9c67567
feat: add color filtering
MounirDhahri Oct 12, 2023
2d4cce0
chore: address review comments
MounirDhahri Oct 12, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion src/app/Components/ArtworkFilter/Filters/ColorsOptions.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,16 @@ export const COLORS_INDEXED_BY_VALUE = COLORS.reduce(
{}
)

const SWATCHES_PER_ROW = 4
export const COLOR_OPTIONS: FilterData[] = COLORS.map((color) => {
return {
// names returned by Metaphysics are actually the slugs
displayText: color.name,
paramValue: color.value,
paramName: FilterParamName.colors,
}
})

export const SWATCHES_PER_ROW = 4

type ColorsOptionsScreenProps = StackScreenProps<
ArtworkFilterNavigationStack,
Expand Down
1 change: 1 addition & 0 deletions src/app/Components/ArtworkFilter/Filters/ColorsSwatch.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ export const ColorsSwatch: React.FC<ColorsSwatchProps> = ({
height="18px"
marginTop="-9px"
marginLeft="-9px"
testID={`check-icon-${name}`}
fill={foregroundColor as any} // Annoying
/>
)}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import { OwnerType } from "@artsy/cohesion"
import { fireEvent, waitFor } from "@testing-library/react-native"
import {
COLORS_INDEXED_BY_VALUE,
COLOR_OPTIONS,
} from "app/Components/ArtworkFilter/Filters/ColorsOptions"
import { SavedSearchFilterColour } from "app/Scenes/SavedSearchAlert/Components/SavedSearchFilterColour"
import {
SavedSearchModel,
SavedSearchStoreProvider,
savedSearchModel,
} from "app/Scenes/SavedSearchAlert/SavedSearchStore"
import { renderWithWrappers } from "app/utils/tests/renderWithWrappers"

describe("SavedSearchFilterColour", () => {
it("shows all available color options unselected", () => {
const { getByTestId } = renderWithWrappers(
<SavedSearchStoreProvider runtimeModel={initialData}>
<SavedSearchFilterColour />
</SavedSearchStoreProvider>
)

COLOR_OPTIONS.forEach((option) => {
expect(() =>
getByTestId(`check-icon-${COLORS_INDEXED_BY_VALUE[option.paramValue as string].name}`)
).toThrow()
})
})

it("shows the right selected state", () => {
const { getByTestId } = renderWithWrappers(
<SavedSearchStoreProvider runtimeModel={{ ...initialData, attributes: { colors: ["red"] } }}>
<SavedSearchFilterColour />
</SavedSearchStoreProvider>
)

COLOR_OPTIONS.forEach((option) => {
if (option.paramValue !== "red") {
expect(() =>
getByTestId(`check-icon-${COLORS_INDEXED_BY_VALUE[option.paramValue as string].name}`)
).toThrow()
} else {
expect(
getByTestId(`check-icon-${COLORS_INDEXED_BY_VALUE[option.paramValue as string].name}`)
).toBeDefined()
}
})
})

it("Updates selected filters on press", () => {
const { getByTestId, getByText } = renderWithWrappers(
<SavedSearchStoreProvider runtimeModel={initialData}>
<SavedSearchFilterColour />
</SavedSearchStoreProvider>
)

fireEvent(getByText("Red"), "onPress")

waitFor(() => {
expect(getByTestId("check-icon-Red")).toBeDefined()
})
})
})

const initialData: SavedSearchModel = {
...savedSearchModel,
attributes: {
atAuction: true,
},
entity: {
artists: [{ id: "artistID", name: "Banksy" }],
owner: {
type: OwnerType.artist,
id: "ownerId",
slug: "ownerSlug",
},
},
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import { Flex, Spacer, Text, useScreenDimensions, useSpace } from "@artsy/palette-mobile"
import {
COLORS_INDEXED_BY_VALUE,
COLOR_OPTIONS,
SWATCHES_PER_ROW,
} from "app/Components/ArtworkFilter/Filters/ColorsOptions"
import { ColorsSwatch } from "app/Components/ArtworkFilter/Filters/ColorsSwatch"
import { SearchCriteria } from "app/Components/ArtworkFilter/SavedSearch/types"
import { SavedSearchStore } from "app/Scenes/SavedSearchAlert/SavedSearchStore"
import { isValueSelected, useSearchCriteriaAttributes } from "app/Scenes/SavedSearchAlert/helpers"

export const SavedSearchFilterColour = () => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure whether devs from the US will be happy with colour 😆

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lol - did it intentionally here to follow Barney's designs 😄

const selectedAttributes = useSearchCriteriaAttributes(SearchCriteria.colors) as string[]

const { width } = useScreenDimensions()
const space = useSpace()

const setValueToAttributesByKeyAction = SavedSearchStore.useStoreActions(
(actions) => actions.setValueToAttributesByKeyAction
)
const removeValueFromAttributesByKeyAction = SavedSearchStore.useStoreActions(
(actions) => actions.removeValueFromAttributesByKeyAction
)

const handlePress = (value: string) => {
const isSelected = isValueSelected({
selectedAttributes,
value: value,
})

if (isSelected) {
removeValueFromAttributesByKeyAction({
key: SearchCriteria.colors,
value: value,
})
} else {
const newValues = (selectedAttributes || []).concat(value)
setValueToAttributesByKeyAction({
key: SearchCriteria.colors,
value: newValues,
})
}
}

return (
<Flex>
<Text px={2} variant="sm" fontWeight={500}>
Colour
</Text>

<Spacer y={1} />

<Flex flexDirection="row" flexWrap="wrap" px={1}>
{COLOR_OPTIONS.map((option, i) => {
const color = COLORS_INDEXED_BY_VALUE[String(option.paramValue)]

return (
<ColorsSwatch
key={i}
width={(width - space(1) * 2) / SWATCHES_PER_ROW}
selected={isValueSelected({
selectedAttributes,
value: option.paramValue,
})}
name={color.name}
backgroundColor={color.backgroundColor}
foregroundColor={color.foregroundColor}
onPress={() => {
handlePress(option.paramValue as string)
}}
/>
)
})}
</Flex>
</Flex>
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,9 @@ export const SavedSearchRarity = () => {
<Text variant="sm" fontWeight={500}>
Rarity
</Text>

<Spacer y={1} />

<Flex flexDirection="row" flexWrap="wrap">
{ATTRIBUTION_CLASS_OPTIONS.map((option) => {
return (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { useNavigation } from "@react-navigation/native"
import { SearchCriteria } from "app/Components/ArtworkFilter/SavedSearch/types"
import { FancyModalHeader } from "app/Components/FancyModal/FancyModalHeader"
import { SavedSearchAppliedFilters } from "app/Scenes/SavedSearchAlert/Components/SavedSearchFilterAppliedFilters"
import { SavedSearchFilterColour } from "app/Scenes/SavedSearchAlert/Components/SavedSearchFilterColour"
import { SavedSearchRarity } from "app/Scenes/SavedSearchAlert/Components/SavedSearchFilterRarity"
import { SavedSearchStore } from "app/Scenes/SavedSearchAlert/SavedSearchStore"
import { MotiView } from "moti"
Expand All @@ -24,6 +25,7 @@ export const SavedSearchFilterScreen: React.FC<{}> = () => {
<Join separator={<Separator my={2} borderColor="black10" />}>
<SavedSearchAppliedFilters />
<SavedSearchRarity />
<SavedSearchFilterColour />
</Join>
</Flex>
)
Expand Down