1
1
import { pdfjs } from "react-pdf" ;
2
- import { useCallback , useMemo , useState } from "react" ;
2
+ import { useCallback , useEffect , useMemo , useState } from "react" ;
3
3
import { Document , Page } from "react-pdf" ;
4
4
import { useResizeObserver } from "@wojtekmaj/react-hooks" ;
5
5
import "react-pdf/dist/esm/Page/AnnotationLayer.css" ;
6
6
import "react-pdf/dist/esm/Page/TextLayer.css" ;
7
7
import { IoChevronBack , IoChevronForward } from "react-icons/io5" ;
8
+ import { API_URL } from "../lib/constants" ;
8
9
9
10
import "../styles/newsletter.css" ;
10
11
import Newsletter from "../components/Newsletter" ;
@@ -14,10 +15,13 @@ const maxWidth = 800;
14
15
const resizeObserverOptions = { } ;
15
16
16
17
const NewsletterPage = ( ) => {
18
+ const [ file , setFile ] = useState ( ) ;
19
+ const [ editions , setEditions ] = useState ( [ ] ) ;
17
20
const [ numPages , setNumPages ] = useState ( ) ;
18
21
const [ pageNumber , setPageNumber ] = useState ( 1 ) ;
19
22
const [ containerRef , setContainerRef ] = useState ( null ) ;
20
23
const [ containerWidth , setContainerWidth ] = useState ( ) ;
24
+ const [ loading , setLoading ] = useState ( true ) ;
21
25
22
26
// Memoize the options object to prevent unnecessary reloads
23
27
const options = useMemo (
@@ -40,6 +44,52 @@ const NewsletterPage = () => {
40
44
41
45
useResizeObserver ( containerRef , resizeObserverOptions , onResize ) ;
42
46
47
+ const getNewsletters = async ( ) => {
48
+ try {
49
+ const response = await fetch ( `${ API_URL } /newsletter` , {
50
+ method : "GET" ,
51
+ headers : {
52
+ "Content-Type" : "application/json" ,
53
+ } ,
54
+ } ) ;
55
+
56
+ const data = await response . json ( ) ;
57
+ if ( data . success ) {
58
+ setEditions ( data . newsletter ) ;
59
+ if ( data . newsletter . length > 0 ) getNewsletter ( data . newsletter [ 0 ] . id )
60
+ }
61
+ setLoading ( false ) ;
62
+ } catch ( error ) {
63
+ setLoading ( false ) ;
64
+ }
65
+ } ;
66
+
67
+ const getNewsletter = async ( id ) => {
68
+ try {
69
+ const response = await fetch ( `${ API_URL } /newsletter/${ id } ` , {
70
+ method : "GET" ,
71
+ headers : {
72
+ "Content-Type" : "application/json" ,
73
+ } ,
74
+ } ) ;
75
+
76
+ const data = await response . json ( ) ;
77
+ if ( data . success ) {
78
+ const pdfResponse = await fetch ( data . newsletter . link ) ;
79
+ const blob = await pdfResponse . blob ( ) ;
80
+ const fileUrl = URL . createObjectURL ( blob ) ;
81
+ setFile ( fileUrl ) ;
82
+ }
83
+ setLoading ( false ) ;
84
+ } catch ( error ) {
85
+ setLoading ( false ) ;
86
+ }
87
+ } ;
88
+
89
+ useEffect ( ( ) => {
90
+ getNewsletters ( ) ;
91
+ } , [ ] )
92
+
43
93
const forward = ( ) => {
44
94
if ( pageNumber + 1 <= numPages ) setPageNumber ( pageNumber + 1 ) ;
45
95
} ;
@@ -48,20 +98,47 @@ const NewsletterPage = () => {
48
98
if ( pageNumber - 1 >= 1 ) setPageNumber ( pageNumber - 1 ) ;
49
99
} ;
50
100
51
- const [ selectedValue , setSelectedValue ] = useState ( '' ) ;
101
+ const [ selectedValue , setSelectedValue ] = useState ( 'Option 1 ' ) ;
52
102
103
+ // Handle change event
53
104
const handleChange = ( event ) => {
105
+ setLoading ( true ) ;
54
106
setSelectedValue ( event . target . value ) ;
107
+ getNewsletter ( event . target . value ) ;
55
108
} ;
56
109
57
110
return (
58
111
< div className = "text-white flex flex-col justify-center" >
59
- < h1 className = "text-4xl tracking-tight my-6 font-extrabold text-pastel text-center sm:text-5xl md:text-6xl" >
112
+ < h1 className = "text-4xl tracking-tight my-2 font-extrabold text-pastel text-center sm:text-5xl md:text-6xl" >
60
113
Newsletters
61
114
</ h1 >
62
- < div >
63
- DROP DOWN HERE
115
+ < div className = "flex justify-center mt-4 mb-8" >
116
+ < div className = "mx-auto" >
117
+ < label htmlFor = "dropdown" className = "mb-2 text-lg font-medium text-gray-300 text-center" >
118
+ Select an edition:
119
+ </ label >
120
+ < select
121
+ id = "dropdown"
122
+ value = { selectedValue }
123
+ onChange = { handleChange }
124
+ className = "block w-64 px-3 py-2 border border-gray-300 bg-gray-700 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"
125
+ >
126
+ {
127
+ editions . map ( ( item , index ) => {
128
+ return < option key = { index } value = { item . id } > { item . edition } </ option >
129
+ } )
130
+ }
131
+ </ select >
64
132
</ div >
133
+ </ div >
134
+ {
135
+ loading &&
136
+ < div className = "h-24 w-4/6 rounded-xl bg-white/30 text-transparent mx-auto animate-pulse" >
137
+ asda
138
+ </ div >
139
+ }
140
+ { ! loading && file &&
141
+ < div >
65
142
< div className = "flex justify-center" >
66
143
< div className = "flex justify-center gap-12" >
67
144
< button onClick = { backward } > < IoChevronBack size = { 25 } /> </ button >
@@ -72,7 +149,7 @@ const NewsletterPage = () => {
72
149
< div >
73
150
< div className = "Example__container__document mx-auto" ref = { setContainerRef } >
74
151
< Document
75
- file = { "Newsletter.pdf" }
152
+ file = { file }
76
153
onLoadSuccess = { onDocumentLoadSuccess }
77
154
options = { options }
78
155
>
@@ -92,6 +169,7 @@ const NewsletterPage = () => {
92
169
< button onClick = { forward } > < IoChevronForward size = { 25 } /> </ button >
93
170
</ div >
94
171
</ div >
172
+ </ div > }
95
173
< div className = "my-6" >
96
174
< Newsletter />
97
175
</ div >
0 commit comments