Skip to content

Commit 4348997

Browse files
authored
Merge pull request dubinc#2419 from dubinc/domains-tabs
Domains tabs
2 parents 04de9c1 + 76d1ca9 commit 4348997

9 files changed

Lines changed: 124 additions & 51 deletions

File tree

apps/web/app/app.dub.co/(dashboard)/[slug]/settings/domains/default-domains.tsx renamed to apps/web/app/app.dub.co/(dashboard)/[slug]/settings/domains/default/page-client.tsx

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,28 +43,26 @@ function DubDomainsIcon(domain: string) {
4343

4444
export function DefaultDomains() {
4545
const { id, plan, role, flags } = useWorkspace();
46+
const [submitting, setSubmitting] = useState(false);
47+
const [defaultDomains, setDefaultDomains] = useState<string[]>([]);
48+
const { defaultDomains: initialDefaultDomains, mutate } = useDefaultDomains();
49+
4650
const permissionsError = clientAccessCheck({
4751
action: "domains.write",
4852
role,
4953
customPermissionDescription: "manage default domains",
5054
}).error;
5155

52-
const { defaultDomains: initialDefaultDomains, mutate } = useDefaultDomains();
53-
const [defaultDomains, setDefaultDomains] = useState<string[]>([]);
5456
useEffect(() => {
5557
if (initialDefaultDomains) {
5658
setDefaultDomains(initialDefaultDomains);
5759
}
5860
}, [initialDefaultDomains]);
59-
const [submitting, setSubmitting] = useState(false);
6061

6162
return (
62-
<div className="my-10 grid gap-5 border-t border-neutral-200 py-10">
63-
<div>
64-
<h2 className="text-xl font-semibold tracking-tight text-black">
65-
Default Domains
66-
</h2>
67-
<p className="mt-3 text-sm text-neutral-500">
63+
<div className="grid gap-5">
64+
<div className="rounded-lg bg-neutral-100 p-4">
65+
<p className="text-sm text-neutral-500">
6866
Leverage default branded domains from Dub for specific links.{" "}
6967
<Link
7068
href="https://dub.co/help/article/default-dub-domains"
@@ -75,6 +73,7 @@ export function DefaultDomains() {
7573
</Link>
7674
</p>
7775
</div>
76+
7877
<div className="mt-2 grid grid-cols-1 gap-3">
7978
{DUB_DOMAINS.filter((domain) => {
8079
if (domain.slug === "dub.link") {
@@ -135,7 +134,7 @@ export function DefaultDomains() {
135134
if (error.message.includes("Upgrade to Pro")) {
136135
toast.custom(() => (
137136
<UpgradeRequiredToast
138-
planToUpgradeTo="Pro"
137+
title="You've discovered a Pro feature!"
139138
message={error.message}
140139
/>
141140
));
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { DefaultDomains } from "./page-client";
2+
3+
export default function DefaultDomainsPage() {
4+
return <DefaultDomains />;
5+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
"use client";
2+
3+
import { AnimatedEmptyState } from "@/ui/shared/animated-empty-state";
4+
import { ArrowTurnRight2 } from "@dub/ui";
5+
import { Mail } from "lucide-react";
6+
7+
export function EmailDomains() {
8+
return (
9+
<>
10+
<div className="grid gap-5">
11+
<div className="animate-fade-in">
12+
<AnimatedEmptyState
13+
title="No email domains found"
14+
description="Add email domains for branded partner communications"
15+
cardContent={
16+
<>
17+
<Mail className="size-4 text-neutral-700" />
18+
<div className="h-2.5 w-24 min-w-0 rounded-sm bg-neutral-200" />
19+
<div className="xs:flex hidden grow items-center justify-end gap-1.5 text-neutral-500">
20+
<ArrowTurnRight2 className="size-3.5" />
21+
</div>
22+
</>
23+
}
24+
pillContent="Coming soon"
25+
/>
26+
</div>
27+
</div>
28+
</>
29+
);
30+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { EmailDomains } from "./page-client";
2+
3+
export default function EmailDomainsPage() {
4+
return <EmailDomains />;
5+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
"use client";
2+
3+
import useWorkspace from "@/lib/swr/use-workspace";
4+
import { InfoTooltip, TabSelect, TooltipContent } from "@dub/ui";
5+
import { useSelectedLayoutSegment } from "next/navigation";
6+
7+
export function DomainsHeader() {
8+
const { slug } = useWorkspace();
9+
const selectedLayoutSegment = useSelectedLayoutSegment();
10+
const page = selectedLayoutSegment === null ? "" : selectedLayoutSegment;
11+
12+
return (
13+
<div className="border-b border-neutral-200">
14+
<div className="flex items-center gap-x-2">
15+
<h1 className="text-2xl font-semibold tracking-tight text-black">
16+
Domains
17+
</h1>
18+
<InfoTooltip
19+
content={
20+
<TooltipContent
21+
title="Learn more about how to add, configure, and verify custom domains on Dub."
22+
href="https://dub.co/help/article/how-to-add-custom-domain"
23+
target="_blank"
24+
cta="Learn more"
25+
/>
26+
}
27+
/>
28+
</div>
29+
<TabSelect
30+
variant="accent"
31+
options={[
32+
{
33+
id: "",
34+
label: "Custom domains",
35+
href: `/${slug}/settings/domains`,
36+
},
37+
{
38+
id: "default",
39+
label: "Default domains",
40+
href: `/${slug}/settings/domains/default`,
41+
},
42+
]}
43+
selected={page}
44+
/>
45+
</div>
46+
);
47+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { ReactNode } from "react";
2+
import { DomainsHeader } from "./header";
3+
4+
export default function LibraryLayout({ children }: { children: ReactNode }) {
5+
return (
6+
<div className="grid gap-4">
7+
<DomainsHeader />
8+
{children}
9+
</div>
10+
);
11+
}

apps/web/app/app.dub.co/(dashboard)/[slug]/settings/domains/page-client.tsx

Lines changed: 13 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import {
1919
Button,
2020
CursorRays,
2121
Globe,
22-
InfoTooltip,
2322
LinkBroken,
2423
PaginationControls,
2524
Popover,
@@ -31,9 +30,8 @@ import {
3130
import { capitalize, pluralize } from "@dub/utils";
3231
import { ChevronDown, Crown } from "lucide-react";
3332
import { useEffect, useState } from "react";
34-
import { DefaultDomains } from "./default-domains";
3533

36-
export default function WorkspaceDomainsClient() {
34+
export function CustomDomains() {
3735
const {
3836
id: workspaceId,
3937
plan,
@@ -103,34 +101,19 @@ export default function WorkspaceDomainsClient() {
103101
<RegisterDomainSuccessModal />
104102
<div className="grid gap-5">
105103
<div className="flex flex-wrap justify-between gap-6">
106-
<div className="flex items-center gap-x-2">
107-
<h1 className="text-2xl font-semibold tracking-tight text-black">
108-
Domains
109-
</h1>
110-
<InfoTooltip
111-
content={
112-
<TooltipContent
113-
title="Learn more about how to add, configure, and verify custom domains on Dub."
114-
href="https://dub.co/help/article/how-to-add-custom-domain"
115-
target="_blank"
116-
cta="Learn more"
117-
/>
118-
}
104+
<div className="w-full sm:w-auto">
105+
<SearchBoxPersisted
106+
loading={loading}
107+
onChangeDebounced={(t) => {
108+
if (t) {
109+
queryParams({ set: { search: t }, del: "page" });
110+
} else {
111+
queryParams({ del: "search" });
112+
}
113+
}}
119114
/>
120115
</div>
121116
<div className="flex w-full flex-wrap items-center gap-3 sm:w-auto">
122-
<div className="w-full sm:w-auto">
123-
<SearchBoxPersisted
124-
loading={loading}
125-
onChangeDebounced={(t) => {
126-
if (t) {
127-
queryParams({ set: { search: t }, del: "page" });
128-
} else {
129-
queryParams({ del: "search" });
130-
}
131-
}}
132-
/>
133-
</div>
134117
<ToggleGroup
135118
options={[
136119
{ value: "active", label: "Active" },
@@ -190,7 +173,7 @@ export default function WorkspaceDomainsClient() {
190173
className="h-9 w-fit rounded-lg"
191174
text={
192175
<div className="flex items-center gap-2">
193-
Add domain{" "}
176+
Add custom domain{" "}
194177
<ChevronDown className="size-4 transition-transform duration-75 group-data-[state=open]:rotate-180" />
195178
</div>
196179
}
@@ -234,7 +217,7 @@ export default function WorkspaceDomainsClient() {
234217
</div>
235218
) : (
236219
<AnimatedEmptyState
237-
title="No domains found"
220+
title="No custom domains found"
238221
description="Use custom domains for better brand recognition and click-through rates"
239222
cardContent={
240223
<>
@@ -268,8 +251,6 @@ export default function WorkspaceDomainsClient() {
268251
/>
269252
</div>
270253
</div>
271-
272-
<DefaultDomains />
273254
</>
274255
);
275256
}
Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
1-
import { Suspense } from "react";
2-
import WorkspaceDomainsClient from "./page-client";
1+
import { CustomDomains } from "./page-client";
32

4-
export default function WorkspaceDomains() {
5-
return (
6-
<Suspense>
7-
<WorkspaceDomainsClient />
8-
</Suspense>
9-
);
3+
export default function CustomDomainsPage() {
4+
return <CustomDomains />;
105
}

apps/web/ui/layout/sidebar/app-sidebar-nav.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ const NAV_AREAS: SidebarNavAreas<{
145145
{
146146
name: "Library",
147147
icon: Books2,
148-
href: `/${slug}/settings/library`,
148+
href: `/${slug}/settings/library/folders`,
149149
},
150150
{
151151
name: "People",

0 commit comments

Comments
 (0)