store base64 defaut room avatar in redux

pull/1576/head
Audric Ackermann 4 years ago
parent ad26e50de1
commit 1720b6b627
No known key found for this signature in database
GPG Key ID: 999F434D76324AD4

@ -1,10 +1,11 @@
import React, { useEffect, useReducer, useState } from 'react'; import React, { useContext, useEffect, useReducer, useState } from 'react';
import { useSelector } from 'react-redux'; import { useSelector } from 'react-redux';
import { import {
joinOpenGroupV2WithUIEvents, joinOpenGroupV2WithUIEvents,
parseOpenGroupV2, parseOpenGroupV2,
} from '../../opengroup/opengroupV2/JoinOpenGroupV2'; } from '../../opengroup/opengroupV2/JoinOpenGroupV2';
import { downloadPreviewOpenGroupV2 } from '../../opengroup/opengroupV2/OpenGroupAPIV2'; import { downloadPreviewOpenGroupV2 } from '../../opengroup/opengroupV2/OpenGroupAPIV2';
import { updateDefaultBase64RoomData } from '../../state/ducks/defaultRooms';
import { StateType } from '../../state/reducer'; import { StateType } from '../../state/reducer';
import { Avatar, AvatarSize } from '../Avatar'; import { Avatar, AvatarSize } from '../Avatar';
import { Flex } from '../basic/Flex'; import { Flex } from '../basic/Flex';
@ -15,24 +16,35 @@ import { H3 } from '../basic/Text';
export type JoinableRoomProps = { export type JoinableRoomProps = {
completeUrl: string; completeUrl: string;
name: string; name: string;
roomId: string;
imageId?: string; imageId?: string;
onClick: (completeUrl: string) => void; onClick: (completeUrl: string) => void;
base64Data?: string;
}; };
const SessionJoinableRoomAvatar = (props: JoinableRoomProps) => { const SessionJoinableRoomAvatar = (props: JoinableRoomProps) => {
const [base64Data, setBase64Data] = useState('');
useEffect(() => { useEffect(() => {
try { try {
const parsedInfos = parseOpenGroupV2(props.completeUrl); const parsedInfos = parseOpenGroupV2(props.completeUrl);
if (parsedInfos) { if (parsedInfos) {
if (props.base64Data) {
return;
}
void downloadPreviewOpenGroupV2(parsedInfos) void downloadPreviewOpenGroupV2(parsedInfos)
.then(base64 => { .then(base64 => {
setBase64Data(base64 || ''); const payload = {
roomId: props.roomId,
base64Data: base64 || '',
};
window.inboxStore?.dispatch(updateDefaultBase64RoomData(payload));
}) })
.catch(e => { .catch(e => {
window.log.warn('downloadPreviewOpenGroupV2 failed', e); window.log.warn('downloadPreviewOpenGroupV2 failed', e);
setBase64Data(''); const payload = {
roomId: props.roomId,
base64Data: '',
};
window.inboxStore?.dispatch(updateDefaultBase64RoomData(payload));
}); });
} }
} catch (e) { } catch (e) {
@ -42,7 +54,7 @@ const SessionJoinableRoomAvatar = (props: JoinableRoomProps) => {
return ( return (
<Avatar <Avatar
size={AvatarSize.XS} size={AvatarSize.XS}
base64Data={base64Data} base64Data={props.base64Data}
{...props} {...props}
onAvatarClick={() => props.onClick(props.completeUrl)} onAvatarClick={() => props.onClick(props.completeUrl)}
/> />
@ -86,6 +98,8 @@ export const SessionJoinableRooms = () => {
key={r.id} key={r.id}
completeUrl={r.completeUrl} completeUrl={r.completeUrl}
name={r.name} name={r.name}
roomId={r.id}
base64Data={r.base64Data}
onClick={completeUrl => { onClick={completeUrl => {
void joinOpenGroupV2WithUIEvents(completeUrl, true); void joinOpenGroupV2WithUIEvents(completeUrl, true);
}} }}

@ -40,6 +40,7 @@ export type OpenGroupV2Info = {
export type OpenGroupV2InfoJoinable = OpenGroupV2Info & { export type OpenGroupV2InfoJoinable = OpenGroupV2Info & {
completeUrl: string; completeUrl: string;
base64Data?: string;
}; };
/** /**

@ -1,10 +1,18 @@
import { createSlice } from '@reduxjs/toolkit'; import { createSlice, PayloadAction } from '@reduxjs/toolkit';
import { OpenGroupV2InfoJoinable } from '../../opengroup/opengroupV2/ApiUtil'; import { OpenGroupV2InfoJoinable } from '../../opengroup/opengroupV2/ApiUtil';
export type DefaultRoomsState = Array<OpenGroupV2InfoJoinable>; export type DefaultRoomsState = Array<OpenGroupV2InfoJoinable>;
const initialState: DefaultRoomsState = []; const initialState: DefaultRoomsState = [];
/**
* Payload to dispatch to update the base64 data of a default room
*/
export type Base64Update = {
base64Data: string;
roomId: string;
};
/** /**
* This slice is the one holding the default joinable rooms fetched once in a while from the default opengroup v2 server. * This slice is the one holding the default joinable rooms fetched once in a while from the default opengroup v2 server.
*/ */
@ -16,9 +24,22 @@ const defaultRoomsSlice = createSlice({
window.log.warn('updating default rooms', action.payload); window.log.warn('updating default rooms', action.payload);
return action.payload as DefaultRoomsState; return action.payload as DefaultRoomsState;
}, },
updateDefaultBase64RoomData(state, action: PayloadAction<Base64Update>) {
const payload = action.payload;
const newState = state.map(room => {
if (room.id === payload.roomId) {
return {
...room,
base64Data: payload.base64Data,
};
}
return room;
});
return newState;
},
}, },
}); });
const { actions, reducer } = defaultRoomsSlice; const { actions, reducer } = defaultRoomsSlice;
export const { updateDefaultRooms } = actions; export const { updateDefaultRooms, updateDefaultBase64RoomData } = actions;
export const defaultRoomReducer = reducer; export const defaultRoomReducer = reducer;

Loading…
Cancel
Save