@ovine/init
Version:
Apply ovine template more easily.
122 lines (109 loc) • 2.85 kB
JSX
/**
* 自定义页面
* ----
* 主要是参考如何编写自定义页面,请自行删除。
*/
import { Button, Spinner, Drawer } from 'amis'
import { Editor } from 'amis/lib/components'
import React from 'react'
import { app } from '@core/app'
import { Amis } from '@core/components/amis/schema'
import { useImmer } from '@core/utils/hooks'
import { getStore, setStore } from '@core/utils/store'
import { storeKeys } from '~/app/constants'
import { StyledStart } from './styled'
const templateSchema = JSON.stringify(
{
type: 'page',
title: '点击右下角按钮,编辑schema',
body: {
type: 'alert',
body: '只有正确的JSON格式,才能被正常渲染~',
level: 'success',
},
},
undefined,
2
)
const initState = () => {
const storedInput = getStore(storeKeys.schemaEditor) || templateSchema
return {
drawerVisible: false,
loading: true,
schemaInput: storedInput,
schema: JSON.parse(storedInput),
}
}
export default () => {
const [state, setState] = useImmer(initState)
const { loading, schema, schemaInput, drawerVisible } = state
const theme = app.theme.getName()
const onEditorMounted = () => {
if (loading) {
setState((d) => {
d.loading = false
})
}
}
const onEditorChange = (value) => {
let jsonVal = ''
try {
jsonVal = JSON.parse(value)
} catch (e) {
//
}
setState((d) => {
d.schemaInput = value
if (jsonVal) {
d.schema = jsonVal
setStore(storeKeys.schemaEditor, value)
}
})
}
const toggleDrawer = () => {
setState((d) => {
d.drawerVisible = !d.drawerVisible
})
}
return (
<StyledStart>
{schema && <Amis schema={schema} />}
<Drawer
closeOnOutside
overlay={false}
theme={theme}
size="md"
onHide={toggleDrawer}
show={drawerVisible}
position="right"
>
<Spinner overlay show={drawerVisible && loading} size="lg" />
<a className="p-md" href="https://baidu.github.io/amis/zh-CN/components/page" target="_blank">
<i className="fa fa-flag p-r-xs" />
<span>点击查看Amis渲染器手册</span>
</a>
{drawerVisible && (
<Editor
editorDidMount={onEditorMounted}
onChange={onEditorChange}
editorTheme={theme === 'dark' ? 'vs-dark' : 'vs'}
language="json"
value={schemaInput}
/>
)}
</Drawer>
<div className="action-edit">
<Button
iconOnly
theme={theme}
level="danger"
placement="top"
tooltip="编辑schema"
onClick={toggleDrawer}
>
<i className="fa fa-edit" />
</Button>
</div>
</StyledStart>
)
}