/* eslint-disable */
import { useEffect, useState } from 'react';
import { Pane } from '@cybercongress/gravity';
import {
Dots,
ConnectAddress,
TransactionError,
Input,
ActionBar,
} from 'src/components';
import { LEDGER, CYBER } from 'src/utils/config';
import { PATTERN_CYBER } from 'src/constants/app';
import { useSigningClient } from 'src/contexts/signerClient';
import { useDispatch } from 'react-redux';
import { addAddressPocket } from 'src/redux/features/pocket';
import { AccountValue } from 'src/types/defaultAccount';
const { STAGE_INIT, HDPATH, STAGE_ERROR } = LEDGER;
const STAGE_ADD_ADDRESS_USER = 2.1;
const STAGE_ADD_ADDRESS_OK = 2.2;
const checkAddress = (obj, network, address) =>
Object.keys(obj).some((k) => {
if (obj[k][network]) {
return obj[k][network].bech32 === address;
}
});
function ActionBarConnect({
addAddress,
updateAddress,
updateFuncActionBar,
onClickBack,
selectAccount,
}) {
const { signer } = useSigningClient();
const [stage, setStage] = useState(STAGE_INIT);
const [valueInputAddres, setValueInputAddres] = useState('');
const [selectMethod, setSelectMethod] = useState('');
const selectNetwork = 'cyber';
const [addCyberAddress, setAddCyberAddress] = useState(false);
const [validAddressAddedUser, setValidAddressAddedUser] = useState(true);
const dispatch = useDispatch();
useEffect(() => {
if (addAddress === false && stage === STAGE_ADD_ADDRESS_OK) {
clearState();
}
}, [stage, addAddress]);
useEffect(() => {
if (valueInputAddres.match(PATTERN_CYBER)) {
setValidAddressAddedUser(false);
} else {
setValidAddressAddedUser(true);
}
}, [valueInputAddres]);
const connctAddress = () => {
switch (selectMethod) {
case 'keplr':
connectKeplr();
break;
default:
onClickAddAddressUser();
break;
}
};
const clearState = () => {
setStage(STAGE_INIT);
setValueInputAddres('');
setSelectMethod('');
setAddCyberAddress(false);
setValidAddressAddedUser(true);
};
const onClickAddAddressUser = () => {
setStage(STAGE_ADD_ADDRESS_USER);
};
const onClickAddAddressUserToLocalStr = async () => {
const accounts = { bech32: valueInputAddres, keys: 'read-only' };
setTimeout(() => {
dispatch(addAddressPocket(accounts));
}, 100);
setStage(STAGE_ADD_ADDRESS_OK);
clearState();
if (updateAddress) {
updateAddress();
}
if (updateFuncActionBar) {
updateFuncActionBar();
}
};
const connectKeplr = async () => {
if (signer) {
const { bech32Address, pubKey, name } = await signer.keplr.getKey(
CYBER.CHAIN_ID
);
const pk = Buffer.from(pubKey).toString('hex');
const accounts: AccountValue = {
bech32: bech32Address,
keys: 'keplr',
pk,
path: HDPATH,
name,
};
setStage(STAGE_ADD_ADDRESS_OK);
setTimeout(() => {
dispatch(addAddressPocket(accounts));
}, 100);
clearState();
if (updateAddress) {
updateAddress();
}
if (updateFuncActionBar) {
updateFuncActionBar();
}
}
};
const selectMethodFunc = (method) => {
if (method !== selectMethod) {
setSelectMethod(method);
} else {
setSelectMethod('');
}
};
if (stage === STAGE_INIT) {
return (
<ConnectAddress
selectMethodFunc={selectMethodFunc}
selectMethod={selectMethod}
selectNetwork={selectNetwork}
connctAddress={connctAddress}
keplr={signer}
onClickBack={onClickBack}
/>
);
}
if (stage === STAGE_ADD_ADDRESS_USER) {
return (
<ActionBar
button={{
disabled: validAddressAddedUser,
onClick: onClickAddAddressUserToLocalStr,
text: 'Add address',
}}
onClickBack={() => setStage(STAGE_INIT)}
>
<Pane
flex={1}
justifyContent="center"
alignItems="center"
fontSize="18px"
display="flex"
>
put {selectNetwork} address:
<Input
width="250px"
value={valueInputAddres}
onChange={(e) => setValueInputAddres(e.target.value)}
placeholder="address"
autoFocus
/>
</Pane>
</ActionBar>
);
}
if (stage === STAGE_ADD_ADDRESS_OK) {
return (
<ActionBar>
<Pane display="flex" alignItems="center">
<Pane fontSize={20}>adding address</Pane>
<Dots big />
</Pane>
</ActionBar>
);
}
if (stage === STAGE_ERROR) {
return (
<TransactionError
onClickBtn={() => clearState()}
errorMessage="you have this address in your pocket"
/>
);
}
return null;
}
export default ActionBarConnect;