You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
196 lines
5.2 KiB
TypeScript
196 lines
5.2 KiB
TypeScript
import React from 'react';
|
|
import { SessionIconButton, SessionIconSize, SessionIconType } from './icon';
|
|
import { Avatar } from '../Avatar';
|
|
import { PropsData as ConversationListItemPropsType } from '../ConversationListItem';
|
|
|
|
export enum SectionType {
|
|
Profile,
|
|
Message,
|
|
Contact,
|
|
Channel,
|
|
Settings,
|
|
Moon,
|
|
}
|
|
|
|
interface State {
|
|
avatarPath: string;
|
|
}
|
|
|
|
interface Props {
|
|
onSectionSelected: any;
|
|
selectedSection: SectionType;
|
|
conversations: Array<ConversationListItemPropsType> | undefined;
|
|
unreadMessageCount: number;
|
|
receivedFriendRequestCount: number;
|
|
}
|
|
|
|
export class ActionsPanel extends React.Component<Props, State> {
|
|
constructor(props: Props) {
|
|
super(props);
|
|
this.state = {
|
|
avatarPath: '',
|
|
};
|
|
|
|
this.editProfileHandle = this.editProfileHandle.bind(this);
|
|
}
|
|
|
|
public componentDidMount() {
|
|
// tslint:disable-next-line: no-backbone-get-set-outside-model
|
|
const ourNumber = window.storage.get('primaryDevicePubKey');
|
|
|
|
window.ConversationController.getOrCreateAndWait(ourNumber, 'private').then(
|
|
(conversation: any) => {
|
|
this.setState({
|
|
avatarPath: conversation.getAvatarPath(),
|
|
});
|
|
}
|
|
);
|
|
}
|
|
|
|
public Section = ({
|
|
isSelected,
|
|
onSelect,
|
|
type,
|
|
avatarPath,
|
|
notificationCount,
|
|
}: {
|
|
isSelected: boolean;
|
|
onSelect?: (event: SectionType) => void;
|
|
type: SectionType;
|
|
avatarPath?: string;
|
|
avatarColor?: string;
|
|
notificationCount?: number;
|
|
}) => {
|
|
const handleClick = onSelect
|
|
? () => {
|
|
type === SectionType.Profile
|
|
? /* tslint:disable-next-line:no-void-expression */
|
|
this.editProfileHandle()
|
|
: /* tslint:disable-next-line:no-void-expression */
|
|
onSelect(type);
|
|
}
|
|
: undefined;
|
|
|
|
if (type === SectionType.Profile) {
|
|
return (
|
|
<Avatar
|
|
avatarPath={avatarPath}
|
|
conversationType="direct"
|
|
i18n={window.i18n}
|
|
// tslint:disable-next-line: no-backbone-get-set-outside-model
|
|
phoneNumber={window.storage.get('primaryDevicePubKey')}
|
|
size={28}
|
|
onAvatarClick={handleClick}
|
|
/>
|
|
);
|
|
}
|
|
|
|
let iconType: SessionIconType;
|
|
switch (type) {
|
|
case SectionType.Message:
|
|
iconType = SessionIconType.ChatBubble;
|
|
break;
|
|
case SectionType.Contact:
|
|
iconType = SessionIconType.Users;
|
|
break;
|
|
case SectionType.Channel:
|
|
iconType = SessionIconType.Globe;
|
|
break;
|
|
case SectionType.Settings:
|
|
iconType = SessionIconType.Gear;
|
|
break;
|
|
case SectionType.Moon:
|
|
iconType = SessionIconType.Moon;
|
|
break;
|
|
|
|
default:
|
|
iconType = SessionIconType.Moon;
|
|
}
|
|
if (!isSelected) {
|
|
return (
|
|
<SessionIconButton
|
|
iconSize={SessionIconSize.Medium}
|
|
iconType={iconType}
|
|
notificationCount={notificationCount}
|
|
onClick={handleClick}
|
|
/>
|
|
);
|
|
} else {
|
|
return (
|
|
<SessionIconButton
|
|
iconSize={SessionIconSize.Medium}
|
|
iconType={iconType}
|
|
notificationCount={notificationCount}
|
|
onClick={handleClick}
|
|
isSelected={isSelected}
|
|
/>
|
|
);
|
|
}
|
|
};
|
|
|
|
public editProfileHandle() {
|
|
window.showEditProfileDialog((avatar: any) => {
|
|
this.setState({
|
|
avatarPath: avatar,
|
|
});
|
|
});
|
|
}
|
|
|
|
public render(): JSX.Element {
|
|
const {
|
|
selectedSection,
|
|
unreadMessageCount,
|
|
receivedFriendRequestCount,
|
|
} = this.props;
|
|
|
|
const isProfilePageSelected = selectedSection === SectionType.Profile;
|
|
const isMessagePageSelected = selectedSection === SectionType.Message;
|
|
const isContactPageSelected = selectedSection === SectionType.Contact;
|
|
const isChannelPageSelected = selectedSection === SectionType.Channel;
|
|
const isSettingsPageSelected = selectedSection === SectionType.Settings;
|
|
const isMoonPageSelected = selectedSection === SectionType.Moon;
|
|
|
|
return (
|
|
<div className="module-left-pane__sections-container">
|
|
<this.Section
|
|
type={SectionType.Profile}
|
|
avatarPath={this.state.avatarPath}
|
|
isSelected={isProfilePageSelected}
|
|
onSelect={this.handleSectionSelect}
|
|
/>
|
|
<this.Section
|
|
type={SectionType.Message}
|
|
isSelected={isMessagePageSelected}
|
|
onSelect={this.handleSectionSelect}
|
|
notificationCount={unreadMessageCount}
|
|
/>
|
|
<this.Section
|
|
type={SectionType.Channel}
|
|
isSelected={isChannelPageSelected}
|
|
onSelect={this.handleSectionSelect}
|
|
/>
|
|
<this.Section
|
|
type={SectionType.Contact}
|
|
isSelected={isContactPageSelected}
|
|
onSelect={this.handleSectionSelect}
|
|
notificationCount={receivedFriendRequestCount}
|
|
/>
|
|
<this.Section
|
|
type={SectionType.Settings}
|
|
isSelected={isSettingsPageSelected}
|
|
onSelect={this.handleSectionSelect}
|
|
/>
|
|
<this.Section
|
|
type={SectionType.Moon}
|
|
isSelected={isMoonPageSelected}
|
|
onSelect={this.handleSectionSelect}
|
|
/>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
private readonly handleSectionSelect = (section: SectionType): void => {
|
|
this.props.onSectionSelected(section);
|
|
};
|
|
}
|