/* * @Author: yehuozhili * @Date: 2021-03-14 05:42:13 * @LastEditors: yehuozhili * @LastEditTime: 2021-07-12 20:36:30 * @FilePath: \dooringx\packages\dooringx-lib\src\components\rightConfig.tsx */ import { CreateOptionsRes } from '../core/components/formTypes'; import { IBlockType, IStoreData } from '../core/store/storetype'; import { PropsWithChildren, useEffect, useMemo, useState } from 'react'; import React from 'react'; import { Tabs, Input, Row, Col, Checkbox } from 'antd'; import UserConfig from '../config'; import { RGBColor, SketchPicker } from 'react-color'; import { rgba2Obj } from '../core/utils'; import deepcopy from 'deepcopy'; interface RightConfigProps { state: IStoreData; config: UserConfig; } /** * * 这里一个需要异步拿取当前注册组件的配置项,另外需要异步加载所需的配置项。 * @param {*} props * @returns */ function RightConfig(props: PropsWithChildren) { const [menuSelect, setMenuSelect] = useState('0'); const [current, setCurrent] = useState(null); const rightMapRenderListCategory = useMemo(() => { return props.config.getConfig().rightRenderListCategory; }, [props.config]); const store = props.config.getStore(); useEffect(() => { const fn = () => { let item: IBlockType | undefined; store.getData().block.some((v) => { if (v.focus) { item = v; } return v.focus === true; }); if (item) { setCurrent({ ...item }); } else { setCurrent(null); } }; const unregist = store.subscribe(fn); return () => { unregist(); }; }, [store]); const render = useMemo(() => { return (type: string, current: IBlockType) => { const fn = () => props.config.getComponentRegister().getComp(current.name); const data = fn(); // 这里不可能拿不到组件,因为点击的那个组件已经渲染出来了 if (data) { const renderList = data.props[type]; if (renderList) { return renderList.map((v, i) => { const Component = props.config.getFormRegister().formMap[v.type]; if (!Component) { console.error(`you might forgot to regist form component ${v.type}`); return null; } return ( } current={current} config={props.config} > ); }); } else { return
还没有配置属性
; } } return null; }; }, [props.config]); const initColor = useMemo(() => { return props.config.getStoreChanger().isEdit() ? rgba2Obj(props.config.getStoreChanger().getOrigin()?.now.globalState.containerColor) : rgba2Obj(props.config.getStore().getData().globalState.containerColor); }, [props.config]); const initColor2 = useMemo(() => { return props.config.getStoreChanger().isEdit() ? rgba2Obj(props.config.getStoreChanger().getOrigin()?.now.globalState.bodyColor) : rgba2Obj(props.config.getStore().getData().globalState.bodyColor); }, [props.config]); const [color, setColor] = useState(initColor); const [color2, setColor2] = useState(initColor2); const [colorPickerVisible, setColorPickerVisible] = useState(false); const [colorPickerVisible2, setColorPickerVisible2] = useState(false); const initTitle = useMemo(() => { const title = props.config.getStoreChanger().isEdit() ? props.config.getStoreChanger().getOrigin()?.now.globalState.title : props.config.getStore().getData().globalState.title; return title; }, [props.config]); const [title, setTitle] = useState(initTitle); const customGlobal = props.config.getConfig().rightGlobalCustom; const isEdit = props.config.getStoreChanger().isEdit(); const modalName = props.config.getStoreChanger().getState().modalEditName; const originData = props.config.getStoreChanger().getOrigin()?.now; return (
{current && ( { setMenuSelect(e); }} > {rightMapRenderListCategory.map((v, i) => { return (
{v.custom && v.customRender && v.customRender(v.type, current)} {!v.custom && render(v.type, current)}
); })}
)} {!current && !isEdit && !customGlobal && (
全局设置 标题 { const val = e.target.value; setTitle(val); const isEdit = props.config.getStoreChanger().isEdit(); if (isEdit) { const originData: IStoreData = deepcopy( props.config.getStoreChanger().getOrigin()!.now ); originData.globalState.title = val; props.config.getStoreChanger().updateOrigin(originData); } else { const originData = deepcopy(props.config.getStore().getData()); originData.globalState.title = val; props.config.getStore().setData(originData); } }} /> 容器底色 {
{ setColorPickerVisible((pre) => !pre); }} style={{ background: '#fff', borderRadius: '1px', boxShadow: '0 0 0 1px rgba(0,0,0,.1)', cursor: 'pointer', display: 'inline-block', }} >
{colorPickerVisible && ( <>
{ const newcolor = c.rgb; setColor(newcolor); const isEdit = props.config.getStoreChanger().isEdit(); if (isEdit) { const originData: IStoreData = deepcopy( props.config.getStoreChanger().getOrigin()!.now ); originData.globalState.containerColor = `rgba(${newcolor.r}, ${newcolor.g}, ${newcolor.b}, ${newcolor.a})`; props.config.getStoreChanger().updateOrigin(originData); } else { const originData = deepcopy(props.config.getStore().getData()); originData.globalState.containerColor = `rgba(${newcolor.r}, ${newcolor.g}, ${newcolor.b}, ${newcolor.a})`; props.config.getStore().setData(originData); } }} >
setColorPickerVisible(false)} /> )}
} body底色 {
{ setColorPickerVisible2((pre) => !pre); }} style={{ background: '#fff', borderRadius: '1px', boxShadow: '0 0 0 1px rgba(0,0,0,.1)', cursor: 'pointer', display: 'inline-block', }} >
{colorPickerVisible2 && ( <>
{ const newcolor = c.rgb; setColor2(newcolor); const isEdit = props.config.getStoreChanger().isEdit(); if (isEdit) { const originData: IStoreData = deepcopy( props.config.getStoreChanger().getOrigin()!.now ); originData.globalState.bodyColor = `rgba(${newcolor.r}, ${newcolor.g}, ${newcolor.b}, ${newcolor.a})`; props.config.getStoreChanger().updateOrigin(originData); } else { const originData = deepcopy(props.config.getStore().getData()); originData.globalState.bodyColor = `rgba(${newcolor.r}, ${newcolor.g}, ${newcolor.b}, ${newcolor.a})`; props.config.getStore().setData(originData); } }} >
setColorPickerVisible2(false)} /> )}
}
)} {!current && !isEdit && customGlobal && customGlobal} {!current && isEdit && (
弹窗设置 取消点击删除弹窗 { const val = e.target.checked; const cloneData = deepcopy(originData); if (cloneData) { cloneData.modalConfig[modalName] = val; props.config.getStoreChanger().updateOrigin(cloneData); props.config.getStore().forceUpdate(); } }} >
)}
); } export default RightConfig;