Create zap split manager ui

This commit is contained in:
danidfra 2024-09-18 18:57:50 -03:00
parent 4290af398b
commit d4a8d96246
1 changed files with 115 additions and 0 deletions

View File

@ -0,0 +1,115 @@
import React, { useState } from 'react';
import { FormattedMessage, defineMessages, useIntl } from 'react-intl';
import Account from 'soapbox/components/account';
import List, { ListItem } from 'soapbox/components/list';
import { Button, Column, HStack, Stack } from 'soapbox/components/ui';
import { useManageZapSplit } from '../../api/hooks/admin/useManageZapSplit';
import AddNewAccount from '../ui/components/new-account-zap-split';
import { ZapSplitSlider } from '../zap/components/zap-split-account-item';
const closeIcon = require('@tabler/icons/outline/x.svg');
const messages = defineMessages({
heading: { id: 'column.admin.zap_split', defaultMessage: 'Manage Zap Split' },
});
interface INewAccount{
acc: string;
message: string;
weight: number;
}
const ManageZapSplit: React.FC = () => {
const intl = useIntl();
const { formattedData, weights, handleWeightChange, sendNewSplit, removeAccount } = useManageZapSplit();
const [hasNewAccount, setHasNewAccount] = useState(false);
const [newWeight, setNewWeight] = useState(0.05);
const [newAccount, setNewAccount] = useState<INewAccount>({ acc: '', message: '', weight: Number((newWeight * 100).toFixed()) });
const handleNewAccount = () => {
setHasNewAccount(false);
console.log(newAccount);
sendNewSplit(newAccount);
setNewWeight(0.05);
setNewAccount(({ acc: '', message: '', weight: Number((newWeight * 100).toFixed()) }));
};
const handleChange = (newWeight: number) => {
setNewWeight(newWeight);
setNewAccount((previousValue) => ({
...previousValue,
weight: Number((newWeight * 100).toFixed()) }));
};
const formattedWeight = (weight: number) =>{
return Number((weight * 100).toFixed());
};
return (
<Column label={intl.formatMessage(messages.heading)}>
<Stack space={4} >
<List>
{formattedData.map((data) => (
<ListItem
key={data.account.id} label={''
// <div className='max-w-xs'>
// <Account account={data.account} showProfileHoverCard={false} />
// </div>
}
>
<div className='relative flex w-full flex-col items-start justify-center gap-4 sm:flex-row sm:justify-between'>
<div className='flex w-60 justify-center sm:justify-start '>
<Account account={data.account} showProfileHoverCard={false} />
</div>
<HStack space={2} className='w-full sm:justify-end'>
<ZapSplitSlider
width='w-[96%] sm:w-40'
initialWeight={weights[data.account.id] || 0}
onWeightChange={(weight) => handleWeightChange(data.account.id, weight)}
/>
<Button type='button' className='absolute right-0 top-2 sm:relative sm:right-0 sm:top-0' size='xs' icon={closeIcon} theme='transparent' onClick={() => removeAccount(data.account.id)} />
</HStack>
</div>
</ListItem>
))}
{hasNewAccount && (
<AddNewAccount
newAccount={newAccount}
newWeight={newWeight}
setNewAccount={setNewAccount}
handleChange={handleChange}
formattedWeight={formattedWeight}
closeNewAccount={() => {
setHasNewAccount(false);
setNewWeight(0.05);
}}
/>
)}
</List>
{hasNewAccount && <Button theme='secondary' type='button' onClick={handleNewAccount}>
<FormattedMessage id='manage.zap_split.add_new_account' defaultMessage='Add New Account' />
</Button>}
{!hasNewAccount && <Button theme='secondary' type='button' onClick={() => setHasNewAccount(true)}>
<FormattedMessage id='manage.zap_split.add' defaultMessage='Add' />
</Button>}
<HStack space={2} justifyContent='end'>
<Button to='/admin' theme='tertiary'>
<FormattedMessage id='common.cancel' defaultMessage='Cancel' />
</Button>
<Button type='button' theme='primary' onClick={() => sendNewSplit()}>
<FormattedMessage id='manage.zap_split.save' defaultMessage='Save' />
</Button>
</HStack>
</Stack>
</Column>
);
};
export default ManageZapSplit;
export type { INewAccount };