Skip to content

Commit

Permalink
Dedicated page handlers
Browse files Browse the repository at this point in the history
  • Loading branch information
hodgef committed Feb 1, 2025
1 parent 38035e7 commit e5141d6
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 4 deletions.
4 changes: 2 additions & 2 deletions src/components/Admin/Panel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import css from "@panelAssets/css/panel.css";
import React from "react";
import { Header } from "./Header";
import { Content } from "./Content";
import { wrapReactPage } from "../Page";
import { wrapAdminReactPage } from "../Page";
import { Handler } from "../Request";
import { getAppHelper } from "./Utils";
import { Action, AdminPanelPageProps } from "./interfaces";
Expand Down Expand Up @@ -33,7 +33,7 @@ export const adminPanelPage: Handler = async ({ state }) => {
const userSignedIp = isAdminLoggedIn ? getSignedIp() : undefined;

const props = { isSetup: !hasAdmins, pageName, csrfToken, isAdminLoggedIn, userSignedIp } as AdminPanelPageProps;
return wrapReactPage('AdminPanelPage', <AdminPanelPage {...props} />, props, css);
return wrapAdminReactPage('AdminPanelPage', <AdminPanelPage {...props} />, props, css);
}

const actionsComponent = {
Expand Down
58 changes: 56 additions & 2 deletions src/components/Page/Page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,24 @@ import ReactDOMServer from "react-dom/server";
import { resRaw } from "../Response";
import { apiker } from "../Apiker";

export const pageHeader = (styles = "") => `
export const pageHeader = (head = "") => `
<!DOCTYPE html>
<html lang="en">
<head>
${head}
</head>
<body>
<div id="app">
`;

export const pageFooter = (prepend = "") => `
</div>
${prepend}
</body>
</html>
`;

export const adminPageHeader = (styles = "") => `
<!DOCTYPE html>
<html lang="en">
<head>
Expand Down Expand Up @@ -33,7 +50,7 @@ export const pageHeader = (styles = "") => `
<div id="app">
`;

export const pageFooter = (prepend = "") => `
export const adminPageFooter = (prepend = "") => `
</div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/umd/react.production.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/umd/react-dom.production.min.js"></script>
Expand All @@ -53,6 +70,43 @@ export const wrapReactPage = (componentName: string, pageComponent: React.ReactE
apiker.responseHeaders.set("X-Frame-Options", "deny");

return resRaw(pageHeader(styles) + pageContent + pageFooter(`
<script src="https://cdn.jsdelivr.net/npm/[email protected]/umd/react.production.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/umd/react-dom.production.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script>
<script>
window.appRoot = (action, componentName, props = {}) => {
const domNode = document.getElementById("app");
const root = ReactDOM.createRoot(domNode);
const componentProps = {
...props
};
if(!window.initializeAppHelper){
window.initializeAppHelper = (componentName) => ({
setProps: (newProps) => root.render(pages[componentName](newProps))
});
}
if(action === "hydrate"){
pages.ReactDOM.hydrate(pages[componentName](componentProps), app);
} else if (action === "render") {
root.render(pages[componentName](componentProps));
}
};
window.appRoot("hydrate", "${componentName}", ${JSON.stringify(props)});
</script>
`));
}

export const wrapAdminReactPage = (componentName: string, pageComponent: React.ReactElement, props = {}, styles = "") => {
let pageContent = ReactDOMServer.renderToString(pageComponent);

apiker.responseHeaders.set("Content-Security-Policy", "frame-ancestors 'none';");
apiker.responseHeaders.set("X-Frame-Options", "deny");

return resRaw(adminPageHeader(styles) + pageContent + adminPageFooter(`
<script>
window.appRoot = (action, componentName, props = {}) => {
const domNode = document.getElementById("app");
Expand Down

0 comments on commit e5141d6

Please sign in to comment.