Skip to content

Commit 16f5ff8

Browse files
committed
feat(leaderboard): enhance preferred language leaderboard loading
Trigger preferred language leaderboard refresh on component initialization instead of instance initializer to ensure the service boots after authenticator is available. Update header tests to verify leaderboard link changes dynamically based on user's leaderboard entries and feature flag. This improves leaderboard loading accuracy and user navigation consistency.
1 parent 505d46f commit 16f5ff8

File tree

4 files changed

+31
-14
lines changed

4 files changed

+31
-14
lines changed

app/components/header/index.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,13 @@ export default class Header extends Component<Signature> {
3232
@tracked floatingBarStyle: SafeString = htmlSafe('left: 0px; width: 0px; opacity: 0;');
3333
@tracked floatingBarContainer: HTMLElement | null = null;
3434

35+
constructor(owner: unknown, args: object) {
36+
super(owner, args);
37+
38+
// This can't be in instance-initializers since it depends on the authenticator service
39+
this.preferredLanguageLeaderboard.onBoot();
40+
}
41+
3542
get activeDiscountForYearlyPlan(): PromotionalDiscountModel | null {
3643
return this.currentUser?.activeDiscountForYearlyPlan || null;
3744
}

app/instance-initializers/preferred-language-leaderboard.ts

Lines changed: 0 additions & 11 deletions
This file was deleted.

app/services/preferred-language-leaderboard.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,12 @@ export default class PreferredLanguageLeaderboardService extends Service {
5353
const serializedStoredData = this.localStorage.getItem(PreferredLanguageLeaderboardService.STORAGE_KEY);
5454

5555
if (!serializedStoredData) {
56+
await this.refresh();
57+
5658
return;
5759
}
5860

59-
// Let's use the latest value we have from
61+
// Let's use the latest value we have from local storage
6062
const storedData = StoredData.fromJSON(serializedStoredData);
6163
this.preferredLanguageSlugs = storedData.languageSlugs;
6264

tests/acceptance/header-test.js

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,34 @@ module('Acceptance | header-test', function (hooks) {
3030
assert.strictEqual(currentURL(), '/pay', 'expect to be redirected to pay page');
3131
});
3232

33-
test('header should show leaderboard link if user is authenticated and has feature flag enabled', async function (assert) {
33+
test('header should show generic leaderboard link if user has feature flag enabled and leaderboard entries', async function (assert) {
3434
const user = signIn(this.owner, this.server);
3535
user.update('featureFlags', { 'should-see-leaderboard': 'true' });
3636

3737
await catalogPage.visit();
3838
assert.true(catalogPage.header.hasLink('Leaderboard'), 'expect leaderboard link to be visible');
3939

4040
await catalogPage.header.clickOnHeaderLink('Leaderboard');
41-
assert.strictEqual(currentURL(), '/leaderboards/rust', 'expect to be redirected to rust leaderboard page by default');
41+
assert.strictEqual(currentURL(), '/leaderboards/rust', 'expect to be redirected to rust leaderboard page');
42+
});
43+
44+
test('header should show custom leaderboard link if user has feature flag enabled', async function (assert) {
45+
const user = signIn(this.owner, this.server);
46+
user.update('featureFlags', { 'should-see-leaderboard': 'true' });
47+
48+
const python = this.server.schema.languages.findBy({ name: 'Python' });
49+
50+
this.server.create('leaderboard-entry', {
51+
leaderboard: python.leaderboard,
52+
user: user,
53+
score: 100,
54+
});
55+
56+
await catalogPage.visit();
57+
assert.true(catalogPage.header.hasLink('Leaderboard'), 'expect leaderboard link to be visible');
58+
59+
await catalogPage.header.clickOnHeaderLink('Leaderboard');
60+
assert.strictEqual(currentURL(), '/leaderboards/python', 'expect to be redirected to python leaderboard page');
4261
});
4362

4463
test('header should show upgrade button if user does not have an active subscription', async function (assert) {

0 commit comments

Comments
 (0)