@@ -1,7 +1,10 @@
1−import React, { useCallback } from 'react';
1+import React, { useCallback, useState } from 'react';
2−import { Just } from 'folktale/maybe';
2+import { Just, Nothing } from 'folktale/maybe';
3import { Grid } from 'indigo-react';
3import { Grid } from 'indigo-react';
4import { azimuth } from 'azimuth-js';
4import { azimuth } from 'azimuth-js';
5+import cn from 'classnames';
6+import { take } from 'lodash';
7+import ob from 'urbit-ob';
6import { usePointCursor } from 'store/pointCursor';
9import { usePointCursor } from 'store/pointCursor';
7import { useWallet } from 'store/wallet';
10import { useWallet } from 'store/wallet';
@@ -13,6 +16,8 @@ import { ForwardButton, BootUrbitOSButton } from 'components/Buttons';
13import CopyButton from 'components/CopyButton';
16import CopyButton from 'components/CopyButton';
14import { matchBlinky } from 'components/Blinky';
17import { matchBlinky } from 'components/Blinky';
15import DownloadSigilButton from 'components/DownloadSigilButton';
18import DownloadSigilButton from 'components/DownloadSigilButton';
19+import BarGraph from 'components/BarGraph';
20+import MaybeSigil from 'components/MaybeSigil';
17import * as need from 'lib/need';
22import * as need from 'lib/need';
18import useInvites from 'lib/useInvites';
23import useInvites from 'lib/useInvites';
@@ -21,6 +26,46 @@ import useCurrentPermissions from 'lib/useCurrentPermissions';
21import { useLocalRouter } from 'lib/LocalRouter';
26import { useLocalRouter } from 'lib/LocalRouter';
22import useKeyfileGenerator from 'lib/useKeyfileGenerator';
27import useKeyfileGenerator from 'lib/useKeyfileGenerator';
29+import InviteCohort from 'views/Invite/Cohort';
31+const InviteSigilList = ({ className, pendingPoints, acceptedPoints }) => {
32+ const _acceptedPoints = take(
33+ acceptedPoints.getOrElse([]).map(x => Just(ob.patp(x))),
37+ const _pendingPoints = take(
38+ pendingPoints.getOrElse([]).map(x => Just(ob.patp(x))),
39+ 6 - _acceptedPoints.length
44+ Math.max(6 - _acceptedPoints.length - _pendingPoints.length, 0)
46+ ].map(() => Nothing());
48+ const renderSigil = (points, colors, klassName) => {
51+ {points.map((point, idx) => (
52+ <div className={cn(klassName, 'h9 w9')}>
53+ <MaybeSigil patp={point} size={50} colors={colors} />
61+ <div className={cn('flex justify-between', className)}>
62+ {renderSigil(_acceptedPoints, ['#000000', '#FFFFFF'])}
63+ {renderSigil(_pendingPoints, ['#ee892b', '#FFFFFF'])}
64+ {renderSigil(empty, [], 'b1 b-black')}
24export default function Point() {
69export default function Point() {
25 const { pop, push, names } = useLocalRouter();
70 const { pop, push, names } = useLocalRouter();
26 const { pointCursor } = usePointCursor();
71 const { pointCursor } = usePointCursor();
@@ -38,7 +83,22 @@ export default function Point() {
38 } = useCurrentPermissions();
83 } = useCurrentPermissions();
40 // fetch the invites for the current cursor
85 // fetch the invites for the current cursor
86+ const invites = useInvites(point);
41− const { availableInvites } = useInvites(point);
88+ availableInvites,
95+ const showInvites = !(
96+ acceptedInvites.getOrElse(0) === 0 && sentInvites.getOrElse(0) === 0
99+ const hasInvites = showInvites || availableInvites.getOrElse(0) !== 0;
101+ // availableInvites.getOrElse(0) === 0
43 const goAdmin = useCallback(() => push(names.ADMIN), [push, names]);
103 const goAdmin = useCallback(() => push(names.ADMIN), [push, names]);
@@ -54,6 +114,10 @@ export default function Point() {
117+ const isPlanet = azimuth.getPointSize(point) === azimuth.PointSize.Planet;
119+ const [showInviteForm, setShowInviteForm] = useState(false);
57 const inviteButton = (() => {
121 const inviteButton = (() => {
58 switch (azimuth.getPointSize(point)) {
122 switch (azimuth.getPointSize(point)) {
59 case azimuth.PointSize.Planet:
123 case azimuth.PointSize.Planet:
@@ -103,6 +167,52 @@ export default function Point() {
103 address={Just(address)}
167 address={Just(address)}
104 animationMode={'slide'}
168 animationMode={'slide'}
171+ {isPlanet && hasInvites && (
182+ available={availableInvites}
184+ accepted={acceptedInvites}
188+ as={InviteSigilList}
189+ pendingPoints={pendingPoints}
190+ acceptedPoints={acceptedPoints}
196+ <Grid.Item full className="b-gray4 b-dotted b1 self-center">
197+ <div className="p4 pv8 t-center gray4">
198+ Start your invite group by adding members
203+ {!showInviteForm && availableInvites.getOrElse(0) > 0 && (
208+ onClick={() => setShowInviteForm(true)}>
212+ {showInviteForm && <InviteCohort />}
106 <Grid className="pt2">
216 <Grid className="pt2">
107 {inviteButton}
217 {inviteButton}
108 <Grid.Item
218 <Grid.Item