Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions apps/remix-ide/src/app/files/dgitProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,17 +87,21 @@ class DGitProvider extends Plugin {
}

async addIsomorphicGitConfig(input) {

const token = await this.call('config' as any, 'getAppParameter', 'settings/gist-access-token')
const gitlabToken = await this.call('config', 'getAppParameter', 'settings/gitlab-token')
const corsproxy = await this.call('config', 'getAppParameter', 'settings/corsproxy-url')

let config = {
corsProxy: 'https://corsproxy.remixproject.org/',
corsProxy: corsproxy || 'https://corsproxy.remixproject.org/',
http,
onAuth: url => {
url
const auth = {
const auth = url.startsWith('https://github.com') ? {
username: input.token || token,
password: ''
} : {
username: 'oauth2',
password: input.token || gitlabToken
}
return auth
}
Expand Down
10 changes: 10 additions & 0 deletions apps/remix-ide/src/app/tabs/locales/en/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@
"settings.gitAccessTokenTitle": "Github Credentials",
"settings.gitAccessTokenText": "The access token is used to publish a Gist and retrieve GitHub contents. You may need to input username/email.",
"settings.gitAccessTokenText2":"Go to github token page (link below) to create a new token and save it in Remix. Make sure this token has only 'create gist' permission",
"settings.gitlabTokenTitle": "Gitlab Credentials",
"settings.gitlabTokenText": "The access token is used to retrieve GitLab contents. You may need to input username/email.",
"settings.gitlabTokenText2":"Go to gitlab token page (link below) to create a new token and save it in Remix.",
"settings.etherscanTokenTitle": "EtherScan Access Token",
"settings.etherscanAccessTokenText": "Manage the api key used to interact with Etherscan.",
"settings.etherscanAccessTokenText2": "Go to Etherscan api key page (link below) to create a new api key and save it in Remix.",
Expand All @@ -32,6 +35,13 @@
"settings.username": "USERNAME",
"settings.email": "EMAIL",
"settings.deleteGithubCredentials": "Delete Github Credentials",
"settings.deleteGitlabCredentials": "Delete Gitlab Credentials",
"settings.url": "URL",
"settings.deleteCorsproxy": "Delete Cors Proxy",
"settings.corsproxyTitle": "Cors Proxy for Git",
"settings.corsproxyText": "Cors Proxy is used to proxy git requests, such as clone, push, pull etc. Follow the commands below to start your own service:",
"settings.corsproxyText2": "Cors Proxy Url must be end with /, default to be https://corsproxy.remixproject.org/",
"settings.corsproxyText3": "For more info, visit: <a>CorsProxy Documentation</a>",
"settings.privateBeeAddress": "PRIVATE BEE ADDRESS",
"settings.postageStampID": "POSTAGE STAMP ID",
"settings.host": "HOST",
Expand Down
1 change: 1 addition & 0 deletions libs/remix-ui/settings/src/lib/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ export const textSecondary = 'text-secondary'
export const textDark = 'text-dark'

export const gitAccessTokenLink = 'https://github.com/settings/tokens/new?scopes=gist,repo&description=Remix%20IDE%20Token'
export const gitlabTokenLink = 'https://gitlab.com/-/user_settings/personal_access_tokens'
export const etherscanTokenLink = 'https://etherscan.io/myapikey'
export const sindriAccessTokenLink = 'https://sindri.app'
export const labels = {
Expand Down
80 changes: 80 additions & 0 deletions libs/remix-ui/settings/src/lib/corsproxy-settings.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import { CopyToClipboard } from '@remix-ui/clipboard'
import { CustomTooltip } from '@remix-ui/helper'
import React, { useEffect, useState } from 'react'
import { FormattedMessage, useIntl } from 'react-intl'
import { CorsproxySettingsProps } from '../types'

export function CorsproxySettings(props: CorsproxySettingsProps) {
const [url, setUrl] = useState<string>('')
const intl = useIntl()

useEffect(() => {
if (props.config) {
const url = props.config.get('settings/corsproxy-url') || 'https://corsproxy.remixproject.org/'

setUrl(url)
}
}, [props.config])

const handleChangeUrlState = (event) => {
setUrl(event.target.value)
}

const saveCorsproxy = () => {
props.saveCorsproxy(url)
}

const removeToken = () => {
setUrl('')
props.removeCorsproxy()
}

return (
<div className="border-top">
<div className="card-body pt-3 pb-2">
<h6 className="card-title">
<FormattedMessage id="settings.corsproxyTitle" />
</h6>
<FormattedMessage id="settings.corsproxyText" />
<div className="p-1 pl-3">
<b>npm install -g @drafish/cors-proxy</b>
</div>
<div className="p-1 pl-3">
<b>cors-proxy start</b>
</div>
<div className="pt-2">
<FormattedMessage id="settings.corsproxyText2" />
</div>
<div className="pt-2">
<FormattedMessage
id="settings.corsproxyText3"
values={{
a: (chunks) => (
<a href="https://github.com/drafish/cors-proxy" target="_blank">
{chunks}
</a>
),
}}
/>
</div>

<div>
<label className="pt-2 mb-0 pb-0">
<FormattedMessage id="settings.url" />:
</label>
<div className="text-secondary mb-0 h6">
<input id="corsproxy" data-id="settingsTabCorsproxy" type="text" className="form-control" onChange={(e) => handleChangeUrlState(e)} value={url} />
<div className="d-flex justify-content-end pt-2">
<input className="btn btn-sm btn-primary ml-2" id="savecorsproxy" data-id="settingsTabSaveCorsproxy" onClick={saveCorsproxy} value={intl.formatMessage({ id: 'settings.save' })} type="button"></input>
<CustomTooltip tooltipText={<FormattedMessage id="settings.deleteCorsproxy" />} tooltipClasses="text-nowrap" tooltipId="removecorsproxyTooltip" placement="top-start">
<button className="btn btn-sm btn-secondary ml-2" id="removecorsproxy" data-id="settingsTabRemoveCorsproxy" onClick={removeToken}>
<FormattedMessage id="settings.remove" />
</button>
</CustomTooltip>
</div>
</div>
</div>
</div>
</div>
)
}
106 changes: 106 additions & 0 deletions libs/remix-ui/settings/src/lib/gitlab-settings.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
import { CopyToClipboard } from '@remix-ui/clipboard'
import { CustomTooltip } from '@remix-ui/helper'
import React, { useEffect, useState } from 'react'
import { FormattedMessage, useIntl } from 'react-intl'
import { GithubSettingsProps } from '../types'
import { gitlabTokenLink } from './constants'

export function GitlabSettings(props: GithubSettingsProps) {
const [gitlabToken, setGitlabToken] = useState<string>('')
const [gitlabUserName, setGitlabUsername] = useState<string>('')
const [gitlabEmail, setGitlabEmail] = useState<string>('')
const intl = useIntl()

useEffect(() => {
if (props.config) {
const gitlabToken = props.config.get('settings/gitlab-token') || ''
const gitlabUserName = props.config.get('settings/gitlab-user-name') || ''
const gitlabEmail = props.config.get('settings/gitlab-email') || ''

setGitlabToken(gitlabToken)
setGitlabUsername(gitlabUserName)
setGitlabEmail(gitlabEmail)
}
}, [props.config])

const handleChangeTokenState = (event) => {
const token = event.target.value ? event.target.value.trim() : event.target.value
setGitlabToken(token)
}

const handleChangeUserNameState = (event) => {
setGitlabUsername(event.target.value)
}

const handleChangeEmailState = (event) => {
setGitlabEmail(event.target.value)
}

// api key settings
const saveGitlabToken = () => {
props.saveToken(gitlabToken, gitlabUserName, gitlabEmail)
}

const removeToken = () => {
setGitlabToken('')
setGitlabUsername('')
setGitlabEmail('')
props.removeToken()
}

return (
<div className="border-top">
<div className="card-body pt-3 pb-2">
<h6 className="card-title">
<FormattedMessage id="settings.gitlabTokenTitle" />
</h6>
<p className="mb-1">
<FormattedMessage id="settings.gitlabTokenText" />
</p>
<p className="">
<FormattedMessage id="settings.gitlabTokenText2" />
</p>
<p className="mb-1">
<a className="text-primary" target="_blank" href={gitlabTokenLink}>
{gitlabTokenLink}
</a>
</p>
<div>
<label className="mb-0 pb-0">
<FormattedMessage id="settings.token" />:
</label>
<div className="input-group text-secondary mb-0 h6">
<input id="gitlabtoken" data-id="settingsTabGitlabToken" type="password" className="form-control" onChange={(e) => handleChangeTokenState(e)} value={gitlabToken} />
<div className="input-group-append">
<CopyToClipboard tip={intl.formatMessage({ id: 'settings.copy' })} content={gitlabToken} data-id="copyToClipboardCopyIcon" className="far fa-copy ml-1 p-2 mt-1" direction={'top'} />
</div>
</div>
</div>
<div>
<label className="pt-2 mb-0 pb-0">
<FormattedMessage id="settings.username" />:
</label>
<div className="text-secondary mb-0 h6">
<input id="gitlabusername" data-id="settingsTabGitlabUsername" type="text" className="form-control" onChange={(e) => handleChangeUserNameState(e)} value={gitlabUserName} />
</div>
</div>
<div>
<label className="pt-2 mb-0 pb-0">
<FormattedMessage id="settings.email" />:
</label>
<div className="text-secondary mb-0 h6">
<input id="gitlabemail" data-id="settingsTabGitlabEmail" type="text" className="form-control" onChange={(e) => handleChangeEmailState(e)} value={gitlabEmail} />
<div className="d-flex justify-content-end pt-2">
<input className="btn btn-sm btn-primary ml-2" id="savegitlabtoken" data-id="settingsTabSaveGitlabToken" onClick={saveGitlabToken} value={intl.formatMessage({ id: 'settings.save' })} type="button"></input>
<CustomTooltip tooltipText={<FormattedMessage id="settings.deleteGitlabCredentials" />} tooltipClasses="text-nowrap" tooltipId="removegitlabtokenTooltip" placement="top-start">
<button className="btn btn-sm btn-secondary ml-2" id="removegitlabtoken" data-id="settingsTabRemoveGitlabToken" onClick={removeToken}>
<FormattedMessage id="settings.remove" />
</button>
</CustomTooltip>
</div>
</div>
</div>
</div>
</div>
)
}
26 changes: 26 additions & 0 deletions libs/remix-ui/settings/src/lib/remix-ui-settings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ import {
useMatomoAnalytics,
saveTokenToast,
removeTokenToast,
saveCorsproxyToast,
removeCorsproxyToast,
saveSwarmSettingsToast,
saveIpfsSettingsToast,
useAutoCompletion,
Expand All @@ -30,6 +32,8 @@ import { RemixUiThemeModule, ThemeModule } from '@remix-ui/theme-module'
import { RemixUiLocaleModule, LocaleModule } from '@remix-ui/locale-module'
import { FormattedMessage, useIntl } from 'react-intl'
import { GithubSettings } from './github-settings'
import { GitlabSettings } from './gitlab-settings'
import { CorsproxySettings } from './corsproxy-settings'
import { EtherscanSettings } from './etherscan-settings'
import { SindriSettings } from './sindri-settings'

Expand Down Expand Up @@ -591,6 +595,28 @@ export const RemixUiSettings = (props: RemixUiSettingsProps) => {
}}
config={props.config}
/>
<GitlabSettings
saveToken={(gitlabToken: string, gitlabUserName: string, gitlabEmail: string) => {
saveTokenToast(props.config, dispatchToast, gitlabToken, 'gitlab-token')
saveTokenToast(props.config, dispatchToast, gitlabUserName, 'gitlab-user-name')
saveTokenToast(props.config, dispatchToast, gitlabEmail, 'gitlab-email')
}}
removeToken={() => {
removeTokenToast(props.config, dispatchToast, 'gitlab-token')
removeTokenToast(props.config, dispatchToast, 'gitlab-user-name')
removeTokenToast(props.config, dispatchToast, 'gitlab-email')
}}
config={props.config}
/>
<CorsproxySettings
saveCorsproxy={(url: string) => {
saveCorsproxyToast(props.config, dispatchToast, url, 'corsproxy-url')
}}
removeCorsproxy={() => {
removeCorsproxyToast(props.config, dispatchToast, 'corsproxy-url')
}}
config={props.config}
/>
<EtherscanSettings
saveToken={(etherscanToken: string) => {
saveTokenToast(props.config, dispatchToast, etherscanToken, 'etherscan-access-token')
Expand Down
10 changes: 10 additions & 0 deletions libs/remix-ui/settings/src/lib/settingsAction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,16 @@ export const removeTokenToast = (config, dispatch, key) => {
dispatch({ type: 'removed', payload: { message: 'Credentials removed' } })
}

export const saveCorsproxyToast = (config, dispatch, value, key) => {
config.set('settings/' + key, value)
dispatch({ type: 'save', payload: { message: 'Corsproxy updated' } })
}

export const removeCorsproxyToast = (config, dispatch, key) => {
config.set('settings/' + key, '')
dispatch({ type: 'removed', payload: { message: 'Corsproxy removed' } })
}

export const saveSwarmSettingsToast = (config, dispatch, privateBeeAddress, postageStampId) => {
config.set('settings/swarm-private-bee-address', privateBeeAddress)
config.set('settings/swarm-postage-stamp-id', postageStampId)
Expand Down
13 changes: 13 additions & 0 deletions libs/remix-ui/settings/src/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,19 @@ export interface GithubSettingsProps {
}
}

export interface CorsproxySettingsProps {
saveCorsproxy: (url: string) => void,
removeCorsproxy: () => void,
config: {
exists: (key: string) => boolean,
get: (key: string) => string,
set: (key: string, content: string) => void,
clear: () => void,
getUnpersistedProperty: (key: string) => void,
setUnpersistedProperty: (key: string, value: string) => void
}
}

export interface EtherscanSettingsProps {
saveToken: (etherscanToken: string) => void,
removeToken: () => void,
Expand Down
2 changes: 1 addition & 1 deletion libs/remix-ui/workspace/src/lib/actions/workspace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -644,7 +644,7 @@ export const getWorkspaces = async (): Promise<{ name: string; isGitRepo: boolea

export const cloneRepository = async (url: string) => {
const config = plugin.registry.get('config').api
const token = config.get('settings/gist-access-token')
const token = config.get(`settings/${url.startsWith('https://github.com')? 'gist-access-token' : 'gitlab-token'}`)
const repoConfig: cloneInputType = { url, token }

if (plugin.registry.get('platform').api.isDesktop()) {
Expand Down