Skip to content

Commit 59bbc3b

Browse files
committed
feat: Connect vs Direct Sign In Buttons
These will only show up for useres with update permissions on a given cluster or org. We’ll implement the actual backing functionality next. https://harperdb.atlassian.net/browse/STUDIO-583
1 parent 03f04a5 commit 59bbc3b

File tree

3 files changed

+47
-17
lines changed

3 files changed

+47
-17
lines changed

src/features/cluster/InstanceLogInCell.tsx

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { useInstanceClient } from '@/config/useInstanceClient';
44
import { authStore } from '@/features/auth/store/authStore';
55
import { onInstanceLogoutSubmit } from '@/features/instance/operations/mutations/onInstanceLogoutSubmit';
66
import { useInstanceAuth } from '@/hooks/useAuth';
7+
import { useOrganizationClusterInstancePermissions } from '@/hooks/usePermissions';
78
import { Instance } from '@/lib/api.patch';
89
import { getOperationsUrlForInstance } from '@/lib/urls/getOperationsUrlForInstance';
910
import { Link } from '@tanstack/react-router';
@@ -14,6 +15,8 @@ export function InstanceLogInCell({ instance }: { readonly instance: Instance })
1415
const { user: instanceUser, isLoading: instanceAuthIsLoading } = useInstanceAuth(instance.id);
1516
const operationsUrl = useMemo(() => getOperationsUrlForInstance(instance), [instance]);
1617
const instanceClient = useInstanceClient(operationsUrl);
18+
const { update } = useOrganizationClusterInstancePermissions();
19+
1720
const onSignOutClick = useCallback(async () => {
1821
await onInstanceLogoutSubmit({ instanceClient, entityId: instance.id });
1922
authStore.setUserForEntity(instance, null);
@@ -22,24 +25,36 @@ export function InstanceLogInCell({ instance }: { readonly instance: Instance })
2225
if (instanceAuthIsLoading || !['CLONE_READY', 'RUNNING', 'UPDATED'].includes(instance.status)) {
2326
return <LoaderCircleIcon className="animate-spin" color="gray" />;
2427
}
28+
2529
if (!instanceUser) {
26-
return <Link
27-
to={`../instance/${instance.id}/sign-in`}
28-
className="text-sm"
29-
aria-label={`Sign in to ${instance.name} instance`}
30-
title={`Sign in to ${instance.name} instance`}
31-
>
32-
<Button variant="positiveOutline">Sign In</Button>
33-
</Link>;
30+
return <span className="flex gap-4">
31+
{update && <Link
32+
to={`../instance/${instance.id}${defaultInstanceRoute}`}
33+
className="text-sm"
34+
aria-label={`Connect to ${instance.name} instance`}
35+
title={`Connect to ${instance.name} instance`}
36+
>
37+
<Button variant="positiveOutline">Fabric Connect</Button>
38+
</Link>}
39+
<Link
40+
to={`../instance/${instance.id}/sign-in`}
41+
className="text-sm"
42+
aria-label={`Sign in to ${instance.name} instance`}
43+
title={`Sign in to ${instance.name} instance`}
44+
>
45+
<Button variant={update ? 'defaultOutline' : 'positiveOutline'}>Direct Sign In</Button>
46+
</Link>
47+
</span>;
3448
}
49+
3550
return <span className="flex gap-4">
3651
<Link
3752
to={`../instance/${instance.id}${defaultInstanceRoute}`}
3853
className="text-sm"
3954
aria-label={`Go to ${instance.name} instance`}
4055
title={`Go to ${instance.name} instance`}
4156
>
42-
<Button variant="positiveOutline">View</Button>
57+
<Button variant="positiveOutline">Direct Connect</Button>
4358
</Link>
4459
<Button
4560
variant="destructiveOutline"
@@ -48,7 +63,7 @@ export function InstanceLogInCell({ instance }: { readonly instance: Instance })
4863
title={`Sign out from ${instance.name} instance`}
4964
onClick={onSignOutClick}
5065
>
51-
Sign Out
66+
Direct Sign Out
5267
</Button>
5368
</span>;
5469
}

src/features/clusters/components/ClusterCard.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,11 @@ export function ClusterCard({ cluster }: { cluster: Cluster; }) {
125125
);
126126

127127
const menuItems = [
128+
isActive && update && !auth.isLoading && !auth.user && (
129+
<Link to={`${cluster.id}/sign-in`} disabled={signingOut}>
130+
<DropdownMenuItem>Direct Sign In</DropdownMenuItem>
131+
</Link>
132+
),
128133
isActive && update && (
129134
<Link to={`${cluster.id}/edit`} disabled={signingOut}>
130135
<DropdownMenuItem>Edit</DropdownMenuItem>
@@ -137,7 +142,7 @@ export function ClusterCard({ cluster }: { cluster: Cluster; }) {
137142
),
138143
isActive && view && cluster.fqdn && (
139144
<DropdownMenuItem onClick={onCopyFQDNClick} disabled={signingOut}>
140-
Copy host name
145+
Copy Host Name
141146
</DropdownMenuItem>
142147
),
143148
isActive && view && cluster.fqdn && (
@@ -147,7 +152,7 @@ export function ClusterCard({ cluster }: { cluster: Cluster; }) {
147152
),
148153
isActive && view && !!operationsUrl && !auth.isLoading && auth.user && (
149154
<DropdownMenuItem onClick={onSignOutClick} disabled={signingOut}>
150-
Sign Out
155+
Direct Sign Out
151156
</DropdownMenuItem>
152157
),
153158
clusterHasFailed && create && (

src/features/clusters/components/ClusterCardAction.tsx

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ import { defaultInstanceRoute } from '@/config/constants';
33
import { useInstanceAuth } from '@/hooks/useAuth';
44
import { useOrganizationClusterPermissions } from '@/hooks/usePermissions';
55
import { Cluster } from '@/lib/api.patch';
6+
import { clusterIsSelfManaged } from '@/lib/api/clusterIsSelfManaged';
67
import { Link } from '@tanstack/react-router';
78
import { ArrowRight } from 'lucide-react';
8-
import { useMemo } from 'react';
99

1010
export function ClusterCardAction({ cluster }: { cluster: Cluster }) {
1111
const auth = useInstanceAuth(cluster.id);
1212
const { view, update } = useOrganizationClusterPermissions(cluster.organizationId, cluster.id);
13-
const isPendingResetPassword = useMemo(() => cluster.resetPassword, [cluster]);
13+
1414
if (!view) {
1515
return undefined;
1616
}
@@ -23,7 +23,7 @@ export function ClusterCardAction({ cluster }: { cluster: Cluster }) {
2323
</Link>;
2424
}
2525

26-
if (isPendingResetPassword) {
26+
if (cluster.resetPassword) {
2727
if (update) {
2828
return <Link to={`/${cluster.organizationId}/${cluster.id}/finish-setup`} className="text-sm text-nowrap" aria-label={`Set Password on ${cluster.name}`} title={`Set Password on ${cluster.name}`}>
2929
<Button variant="positive" className="py-2 hover:border-b-2 animate-glow-pulse">
@@ -39,16 +39,26 @@ export function ClusterCardAction({ cluster }: { cluster: Cluster }) {
3939
if (auth.isLoading) {
4040
return undefined;
4141
}
42+
4243
if (auth.user) {
4344
return <Link to={`/${cluster.organizationId}/${cluster.id}${defaultInstanceRoute}`} className="text-sm text-nowrap" aria-label={`View ${cluster.name}`} title={`View ${cluster.name}`}>
4445
<span className="py-2 hover:border-b-2">
45-
View <ArrowRight className="inline-block" />
46+
Direct Connect <ArrowRight className="inline-block" />
47+
</span>
48+
</Link>;
49+
}
50+
51+
if (update && !clusterIsSelfManaged(cluster)) {
52+
return <Link to={`/${cluster.organizationId}/${cluster.id}${defaultInstanceRoute}`} className="text-sm text-nowrap" aria-label={`Connect to ${cluster.name}`} title={`Connect to ${cluster.name}`}>
53+
<span className="py-2 hover:border-b-2">
54+
Fabric Connect <ArrowRight className="inline-block" />
4655
</span>
4756
</Link>;
4857
}
58+
4959
return <Link to={`/${cluster.organizationId}/${cluster.id}/sign-in`} className="text-sm text-nowrap" aria-label={`Sign In to ${cluster.name}`} title={`Sign In to ${cluster.name}`}>
5060
<span className="py-2 hover:border-b-2">
51-
Sign In <ArrowRight className="inline-block" />
61+
Direct Sign In <ArrowRight className="inline-block" />
5262
</span>
5363
</Link>;
5464
}

0 commit comments

Comments
 (0)