From 2195670ad63475c52ad97cf0b5abc829f185b235 Mon Sep 17 00:00:00 2001 From: Paul Kuruvilla Date: Thu, 20 Feb 2025 19:15:24 -0800 Subject: [PATCH 01/16] feat: add Rust language support and concept group handling Adds support for the Rust language by introducing the `isRust` getter in the `LanguageModel`. Implements a new computed property `trackPrimerConceptGroupSlug` to return the appropriate slug for Rust. Updates the `TrackController` to include a method for retrieving the track primer concept group based on the language. Enhances the `TrackRoute` to query for the concept group when available, ensuring proper data loading for Rust tracks. --- app/controllers/track.ts | 13 ++++++++++++- app/models/language.ts | 12 ++++++++++++ app/routes/track.ts | 8 ++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/app/controllers/track.ts b/app/controllers/track.ts index 70e08f23c0..cab3acbe68 100644 --- a/app/controllers/track.ts +++ b/app/controllers/track.ts @@ -1,13 +1,16 @@ import Controller from '@ember/controller'; -import { inject as service } from '@ember/service'; import type AuthenticatorService from 'codecrafters-frontend/services/authenticator'; +import type ConceptGroupModel from 'codecrafters-frontend/models/concept-group'; import type CourseModel from 'codecrafters-frontend/models/course'; +import type Store from '@ember-data/store'; +import { inject as service } from '@ember/service'; import { type ModelType } from 'codecrafters-frontend/routes/track'; export default class TrackController extends Controller { declare model: ModelType; @service declare authenticator: AuthenticatorService; + @service declare store: Store; get courses(): CourseModel[] { if (this.authenticator.currentUser && this.authenticator.currentUser.isStaff) { @@ -24,4 +27,12 @@ export default class TrackController extends Controller { get testimonials(): CourseModel['testimonials'] { return this.sortedCourses[0] ? this.sortedCourses[0].testimonials : []; } + + get trackPrimerConceptGroup(): ConceptGroupModel | null { + if (!this.model.language.trackPrimerConceptGroupSlug) { + return null; + } + + return this.store.peekAll('concept-group').find((conceptGroup) => conceptGroup.slug === this.model.language.trackPrimerConceptGroupSlug); + } } diff --git a/app/models/language.ts b/app/models/language.ts index 84ec0b4aa6..f4df671d95 100644 --- a/app/models/language.ts +++ b/app/models/language.ts @@ -145,6 +145,10 @@ export default class LanguageModel extends Model { return this.slug === 'go'; } + get isRust() { + return this.slug === 'rust'; + } + get sortPositionForTrack() { return [ // Popular tracks, sorted by usage @@ -247,4 +251,12 @@ A quick welcome to CodeCrafters. zig: 7037, }[this.slug]; } + + get trackPrimerConceptGroupSlug() { + if (this.isRust) { + return 'rust-primer'; + } else { + return null; + } + } } diff --git a/app/routes/track.ts b/app/routes/track.ts index 7575c69d37..ac21a13681 100644 --- a/app/routes/track.ts +++ b/app/routes/track.ts @@ -49,6 +49,14 @@ export default class TrackRoute extends BaseRoute { const language = this.store.peekAll('language').findBy('slug', params.track_slug) as LanguageModel; + if (language.trackPrimerConceptGroupSlug) { + const conceptGroup = await this.store.queryRecord('concept-group', { slug: language.trackPrimerConceptGroupSlug, include: 'author' }); + + if (conceptGroup) { + await this.store.findAll('concept', { include: 'author,questions' }); + } + } + if (this.authenticator.isAuthenticated) { await this.store.findAll('repository', { include: RepositoryPoller.defaultIncludedResources, From 1e7a2bf4c5ac6a2c9480b62d04d8b43e4b1950e7 Mon Sep 17 00:00:00 2001 From: Paul Kuruvilla Date: Thu, 20 Feb 2025 19:18:51 -0800 Subject: [PATCH 02/16] feat: refactor course card display into separate component Create a new `TrackPageCourseCardList` component to encapsulate the logic for displaying course cards with progress. Move relevant functionality from `TrackPageIntroductionAndCourses` to the new component, improving code organization and reusability. Update template references to use the new component. --- ...roduction-and-courses.hbs => course-card-list.hbs} | 0 ...ntroduction-and-courses.ts => course-card-list.ts} | 11 ++--------- app/templates/join-track.hbs | 2 +- app/templates/track.hbs | 2 +- 4 files changed, 4 insertions(+), 11 deletions(-) rename app/components/track-page/{introduction-and-courses.hbs => course-card-list.hbs} (100%) rename app/components/track-page/{introduction-and-courses.ts => course-card-list.ts} (77%) diff --git a/app/components/track-page/introduction-and-courses.hbs b/app/components/track-page/course-card-list.hbs similarity index 100% rename from app/components/track-page/introduction-and-courses.hbs rename to app/components/track-page/course-card-list.hbs diff --git a/app/components/track-page/introduction-and-courses.ts b/app/components/track-page/course-card-list.ts similarity index 77% rename from app/components/track-page/introduction-and-courses.ts rename to app/components/track-page/course-card-list.ts index d58058084b..30845eb492 100644 --- a/app/components/track-page/introduction-and-courses.ts +++ b/app/components/track-page/course-card-list.ts @@ -15,7 +15,7 @@ interface Signature { }; } -export default class TrackPageIntroductionAndCoursesComponent extends Component { +export default class TrackPageCourseCardListComponent extends Component { logoImage = logoImage; comingSoonImage = comingSoonImage; @@ -37,17 +37,10 @@ export default class TrackPageIntroductionAndCoursesComponent extends Component< }; }); } - - get userHasStartedTrack() { - return ( - this.authenticator.currentUser && - this.authenticator.currentUser.repositories.filterBy('language', this.args.language).filterBy('lastSubmissionAt')[0] - ); - } } declare module '@glint/environment-ember-loose/registry' { export default interface Registry { - 'TrackPage::IntroductionAndCourses': typeof TrackPageIntroductionAndCoursesComponent; + 'TrackPage::CourseCardList': typeof TrackPageCourseCardListComponent; } } diff --git a/app/templates/join-track.hbs b/app/templates/join-track.hbs index fc4fa0292a..56fa07e3be 100644 --- a/app/templates/join-track.hbs +++ b/app/templates/join-track.hbs @@ -24,7 +24,7 @@
- +