import React from "react"; import { FabricButton } from "@gland/react/button"; import { Modal } from "@gland/react/modal"; import { TextInput } from "@gland/react/input"; import { ChoiceGroup } from "@gland/react/radio"; import { ToolAttr } from "../utils"; import { toolClasses as classes } from "../style"; import { CodeMirror } from "@gland/react/common/CodeMirror"; function reducer(state, action) { let newState = state; let type = action?.type; let payload = action?.payload; if (type === "OpenModal") { let catalog = payload.data?.catalog || lastCatalog; return Object.assign({}, state, { open: true, loading: false, key: payload.key, data: { catalog, align: payload.data?.align || "center", value: payload.data?.value || "", width: payload.data?.width || 640, height: payload.data?.height || 360, }, href: payload.key && catalog === "0" ? payload.data?.value || "" : "", html: payload.key && catalog === "1" ? payload.data?.value || getDefaultHtml() : getDefaultHtml(), }); } else if (type === "StateChange") { return Object.assign({}, state, payload); } else if (type == "CloseModal") { return Object.assign({}, state, { open: false, loading: false, }); } return newState; } function initer(props) { return { open: false, loading: false, key: "", data: { catalog: "0", align: "center", value: "", width: 640, height: 360, }, href: "", html: "", }; } let lastCatalog = "0"; const codeOptions = { mode: "htmlmixed", theme: "material", lineNumbers: true, }; export function IframeEditModal(props: { attr: ToolAttr }) { const [state, dispatch] = React.useReducer(reducer, props, initer); const attr = props.attr; const lang = attr.lang; React.useEffect(() => { const attr = props.attr; function OpenEdit(options) { dispatch({ type: "OpenModal", payload: options, }); } attr.event.on(attr.editEvent.openEditIframe, OpenEdit); return () => { attr.event.off(attr.editEvent.openEditIframe, OpenEdit); }; }, []); const modalAttr = React.useRef({} as { input }).current; return ( { if (state.loading) return; dispatch({ type: "CloseModal" }); attr.event.emit(attr.editEvent.focus); }} >
{lang.other.iframeFrom} { dispatch({ type: "StateChange", payload: { data: { ...state.data, catalog: item.key, }, }, }); lastCatalog = item.key; }} />
{state.data.catalog === "0" ? ( { dispatch({ type: "StateChange", payload: { href: e.target.value, }, }); }} /> ) : (
{ dispatch({ type: "StateChange", payload: { html: value, }, }); }} />
)}
{lang.base.align}: { dispatch({ type: "StateChange", payload: { data: Object.assign({}, state.data, { align: item.key }), }, }); }} />
{ dispatch({ type: "StateChange", payload: { data: Object.assign({}, state.data, { width: e.target.value }), }, }); }} />
{ dispatch({ type: "StateChange", payload: { data: Object.assign({}, state.data, { height: e.target.value }), }, }); }} />
{ dispatch({ type: "CloseModal" }); let key = state.key; let data = Object.assign({}, state.data); if (data.catalog === "0") { data.value = state.href; } else { data.value = state.html; } data.width = parseInt(data.width) || 640; data.height = parseInt(data.height) || 360; if (key) { attr.event.emit(attr.editEvent.editIframe, { key, data, }); } else { attr.event.emit(attr.editEvent.addIframe, data); } }} > {lang.base.confirm} { if (state.loading) return; dispatch({ type: "CloseModal" }); attr.event.emit(attr.editEvent.focus); }} > {lang.base.cancel}
); } function getDefaultHtml() { return ` `; }