Skip to content

Commit f3c6eef

Browse files
committed
refactor: extract item filtering functions to separate module
1 parent c21f1a7 commit f3c6eef

3 files changed

Lines changed: 61 additions & 48 deletions

File tree

src/components/FilteredNavigationData/FilteredNavigationData.tsx

Lines changed: 6 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@ import { ComicId } from '@models/ComicId'
88
import { HydratedItemNavigationData } from '@models/HydratedItemData'
99
import { ItemBody } from '@models/ItemBody'
1010
import { ItemId } from '@models/ItemId'
11-
import { ItemType } from '@models/ItemType'
11+
12+
import {
13+
filterItems,
14+
getFilterWithoutType,
15+
getTypeFromFilter,
16+
} from '~/itemFilters'
1217

1318
export default function FilteredNavigationData({
1419
isLoading,
@@ -122,48 +127,3 @@ export default function FilteredNavigationData({
122127
</>
123128
)
124129
}
125-
126-
function filterItems(
127-
allNavigationItems: HydratedItemNavigationData[],
128-
filter: string
129-
) {
130-
const type = getTypeFromFilter(filter)
131-
132-
let filteredByType
133-
if (type !== 'item') {
134-
filteredByType = allNavigationItems.filter((i) => i.type === type)
135-
} else {
136-
filteredByType = allNavigationItems
137-
}
138-
139-
filter = getFilterWithoutType(filter)
140-
return filteredByType.filter(
141-
(i) =>
142-
i.shortName.toUpperCase().indexOf(filter.toUpperCase()) !== -1 ||
143-
i.name.toUpperCase().indexOf(filter.toUpperCase()) !== -1
144-
)
145-
}
146-
147-
function getTypeFromFilter(filter: string) {
148-
const typeFilter = filter.charAt(0)
149-
let type: ItemType | 'item' = 'item'
150-
switch (typeFilter) {
151-
case '!':
152-
type = 'cast'
153-
break
154-
case '@':
155-
type = 'location'
156-
break
157-
case '#':
158-
type = 'storyline'
159-
break
160-
}
161-
return type
162-
}
163-
164-
function getFilterWithoutType(filter: string) {
165-
if (getTypeFromFilter(filter) !== 'item') {
166-
filter = filter.substring(1)
167-
}
168-
return filter
169-
}

src/itemFilters.ts

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { ItemType } from '@models/ItemType'
2+
3+
export type FilterItemType = ItemType | 'item'
4+
5+
export function getTypeFromFilter(filter: string) {
6+
const typeFilter = filter.charAt(0)
7+
let type: FilterItemType = 'item'
8+
switch (typeFilter) {
9+
case '!':
10+
type = 'cast'
11+
break
12+
case '@':
13+
type = 'location'
14+
break
15+
case '#':
16+
type = 'storyline'
17+
break
18+
}
19+
return type
20+
}
21+
22+
export function getFilterWithoutType(filter: string) {
23+
if (getTypeFromFilter(filter) !== 'item') {
24+
filter = filter.substring(1)
25+
}
26+
return filter
27+
}
28+
29+
type FilterableItem = {
30+
shortName: string
31+
name: string
32+
type: ItemType
33+
}
34+
export function filterItems<I extends FilterableItem>(
35+
items: I[],
36+
filter: string
37+
) {
38+
const type = getTypeFromFilter(filter)
39+
40+
let filteredByType
41+
if (type !== 'item') {
42+
filteredByType = items.filter((i) => i.type === type)
43+
} else {
44+
filteredByType = items
45+
}
46+
47+
filter = getFilterWithoutType(filter)
48+
return filteredByType.filter(
49+
(i) =>
50+
i.shortName.toUpperCase().indexOf(filter.toUpperCase()) !== -1 ||
51+
i.name.toUpperCase().indexOf(filter.toUpperCase()) !== -1
52+
)
53+
}

src/utils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,8 @@ export function range(start: number, end: number) {
238238
return Array.from({ length }, (_, i) => start + i)
239239
}
240240

241-
export function dbg<T>(d: string, v: T) {
242-
console.log(d, v)
241+
export function dbg<T>(v: T, d?: string) {
242+
console.log(v, d)
243243
return v
244244
}
245245

0 commit comments

Comments
 (0)