40 lines
1.1 KiB
JavaScript
40 lines
1.1 KiB
JavaScript
// src/jsx/context.ts
|
|
import { raw } from "../helper/html/index.js";
|
|
import { JSXFragmentNode } from "./base.js";
|
|
import { DOM_RENDERER } from "./constants.js";
|
|
import { createContextProviderFunction } from "./dom/context.js";
|
|
var globalContexts = [];
|
|
var createContext = (defaultValue) => {
|
|
const values = [defaultValue];
|
|
const context = {
|
|
values,
|
|
Provider(props) {
|
|
values.push(props.value);
|
|
let string;
|
|
try {
|
|
string = props.children ? (Array.isArray(props.children) ? new JSXFragmentNode("", {}, props.children) : props.children).toString() : "";
|
|
} finally {
|
|
values.pop();
|
|
}
|
|
if (string instanceof Promise) {
|
|
return string.then(
|
|
(resString) => raw(resString, resString.callbacks)
|
|
);
|
|
} else {
|
|
return raw(string);
|
|
}
|
|
}
|
|
};
|
|
context.Provider[DOM_RENDERER] = createContextProviderFunction(values);
|
|
globalContexts.push(context);
|
|
return context;
|
|
};
|
|
var useContext = (context) => {
|
|
return context.values.at(-1);
|
|
};
|
|
export {
|
|
createContext,
|
|
globalContexts,
|
|
useContext
|
|
};
|