Skip to content

Commit bee5d68

Browse files
committed
Refactor course introduction flow to handle language selection
- Added `onLanguageSelected` action to `CreateRepositoryCard` for better handling of language selection. - Updated `IntroductionController` to manage repository and model refresh logic based on language selection. - Introduced `shouldSkipNextModelRefresh` flag in `CourseController` to optimize model loading. - Adjusted template to bind the new action for language selection. This improves the user experience by ensuring the correct repository is set without unnecessary model refreshes.
1 parent ca548be commit bee5d68

6 files changed

Lines changed: 26 additions & 3 deletions

File tree

app/components/course-page/introduction-step/create-repository-card/index.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import type Owner from '@ember/owner';
33
import CoursePageStateService from 'codecrafters-frontend/services/course-page-state';
44
import LanguageModel from 'codecrafters-frontend/models/language';
55
import RepositoryModel from 'codecrafters-frontend/models/repository';
6-
import RouterService from '@ember/routing/router-service';
76
import * as Sentry from '@sentry/ember';
87
import { type Section as MultiSectionCardSection } from 'codecrafters-frontend/components/course-page/multi-section-card';
98
import { Section, SectionList } from 'codecrafters-frontend/utils/pre-challenge-assessment-section-list';
@@ -15,13 +14,13 @@ interface Signature {
1514
Element: HTMLDivElement;
1615

1716
Args: {
17+
onLanguageSelected: (repository: RepositoryModel) => void;
1818
preferredLanguageSlug: string | undefined;
1919
repository: RepositoryModel;
2020
};
2121
}
2222

2323
export default class CreateRepositoryCard extends Component<Signature> {
24-
@service declare router: RouterService;
2524
@service declare coursePageState: CoursePageStateService;
2625

2726
@tracked expandedSectionIndex: number | null = null;
@@ -72,7 +71,7 @@ export default class CreateRepositoryCard extends Component<Signature> {
7271

7372
this.expandNextSection();
7473

75-
this.router.transitionTo({ queryParams: { repo: this.args.repository.id, track: null } });
74+
this.args.onLanguageSelected(this.args.repository);
7675
}
7776

7877
@action

app/controllers/course.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export default class CourseController extends Controller {
3535
@tracked track: string | undefined = undefined;
3636

3737
@tracked configureGithubIntegrationModalIsOpen = false;
38+
@tracked shouldSkipNextModelRefresh = false;
3839
@tracked sidebarIsExpandedOnDesktop = true;
3940
@tracked sidebarIsExpandedOnMobile = false;
4041
@tracked leaderboardIsExpanded = true;

app/controllers/course/introduction.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
import Controller from '@ember/controller';
2+
import CourseController from 'codecrafters-frontend/controllers/course';
3+
import { action } from '@ember/object';
4+
import { getOwner } from '@ember/owner';
25
import { service } from '@ember/service';
36
import type AuthenticatorService from 'codecrafters-frontend/services/authenticator';
47
import type CoursePageStateService from 'codecrafters-frontend/services/course-page-state';
8+
import type RepositoryModel from 'codecrafters-frontend/models/repository';
59
import type { ModelType as CourseRouteModelType } from 'codecrafters-frontend/routes/course';
610
import type StepDefinition from 'codecrafters-frontend/utils/course-page-step-list/step';
711

@@ -14,4 +18,12 @@ export default class IntroductionController extends Controller {
1418
get currentStep(): StepDefinition {
1519
return this.coursePageState.currentStep as StepDefinition;
1620
}
21+
22+
@action
23+
handleLanguageSelected(repository: RepositoryModel) {
24+
const courseController = getOwner(this)!.lookup('controller:course') as CourseController;
25+
courseController.shouldSkipNextModelRefresh = true;
26+
courseController.repo = repository.id;
27+
courseController.track = undefined;
28+
}
1729
}

app/routes/course.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import BaseRoute from 'codecrafters-frontend/utils/base-route';
2+
import CourseController from 'codecrafters-frontend/controllers/course';
23
import { all as RSVPAll } from 'rsvp';
34
import RepositoryPoller from 'codecrafters-frontend/utils/repository-poller';
45
import type AuthenticatorService from 'codecrafters-frontend/services/authenticator';
@@ -118,6 +119,14 @@ export default class CourseRoute extends BaseRoute {
118119
}
119120

120121
async model(params: { course_slug: string }, transition: Transition): Promise<ModelType> {
122+
const courseController = this.controllerFor('course') as CourseController;
123+
124+
if (courseController.shouldSkipNextModelRefresh) {
125+
courseController.shouldSkipNextModelRefresh = false;
126+
127+
return courseController.model;
128+
}
129+
121130
const [allCourses, allRepositories] = (await this.loadResources()) as [CourseModel[], RepositoryModel[]];
122131
const course = allCourses.find((course) => course.slug === params.course_slug) as CourseModel;
123132

app/templates/course/introduction.hbs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
<div class="w-full pt-8 pb-32 px-3 md:px-6 lg:px-10">
33
<CoursePage::IntroductionStep::WelcomeCard @repository={{@model.activeRepository}} class="mb-6" />
44
<CoursePage::IntroductionStep::CreateRepositoryCard
5+
@onLanguageSelected={{this.handleLanguageSelected}}
56
@repository={{@model.activeRepository}}
67
@preferredLanguageSlug={{@model.track}}
78
class="mb-6"

app/utils/course-page-step-list/course-stage-step.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ Check the [How to pass this stage](#first-stage-tutorial-heading) section for in
155155
}
156156

157157
get status() {
158+
// debugger;
158159
// TODO: Might need to prioritize "in_progress" when allowing users to change currentStage
159160
if (this.completedAt) {
160161
return 'complete';

0 commit comments

Comments
 (0)