parent
3bbedd600d
commit
2ac386a2f4
@ -0,0 +1,473 @@ |
||||
|
||||
import React from 'react' |
||||
import { FormattedMessage, useIntl } from 'react-intl' |
||||
import { AppModal } from '@remix-ui/app' |
||||
import { ViewPlugin } from '@remixproject/engine-web' |
||||
import { PluginViewWrapper } from '@remix-ui/helper' |
||||
import { RemixUIGridView } from '@remix-ui/remix-ui-grid-view' |
||||
import { RemixUIGridSection } from '@remix-ui/remix-ui-grid-section' |
||||
import { RemixUIGridCell } from '@remix-ui/remix-ui-grid-cell' |
||||
import type { TemplateGroup } from '@remix-ui/workspace' |
||||
|
||||
const isElectron = require('is-electron') |
||||
|
||||
//@ts-ignore
|
||||
const _paq = (window._paq = window._paq || []) |
||||
|
||||
const profile = { |
||||
name: 'templateSelection', |
||||
displayName: 'Template Selection', |
||||
description: 'templateSelection', |
||||
location: 'mainPanel', |
||||
methods: [], |
||||
events: [] |
||||
} |
||||
|
||||
export class TemplatesSelection extends ViewPlugin { |
||||
templates: Array<TemplateGroup> |
||||
dispatch: React.Dispatch<any> = () => { } |
||||
constructor() { |
||||
super(profile) |
||||
} |
||||
|
||||
async onActivation() { |
||||
this.handleThemeChange() |
||||
await this.call('tabs', 'focus', 'remixGuide') |
||||
this.renderComponent() |
||||
_paq.push(['trackEvent', 'plugin', 'activated', 'remixGuide']) |
||||
} |
||||
|
||||
onDeactivation(): void { |
||||
} |
||||
|
||||
private handleThemeChange() { |
||||
this.on('theme', 'themeChanged', (theme: any) => { |
||||
this.renderComponent() |
||||
}) |
||||
} |
||||
|
||||
setDispatch(dispatch: React.Dispatch<any>): void { |
||||
this.dispatch = dispatch |
||||
this.renderComponent() |
||||
} |
||||
|
||||
render() { |
||||
return ( |
||||
<div className="bg-dark" id="remixGuide"> |
||||
<PluginViewWrapper plugin={this} /> |
||||
</div> |
||||
) |
||||
} |
||||
|
||||
renderComponent() { |
||||
this.dispatch({ |
||||
...this, |
||||
}) |
||||
} |
||||
|
||||
updateComponent() { |
||||
/* |
||||
const opts = { |
||||
// @ts-ignore: Object is possibly 'null'.
|
||||
mintable: mintableCheckboxRef.current.checked, |
||||
// @ts-ignore: Object is possibly 'null'.
|
||||
burnable: burnableCheckboxRef.current.checked, |
||||
// @ts-ignore: Object is possibly 'null'.
|
||||
pausable: pausableCheckboxRef.current.checked, |
||||
// @ts-ignore: Object is possibly 'null'.
|
||||
upgradeable: transparentRadioRef.current.checked ? transparentRadioRef.current.value : uupsRadioRef.current.checked ? uupsRadioRef.current.value : false |
||||
} |
||||
*/ |
||||
this.templates = [ |
||||
{ |
||||
name: "Generic", |
||||
items: [ |
||||
{ value: "remixDefault", displayName: window._intl.formatMessage({ id: 'filePanel.basic' }) }, |
||||
{ value: "blank", displayName: window._intl.formatMessage({ id: 'filePanel.blank' }) } |
||||
] |
||||
}, |
||||
{ |
||||
name: "OpenZeppelin", |
||||
items: [ |
||||
{ |
||||
value: "ozerc20", |
||||
displayName: "ERC20" |
||||
}, |
||||
{ |
||||
value: "ozerc721", |
||||
displayName: "ERC721 (NFT)" |
||||
}, |
||||
{ |
||||
value: "ozerc1155", |
||||
displayName: "ERC1155" |
||||
}, |
||||
{ |
||||
value: "ozerc20", |
||||
displayName: "ERC20", |
||||
opts: { |
||||
mintable: true |
||||
} |
||||
}, |
||||
{ |
||||
value: "ozerc721", |
||||
displayName: "ERC721 (NFT)", |
||||
opts: { |
||||
mintable: true |
||||
} |
||||
}, |
||||
{ |
||||
value: "ozerc1155", |
||||
displayName: "ERC1155", |
||||
opts: { |
||||
mintable: true |
||||
} |
||||
}, |
||||
{ |
||||
value: "ozerc20", |
||||
displayName: "ERC20", |
||||
opts: { |
||||
mintable: true, |
||||
burnable: true |
||||
} |
||||
}, |
||||
{ |
||||
value: "ozerc721", |
||||
displayName: "ERC721 (NFT)", |
||||
opts: { |
||||
mintable: true, |
||||
burnable: true |
||||
} |
||||
}, |
||||
{ |
||||
value: "ozerc1155", |
||||
displayName: "ERC1155", |
||||
opts: { |
||||
mintable: true, |
||||
burnable: true |
||||
} |
||||
}, |
||||
{ |
||||
value: "ozerc20", |
||||
displayName: "ERC20", |
||||
opts: { |
||||
mintable: true, |
||||
pausable: true |
||||
} |
||||
}, |
||||
{ |
||||
value: "ozerc721", |
||||
displayName: "ERC721 (NFT)", |
||||
opts: { |
||||
mintable: true, |
||||
pausable: true |
||||
} |
||||
}, |
||||
{ |
||||
value: "ozerc1155", |
||||
displayName: "ERC1155", |
||||
opts: { |
||||
mintable: true, |
||||
pausable: true |
||||
} |
||||
} |
||||
] |
||||
}, |
||||
{ |
||||
name: "OpenZeppelin Proxy", |
||||
items: [ |
||||
{ |
||||
value: "ozerc20", |
||||
displayName: "ERC20", |
||||
opts: { |
||||
upgradeable: 'uups' |
||||
} |
||||
}, |
||||
{ |
||||
value: "ozerc721", |
||||
displayName: "ERC721 (NFT)", |
||||
opts: { |
||||
upgradeable: 'uups' |
||||
} |
||||
}, |
||||
{ |
||||
value: "ozerc1155", |
||||
displayName: "ERC1155", |
||||
opts: { |
||||
upgradeable: 'uups' |
||||
} |
||||
}, |
||||
{ |
||||
value: "ozerc20", |
||||
displayName: "ERC20", |
||||
opts: { |
||||
upgradeable: 'uups', |
||||
mintable: true |
||||
} |
||||
}, |
||||
{ |
||||
value: "ozerc721", |
||||
displayName: "ERC721 (NFT)", |
||||
opts: { |
||||
upgradeable: 'uups', |
||||
mintable: true |
||||
} |
||||
}, |
||||
{ |
||||
value: "ozerc1155", |
||||
displayName: "ERC1155", |
||||
opts: { |
||||
upgradeable: 'uups', |
||||
mintable: true |
||||
} |
||||
}, |
||||
{ |
||||
value: "ozerc20", |
||||
displayName: "ERC20", |
||||
opts: { |
||||
upgradeable: 'uups', |
||||
mintable: true, |
||||
burnable: true |
||||
} |
||||
}, |
||||
{ |
||||
value: "ozerc721", |
||||
displayName: "ERC721 (NFT)", |
||||
opts: { |
||||
upgradeable: 'uups', |
||||
mintable: true, |
||||
burnable: true |
||||
} |
||||
}, |
||||
{ |
||||
value: "ozerc1155", |
||||
displayName: "ERC1155", |
||||
opts: { |
||||
upgradeable: 'uups', |
||||
mintable: true, |
||||
burnable: true |
||||
} |
||||
}, |
||||
{ |
||||
value: "ozerc20", |
||||
displayName: "ERC20", |
||||
opts: { |
||||
upgradeable: 'uups', |
||||
mintable: true, |
||||
pausable: true |
||||
} |
||||
}, |
||||
{ |
||||
value: "ozerc721", |
||||
displayName: "ERC721 (NFT)", |
||||
opts: { |
||||
upgradeable: 'uups', |
||||
mintable: true, |
||||
pausable: true |
||||
} |
||||
}, |
||||
{ |
||||
value: "ozerc1155", |
||||
displayName: "ERC1155", |
||||
opts: { |
||||
upgradeable: 'uups', |
||||
mintable: true, |
||||
pausable: true |
||||
} |
||||
}, |
||||
{ |
||||
value: "ozerc1155", |
||||
displayName: "ERC1155", |
||||
opts: { |
||||
upgradeable: 'uups', |
||||
mintable: true, |
||||
burnable: true, |
||||
pausable: true |
||||
} |
||||
} |
||||
] |
||||
}, |
||||
{ |
||||
name: "OxProject", |
||||
items: [ |
||||
{ value: "zeroxErc20", displayName: "ERC20" } |
||||
] |
||||
}, |
||||
{ |
||||
name: "Gnosis Safe", |
||||
items: [ |
||||
{ value: "gnosisSafeMultisig", displayName: window._intl.formatMessage({ id: 'filePanel.multiSigWallet' }) } |
||||
] |
||||
}, |
||||
{ |
||||
name: "Circom ZKP", |
||||
items: [ |
||||
{ value: "semaphore", displayName: window._intl.formatMessage({ id: 'filePanel.semaphore' }) }, |
||||
{ value: "hashchecker", displayName: window._intl.formatMessage({ id: 'filePanel.hashchecker' }) }, |
||||
{ value: "rln", displayName: window._intl.formatMessage({ id: 'filePanel.rln' }) } |
||||
] |
||||
}, |
||||
{ |
||||
name: "Generic ZKP", |
||||
items: [ |
||||
{ value: "sindriScripts", displayName: window._intl.formatMessage({ id: 'filePanel.addscriptsindri' }) }, |
||||
] |
||||
}, |
||||
{ |
||||
name: "Uniswap V4", |
||||
items: [ |
||||
{ value: "uniswapV4Template", displayName: window._intl.formatMessage({ id: 'filePanel.uniswapV4Template' }) }, |
||||
{ value: "breakthroughLabsUniswapv4Hooks", displayName: window._intl.formatMessage({ id: 'filePanel.breakthroughLabsUniswapv4Hooks' }) }, |
||||
{ value: "uniswapV4HookBookMultiSigSwapHook", displayName: window._intl.formatMessage({ id: 'filePanel.uniswapV4HookBookMultiSigSwapHook' }) } |
||||
] |
||||
}, |
||||
{ |
||||
name: "Solidity CREATE2", |
||||
items: [ |
||||
{ value: "contractCreate2Factory", displayName: window._intl.formatMessage({ id: 'filePanel.addcreate2solidityfactory' }) }, |
||||
{ value: "contractDeployerScripts", displayName: window._intl.formatMessage({ id: 'filePanel.addscriptdeployer' }) } |
||||
] |
||||
}, |
||||
{ |
||||
name: "Contract Verification", |
||||
items: [ |
||||
{ value: "etherscanScripts", displayName: window._intl.formatMessage({ id: 'filePanel.addscriptetherscan' }) }, |
||||
] |
||||
} |
||||
] |
||||
|
||||
const createWorkspace = async (item) => { |
||||
const defaultName = await this.call('filePanel', 'getAvailableWorkspaceName', item.displayName) |
||||
|
||||
const username = await this.call('settings', 'get', 'settings/github-user-name') |
||||
const email = await this.call('settings', 'get', 'settings/github-email') |
||||
const gitNotSet = !username || !email |
||||
let workspaceName = defaultName |
||||
let initGit = true |
||||
const modal: AppModal = { |
||||
id: 'TemplatesSelection', |
||||
title: window._intl.formatMessage({ id: !isElectron() ? 'filePanel.workspace.create': 'filePanel.workspace.create.desktop' }), |
||||
message: await createModalMessage(defaultName, gitNotSet, (value) => workspaceName = value, (value) => initGit = !!value), |
||||
okLabel: window._intl.formatMessage({ id: !isElectron() ? 'filePanel.ok':'filePanel.selectFolder' }), |
||||
} |
||||
const modalResult = await this.call('notification', 'modal', modal) |
||||
if (!modalResult) return |
||||
this.emit('createWorkspaceReducerEvent', workspaceName, item.value, item.opts, false, (e, data) => { |
||||
if (e) { |
||||
const modal: AppModal = { |
||||
id: 'TemplatesSelection', |
||||
title: window._intl.formatMessage({ id: !isElectron() ? 'filePanel.workspace.create': 'filePanel.workspace.create.desktop' }), |
||||
message: e.message, |
||||
okLabel: window._intl.formatMessage({ id: 'filePanel.ok' }), |
||||
cancelLabel: window._intl.formatMessage({ id: 'filePanel.cancel' }) |
||||
} |
||||
this.call('notification', 'modal', modal) |
||||
console.error(e) |
||||
} |
||||
|
||||
}, initGit) |
||||
} |
||||
|
||||
const addToExistingWorkspace = async (item) => { |
||||
this.emit('addTemplateToWorkspaceReducerEvent', item.value, item.opts, false, (e, data) => { |
||||
if (e) { |
||||
const modal: AppModal = { |
||||
id: 'TemplatesSelection', |
||||
title: window._intl.formatMessage({ id: !isElectron() ? 'filePanel.workspace.create': 'filePanel.workspace.create.desktop' }), |
||||
message: e.message, |
||||
okLabel: window._intl.formatMessage({ id: 'filePanel.ok' }), |
||||
cancelLabel: window._intl.formatMessage({ id: 'filePanel.cancel' }) |
||||
} |
||||
this.call('notification', 'modal', modal) |
||||
console.error(e) |
||||
} |
||||
|
||||
}) |
||||
} |
||||
|
||||
return ( |
||||
<RemixUIGridView |
||||
plugin={this} |
||||
styleList={""} |
||||
logo='/assets/img/YouTubeLogo.webp' |
||||
enableFilter={true} |
||||
showUntagged={true} |
||||
showPin={false} |
||||
tagList={[]} |
||||
title='Remix Guide' |
||||
description="Template Selection" |
||||
> |
||||
{ |
||||
|
||||
this.templates.map(template => { |
||||
return <RemixUIGridSection |
||||
plugin={this} |
||||
title={template.name} |
||||
hScrollable= {true} |
||||
> |
||||
{template.items.map(item => { |
||||
return <RemixUIGridCell |
||||
plugin={this} |
||||
title={item.displayName} |
||||
> |
||||
<div> |
||||
{item.displayName} |
||||
{JSON.stringify(item.opts)} |
||||
<div><button data-id={`create-${item.value}${item.opts ? JSON.stringify(item.opts) : ''}`} onClick={async () => createWorkspace(item)} className="btn btn-secondary" >Create a new workspace</button><button data-id={`add-${item.value}`} onClick={async () => addToExistingWorkspace(item)} className="btn btn-primary" >Add to existing workspace</button></div> |
||||
</div> |
||||
</RemixUIGridCell> |
||||
})} |
||||
</RemixUIGridSection> |
||||
})} |
||||
</RemixUIGridView> |
||||
) |
||||
} |
||||
|
||||
} |
||||
|
||||
const createModalMessage = async ( |
||||
defaultName: string, |
||||
gitConfigNotSet: boolean, |
||||
onChangeTemplateName: (name: string) => void, |
||||
onChangeInitGit: (name: string) => void) => { |
||||
|
||||
return ( |
||||
<> |
||||
<label id="wsName" className="form-check-label" style={{ fontWeight: 'bolder' }}> |
||||
<FormattedMessage id="filePanel.workspaceName" /> |
||||
</label> |
||||
<input |
||||
type="text" |
||||
data-id="modalDialogCustomPromptTextCreate" |
||||
defaultValue={defaultName} |
||||
className="form-control" |
||||
onChange={(e) => onChangeTemplateName(e.target.value)} |
||||
/> |
||||
<div className="d-flex py-2 align-items-center custom-control custom-checkbox"> |
||||
<input |
||||
id="initGitRepository" |
||||
data-id="initGitRepository" |
||||
className="form-check-input custom-control-input" |
||||
type="checkbox" |
||||
disabled={gitConfigNotSet} |
||||
onChange={(e) => onChangeInitGit(e.target.value)} |
||||
/> |
||||
<label |
||||
htmlFor="initGitRepository" |
||||
data-id="initGitRepositoryLabel" |
||||
className="m-0 form-check-label custom-control-label udapp_checkboxAlign" |
||||
title={window._intl.formatMessage({ id: 'filePanel.initGitRepoTitle' })} |
||||
> |
||||
<FormattedMessage id="filePanel.initGitRepositoryLabel" /> |
||||
</label> |
||||
</div> |
||||
{gitConfigNotSet ? ( |
||||
<div className="text-warning"> |
||||
<FormattedMessage id="filePanel.initGitRepositoryWarning" /> |
||||
</div> |
||||
) : ( |
||||
<></> |
||||
)} |
||||
</> |
||||
) |
||||
} |
||||
|
Loading…
Reference in new issue