Show badges on group invites screen
This commit is contained in:
parent
864f9c8631
commit
e5b40aa2ef
3 changed files with 41 additions and 4 deletions
|
@ -14,6 +14,8 @@ import type { PropsType } from './PendingInvites';
|
||||||
import { PendingInvites } from './PendingInvites';
|
import { PendingInvites } from './PendingInvites';
|
||||||
import type { ConversationType } from '../../../state/ducks/conversations';
|
import type { ConversationType } from '../../../state/ducks/conversations';
|
||||||
import { getDefaultConversation } from '../../../test-both/helpers/getDefaultConversation';
|
import { getDefaultConversation } from '../../../test-both/helpers/getDefaultConversation';
|
||||||
|
import { getFakeBadge } from '../../../test-both/helpers/getFakeBadge';
|
||||||
|
import { StorybookThemeContext } from '../../../../.storybook/StorybookThemeContext';
|
||||||
|
|
||||||
const i18n = setupI18n('en', enMessages);
|
const i18n = setupI18n('en', enMessages);
|
||||||
|
|
||||||
|
@ -44,9 +46,10 @@ const conversation: ConversationType = {
|
||||||
|
|
||||||
const OUR_UUID = UUID.generate().toString();
|
const OUR_UUID = UUID.generate().toString();
|
||||||
|
|
||||||
const createProps = (): PropsType => ({
|
const useProps = (overrideProps: Partial<PropsType> = {}): PropsType => ({
|
||||||
approvePendingMembership: action('approvePendingMembership'),
|
approvePendingMembership: action('approvePendingMembership'),
|
||||||
conversation,
|
conversation,
|
||||||
|
getPreferredBadge: () => undefined,
|
||||||
i18n,
|
i18n,
|
||||||
ourUuid: OUR_UUID,
|
ourUuid: OUR_UUID,
|
||||||
pendingApprovalMemberships: times(5, () => ({
|
pendingApprovalMemberships: times(5, () => ({
|
||||||
|
@ -67,10 +70,18 @@ const createProps = (): PropsType => ({
|
||||||
})),
|
})),
|
||||||
],
|
],
|
||||||
revokePendingMemberships: action('revokePendingMemberships'),
|
revokePendingMemberships: action('revokePendingMemberships'),
|
||||||
|
theme: React.useContext(StorybookThemeContext),
|
||||||
|
...overrideProps,
|
||||||
});
|
});
|
||||||
|
|
||||||
story.add('Basic', () => {
|
story.add('Basic', () => {
|
||||||
const props = createProps();
|
const props = useProps();
|
||||||
|
|
||||||
|
return <PendingInvites {...props} />;
|
||||||
|
});
|
||||||
|
|
||||||
|
story.add('With badges', () => {
|
||||||
|
const props = useProps({ getPreferredBadge: () => getFakeBadge() });
|
||||||
|
|
||||||
return <PendingInvites {...props} />;
|
return <PendingInvites {...props} />;
|
||||||
});
|
});
|
||||||
|
|
|
@ -6,7 +6,8 @@ import classNames from 'classnames';
|
||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
|
|
||||||
import type { ConversationType } from '../../../state/ducks/conversations';
|
import type { ConversationType } from '../../../state/ducks/conversations';
|
||||||
import type { LocalizerType } from '../../../types/Util';
|
import type { LocalizerType, ThemeType } from '../../../types/Util';
|
||||||
|
import type { PreferredBadgeSelectorType } from '../../../state/selectors/badges';
|
||||||
import type { UUIDStringType } from '../../../types/UUID';
|
import type { UUIDStringType } from '../../../types/UUID';
|
||||||
import { Avatar } from '../../Avatar';
|
import { Avatar } from '../../Avatar';
|
||||||
import { ConfirmationDialog } from '../../ConfirmationDialog';
|
import { ConfirmationDialog } from '../../ConfirmationDialog';
|
||||||
|
@ -16,12 +17,14 @@ import { ConversationDetailsIcon, IconType } from './ConversationDetailsIcon';
|
||||||
|
|
||||||
export type PropsType = {
|
export type PropsType = {
|
||||||
readonly conversation?: ConversationType;
|
readonly conversation?: ConversationType;
|
||||||
|
readonly getPreferredBadge: PreferredBadgeSelectorType;
|
||||||
readonly i18n: LocalizerType;
|
readonly i18n: LocalizerType;
|
||||||
readonly ourUuid: UUIDStringType;
|
readonly ourUuid: UUIDStringType;
|
||||||
readonly pendingApprovalMemberships: ReadonlyArray<GroupV2RequestingMembership>;
|
readonly pendingApprovalMemberships: ReadonlyArray<GroupV2RequestingMembership>;
|
||||||
readonly pendingMemberships: ReadonlyArray<GroupV2PendingMembership>;
|
readonly pendingMemberships: ReadonlyArray<GroupV2PendingMembership>;
|
||||||
readonly approvePendingMembership: (conversationId: string) => void;
|
readonly approvePendingMembership: (conversationId: string) => void;
|
||||||
readonly revokePendingMemberships: (conversationIds: Array<string>) => void;
|
readonly revokePendingMemberships: (conversationIds: Array<string>) => void;
|
||||||
|
readonly theme: ThemeType;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type GroupV2PendingMembership = {
|
export type GroupV2PendingMembership = {
|
||||||
|
@ -54,11 +57,13 @@ type StagedMembershipType = {
|
||||||
export const PendingInvites: React.ComponentType<PropsType> = ({
|
export const PendingInvites: React.ComponentType<PropsType> = ({
|
||||||
approvePendingMembership,
|
approvePendingMembership,
|
||||||
conversation,
|
conversation,
|
||||||
|
getPreferredBadge,
|
||||||
i18n,
|
i18n,
|
||||||
ourUuid,
|
ourUuid,
|
||||||
pendingMemberships,
|
pendingMemberships,
|
||||||
pendingApprovalMemberships,
|
pendingApprovalMemberships,
|
||||||
revokePendingMemberships,
|
revokePendingMemberships,
|
||||||
|
theme,
|
||||||
}) => {
|
}) => {
|
||||||
if (!conversation || !ourUuid) {
|
if (!conversation || !ourUuid) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
|
@ -119,19 +124,23 @@ export const PendingInvites: React.ComponentType<PropsType> = ({
|
||||||
{selectedTab === Tab.Requests ? (
|
{selectedTab === Tab.Requests ? (
|
||||||
<MembersPendingAdminApproval
|
<MembersPendingAdminApproval
|
||||||
conversation={conversation}
|
conversation={conversation}
|
||||||
|
getPreferredBadge={getPreferredBadge}
|
||||||
i18n={i18n}
|
i18n={i18n}
|
||||||
memberships={pendingApprovalMemberships}
|
memberships={pendingApprovalMemberships}
|
||||||
setStagedMemberships={setStagedMemberships}
|
setStagedMemberships={setStagedMemberships}
|
||||||
|
theme={theme}
|
||||||
/>
|
/>
|
||||||
) : null}
|
) : null}
|
||||||
{selectedTab === Tab.Pending ? (
|
{selectedTab === Tab.Pending ? (
|
||||||
<MembersPendingProfileKey
|
<MembersPendingProfileKey
|
||||||
conversation={conversation}
|
conversation={conversation}
|
||||||
|
getPreferredBadge={getPreferredBadge}
|
||||||
i18n={i18n}
|
i18n={i18n}
|
||||||
members={conversation.sortedGroupMembers || []}
|
members={conversation.sortedGroupMembers || []}
|
||||||
memberships={pendingMemberships}
|
memberships={pendingMemberships}
|
||||||
ourUuid={ourUuid}
|
ourUuid={ourUuid}
|
||||||
setStagedMemberships={setStagedMemberships}
|
setStagedMemberships={setStagedMemberships}
|
||||||
|
theme={theme}
|
||||||
/>
|
/>
|
||||||
) : null}
|
) : null}
|
||||||
|
|
||||||
|
@ -290,14 +299,18 @@ function getConfirmationMessage({
|
||||||
|
|
||||||
function MembersPendingAdminApproval({
|
function MembersPendingAdminApproval({
|
||||||
conversation,
|
conversation,
|
||||||
|
getPreferredBadge,
|
||||||
i18n,
|
i18n,
|
||||||
memberships,
|
memberships,
|
||||||
setStagedMemberships,
|
setStagedMemberships,
|
||||||
|
theme,
|
||||||
}: Readonly<{
|
}: Readonly<{
|
||||||
conversation: ConversationType;
|
conversation: ConversationType;
|
||||||
|
getPreferredBadge: PreferredBadgeSelectorType;
|
||||||
i18n: LocalizerType;
|
i18n: LocalizerType;
|
||||||
memberships: ReadonlyArray<GroupV2RequestingMembership>;
|
memberships: ReadonlyArray<GroupV2RequestingMembership>;
|
||||||
setStagedMemberships: (stagedMembership: Array<StagedMembershipType>) => void;
|
setStagedMemberships: (stagedMembership: Array<StagedMembershipType>) => void;
|
||||||
|
theme: ThemeType;
|
||||||
}>) {
|
}>) {
|
||||||
return (
|
return (
|
||||||
<PanelSection>
|
<PanelSection>
|
||||||
|
@ -307,9 +320,11 @@ function MembersPendingAdminApproval({
|
||||||
key={membership.member.id}
|
key={membership.member.id}
|
||||||
icon={
|
icon={
|
||||||
<Avatar
|
<Avatar
|
||||||
|
badge={getPreferredBadge(membership.member.badges)}
|
||||||
conversationType="direct"
|
conversationType="direct"
|
||||||
size={32}
|
size={32}
|
||||||
i18n={i18n}
|
i18n={i18n}
|
||||||
|
theme={theme}
|
||||||
{...membership.member}
|
{...membership.member}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
|
@ -364,13 +379,17 @@ function MembersPendingProfileKey({
|
||||||
memberships,
|
memberships,
|
||||||
ourUuid,
|
ourUuid,
|
||||||
setStagedMemberships,
|
setStagedMemberships,
|
||||||
|
getPreferredBadge,
|
||||||
|
theme,
|
||||||
}: Readonly<{
|
}: Readonly<{
|
||||||
conversation: ConversationType;
|
conversation: ConversationType;
|
||||||
|
getPreferredBadge: PreferredBadgeSelectorType;
|
||||||
i18n: LocalizerType;
|
i18n: LocalizerType;
|
||||||
members: Array<ConversationType>;
|
members: Array<ConversationType>;
|
||||||
memberships: ReadonlyArray<GroupV2PendingMembership>;
|
memberships: ReadonlyArray<GroupV2PendingMembership>;
|
||||||
ourUuid: string;
|
ourUuid: string;
|
||||||
setStagedMemberships: (stagedMembership: Array<StagedMembershipType>) => void;
|
setStagedMemberships: (stagedMembership: Array<StagedMembershipType>) => void;
|
||||||
|
theme: ThemeType;
|
||||||
}>) {
|
}>) {
|
||||||
const groupedPendingMemberships = _.groupBy(
|
const groupedPendingMemberships = _.groupBy(
|
||||||
memberships,
|
memberships,
|
||||||
|
@ -397,9 +416,11 @@ function MembersPendingProfileKey({
|
||||||
key={membership.member.id}
|
key={membership.member.id}
|
||||||
icon={
|
icon={
|
||||||
<Avatar
|
<Avatar
|
||||||
|
badge={getPreferredBadge(membership.member.badges)}
|
||||||
conversationType="direct"
|
conversationType="direct"
|
||||||
size={32}
|
size={32}
|
||||||
i18n={i18n}
|
i18n={i18n}
|
||||||
|
theme={theme}
|
||||||
{...membership.member}
|
{...membership.member}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
|
@ -431,9 +452,11 @@ function MembersPendingProfileKey({
|
||||||
key={member.id}
|
key={member.id}
|
||||||
icon={
|
icon={
|
||||||
<Avatar
|
<Avatar
|
||||||
|
badge={getPreferredBadge(member.badges)}
|
||||||
conversationType="direct"
|
conversationType="direct"
|
||||||
size={32}
|
size={32}
|
||||||
i18n={i18n}
|
i18n={i18n}
|
||||||
|
theme={theme}
|
||||||
{...member}
|
{...member}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,8 @@ import type { PropsType } from '../../components/conversation/conversation-detai
|
||||||
import { PendingInvites } from '../../components/conversation/conversation-details/PendingInvites';
|
import { PendingInvites } from '../../components/conversation/conversation-details/PendingInvites';
|
||||||
import type { StateType } from '../reducer';
|
import type { StateType } from '../reducer';
|
||||||
|
|
||||||
import { getIntl } from '../selectors/user';
|
import { getIntl, getTheme } from '../selectors/user';
|
||||||
|
import { getPreferredBadgeSelector } from '../selectors/badges';
|
||||||
import {
|
import {
|
||||||
getConversationByIdSelector,
|
getConversationByIdSelector,
|
||||||
getConversationByUuidSelector,
|
getConversationByUuidSelector,
|
||||||
|
@ -40,7 +41,9 @@ const mapStateToProps = (
|
||||||
...props,
|
...props,
|
||||||
...getGroupMemberships(conversation, conversationByUuidSelector),
|
...getGroupMemberships(conversation, conversationByUuidSelector),
|
||||||
conversation,
|
conversation,
|
||||||
|
getPreferredBadge: getPreferredBadgeSelector(state),
|
||||||
i18n: getIntl(state),
|
i18n: getIntl(state),
|
||||||
|
theme: getTheme(state),
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue