1import React, { useCallback, useState } from 'react';
2import { Grid, ErrorText } from 'indigo-react';
3import { get } from 'lodash';
4import { FORM_ERROR } from 'final-form';
6import useCopiable from 'lib/useCopiable';
7import useInviter from 'lib/useInviter';
9import ProgressButton from 'components/ProgressButton';
10import { ForwardButton } from 'components/Buttons';
11import NeedFundsNotice from 'components/NeedFundsNotice';
13import { hasErrors } from 'form/validators';
14import { WARNING } from 'form/helpers';
22const InviteUrl = ({ setSubmitting }) => {
23 const { txStatus, needFunds, invites, generateInvites } = useInviter();
25 const [error, setError] = useState();
27 const generateInvite = useCallback(async () => {
29 const { errors } = await generateInvites(1);
30 if (hasErrors(errors)) {
33 }, [generateInvites]);
35 const renderGenerateButton = useCallback(() => {
38 <Grid.Item full className="mt4 p3 bg-red3 white f5">
39 Error generating invite
51 onClick={() => generateInvite()}>
71 }, [txStatus, error, generateInvite]);
73 const url = `https://bridge.urbit.org/#${get(invites, '[0].ticket', '')}`;
75 const [doCopy, didCopy] = useCopiable(url);
78 <Grid.Item full as={Grid}>
79 {invites.length > 0 && (
81 <Grid.Item full className="b-gray3 b1 mv4 p1 flex flex-center">
82 <div className="flex1 ml1">{url}</div>
84 className="pv3 ph4 bg-black white"
85 onClick={() => doCopy()}>
86 {didCopy ? 'Copied' : 'Copy'}
90 Your invite link expires after consumption.
94 {invites.length === 0 && renderGenerateButton()}
95 {needFunds && <Grid.Item full as={NeedFundsNotice} {...needFunds} />}
97 <Grid.Item as={ErrorText}>
98 {error[FORM_ERROR] || error[WARNING]}
105export default InviteUrl;
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list