11import { useState , useEffect } from 'react' ;
2- import { getTheQuran , giveTheQuran , giveQuranAudio } from './getTimes ' ;
2+ import { getTheQuran , giveTheQuran } from './js/Helper ' ;
33
44function Quran ( ) {
55
@@ -8,7 +8,6 @@ function Quran() {
88 const [ search , setSearch ] = useState ( "" ) ;
99 const [ quran , setQuran ] = useState ( [ ] ) ;
1010 const [ display , setDisplay ] = useState ( false ) ;
11- const [ audio , setAudio ] = useState ( [ ] ) ;
1211
1312 useEffect ( ( ) => {
1413 async function Awwalun ( ) {
@@ -27,36 +26,129 @@ function Quran() {
2726 }
2827
2928 async function handleSubmit ( event ) {
30- event . preventDefault ( ) ;
31- setAudio ( [ ] ) ;
32- setQuran ( [ ] ) ;
33- await giveQuranAudio ( search ) . then ( data => { setAudio ( data ) } ) ;
34- await giveTheQuran ( search ) . then ( data => {
35- setDisplay ( true ) ;
36- setIntro ( false ) ;
37- setQuran ( data ) ;
38- } ) ;
39- }
40-
29+ setQuran ( [ ] ) ;
30+ event . preventDefault ( ) ;
31+ await giveTheQuran ( search ) . then ( data => {
32+ setQuran ( data ) ;
33+ setIntro ( false ) ;
34+ setDisplay ( true ) ;
35+ } ) ;
36+ }
37+
4138 async function handleClick ( event ) {
4239 setSearch ( event . target . value ) ;
43- }
40+ }
4441
45- function Surah ( ) {
46- if ( display ) {
42+ function QuranData ( props ) {
43+ const { text , audio , translation , number } = props . data ;
4744 return (
48- < >
49- { quran . map ( ( ayats , index ) => (
50- < div className = 'quranAyats' key = { index } >
51- < h3 className = 'quranic' > { ayats . text } ({ index + 1 } )</ h3 >
52- < p > { ayats . translation } </ p >
53- < audio key = { index } controls > < source src = { audio [ index ] . audio . primary } /> </ audio >
54- < br />
45+ < div className = "quranAyats" >
46+ < h3 className = "quranic" > { text . arab } ({ number . inSurah } )</ h3 >
47+ < p > { translation . id } </ p >
48+ < audio controls >
49+ < source src = { audio . primary } />
50+ Your browser does not support the audio element.
51+ </ audio >
52+ </ div >
53+ ) ;
54+ }
55+
56+ function Pagination ( { data, RenderComponent, title, pageLimit, dataLimit } ) {
57+ const [ pages ] = useState ( Math . round ( data . length / dataLimit ) ) ;
58+ const [ currentPage , setCurrentPage ] = useState ( 1 ) ;
59+
60+ useEffect ( ( ) => {
61+ window . scrollTo ( { behavior : 'smooth' , top : '0px' } ) ;
62+ } , [ currentPage ] ) ;
63+
64+ function goToNextPage ( ) {
65+ setCurrentPage ( ( page ) => page + 1 ) ;
66+ }
67+
68+ function goToPreviousPage ( ) {
69+ setCurrentPage ( ( page ) => page - 1 ) ;
70+ }
71+
72+ function changePage ( event ) {
73+ const pageNumber = Number ( event . target . textContent ) ;
74+ setCurrentPage ( pageNumber ) ;
75+ }
76+
77+ const getPaginatedData = ( ) => {
78+ const startIndex = currentPage * dataLimit - dataLimit ;
79+ const endIndex = startIndex + dataLimit ;
80+ return data . slice ( startIndex , endIndex ) ;
81+ } ;
82+
83+ const getPaginationGroup = ( ) => {
84+ let start = Math . floor ( ( currentPage - 1 ) / pageLimit ) * pageLimit ;
85+ return new Array ( pageLimit ) . fill ( ) . map ( ( _ , idx ) => start + idx + 1 ) ;
86+ } ;
87+
88+ function showPaginateNav ( ) {
89+ if ( pages <= 1 )
90+ return null ;
91+ else if ( pages > 1 )
92+ return (
93+ < div className = "grid" >
94+ < div />
95+ < div className = "pagination" >
96+ { /* previous button */ }
97+ < button
98+ onClick = { goToPreviousPage }
99+ className = { `prev ${ currentPage === 1 ? 'disabled' : '' } ` }
100+ >
101+ Sebelumnya
102+ </ button >
103+
104+ { /* show page numbers */ }
105+ { getPaginationGroup ( ) . map ( ( item , index ) => (
106+ < button
107+ key = { index }
108+ onClick = { changePage }
109+ className = { `paginationItem ${ currentPage === item ? 'active' : null } ` }
110+ >
111+ < span > { item } </ span >
112+ </ button >
113+ ) ) }
114+
115+ { /* next button */ }
116+ < button
117+ onClick = { goToNextPage }
118+ className = { `next ${ currentPage === pages ? 'disabled' : '' } ` }
119+ >
120+ Seterusnya
121+ </ button >
55122 </ div >
123+ < div />
124+ </ div >
125+ ) ;
126+ }
127+
128+ return (
129+ < div >
130+ { /* show the ayats, 10 posts at a time */ }
131+ < div className = "dataContainer" >
132+ { getPaginatedData ( ) . map ( ( d , idx ) => (
133+ < RenderComponent key = { idx } data = { d } />
56134 ) ) }
57- </ >
135+ </ div >
136+ < br /> < br />
137+ { showPaginateNav ( ) }
138+ </ div >
58139 ) ;
59140 }
141+
142+ function PaginateQuran ( ) {
143+ if ( display )
144+ return (
145+ < Pagination
146+ data = { quran }
147+ RenderComponent = { QuranData }
148+ pageLimit = { 5 }
149+ dataLimit = { 10 }
150+ />
151+ ) ;
60152 }
61153
62154 return (
@@ -79,8 +171,9 @@ function Quran() {
79171 < h1 > Al Quran</ h1 >
80172 </ div >
81173 </ div >
82- < div > { Surah ( quran ) } </ div >
174+ < div > { PaginateQuran ( ) } </ div >
83175 { TheIntro ( ) }
176+ < br /> < br />
84177 </ main >
85178 ) ;
86179}
0 commit comments