@@ -2,7 +2,7 @@ import React from 'react';
2import cn from 'classnames';
2import cn from 'classnames';
3import Maybe from 'folktale/maybe';
3import Maybe from 'folktale/maybe';
4import * as ob from 'urbit-ob';
4import * as ob from 'urbit-ob';
5−import { Grid, Flex } from 'indigo-react';
5+import { Grid, Flex, Text } from 'indigo-react';
6import { times } from 'lodash';
6import { times } from 'lodash';
8import usePointBirthday from 'lib/usePointBirthday';
8import usePointBirthday from 'lib/usePointBirthday';
@@ -16,13 +16,33 @@ const buildDate = char =>
16const kDateA = buildDate(kLoadingCharacter);
16const kDateA = buildDate(kLoadingCharacter);
17const kDateB = buildDate(kInterstitialCharacter);
17const kDateB = buildDate(kInterstitialCharacter);
19+const kTicketCharacterLength = 40;
20+const kPendingTicket = times(
21+ kTicketCharacterLength,
22+ () => kLoadingCharacter
25+ times(kTicketCharacterLength, () => kLoadingCharacter).join('') + '◆';
27+const kVisibleAddressCharacters = 20;
28+const kEmptyHalfAddress = times(kVisibleAddressCharacters, () => '<').join('');
29+const bufferAddressCharacters = times(40, () => '<').join('');
20 * point is Maybe<number>
32 * point is Maybe<number>
34+ * address is null | Maybe<string>
22−export default function Passport({ point, className }) {
36+export default function Passport({
23 const birthday = usePointBirthday(point.getOrElse(null));
43 const birthday = usePointBirthday(point.getOrElse(null));
24 const visualBirthday = birthday.matchWith({
44 const visualBirthday = birthday.matchWith({
25− Nothing: () => <Blinky a={kDateA} b={kDateB} />,
45+ Nothing: () => <Blinky a={kDateA} b={kDateB} delayed />,
26 Just: p => formatDots(p.value),
46 Just: p => formatDots(p.value),
@@ -35,18 +55,49 @@ export default function Passport({ point, className }) {
35 Just: p => p.value,
55 Just: p => p.value,
58+ const showTicket = ticket !== null;
59+ const showValidTicket = !!ticket;
60+ const visibleTicket = showValidTicket ? kValidTicket : kPendingTicket;
61+ const visibleAddress =
63+ `${address.matchWith({
64+ Nothing: () => kEmptyHalfAddress,
65+ Just: p => p.value.slice(0, kVisibleAddressCharacters),
66+ })}${bufferAddressCharacters}`;
39− <Grid gap={16} className={cn('bg-black r8 p7', className)}>
69+ <Grid gap={4} className={cn('bg-black r8 p7', className)}>
40 <Grid.Item cols={[1, 4]} className="bg-green">
70 <Grid.Item cols={[1, 4]} className="bg-green">
41 <MaybeSigil patp={name} size={64} margin={0} />
71 <MaybeSigil patp={name} size={64} margin={0} />
42 </Grid.Item>
72 </Grid.Item>
43 <Grid.Item as={Flex} cols={[4, 13]} col justify="between">
73 <Grid.Item as={Flex} cols={[4, 13]} col justify="between">
44 <Flex.Item className="mono white f5">{visualName}</Flex.Item>
74 <Flex.Item className="mono white f5">{visualName}</Flex.Item>
45 <Flex.Item as={Flex} col>
75 <Flex.Item as={Flex} col>
46− <Flex.Item className="mono gray4 f6 uppercase">Birth Time</Flex.Item>
76+ <Flex.Item as={Text} className="mono gray4 uppercase">
47− <Flex.Item className="mono gray4 f6">{visualBirthday}</Flex.Item>
79+ <Flex.Item as={Text} className="mono gray4">
48 </Flex.Item>
82 </Flex.Item>
49 </Grid.Item>
83 </Grid.Item>
84+ {!mini && showTicket && (
85+ <Grid.Item full className="mv3" as={Flex} col>
86+ <Flex.Item as={Text} className="mono gray4 uppercase">
91+ className={cn('mono gray4', {
92+ green3: showValidTicket,
96+ <Flex.Item as={Text} className="mono gray4">