diff --git a/apps/remix-ide/src/app/files/dgitProvider.ts b/apps/remix-ide/src/app/files/dgitProvider.ts index 87cb4c3c8c7..69422069b28 100644 --- a/apps/remix-ide/src/app/files/dgitProvider.ts +++ b/apps/remix-ide/src/app/files/dgitProvider.ts @@ -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 } diff --git a/apps/remix-ide/src/app/tabs/locales/en/settings.json b/apps/remix-ide/src/app/tabs/locales/en/settings.json index 2ea6de0d4b4..83465e2d25a 100644 --- a/apps/remix-ide/src/app/tabs/locales/en/settings.json +++ b/apps/remix-ide/src/app/tabs/locales/en/settings.json @@ -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.", @@ -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: CorsProxy Documentation", "settings.privateBeeAddress": "PRIVATE BEE ADDRESS", "settings.postageStampID": "POSTAGE STAMP ID", "settings.host": "HOST", diff --git a/libs/remix-ui/settings/src/lib/constants.ts b/libs/remix-ui/settings/src/lib/constants.ts index 453edaaf945..c0f174f04a1 100644 --- a/libs/remix-ui/settings/src/lib/constants.ts +++ b/libs/remix-ui/settings/src/lib/constants.ts @@ -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 = { diff --git a/libs/remix-ui/settings/src/lib/corsproxy-settings.tsx b/libs/remix-ui/settings/src/lib/corsproxy-settings.tsx new file mode 100644 index 00000000000..11899cff42a --- /dev/null +++ b/libs/remix-ui/settings/src/lib/corsproxy-settings.tsx @@ -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('') + 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 ( +
+
+
+ +
+ +
+ npm install -g @drafish/cors-proxy +
+
+ cors-proxy start +
+
+ +
+
+ ( + + {chunks} + + ), + }} + /> +
+ +
+ +
+ handleChangeUrlState(e)} value={url} /> +
+ + } tooltipClasses="text-nowrap" tooltipId="removecorsproxyTooltip" placement="top-start"> + + +
+
+
+
+
+ ) +} diff --git a/libs/remix-ui/settings/src/lib/gitlab-settings.tsx b/libs/remix-ui/settings/src/lib/gitlab-settings.tsx new file mode 100644 index 00000000000..4a3b5d07581 --- /dev/null +++ b/libs/remix-ui/settings/src/lib/gitlab-settings.tsx @@ -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('') + const [gitlabUserName, setGitlabUsername] = useState('') + const [gitlabEmail, setGitlabEmail] = useState('') + 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 ( +
+
+
+ +
+

+ +

+

+ +

+

+ + {gitlabTokenLink} + +

+
+ +
+ handleChangeTokenState(e)} value={gitlabToken} /> +
+ +
+
+
+
+ +
+ handleChangeUserNameState(e)} value={gitlabUserName} /> +
+
+
+ +
+ handleChangeEmailState(e)} value={gitlabEmail} /> +
+ + } tooltipClasses="text-nowrap" tooltipId="removegitlabtokenTooltip" placement="top-start"> + + +
+
+
+
+
+ ) +} diff --git a/libs/remix-ui/settings/src/lib/remix-ui-settings.tsx b/libs/remix-ui/settings/src/lib/remix-ui-settings.tsx index 050cb9d5391..95ba9286b32 100644 --- a/libs/remix-ui/settings/src/lib/remix-ui-settings.tsx +++ b/libs/remix-ui/settings/src/lib/remix-ui-settings.tsx @@ -17,6 +17,8 @@ import { useMatomoAnalytics, saveTokenToast, removeTokenToast, + saveCorsproxyToast, + removeCorsproxyToast, saveSwarmSettingsToast, saveIpfsSettingsToast, useAutoCompletion, @@ -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' @@ -591,6 +595,28 @@ export const RemixUiSettings = (props: RemixUiSettingsProps) => { }} config={props.config} /> + { + 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} + /> + { + saveCorsproxyToast(props.config, dispatchToast, url, 'corsproxy-url') + }} + removeCorsproxy={() => { + removeCorsproxyToast(props.config, dispatchToast, 'corsproxy-url') + }} + config={props.config} + /> { saveTokenToast(props.config, dispatchToast, etherscanToken, 'etherscan-access-token') diff --git a/libs/remix-ui/settings/src/lib/settingsAction.ts b/libs/remix-ui/settings/src/lib/settingsAction.ts index 22110f8cb9a..c277df26152 100644 --- a/libs/remix-ui/settings/src/lib/settingsAction.ts +++ b/libs/remix-ui/settings/src/lib/settingsAction.ts @@ -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) diff --git a/libs/remix-ui/settings/src/types/index.ts b/libs/remix-ui/settings/src/types/index.ts index 3b25907d202..8b5f355347d 100644 --- a/libs/remix-ui/settings/src/types/index.ts +++ b/libs/remix-ui/settings/src/types/index.ts @@ -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, diff --git a/libs/remix-ui/workspace/src/lib/actions/workspace.ts b/libs/remix-ui/workspace/src/lib/actions/workspace.ts index 0cea0116108..c5cd91315cc 100644 --- a/libs/remix-ui/workspace/src/lib/actions/workspace.ts +++ b/libs/remix-ui/workspace/src/lib/actions/workspace.ts @@ -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()) {