diff --git a/ts/components/session/SessionJoinableDefaultRooms.tsx b/ts/components/session/SessionJoinableDefaultRooms.tsx
index 250b8aaf9..a5fe30f71 100644
--- a/ts/components/session/SessionJoinableDefaultRooms.tsx
+++ b/ts/components/session/SessionJoinableDefaultRooms.tsx
@@ -1,4 +1,4 @@
-import React, { useContext, useEffect, useReducer, useState } from 'react';
+import React, { useEffect } from 'react';
import { useSelector } from 'react-redux';
import {
joinOpenGroupV2WithUIEvents,
@@ -11,6 +11,7 @@ import { Avatar, AvatarSize } from '../Avatar';
import { Flex } from '../basic/Flex';
import { PillContainer } from '../basic/PillContainer';
import { H3 } from '../basic/Text';
+import { SessionSpinner } from './SessionSpinner';
// tslint:disable: no-void-expression
export type JoinableRoomProps = {
@@ -83,29 +84,35 @@ const SessionJoinableRoomRow = (props: JoinableRoomProps) => {
export const SessionJoinableRooms = () => {
const joinableRooms = useSelector((state: StateType) => state.defaultRooms);
- if (!joinableRooms?.length) {
- window?.log?.info('no default joinable rooms yet');
+ if (!joinableRooms.inProgress && !joinableRooms.rooms?.length) {
+ window?.log?.info('no default joinable rooms yet and not in progress');
return <>>;
}
+ const componentToRender = joinableRooms.inProgress ? (
+
+ ) : (
+ joinableRooms.rooms.map(r => {
+ return (
+ {
+ void joinOpenGroupV2WithUIEvents(completeUrl, true, false);
+ }}
+ />
+ );
+ })
+ );
+
return (
-
- {joinableRooms.map(r => {
- return (
- {
- void joinOpenGroupV2WithUIEvents(completeUrl, true, false);
- }}
- />
- );
- })}
+
+ {componentToRender}
);
diff --git a/ts/opengroup/opengroupV2/ApiUtil.ts b/ts/opengroup/opengroupV2/ApiUtil.ts
index c1c63be42..7f9f5f20c 100644
--- a/ts/opengroup/opengroupV2/ApiUtil.ts
+++ b/ts/opengroup/opengroupV2/ApiUtil.ts
@@ -3,7 +3,7 @@ import { FileServerV2Request } from '../../fileserver/FileServerApiV2';
import { PubKey } from '../../session/types';
import { allowOnlyOneAtATime } from '../../session/utils/Promise';
import { fromBase64ToArrayBuffer, fromHex } from '../../session/utils/String';
-import { updateDefaultRooms } from '../../state/ducks/defaultRooms';
+import { updateDefaultRooms, updateDefaultRoomsInProgress } from '../../state/ducks/defaultRooms';
import { getCompleteUrlFromRoom } from '../utils/OpenGroupUtils';
import { parseOpenGroupV2 } from './JoinOpenGroupV2';
import { getAllRoomInfos } from './OpenGroupAPIV2';
@@ -120,7 +120,10 @@ const loadDefaultRoomsSingle = () =>
* This call will only run once at a time.
*/
export const loadDefaultRooms = async () => {
+ window.inboxStore?.dispatch(updateDefaultRoomsInProgress(true));
const allRooms: Array = await loadDefaultRoomsSingle();
+ window.inboxStore?.dispatch(updateDefaultRoomsInProgress(false));
+
if (allRooms !== undefined) {
window.inboxStore?.dispatch(updateDefaultRooms(allRooms));
}
diff --git a/ts/state/ducks/defaultRooms.tsx b/ts/state/ducks/defaultRooms.tsx
index a6c74aecb..6803f6dc9 100644
--- a/ts/state/ducks/defaultRooms.tsx
+++ b/ts/state/ducks/defaultRooms.tsx
@@ -1,9 +1,15 @@
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
import { OpenGroupV2InfoJoinable } from '../../opengroup/opengroupV2/ApiUtil';
-export type DefaultRoomsState = Array;
+export type DefaultRoomsState = {
+ rooms: Array;
+ inProgress: boolean;
+};
-const initialState: DefaultRoomsState = [];
+const initialState: DefaultRoomsState = {
+ rooms: [],
+ inProgress: false,
+};
/**
* Payload to dispatch to update the base64 data of a default room
@@ -21,12 +27,18 @@ const defaultRoomsSlice = createSlice({
initialState,
reducers: {
updateDefaultRooms(state, action) {
- window?.log?.warn('updating default rooms', action.payload);
- return action.payload as DefaultRoomsState;
+ window?.log?.info('updating default rooms', action.payload);
+ const rooms = action.payload as Array;
+ return { ...state, rooms: rooms };
+ },
+ updateDefaultRoomsInProgress(state, action) {
+ const inProgress = action.payload as boolean;
+ window?.log?.info('fetching default rooms inProgress?', action.payload);
+ return { ...state, inProgress };
},
updateDefaultBase64RoomData(state, action: PayloadAction) {
const payload = action.payload;
- const newState = state.map(room => {
+ const newRoomsState = state.rooms.map(room => {
if (room.id === payload.roomId) {
return {
...room,
@@ -35,11 +47,15 @@ const defaultRoomsSlice = createSlice({
}
return room;
});
- return newState;
+ return { ...state, rooms: newRoomsState };
},
},
});
const { actions, reducer } = defaultRoomsSlice;
-export const { updateDefaultRooms, updateDefaultBase64RoomData } = actions;
+export const {
+ updateDefaultRooms,
+ updateDefaultBase64RoomData,
+ updateDefaultRoomsInProgress,
+} = actions;
export const defaultRoomReducer = reducer;