@@ -5,7 +5,7 @@ import { Grid } from 'indigo-react';
5import { azimuth } from 'azimuth-js';
5import { azimuth } from 'azimuth-js';
7import { ForwardButton } from 'components/Buttons';
7import { ForwardButton } from 'components/Buttons';
8−import { matchBlinky, matchBlinkyDate } from 'components/Blinky';
8+import { matchBlinkyDate } from 'components/Blinky';
10import { ETH_ZERO_ADDR } from 'lib/wallet';
10import { ETH_ZERO_ADDR } from 'lib/wallet';
@@ -18,38 +18,20 @@ import ViewHeader from 'components/ViewHeader';
18import usePermissionsForPoint from 'lib/usePermissionsForPoint';
18import usePermissionsForPoint from 'lib/usePermissionsForPoint';
19import { PROXY_TYPE, proxyTypeToHuman } from 'lib/proxy';
19import { PROXY_TYPE, proxyTypeToHuman } from 'lib/proxy';
20import { useLocalRouter } from 'lib/LocalRouter';
20import { useLocalRouter } from 'lib/LocalRouter';
21−import { formatDots } from 'lib/dateFormat';
22import capitalize from 'lib/capitalize';
21import capitalize from 'lib/capitalize';
23import { eqAddr } from 'lib/wallet';
22import { eqAddr } from 'lib/wallet';
24−
23+import MiniBackButton from 'components/MiniBackButton';
25−//TODO consolidate with azimuth-js' getActivationBlock
24+import FooterButton from 'components/FooterButton';
26−const getRekeyDate = async (web3, contracts, point) => {
27− const logs = await contracts.azimuth.getPastEvents('ChangedKeys', {
30− filter: { point: [point] },
32− if (logs.length === 0) {
35− // last log is most recent
36− const block = await web3.eth.getBlock(logs[logs.length - 1].blockNumber);
37− return new Date(block.timestamp * 1000);
41export default function AdminEditPermissions() {
26export default function AdminEditPermissions() {
42− const { push, names } = useLocalRouter();
27+ const { pop, push, names } = useLocalRouter();
43− const { web3, contracts } = useNetwork();
28+ const { contracts } = useNetwork();
44 const { wallet } = useWallet();
29 const { wallet } = useWallet();
45 const { pointCursor } = usePointCursor();
30 const { pointCursor } = usePointCursor();
46− const { getDetails } = usePointCache();
31+ const { getDetails, getRekeyDate } = usePointCache();
48− const _web3 = need.web3(web3);
49 const _contracts = need.contracts(contracts);
33 const _contracts = need.contracts(contracts);
51− const [rekeyDate, setRekeyDate] = useState(Nothing());
53 const point = need.point(pointCursor);
35 const point = need.point(pointCursor);
54 const pointSize = azimuth.getPointSize(point);
36 const pointSize = azimuth.getPointSize(point);
55 const isParent = pointSize !== azimuth.PointSize.Planet;
37 const isParent = pointSize !== azimuth.PointSize.Planet;
@@ -57,42 +39,33 @@ export default function AdminEditPermissions() {
57 const userAddress = need.wallet(wallet).address;
39 const userAddress = need.wallet(wallet).address;
59 const details = need.details(getDetails(point));
41 const details = need.details(getDetails(point));
42+ const networkRevision = parseInt(details.keyRevisionNumber, 10);
60 const { canManage, isOwner } = usePermissionsForPoint(userAddress, point);
43 const { canManage, isOwner } = usePermissionsForPoint(userAddress, point);
63− getRekeyDate(_web3, _contracts, point).then(res => {
64− if (res === null) setRekeyDate(Just(new Date()));
65− else setRekeyDate(Just(res));
69− const goToProxy = useCallback(
45+ const goSetProxy = useCallback(
70 proxyType => push(names.SET_PROXY, { proxyType }),
46 proxyType => push(names.SET_PROXY, { proxyType }),
71 [push, names]
47 [push, names]
74− const goSetKeys = useCallback(() => push(names.SET_KEYS), [push, names]);
50+ const goNetworkingKeys = useCallback(() => push(names.NETWORKING_KEYS), [
76− const proxyAction = (proxyType, address, enabled) => {
55+ const renderProxyAction = (proxyType, address) => {
77 if (eqAddr(address, ETH_ZERO_ADDR)) {
56 if (eqAddr(address, ETH_ZERO_ADDR)) {
78 address = 'Not set';
57 address = 'Not set';
79 } else if (eqAddr(address, _contracts.delegatedSending.address)) {
58 } else if (eqAddr(address, _contracts.delegatedSending.address)) {
80− address = address + ' (invites contract)';
59+ address = `${address} (invites contract)`;
83− const detail = enabled
85− : `You do not have permission to change the ${proxyTypeToHuman(
91 <Grid.Item full>
64 <Grid.Item full>
92 <ForwardButton
65 <ForwardButton
93− disabled={!enabled}
66+ disabled={!isOwner}
94− onClick={() => goToProxy(proxyType)}
67+ onClick={() => goSetProxy(proxyType)}
95− detail={detail}>
68+ detail={address}>
96 {capitalize(proxyTypeToHuman(proxyType))} Proxy Address
69 {capitalize(proxyTypeToHuman(proxyType))} Proxy Address
97 </ForwardButton>
70 </ForwardButton>
98 </Grid.Item>
71 </Grid.Item>
@@ -101,18 +74,30 @@ export default function AdminEditPermissions() {
104− const networkKeysDetail =
77+ const renderNetworkKeysDetail = () => {
105− details.keyRevisionNumber === 0 ? (
78+ if (networkRevision === 0) {
106− 'Not yet configured'
79+ return 'Not yet configured.';
82+ const renderRevision = maybeDate => (
109− Revision #{details.keyRevisionNumber}, since{' '}
84+ Revision #{networkRevision}, since {matchBlinkyDate(maybeDate)}
110− {matchBlinkyDate(rekeyDate)}
88+ return getRekeyDate(point).matchWith({
89+ Nothing: () => renderRevision(Nothing()),
92+ Ok: r => renderRevision(Just(r.value)),
100+ <Grid.Item full as={MiniBackButton} onClick={() => pop()} />
116 <Grid.Item full as={ViewHeader}>
101 <Grid.Item full as={ViewHeader}>
117 Permissions
102 Permissions
118 </Grid.Item>
103 </Grid.Item>
@@ -122,19 +107,19 @@ export default function AdminEditPermissions() {
122 </Grid.Item>
107 </Grid.Item>
123 <Grid.Divider />
108 <Grid.Divider />
125− {proxyAction(PROXY_TYPE.MANAGEMENT, details.managementProxy, isOwner)}
110+ {renderProxyAction(PROXY_TYPE.MANAGEMENT, details.managementProxy)}
127− {isParent && proxyAction(PROXY_TYPE.SPAWN, details.spawnProxy, isOwner)}
112+ {isParent && renderProxyAction(PROXY_TYPE.SPAWN, details.spawnProxy)}
129− {isSenate && proxyAction(PROXY_TYPE.VOTING, details.votingProxy, isOwner)}
114+ {isSenate && renderProxyAction(PROXY_TYPE.VOTING, details.votingProxy)}
131 <Grid.Item
116 <Grid.Item
133 as={ForwardButton}
118 as={ForwardButton}
134 disabled={!canManage}
119 disabled={!canManage}
135− onClick={goSetKeys}
120+ onClick={goNetworkingKeys}
136− detail={networkKeysDetail}>
121+ detail={renderNetworkKeysDetail()}>
137− Network Keys
122+ Networking Keys
138 </Grid.Item>
123 </Grid.Item>
139 <Grid.Divider />
124 <Grid.Divider />