Skip to content

Commit de447c2

Browse files
fehmerMiodec
andauthored
impr(account): add url params / deep links to account settings (@fehmer) (monkeytypegame#6660)
Co-authored-by: Miodec <[email protected]>
1 parent 084dc0d commit de447c2

File tree

2 files changed

+26
-17
lines changed

2 files changed

+26
-17
lines changed

frontend/src/html/pages/account-settings.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66
</div> -->
77
<div class="main">
88
<div class="tabs">
9-
<button class="text active" data-tab="general">
9+
<button class="text" data-tab="account">
1010
<i class="fas fa-user"></i>
1111
account
1212
</button>
1313
<button class="text" data-tab="authentication">
1414
<i class="fas fa-key"></i>
1515
authentication
1616
</button>
17-
<button class="text" data-tab="api">
17+
<button class="text" data-tab="apeKeys">
1818
<i class="fas fa-code"></i>
1919
ape keys
2020
</button>
@@ -24,7 +24,7 @@
2424
</button>
2525
</div>
2626
<div class="right">
27-
<div class="tab" data-tab="general">
27+
<div class="tab hidden" data-tab="account">
2828
<div class="section discordIntegration">
2929
<div class="title">
3030
<i class="fab fa-discord"></i>
@@ -131,7 +131,7 @@
131131
</div>
132132
<!-- -->
133133
</div>
134-
<div class="tab hidden" data-tab="api">
134+
<div class="tab hidden" data-tab="apeKeys">
135135
<div class="section apeKeys">
136136
<div class="title">
137137
<i class="fas fa-key"></i>

frontend/src/ts/pages/account-settings.ts

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import Page from "./page";
1+
import { PageWithUrlParams } from "./page";
22
import * as Skeleton from "../utils/skeleton";
33
import { getAuthenticatedUser, isAuthenticated } from "../firebase";
44
import * as ActivePage from "../states/active-page";
@@ -9,15 +9,19 @@ import * as StreakHourOffsetModal from "../modals/streak-hour-offset";
99
import * as Loader from "../elements/loader";
1010
import * as ApeKeyTable from "../elements/account-settings/ape-key-table";
1111
import * as Notifications from "../elements/notifications";
12+
import { z } from "zod";
1213

1314
const pageElement = $(".page.pageAccountSettings");
1415

15-
type State = {
16-
activeTab: "authentication" | "general" | "api" | "dangerZone";
17-
};
16+
const StateSchema = z.object({
17+
tab: z.enum(["authentication", "account", "apeKeys", "dangerZone"]),
18+
});
19+
type State = z.infer<typeof StateSchema>;
20+
21+
const UrlParameterSchema = StateSchema.partial();
1822

1923
const state: State = {
20-
activeTab: "general",
24+
tab: "account",
2125
};
2226

2327
function updateAuthenticationSections(): void {
@@ -122,20 +126,18 @@ function updateIntegrationSections(): void {
122126
function updateTabs(): void {
123127
void swapElements(
124128
pageElement.find(".tab.active"),
125-
pageElement.find(`.tab[data-tab="${state.activeTab}"]`),
129+
pageElement.find(`.tab[data-tab="${state.tab}"]`),
126130
250,
127131
async () => {
128132
//
129133
},
130134
async () => {
131135
pageElement.find(".tab").removeClass("active");
132-
pageElement
133-
.find(`.tab[data-tab="${state.activeTab}"]`)
134-
.addClass("active");
136+
pageElement.find(`.tab[data-tab="${state.tab}"]`).addClass("active");
135137
}
136138
);
137139
pageElement.find("button").removeClass("active");
138-
pageElement.find(`button[data-tab="${state.activeTab}"]`).addClass("active");
140+
pageElement.find(`button[data-tab="${state.tab}"]`).addClass("active");
139141
}
140142

141143
function updateAccountSections(): void {
@@ -180,11 +182,13 @@ export function updateUI(): void {
180182
updateAccountSections();
181183
void ApeKeyTable.update(updateUI);
182184
updateTabs();
185+
page.setUrlParams(state);
183186
}
184187

185188
$(".page.pageAccountSettings").on("click", ".tabs button", (event) => {
186-
state.activeTab = $(event.target).data("tab") as State["activeTab"];
189+
state.tab = $(event.target).data("tab") as State["tab"];
187190
updateTabs();
191+
page.setUrlParams(state);
188192
});
189193

190194
$(
@@ -207,16 +211,21 @@ $(".page.pageAccountSettings #setStreakHourOffset").on("click", () => {
207211
StreakHourOffsetModal.show();
208212
});
209213

210-
export const page = new Page({
214+
export const page = new PageWithUrlParams({
211215
id: "accountSettings",
212216
display: "Account Settings",
213217
element: pageElement,
214218
path: "/account-settings",
219+
urlParamsSchema: UrlParameterSchema,
215220
afterHide: async (): Promise<void> => {
216221
Skeleton.remove("pageAccountSettings");
217222
},
218-
beforeShow: async (): Promise<void> => {
223+
beforeShow: async (options): Promise<void> => {
224+
if (options.urlParams?.tab !== undefined) {
225+
state.tab = options.urlParams.tab;
226+
}
219227
Skeleton.append("pageAccountSettings", "main");
228+
pageElement.find(`.tab[data-tab="${state.tab}"]`).addClass("active");
220229
updateUI();
221230
},
222231
});

0 commit comments

Comments
 (0)