From 4197b2be4ee4967ead3e8024563d97a3e94e541f Mon Sep 17 00:00:00 2001 From: f0x Date: Fri, 24 May 2019 14:38:50 +0200 Subject: [PATCH] fallback for room avatar media repo (disabled by default) --- app.js | 9 +++++++-- components/sidebar.js | 40 ++++++++++++++++++++++++++++++++++------ 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/app.js b/app.js index 016c747..0d791c7 100644 --- a/app.js +++ b/app.js @@ -21,7 +21,12 @@ let App = create({ displayName: "App", getInitialState: function() { - return {rooms: []} + return { + rooms: [], + options: { + fallbackMediaRepos: [] + } + } }, componentDidMount: function() { @@ -85,7 +90,7 @@ let App = create({ } return ( <> - {this.setState({roomId: roomId})}}/> + {this.setState({roomId: roomId})}}/> ) diff --git a/components/sidebar.js b/components/sidebar.js index 47c26e0..0200359 100644 --- a/components/sidebar.js +++ b/components/sidebar.js @@ -14,7 +14,8 @@ let RoomListItem = create({ getInitialState: function() { let room = this.props.content let client = this.props.properties.client - let avatar = + let jdenticon = + let avatarUrl let roomState = room.getLiveTimeline().getState('f') let avatarState = roomState.getStateEvents('m.room.avatar') @@ -22,14 +23,19 @@ let RoomListItem = create({ let event = avatarState[avatarState.length-1].event let hs = client.baseUrl let media_mxc = event.content.url.slice(6) - let url = `${hs}/_matrix/media/v1/thumbnail/${media_mxc}?width=128&height=128&method=scale` - avatar = + let path = `/_matrix/media/v1/thumbnail/${media_mxc}?width=128&height=128&method=scale` + avatarUrl = { + hs: hs, + path: path + } } return { filterName: room.name.toUpperCase(), unread: Math.random() > 0.7, - avatar: avatar + avatarUrl: avatarUrl, + jdenticon: jdenticon, + tries: 0 } }, @@ -37,6 +43,24 @@ let RoomListItem = create({ jdenticon.update(ref, this.props.content.roomId) }, + avatarFallback: function() { + // instead of falling back on jdenticon immediately, we can try + // a third-party homeserver's media repo + // this does come with trust issues, and is opt-in in settings + let fallbackMediaRepos = this.props.properties.options.fallbackMediaRepos + + if (this.state.tries < fallbackMediaRepos.length) { + let avatarUrl = this.state.avatarUrl + avatarUrl.hs = fallbackMediaRepos[this.state.tries] + this.setState({ + avatarUrl: avatarUrl, + tries: this.state.tries + 1 + }) + } else { + this.setState({avatarUrl: null, avatar: jdenticon}) + } + }, + setRef: function(ref) { if (ref == null) { return @@ -57,7 +81,11 @@ let RoomListItem = create({ className += " unread" } return
- {this.state.avatar} + {this.state.avatarUrl ? + + : + this.state.jdenticon + } {this.props.content.name}
} @@ -80,7 +108,7 @@ let Sidebar = create({ render: function() { return
- {this.props.selectRoom(roomId)}}/> + {this.props.selectRoom(roomId)}}/>
} })