diff --git a/lib/actions/aux-user-actions.js b/lib/actions/aux-user-actions.js --- a/lib/actions/aux-user-actions.js +++ b/lib/actions/aux-user-actions.js @@ -4,4 +4,10 @@ const clearAuxUserFIDsActionType = 'CLEAR_AUX_USER_FIDS'; -export { setFarcasterFriendsFIDActionType, clearAuxUserFIDsActionType }; +const setPeerDeviceListsActionType = 'SET_PEER_DEVICE_LISTS'; + +export { + setFarcasterFriendsFIDActionType, + clearAuxUserFIDsActionType, + setPeerDeviceListsActionType, +}; diff --git a/lib/reducers/aux-user-reducer.js b/lib/reducers/aux-user-reducer.js --- a/lib/reducers/aux-user-reducer.js +++ b/lib/reducers/aux-user-reducer.js @@ -3,6 +3,7 @@ import { setFarcasterFriendsFIDActionType, clearAuxUserFIDsActionType, + setPeerDeviceListsActionType, } from '../actions/aux-user-actions.js'; import { setClientDBStoreActionType } from '../actions/client-db-store-actions.js'; import { @@ -80,6 +81,25 @@ auxUserStore: newAuxUserStore, auxUserStoreOperations: [], }; + } else if (action.type === setPeerDeviceListsActionType) { + const replaceOperations: ReplaceAuxUserInfoOperation[] = []; + for (const userID in action.payload.deviceLists) { + replaceOperations.push({ + type: 'replace_aux_user_info', + payload: { + id: userID, + auxUserInfo: { + ...state.auxUserInfos[userID], + fid: state.auxUserInfos[userID]?.fid ?? null, + deviceList: action.payload.deviceLists[userID], + }, + }, + }); + } + return { + auxUserStore: processStoreOps(state, replaceOperations), + auxUserStoreOperations: replaceOperations, + }; } return { diff --git a/lib/reducers/aux-user-reducer.test.js b/lib/reducers/aux-user-reducer.test.js --- a/lib/reducers/aux-user-reducer.test.js +++ b/lib/reducers/aux-user-reducer.test.js @@ -1,7 +1,11 @@ // @flow import { reduceAuxUserStore } from './aux-user-reducer.js'; -import { setFarcasterFriendsFIDActionType } from '../actions/aux-user-actions.js'; +import { + setFarcasterFriendsFIDActionType, + setPeerDeviceListsActionType, +} from '../actions/aux-user-actions.js'; +import type { RawDeviceList } from '../types/identity-service-types.js'; jest.mock('../utils/config.js'); @@ -35,4 +39,49 @@ }, }); }); + + it('should update aux user store with device lists for users', () => { + const oldAuxUserStore = { + auxUserInfos: { + userID_1: { + fid: 'farcasterID_1', + }, + }, + }; + + const deviceList1: RawDeviceList = { + devices: ['D1', 'D2'], + timestamp: 1, + }; + const deviceList2: RawDeviceList = { + devices: ['D3'], + timestamp: 1, + }; + + const updateAuxUserInfosAction = { + type: setPeerDeviceListsActionType, + payload: { + deviceLists: { + userID_1: deviceList1, + userID_2: deviceList2, + }, + }, + }; + + expect( + reduceAuxUserStore(oldAuxUserStore, updateAuxUserInfosAction) + .auxUserStore, + ).toEqual({ + auxUserInfos: { + userID_1: { + fid: 'farcasterID_1', + deviceList: deviceList1, + }, + userID_2: { + fid: null, + deviceList: deviceList2, + }, + }, + }); + }); }); diff --git a/lib/types/aux-user-types.js b/lib/types/aux-user-types.js --- a/lib/types/aux-user-types.js +++ b/lib/types/aux-user-types.js @@ -1,6 +1,10 @@ // @flow -import type { FarcasterUser, RawDeviceList } from './identity-service-types.js'; +import type { + FarcasterUser, + RawDeviceList, + UsersRawDeviceLists, +} from './identity-service-types.js'; export type AuxUserInfo = { +fid: ?string, deviceList?: RawDeviceList }; @@ -13,3 +17,7 @@ export type SetFarcasterFriendsFIDPayload = { +farcasterUsers: $ReadOnlyArray, }; + +export type SetPeerDeviceListsPayload = { + +deviceLists: UsersRawDeviceLists, +}; 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 @@ -221,6 +221,10 @@ +timestamp: number, }; +export type UsersRawDeviceLists = { + +[userID: string]: RawDeviceList, +}; + export type SignedDeviceList = { // JSON-stringified RawDeviceList +rawDeviceList: string, diff --git a/lib/types/redux-types.js b/lib/types/redux-types.js --- a/lib/types/redux-types.js +++ b/lib/types/redux-types.js @@ -19,6 +19,7 @@ import type { AuxUserStore, SetFarcasterFriendsFIDPayload, + SetPeerDeviceListsPayload, } from './aux-user-types.js'; import type { UpdateUserAvatarRequest, @@ -1393,6 +1394,10 @@ +type: 'CLEAR_AUX_USER_FIDS', +payload?: void, } + | { + +type: 'SET_PEER_DEVICE_LISTS', + +payload: SetPeerDeviceListsPayload, + } | { +type: 'OPS_PROCESSING_FINISHED_ACTION_TYPE', +payload?: void,