Newer
Older
import { Box } from '@rocket.chat/fuselage';
import type { GenericMenuItemProps } from '@rocket.chat/ui-client';
import { useEndpoint, useSetting } from '@rocket.chat/ui-contexts';
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { useEffect } from 'react';
import { useTranslation } from 'react-i18next';
import { useCustomStatusModalHandler } from './useCustomStatusModalHandler';
import { callbacks } from '../../../../../lib/callbacks';
import MarkdownText from '../../../../components/MarkdownText';
import { UserStatus } from '../../../../components/UserStatus';
Henrique Guimarães Ribeiro
committed
import { useFireGlobalEvent } from '../../../../hooks/useFireGlobalEvent';
import { userStatuses } from '../../../../lib/userStatuses';
import type { UserStatusDescriptor } from '../../../../lib/userStatuses';
import { useStatusDisabledModal } from '../../../../views/admin/customUserStatus/hooks/useStatusDisabledModal';
export const useStatusItems = (): GenericMenuItemProps[] => {
// We should lift this up to somewhere else if we want to use it in other places
userStatuses.invisibleAllowed = useSetting('Accounts_AllowInvisibleStatusOption', true);
const queryClient = useQueryClient();
useEffect(
() =>
userStatuses.watch(() => {
queryClient.setQueryData(['user-statuses'], Array.from(userStatuses));
}),
[queryClient],
);
const { t } = useTranslation();
Henrique Guimarães Ribeiro
committed
const fireGlobalStatusEvent = useFireGlobalEvent('user-status-manually-set');
const setStatus = useEndpoint('POST', '/v1/users.setStatus');
const setStatusMutation = useMutation({
mutationFn: async (status: UserStatusDescriptor) => {
void setStatus({ status: status.statusType, message: userStatuses.isValidType(status.id) ? '' : status.name });
void callbacks.run('userStatusManuallySet', status);
Henrique Guimarães Ribeiro
committed
await fireGlobalStatusEvent.mutateAsync(status);
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
},
});
const presenceDisabled = useSetting('Presence_broadcast_disabled', false);
const { data: statuses } = useQuery({
queryKey: ['user-statuses'],
queryFn: async () => {
await userStatuses.sync();
return Array.from(userStatuses);
},
staleTime: Infinity,
select: (statuses) =>
statuses.map((status): GenericMenuItemProps => {
const content = status.localizeName ? t(status.name) : status.name;
return {
id: status.id,
status: <UserStatus status={status.statusType} />,
content: <MarkdownText content={content} parseEmoji={true} variant='inline' />,
disabled: presenceDisabled,
onClick: () => setStatusMutation.mutate(status),
};
}),
});
const handleStatusDisabledModal = useStatusDisabledModal();
const handleCustomStatus = useCustomStatusModalHandler();
return [
...(presenceDisabled
? [
{
id: 'presence-disabled',
content: (
<Box fontScale='p2'>
<Box mbe={4} wordBreak='break-word' style={{ whiteSpace: 'normal' }}>
{t('User_status_disabled')}
</Box>
<Box is='a' color='info' onClick={handleStatusDisabledModal}>
{t('Learn_more')}
</Box>
</Box>
),
},
: []),
...(statuses ?? []),
{ id: 'custom-status', icon: 'emoji', content: t('Custom_Status'), onClick: handleCustomStatus, disabled: presenceDisabled },
];
};