1- import { Button , Progress } from "@radix-ui/themes" ;
21import { useEffect , useState } from "react" ;
3- import { VscRunAbove , VscStopCircle } from "react-icons/vsc" ;
42import {
53 getAllCityHouses ,
64 type GetAllHousesFilters ,
75 type House ,
86} from "@/api" ;
9- import { useAsync , useAsyncFn , useLocalStorage } from "react-use" ;
10- import { MapStyleSelect } from "@/components/MapStyleSelect" ;
7+ import { useAsync , useAsyncFn } from "react-use" ;
118import { ofetch } from "ofetch" ;
129import { HousesMap } from "@/components/HousesMap" ;
13-
10+ import { VscPlay , VscSaveAll , VscSettingsGear } from "react-icons/vsc" ;
11+ import { HousesFilters } from "@/components/HousesFilters" ;
1412
1513
1614export function Root ( ) {
17- const [ filters ] = useState < GetAllHousesFilters > (
15+ const [ filters , setFilters ] = useState < GetAllHousesFilters > (
1816 {
1917 cityId : '1' ,
20- size : [ 30 , 200 ] ,
18+ exact : false ,
19+ size : [ 30 , 120 ] ,
2120 }
2221 ) ;
2322
24- const [ mapStyle , setMapStyle ] = useLocalStorage < string > ( 'map-style' ) ;
25-
2623 const [ progress , setProgress ] = useState < number > ( 0 ) ;
2724 const [ progressText , setProgressText ] = useState ( '' ) ;
2825
29- useEffect ( ( ) => {
30- console . log ( progressText ) ;
31- } , [ progressText ] ) ;
32-
3326 const lastSavedHouses = useAsync ( ( ) => ofetch < House [ ] > ( new URL ( './tehran.json' , window . location . origin + window . location . pathname ) . href ) ) ;
3427 const [ houses , setHouses ] = useState < House [ ] > ( [ ] ) ;
3528 useEffect ( ( ) => {
@@ -41,41 +34,53 @@ export function Root() {
4134 setProgress ( a / b ) ;
4235 setProgressText ( progressText ) ;
4336 setHouses ( currentHouses ) ;
37+ } ) . then ( ( ) => {
38+ setProgress ( 0 ) ;
39+ setProgressText ( '' ) ;
4440 } ) ;
4541 } , [ filters ] ) ;
4642
4743 return (
48- < div className = "w-svw h-svh relative" >
49- < HousesMap
50- houses = { houses ?? [ ] }
51- mapStyle = { mapStyle ! }
52- />
53- < div className = "absolute top-0 left-0 w-full p-2 flex items-center justify-center gap-2 backdrop-contrast-50 backdrop-blur-sm" >
54- < Progress size = "2" max = { 1 } value = { progress } color = "green" variant = "classic" />
55- < Button
44+ < div className = "h-svh w-svw relative" >
45+ < div className = "flex items-center justify-between backdrop-blur-sm bg-black z-10 absolute top-0 left-0 w-full p-2 gap-2" >
46+ < div className = "flex items-center flex-col justify-between grow gap-1 h-full" >
47+ < label htmlFor = "progress-bar" className = "text-xs h-4" > { progressText ? `${ progressText } ...` : '' } </ label >
48+ < progress id = "progress-bar" value = { progress } max = "1" className = "progress w-full h-2" />
49+ </ div >
50+ < button
51+ onClick = { ( ) => document . querySelector < HTMLDialogElement > ( '#filters-dialog' ) ! . showModal ( ) }
52+ disabled = { crawlHouses . loading }
53+ className = "shrink-0 btn btn-sm btn-soft"
54+ >
55+ < VscSettingsGear className = "size-4" /> Settings
56+ </ button >
57+ < button
5658 onClick = { ( ) => {
5759 startCrawl ( ) ;
5860 } }
59- color = { crawlHouses . loading ? 'gray' : 'green' }
60- size = "2"
61- variant = "classic"
61+ disabled = { crawlHouses . loading }
62+ className = "shrink-0 btn btn-sm btn-primary"
6263 >
63-
64- { crawlHouses . loading ? (
65- < >
66- < VscStopCircle />
67- Stop
68- </ >
69- ) : (
70- < >
71- < VscRunAbove />
72- Start Crawl Divar
73- </ >
74- ) }
75- </ Button >
76- |
77- < MapStyleSelect value = { mapStyle } onValueChange = { setMapStyle } size = "2" />
64+ < VscPlay className = "size-4" /> Run
65+ </ button >
7866 </ div >
67+
68+ < dialog id = "filters-dialog" className = "modal" >
69+ < div className = "modal-box" >
70+ < h3 className = "font-bold text-lg" > Filters</ h3 >
71+ < div className = "modal-action" >
72+ < form method = "dialog" className = "w-full" >
73+ < HousesFilters value = { filters } onChange = { setFilters } />
74+ < div className = "divider" />
75+ < button className = "btn btn-block btn-primary" > < VscSaveAll /> OK</ button >
76+ </ form >
77+ </ div >
78+ </ div >
79+ </ dialog >
80+
81+ < HousesMap
82+ houses = { houses ?? [ ] }
83+ />
7984 </ div >
8085 ) ;
8186}
0 commit comments