@@ -1,4 +1,4 @@
1−import React, { useCallback, useState } from 'react';
1+import React, { useCallback, useState, useEffect } from 'react';
2import cn from 'classnames';
2import cn from 'classnames';
3import { Just } from 'folktale/maybe';
3import { Just } from 'folktale/maybe';
4import { Grid, Flex, Button } from 'indigo-react';
4import { Grid, Flex, Button } from 'indigo-react';
@@ -10,7 +10,8 @@ import { useWallet } from 'store/wallet';
10import View from 'components/View';
10import View from 'components/View';
11import Greeting from 'components/Greeting';
11import Greeting from 'components/Greeting';
12import Passport from 'components/Passport';
12import Passport from 'components/Passport';
13+import { ForwardButton } from 'components/Buttons';
13−import Blinky from 'components/Blinky';
14+import Blinky, { matchBlinky } from 'components/Blinky';
14import BarGraph from 'components/BarGraph';
15import BarGraph from 'components/BarGraph';
15import Chip from 'components/Chip';
16import Chip from 'components/Chip';
16import InviteSigilList from 'components/InviteSigilList';
17import InviteSigilList from 'components/InviteSigilList';
@@ -24,6 +25,7 @@ import useInvites from 'lib/useInvites';
24import { useSyncOwnedPoints } from 'lib/useSyncPoints';
25import { useSyncOwnedPoints } from 'lib/useSyncPoints';
25import useCurrentPermissions from 'lib/useCurrentPermissions';
26import useCurrentPermissions from 'lib/useCurrentPermissions';
26import { useLocalRouter } from 'lib/LocalRouter';
27import { useLocalRouter } from 'lib/LocalRouter';
28+import { useResidents } from 'lib/useResidents';
28import Inviter from 'views/Invite/Inviter';
30import Inviter from 'views/Invite/Inviter';
@@ -34,6 +36,8 @@ export default function Point() {
34 const { wallet } = useWallet();
36 const { wallet } = useWallet();
35 const point = need.point(pointCursor);
37 const point = need.point(pointCursor);
39+ const { residentCount } = useResidents(point);
39 isActiveOwner,
43 isActiveOwner,
@@ -76,6 +80,10 @@ export default function Point() {
77 const goUrbitOS = useCallback(() => push(names.URBIT_OS), [push, names]);
81 const goUrbitOS = useCallback(() => push(names.URBIT_OS), [push, names]);
83+ const goUrbitID = useCallback(() => push(names.URBIT_ID), [push, names]);
85+ const goResidents = useCallback(() => push(names.RESIDENTS), [push, names]);
79 const goPartiesSetPoolSize = useCallback(
87 const goPartiesSetPoolSize = useCallback(
80 () => push(names.PARTY_SET_POOL_SIZE),
88 () => push(names.PARTY_SET_POOL_SIZE),
81 [push, names]
89 [push, names]
@@ -135,6 +143,79 @@ export default function Point() {
136 const address = need.addressFromWallet(wallet);
144 const address = need.addressFromWallet(wallet);
146+ const InviteForm = useCallback(() => {
149+ <Grid.Item cols={[1, 11]}>
155+ className={cn('t-right underline pointer-hover', {
156+ gray4: sentInvites.getOrElse(0) === 0,
163+ <Flex align="center">
165+ {acceptedInvites.getOrElse(0)} / {_totalInvites}
167+ {_pendingInvites > 0 && (
168+ <Flex.Item as={Chip} className="bg-yellow1 yellow4">
169+ {_pendingInvites} pending
180+ available={availableInvites}
182+ accepted={acceptedInvites}
186+ as={InviteSigilList}
187+ pendingPoints={pendingPoints}
188+ acceptedPoints={acceptedPoints}
194+ <Grid.Item full className="b-gray4 b-dotted b1 self-center">
195+ <div className="p4 pv8 t-center gray4">
196+ Start your invite group by adding members
201+ {!showInviteForm && availableInvites.getOrElse(0) > 0 && (
207+ onClick={() => setShowInviteForm(true)}>
211+ {showInviteForm && <Inviter />}
212+ <Grid.Item full className="mb2" />
217+ console.log(residentCount);
139 <View pop={pop} inset>
220 <View pop={pop} inset>
140 <Greeting point={point} />
221 <Greeting point={point} />
@@ -144,74 +225,16 @@ export default function Point() {
144 animationMode={'slide'}
225 animationMode={'slide'}
146 <Grid gap={3}>
227 <Grid gap={3}>
147− {isPlanet && hasInvites && (
228+ {isParent && (
148− <>
229+ <Grid.Item full as={Flex} justify="between" onClick={goResidents}>
149− <Grid.Item cols={[1, 11]}>
154− <Grid.Item
230+ <Flex.Item>
155− className={cn('t-right underline pointer-hover', {
231+ Residents{' '}
156− gray4: sentInvites.getOrElse(0) === 0,
232+ <span className="gray3">{matchBlinky(residentCount)}</span>
161− </Grid.Item>
233+ </Flex.Item>
163− <Flex align="center">
165− {acceptedInvites.getOrElse(0)} / {_totalInvites}
167− {_pendingInvites > 0 && (
168− <Flex.Item as={Chip} className="bg-yellow1 yellow4">
169− {_pendingInvites} pending
170− </Flex.Item>
234+ <Flex.Item>N/A</Flex.Item>
180− available={availableInvites}
182− accepted={acceptedInvites}
186− as={InviteSigilList}
187− pendingPoints={pendingPoints}
188− acceptedPoints={acceptedPoints}
194− <Grid.Item full className="b-gray4 b-dotted b1 self-center">
195− <div className="p4 pv8 t-center gray4">
196− Start your invite group by adding members
198− </Grid.Item>
235+ </Grid.Item>
201− {!showInviteForm && availableInvites.getOrElse(0) > 0 && (
207− onClick={() => setShowInviteForm(true)}>
211− {showInviteForm && <Inviter />}
212− <Grid.Item full className="mb2" />
237+ {isPlanet && hasInvites && <InviteForm />}
215 {!loadedInvites && isPlanet && (
238 {!loadedInvites && isPlanet && (
216 <Grid.Item className="mv2" full>
239 <Grid.Item className="mv2" full>
217 Invite Group <Blinky />
240 Invite Group <Blinky />
@@ -219,28 +242,28 @@ export default function Point() {
221 <Grid className="pt2">
244 <Grid className="pt2">
223− <Grid.Item full as={ForwardButton} onClick={goSigil}>
226 <Grid.Divider />
245 <Grid.Divider />
227 <Grid.Item
247 <Grid.Item
229 as={ForwardButton}
249 as={ForwardButton}
230 disabled={!canManage}
250 disabled={!canManage}
231− onClick={goUrbitOS}>
251+ onClick={goUrbitID}
232− Urbit OS
252+ className="mt2"
253+ detail="Identity and security settings">
233 </Grid.Item>
255 </Grid.Item>
234 <Grid.Divider />
256 <Grid.Divider />
235 <Grid.Item
257 <Grid.Item
237 as={ForwardButton}
259 as={ForwardButton}
238 disabled={!canManage}
260 disabled={!canManage}
262+ detail="Urbit OS Settings"
239− onClick={goAdmin}>
263+ onClick={goUrbitOS}>
241 </Grid.Item>
265 </Grid.Item>
242 <Grid.Divider />
266 <Grid.Divider />
244 {isParent && (
267 {isParent && (
246 <Grid.Item
269 <Grid.Item