Skip to content

Commit

Permalink
refactor page editors to use new image components
Browse files Browse the repository at this point in the history
  • Loading branch information
jackavh committed May 29, 2024
1 parent 0863ded commit 5a7ccf2
Show file tree
Hide file tree
Showing 19 changed files with 854 additions and 1,182 deletions.
106 changes: 106 additions & 0 deletions frontend/src/app/admin/page-editor/about/AboutEditor.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
import React, { useEffect, useState } from "react";

import { getPageData, updatePageData } from "../../../../api/pageeditor";
import Toast from "../../../../components/admin/Toast";
import CancelButton from "../../../../components/admin/pageeditor/CancelButton";
import { CollapsibleFields } from "../../../../components/admin/pageeditor/CollapsibleFields";
import { usePage, usePageDispatch } from "../../../../components/admin/pageeditor/PageProvider";
import SaveButton from "../../../../components/admin/pageeditor/SaveButton";

import styles from "./page.module.css";

export default function AboutEditor() {
const page = usePage();
const dispatch = usePageDispatch();
const [open, setOpen] = useState(false);

// Send page data from MongoDB to provider state
const updatePageStateFromDB = () => {
getPageData(page.name)
.then((response) => {
if (response.success) {
dispatch({
type: "edit_page",
setIsEdited: false,
page: {
...page,
fields: response.data.fields,
},
});
} else {
alert("Could not connect to database. Any changes you make will not take effect!!!");
}
})
.catch(console.error);
};

// When the page loads update state to reflect page data from MongoDB
useEffect(() => {
updatePageStateFromDB();
}, []);

// Implement save logic
const handleSave = () => {
if (page.isEdited) {
// set isEdited to false or else when we load from mongo it will have wrong state
updatePageData(page.name, { ...page, isEdited: false })
.then(() => {
setOpen(true);
})
.catch((error) => {
alert(error);
});
// make sure to reflect isEdited false on local state
dispatch({
type: "set_isEdited",
setIsEdited: false,
});
}
};

// Implement cancel logic
const handleCancel = () => {
if (page.isEdited) {
updatePageStateFromDB();
dispatch({
type: "set_isEdited",
setIsEdited: false,
});
}
};

return (
<div>
<Toast
message="Event Details Saved!"
open={open}
handleClose={() => {
setOpen(false);
}}
/>
<div className={styles.sectionContainer}>
<CollapsibleFields
title="Page Subtitle"
fieldNames={["Subtitle", "Header Image Carousel"]}
/>
<CollapsibleFields
title="Section 1 - Our Mission"
fieldNames={["Mission Section Title", "Mission Body Text", "Mission Section Image"]}
/>
<CollapsibleFields
title="Section 2 - Our Team"
fieldNames={["Team Section Title", "Team Body Text", "Team Section Image"]}
/>
<CollapsibleFields
title="Section 3 - Contact Us"
fieldNames={["Contact Section Title", "Contact Body Text", "Contact Section Image"]}
/>

<div className={styles.buttonContainer}>
<CancelButton text="Cancel" onClick={handleCancel} />
<SaveButton text="Save" onClick={handleSave} />
</div>
</div>
</div>
);
}
193 changes: 9 additions & 184 deletions frontend/src/app/admin/page-editor/about/page.tsx
Original file line number Diff line number Diff line change
@@ -1,200 +1,25 @@
"use client";
import React, { useEffect, useState } from "react";

import { getPageText, updatePage } from "../../../../api/pageeditor";
import { Page } from "../../../../api/pageeditor";
import PageToggle from "../../../../components/PageToggle";
import { PageProvider } from "../../../../components/admin/pageeditor/PageProvider";
import defaultPage from "../../../../components/admin/pageeditor/defaultPages/aboutPageDefault.json";

import AboutEditor from "./AboutEditor";
import styles from "./page.module.css";

import AlertBanner from "@/components/AlertBanner";
import Button from "@/components/Button";
import CancelButton from "@/components/CancelButton";
import Collapsable, { UploadImageTypes } from "@/components/Collapsable";
import PageToggle from "@/components/PageToggle";

export default function AboutEditor() {
const [isEdited, setIsEdited] = useState(false);
const [phSubtitle, setPhSubtitle] = useState<string>("");
const [s1Subtitle, setS1Subtitle] = useState<string>("");
const [s1Text, setS1Text] = useState<string>("");
const [s2Subtitle, setS2Subtitle] = useState<string>("");
const [s2Text, setS2Text] = useState<string>("");
const [s3Subtitle, setS3Subtitle] = useState<string>("");
const [s3Text, setS3Text] = useState<string>("");
const [missionImages, setMissionImages] = useState<string[]>([]);
const [teamImages, setTeamImages] = useState<string[]>([]);
const [contactImages, setContactImages] = useState<string[]>([]);

const [showAlert, setShowAlert] = useState(false);

/* Get page data from MongoDB */
let pageText;
useEffect(() => {
getPageText("About Us")
.then((response) => {
if (response.success) {
pageText = response.data;
setPhSubtitle(pageText.pageSections[0].subtitle ?? "");
setS1Subtitle(pageText.pageSections[1].sectionTitle ?? "");
setS1Text(pageText.pageSections[1].sectionSubtitle ?? "");
setS2Subtitle(pageText.pageSections[2].sectionTitle ?? "");
setS2Text(pageText.pageSections[2].sectionSubtitle ?? "");
setS3Subtitle(pageText.pageSections[3].sectionTitle ?? "");
setS3Text(pageText.pageSections[3].sectionSubtitle ?? "");
console.log("response.data: ", response.data);
} else {
alert(response.error);
}
})
.catch((error) => {
alert(error);
});
}, []);

/* Handle Fields upon edit */
const handleEdit = (event: React.ChangeEvent<HTMLTextAreaElement>) => {
setIsEdited(true);
if(event.target){
if (event.target.id === "Page Subtitle: Subtitle") {
setPhSubtitle(event.target.value);
} else if (event.target.id === "Section 1 - Our Mission: Section Title") {
setS1Subtitle(event.target.value);
} else if (event.target.id === "Section 1 - Our Mission: Body Text") {
setS1Text(event.target.value);
} else if (event.target.id === "Section 2 - Our Team: Section Title") {
setS2Subtitle(event.target.value);
} else if (event.target.id === "Section 2 - Our Team: Body Text") {
setS2Text(event.target.value);
} else if (event.target.id === "Section 3 - Contact Us: Section Title") {
setS3Subtitle(event.target.value);
} else if (event.target.id === "Section 3 - Contact Us: Body Text") {
setS3Text(event.target.value);
}
}
};

const handleSave = () => {
// Implement save logic
if (isEdited) {
console.log("Save changes");
updatePage({
//Pass edited text to MongoDB
page: "About Us",
pageSections: [
{
subtitle: phSubtitle,
},
{
sectionTitle: s1Subtitle,
sectionSubtitle: s1Text,
},
{
sectionTitle: s2Subtitle,
sectionSubtitle: s2Text,
},
{
sectionTitle: s3Subtitle,
sectionSubtitle: s3Text,
},
],
})
.then((response) => {
if (response.success) {
alert("Success!");
} else {
alert(response.error);
}
})
.catch((error) => {
alert(error);
});
setIsEdited(false);
}
};

const handleCancel = () => {
// Implement cancel logic
if (isEdited) {
console.log("Cancel changes");
getPageText("About Us")
.then((response) => {
if (response.success) {
pageText = response.data;
setPhSubtitle(pageText.pageSections[0].subtitle ?? "");
setS1Subtitle(pageText.pageSections[1].sectionTitle ?? "");
setS1Text(pageText.pageSections[1].sectionSubtitle ?? "");
setS2Subtitle(pageText.pageSections[2].sectionTitle ?? "");
setS2Text(pageText.pageSections[2].sectionSubtitle ?? "");
setS3Subtitle(pageText.pageSections[3].sectionTitle ?? "");
setS3Text(pageText.pageSections[3].sectionSubtitle ?? "");
} else {
alert(response.error);
}
})
.catch((error) => {
alert(error);
});
setIsEdited(false);
}
};

const handleCloseAlert = () => {
setShowAlert(false);
};

export default function AboutEditorPage() {
return (
<main className={styles.page}>
<div className={styles.alert}>
{showAlert && <AlertBanner text={"Event Details Saved!"} onClose={handleCloseAlert} />}
</div>
<PageToggle
pages={["About Us", "Our Mission", "Our Team", "Contact Us"]}
links={["./about", "./mission", "./team", "./contact"]}
currPage={0}
refreshPage={true}
/>
<div className={styles.sectionContainer}>
<Collapsable
title="Page Subtitle"
subsection={["Subtitle"]}
textbox={[phSubtitle, ""]}
onChange={handleEdit}
/>
<Collapsable
title="Section 1 - Our Mission"
subsection={["Section Title", "Body Text"]}
textbox={[s1Subtitle, s1Text]}
onChange={handleEdit}
imageUploadBox={UploadImageTypes.OUR_MISSION}
images={missionImages}
setImages={setMissionImages}
/>
<Collapsable
title="Section 2 - Our Team"
subsection={["Section Title", "Body Text"]}
textbox={[s2Subtitle, s2Text]}
onChange={handleEdit}
imageUploadBox={UploadImageTypes.OUR_TEAM}
images = {teamImages}
setImages = {setTeamImages}
/>
<Collapsable
title="Section 3 - Contact Us"
subsection={["Section Title", "Body Text" ]}
textbox={[s3Subtitle, s3Text]}
onChange={handleEdit}
imageUploadBox={UploadImageTypes.CONTACT_US}
images = {contactImages}
setImages = {setContactImages}
/>
<div className={styles.buttonContainer}>
<CancelButton
text="Cancel"
color={isEdited ? "active" : "unactive"}
onClick={handleCancel}
/>
<Button text="Save" color={isEdited ? "active" : "unactive"} onClick={handleSave} />
</div>
</div>
<PageProvider initialPage={defaultPage as Page}>
<AboutEditor />
</PageProvider>
</main>
);
}
Loading

0 comments on commit 5a7ccf2

Please sign in to comment.