-
Notifications
You must be signed in to change notification settings - Fork 103
/
filter-router.ts
107 lines (89 loc) · 3.28 KB
/
filter-router.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import { get, writable, Writable } from 'svelte/store'
import { Subrouter } from '@core/router'
import { deepCopy } from '@core/utils'
import { dashboardRouter } from '../'
import { FilterRoute } from '../../enums'
import { IFilterRouterEvent } from '../../interfaces'
import { resetRouterWithDrawerDelay } from '../../utils'
import { selectedFilter } from '@/contexts/dashboard/stores'
import { FilterAction } from '@/contexts/dashboard/enums'
import { Filter } from '@core/utils/types'
import { activityFilter, assetFilter } from '@core/wallet/stores'
import { proposalFilter } from '@contexts/governance/stores'
import { DEFAULT_ACTIVITY_FILTER, DEFAULT_ASSET_FILTER } from '@core/wallet/constants'
import { DEFAULT_PROPOSAL_FILTER } from '@contexts/governance/constants'
export const filterRoute = writable<FilterRoute>(null)
export const filterRouter = writable<FilterRouter>(null)
export enum FilterType {
Activity = 'activity',
Asset = 'asset',
Proposal = 'proposal',
}
export class FilterRouter extends Subrouter<FilterRoute> {
constructor() {
super(FilterRoute.Filter, filterRoute, get(dashboardRouter))
}
private filterType: FilterType
public next(event: IFilterRouterEvent = {}): void {
const { action, filter, filterType } = event
if (get(filterRoute) === FilterRoute.Filter) {
if (!action && filter && filterType) {
this.filterType = filterType
selectedFilter.set(filter)
}
if (action && filter) {
this.handleFilterAction(action, filter)
}
}
}
public closeDrawer(): void {
selectedFilter.set(null)
get(dashboardRouter).previous()
resetRouterWithDrawerDelay(get(filterRouter))
}
private handleFilterAction(action: FilterAction, filter: Filter): void {
if (!filter) {
return
}
switch (action) {
case FilterAction.Apply:
this.closeDrawer()
this.applyFilter(filter)
return
case FilterAction.Clear:
this.clearStoreByFilterType()
return
}
}
private applyFilter(filter: Filter): void {
this.getFilterStore().set(deepCopy(filter))
}
private clearStoreByFilterType(filterType: FilterType = this.filterType): void {
switch (filterType) {
case FilterType.Activity:
activityFilter.set(DEFAULT_ACTIVITY_FILTER)
break
case FilterType.Asset:
assetFilter.set(DEFAULT_ASSET_FILTER)
break
case FilterType.Proposal:
proposalFilter.set(DEFAULT_PROPOSAL_FILTER)
break
}
}
public getFilterStore(filterType: FilterType = this.filterType): Writable<Filter> {
switch (filterType) {
case FilterType.Activity:
return activityFilter
case FilterType.Asset:
return assetFilter
case FilterType.Proposal:
return proposalFilter
default:
return writable(null)
}
}
public clearFilterStores(): void {
Object.values(FilterType).forEach((filterType) => this.clearStoreByFilterType(filterType))
}
}