/* Copyright 2017 Vector Creations Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ import React from 'react'; import sdk from '../../../index'; import { _t } from '../../../languageHandler'; import MatrixClientPeg from '../../../MatrixClientPeg'; import DMRoomMap from '../../../utils/DMRoomMap'; import AccessibleButton from '../elements/AccessibleButton'; import Unread from '../../../Unread'; import classNames from 'classnames'; export default class ChatCreateOrReuseDialog extends React.Component { constructor(props) { super(props); this.onRoomTileClick = this.onRoomTileClick.bind(this); this.state = { tiles: [], profile: { displayName: null, avatarUrl: null, }, profileError: null, }; } componentWillMount() { const client = MatrixClientPeg.get(); const dmRoomMap = new DMRoomMap(client); const dmRooms = dmRoomMap.getDMRoomsForUserId(this.props.userId); const RoomTile = sdk.getComponent("rooms.RoomTile"); const tiles = []; for (const roomId of dmRooms) { const room = client.getRoom(roomId); if (room) { const me = room.getMember(client.credentials.userId); const highlight = ( room.getUnreadNotificationCount('highlight') > 0 || me.membership == "invite" ); tiles.push( , ); } } this.setState({ tiles: tiles, }); if (tiles.length === 0) { this.setState({ busyProfile: true, }); MatrixClientPeg.get().getProfileInfo(this.props.userId).done((resp) => { const profile = { displayName: resp.displayname, avatarUrl: null, }; if (resp.avatar_url) { profile.avatarUrl = MatrixClientPeg.get().mxcUrlToHttp( resp.avatar_url, 48, 48, "crop", ); } this.setState({ busyProfile: false, profile: profile, }); }, (err) => { console.error( 'Unable to get profile for user ' + this.props.userId + ':', err, ); this.setState({ busyProfile: false, profileError: err, }); }); } } onRoomTileClick(roomId) { this.props.onExistingRoomSelected(roomId); } render() { let title = ''; let content = null; if (this.state.tiles.length > 0) { // Show the existing rooms with a "+" to add a new dm title = _t('Create a new chat or reuse an existing one'); const labelClasses = classNames({ mx_MemberInfo_createRoom_label: true, mx_RoomTile_name: true, }); const startNewChat =
{ _t("Start new chat") }
; content =
{ _t('You already have existing direct chats with this user:') }
{ this.state.tiles } { startNewChat }
; } else { // Show the avatar, name and a button to confirm that a new chat is requested const BaseAvatar = sdk.getComponent('avatars.BaseAvatar'); const Spinner = sdk.getComponent('elements.Spinner'); title = _t('Start chatting'); let profile = null; if (this.state.busyProfile) { profile = ; } else if (this.state.profileError) { profile =
Unable to load profile information for { this.props.userId }
; } else { profile =
{this.state.profile.displayName || this.props.userId}
; } content =

{ _t('Click on the button below to start chatting!') }

{ profile }
; } const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); return ( { content } ); } } ChatCreateOrReuseDialog.propTyps = { userId: React.PropTypes.string.isRequired, // Called when clicking outside of the dialog onFinished: React.PropTypes.func.isRequired, onNewDMClick: React.PropTypes.func.isRequired, onExistingRoomSelected: React.PropTypes.func.isRequired, };