Bin
2025-12-16 9e0b2ba2c317b1a86212f24cbae3195ad1f3dbfa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import parseHTML from "html-react-parser";
import React from "react";
import { reInsertScripts } from "../../utils/scripts";
import { AsyncPageContext } from "../AsyncPage/AsyncPage";
 
const parseContent = (id, source, children, parse) => {
  let result;
  let setInnerHTML = false;
 
  if (!children || children.length === 0 || children instanceof Function) {
    const template = source.querySelector(`template#${id}`);
    const templateHTML = template.innerHTML ?? "";
 
    if (parse) {
      const parsed = parseHTML(templateHTML);
      const childResult = children instanceof Function ? children(parsed) : false;
 
      result = childResult || parsed;
    } else {
      const childResult = children instanceof Function ? children(template) : false;
 
      if (childResult) {
        result = childResult;
      } else {
        result = templateHTML;
        setInnerHTML = true;
      }
    }
  } else {
    result = children;
  }
 
  return { children: result, setInnerHTML };
};
 
const StaticContentDrawer = React.forwardRef(
  ({ id, tagName, children, source, onRenderFinished, parse = false, raw = false, ...props }, ref) => {
    const rootRef = ref ?? React.useRef();
 
    const [content, setContent] = React.useState(parseContent(id, source, children, parse));
 
    React.useEffect(() => {
      setContent(parseContent(id, source, children, parse));
    }, [source, children]);
 
    React.useEffect(() => {
      if (rootRef.current) reInsertScripts(rootRef.current);
      onRenderFinished?.();
    }, [content]);
 
    if (content.setInnerHTML) {
      props.dangerouslySetInnerHTML = { __html: content.children };
    } else {
      props.children = content.children;
    }
 
    return raw === true && content.children ? (
      <React.Fragment children={content.children} />
    ) : (
      React.createElement(tagName ?? "div", {
        ...props,
        ref: rootRef,
      })
    );
  },
);
 
export const StaticContent = React.forwardRef((props, ref) => {
  const pageSource = React.useContext(AsyncPageContext);
 
  return pageSource ? <StaticContentDrawer {...props} source={pageSource} ref={ref} /> : null;
});