@@ -1,6 +1,7 @@
1−import React from 'react';
1+import React, { useRef, useCallback } from 'react';
22import { Grid, Flex } from 'indigo-react';
33import * as ob from 'urbit-ob';
4+import { FORM_ERROR } from 'final-form';
45
56import { usePointCursor } from 'store/pointCursor';
67
@@ -9,6 +10,7 @@ import Sigil from 'components/Sigil';
910
1011import * as need from 'lib/need';
1112import { useLocalRouter } from 'lib/LocalRouter';
13+import useSigilDownloader from 'lib/useSigilDownloader';
1214
1315import { composeValidator, buildNumberValidator } from 'form/validators';
1416import BridgeForm from 'form/BridgeForm';
@@ -18,6 +20,7 @@ import { NumberInput, ColorInput } from 'form/Inputs';
1820
1921const BG_COLORS = [
2022 '#000000',
23+ '#FFFFFF',
2124 '#C80F34',
2225 '#EE5432',
2326 '#F8C134',
@@ -36,12 +39,26 @@ const BG_COLORS = [
3639const FG_COLORS = ['#000000', '#FFFFFF'];
3740
3841export default function SigilGenerator() {
39− const { pop, push, names } = useLocalRouter();
42+ const { pop } = useLocalRouter();
4043 const { pointCursor } = usePointCursor();
4144
4245 const validate = composeValidator({ size: buildNumberValidator(16) });
4346 const point = need.point(pointCursor);
44− const onSubmit = () => {};
47+
48+ const canvasRef = useRef(null);
49+
50+ const { downloadSigil } = useSigilDownloader(canvasRef);
51+ const onSubmit = useCallback(
52+ async (values, form) => {
53+ const error = await downloadSigil(point, values.colors, values.size);
54+ if (error) {
55+ return { [FORM_ERROR]: error };
56+ }
57+ // reset on next tick
58+ setTimeout(() => form.reset(values));
59+ },
60+ [point, downloadSigil]
61+ );
4562 return (
4663 <View pop={pop}>
4764 <BridgeForm
@@ -69,7 +86,12 @@ export default function SigilGenerator() {
6986 <Flex.Item className="mb1">Urbit ID</Flex.Item>
7087 <Flex.Item className="mono">{ob.patp(point)}</Flex.Item>
7188 </Grid.Item>
72− <Grid.Item full as={NumberInput} name="size" label="Size (px)" />
89+ <Grid.Item
90+ fourth={1}
91+ as={NumberInput}
92+ name="size"
93+ label="Size (px)"
94+ />
7395 <Grid.Item
7496 full
7597 as={ColorInput}
@@ -95,6 +117,8 @@ export default function SigilGenerator() {
95117 </Grid>
96118 )}
97119 </BridgeForm>
120+
121+ <canvas style={{ display: 'none' }} ref={canvasRef} />
98122 </View>
99123 );
100124}