1+ import _ from 'lodash' ;
2+ import React , { useMemo } from 'react' ;
3+ import { useSelector } from 'react-redux' ;
4+
5+ import { UnitListElement } from './UnitList' ;
6+ import { Unit } from '../types' ;
7+ import { RootState , UnitsByUpdateCountState } from '../reducers/types' ;
8+
9+ interface UnitByUpdateCount {
10+ id : string ;
11+ count : number ;
12+ }
13+
14+ function topUnits (
15+ n : number ,
16+ units : Record < string , Unit > ,
17+ unitsByUpdateCount : UnitsByUpdateCountState
18+ ) : Unit [ ] {
19+ return _ . reverse (
20+ _ . map (
21+ _ . sortBy (
22+ _ . map ( unitsByUpdateCount , ( u , id ) => ( {
23+ id,
24+ count : u . count
25+ } ) ) ,
26+ [ 'count' ]
27+ ) ,
28+ ( u : UnitByUpdateCount ) => {
29+ return units [ u . id ] ;
30+ }
31+ ) . filter ( unit => unit != null ) . slice ( 0 , n )
32+ ) ;
33+ }
34+
35+ const DashBoard : React . FC = ( ) => {
36+ const loading = useSelector ( ( state : RootState ) => state . data . loading . unit ) ;
37+ const userLocation = useSelector ( ( state : RootState ) => state . userLocation ) ;
38+ const unitData = useSelector ( ( state : RootState ) => state . data . unit ) ;
39+ const unitsByDistance = useSelector ( ( state : RootState ) => state . data . unitsByDistance ) ;
40+ const unitsByUpdateCount = useSelector ( ( state : RootState ) => state . unitsByUpdateCount ) ;
41+
42+ const nearest = useMemo ( ( ) => {
43+ if ( _ . keys ( unitData ) . length > 0 ) {
44+ return _ . map ( unitsByDistance , ( u ) => {
45+ return unitData [ u . id . toString ( ) ] ;
46+ } ) ;
47+ }
48+ return [ ] ;
49+ } , [ unitData , unitsByDistance ] ) ;
50+
51+ const frequent = useMemo ( ( ) => {
52+ if ( _ . keys ( unitData ) . length > 0 ) {
53+ return topUnits ( 20 , unitData , unitsByUpdateCount ) ;
54+ }
55+ return [ ] ;
56+ } , [ unitData , unitsByUpdateCount ] ) ;
57+
58+ if ( loading ) {
59+ return < div > Ladataan...</ div > ;
60+ }
61+
62+ const nearestElements = userLocation === null
63+ ? < span > Sijainti ei saatavilla.</ span >
64+ : nearest . filter ( u => u ?. id ) . map ( u => < UnitListElement key = { u . id } unit = { u } /> ) ;
65+
66+ const frequentElements = frequent . map ( u => < UnitListElement key = { u . id } unit = { u } /> ) ;
67+
68+ return (
69+ < div className = "row" >
70+ < div className = "col-xs-12" >
71+ < h5 > Lähimmät</ h5 >
72+ < div className = "list-group facility-drilldown" > { nearestElements } </ div >
73+ < h5 > Yleisimmät</ h5 >
74+ < div className = "list-group facility-drilldown" > { frequentElements } </ div >
75+ </ div >
76+ </ div >
77+ ) ;
78+ } ;
79+
80+ export default DashBoard ;
0 commit comments