Page MenuHomePhorge

D11842.1768818989.diff
No OneTemporary

Size
4 KB
Referenced Files
None
Subscribers
None

D11842.1768818989.diff

diff --git a/lib/selectors/user-selectors.js b/lib/selectors/user-selectors.js
--- a/lib/selectors/user-selectors.js
+++ b/lib/selectors/user-selectors.js
@@ -194,6 +194,9 @@
},
);
+const getRelativeUserIDs = (state: BaseAppState<>): $ReadOnlyArray<string> =>
+ Object.keys(state.userStore.userInfos);
+
export {
userIDsToRelativeUserInfos,
getRelativeMemberInfos,
@@ -203,4 +206,5 @@
isLoggedInToKeyserver,
usersWithPersonalThreadSelector,
savedEmojiAvatarSelectorForCurrentUser,
+ getRelativeUserIDs,
};
diff --git a/lib/types/identity-service-types.js b/lib/types/identity-service-types.js
--- a/lib/types/identity-service-types.js
+++ b/lib/types/identity-service-types.js
@@ -220,6 +220,11 @@
+devices: $ReadOnlyArray<string>,
+timestamp: number,
};
+export const rawDeviceListValidator: TInterface<RawDeviceList> =
+ tShape<RawDeviceList>({
+ devices: t.list(t.String),
+ timestamp: t.Number,
+ });
export type UsersRawDeviceLists = {
+[userID: string]: RawDeviceList,
diff --git a/lib/utils/device-list-utils.js b/lib/utils/device-list-utils.js
new file mode 100644
--- /dev/null
+++ b/lib/utils/device-list-utils.js
@@ -0,0 +1,26 @@
+// @flow
+
+import { assertWithValidator } from './validation-utils.js';
+import type {
+ UsersRawDeviceLists,
+ UsersSignedDeviceLists,
+} from '../types/identity-service-types.js';
+import { rawDeviceListValidator } from '../types/identity-service-types.js';
+
+function convertSignedDeviceListsToRawDeviceLists(
+ signedDeviceLists: UsersSignedDeviceLists,
+): UsersRawDeviceLists {
+ let usersRawDeviceLists: UsersRawDeviceLists = {};
+ for (const userID in signedDeviceLists) {
+ usersRawDeviceLists = {
+ ...usersRawDeviceLists,
+ [userID]: assertWithValidator(
+ JSON.parse(signedDeviceLists[userID].rawDeviceList),
+ rawDeviceListValidator,
+ ),
+ };
+ }
+ return usersRawDeviceLists;
+}
+
+export { convertSignedDeviceListsToRawDeviceLists };
diff --git a/web/settings/account-settings.react.js b/web/settings/account-settings.react.js
--- a/web/settings/account-settings.react.js
+++ b/web/settings/account-settings.react.js
@@ -2,10 +2,12 @@
import * as React from 'react';
+import { setPeerDeviceListsActionType } from 'lib/actions/aux-user-actions.js';
import { useLogOut, logOutActionTypes } from 'lib/actions/user-actions.js';
import { useModalContext } from 'lib/components/modal-provider.react.js';
import SWMansionIcon from 'lib/components/swmansion-icon.react.js';
import { useStringForUser } from 'lib/hooks/ens-cache.js';
+import { getRelativeUserIDs } from 'lib/selectors/user-selectors.js';
import { accountHasPassword } from 'lib/shared/account-utils.js';
import { IdentityClientContext } from 'lib/shared/identity-client-context.js';
import { useTunnelbroker } from 'lib/tunnelbroker/tunnelbroker-context.js';
@@ -13,7 +15,9 @@
createOlmSessionsWithOwnDevices,
getContentSigningKey,
} from 'lib/utils/crypto-utils.js';
+import { convertSignedDeviceListsToRawDeviceLists } from 'lib/utils/device-list-utils.js';
import { useDispatchActionPromise } from 'lib/utils/redux-promise-utils.js';
+import { useDispatch } from 'lib/utils/redux-utils.js';
import css from './account-settings.css';
import AppearanceChangeModal from './appearance-change-modal.react.js';
@@ -109,6 +113,30 @@
}
}, [identityContext, sendMessage]);
+ const dispatch = useDispatch();
+ const relativeUserIDs = useSelector(getRelativeUserIDs);
+
+ const onCreateInitialPeerList = React.useCallback(async () => {
+ if (!identityContext) {
+ return;
+ }
+
+ try {
+ const userDeviceLists =
+ await identityContext.identityClient.getDeviceListsForUsers(
+ relativeUserIDs,
+ );
+ const usersRawDeviceLists =
+ convertSignedDeviceListsToRawDeviceLists(userDeviceLists);
+ dispatch({
+ type: setPeerDeviceListsActionType,
+ payload: { deviceLists: usersRawDeviceLists },
+ });
+ } catch (e) {
+ console.log(`Error creating initial peer list: ${e.message}`);
+ }
+ }, [dispatch, identityContext, relativeUserIDs]);
+
const openBackupTestRestoreModal = React.useCallback(
() => pushModal(<BackupTestRestoreModal onClose={popModal} />),
[popModal, pushModal],
@@ -185,6 +213,12 @@
<p className={css.buttonText}>Create</p>
</Button>
</li>
+ <li>
+ <span>Create initial peer list</span>
+ <Button variant="text" onClick={onCreateInitialPeerList}>
+ <p className={css.buttonText}>Create</p>
+ </Button>
+ </li>
</ul>
</div>
</div>

File Metadata

Mime Type
text/plain
Expires
Mon, Jan 19, 10:36 AM (16 h, 49 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5955914
Default Alt Text
D11842.1768818989.diff (4 KB)

Event Timeline