@@ -0,0 +1,125 @@
1+import React, { useRef, useCallback } from 'react';
2+import { Grid, Flex } from 'indigo-react';
3+import * as ob from 'urbit-ob';
4+import { FORM_ERROR } from 'final-form';
5+import { colors } from 'indigo-tokens';
7+import { usePointCursor } from 'store/pointCursor';
9+import View from 'components/View';
10+import Sigil from 'components/Sigil';
12+import * as need from 'lib/need';
13+import { useLocalRouter } from 'lib/LocalRouter';
14+import useSigilDownloader from 'lib/useSigilDownloader';
16+import { composeValidator, buildNumberValidator } from 'form/validators';
17+import BridgeForm from 'form/BridgeForm';
18+import FormError from 'form/FormError';
19+import SubmitButton from 'form/SubmitButton';
20+import { NumberInput } from 'form/Inputs';
21+import ColorInput from 'form/ColorInput';
40+const FG_COLORS = [colors.black, colors.white];
42+export default function SigilGenerator() {
43+ const { pop } = useLocalRouter();
44+ const { pointCursor } = usePointCursor();
46+ const validate = composeValidator({ size: buildNumberValidator(16) });
47+ const point = need.point(pointCursor);
49+ const canvasRef = useRef(null);
51+ const { downloadSigil } = useSigilDownloader(canvasRef);
52+ const onSubmit = useCallback(
53+ async (values, form) => {
54+ const error = await downloadSigil(point, values.colors, values.size);
56+ return { [FORM_ERROR]: error };
58+ // reset on next tick
59+ setTimeout(() => form.reset(values));
61+ [point, downloadSigil]
73+ {({ handleSubmit, values }) => (
75+ <Grid.Item full className="f7">
78+ <Grid.Item fourth={1}>
81+ patp={ob.patp(point)}
82+ colors={[values.bgColor, values.fgColor]}
86+ <Grid.Item full as={Flex} col>
87+ <Flex.Item className="mb1">Urbit ID</Flex.Item>
88+ <Flex.Item className="mono">{ob.patp(point)}</Flex.Item>
100+ label="Background Color"
107+ label="Foreground Color"
113+ handleSubmit={handleSubmit}
117+ <Grid.Item full as={FormError} />
122+ <canvas style={{ display: 'none' }} ref={canvasRef} />