1- import { useCallback , useEffect , useState } from 'react' ;
21import './SatsFlowRoot.scss' ;
2+ import { useCallback , useEffect , useState } from 'react' ;
33import { useNavigate } from 'react-router-dom' ;
44import { Card , Col , Row } from 'react-bootstrap' ;
55import { CloseSVG } from '../../../svgs/Close' ;
@@ -13,20 +13,46 @@ const SatsFlowRoot = () => {
1313 const navigate = useNavigate ( ) ;
1414 const satsFlowPeriods = useSelector ( selectSatsFlowPeriods ) ;
1515 const [ showZeroActivityPeriods , setShowZeroActivityPeriods ] = useState < boolean > ( false ) ;
16+ const [ selectedTags , setSelectedTags ] = useState < string [ ] > ( [ ] ) ;
17+ const [ tagFilterMode , setTagFilterMode ] = useState < string > ( 'include' ) ;
1618 const [ satsFlowData , setSatsFlowData ] = useState < SatsFlowPeriod [ ] > ( satsFlowPeriods ) ;
1719
18- const filterSatsFlowData = ( periods , showZeroActivity ) => {
19- return ( showZeroActivity ) ? periods : periods . filter ( key => key . tag_groups . length > 0 )
20- }
20+ const applyFilters = useCallback ( (
21+ periods : SatsFlowPeriod [ ] ,
22+ showZeroActivity : boolean ,
23+ tags : string [ ] ,
24+ filterMode : string
25+ ) : SatsFlowPeriod [ ] => {
26+ const tagFiltered : SatsFlowPeriod [ ] = tags . length === 0
27+ ? periods
28+ : periods . map ( period => ( {
29+ ...period ,
30+ tag_groups : period . tag_groups . filter ( group => {
31+ const isMatch = tags . includes ( group . tag ) ;
32+ return filterMode === 'include' ? isMatch : ! isMatch ;
33+ } ) ,
34+ } ) ) ;
35+ return showZeroActivity
36+ ? tagFiltered
37+ : tagFiltered . filter ( period => period . tag_groups . length > 0 ) ;
38+ } , [ ] ) ;
2139
2240 const handleShowZeroActivityChange = useCallback ( ( show : boolean ) => {
2341 setShowZeroActivityPeriods ( show ) ;
24- setSatsFlowData ( filterSatsFlowData ( satsFlowPeriods , show ) ) ;
25- } , [ satsFlowPeriods ] ) ;
42+ setSatsFlowData ( applyFilters ( satsFlowPeriods , show , selectedTags , tagFilterMode ) ) ;
43+ } , [ satsFlowPeriods , selectedTags , tagFilterMode , applyFilters ] ) ;
44+
45+ const multiSelectChangeHandler = useCallback ( ( selectedOptions : string [ ] , filterMode : string ) => {
46+ setTimeout ( ( ) => {
47+ setSelectedTags ( selectedOptions ) ;
48+ setTagFilterMode ( filterMode ) ;
49+ setSatsFlowData ( applyFilters ( satsFlowPeriods , showZeroActivityPeriods , selectedOptions , filterMode ) ) ;
50+ } , 0 ) ;
51+ } , [ satsFlowPeriods , showZeroActivityPeriods , applyFilters ] ) ;
2652
2753 useEffect ( ( ) => {
28- setSatsFlowData ( filterSatsFlowData ( satsFlowPeriods , showZeroActivityPeriods ) ) ;
29- } , [ satsFlowPeriods , showZeroActivityPeriods ] ) ;
54+ setSatsFlowData ( applyFilters ( satsFlowPeriods , showZeroActivityPeriods , selectedTags , tagFilterMode ) ) ;
55+ } , [ satsFlowPeriods ] ) ;
3056
3157 return (
3258 < div data-testid = 'satsflow-container' className = 'satsflow-container' >
@@ -37,15 +63,26 @@ const SatsFlowRoot = () => {
3763 < Col className = 'text-end' >
3864 < span
3965 className = 'span-close-svg'
40- onClick = { ( ) => {
41- navigate ( '..' ) ;
42- } }
66+ onClick = { ( ) => navigate ( '..' ) }
4367 >
4468 < CloseSVG />
4569 </ span >
4670 </ Col >
4771 </ Row >
48- < DataFilterOptions filter = 'satsflow' onShowZeroActivityChange = { handleShowZeroActivityChange } />
72+ < DataFilterOptions
73+ filter = 'satsflow'
74+ onShowZeroActivityChange = { handleShowZeroActivityChange }
75+ multiSelectValues = { [
76+ { name : 'deposit' , dataKey : 'deposit' } ,
77+ { name : 'invoice_fee' , dataKey : 'invoice_fee' } ,
78+ { name : 'onchain_fee' , dataKey : 'onchain_fee' } ,
79+ { name : 'paid_invoice' , dataKey : 'paid_invoice' } ,
80+ { name : 'received_invoice' , dataKey : 'received_invoice' } ,
81+ { name : 'routed' , dataKey : 'routed' } ,
82+ ] }
83+ multiSelectPlaceholder = 'Filter Events'
84+ multiSelectChangeHandler = { multiSelectChangeHandler }
85+ />
4986 </ Card . Header >
5087 < Card . Body className = 'pb-4 d-flex flex-column align-items-center' >
5188 < Col xs = { 12 } className = 'sats-flow-graph-container' >
0 commit comments