Skip to content

Commit 08c00c9

Browse files
committed
refactor: endpoint call with useQuery and handle result states
1 parent 6429534 commit 08c00c9

File tree

4 files changed

+104
-37
lines changed

4 files changed

+104
-37
lines changed

apps/meteor/client/views/room/contextualBar/RoomMembers/InviteUsers/InviteUsers.tsx

+2-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { Callout } from '@rocket.chat/fuselage';
21
import type { ReactElement } from 'react';
32
import { useTranslation } from 'react-i18next';
43

@@ -22,7 +21,6 @@ type InviteUsersProps = {
2221
onClickEdit: () => void;
2322
captionText: string;
2423
linkText: string;
25-
error?: Error;
2624
};
2725

2826
const InviteUsers = ({
@@ -35,7 +33,6 @@ const InviteUsers = ({
3533
daysAndMaxUses,
3634
captionText,
3735
linkText,
38-
error,
3936
}: InviteUsersProps): ReactElement => {
4037
const { t } = useTranslation();
4138

@@ -47,9 +44,8 @@ const InviteUsers = ({
4744
{onClose && <ContextualbarClose onClick={onClose} />}
4845
</ContextualbarHeader>
4946
<ContextualbarScrollableContent>
50-
{error && <Callout type='danger'>{error.toString()}</Callout>}
51-
{isEditing && !error && <EditInviteLink onClickNewLink={onClickNewLink} daysAndMaxUses={daysAndMaxUses} />}
52-
{!isEditing && !error && <InviteLink captionText={captionText} onClickEdit={onClickEdit} linkText={linkText} />}
47+
{isEditing && <EditInviteLink onClickNewLink={onClickNewLink} daysAndMaxUses={daysAndMaxUses} />}
48+
{!isEditing && <InviteLink captionText={captionText} onClickEdit={onClickEdit} linkText={linkText} />}
5349
</ContextualbarScrollableContent>
5450
</>
5551
);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { Callout } from '@rocket.chat/fuselage';
2+
import type { ReactElement } from 'react';
3+
import { useTranslation } from 'react-i18next';
4+
5+
import {
6+
ContextualbarHeader,
7+
ContextualbarTitle,
8+
ContextualbarClose,
9+
ContextualbarScrollableContent,
10+
} from '../../../../../components/Contextualbar';
11+
12+
type InviteUsersProps = {
13+
onClose: () => void;
14+
error: Error;
15+
};
16+
17+
const InviteUsersError = ({ onClose, error }: InviteUsersProps): ReactElement => {
18+
const { t } = useTranslation();
19+
20+
return (
21+
<>
22+
<ContextualbarHeader>
23+
<ContextualbarTitle>{t('Invite_Users')}</ContextualbarTitle>
24+
{onClose && <ContextualbarClose onClick={onClose} />}
25+
</ContextualbarHeader>
26+
<ContextualbarScrollableContent>{error && <Callout type='danger'>{error.toString()}</Callout>}</ContextualbarScrollableContent>
27+
</>
28+
);
29+
};
30+
31+
export default InviteUsersError;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { Skeleton } from '@rocket.chat/fuselage';
2+
import type { ReactElement } from 'react';
3+
import { useTranslation } from 'react-i18next';
4+
5+
import {
6+
ContextualbarHeader,
7+
ContextualbarTitle,
8+
ContextualbarClose,
9+
ContextualbarScrollableContent,
10+
} from '../../../../../components/Contextualbar';
11+
12+
type InviteUsersProps = {
13+
onClose: () => void;
14+
};
15+
16+
const InviteUsersLoading = ({ onClose }: InviteUsersProps): ReactElement => {
17+
const { t } = useTranslation();
18+
19+
return (
20+
<>
21+
<ContextualbarHeader>
22+
<ContextualbarTitle>{t('Invite_Users')}</ContextualbarTitle>
23+
{onClose && <ContextualbarClose onClick={onClose} />}
24+
</ContextualbarHeader>
25+
<ContextualbarScrollableContent>
26+
<Skeleton w='full' />
27+
</ContextualbarScrollableContent>
28+
</>
29+
);
30+
};
31+
32+
export default InviteUsersLoading;

apps/meteor/client/views/room/contextualBar/RoomMembers/InviteUsers/InviteUsersWithData.tsx

+39-31
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import type { IRoom } from '@rocket.chat/core-typings';
22
import { useEffectEvent } from '@rocket.chat/fuselage-hooks';
33
import { useEndpoint, useTranslation, useToastMessageDispatch } from '@rocket.chat/ui-contexts';
4+
import { useQuery } from '@tanstack/react-query';
45
import type { ReactElement } from 'react';
56
import { useState, useEffect } from 'react';
67

78
import InviteUsers from './InviteUsers';
9+
import InviteUsersError from './InviteUsersError';
10+
import InviteUsersLoading from './InviteUsersLoading';
811
import { useFormatDateAndTime } from '../../../../../hooks/useFormatDateAndTime';
912
import { useRoomToolbox } from '../../../contexts/RoomToolboxContext';
1013

@@ -19,18 +22,12 @@ const InviteUsersWithData = ({ rid, onClickBack }: InviteUsersWithDataProps): Re
1922
const [
2023
{
2124
isEditing,
22-
url,
23-
caption,
24-
error,
2525
daysAndMaxUses: { days, maxUses },
2626
},
2727
setInviteState,
2828
] = useState({
2929
isEditing: false,
3030
daysAndMaxUses: { days: '1', maxUses: '0' },
31-
url: '',
32-
caption: '',
33-
error: undefined as Error | undefined,
3431
});
3532

3633
const { closeTab } = useRoomToolbox();
@@ -41,7 +38,7 @@ const InviteUsersWithData = ({ rid, onClickBack }: InviteUsersWithDataProps): Re
4138
const handleBackToLink = useEffectEvent(() => setInviteState((prevState) => ({ ...prevState, isEditing: false })));
4239

4340
const linkExpirationText = useEffectEvent(
44-
(data: {
41+
(data?: {
4542
days: number;
4643
maxUses: number;
4744
rid: string;
@@ -79,36 +76,47 @@ const InviteUsersWithData = ({ rid, onClickBack }: InviteUsersWithDataProps): Re
7976
},
8077
);
8178

79+
const { data, isSuccess, error, isError, isLoading } = useQuery({
80+
queryKey: ['findOrCreateInvite', days, maxUses],
81+
queryFn: async () => findOrCreateInvite({ rid, days: Number(days), maxUses: Number(maxUses) }),
82+
});
83+
8284
useEffect(() => {
83-
(async (): Promise<void> => {
84-
try {
85-
const data = await findOrCreateInvite({ rid, days: Number(days), maxUses: Number(maxUses) });
86-
setInviteState((prevState) => ({ ...prevState, url: data?.url, caption: linkExpirationText(data) }));
87-
dispatchToastMessage({ type: 'success', message: t('Invite_link_generated') });
88-
} catch (error) {
89-
setInviteState((prevState) => ({ ...prevState, error: error as Error }));
90-
}
91-
})();
92-
}, [dispatchToastMessage, t, findOrCreateInvite, linkExpirationText, rid, days, maxUses]);
85+
if (isSuccess) {
86+
setInviteState((prevState) => ({ ...prevState, url: data?.url, caption: linkExpirationText(data) }));
87+
dispatchToastMessage({ type: 'success', message: t('Invite_link_generated') });
88+
}
89+
}, [dispatchToastMessage, linkExpirationText, data, isSuccess, t]);
9390

9491
const handleGenerateLink = useEffectEvent((daysAndMaxUses: { days: string; maxUses: string }) => {
9592
setInviteState((prevState) => ({ ...prevState, daysAndMaxUses, isEditing: false }));
9693
});
9794

98-
return (
99-
<InviteUsers
100-
isEditing={isEditing}
101-
error={error}
102-
linkText={url}
103-
captionText={caption}
104-
daysAndMaxUses={{ days, maxUses }}
105-
onClose={closeTab}
106-
onClickBackMembers={onClickBack}
107-
onClickBackLink={handleBackToLink}
108-
onClickEdit={handleEdit}
109-
onClickNewLink={handleGenerateLink}
110-
/>
111-
);
95+
if (isError) {
96+
return <InviteUsersError error={error} onClose={closeTab} />;
97+
}
98+
99+
if (isLoading) {
100+
return <InviteUsersLoading onClose={closeTab} />;
101+
}
102+
103+
if (isSuccess && data) {
104+
return (
105+
<InviteUsers
106+
isEditing={isEditing}
107+
linkText={data?.url}
108+
captionText={linkExpirationText(data)}
109+
daysAndMaxUses={{ days, maxUses }}
110+
onClose={closeTab}
111+
onClickBackMembers={onClickBack}
112+
onClickBackLink={handleBackToLink}
113+
onClickEdit={handleEdit}
114+
onClickNewLink={handleGenerateLink}
115+
/>
116+
);
117+
}
118+
119+
return <InviteUsersError error={new Error(t('Something_Went_Wrong'))} onClose={closeTab} />;
112120
};
113121

114122
export default InviteUsersWithData;

0 commit comments

Comments
 (0)