168 lines
5.0 KiB
TypeScript
168 lines
5.0 KiB
TypeScript
import dynamic from 'next/dynamic'
|
|
import Split from 'react-split'
|
|
import { useSnapshot } from 'valtio'
|
|
import { Box, Container, Flex, Tab, Tabs } from '../../components'
|
|
import Transaction from '../../components/Transaction'
|
|
import state, { renameTxState } from '../../state'
|
|
import { getSplit, saveSplit } from '../../state/actions/persistSplits'
|
|
import { transactionsState, modifyTxState } from '../../state'
|
|
import { useEffect, useState } from 'react'
|
|
import { FileJs } from 'phosphor-react'
|
|
import RunScript from '../../components/RunScript'
|
|
|
|
const DebugStream = dynamic(() => import('../../components/DebugStream'), {
|
|
ssr: false
|
|
})
|
|
|
|
const LogBox = dynamic(() => import('../../components/LogBox'), {
|
|
ssr: false
|
|
})
|
|
const Accounts = dynamic(() => import('../../components/Accounts'), {
|
|
ssr: false
|
|
})
|
|
|
|
const Test = () => {
|
|
// This and useEffect is here to prevent useLayoutEffect warnings from react-split
|
|
const [showComponent, setShowComponent] = useState(false)
|
|
const { transactionLogs } = useSnapshot(state)
|
|
const { transactions, activeHeader } = useSnapshot(transactionsState)
|
|
const snap = useSnapshot(state)
|
|
useEffect(() => {
|
|
setShowComponent(true)
|
|
}, [])
|
|
if (!showComponent) {
|
|
return null
|
|
}
|
|
const hasScripts = Boolean(snap.files.filter(f => f.name.toLowerCase()?.endsWith('.js')).length)
|
|
|
|
const renderNav = () => (
|
|
<Flex css={{ gap: '$3' }}>
|
|
{snap.files
|
|
.filter(f => f.name.endsWith('.js'))
|
|
.map(file => (
|
|
<RunScript file={file} key={file.name} />
|
|
))}
|
|
</Flex>
|
|
)
|
|
|
|
return (
|
|
<Container css={{ px: 0 }}>
|
|
<Split
|
|
direction="vertical"
|
|
sizes={
|
|
hasScripts && getSplit('testVertical')?.length === 2
|
|
? [50, 20, 30]
|
|
: hasScripts
|
|
? [50, 20, 50]
|
|
: [50, 50]
|
|
}
|
|
gutterSize={4}
|
|
gutterAlign="center"
|
|
style={{ height: 'calc(100vh - 60px)' }}
|
|
onDragEnd={e => saveSplit('testVertical', e)}
|
|
>
|
|
<Flex
|
|
row
|
|
fluid
|
|
css={{
|
|
justifyContent: 'center',
|
|
p: '$3 $2'
|
|
}}
|
|
>
|
|
<Split
|
|
direction="horizontal"
|
|
sizes={getSplit('testHorizontal') || [50, 50]}
|
|
minSize={[180, 320]}
|
|
gutterSize={4}
|
|
gutterAlign="center"
|
|
style={{
|
|
display: 'flex',
|
|
flexDirection: 'row',
|
|
width: '100%',
|
|
height: '100%'
|
|
}}
|
|
onDragEnd={e => saveSplit('testHorizontal', e)}
|
|
>
|
|
<Box css={{ width: '55%', px: '$2' }}>
|
|
<Tabs
|
|
label="Transaction"
|
|
activeHeader={activeHeader}
|
|
// TODO make header a required field
|
|
onChangeActive={(idx, header) => {
|
|
if (header) transactionsState.activeHeader = header
|
|
}}
|
|
keepAllAlive
|
|
defaultExtension="json"
|
|
allowedExtensions={['json']}
|
|
onCreateNewTab={header => modifyTxState(header, {})}
|
|
onRenameTab={(idx, nwName, oldName = '') => renameTxState(oldName, nwName)}
|
|
onCloseTab={(idx, header) => header && modifyTxState(header, undefined)}
|
|
>
|
|
{transactions.map(({ header, state }) => (
|
|
<Tab key={header} header={header}>
|
|
<Transaction state={state} header={header} />
|
|
</Tab>
|
|
))}
|
|
</Tabs>
|
|
</Box>
|
|
<Box css={{ width: '45%', mx: '$2', height: '100%' }}>
|
|
<Accounts card hideDeployBtn showHookStats />
|
|
</Box>
|
|
</Split>
|
|
</Flex>
|
|
{hasScripts ? (
|
|
<Flex
|
|
as="div"
|
|
css={{
|
|
borderTop: '1px solid $mauve6',
|
|
background: '$mauve1',
|
|
flexDirection: 'column'
|
|
}}
|
|
>
|
|
<LogBox
|
|
Icon={FileJs}
|
|
title="Helper scripts"
|
|
logs={snap.scriptLogs}
|
|
clearLog={() => (state.scriptLogs = [])}
|
|
renderNav={renderNav}
|
|
/>
|
|
</Flex>
|
|
) : null}
|
|
<Flex>
|
|
<Split
|
|
direction="horizontal"
|
|
sizes={[50, 50]}
|
|
minSize={[320, 160]}
|
|
gutterSize={4}
|
|
gutterAlign="center"
|
|
style={{
|
|
display: 'flex',
|
|
flexDirection: 'row',
|
|
width: '100%',
|
|
height: '100%'
|
|
}}
|
|
>
|
|
<Box
|
|
css={{
|
|
borderRight: '1px solid $mauve8',
|
|
height: '100%'
|
|
}}
|
|
>
|
|
<LogBox
|
|
title="Development Log"
|
|
logs={transactionLogs}
|
|
clearLog={() => (state.transactionLogs = [])}
|
|
/>
|
|
</Box>
|
|
<Box css={{ height: '100%' }}>
|
|
<DebugStream />
|
|
</Box>
|
|
</Split>
|
|
</Flex>
|
|
</Split>
|
|
</Container>
|
|
)
|
|
}
|
|
|
|
export default Test
|