@@ -1,6 +1,7 @@
1−import React from 'react';
1+import React, { useRef, useCallback } from 'react';
2import { Grid, Flex } from 'indigo-react';
2import { Grid, Flex } from 'indigo-react';
3import * as ob from 'urbit-ob';
3import * as ob from 'urbit-ob';
4+import { FORM_ERROR } from 'final-form';
5import { usePointCursor } from 'store/pointCursor';
6import { usePointCursor } from 'store/pointCursor';
@@ -9,6 +10,7 @@ import Sigil from 'components/Sigil';
10import * as need from 'lib/need';
11import * as need from 'lib/need';
11import { useLocalRouter } from 'lib/LocalRouter';
12import { useLocalRouter } from 'lib/LocalRouter';
13+import useSigilDownloader from 'lib/useSigilDownloader';
13import { composeValidator, buildNumberValidator } from 'form/validators';
15import { composeValidator, buildNumberValidator } from 'form/validators';
14import BridgeForm from 'form/BridgeForm';
16import BridgeForm from 'form/BridgeForm';
@@ -18,6 +20,7 @@ import { NumberInput, ColorInput } from 'form/Inputs';
19const BG_COLORS = [
21const BG_COLORS = [
20 '#000000',
22 '#000000',
21 '#C80F34',
24 '#C80F34',
22 '#EE5432',
25 '#EE5432',
23 '#F8C134',
26 '#F8C134',
@@ -36,12 +39,26 @@ const BG_COLORS = [
36const FG_COLORS = ['#000000', '#FFFFFF'];
39const FG_COLORS = ['#000000', '#FFFFFF'];
38export default function SigilGenerator() {
41export default function SigilGenerator() {
39− const { pop, push, names } = useLocalRouter();
42+ const { pop } = useLocalRouter();
40 const { pointCursor } = usePointCursor();
43 const { pointCursor } = usePointCursor();
42 const validate = composeValidator({ size: buildNumberValidator(16) });
45 const validate = composeValidator({ size: buildNumberValidator(16) });
43 const point = need.point(pointCursor);
46 const point = need.point(pointCursor);
48+ const canvasRef = useRef(null);
50+ const { downloadSigil } = useSigilDownloader(canvasRef);
44− const onSubmit = () => {};
51+ const onSubmit = useCallback(
52+ async (values, form) => {
53+ const error = await downloadSigil(point, values.colors, values.size);
55+ return { [FORM_ERROR]: error };
57+ // reset on next tick
58+ setTimeout(() => form.reset(values));
60+ [point, downloadSigil]
46 <View pop={pop}>
63 <View pop={pop}>
47 <BridgeForm
64 <BridgeForm
@@ -69,7 +86,12 @@ export default function SigilGenerator() {
69 <Flex.Item className="mb1">Urbit ID</Flex.Item>
86 <Flex.Item className="mb1">Urbit ID</Flex.Item>
70 <Flex.Item className="mono">{ob.patp(point)}</Flex.Item>
87 <Flex.Item className="mono">{ob.patp(point)}</Flex.Item>
71 </Grid.Item>
88 </Grid.Item>
72− <Grid.Item full as={NumberInput} name="size" label="Size (px)" />
91+ as={NumberInput}
73 <Grid.Item
95 <Grid.Item
75 as={ColorInput}
97 as={ColorInput}
@@ -95,6 +117,8 @@ export default function SigilGenerator() {
97 </BridgeForm>
119 </BridgeForm>
121+ <canvas style={{ display: 'none' }} ref={canvasRef} />