@@ -1,5 +1,4 @@
1import { useCallback, useEffect, useState } from 'react';
1import { useCallback, useEffect, useState } from 'react';
2−import { azimuth } from 'azimuth-js';
3import { Just } from 'folktale/maybe';
2import { Just } from 'folktale/maybe';
4import { Grid, Flex } from 'indigo-react';
3import { Grid, Flex } from 'indigo-react';
5import { Box, Icon, Row, Button, Checkbox } from '@tlon/indigo-react';
4import { Box, Icon, Row, Button, Checkbox } from '@tlon/indigo-react';
@@ -12,7 +11,6 @@ import View from 'components/View';
12import Greeting from 'components/Greeting';
11import Greeting from 'components/Greeting';
13import Passport from 'components/Passport';
12import Passport from 'components/Passport';
14import Blinky from 'components/Blinky';
13import Blinky from 'components/Blinky';
15−import { ForwardButton } from 'components/Buttons';
16import L2PointHeader from 'components/L2/Headers/L2PointHeader';
14import L2PointHeader from 'components/L2/Headers/L2PointHeader';
17import LayerIndicator from 'components/L2/LayerIndicator';
15import LayerIndicator from 'components/L2/LayerIndicator';
18import Card from 'components/L2/Card';
16import Card from 'components/L2/Card';
@@ -29,7 +27,7 @@ import { isL2 } from 'lib/utils/roller';
29import { isDevelopment } from 'lib/flags';
27import { isDevelopment } from 'lib/flags';
30import { usePointCache } from 'store/pointCache';
28import { usePointCache } from 'store/pointCache';
31import Modal from 'components/L2/Modal';
29import Modal from 'components/L2/Modal';
32−import { isPlanet } from 'lib/utils/point';
30+import { isPlanet, isStar } from 'lib/utils/point';
33import { useHasNetworkKeysSet } from 'lib/useHasNetworkKeysSet';
31import { useHasNetworkKeysSet } from 'lib/useHasNetworkKeysSet';
34import { InviteForm } from './InviteForm';
32import { InviteForm } from './InviteForm';
@@ -48,13 +46,21 @@ export default function Point() {
48 setInvites,
46 setInvites,
49 } = useRollerStore();
47 } = useRollerStore();
50 const networkKeysSet = useHasNetworkKeysSet();
48 const networkKeysSet = useHasNetworkKeysSet();
49+ const [seenMissingKeys, setSeenMissingKeys] = useSeenMissingKeys();
51 const [showModal, setShowModal] = useState(false);
50 const [showModal, setShowModal] = useState(false);
52− const [seenMissingKeys, setSeeingMissingKeys] = useSeenMissingKeys();
53 const [hideMessage, setHideMessage] = useState(false);
51 const [hideMessage, setHideMessage] = useState(false);
53+ const hideModal = useCallback(() => {
55+ setSeenMissingKeys(true);
59+ }, [hideMessage, setShowModal, setSeenMissingKeys]);
55 useEffect(() => {
61 useEffect(() => {
56− setShowModal(!networkKeysSet);
62+ setShowModal(!networkKeysSet && !seenMissingKeys);
57− }, [networkKeysSet]);
63+ }, [networkKeysSet, seenMissingKeys]);
59 const loadL1Info = useCallback(async () => {
65 const loadL1Info = useCallback(async () => {
60 await syncExtras(point);
66 await syncExtras(point);
@@ -84,7 +90,7 @@ export default function Point() {
84 setInvites([]);
90 setInvites([]);
85 }, []); // eslint-disable-line react-hooks/exhaustive-deps
91 }, []); // eslint-disable-line react-hooks/exhaustive-deps
87− const { isParent, canManage, canSpawn, canVote } = useCurrentPermissions();
93+ const { isParent, canManage } = useCurrentPermissions();
89 // L1 invites
95 // L1 invites
90 const l1Invites = useInvites(point);
96 const l1Invites = useInvites(point);
@@ -104,46 +110,22 @@ export default function Point() {
105 const loadedInvites = Just.hasInstance(availableInvites);
111 const loadedInvites = Just.hasInstance(availableInvites);
107− const goSenate = useCallback(() => push(names.SENATE), [push, names]);
109 const goCohort = useCallback(() => push(names.INVITE_COHORT), [push, names]);
113 const goCohort = useCallback(() => push(names.INVITE_COHORT), [push, names]);
111 const goUrbitOS = useCallback(() => {
115 const goUrbitOS = useCallback(() => {
112− if (hideMessage) setSeeingMissingKeys(hideMessage);
116+ if (hideMessage) setSeenMissingKeys(hideMessage);
114 push(names.URBIT_OS);
118 push(names.URBIT_OS);
115− }, [push, names, hideMessage, setSeeingMissingKeys]);
119+ }, [push, names, hideMessage, setSeenMissingKeys]);
117 const goUrbitID = useCallback(() => push(names.URBIT_ID), [push, names]);
121 const goUrbitID = useCallback(() => push(names.URBIT_ID), [push, names]);
119 const goResidents = useCallback(() => push(names.RESIDENTS), [push, names]);
123 const goResidents = useCallback(() => push(names.RESIDENTS), [push, names]);
121− const goIssuePoint = useCallback(() => push(names.ISSUE_CHILD), [
126 const planet = isPlanet(point);
125 const planet = isPlanet(point);
128 const [showInviteForm, setShowInviteForm] = useState(false);
127 const [showInviteForm, setShowInviteForm] = useState(false);
130− const senateButton = (() => {
131− if (azimuth.getPointSize(point) !== azimuth.PointSize.Galaxy) {
147 const address = need.addressFromWallet(wallet);
129 const address = need.addressFromWallet(wallet);
148 const spawnedPending = pendingTransactions.filter(
130 const spawnedPending = pendingTransactions.filter(
149 ({ rawTx }) => rawTx?.tx?.type === 'spawn'
131 ({ rawTx }) => rawTx?.tx?.type === 'spawn'
@@ -220,8 +202,12 @@ export default function Point() {
220 {isParent && (
202 {isParent && (
221 <Grid.Item full as={Flex} justify="between">
203 <Grid.Item full as={Flex} justify="between">
223− title="Residency"
205+ title={`${isStar(point) ? 'Star' : 'Galaxy'} Ops`}
224− subtitle="Manage peers that you service"
206+ subtitle={
208+ ? 'Manage planets you sponsor and spawn planets'
209+ : 'Manage stars you sponsor, spawn stars, and vote'
225 onClick={goResidents}
211 onClick={goResidents}
227 </Grid.Item>
213 </Grid.Item>
@@ -263,25 +249,10 @@ export default function Point() {
263 disabled={!canManage}
249 disabled={!canManage}
265 </Grid.Item>
251 </Grid.Item>
271− disabled={!canSpawn}
272− onClick={goIssuePoint}>
281− show={showModal && !seenMissingKeys}
253+ <Modal show={showModal} hide={hideModal}>
282− hide={() => setShowModal(false)}>
283 <Box className="network-keys-modal">
254 <Box className="network-keys-modal">
284− <Box className="close" onClick={() => setShowModal(false)}>
255+ <Box className="close" onClick={hideModal}>
287 <Box className="title">No Network Keys Found</Box>
258 <Box className="title">No Network Keys Found</Box>
@@ -297,7 +268,7 @@ export default function Point() {
297 <Box className="dont-show">Do not warn me again</Box>
268 <Box className="dont-show">Do not warn me again</Box>
299 <Row className="buttons">
270 <Row className="buttons">
300− <Button className="cancel" onClick={() => setShowModal(false)}>
271+ <Button className="cancel" onClick={hideModal}>
302 </Button>
273 </Button>
303 <Button className="migrate" onClick={goUrbitOS}>
274 <Button className="migrate" onClick={goUrbitOS}>