92 lines
2.2 KiB
TypeScript
Executable File
92 lines
2.2 KiB
TypeScript
Executable File
import { useLocal } from "@/utils/use-local";
|
|
import { FC, Fragment, isValidElement } from "react";
|
|
import { getProp } from "./utils/get-prop";
|
|
import { MDActions, MDLocal } from "./utils/typings";
|
|
|
|
export const MDAction: FC<{ md: MDLocal; PassProp: any; child: any }> = ({
|
|
md,
|
|
PassProp,
|
|
child,
|
|
}) => {
|
|
const local = useLocal({
|
|
last_render: Date.now(),
|
|
});
|
|
|
|
if (isEditor) {
|
|
refreshActionInternal(md, () => {
|
|
if (Date.now() - local.last_render > 1000) {
|
|
md.render();
|
|
}
|
|
local.last_render = Date.now();
|
|
});
|
|
} else {
|
|
if (md.internal.action_should_refresh) {
|
|
refreshActionInternal(md, () => {
|
|
md.render();
|
|
});
|
|
}
|
|
}
|
|
return (
|
|
<div
|
|
className={cx(
|
|
"c-flex c-flex-row c-space-x-1 c-items-stretch c-self-stretch c-h-full"
|
|
)}
|
|
>
|
|
{child}
|
|
{/* {md.actions.map((e, idx) => {
|
|
if (isValidElement(e)) {
|
|
return <Fragment key={idx}>{e}</Fragment>;
|
|
}
|
|
if (typeof e === "object" && (e.action || e.label)) {
|
|
return <PassProp item={e}>{child}</PassProp>;
|
|
}
|
|
})} */}
|
|
</div>
|
|
);
|
|
};
|
|
|
|
const refreshActionInternal = (md: MDLocal, callback: () => void) => {
|
|
if (md.internal.action_should_refresh) {
|
|
md.internal.action_should_refresh = false;
|
|
}
|
|
|
|
let mode = "master";
|
|
|
|
if (isEditor) {
|
|
mode = md.props.editor_tab;
|
|
} else {
|
|
if (md.selected) {
|
|
if (!md.tab.active) {
|
|
md.tab.active = md.tab.list[0];
|
|
}
|
|
mode = md.tab.active;
|
|
}
|
|
}
|
|
if (mode === "master") {
|
|
const master_bread = getProp(md.master.internal, "actions", { md });
|
|
if (master_bread instanceof Promise) {
|
|
master_bread.then((e) => done(md, e, callback));
|
|
} else {
|
|
done(md, master_bread, callback);
|
|
}
|
|
} else {
|
|
const detail = md.childs[mode];
|
|
if (detail) {
|
|
const detail_bread = getProp(detail.internal, "actions", { md });
|
|
|
|
if (detail_bread instanceof Promise) {
|
|
detail_bread.then((e) => done(md, e, callback));
|
|
} else {
|
|
done(md, detail_bread, callback);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
const done = (md: MDLocal, actions: MDActions, callback: () => void) => {
|
|
if (Array.isArray(actions)) {
|
|
md.actions = actions;
|
|
callback();
|
|
}
|
|
};
|