mirror of
https://github.com/Qortal/Qortal-Hub.git
synced 2025-05-15 22:26:58 +00:00
123 lines
4.0 KiB
TypeScript
123 lines
4.0 KiB
TypeScript
import { LoadingButton } from '@mui/lab';
|
|
import { Box, Input, MenuItem, Select, SelectChangeEvent } from '@mui/material';
|
|
import { useState } from 'react';
|
|
import { Spacer } from '../../common/Spacer';
|
|
import { Label } from './AddGroup';
|
|
import { getFee } from '../../background';
|
|
import { useTranslation } from 'react-i18next';
|
|
|
|
export const InviteMember = ({ groupId, setInfoSnack, setOpenSnack, show }) => {
|
|
const [value, setValue] = useState('');
|
|
const [expiryTime, setExpiryTime] = useState<string>('259200');
|
|
const [isLoadingInvite, setIsLoadingInvite] = useState(false);
|
|
const { t } = useTranslation(['core', 'group']);
|
|
|
|
const inviteMember = async () => {
|
|
try {
|
|
const fee = await getFee('GROUP_INVITE');
|
|
await show({
|
|
message: t('group:question.group_invite', {
|
|
postProcess: 'capitalize',
|
|
}),
|
|
publishFee: fee.fee + ' QORT',
|
|
});
|
|
setIsLoadingInvite(true);
|
|
if (!expiryTime || !value) return;
|
|
new Promise((res, rej) => {
|
|
window
|
|
.sendMessage('inviteToGroup', {
|
|
groupId,
|
|
qortalAddress: value,
|
|
inviteTime: +expiryTime,
|
|
})
|
|
.then((response) => {
|
|
if (!response?.error) {
|
|
setInfoSnack({
|
|
type: 'success',
|
|
message: t('group:message.success.group_invite', {
|
|
value: value,
|
|
postProcess: 'capitalize',
|
|
}),
|
|
});
|
|
setOpenSnack(true);
|
|
res(response);
|
|
|
|
setValue('');
|
|
return;
|
|
}
|
|
setInfoSnack({
|
|
type: 'error',
|
|
message: response?.error,
|
|
});
|
|
setOpenSnack(true);
|
|
rej(response.error);
|
|
})
|
|
.catch((error) => {
|
|
setInfoSnack({
|
|
type: 'error',
|
|
message: error?.message || 'An error occurred',
|
|
});
|
|
setOpenSnack(true);
|
|
rej(error);
|
|
});
|
|
});
|
|
} catch (error) {
|
|
console.log(error);
|
|
} finally {
|
|
setIsLoadingInvite(false);
|
|
}
|
|
};
|
|
|
|
const handleChange = (event: SelectChangeEvent) => {
|
|
setExpiryTime(event.target.value as string);
|
|
};
|
|
|
|
return (
|
|
<Box
|
|
sx={{
|
|
display: 'flex',
|
|
flexDirection: 'column',
|
|
}}
|
|
>
|
|
{t('group:action.invite_member', { postProcess: 'capitalize' })}
|
|
<Spacer height="20px" />
|
|
<Input
|
|
value={value}
|
|
placeholder="Name or address"
|
|
onChange={(e) => setValue(e.target.value)}
|
|
/>
|
|
<Spacer height="20px" />
|
|
<Label>
|
|
{t('group:invitation_expiry', { postProcess: 'capitalize' })}
|
|
</Label>
|
|
<Select
|
|
labelId="demo-simple-select-label"
|
|
id="demo-simple-select"
|
|
value={expiryTime}
|
|
label={t('group:invitation_expiry', { postProcess: 'capitalize' })}
|
|
onChange={handleChange}
|
|
>
|
|
<MenuItem value={10800}>{t('core:time.hour', { count: 3 })}</MenuItem>
|
|
<MenuItem value={21600}>{t('core:time.hour', { count: 6 })}</MenuItem>
|
|
<MenuItem value={43200}>{t('core:time.hour', { count: 12 })}</MenuItem>
|
|
<MenuItem value={86400}>{t('core:time.day', { count: 1 })}</MenuItem>
|
|
<MenuItem value={259200}>{t('core:time.day', { count: 3 })}</MenuItem>
|
|
<MenuItem value={432000}>{t('core:time.day', { count: 5 })}</MenuItem>
|
|
<MenuItem value={604800}>{t('core:time.day', { count: 7 })}</MenuItem>
|
|
<MenuItem value={864000}>{t('core:time.day', { count: 10 })}</MenuItem>
|
|
<MenuItem value={1296000}>{t('core:time.day', { count: 15 })}</MenuItem>
|
|
<MenuItem value={2592000}>{t('core:time.day', { count: 30 })}</MenuItem>
|
|
</Select>
|
|
<Spacer height="20px" />
|
|
<LoadingButton
|
|
variant="contained"
|
|
loadingPosition="start"
|
|
loading={isLoadingInvite}
|
|
onClick={inviteMember}
|
|
>
|
|
{t('core:action.invite', { postProcess: 'capitalize' })}
|
|
</LoadingButton>
|
|
</Box>
|
|
);
|
|
};
|