import React, { useCallback, useEffect, useState } from 'react';
import cn from 'classnames';
import { azimuth } from 'azimuth-js';
import { Just } from 'folktale/maybe';
import { Grid, Flex } from 'indigo-react';
import { Box, Icon, Row, Button } from '@tlon/indigo-react';
import { usePointCursor } from 'store/pointCursor';
import { useWallet } from 'store/wallet';
import { useRollerStore } from 'store/roller';
import View from 'components/View';
import Greeting from 'components/Greeting';
import Passport from 'components/Passport';
import Blinky from 'components/Blinky';
import BarGraph from 'components/BarGraph';
import Chip from 'components/Chip';
import InviteSigilList from 'components/InviteSigilList';
import { ForwardButton } from 'components/Buttons';
import L2PointHeader from 'components/L2/Headers/L2PointHeader';
import LayerIndicator from 'components/L2/LayerIndicator';
import Card from 'components/L2/Card';
import * as need from 'lib/need';
import useInvites from 'lib/useInvites';
import { useSyncExtras } from 'lib/useSyncPoints';
import useCurrentPermissions from 'lib/useCurrentPermissions';
import { useLocalRouter } from 'lib/LocalRouter';
import Inviter from 'views/Invite/Inviter';
import useRoller from 'lib/useRoller';
import './Point.scss';
import { isL2 } from 'lib/utils/roller';
import { isDevelopment } from 'lib/flags';
import { convertToInt } from 'lib/convertToInt';
import { usePointCache } from 'store/pointCache';
import Modal from 'components/L2/Modal';
function InviteForm({
showInviteForm,
setShowInviteForm,
acceptedInvites,
acceptedPoints,
availableInvites,
goCohort,
pendingPoints,
sentInvites,
showInvites,
}) {
const _totalInvites =
sentInvites.getOrElse(0) + availableInvites.getOrElse(0);
const _pendingInvites = pendingPoints.getOrElse([]).length;
return (
<>
Invite Group
View
{acceptedInvites.getOrElse(0)} / {_totalInvites}
{_pendingInvites > 0 && (
{_pendingInvites} pending
)}
{showInvites && (
<>
>
)}
{!showInvites && (
<>
Start your invite group by adding members
>
)}
{!showInviteForm && availableInvites.getOrElse(0) > 0 && (
setShowInviteForm(true)}>
Add Members
)}
{showInviteForm && }
>
);
}
export default function Point() {
const { pop, push, names } = useLocalRouter();
const { wallet, authToken } = useWallet();
const { pointCursor } = usePointCursor();
const point = need.point(pointCursor);
const { getDetails } = usePointCache();
const { api, getInvites } = useRoller();
const {
pendingTransactions,
nextRoll,
invites,
setCurrentPoint,
setPendingTransactions,
currentL2,
} = useRollerStore();
const pointSize = azimuth.getPointSize(point);
const details = need.details(getDetails(point));
const isStarOrGalaxy = pointSize !== azimuth.PointSize.Planet;
const networkRevision = convertToInt(details.keyRevisionNumber, 10);
const networkKeysNotSet =
!currentL2 && isStarOrGalaxy && networkRevision === 0;
const [showModal, setShowModal] = useState(networkKeysNotSet);
useEffect(() => {
if (networkKeysNotSet) {
setShowModal(true);
}
}, [networkKeysNotSet]);
useEffect(() => {
const loadL2Info = async () => {
const getTransactions = async () => {
const pointInfo = await api.getPoint(Number(point));
if (isDevelopment) {
console.log('POINT INFO', pointInfo);
}
setCurrentPoint(pointInfo);
getInvites(isL2(pointInfo.dominion));
};
getTransactions();
};
loadL2Info();
}, [api, point, authToken, setPendingTransactions]); // eslint-disable-line
const { isParent, canManage, canSpawn, canVote } = useCurrentPermissions();
// L1 invites
const l1Invites = useInvites(point);
const {
availableInvites,
sentInvites,
acceptedInvites,
pendingPoints,
acceptedPoints,
} = l1Invites;
const showInvites = !(
acceptedInvites.getOrElse(0) === 0 && sentInvites.getOrElse(0) === 0
);
const hasInvites = showInvites || availableInvites.getOrElse(0) !== 0;
const loadedInvites = Just.hasInstance(availableInvites);
//
// availableInvites.getOrElse(0) === 0
const goSenate = useCallback(() => push(names.SENATE), [push, names]);
const goCohort = useCallback(() => push(names.INVITE_COHORT), [push, names]);
const goUrbitOS = useCallback(() => push(names.URBIT_OS), [push, names]);
const goUrbitID = useCallback(() => push(names.URBIT_ID), [push, names]);
const goResidents = useCallback(() => push(names.RESIDENTS), [push, names]);
const goIssuePoint = useCallback(() => push(names.ISSUE_CHILD), [
names.ISSUE_CHILD,
push,
]);
const isPlanet = azimuth.getPointSize(point) === azimuth.PointSize.Planet;
const [showInviteForm, setShowInviteForm] = useState(false);
const senateButton = (() => {
if (azimuth.getPointSize(point) !== azimuth.PointSize.Galaxy) {
return null;
}
return (
<>
Senate
>
);
})();
// sync the current cursor
useSyncExtras([point]);
const address = need.addressFromWallet(wallet);
const numPending = pendingTransactions.length;
return (
}>
{!!numPending && (
{numPending} Planet{numPending > 1 ? 's' : ''} Spawned
{nextRoll}
)}
{isParent && (
)}
{isPlanet && hasInvites && (
)}
{!loadedInvites && isPlanet && (
Invite Group
)}
{/* {inviteButton} */}
}
onClick={goUrbitID}
disabled={!canManage}
/>
}
onClick={goUrbitOS}
disabled={!canManage}
/>
{isParent && (
<>
Issue Point
>
)}
{senateButton}
setShowModal(false)}>
setShowModal(false)}>
×
Network Keys Not Set
This point's network keys are not set. The network keys must be set
to spawn points or migrate to Layer 2. Please set them in Urbit OS
Settings.
setShowModal(false)}>
Cancel
Set Keys
);
}