diff --git a/site/src/App.tsx b/site/src/App.tsx
index 882bf430..b1789f18 100644
--- a/site/src/App.tsx
+++ b/site/src/App.tsx
@@ -7,6 +7,7 @@ import './style/theme.scss';
import './App.scss';
import AppHeader from './component/AppHeader/AppHeader';
+// import ChangelogModal from './component/ChangelogModal/ChangelogModal';
import SearchPage from './pages/SearchPage';
import CoursePage from './pages/CoursePage';
import ProfessorPage from './pages/ProfessorPage';
@@ -106,6 +107,7 @@ export default function App() {
} />
+ {/*
{}
*/}
diff --git a/site/src/component/ChangelogModal/ChangelogModal.scss b/site/src/component/ChangelogModal/ChangelogModal.scss
new file mode 100644
index 00000000..8d7634e0
--- /dev/null
+++ b/site/src/component/ChangelogModal/ChangelogModal.scss
@@ -0,0 +1,42 @@
+.changelog-modal {
+ .modal-content {
+ border: none;
+ background-color: var(--overlay2);
+ padding: 4px 8px 8px;
+ }
+
+ .modal-header {
+ align-items: center;
+ border-bottom: none;
+ padding-bottom: 0;
+ }
+
+ h2 {
+ margin-bottom: 0;
+ font-size: 1.8rem;
+ font-weight: 600;
+ }
+
+ .modal-body {
+ font-size: 1.2rem;
+ margin: 0;
+ }
+
+ .modal-img {
+ margin: 1rem;
+ max-width: 70vw;
+ max-height: 50vh;
+ object-fit: contain;
+ }
+
+ button.close {
+ font-size: 32px;
+ }
+
+ @media only screen and (max-width: 800px) {
+ .modal-img {
+ max-width: 90vw;
+ max-height: 50vh;
+ }
+ }
+}
diff --git a/site/src/component/ChangelogModal/ChangelogModal.tsx b/site/src/component/ChangelogModal/ChangelogModal.tsx
new file mode 100644
index 00000000..a4380ae3
--- /dev/null
+++ b/site/src/component/ChangelogModal/ChangelogModal.tsx
@@ -0,0 +1,41 @@
+import { useEffect, useState } from 'react';
+import './ChangelogModal.scss';
+import Modal from 'react-bootstrap/Modal';
+
+const DESCRIPTION = 'You can now view recently added features to the PeterPortal website, listed in this modal.';
+const IMAGE_URL =
+ 'https://media.tenor.com/ufm_0t3ACEAAAAAM/ginger-cat-ginger-cat-eating-then-staring-at-the-camera.gif';
+const LAST_UPDATED = '02/27/2024';
+
+const ChangelogModal = () => {
+ const [showModal, setShowModal] = useState(false);
+
+ useEffect(() => {
+ // display the changelog modal if it is the user's first time seeing it (tracked in local storage)
+ const lastSeen = localStorage.getItem('changelogSeen');
+
+ if (lastSeen !== LAST_UPDATED) {
+ setShowModal(true);
+
+ // mark as seen so it is not displayed after seeing it once
+ localStorage.setItem('changelogSeen', LAST_UPDATED);
+ }
+ }, []);
+
+ const closeModal = () => {
+ setShowModal(false);
+ };
+
+ return (
+
+
+ What's New - {new Date(LAST_UPDATED).toLocaleString('default', { month: 'long', year: 'numeric' })}
+
+
+ {DESCRIPTION}
+
+
+ );
+};
+
+export default ChangelogModal;
diff --git a/site/src/pages/RoadmapPage/AddCoursePopup.tsx b/site/src/pages/RoadmapPage/AddCoursePopup.tsx
index 768c23ac..e664248b 100644
--- a/site/src/pages/RoadmapPage/AddCoursePopup.tsx
+++ b/site/src/pages/RoadmapPage/AddCoursePopup.tsx
@@ -121,7 +121,7 @@ const AddCoursePopup: FC = () => {
);
})}
- Missing qurter
+ Missing quarter
)}