diff --git a/README.md b/README.md
index 99e484165..044bb5e22 100644
--- a/README.md
+++ b/README.md
@@ -153,6 +153,12 @@ By overriding the app to use port 443, you can use the authorized URL and
>**NOTE:** Mac users will require running the app with elevated permissions in order to use a port lower than 500.
+Easy way to overcome elevated permissions is to make use of:
+
+```
+sudo setcap 'cap_net_bind_service=+ep' `which node`
+```
+
For easier development, it is recommended that you add this certificate to your trusted root authorities and as a trused cert in your browser. Google your browser and OS for more info on how to trust cert authorities.
Otherwise, you will need to override the exception each time you load the site. Firefox users may need to user an incognito browser in order to override the exception.
diff --git a/package.json b/package.json
index a880544cc..2cada7253 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@topcoder-platform/platform-ui",
- "version": "2.0.7",
+ "version": "3.0.0",
"private": true,
"scripts": {
"dev": "yarn react-app-rewired start",
@@ -42,6 +42,7 @@
"moment": "^2.29.4",
"moment-timezone": "^0.5.37",
"prop-types": "^15.8.1",
+ "qrcode.react": "^3.1.0",
"qs": "^6.11.0",
"rc-checkbox": "^2.3.2",
"react": "^18.2.0",
diff --git a/src-ts/.eslintrc.js b/src-ts/.eslintrc.js
index 10a2a1fb5..84fb4823e 100644
--- a/src-ts/.eslintrc.js
+++ b/src-ts/.eslintrc.js
@@ -73,7 +73,7 @@ module.exports = {
],
'complexity': [
'error',
- 11
+ 14
],
'import/extensions': 'off',
'import/no-named-default': 'off',
diff --git a/src-ts/App.tsx b/src-ts/App.tsx
index 10e9900f5..a075e7d2d 100644
--- a/src-ts/App.tsx
+++ b/src-ts/App.tsx
@@ -3,7 +3,7 @@ import { Routes } from 'react-router-dom'
import { toast, ToastContainer } from 'react-toastify'
import { Header } from './header'
-import { routeContext, RouteContextData } from './lib'
+import { routeContext, RouteContextData, useViewportUnitsFix } from './lib'
const App: FC<{}> = () => {
@@ -12,6 +12,8 @@ const App: FC<{}> = () => {
const routeElements: Array We will automatically redirect you in 5 seconds...
+ No prior knowledge in software development is required
+
+ Absolutely!
+ Again, all our courses are currently free.
+ Whenever you feel like you can start to benefit from enrolling in a certification,
+ you can do it at any time.
+
+ Once you enroll during the free trial period or during a paid period,
+ you can complete the certification at your own pace - no time constraints,
+ even when the free trial period is over.
+
+ Assessments are coming soon!
+ We plan to release early within the 2nd Quarter of 2023.
+
+ Yes, that is our plan! Stay tuned for more developments on this.
+
+ We have a long history of producing and recognizing top technical talent.
+ Our ratings are reliable measures of expertise and have been trusted by companies like Google.
+ When you infuse our history with the learning space, we can create the perfect recipe for you to learn,
+ earn and thrive at Topcoder and beyond.
+ {perk.description}This page has moved.
+
+ {props.title}
- {props.title}
+
+
+ >
+ )}
+
+ Certification Curriculum
+
+ Certification
+
+ {props.certification.title}
+
+
+
+
+ {items.map(item => (
+
+ )
+}
+
+interface CertifDetailsContentProps {
+ certification: TCACertification
+ children?: ReactNode
+ sectionClassName?: string
+}
+
+const CertifDetailsContent: FCWhat I Will Learn?
+ {renderBasicList(props.certification.learningOutcomes)}
+ Prerequisites
+ {props.certification.prerequisites?.length ? (
+ renderBasicList(props.certification.prerequisites)
+ ) : (
+ Frequently Asked Questions
+
+
+
+
+ {props.certification.skills.map(skill => (
+
+
+
+ You have successfully enrolled!
+
+
+ >
+
+
+ No payment required
+
+ {props.certTitle}
+
+ {props.title ?? 'Why certify with Topcoder?'}
+
+
+ {props.items.map(perk => (
+
+ {perk.title}
+ Topcoder Academy
+
+ Certificate
+ {' '}
+ not found
+
+
@@ -125,7 +136,12 @@ const CourseCompletedPage: FC<{}> = () => {
size='sm'
buttonStyle='secondary'
label='View certificate'
- route={getCertificatePath(courseData.provider, courseData.certification)}
+ route={(
+ getCertificatePath(
+ courseData.resourceProvider.name,
+ certificationParam,
+ )
+ )}
/>
+ Hey there! +
++ Looks like we don’t have your certificate. + Have you completed the course? If not, keep going at it! If you have: +
++ Keep Learning away! +
++ has successfully completed the certification requirements and has been awarded +
++ {certification.description} +
+ )} + + {renderStatusBox()} + + {!certifProgress && ( + + Learn more + + )} + import('./welcome'), 'WelcomePage')
+const CertificationDetailsPage: LazyLoadedComponent = lazyLoad(
+ () => import('./certification-details'),
+ 'CertificationDetailsPage',
+)
+const EnrollmentPage: LazyLoadedComponent = lazyLoad(
+ () => import('./certification-details/enrollment-page'),
+ 'EnrollmentPage',
+)
const CourseDetailsPage: LazyLoadedComponent = lazyLoad(() => import('./course-details'), 'CourseDetailsPage')
const CourseCompletedPage: LazyLoadedComponent = lazyLoad(() => import('./course-completed'), 'CourseCompletedPage')
const MyCertificate: LazyLoadedComponent = lazyLoad(() => import('./course-certificate'), 'MyCertificate')
@@ -11,6 +20,10 @@ const UserCertificate: LazyLoadedComponent = lazyLoad(() => import('./course-cer
const FreeCodeCamp: LazyLoadedComponent = lazyLoad(() => import('./free-code-camp'), 'FreeCodeCamp')
const MyLearning: LazyLoadedComponent = lazyLoad(() => import('./my-learning'), 'MyLearning')
const LandingLearn: LazyLoadedComponent = lazyLoad(() => import('./Learn'))
+const MyTCACertificate: LazyLoadedComponent = lazyLoad(() => import('./tca-certificate'), 'MyTCACertificate')
+const UserTCACertificate: LazyLoadedComponent = lazyLoad(() => import('./tca-certificate'), 'UserTCACertificate')
+const ValidateTCACertificate: LazyLoadedComponent
+ = lazyLoad(() => import('./tca-certificate'), 'ValidateTCACertificate')
export enum LEARN_PATHS {
certificate = '/certificate',
@@ -20,6 +33,8 @@ export enum LEARN_PATHS {
fcc = '/learn/fcc',
root = '/learn',
startCourseRouteFlag = 'start-course',
+ tcaCertifications = '/tca-certifications',
+ tcaEnroll = '/enroll',
}
export const rootRoute: string = LEARN_PATHS.root
@@ -70,6 +85,14 @@ export function getUserCertificateSsr(
return `${LearnConfig.CERT_DOMAIN}/${handle}/${provider}/${certification}/${encodeURI(title)}`
}
+export function getUserTCACertificateSsr(
+ certification: string,
+ handle: string,
+ title: string,
+): string {
+ return `${LearnConfig.CERT_DOMAIN}/${handle}/tca/${certification}/${encodeURI(title)}`
+}
+
export function getUserCertificateUrl(
provider: string,
certification: string,
@@ -82,6 +105,37 @@ export function getViewStyleParamKey(): string {
return Object.keys(LearnConfig.CERT_ALT_PARAMS)[0]
}
+export function getTCACertificationPath(certification: string): string {
+ return `${LEARN_PATHS.root}${LEARN_PATHS.tcaCertifications}/${certification}`
+}
+
+export function getTCACertificationEnrollPath(certification: string): string {
+ return `${LEARN_PATHS.root}${LEARN_PATHS.tcaCertifications}/${certification}${LEARN_PATHS.tcaEnroll}`
+}
+
+export function getTCACertificateUrl(
+ certification: string,
+): string {
+ return `${getTCACertificationPath(certification)}${LEARN_PATHS.certificate}`
+}
+
+export function getUserTCACertificateUrl(
+ certification: string,
+ handle: string,
+): string {
+ return `${getTCACertificationPath(certification)}/${handle}${LEARN_PATHS.certificate}`
+}
+
+export function getTCACertificationValidationUrl(
+ completionUuid: string,
+): string {
+ return `${EnvironmentConfig.TOPCODER_URLS.TCA}${LEARN_PATHS.root}/${completionUuid}`
+}
+
+export function getAuthenticateAndEnrollRoute(): string {
+ return `${authUrlLogin()}${encodeURIComponent(LEARN_PATHS.tcaEnroll)}`
+}
+
export const learnRoutes: ReadonlyArray
+ {clearFCCCertificationTitle(course.freeCodeCampCertification.title)}
+ {enrollment?.userName} {profile.handle}
+ {enrollment?.userName}
+ {' '}
+ has successfully completed the certification
+
+ Topcoder is partnering with multiple content providers
+ to bring you a best in class course catalog. Stay tuned for more courses!
+ {clearFCCCertificationTitle(props.certification.title)}
+ {desc}
+ {descLength > EXCERPT_TEXT_LEN ? '...' : ''}
+
+ We are happy to release Topcoder Certifications! Take advantage
+ of our pilot Certification program. Click on a certification below to learn more.
+ {props.certification.title}
+ {desc}
+ {props.certification.description.length > EXCERPT_TEXT_LEN ? '...' : ''}
+ We are working hard to bring you the best content out there. Learn with us!
+ Increase your chances of getting placed on a gig or placing in a competition!
+ The more you learn, more opportunities will become available.
+
+ Earn certifications to increase your earning opportunities inside and out of Topcoder.
+
+ Our catalog of courses is growing! We currently offer 11 free courses
+ covering data science, web development, coding interview prep,
+ information security, and quality assurance.
+
- Email:
- {' '}
- {profile.email}
-
- Username:
- {' '}
- {profile.handle}
-
- {profile.firstName}
- {' '}
- {profile.lastName}
-
- *******************
- We will automatically redirect you in 5 seconds...{props.title}
-
- Topcoder Academy
+
+ Certificate
+
+
+ not found
+
+ ) : (
+
+ {'What '}
+ {enrollment?.userName}
+ {' Learned?'}
+
+ {learnedOutcomes}
+
+ Courses Taken
+
-
- We look forward to learning with you!
+ prepare you to earn on the Topcoder platform.
`}
theme='light'
- >
-
{category}
-
- Courses Available
-
- {certificationsCount}
-
-
-
-
+ Courses
+
+ {certificationsCount}
+
+
+
+ Check out our Courses
+ Coming Soon
)}
Happy you’re here!
- My progress
-
- {allMyLearningsLink}
-
-
+ Certifications
+
+ {certificationsCount}
+
+
+ Introducing Topcoder Certifications
+ What can topcoder academy do for you?
+ {
+ collapsed ? (
+ Stand out
+ Certifications
+ Courses
+ This page has moved.
+
+