Skip to content

Commit e7a14d6

Browse files
committed
feat: add language support to affiliate link components
Adds language handling to the affiliate link page components. Introduces a new `language` argument in the `AcceptReferralContainer` and `AcceptReferralButton` components. Updates the routing logic to transition to the appropriate track based on the provided language. Enhances the join track template to include the `AcceptReferralContainer` for both mobile and desktop views, improving user experience and accessibility.
1 parent 201a928 commit e7a14d6

File tree

6 files changed

+83
-5
lines changed

6 files changed

+83
-5
lines changed

app/components/affiliate-link-page/accept-referral-button.ts

+4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import Component from '@glimmer/component';
22
import type AffiliateLinkModel from 'codecrafters-frontend/models/affiliate-link';
33
import type AuthenticatorService from 'codecrafters-frontend/services/authenticator';
44
import type CourseModel from 'codecrafters-frontend/models/course';
5+
import type LanguageModel from 'codecrafters-frontend/models/language';
56
import type RouterService from '@ember/routing/router-service';
67
import type Store from '@ember-data/store';
78
import { action } from '@ember/object';
@@ -15,6 +16,7 @@ interface Signature {
1516
Args: {
1617
affiliateLink: AffiliateLinkModel;
1718
course?: CourseModel;
19+
language?: LanguageModel;
1820
};
1921
}
2022

@@ -78,6 +80,8 @@ export default class AcceptReferralButtonComponent extends Component<Signature>
7880

7981
if (this.args.course) {
8082
this.router.transitionTo('course', this.args.course.slug);
83+
} else if (this.args.language) {
84+
this.router.transitionTo('track', this.args.language.slug);
8185
} else {
8286
this.router.transitionTo('pay');
8387
}

app/components/affiliate-link-page/accept-referral-container.ts

+2
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@ import Component from '@glimmer/component';
22
import logoImage from '/assets/images/logo/logomark-color.svg';
33
import type AffiliateLinkModel from 'codecrafters-frontend/models/affiliate-link';
44
import type CourseModel from 'codecrafters-frontend/models/course';
5+
import type LanguageModel from 'codecrafters-frontend/models/language';
56

67
interface Signature {
78
Element: HTMLDivElement;
89

910
Args: {
1011
affiliateLink: AffiliateLinkModel;
1112
course?: CourseModel;
13+
language?: LanguageModel;
1214
verticalSize: 'tall' | 'compact';
1315
};
1416
}

app/templates/join-track.hbs

+25
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,28 @@
1313

1414
<div class="bg-white dark:bg-gray-850">
1515
<div class="container mx-auto lg:max-w-screen-lg px-3 md:px-6 py-6 md:py-10">
16+
<div class="lg:hidden flex justify-center items-center pb-6 md:pb-10">
17+
<AffiliateLinkPage::AcceptReferralContainer
18+
@affiliateLink={{this.model.affiliateLink}}
19+
{{!-- @course={{this.model.course}} --}}
20+
@verticalSize="tall"
21+
class="w-full bg-github-green-dot-wall"
22+
/>
23+
</div>
24+
1625
<div class="flex items-start">
1726
<div class="flex-grow">
1827
<TrackPage::IntroductionAndCourses @language={{@model.language}} @courses={{this.sortedCourses}} class="w-full mb-4" />
1928
</div>
2029

2130
<div class="w-80 flex-shrink-0 hidden lg:block">
31+
<AffiliateLinkPage::AcceptReferralContainer
32+
@affiliateLink={{this.model.affiliateLink}}
33+
{{!-- @language={{this.model.language}} --}}
34+
@verticalSize="compact"
35+
class="mb-6 ml-2 w-full bg-github-green-dot-wall"
36+
/>
37+
2238
<TrackLeaderboard class="ml-2 mb-6" @language={{@model.language}} />
2339

2440
{{! TODO: Show testimonials for track instead of courses? }}
@@ -29,5 +45,14 @@
2945
</div>
3046
</div>
3147
</div>
48+
49+
<div class="flex justify-center items-center py-6 md:py-10">
50+
<AffiliateLinkPage::AcceptReferralContainer
51+
@affiliateLink={{this.model.affiliateLink}}
52+
{{!-- @course={{this.model.course}} --}}
53+
@verticalSize="tall"
54+
class="w-full bg-github-green-dot-wall"
55+
/>
56+
</div>
3257
</div>
3358
</div>

app/templates/track.hbs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{{page-title @model.language.name}}
22

33
<div class="container mx-auto lg:max-w-screen-lg px-3 md:px-6 py-6 md:py-10">
4-
<TrackPage::Header @language={{@model.language}} @courses={{this.sortedCourses}}>
4+
<TrackPage::Header @language={{@model.language}} @courses={{this.sortedCourses}} />
55
</div>
66

77
<div class="h-px bg-gray-200 dark:bg-white/5 w-full"></div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import percySnapshot from '@percy/ember';
2+
import joinTrackPage from 'codecrafters-frontend/tests/pages/join-track-page';
3+
import testScenario from 'codecrafters-frontend/mirage/scenarios/test';
4+
import { currentURL } from '@ember/test-helpers';
5+
import { module, test } from 'qunit';
6+
import { setupAnimationTest } from 'ember-animated/test-support';
7+
import { setupApplicationTest } from 'codecrafters-frontend/tests/helpers';
8+
import { signIn } from 'codecrafters-frontend/tests/support/authentication-helpers';
9+
10+
module('Acceptance | view-join-track-page', function (hooks) {
11+
setupApplicationTest(hooks);
12+
setupAnimationTest(hooks);
13+
14+
test('can view join track page when not logged in', async function (assert) {
15+
testScenario(this.server);
16+
17+
this.server.create('affiliate-link', { user: this.server.schema.users.first() });
18+
19+
await joinTrackPage.visit({ track_slug: 'go' });
20+
assert.notOk(joinTrackPage.acceptReferralButtons[0].isVisible, 'First button is hidden (for mobile only)');
21+
assert.ok(joinTrackPage.acceptReferralButtons[1].isVisible, 'Second button is visible (leaderboard)');
22+
assert.ok(joinTrackPage.acceptReferralButtons[2].isVisible, 'Third button is visible (bottom of page)');
23+
assert.strictEqual(joinTrackPage.acceptReferralButtons.length, 3, 'Three accept referral buttons are present');
24+
25+
await percySnapshot('Join Track Page | Anonymous');
26+
});
27+
28+
test('can view affiliate link when logged in', async function (assert) {
29+
testScenario(this.server);
30+
signIn(this.owner, this.server);
31+
32+
this.server.create('affiliate-link', { user: this.server.schema.users.first() });
33+
34+
await joinTrackPage.visit({ track_slug: 'go' });
35+
assert.notOk(joinTrackPage.acceptReferralButtons[0].isVisible, 'First button is hidden (for mobile only)');
36+
assert.ok(joinTrackPage.acceptReferralButtons[1].isVisible, 'Second button is visible (leaderboard)');
37+
assert.ok(joinTrackPage.acceptReferralButtons[2].isVisible, 'Third button is visible (bottom of page)');
38+
assert.strictEqual(joinTrackPage.acceptReferralButtons.length, 3, 'Three accept referral buttons are present');
39+
40+
await percySnapshot('Affiliate Link Page | View Affiliate Link (anonymous)');
41+
});
42+
43+
test('redirects to not found if affiliate link is invalid', async function (assert) {
44+
testScenario(this.server);
45+
46+
await joinTrackPage.visit({ track_slug: 'invalid' });
47+
assert.strictEqual(currentURL(), '/404');
48+
});
49+
});

tests/pages/join-track-page.ts

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
import { visitable } from 'ember-cli-page-object';
1+
import { collection, visitable } from 'ember-cli-page-object';
22
import createPage from 'codecrafters-frontend/tests/support/create-page';
33

44
export default createPage({
5-
acceptReferralButton: {
6-
scope: '[data-test-accept-referral-button]',
7-
},
5+
acceptReferralButtons: collection('[data-test-accept-referral-button]'),
86

97
visit: visitable('/join-track/:track_slug'),
108
});

0 commit comments

Comments
 (0)