Skip to content

Commit a4de8df

Browse files
fehmerMiodec
andauthored
impr(leaderboard): daily mode/language buttons based on backend configuration (@fehmer) (#6713)
Co-authored-by: Miodec <[email protected]>
1 parent 5aec2c9 commit a4de8df

File tree

7 files changed

+323
-109
lines changed

7 files changed

+323
-109
lines changed

backend/__tests__/api/controllers/leaderboard.spec.ts

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -139,28 +139,29 @@ describe("Loaderboard Controller", () => {
139139
);
140140
});
141141

142-
it("should get for mode", async () => {
143-
getLeaderboardMock.mockResolvedValue([]);
144-
for (const mode of ["time", "words", "quote", "zen", "custom"]) {
145-
const response = await mockApp
146-
.get("/leaderboards")
147-
.query({ language: "english", mode, mode2: "custom" });
148-
expect(response.status, "for mode " + mode).toEqual(200);
149-
}
150-
});
151-
152-
it("should get for mode2", async () => {
153-
getLeaderboardMock.mockResolvedValue([]);
154-
for (const mode2 of allModes) {
155-
const response = await mockApp.get("/leaderboards").query({
156-
language: "english",
157-
mode: "words",
158-
mode2,
159-
});
142+
describe("should get for modes", async () => {
143+
beforeEach(() => {
144+
getLeaderboardMock.mockResolvedValue([]);
145+
});
160146

161-
expect(response.status, "for mode2 " + mode2).toEqual(200);
162-
}
147+
const testCases = [
148+
{ mode: "time", mode2: "15", language: "english", expectStatus: 200 },
149+
{ mode: "time", mode2: "60", language: "english", expectStatus: 200 },
150+
{ mode: "time", mode2: "30", language: "english", expectStatus: 404 },
151+
{ mode: "words", mode2: "15", language: "english", expectStatus: 404 },
152+
{ mode: "time", mode2: "15", language: "spanish", expectStatus: 404 },
153+
];
154+
it.for(testCases)(
155+
`expect $expectStatus for mode $mode, mode2 $mode2, lang $language`,
156+
async ({ mode, mode2, language, expectStatus }) => {
157+
await mockApp
158+
.get("/leaderboards")
159+
.query({ language, mode, mode2 })
160+
.expect(expectStatus);
161+
}
162+
);
163163
});
164+
164165
it("fails for missing query", async () => {
165166
const { body } = await mockApp.get("/leaderboards").expect(422);
166167

backend/src/api/controllers/leaderboard.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@ export async function getLeaderboard(
3232
): Promise<GetLeaderboardResponse> {
3333
const { language, mode, mode2, page, pageSize } = req.query;
3434

35+
if (
36+
mode !== "time" ||
37+
(mode2 !== "15" && mode2 !== "60") ||
38+
language !== "english"
39+
) {
40+
throw new MonkeyError(404, "There is no leaderboard for this mode");
41+
}
42+
3543
const leaderboard = await LeaderboardsDAL.get(
3644
mode,
3745
mode2,

frontend/src/html/pages/leaderboards.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@
156156
</div>
157157
</div>
158158
</div>
159-
<div class="buttons">
159+
<div class="sideButtons">
160160
<div class="buttonGroup typeButtons">
161161
<button data-type="allTime">
162162
<i class="fas fa-globe-americas"></i>
@@ -172,7 +172,7 @@
172172
</button>
173173
</div>
174174
<div class="divider hidden"></div>
175-
<div class="buttonGroup hidden secondary modeButtons">
175+
<div class="buttonGroup hidden modeButtons">
176176
<button data-mode="15">
177177
<i class="fas fa-clock"></i>
178178
time 15
@@ -182,8 +182,8 @@
182182
time 60
183183
</button>
184184
</div>
185-
<div class="divider divider2 hidden"></div>
186-
<div class="buttonGroup hidden secondary languageButtons">
185+
<div class="divider2 hidden"></div>
186+
<div class="buttonGroup hidden languageButtons">
187187
<button data-language="english">
188188
<i class="fas fa-globe"></i>
189189
english

frontend/src/styles/leaderboards.scss

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@
279279
color: var(--sub-color);
280280
padding: 1em;
281281
}
282-
.buttons {
282+
.sideButtons {
283283
align-content: start;
284284
align-items: start;
285285
grid-area: buttons;
@@ -294,7 +294,8 @@
294294
justify-content: start;
295295
padding-left: 0.75em;
296296
}
297-
.divider {
297+
.divider,
298+
.divider2 {
298299
background: var(--bg-color);
299300
width: 100%;
300301
height: 0.25em;

frontend/src/ts/ape/server-configuration.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
import { Configuration } from "@monkeytype/contracts/schemas/configuration";
22
import Ape from ".";
3+
import { promiseWithResolvers } from "../utils/misc";
34

45
let config: Configuration | undefined = undefined;
56

7+
const { promise: configPromise, resolve } = promiseWithResolvers<boolean>();
8+
9+
export { configPromise };
10+
611
export function get(): Configuration | undefined {
712
return config;
813
}
@@ -15,5 +20,6 @@ export async function sync(): Promise<void> {
1520
return;
1621
} else {
1722
config = response.body.data ?? undefined;
23+
resolve(true);
1824
}
1925
}

0 commit comments

Comments
 (0)