@@ -1,6 +1,7 @@
1import React, { useState, useEffect, useCallback } from 'react';
1import React, { useState, useEffect, useCallback } from 'react';
2import { Grid } from 'indigo-react';
2import { Grid } from 'indigo-react';
3import * as azimuth from 'azimuth-js';
3import * as azimuth from 'azimuth-js';
4+import * as ob from 'urbit-ob';
5import View from 'components/View';
6import View from 'components/View';
6import L2BackHeader from 'components/L2/Headers/L2BackHeader';
7import L2BackHeader from 'components/L2/Headers/L2BackHeader';
@@ -25,9 +26,31 @@ import { useNetwork } from 'store/network';
25import { usePointCache } from 'store/pointCache';
26import { usePointCache } from 'store/pointCache';
26import useEthereumTransaction from 'lib/useEthereumTransaction';
27import useEthereumTransaction from 'lib/useEthereumTransaction';
27import { GAS_LIMITS } from 'lib/constants';
28import { GAS_LIMITS } from 'lib/constants';
29+import Dropdown from 'components/L2/Dropdowns/Dropdown';
30+import { PointLayer } from 'lib/types/PointLayer';
31+import Sigil from 'components/Sigil';
29const DUMMY_L2_ADDRESS = '0x1111111111111111111111111111111111111111';
33const DUMMY_L2_ADDRESS = '0x1111111111111111111111111111111111111111';
42+ const patp = ob.patp(point);
45+ <Row className="entry" onClick={select}>
46+ <Box className="sigil">
47+ <Sigil patp={patp} size={1} colors={['#000000', '#FFFFFF']} />
31const useMigrate = () => {
54const useMigrate = () => {
32 const { contracts }: any = useNetwork();
55 const { contracts }: any = useNetwork();
33 const { syncDates }: any = usePointCache();
56 const { syncDates }: any = usePointCache();
@@ -55,13 +78,25 @@ const useMigrate = () => {
56export default function MigrateL2() {
79export default function MigrateL2() {
57 const { pop }: any = useLocalRouter();
80 const { pop }: any = useLocalRouter();
81+ const { pointCursor }: any = usePointCursor();
82+ const point = need.point(pointCursor);
83+ const { controlledPoints }: any = usePointCache();
59 const [proceed, setProceed] = useState(false);
85 const [proceed, setProceed] = useState(false);
60 const [hideMessage, setHideMessage] = useState(false);
86 const [hideMessage, setHideMessage] = useState(false);
61− const hideInfo = getHideMigrationMessage();
87+ const [selectedPoint, setSelectedPoint] = useState(point);
88+ const [showDropdown, setShowDropdown] = useState(false);
90+ const points = controlledPoints?.value?.value?.pointsWithLayers || [
93+ const l1Points = points.filter(
94+ ({ point, layer }: PointLayer) =>
96+ azimuth.azimuth.getPointSize(point) === azimuth.azimuth.PointSize.Star
63− const { pointCursor }: any = usePointCursor();
99+ const hideInfo = getHideMigrationMessage();
64− const point = need.point(pointCursor);
66 const { construct, unconstruct, completed, bind } = useMigrate();
101 const { construct, unconstruct, completed, bind } = useMigrate();
@@ -95,6 +130,15 @@ export default function MigrateL2() {
95 setProceed(true);
130 setProceed(true);
96 }, [hideMessage]);
131 }, [hideMessage]);
133+ const selectPoint = useCallback(
134+ (point: number) => {
135+ setSelectedPoint(point);
136+ setShowDropdown(false);
139+ [setSelectedPoint, setShowDropdown, construct]
98 const getContent = () => {
142 const getContent = () => {
99 if (proceed) {
143 if (proceed) {
@@ -102,7 +146,19 @@ export default function MigrateL2() {
102 <Box className="ship-selector">
146 <Box className="ship-selector">
103 <Box>Ship</Box>
147 <Box>Ship</Box>
104 <Box className="select-ship">Select one of your ships</Box>
148 <Box className="select-ship">Select one of your ships</Box>
151+ toggleOpen={() => setShowDropdown(!showDropdown)}
152+ value={<PointEntry point={selectedPoint} />} // change this to include the sigil
153+ className="migrate-selector">
154+ {l1Points.map(({ point }: PointLayer) => (
158+ select={() => selectPoint(point)}
107 <Grid.Item
163 <Grid.Item