-
Notifications
You must be signed in to change notification settings - Fork 26
/
Copy pathOnboardingInvite.tsx
119 lines (108 loc) · 3.14 KB
/
OnboardingInvite.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import { AppInvite } from '@tloncorp/shared';
import * as db from '@tloncorp/shared/db';
import React, { ComponentProps } from 'react';
import { AppDataContextProvider } from '../../contexts';
import { getDisplayName } from '../../utils';
import { ListItem } from '../ListItem';
interface GroupShim {
id: string;
title: string | undefined;
iconImage: string | undefined;
iconImageColor: string | undefined;
}
export const OnboardingInviteBlock = React.memo(function OnboardingInviteBlock({
metadata,
...rest
}: { metadata: AppInvite } & ComponentProps<typeof ListItem>) {
const {
inviterUserId,
invitedGroupId,
inviterNickname,
inviterAvatarImage,
inviterColor,
invitedGroupTitle,
invitedGroupIconImageUrl,
invitedGroupiconImageColor,
inviteType,
} = metadata;
const isValidUserInvite = inviterUserId && inviteType === 'user';
const isValidGroupInvite = inviterUserId && invitedGroupId;
if (!isValidUserInvite && !isValidGroupInvite) {
return null;
}
const inviter = {
id: inviterUserId,
nickname: inviterNickname,
avatarImage: inviterAvatarImage,
color: inviterColor || undefined,
} as db.Contact;
const groupShim = {
id: invitedGroupId,
title: invitedGroupTitle,
iconImage: invitedGroupIconImageUrl,
iconImageColor: invitedGroupiconImageColor,
} as GroupShim;
if (inviteType === 'user') {
return <UserInvite inviter={inviter} {...rest} />;
}
return <GroupInvite groupShim={groupShim} inviter={inviter} {...rest} />;
});
function UserInvite({
inviter,
...rest
}: { inviter: db.Contact } & ComponentProps<typeof ListItem>) {
return (
// provider needed to support calm settings usage down the tree
<AppDataContextProvider>
<ListItem
backgroundColor="$background"
borderColor="$border"
borderWidth={1}
alignItems="center"
{...rest}
>
<ListItem.ContactIcon
contactId={inviter.id}
contactOverride={inviter}
/>
<ListItem.MainContent>
<ListItem.Title>{getDisplayName(inviter)}</ListItem.Title>
<ListItem.Subtitle>Sent you a personal invite</ListItem.Subtitle>
</ListItem.MainContent>
</ListItem>
</AppDataContextProvider>
);
}
function GroupInvite({
groupShim,
inviter,
...rest
}: { groupShim: GroupShim; inviter: db.Contact } & ComponentProps<
typeof ListItem
>) {
return (
// provider needed to support calm settings usage down the tree
<AppDataContextProvider>
<ListItem
backgroundColor="$background"
borderColor="$border"
borderWidth={1}
alignItems="center"
{...rest}
>
<ListItem.GroupIcon
model={groupShim}
backgroundColor={groupShim.iconImageColor ?? '$secondaryBorder'}
/>
<ListItem.MainContent>
<ListItem.Title>
{groupShim.title ? `Join ${groupShim.title}` : `Join a Groupchat`}
</ListItem.Title>
<ListItem.Subtitle>
Invited by {getDisplayName(inviter)}
</ListItem.Subtitle>
</ListItem.MainContent>
</ListItem>
</AppDataContextProvider>
);
}