diff --git a/index.html b/index.html index 289ef043..53f07818 100644 --- a/index.html +++ b/index.html @@ -1373,9 +1373,11 @@ this.props.state === 'contacts' ? : this.props.state === 'new-topic' ? @@ -1676,7 +1678,7 @@ e.preventDefault(); e.stopPropagation(); if (this.props.onSelected) { - this.props.onSelected(this.props.item, this.props.index, this.props.now); + this.props.onSelected(this.props.item, this.props.index, this.props.now, this.props.acs); } }, @@ -1704,8 +1706,8 @@ count ++; }); } - if (this.props.mode) { - badges.push({this.props.mode}); + if (this.props.showMode && this.props.acs) { + badges.push({this.props.acs.getMode()}); } return ( @@ -1816,8 +1818,11 @@ // Redraw without the deleted topic. this.resetContactList(); } else if (what === "acs") { - // Permissions changed. - console.log("app: permissions changed"); + // Permissions changed. If it's for the currently selected topic, + // update the views. + if (this.props.topicSelected === cont.topic) { + this.props.onAcsChange(cont.acs); + } } else { // TODO(gene): handle other types of notifications: // * ua -- user agent changes (may display a pictogram for mobile/desktop) @@ -1859,6 +1864,7 @@ render: function() { return ( You have no chats
¯\_(ツ)_/¯} topicSelected={this.props.topicSelected} @@ -1900,11 +1906,7 @@ var selected = showCheckmark ? (this.props.topicSelected.indexOf(key) > -1) : (this.props.topicSelected === key); - - var mode = this.props.showMode && c.acs ? c.acs.getMode() : null; - var badges = (key === me ? [{name:'you',color:'green'}] : null); - var comment = Array.isArray(c.private) ? c.private.join(", ") : c.private; contactNodes.push( @@ -1913,8 +1915,9 @@ avatar={makeImageUrl(c.public ? c.public.photo : null)} comment={comment} unread={this.props.showUnread ? c.unread : 0} - now={c.online} - mode={mode} + now={c.online && this.props.connected} + acs={c.acs} + showMode={this.props.showMode} badges={badges} showCheckmark={showCheckmark} selected={selected} @@ -2380,49 +2383,52 @@ tags: [], showMemberPanel: this.props.showMemberPanel, showPermissionEditorFor: undefined, - moreInfoExpanded: false + moreInfoExpanded: false, + previousMetaDesc: undefined, + previousSubsUpdated: undefined, + previousTagsUpdated: undefined }; }, componentWillMount: function() { - var topic = Tinode.getTopic(this.props.topic); + this.initInfoView(this.props); + }, + + initInfoView: function(props) { + console.log("InfoView.initInfoView"); + + var topic = Tinode.getTopic(props.topic); if (!topic) { return; } - var instance = this; - this.previousMetaDesc = topic.onMetaDesc; - topic.onMetaDesc = function(desc) { - instance.onMetaDesc(desc); - if (instance.previousMetaDesc) { - instance.previousMetaDesc(desc); - } - }; - this.previousSubsUpdated = topic.onSubsUpdated; - topic.onSubsUpdated = function(subs) { - instance.onSubsUpdated(subs); - if (instance.previousSubsUpdated) { - instance.previousSubsUpdated(subs); - } - } - this.resetDesc(topic); - this.resetSubs(topic); + this.previousMetaDesc = topic.onMetaDesc; + topic.onMetaDesc = this.onMetaDesc; + + this.previousSubsUpdated = topic.onSubsUpdated; + topic.onSubsUpdated = this.onSubsUpdated; if (topic.getType() === "grp") { - this.props.onInitFind(); - this.previousTagsUpdated = topic.onTagsUpdated; - topic.onTagsUpdated = function(tags) { - instance.onTagsUpdated(tags); - if (instance.previousTagsUpdated) { - instance.previousTagsUpdated(tags); - } - } - - this.setState({tags: topic.tags()}); + topic.onTagsUpdated = this.onTagsUpdated; } else { this.previousTagsUpdated = undefined; } + + this.resetInfoView(topic, props, true); + }, + + resetInfoView: function(topic, props, forced) { + console.log("InfoView.resetInfoView"); + + if (forced || this.props.topic != props.topic) { + this.resetDesc(topic, props); + this.resetSubs(topic, props); + + if (topic.getType() === "grp") { + this.setState({tags: topic.tags()}); + } + } }, componentWillUnmount: function() { @@ -2435,65 +2441,90 @@ topic.onTagsUpdated = this.previousTagsUpdated; }, - resetSubs: function(topic) { - var contacts = []; - if (topic.getType() === "p2p") { - // Fetch the other party in the p2p conversation. - var user2 = topic.subscriber(this.props.topic); - this.setState({ - modeGiven2: user2.acs.getGiven(), - modeWant2: user2.acs.getWant(), - }); - } else { - topic.subscribers(function(sub){ - contacts.push(sub); - }, this); - this.setState({ - contactList: contacts - }); + componentWillReceiveProps: function(props) { + console.log("InfoView.componentWillReceiveProps"); + var topic = Tinode.getTopic(props.topic); + if (!topic) { + return; } + this.resetInfoView(topic, props); }, - resetDesc: function(topic) { + resetSubs: function(topic, props) { + console.log("InfoView.resetSubs"); + var newState = {contactList: []}; + if (topic.getType() === "p2p") { + // Fetch the other party in the p2p conversation. + var user2 = topic.subscriber(props.topic); + newState.modeGiven2 = user2.acs.getGiven(); + newState.modeWant2 = user2.acs.getWant(); + } + topic.subscribers(function(sub){ + newState.contactList.push(sub); + }, this); + + this.setState(newState); + }, + + resetDesc: function(topic, props) { + console.log("InfoView.resetDesc"); + var defacs = topic.getDefaultAccess() || {}; - var acs = topic.getAccessMode(); this.setState({ - owner: acs && acs.isOwner(), - admin: acs && acs.isAdmin(), - sharer: acs && (acs.isAdmin() || acs.isSharer()), - muted: acs && acs.isMuted(), + owner: props.acs.isOwner(), + admin: props.acs.isAdmin(), + sharer: (props.acs.isAdmin() || props.acs.isSharer()), + muted: props.acs.isMuted(), fullName: topic.public ? topic.public.fn : undefined, avatar: makeImageUrl(topic.public ? topic.public.photo : null), private: topic.private, address: topic.name, groupTopic: (topic.getType() === "grp"), - access: acs.getMode(), - modeGiven: acs.getGiven(), - modeWant: acs.getWant(), + access: props.acs.getMode(), + modeGiven: props.acs.getGiven(), + modeWant: props.acs.getWant(), auth: defacs.auth, anon: defacs.anon }); }, onMetaDesc: function(desc) { + console.log("InfoView.onMetaDesc") var topic = Tinode.getTopic(this.props.topic); if (!topic) { return; } - this.resetDesc(topic); + this.resetDesc(topic, this.props); + + if (this.previousMetaDesc && this.previousMetaDesc != this.onMetaDesc) { + console.log("InfoView.previousMetaDesc"); + this.previousMetaDesc(desc); + } }, onSubsUpdated: function() { + console.log("InfoView.onSubsUpdated"); var topic = Tinode.getTopic(this.props.topic); if (!topic) { return; } - this.resetSubs(topic); + this.resetSubs(topic, this.props); + + if (this.previousSubsUpdated && this.previousSubsUpdated != this.onSubsUpdated) { + console.log("InfoView.previousSubsUpdated"); + this.previousSubsUpdated(); + } }, onTagsUpdated: function(tags) { + console.log("InfoView.onTagsUpdated"); this.setState({tags: tags}); + + if (this.previousTagsUpdated && this.previousTagsUpdated != this.onTagsUpdated) { + console.log("InfoView.previousTagsUpdated"); + this.previousTagsUpdated(); + } }, handleFullNameUpdate: function(fn) { @@ -3011,8 +3042,8 @@ title: '', avatar: null, scrollPosition: 0, - readOnly: false, - writeOnly: false, + readOnly: this.props.acs ? !this.props.acs.isWriter() : false, + writeOnly: this.props.acs ? !this.props.acs.isReader() : false, typingIndicator: false, imagePreview: null }; @@ -3090,7 +3121,7 @@ onlineSubs: subs, topic: props.topic, imagePreview: null, - scrollPosition: 0 + scrollPosition: 0, }); tryToResubscribe = true; @@ -3099,6 +3130,11 @@ clearTimeout(this.readTimer); } + this.setState({ + readOnly: props.acs ? !props.acs.isWriter() : false, + writeOnly: props.acs ? !props.acs.isReader() : false + }); + if (!topic.isSubscribed() && tryToResubscribe) { var instance = this; topic.subscribe(topic.startMetaQuery() @@ -3633,6 +3669,7 @@ liveConnection: navigator.onLine, topicSelected: '', topicSelectedOnline: false, + topicSelectedAcs: null, loginDisabled: false, displayMobile: (window.innerWidth <= MEDIA_BREAKPOINT), showInfoPanel: false, @@ -3719,7 +3756,7 @@ doLogin: function(login, password, cred) { var instance = this; cred = cred ? Tinode.addCredential(null, cred).cred : undefined; - // Try to login with token. If token is not available, try password. If no password, ask for it. + // Try to login with login/password. If they are not available, try token. If no token, ask for login/password. var promise = null; var token = Tinode.getLoginToken(); @@ -3850,14 +3887,17 @@ }, // User clicked on a contact in the side panel or deleted a contact. - handleTopicSelected: function(topicName, unused_index, online) { + handleTopicSelected: function(topicName, unused_index, online, acs) { if (topicName) { // Contact selected this.setState({ topicSelected: topicName, mobilePanel: 'topic-view', showInfoPanel: false, - topicSelectedOnline: online + topicSelectedOnline: online, + topicSelectedAcs: acs, + sidePanelSelected: 'contacts', + infoPanelShowMembers: Tinode.getTopicType(topicName) === "grp" }); } else { // Currently selected contact deleted @@ -3865,7 +3905,9 @@ topicSelected: null, mobilePanel: 'sidepanel', showInfoPanel: false, - topicSelectedOnline: false + topicSelectedOnline: false, + topicSelectedAcs: null, + infoPanelShowMembers: false }); } }, @@ -3873,6 +3915,11 @@ handleTopicSelectedOnline: function(online) { this.setState({topicSelectedOnline: online}); }, + // Permissions of a currently selected topic have been updated by server. + handleTopicSelectedAcs: function(acs) { + console.log("update acs in MessagesView", acs); + this.setState({topicSelectedAcs: acs}); + }, // In mobile view user requested to show sidepanel handleHideMessagesView: function() { @@ -3977,14 +4024,7 @@ } topic.subscribe(query.build(), setParams).then(function() { - instance.setState({ - topicSelected: topic.name, - topicSelectedOnline: false, - sidePanelSelected: 'contacts', - mobilePanel: 'topic-view', - showInfoPanel: false, - infoPanelShowMembers: peerName ? false : true - }); + instance.handleTopicSelected(topic.name, undefined, false, topic.getAccessMode()); }).catch(function(err) { instance.handleError(err.message, "err"); }); @@ -4183,6 +4223,7 @@ onNewTopic={this.handleNewTopic} onCancel={this.handleSidepanelCancel} onOnlineChange={this.handleTopicSelectedOnline} + onAcsChange={this.handleTopicSelectedAcs} onError={this.handleError} onValidateCredentials={this.handleValidateCredentialsRequest} @@ -4196,6 +4237,7 @@