Skip to content

Commit 61e8640

Browse files
authored
chore(ui): settings page to load relevant tab (#595)
1 parent 07ca8cd commit 61e8640

File tree

6 files changed

+265
-160
lines changed

6 files changed

+265
-160
lines changed

keep-ui/app/settings/api-key-settings.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,15 @@ interface ApiKeyResponse {
1313

1414
interface Props {
1515
accessToken: string;
16+
selectedTab: string;
1617
}
1718

18-
export default function ApiKeySettings({ accessToken }: Props) {
19+
export default function ApiKeySettings({ accessToken, selectedTab }: Props) {
1920
const apiUrl = getApiURL();
2021
const { data, error, isLoading } = useSWR<ApiKeyResponse>(
21-
`${apiUrl}/settings/apikey`,
22-
(url) => fetcher(url, accessToken)
22+
selectedTab === "api-key" ? `${apiUrl}/settings/apikey` : null,
23+
(url) => fetcher(url, accessToken),
24+
{ revalidateOnFocus: false }
2325
);
2426

2527
if (isLoading) return <Loading />;
@@ -28,7 +30,7 @@ export default function ApiKeySettings({ accessToken }: Props) {
2830
const copyBlockApiKeyProps = {
2931
theme: { ...a11yLight },
3032
language: "text",
31-
text: data?.apiKey || '',
33+
text: data?.apiKey || "",
3234
codeBlock: true,
3335
showLineNumbers: false,
3436
};

keep-ui/app/settings/settings.client.tsx

Lines changed: 50 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,40 @@ import {
44
GlobeAltIcon,
55
UserGroupIcon,
66
EnvelopeIcon,
7-
KeyIcon
7+
KeyIcon,
88
} from "@heroicons/react/24/outline";
99
import UsersSettings from "./users-settings";
1010
import WebhookSettings from "./webhook-settings";
1111
import APIKeySettings from "./api-key-settings";
12-
import { useSession } from "next-auth/react"
12+
import { useSession } from "next-auth/react";
1313
import Loading from "app/loading";
1414
import SmtpSettings from "./smtp-settings";
15-
import { useRouter } from "next/navigation";
15+
import { usePathname, useRouter, useSearchParams } from "next/navigation";
16+
import { useState } from "react";
1617

1718
export default function SettingsPage() {
1819
const { data: session, status } = useSession();
1920
const router = useRouter();
21+
const searchParams = useSearchParams()!;
22+
const pathname = usePathname();
23+
const [selectedTab, setSelectedTab] = useState<string>(
24+
searchParams?.get("selectedTab") || "users"
25+
);
26+
27+
const handleTabChange = (tab: string) => {
28+
setSelectedTab(tab);
29+
router.push(`${pathname}?selectedTab=${tab}`);
30+
};
31+
32+
// TODO: more robust way to handle this
33+
const tabIndex =
34+
selectedTab === "users"
35+
? 0
36+
: selectedTab === "webhook"
37+
? 1
38+
: selectedTab === "smtp"
39+
? 2
40+
: 3;
2041

2142
if (status === "loading") return <Loading />;
2243
if (status === "unauthenticated") router.push("/signin");
@@ -28,28 +49,46 @@ export default function SettingsPage() {
2849
* Think about a proper way to implement it.
2950
*/
3051
return (
31-
<TabGroup>
52+
<TabGroup index={tabIndex}>
3253
<TabList color="orange">
33-
<Tab icon={UserGroupIcon}>Users</Tab>
34-
<Tab icon={GlobeAltIcon}>Webhook</Tab>
35-
<Tab icon={EnvelopeIcon}>SMTP</Tab>
36-
<Tab icon={KeyIcon}>Api Key</Tab>
54+
<Tab icon={UserGroupIcon} onClick={() => handleTabChange("users")}>
55+
Users
56+
</Tab>
57+
<Tab icon={GlobeAltIcon} onClick={() => handleTabChange("webhook")}>
58+
Webhook
59+
</Tab>
60+
<Tab icon={EnvelopeIcon} onClick={() => handleTabChange("smtp")}>
61+
SMTP
62+
</Tab>
63+
<Tab icon={KeyIcon} onClick={() => handleTabChange("api-key")}>
64+
API Key
65+
</Tab>
3766
</TabList>
3867
<TabPanels>
3968
<TabPanel>
4069
<UsersSettings
4170
accessToken={session?.accessToken!}
4271
currentUser={session?.user}
72+
selectedTab={selectedTab}
4373
/>
4474
</TabPanel>
4575
<TabPanel>
46-
<WebhookSettings accessToken={session?.accessToken!} />
76+
<WebhookSettings
77+
accessToken={session?.accessToken!}
78+
selectedTab={selectedTab}
79+
/>
4780
</TabPanel>
4881
<TabPanel>
49-
<SmtpSettings accessToken={session?.accessToken!} />
82+
<SmtpSettings
83+
accessToken={session?.accessToken!}
84+
selectedTab={selectedTab}
85+
/>
5086
</TabPanel>
5187
<TabPanel>
52-
<APIKeySettings accessToken={session?.accessToken!} />
88+
<APIKeySettings
89+
accessToken={session?.accessToken!}
90+
selectedTab={selectedTab}
91+
/>
5392
</TabPanel>
5493
</TabPanels>
5594
</TabGroup>

0 commit comments

Comments
 (0)