@@ -3,7 +3,8 @@ import styled from "styled-components";
33import { FeatureContext } from "../../../../Context/FeatureProvider" ;
44
55import useRequest from "../../../../../../services/Hooks/useRequest" ;
6- import Eye from "../../../../../../assets/svg/eye.svg?react" ;
6+ import Eye from "../../../../../../assets/svg/eye.svg?react" ;
7+ import { Skeleton } from "../../../../../../components/Skeleton" ;
78
89import PreviewModel from "./PreviewModel" ;
910import { useSelectedEnvironment } from "../../../../../../services/reducers/SelectedEnvironmentContext" ;
@@ -12,7 +13,6 @@ const Container = styled.div`
1213 gap: 10px;
1314 grid-template-columns: repeat(2, minmax(0, 1fr));
1415 display: grid;
15-
1616 width: 100%;
1717
1818 @media (max-width: 1024px) {
@@ -83,19 +83,32 @@ const SelectorEnvironment = styled.button`
8383 }
8484` ;
8585
86+ // اسکلتون برای آیتمها
87+ const SkeletonImgHolder = styled . div `
88+ width: 100%;
89+ height: 180px;
90+ border-radius: 10px;
91+ position: relative;
92+
93+ @media (max-width: 768px) {
94+ height: 120px;
95+ }
96+ ` ;
97+
8698const ChoosingEnvironment = ( ) => {
8799 const [ feature ] = useContext ( FeatureContext ) ;
88100 const { Request, HTTP_METHOD } = useRequest ( ) ;
89101 const [ data , setData ] = useState ( [ ] ) ;
90102 const [ preview , setPreview ] = useState ( null ) ;
91103 const [ showModal , setShowModal ] = useState ( false ) ;
92-
93104 const [ coordinates , setCoordinates ] = useState ( [ ] ) ;
94105 const [ activeIndex , setActiveIndex ] = useState ( null ) ;
95106 const { addSelectedEnvironment, hiddenModel, setHiddenModel, isSelectable } =
96107 useSelectedEnvironment ( ) || { } ;
97108 const [ page , setPage ] = useState ( 1 ) ;
98109 const [ loading , setLoading ] = useState ( false ) ;
110+ const [ initialLoading , setInitialLoading ] = useState ( true ) ;
111+
99112 useEffect ( ( ) => {
100113 const fetchData = async ( ) => {
101114 setLoading ( true ) ;
@@ -106,9 +119,11 @@ const ChoosingEnvironment = () => {
106119 ) ;
107120 setData ( ( prevData ) => [ ...prevData , ...res . data . data ] ) ;
108121 setCoordinates ( [ res . data . feature . coordinates ] ) ;
109- setLoading ( false ) ;
110122 } catch ( err ) {
123+ console . error ( err ) ;
124+ } finally {
111125 setLoading ( false ) ;
126+ setInitialLoading ( false ) ;
112127 }
113128 } ;
114129 fetchData ( ) ;
@@ -124,8 +139,14 @@ const ChoosingEnvironment = () => {
124139 }
125140 } ;
126141 const container = document . querySelector ( "#scrollable-container" ) ;
127- container . addEventListener ( "scroll" , handleScroll ) ;
128- return ( ) => container . removeEventListener ( "scroll" , handleScroll ) ;
142+ if ( container ) {
143+ container . addEventListener ( "scroll" , handleScroll ) ;
144+ }
145+ return ( ) => {
146+ if ( container ) {
147+ container . removeEventListener ( "scroll" , handleScroll ) ;
148+ }
149+ } ;
129150 } , [ loading ] ) ;
130151
131152 const handleSelectorClick = ( index ) => {
@@ -141,18 +162,30 @@ const ChoosingEnvironment = () => {
141162 }
142163 } ;
143164
165+ // اسکلتون لودینگ اولیه
166+ if ( initialLoading ) {
167+ return (
168+ < Container id = "scrollable-container" >
169+ { Array . from ( { length : 6 } ) . map ( ( _ , index ) => (
170+ < SkeletonImgHolder key = { index } >
171+ < Skeleton width = "100%" height = "180px" radius = "10px" />
172+ </ SkeletonImgHolder >
173+ ) ) }
174+ </ Container >
175+ ) ;
176+ }
177+
144178 return (
145179 < >
146180 < Container id = "scrollable-container" >
147181 { data &&
148- data . map ( ( data , index ) => {
182+ data . map ( ( item , index ) => {
149183 return (
150- < ImgHolder key = { data . id } >
151- < Img src = { data . images [ 0 ] . url } alt = "" />
152-
184+ < ImgHolder key = { item . id } >
185+ < Img src = { item . images ?. [ 0 ] ?. url } alt = "" />
153186 < ViewHolder
154187 onClick = { ( ) => {
155- setPreview ( data ) ;
188+ setPreview ( item ) ;
156189 setShowModal ( true ) ;
157190 } }
158191 >
@@ -166,14 +199,23 @@ const ChoosingEnvironment = () => {
166199 ) ;
167200 } ) }
168201 </ Container >
202+
203+ { /* اسکلتون لودینگ بیشتر (اینفینیتی اسکرول) */ }
204+ { loading && data . length > 0 && (
205+ < Container >
206+ { Array . from ( { length : 2 } ) . map ( ( _ , index ) => (
207+ < SkeletonImgHolder key = { `loading-${ index } ` } >
208+ < Skeleton width = "100%" height = "180px" radius = "10px" />
209+ </ SkeletonImgHolder >
210+ ) ) }
211+ </ Container >
212+ ) }
213+
169214 { showModal && preview && (
170- < PreviewModel
171- data = { [ preview ] }
172- setShowModal = { setShowModal }
173- />
215+ < PreviewModel data = { [ preview ] } setShowModal = { setShowModal } />
174216 ) }
175217 </ >
176218 ) ;
177219} ;
178220
179- export default ChoosingEnvironment ;
221+ export default ChoosingEnvironment ;
0 commit comments