Skip to content

Commit 5bbdef4

Browse files
committed
Added Newsletter
1 parent afe7f4d commit 5bbdef4

File tree

2 files changed

+84
-6
lines changed

2 files changed

+84
-6
lines changed

my-app/public/Newsletter.pdf

3.47 MB
Binary file not shown.

my-app/src/pages/NewsletterPage.jsx

Lines changed: 84 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { pdfjs } from "react-pdf";
2-
import { useCallback, useMemo, useState } from "react";
2+
import { useCallback, useEffect, useMemo, useState } from "react";
33
import { Document, Page } from "react-pdf";
44
import { useResizeObserver } from "@wojtekmaj/react-hooks";
55
import "react-pdf/dist/esm/Page/AnnotationLayer.css";
66
import "react-pdf/dist/esm/Page/TextLayer.css";
77
import { IoChevronBack, IoChevronForward } from "react-icons/io5";
8+
import { API_URL } from "../lib/constants";
89

910
import "../styles/newsletter.css";
1011
import Newsletter from "../components/Newsletter";
@@ -14,10 +15,13 @@ const maxWidth = 800;
1415
const resizeObserverOptions = {};
1516

1617
const NewsletterPage = () => {
18+
const [file, setFile] = useState();
19+
const [editions, setEditions] = useState([]);
1720
const [numPages, setNumPages] = useState();
1821
const [pageNumber, setPageNumber] = useState(1);
1922
const [containerRef, setContainerRef] = useState(null);
2023
const [containerWidth, setContainerWidth] = useState();
24+
const [loading, setLoading] = useState(true);
2125

2226
// Memoize the options object to prevent unnecessary reloads
2327
const options = useMemo(
@@ -40,6 +44,52 @@ const NewsletterPage = () => {
4044

4145
useResizeObserver(containerRef, resizeObserverOptions, onResize);
4246

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+
4393
const forward = () => {
4494
if (pageNumber + 1 <= numPages) setPageNumber(pageNumber + 1);
4595
};
@@ -48,20 +98,47 @@ const NewsletterPage = () => {
4898
if (pageNumber - 1 >= 1) setPageNumber(pageNumber - 1);
4999
};
50100

51-
const [selectedValue, setSelectedValue] = useState('');
101+
const [selectedValue, setSelectedValue] = useState('Option 1');
52102

103+
// Handle change event
53104
const handleChange = (event) => {
105+
setLoading(true);
54106
setSelectedValue(event.target.value);
107+
getNewsletter(event.target.value);
55108
};
56109

57110
return (
58111
<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">
60113
Newsletters
61114
</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>
64132
</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>
65142
<div className="flex justify-center">
66143
<div className="flex justify-center gap-12">
67144
<button onClick={backward}><IoChevronBack size={25} /></button>
@@ -72,7 +149,7 @@ const NewsletterPage = () => {
72149
<div>
73150
<div className="Example__container__document mx-auto" ref={setContainerRef}>
74151
<Document
75-
file={"Newsletter.pdf"}
152+
file={file}
76153
onLoadSuccess={onDocumentLoadSuccess}
77154
options={options}
78155
>
@@ -92,6 +169,7 @@ const NewsletterPage = () => {
92169
<button onClick={forward}><IoChevronForward size={25} /></button>
93170
</div>
94171
</div>
172+
</div>}
95173
<div className="my-6">
96174
<Newsletter />
97175
</div>

0 commit comments

Comments
 (0)