Skip to content

Commit 5da6bfe

Browse files
committed
chore: Extract ClusterInstanceSignIn bulk of logic out too
1 parent dfe8a5f commit 5da6bfe

File tree

4 files changed

+93
-61
lines changed

4 files changed

+93
-61
lines changed

src/features/auth/ClusterInstanceSignIn.tsx

Lines changed: 15 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -8,38 +8,30 @@ import { FormLabel } from '@/components/ui/form/FormLabel';
88
import { FormMessage } from '@/components/ui/form/FormMessage';
99
import { Input } from '@/components/ui/input';
1010
import { activeClusterStatuses } from '@/config/clusterStatuses';
11-
import { defaultInstanceRoute, defaultInstanceRouteUpOne, isLocalStudio } from '@/config/constants';
11+
import { isLocalStudio } from '@/config/constants';
1212
import { calculateCreateClusterDeepLink } from '@/config/deepLinks';
1313
import { useInstanceClientIdParams } from '@/config/useInstanceClient';
14+
import { useClusterInstanceSignIn } from '@/features/auth/hooks/useClusterInstanceSignIn';
1415
import { getClusterInfoQueryOptions } from '@/features/cluster/queries/getClusterInfoQuery';
15-
import { useInstanceLoginMutation } from '@/features/instance/operations/mutations/useInstanceLoginMutation';
1616
import { getInstanceHealthQueryOptions } from '@/features/instance/operations/queries/getInstanceHealth';
17-
import { getInstanceUserInfo } from '@/features/instance/operations/queries/getInstanceUserInfo';
1817
import { UsernameSignInSchema } from '@/features/instance/operations/schemas/signInSchema';
18+
import { SchemaHdbInstance } from '@/lib/api.gen';
1919
import { CrossLocalhostIssueType, detectCrossLocalhostUrls } from '@/lib/urls/detectCrossLocalhostUrls';
2020
import { getOperationsUrlForCluster } from '@/lib/urls/getOperationsUrlForCluster';
2121
import { getOperationsUrlForInstance } from '@/lib/urls/getOperationsUrlForInstance';
2222
import { zodResolver } from '@hookform/resolvers/zod';
23-
import { useQuery, useQueryClient } from '@tanstack/react-query';
24-
import { Link, Navigate, useNavigate, useParams, useRouter, useSearch } from '@tanstack/react-router';
25-
import { useCallback, useEffect, useMemo } from 'react';
23+
import { useQuery } from '@tanstack/react-query';
24+
import { Link, Navigate, useParams } from '@tanstack/react-router';
25+
import { useMemo } from 'react';
2626
import { useForm } from 'react-hook-form';
27-
import { toast } from 'sonner';
28-
import { z } from 'zod';
29-
import { currentUserQueryKey } from './queries/getCurrentUser';
30-
import { authStore, OverallAppSignIn } from './store/authStore';
3127

3228
export function ClusterInstanceSignIn() {
33-
const navigate = useNavigate();
34-
const router = useRouter();
35-
const queryClient = useQueryClient();
36-
const { redirect } = useSearch({ strict: false });
3729
const { clusterId, instanceId }: { instanceId?: string; clusterId?: string; } = useParams({ strict: false });
3830
const { data: cluster } = useQuery(
3931
getClusterInfoQueryOptions(clusterId, true),
4032
);
41-
const instance = useMemo(
42-
() => instanceId && cluster && cluster?.instances?.find(i => i.id === instanceId),
33+
const instance: SchemaHdbInstance | undefined = useMemo(
34+
() => instanceId && cluster && cluster?.instances?.find(i => i.id === instanceId) || undefined,
4335
[cluster, instanceId]);
4436
const isActive = useMemo(() => cluster?.status && activeClusterStatuses.includes(cluster.status), [cluster?.status]);
4537

@@ -73,43 +65,13 @@ export function ClusterInstanceSignIn() {
7365
password: '',
7466
},
7567
});
76-
const { setFocus, control, handleSubmit } = methods;
68+
const { control, handleSubmit } = methods;
7769

78-
useEffect(() => {
79-
setFocus('username');
80-
}, [setFocus]);
81-
82-
const { mutate: submitInstanceLogin, isPending } = useInstanceLoginMutation();
83-
84-
const submitForm = useCallback(async (formData: z.infer<typeof UsernameSignInSchema>) => {
85-
submitInstanceLogin(
86-
{
87-
...formData,
88-
...instanceParams,
89-
},
90-
{
91-
onSuccess: async (response) => {
92-
toast.success(response.message);
93-
const user = await getInstanceUserInfo(instanceParams);
94-
// If we sign in to the cluster, we've authenticated against all of its instances too.
95-
if (cluster?.instances?.length && !instance) {
96-
for (const clusterInstance of cluster.instances) {
97-
authStore.setUserForEntity(clusterInstance, user);
98-
}
99-
}
100-
authStore.setUserForEntity(instance || cluster || OverallAppSignIn, user);
101-
void queryClient.invalidateQueries({ queryKey: currentUserQueryKey, refetchType: 'none' });
102-
void router.invalidate();
103-
await navigate({
104-
to: redirect?.startsWith('/')
105-
? redirect
106-
: isLocalStudio
107-
? defaultInstanceRoute
108-
: defaultInstanceRouteUpOne,
109-
});
110-
},
111-
});
112-
}, [cluster, instance, instanceParams, navigate, queryClient, redirect, router, submitInstanceLogin]);
70+
const { submitForm, isPending } = useClusterInstanceSignIn({
71+
cluster,
72+
instance,
73+
instanceParams,
74+
});
11375

11476
if (!instanceId && cluster && !cluster?.fqdn) {
11577
return <Navigate to="../instances" replace={true} />;
@@ -143,6 +105,7 @@ export function ClusterInstanceSignIn() {
143105
<FormControl>
144106
<Input
145107
autoComplete="username"
108+
autoFocus={true}
146109
type="text"
147110
{...field}
148111
/>

src/features/auth/hooks/useCloudSignIn.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@ export function useCloudSignIn() {
1616
const navigate = useNavigate();
1717
const queryClient = useQueryClient();
1818
const router = useRouter();
19-
const { mutate: submitLoginData, isPending } = useLoginMutation();
2019
const { redirect } = useSearch({ strict: false });
2120

21+
const { mutate: submitLoginData, isPending } = useLoginMutation();
22+
2223
const submitForm = useCallback((formData: z.infer<typeof EmailSignInSchema>) => {
2324
submitLoginData(formData, {
2425
onSuccess: async (data) => {
@@ -40,6 +41,7 @@ export function useCloudSignIn() {
4041
},
4142
});
4243
}, [navigate, queryClient, redirect, router, submitLoginData]);
44+
4345
return {
4446
isPending,
4547
submitForm,
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import { defaultInstanceRoute, defaultInstanceRouteUpOne, isLocalStudio } from '@/config/constants';
2+
import { InstanceClientIdConfig, InstanceTypeConfig } from '@/config/instanceClientConfig';
3+
import { currentUserQueryKey } from '@/features/auth/queries/getCurrentUser';
4+
import { authStore, OverallAppSignIn } from '@/features/auth/store/authStore';
5+
import { useInstanceLoginMutation } from '@/features/instance/operations/mutations/useInstanceLoginMutation';
6+
import { getInstanceUserInfo } from '@/features/instance/operations/queries/getInstanceUserInfo';
7+
import { UsernameSignInSchema } from '@/features/instance/operations/schemas/signInSchema';
8+
import { SchemaHdbInstance } from '@/lib/api.gen';
9+
import { Cluster } from '@/lib/api.patch';
10+
import { useQueryClient } from '@tanstack/react-query';
11+
import { useNavigate, useRouter, useSearch } from '@tanstack/react-router';
12+
import { useCallback } from 'react';
13+
import { toast } from 'sonner';
14+
import { z } from 'zod';
15+
16+
export function useClusterInstanceSignIn({
17+
cluster,
18+
instance,
19+
instanceParams,
20+
}: {
21+
cluster: Cluster | undefined,
22+
instance: SchemaHdbInstance | undefined,
23+
instanceParams: InstanceClientIdConfig & InstanceTypeConfig
24+
}) {
25+
const navigate = useNavigate();
26+
const queryClient = useQueryClient();
27+
const router = useRouter();
28+
const { redirect } = useSearch({ strict: false });
29+
30+
const { mutate: submitInstanceLogin, isPending } = useInstanceLoginMutation();
31+
32+
const submitForm = useCallback(async (formData: z.infer<typeof UsernameSignInSchema>) => {
33+
submitInstanceLogin(
34+
{
35+
...formData,
36+
...instanceParams,
37+
},
38+
{
39+
onSuccess: async (response) => {
40+
toast.success(response.message);
41+
const user = await getInstanceUserInfo(instanceParams);
42+
// If we sign in to the cluster, we've authenticated against all of its instances too.
43+
if (cluster?.instances?.length && !instance) {
44+
for (const clusterInstance of cluster.instances) {
45+
authStore.setUserForEntity(clusterInstance, user);
46+
}
47+
}
48+
const entity = isLocalStudio ? OverallAppSignIn : instance || cluster;
49+
if (!entity) {
50+
throw new Error('Sign in failed due to missing cluster or instance.');
51+
}
52+
authStore.setUserForEntity(entity, user);
53+
void queryClient.invalidateQueries({ queryKey: currentUserQueryKey, refetchType: 'none' });
54+
void router.invalidate();
55+
await navigate({
56+
to: redirect?.startsWith('/')
57+
? redirect
58+
: isLocalStudio
59+
? defaultInstanceRoute
60+
: defaultInstanceRouteUpOne,
61+
});
62+
},
63+
});
64+
}, [cluster, instance, instanceParams, navigate, queryClient, redirect, router, submitInstanceLogin]);
65+
66+
return {
67+
isPending,
68+
submitForm,
69+
};
70+
}

src/features/instance/operations/mutations/useInstanceResetPasswordMutation.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
import { defaultClusterUsername } from '@/config/constants';
22
import { InstanceClientConfig } from '@/config/instanceClientConfig';
33
import { resetPasswordUpdater } from '@/features/cluster/queries/resetPasswordUpdater';
4-
import { onAddUserSubmit } from '@/features/instance/operations/mutations/addUser';
5-
import { onAlterUser } from '@/features/instance/operations/mutations/alterUser';
6-
import { onDeleteUser } from '@/features/instance/operations/mutations/deleteUser';
7-
import { onInstanceLogoutSubmit } from '@/features/instance/operations/mutations/onInstanceLogoutSubmit';
8-
import {
9-
LoginInfoResponse,
10-
onInstanceLoginSubmit,
11-
} from '@/features/instance/operations/mutations/useInstanceLoginMutation';
124
import { useMutation } from '@tanstack/react-query';
5+
import { onAddUserSubmit } from './addUser';
6+
import { onAlterUser } from './alterUser';
7+
import { onDeleteUser } from './deleteUser';
8+
import { onInstanceLogoutSubmit } from './onInstanceLogoutSubmit';
9+
import { LoginInfoResponse, onInstanceLoginSubmit } from './useInstanceLoginMutation';
1310

1411
interface InstanceResetPasswordParams extends InstanceClientConfig {
1512
clusterId: string;

0 commit comments

Comments
 (0)