Skip to content

Commit deee67f

Browse files
committed
Add filter to require Cosmo colors
1 parent 4659da6 commit deee67f

File tree

6 files changed

+61
-13
lines changed

6 files changed

+61
-13
lines changed

src/App.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import './App.css'
55
import {HideColorsProvider} from './HideColorsContext'
66
import {RequireJpCoatsProvider} from './RequireJpCoatsContext'
77
import {RequireAnchorProvider} from './RequireAnchorContext'
8+
import {RequireCosmoProvider} from './contexts/RequireCosmoProvider'
89
import {ColorsProvider} from './ColorsContext'
910
import {Header} from './Header'
1011
import {FiltersAndTable} from './FiltersAndTable'
@@ -33,9 +34,11 @@ const ProviderStack = ({children}: PropsWithChildren) => (
3334
<HideColorsProvider>
3435
<RequireJpCoatsProvider>
3536
<RequireAnchorProvider>
36-
<SortProvider>
37-
<ColorsProvider>{children}</ColorsProvider>
38-
</SortProvider>
37+
<RequireCosmoProvider>
38+
<SortProvider>
39+
<ColorsProvider>{children}</ColorsProvider>
40+
</SortProvider>
41+
</RequireCosmoProvider>
3942
</RequireAnchorProvider>
4043
</RequireJpCoatsProvider>
4144
</HideColorsProvider>

src/ColorsContext.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {createContext, type PropsWithChildren, useContext, useMemo} from 'react'
22
import {useRequireAnchor} from './RequireAnchorContext'
33
import {useRequireJpCoats} from './RequireJpCoatsContext'
4+
import {useRequireCosmo} from './contexts/cosmo-context'
45
import dmcNamedColorCodes from './assets/dmc-color-codes-names.json'
56
import dmcNewJpCoatsColors from './assets/dmc-old-new-jp-coats-colors.json'
67
import dmcCosmoColors from './assets/dmc-cosmo-colors.json'
@@ -17,6 +18,7 @@ const ColorsContext = createContext<Colors | undefined>(undefined)
1718
export function ColorsProvider({children}: PropsWithChildren) {
1819
const {requireAnchor} = useRequireAnchor()
1920
const {requireJpCoats} = useRequireJpCoats()
21+
const {requireCosmo} = useRequireCosmo()
2022
const {sortOption} = useSort()
2123
const dataByDmcCode = useMemo<Record<string, EmbroideryFlossColor>>(() => {
2224
const result: Record<string, EmbroideryFlossColor> = {}
@@ -51,7 +53,7 @@ export function ColorsProvider({children}: PropsWithChildren) {
5153
const contextProps = useMemo(
5254
() => ({
5355
colors: colors
54-
.filter(({anchorCode, jpCoatsOld, jpCoatsNew}) => {
56+
.filter(({anchorCode, cosmoCodes, jpCoatsOld, jpCoatsNew}) => {
5557
if (requireAnchor && anchorCode === undefined) return false
5658
if (
5759
requireJpCoats &&
@@ -60,11 +62,14 @@ export function ColorsProvider({children}: PropsWithChildren) {
6062
) {
6163
return false
6264
}
65+
if (requireCosmo && (cosmoCodes === undefined || cosmoCodes.length < 1)) {
66+
return false
67+
}
6368
return true
6469
})
6570
.sort(colorCompareFunction(sortOption)),
6671
}),
67-
[colors, requireAnchor, requireJpCoats, sortOption]
72+
[colors, requireAnchor, requireCosmo, requireJpCoats, sortOption]
6873
)
6974
return (
7075
<ColorsContext.Provider value={contextProps}>

src/Filters.tsx

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ import {Checkbox, FormControl} from '@primer/react'
22
import {Fieldset} from './Fieldset'
33
import {useRequireJpCoats} from './RequireJpCoatsContext'
44
import {useRequireAnchor} from './RequireAnchorContext'
5+
import {useRequireCosmo} from './contexts/cosmo-context'
56

67
export const Filters = () => {
78
const {requireJpCoats, setRequireJpCoats} = useRequireJpCoats()
89
const {requireAnchor, setRequireAnchor} = useRequireAnchor()
10+
const {requireCosmo, setRequireCosmo} = useRequireCosmo()
911

1012
return (
1113
<Fieldset
@@ -18,17 +20,24 @@ export const Filters = () => {
1820
>
1921
<FormControl>
2022
<Checkbox
21-
checked={requireJpCoats}
22-
onChange={() => setRequireJpCoats(!requireJpCoats)}
23+
checked={requireAnchor}
24+
onChange={() => setRequireAnchor(!requireAnchor)}
2325
/>
24-
<FormControl.Label>J&amp;P Coats</FormControl.Label>
26+
<FormControl.Label>Anchor</FormControl.Label>
2527
</FormControl>
2628
<FormControl>
2729
<Checkbox
28-
checked={requireAnchor}
29-
onChange={() => setRequireAnchor(!requireAnchor)}
30+
checked={requireCosmo}
31+
onChange={() => setRequireCosmo(!requireCosmo)}
3032
/>
31-
<FormControl.Label>Anchor</FormControl.Label>
33+
<FormControl.Label>Cosmo</FormControl.Label>
34+
</FormControl>
35+
<FormControl>
36+
<Checkbox
37+
checked={requireJpCoats}
38+
onChange={() => setRequireJpCoats(!requireJpCoats)}
39+
/>
40+
<FormControl.Label>J&amp;P Coats</FormControl.Label>
3241
</FormControl>
3342
</Fieldset>
3443
)

src/RequireAnchorContext.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ interface RequireAnchor {
1313

1414
const RequireAnchorContext = createContext<RequireAnchor | undefined>(undefined)
1515

16-
export const RequireAnchorProvider = ({children}: PropsWithChildren) => {
16+
export function RequireAnchorProvider({children}: PropsWithChildren) {
1717
const [requireAnchor, setRequireAnchor] = useState(false)
1818
const contextProps = useMemo(
1919
() => ({requireAnchor, setRequireAnchor}),
@@ -26,7 +26,7 @@ export const RequireAnchorProvider = ({children}: PropsWithChildren) => {
2626
)
2727
}
2828

29-
export const useRequireAnchor = () => {
29+
export function useRequireAnchor() {
3030
const context = useContext(RequireAnchorContext)
3131
if (context === undefined)
3232
throw new Error(
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import {type PropsWithChildren, useMemo, useState} from 'react'
2+
import {RequireCosmoContext} from './cosmo-context'
3+
4+
export function RequireCosmoProvider({children}: PropsWithChildren) {
5+
const [requireCosmo, setRequireCosmo] = useState(false);
6+
const contextProps = useMemo(
7+
() => ({requireCosmo, setRequireCosmo}),
8+
[requireCosmo, setRequireCosmo]
9+
);
10+
return (
11+
<RequireCosmoContext.Provider value={contextProps}>
12+
{children}
13+
</RequireCosmoContext.Provider>
14+
);
15+
}

src/contexts/cosmo-context.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import {createContext, useContext} from 'react'
2+
3+
interface RequireCosmoContextProps {
4+
requireCosmo: boolean
5+
setRequireCosmo: (val: boolean) => void
6+
}
7+
8+
export const RequireCosmoContext = createContext<RequireCosmoContextProps | undefined>(undefined)
9+
10+
export function useRequireCosmo() {
11+
const context = useContext(RequireCosmoContext)
12+
if (context === undefined) {
13+
throw new Error('useRequireCosmo must be used within a RequireCosmoProvider')
14+
}
15+
return context
16+
}

0 commit comments

Comments
 (0)