|
|
|
import { GroupUtils } from '../../session/utils';
|
|
|
|
import { UserUtil } from '../../util';
|
|
|
|
import { PubKey } from '../../session/types';
|
|
|
|
import React from 'react';
|
|
|
|
import { ConversationAttributes } from '../../../js/models/conversations';
|
|
|
|
type State = {
|
|
|
|
closedMemberConversations?: Array<ConversationAttributes>;
|
|
|
|
};
|
|
|
|
|
|
|
|
export function usingClosedConversationDetails(WrappedComponent: any) {
|
|
|
|
return class extends React.Component<any, State> {
|
|
|
|
constructor(props: any) {
|
|
|
|
super(props);
|
|
|
|
this.state = {
|
|
|
|
closedMemberConversations: undefined,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
public componentDidMount() {
|
|
|
|
void this.fetchClosedConversationDetails();
|
|
|
|
}
|
|
|
|
|
|
|
|
public componentDidUpdate() {
|
|
|
|
void this.fetchClosedConversationDetails();
|
|
|
|
}
|
|
|
|
|
|
|
|
public render() {
|
|
|
|
return (
|
|
|
|
<WrappedComponent
|
|
|
|
closedMemberConversations={this.state.closedMemberConversations}
|
|
|
|
{...this.props}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
private async fetchClosedConversationDetails() {
|
|
|
|
const {
|
|
|
|
isPublic,
|
|
|
|
type,
|
|
|
|
conversationType,
|
|
|
|
isGroup,
|
|
|
|
phoneNumber,
|
|
|
|
id,
|
|
|
|
} = this.props;
|
|
|
|
if (
|
|
|
|
!isPublic &&
|
|
|
|
(conversationType === 'group' || type === 'group' || isGroup)
|
|
|
|
) {
|
|
|
|
const groupId = id || phoneNumber;
|
|
|
|
const ourPrimary = await UserUtil.getPrimary();
|
|
|
|
let members = await GroupUtils.getGroupMembers(PubKey.cast(groupId));
|
|
|
|
|
|
|
|
const ourself = members.find(m => m.key !== ourPrimary.key);
|
|
|
|
// add ourself back at the back, so it's shown only if only 1 member and we are still a member
|
|
|
|
members = members.filter(m => m.key !== ourPrimary.key);
|
|
|
|
members.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));
|
|
|
|
if (ourself) {
|
|
|
|
members.push(ourPrimary);
|
|
|
|
}
|
|
|
|
// no need to forward more than 2 conversation for rendering the group avatar
|
|
|
|
members.slice(0, 2);
|
|
|
|
const membersConvos = await Promise.all(
|
|
|
|
members.map(
|
|
|
|
async m =>
|
|
|
|
(
|
|
|
|
await window.ConversationController.getOrCreateAndWait(
|
|
|
|
m.key,
|
|
|
|
'private'
|
|
|
|
)
|
|
|
|
).cachedProps
|
|
|
|
)
|
|
|
|
);
|
|
|
|
this.setState({ closedMemberConversations: membersConvos });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|