@@ -3,7 +3,24 @@ import ReactDOMServer from "react-dom/server";
3
3
import { resRaw } from "../Response" ;
4
4
import { apiker } from "../Apiker" ;
5
5
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 = "" ) => `
7
24
<!DOCTYPE html>
8
25
<html lang="en">
9
26
<head>
@@ -33,7 +50,7 @@ export const pageHeader = (styles = "") => `
33
50
<div id="app">
34
51
` ;
35
52
36
- export const pageFooter = ( prepend = "" ) => `
53
+ export const adminPageFooter = ( prepend = "" ) => `
37
54
</div>
38
55
<script src="https://cdn.jsdelivr.net/npm/[email protected] /umd/react.production.min.js"></script>
39
56
<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
53
70
apiker . responseHeaders . set ( "X-Frame-Options" , "deny" ) ;
54
71
55
72
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 ( `
56
110
<script>
57
111
window.appRoot = (action, componentName, props = {}) => {
58
112
const domNode = document.getElementById("app");
0 commit comments