1import React, { useCallback, useState } from 'react';
2import cn from 'classnames';
3import { Just } from 'folktale/maybe';
4import { Grid, Flex } from 'indigo-react';
5import { azimuth } from 'azimuth-js';
7import { usePointCursor } from 'store/pointCursor';
8import { useWallet } from 'store/wallet';
10import View from 'components/View';
11import Greeting from 'components/Greeting';
12import Passport from 'components/Passport';
13import { ForwardButton, BootUrbitOSButton } from 'components/Buttons';
14import CopyButton from 'components/CopyButton';
15import Blinky, { matchBlinky } from 'components/Blinky';
16import DownloadSigilButton from 'components/DownloadSigilButton';
17import BarGraph from 'components/BarGraph';
18import Chip from 'components/Chip';
19import InviteSigilList from 'components/InviteSigilList';
21import * as need from 'lib/need';
22import useInvites from 'lib/useInvites';
23import { useSyncOwnedPoints } from 'lib/useSyncPoints';
24import useCurrentPermissions from 'lib/useCurrentPermissions';
25import { useLocalRouter } from 'lib/LocalRouter';
26import useKeyfileGenerator from 'lib/useKeyfileGenerator';
28import Inviter from 'views/Invite/Inviter';
30export default function Point() {
31 const { pop, push, names } = useLocalRouter();
32 const { pointCursor } = usePointCursor();
34 const { wallet } = useWallet();
35 const point = need.point(pointCursor);
37 const { code, notice } = useKeyfileGenerator();
45 } = useCurrentPermissions();
47 // fetch the invites for the current cursor
48 const invites = useInvites(point);
57 const showInvites = !(
58 acceptedInvites.getOrElse(0) === 0 && sentInvites.getOrElse(0) === 0
61 const hasInvites = showInvites || availableInvites.getOrElse(0) !== 0;
64 sentInvites.getOrElse(0) + availableInvites.getOrElse(0);
65 const _pendingInvites = pendingPoints.getOrElse([]).length;
67 const loadedInvites = Just.hasInstance(availableInvites);
69 // availableInvites.getOrElse(0) === 0
71 const goAdmin = useCallback(() => push(names.ADMIN), [push, names]);
73 const goSenate = useCallback(() => push(names.SENATE), [push, names]);
75 const goSigil = useCallback(() => push(names.SIGIL_GENERATOR), [push, names]);
77 const goCohort = useCallback(() => push(names.INVITE_COHORT), [push, names]);
79 const goPartiesSetPoolSize = useCallback(
80 () => push(names.PARTY_SET_POOL_SIZE),
84 const goIssuePoint = useCallback(() => push(names.ISSUE_CHILD), [
89 const isPlanet = azimuth.getPointSize(point) === azimuth.PointSize.Planet;
91 const [showInviteForm, setShowInviteForm] = useState(false);
93 const inviteButton = (() => {
94 if (azimuth.getPointSize(point) === azimuth.PointSize.Star) {
100 disabled={!isActiveOwner}
101 onClick={goPartiesSetPoolSize}>
112 const senateButton = (() => {
113 if (azimuth.getPointSize(point) !== azimuth.PointSize.Galaxy) {
130 // sync the current cursor
131 useSyncOwnedPoints([point]);
133 const address = need.addressFromWallet(wallet);
136 <View pop={pop} inset>
137 <Greeting point={point} />
140 address={Just(address)}
141 animationMode={'slide'}
144 {isPlanet && hasInvites && (
146 <Grid.Item cols={[1, 11]}>
152 className={cn('t-right underline', {
153 gray4: sentInvites.getOrElse(0) === 0,
160 <Flex align="center">
162 {acceptedInvites.getOrElse(0) + _pendingInvites} /{' '}
165 {_pendingInvites > 0 && (
166 <Flex.Item as={Chip} color="yellow">
167 {_pendingInvites} pending
178 available={availableInvites}
180 accepted={acceptedInvites}
185 pendingPoints={pendingPoints}
186 acceptedPoints={acceptedPoints}
192 <Grid.Item full className="b-gray4 b-dotted b1 self-center">
193 <div className="p4 pv8 t-center gray4">
194 Start your invite group by adding members
199 {!showInviteForm && availableInvites.getOrElse(0) > 0 && (
204 onClick={() => setShowInviteForm(true)}>
208 {showInviteForm && <Inviter />}
211 {!loadedInvites && isPlanet && (
212 <Grid.Item className="mv2" full>
213 Invite Group <Blinky />
217 <Grid className="pt2">
219 <Grid.Item full as={ForwardButton} onClick={goSigil} />
224 disabled={!canManage}
236 onClick={goIssuePoint}>
243 <Grid.Item full as={BootUrbitOSButton} />
248 accessory={code && <CopyButton text={code} />}
249 detail={code || notice}
251 detailClassName="mono">
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list