Skip to content

Commit 8c24e95

Browse files
committed
[WIP] Fix prototype extension usages (tests 302 > 290)
1 parent 884b779 commit 8c24e95

File tree

6 files changed

+62
-23
lines changed

6 files changed

+62
-23
lines changed

app/components/track-leaderboard-entry.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { get } from '@ember/object';
12
import Component from '@glimmer/component';
23
import type AuthenticatorService from 'codecrafters-frontend/services/authenticator';
34
import type CourseModel from 'codecrafters-frontend/models/course';
@@ -33,9 +34,9 @@ export default class TrackLeaderboardEntryComponent extends Component<Signature>
3334
get progressDenominator() {
3435
return this.store
3536
.peekAll('course')
36-
.rejectBy('releaseStatusIsAlpha')
37+
.filter((item) => !item.releaseStatusIsAlpha)
3738
.filter((course: CourseModel) => course.betaOrLiveLanguages.includes(this.args.entry!.language as LanguageModel))
38-
.mapBy('stages.length')
39+
.map((item) => item.stages.length)
3940
.reduce((a, b) => a + b, 0);
4041
}
4142

app/components/track-leaderboard.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { compare } from '@ember/utils';
12
import Component from '@glimmer/component';
23
import TrackLeaderboardEntry from 'codecrafters-frontend/utils/track-leaderboard-entry';
34
import fade from 'ember-animated/transitions/fade';
@@ -39,9 +40,9 @@ export default class TrackLeaderboardComponent extends Component<Signature> {
3940
let entries: TrackLeaderboardEntryModel[] = [];
4041

4142
if (this.entriesFromCurrentUser.length > 0) {
42-
entries = entries.concat(this.entriesFromAPI!.toArray().filter((entry) => entry.user !== this.currentUser));
43+
entries = entries.concat([...this.entriesFromAPI!].filter((entry) => entry.user !== this.currentUser));
4344
} else {
44-
entries = entries.concat(this.entriesFromAPI!.toArray());
45+
entries = entries.concat([...this.entriesFromAPI!]);
4546
}
4647

4748
return entries.concat(this.entriesFromCurrentUser);
@@ -52,14 +53,22 @@ export default class TrackLeaderboardComponent extends Component<Signature> {
5253
return [];
5354
}
5455

55-
const currentUserRepositories = this.currentUser.repositories.filterBy('language', this.args.language).filterBy('firstSubmissionCreated');
56+
const currentUserRepositories = this.currentUser.repositories
57+
.filter((item) => item.language === this.args.language)
58+
.filter((item) => item.firstSubmissionCreated);
5659

5760
if (currentUserRepositories.length === 0) {
5861
return [];
5962
}
6063

6164
const completedStagesCount = currentUserRepositories.reduce((result, repository) => {
62-
return result.concat(repository.courseStageCompletions.toArray()).uniqBy('courseStage');
65+
return result.concat([...repository.courseStageCompletions]).reduce<CourseStageCompletionModel[]>((unique, item) => {
66+
if (!unique.find((i) => item.courseStage === i.courseStage)) {
67+
unique.push(item);
68+
}
69+
70+
return unique;
71+
}, []);
6372
}, [] as CourseStageCompletionModel[]).length;
6473

6574
return [
@@ -73,7 +82,7 @@ export default class TrackLeaderboardComponent extends Component<Signature> {
7382
}
7483

7584
get sortedEntries() {
76-
return this.entries.sortBy('completedStagesCount').reverse();
85+
return [...this.entries].sort((a, b) => compare(a.completedStagesCount, b.completedStagesCount)).reverse();
7786
}
7887

7988
@action

app/components/track-page/course-card-list.ts

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { compare } from '@ember/utils';
2+
import { get } from '@ember/object';
13
import Component from '@glimmer/component';
24
import CourseModel from 'codecrafters-frontend/models/course';
35
import LanguageModel from 'codecrafters-frontend/models/language';
@@ -24,11 +26,24 @@ export default class TrackPageCourseCardListComponent extends Component<Signatur
2426
get coursesWithProgress() {
2527
return this.args.courses.map((course) => {
2628
const repositoryWithMostProgress = this.authenticator.currentUser
27-
? this.authenticator.currentUser.repositories
28-
.filterBy('language', this.args.language)
29-
.filterBy('course', course)
30-
.filterBy('firstSubmissionCreated')
31-
.sortBy('completedStages.length', 'lastSubmissionAt').lastObject
29+
? [
30+
...this.authenticator.currentUser.repositories
31+
.filter((item) => item.language === this.args.language)
32+
.filter((item) => item.course === course)
33+
.filter((item) => item.firstSubmissionCreated),
34+
]
35+
.sort((a, b) => {
36+
for (const key of ['completedStages.length', 'lastSubmissionAt']) {
37+
const compareValue = compare(get(a, key), get(b, key));
38+
39+
if (compareValue) {
40+
return compareValue;
41+
}
42+
}
43+
44+
return 0;
45+
})
46+
.at(-1)
3247
: null;
3348

3449
return {

app/components/track-page/header/index.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
import { compare } from '@ember/utils';
12
import Component from '@glimmer/component';
23
import LanguageModel from 'codecrafters-frontend/models/language';
34
import type AuthenticatorService from 'codecrafters-frontend/services/authenticator';
45
import type CourseModel from 'codecrafters-frontend/models/course';
56
import type Store from '@ember-data/store';
67
import { inject as service } from '@ember/service';
78
import type UserModel from 'codecrafters-frontend/models/user';
9+
import TrackLeaderboardEntry from 'codecrafters-frontend/utils/track-leaderboard-entry';
810

911
interface Signature {
1012
Element: HTMLDivElement;
@@ -24,18 +26,22 @@ export default class TrackPageHeaderComponent extends Component<Signature> {
2426
@service declare store: Store;
2527

2628
get currentUserHasStartedTrack() {
27-
return this.authenticator.currentUser && this.authenticator.currentUser.repositories.filterBy('language', this.args.language)[0];
29+
return this.authenticator.currentUser && this.authenticator.currentUser.repositories.filter((item) => item.language === this.args.language)[0];
2830
}
2931

3032
get topParticipants(): UserModel[] {
31-
return this.store
32-
.peekAll('track-leaderboard-entry')
33-
.filterBy('language', this.args.language)
34-
.sortBy('completedStagesCount')
33+
return [...this.store.peekAll('track-leaderboard-entry').filter((item) => item.language === this.args.language)]
34+
.sort((a, b) => compare(a.completedStagesCount, b.completedStagesCount))
3535
.reverse()
36-
.uniqBy('user')
36+
.reduce<TrackLeaderboardEntry[]>((unique, item) => {
37+
if (!unique.find((i) => item.user === i.user)) {
38+
unique.push(item);
39+
}
40+
41+
return unique;
42+
}, [])
3743
.slice(0, 3)
38-
.mapBy('user');
44+
.map((item) => item.user);
3945
}
4046
}
4147

app/controllers/join-track.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { compare } from '@ember/utils';
12
import Controller from '@ember/controller';
23
import { inject as service } from '@ember/service';
34
import type AuthenticatorService from 'codecrafters-frontend/services/authenticator';
@@ -12,11 +13,14 @@ export default class JoinTrackController extends Controller {
1213
@service declare authenticator: AuthenticatorService;
1314

1415
get courses(): CourseModel[] {
15-
return this.model.courses.rejectBy('releaseStatusIsAlpha').rejectBy('releaseStatusIsDeprecated').rejectBy('visibilityIsPrivate');
16+
return this.model.courses
17+
.filter((item) => !item.releaseStatusIsAlpha)
18+
.filter((item) => !item.releaseStatusIsDeprecated)
19+
.filter((item) => !item.visibilityIsPrivate);
1620
}
1721

1822
get sortedCourses(): CourseModel[] {
19-
return this.courses.sortBy('sortPositionForTrack');
23+
return [...this.courses].sort((a, b) => compare(a.sortPositionForTrack, b.sortPositionForTrack));
2024
}
2125

2226
get testimonials(): CourseModel['testimonials'] {

app/controllers/track.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { compare } from '@ember/utils';
12
import Controller from '@ember/controller';
23
import { inject as service } from '@ember/service';
34
import type AuthenticatorService from 'codecrafters-frontend/services/authenticator';
@@ -14,11 +15,14 @@ export default class TrackController extends Controller {
1415
return this.model.courses;
1516
}
1617

17-
return this.model.courses.rejectBy('releaseStatusIsAlpha').rejectBy('releaseStatusIsDeprecated').rejectBy('visibilityIsPrivate');
18+
return this.model.courses
19+
.filter((item) => !item.releaseStatusIsAlpha)
20+
.filter((item) => !item.releaseStatusIsDeprecated)
21+
.filter((item) => !item.visibilityIsPrivate);
1822
}
1923

2024
get sortedCourses(): CourseModel[] {
21-
return this.courses.sortBy('sortPositionForTrack');
25+
return [...this.courses].sort((a, b) => compare(a.sortPositionForTrack, b.sortPositionForTrack));
2226
}
2327

2428
get testimonials(): CourseModel['testimonials'] {

0 commit comments

Comments
 (0)