EditDrawer.js 3.8 KB
import { Button, Drawer, Input, message } from 'antd';
import React, { useEffect, useState, useRef } from 'react';
import { connect } from 'dva';
import ButtonDiy from '@/baseComponent/ButtonDiy';
import moment from 'moment';
import styles from './styles.less';
import { getUserInfo } from '@/webPublic/one_stop_public/utils/token';

const { TextArea } = Input;

function EditDrawer(props) {
	const { dispatch, templateData, TEMPLATE } = props;
	const [loading, setLoading] = useState(false);
  // const [showEdit, setShowEdit] = useState(process.env.NODE_ENV === 'development');
  const [showEdit, setShowEdit] = useState(false);
	const saveTimeOut = useRef();
	const [lowCodeEdit, setLowCodeEdit] = useState({});

	useEffect(
		() => {
			if (templateData) {
				setLowCodeEdit({ ...templateData });
			}
		},
		[templateData],
	);

	const onClose = () => {
		setShowEdit(!showEdit);
	};

	const handleSaveTemplate = () => {
		lowCodeEdit.updateTime = moment().format('YYYY-MM-DD HH:mm:ss');
		const content = JSON.stringify(lowCodeEdit);
		message.info('正在保存数据,请耐心等待');
		setLoading(true);
		dispatch({
			type: 'lowCode_design/saveTemplateApi',
			payload: {
				name: lowCodeEdit.name,
				content,
				TEMPLATE,
			},
			callback: () => {
				saveTimeOut.current = null;
				setLoading(false);
			},
		});
	};
	const changeKey = (value, key) => {
		let newCodeEdit = lowCodeEdit;
		newCodeEdit[key] = value;
		setLowCodeEdit(newCodeEdit);
	};

	// TODO localStorage 事件中获取的state 不是最新的.

	const handleLocalStorageSave = (e) => {
		if (e.key === 'save-low-code-local') {
			const newV = e.newValue;
			if (newV && newV.length > 20) {
				changeKey(newV, 'beforeShow');
				if (!saveTimeOut.current) {
					saveTimeOut.current = window.setTimeout(() => {
						message.info('正在保存');
						handleSaveTemplate();
					}, 500);
				}
			}
		}
	};

	useEffect(
		() => {
			if (lowCodeEdit?.beforeShow) {
				window.addEventListener('storage', handleLocalStorageSave);
			}
			return () => {
				window.removeEventListener('storage', handleLocalStorageSave);
			};
		},
		[lowCodeEdit.beforeShow],
	);

	const editFullScreen = () => {
		localStorage.setItem('edit-low-code-local', JSON.stringify(lowCodeEdit));
		if (process.env.NODE_ENV === 'development') {
			window.open(
				'http://scjoyedu.eicp.net:51352/wisdomYsgz/#/quanPingBianji?id=' + lowCodeEdit.TEMPLATE,
			);
		}
		window.open(
			window.location.origin + '/wisdomYsgz/#/quanPingBianji?id=' + lowCodeEdit.TEMPLATE,
		);
	};

	return (
		<>
			<Drawer
				title="编辑"
				placement="right"
				onClose={onClose}
				visible={showEdit}
				width={700}
				maskClosable={false}>
				<TextArea
					autoSize={{
						minRows: 5,
						maxRows: 10,
					}}
					value={JSON.stringify(templateData, null, '\t')}
					disabled={true}
					style={{ marginBottom: '20px' }}
				/>

				{loading ? (
					'正在保存中请勿编辑'
				) : (
					<>
						挂载前执行
						<ButtonDiy name={'全屏编辑'} handleClick={editFullScreen} type={'danger'} />
						<TextArea
							autoSize={{
								minRows: 10,
								maxRows: 15,
							}}
							defaultValue={lowCodeEdit?.beforeShow || ''}
							onChange={(e) => {
								changeKey(e.target.value, 'beforeShow');
							}}
							// readOnly={true}
							style={{ marginBottom: '20px' }}
						/>
						<Button onClick={handleSaveTemplate} type={'primary'}>
							保存
						</Button>
					</>
				)}
			</Drawer>
			<div
				data-edit-point={'EditDrawer'}
				className={styles.editPoint}
				style={{
					display: getUserInfo().stuNo === 'admin' || process.env.NODE_ENV === 'development' ? 'block' : 'none',
				}}
				onClick={() => {
					setShowEdit(!showEdit);
				}}>
				模板编辑
			</div>
		</>
	);
}

export default connect(({ lowCode_design }) => {
	return {
		templateData: lowCode_design.templateData,
	};
})(EditDrawer);