Skip to content

Commit e5141d6

Browse files
committed
Dedicated page handlers
1 parent 38035e7 commit e5141d6

File tree

2 files changed

+58
-4
lines changed

2 files changed

+58
-4
lines changed

src/components/Admin/Panel.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import css from "@panelAssets/css/panel.css";
44
import React from "react";
55
import { Header } from "./Header";
66
import { Content } from "./Content";
7-
import { wrapReactPage } from "../Page";
7+
import { wrapAdminReactPage } from "../Page";
88
import { Handler } from "../Request";
99
import { getAppHelper } from "./Utils";
1010
import { Action, AdminPanelPageProps } from "./interfaces";
@@ -33,7 +33,7 @@ export const adminPanelPage: Handler = async ({ state }) => {
3333
const userSignedIp = isAdminLoggedIn ? getSignedIp() : undefined;
3434

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

3939
const actionsComponent = {

src/components/Page/Page.tsx

+56-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,24 @@ import ReactDOMServer from "react-dom/server";
33
import { resRaw } from "../Response";
44
import { apiker } from "../Apiker";
55

6-
export const pageHeader = (styles = "") => `
6+
export const pageHeader = (head = "") => `
7+
<!DOCTYPE html>
8+
<html lang="en">
9+
<head>
10+
${head}
11+
</head>
12+
<body>
13+
<div id="app">
14+
`;
15+
16+
export const pageFooter = (prepend = "") => `
17+
</div>
18+
${prepend}
19+
</body>
20+
</html>
21+
`;
22+
23+
export const adminPageHeader = (styles = "") => `
724
<!DOCTYPE html>
825
<html lang="en">
926
<head>
@@ -33,7 +50,7 @@ export const pageHeader = (styles = "") => `
3350
<div id="app">
3451
`;
3552

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

5572
return resRaw(pageHeader(styles) + pageContent + pageFooter(`
73+
<script src="https://cdn.jsdelivr.net/npm/[email protected]/umd/react.production.min.js"></script>
74+
<script src="https://cdn.jsdelivr.net/npm/[email protected]/umd/react-dom.production.min.js"></script>
75+
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script>
76+
<script>
77+
window.appRoot = (action, componentName, props = {}) => {
78+
const domNode = document.getElementById("app");
79+
const root = ReactDOM.createRoot(domNode);
80+
81+
const componentProps = {
82+
...props
83+
};
84+
85+
if(!window.initializeAppHelper){
86+
window.initializeAppHelper = (componentName) => ({
87+
setProps: (newProps) => root.render(pages[componentName](newProps))
88+
});
89+
}
90+
91+
if(action === "hydrate"){
92+
pages.ReactDOM.hydrate(pages[componentName](componentProps), app);
93+
94+
} else if (action === "render") {
95+
root.render(pages[componentName](componentProps));
96+
}
97+
};
98+
window.appRoot("hydrate", "${componentName}", ${JSON.stringify(props)});
99+
</script>
100+
`));
101+
}
102+
103+
export const wrapAdminReactPage = (componentName: string, pageComponent: React.ReactElement, props = {}, styles = "") => {
104+
let pageContent = ReactDOMServer.renderToString(pageComponent);
105+
106+
apiker.responseHeaders.set("Content-Security-Policy", "frame-ancestors 'none';");
107+
apiker.responseHeaders.set("X-Frame-Options", "deny");
108+
109+
return resRaw(adminPageHeader(styles) + pageContent + adminPageFooter(`
56110
<script>
57111
window.appRoot = (action, componentName, props = {}) => {
58112
const domNode = document.getElementById("app");

0 commit comments

Comments
 (0)