diff --git a/client/i18n/locales/english/translations.json b/client/i18n/locales/english/translations.json
index 63da34ce813..a7b5d3a1386 100644
--- a/client/i18n/locales/english/translations.json
+++ b/client/i18n/locales/english/translations.json
@@ -509,6 +509,28 @@
"learn-more": "Learn more about <0>Gitpod workspaces.0>",
"logout-warning": "If you log out of freeCodeCamp before you complete the entire {{course}} course, your progress will not be saved to your freeCodeCamp account."
},
+ "local": {
+ "intro": "This course runs in a virtual Linux machine on your computer. To run the course, you first need to download each of the following if you don't already have them:",
+ "download-vscode": "<0>VS Code0> and the <1>Dev Containers1> extension",
+ "heading": "Then, follow these instructions to start the course:",
+ "step-1": "Open a terminal and clone the RDB Alpha repo if you don't already have it with <0>git clone https://github.com/freeCodeCamp/rdb-alpha0>",
+ "step-2": "Navigate to the <0>rdb-alpha0> directory in the terminal with <1>cd rdb-alpha1>, and open VS Code with <2>code .2>",
+ "sub-step-heading": "If you want to save your progress to your freeCodeCamp account, do the following:",
+ "sub-step-1": "Generate a user token if you don't already have one:",
+ "generate-token-btn": "Generate User Token",
+ "sub-step-2": "Copy your user token:",
+ "copy-token-btn": "Copy User Token",
+ "logout-warning": "If you log out of freeCodeCamp before you complete the entire {{course}} course, your user token will be deleted and your progress will not be saved to your freeCodeCamp account.",
+ "sub-step-3": "In the VS Code that opened, find and open the file named <0>Dockerfile0>. At the bottom of the file, paste your token in as the value for the <1>CODEROAD_WEBHOOK_TOKEN1> variable. It should look like this: <2>ENV CODEROAD_WEBHOOK_TOKEN=your-token-here2>",
+ "step-3": "Open the command palette in VS Code by expanding the \"View\" menu and clicking \"Command Palette...\" and enter <0>Dev Containers: Rebuild and Reopen in Container0> in the input.",
+ "step-4": "A new VS Code window will open and begin building the Docker image. It will take several minutes the first time.",
+ "step-5": "Once it is finished building, open the command palette again and enter <0>CodeRoad: Start0> to open CodeRoad.",
+ "step-6": "In the CodeRoad window, click \"Start New Tutorial\" and then the \"URL\" tab at the top.",
+ "step-7": "Copy the course URL below, paste it in the URL input, and click \"Load\".",
+ "copy-url": "Copy Course URL",
+ "step-8": "Click \"Start\" to begin.",
+ "step-9": "Follow the instructions in CodeRoad to complete the course. Note: You may need to restart the terminal once for terminal settings to take effect and the tests to pass."
+ },
"step-1": "Step 1: Complete the project",
"step-2": "Step 2: Submit your code",
"submit-public-url": "When you have completed the project, save all the required files into a public repository and submit the URL to it below.",
@@ -918,6 +940,12 @@
"generate-exam-error": "An error occurred trying to generate your exam.",
"cert-not-found": "The certification {{certSlug}} does not exist.",
"reset-editor-layout": "Your editor layout has been reset.",
+ "user-token-generated": "A user token was created for you.",
+ "user-token-generate-error": "Something went wrong trying to generate a user token for you.",
+ "user-token-copied": "User token copied to clipboard.",
+ "user-token-copy-error": "Something went wrong trying to copy your token.",
+ "course-url-copied": "Course URL copied to clipboard.",
+ "course-url-copy-error": "Something went wrong trying to copy the course URL.",
"ms": {
"transcript": {
"link-err-1": "Please include a Microsoft transcript URL in the request.",
diff --git a/client/src/components/Flash/redux/flash-messages.ts b/client/src/components/Flash/redux/flash-messages.ts
index bd50688b800..387dc296a99 100644
--- a/client/src/components/Flash/redux/flash-messages.ts
+++ b/client/src/components/Flash/redux/flash-messages.ts
@@ -11,6 +11,8 @@ export enum FlashMessages {
CodeSaveError = 'flash.code-save-error',
CodeSaveLess = 'flash.code-save-less',
CompleteProjectFirst = 'flash.complete-project-first',
+ CourseUrlCopied = 'flash.course-url-copied',
+ CourseUrlCopyError = 'flash.course-url-copy-error',
DeleteTokenErr = 'flash.delete-token-err',
EmailValid = 'flash.email-valid',
GenerateExamError = 'flash.generate-exam-error',
@@ -66,6 +68,10 @@ export enum FlashMessages {
UsernameUpdated = 'flash.username-updated',
UsernameUsed = 'flash.username-used',
UserNotCertified = 'flash.user-not-certified',
+ UserTokenCopied = 'flash.user-token-copied',
+ UserTokenCopyError = 'flash.user-token-copy-error',
+ UserTokenGenerated = 'flash.user-token-generated',
+ UserTokenGenerateError = 'flash.user-token-generate-error',
WrongName = 'flash.wrong-name',
WrongUpdating = 'flash.wrong-updating',
WentWrong = 'flash.went-wrong'
diff --git a/client/src/components/growth-book/codeally-button.tsx b/client/src/components/growth-book/codeally-button.tsx
index 3f06bb94ff6..97f42438347 100644
--- a/client/src/components/growth-book/codeally-button.tsx
+++ b/client/src/components/growth-book/codeally-button.tsx
@@ -4,25 +4,34 @@ import React from 'react';
import { useFeature } from '@growthbook/growthbook-react';
import { useTranslation } from 'react-i18next';
import { Button } from '@freecodecamp/ui';
+import { challengeTypes } from '../../../../shared/config/challenge-types';
interface CodeAllyButtonProps {
- text: string;
+ challengeType: number;
onClick: () => void;
}
-export function CodeAllyButton(props: CodeAllyButtonProps): JSX.Element | null {
+export function CodeAllyButton({
+ challengeType,
+ onClick
+}: CodeAllyButtonProps): JSX.Element | null {
const codeAllyDisabledFeature = useFeature('codeally_disabled');
const { t } = useTranslation();
+ const text =
+ challengeType === challengeTypes.codeAllyCert
+ ? t('buttons.click-start-project')
+ : t('buttons.click-start-course');
+
return (
);
diff --git a/client/src/templates/Challenges/codeally/rdb-gitpod-continue-alert.tsx b/client/src/templates/Challenges/codeally/rdb-gitpod-continue-alert.tsx
new file mode 100644
index 00000000000..e5c98e7d5fd
--- /dev/null
+++ b/client/src/templates/Challenges/codeally/rdb-gitpod-continue-alert.tsx
@@ -0,0 +1,39 @@
+import React from 'react';
+import { Trans } from 'react-i18next';
+import { Alert, Spacer } from '@freecodecamp/ui';
+
+interface RdbGitpodContinueAlertProps {
+ course: string;
+}
+
+function RdbGitpodContinueAlert({
+ course
+}: RdbGitpodContinueAlertProps): JSX.Element {
+ return (
+
+
+
+ placeholder
+
+
+
+
+
+ placeholder
+
+
+
+ );
+}
+
+RdbGitpodContinueAlert.displayName = 'RdbGitpodContinueAlert';
+
+export default RdbGitpodContinueAlert;
diff --git a/client/src/templates/Challenges/codeally/rdb-gitpod-instructions.tsx b/client/src/templates/Challenges/codeally/rdb-gitpod-instructions.tsx
new file mode 100644
index 00000000000..26d3849761a
--- /dev/null
+++ b/client/src/templates/Challenges/codeally/rdb-gitpod-instructions.tsx
@@ -0,0 +1,42 @@
+import React from 'react';
+import { Trans, useTranslation } from 'react-i18next';
+
+function RdbGitpodInstructions(): JSX.Element {
+ const { t } = useTranslation();
+
+ return (
+