Skip to content
This repository has been archived by the owner on Sep 11, 2024. It is now read-only.

Live location share - explicitly stop beacons replaced beacons (PSG-544) #8933

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion src/stores/OwnBeaconStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ export class OwnBeaconStore extends AsyncStoreWithClient<OwnBeaconStoreState> {
* ids of live beacons
* ordered by creation time descending
*/
private liveBeaconIds = [];
private liveBeaconIds: BeaconIdentifier[] = [];
private locationInterval: number;
private geolocationError: GeolocationError | undefined;
private clearPositionWatch: ClearWatchCallback | undefined;
Expand Down Expand Up @@ -392,6 +392,12 @@ export class OwnBeaconStore extends AsyncStoreWithClient<OwnBeaconStoreState> {
roomId: Room['roomId'],
beaconInfoContent: MBeaconInfoEventContent,
): Promise<void> => {
// explicitly stop any live beacons this user has
// to ensure they remain stopped
// if the new replacing beacon is redacted
const existingLiveBeaconIdsForRoom = this.getLiveBeaconIds(roomId);
await Promise.all(existingLiveBeaconIdsForRoom.map(beaconId => this.stopBeacon(beaconId)));

// eslint-disable-next-line camelcase
const { event_id } = await this.matrixClient.unstable_createLiveBeacon(
roomId,
Expand Down
7 changes: 6 additions & 1 deletion test/components/views/location/LocationShareMenu-test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ describe('<LocationShareMenu />', () => {
}),
sendMessage: jest.fn(),
unstable_createLiveBeacon: jest.fn().mockResolvedValue({ event_id: '1' }),
unstable_setLiveBeacon: jest.fn().mockResolvedValue({ event_id: '1' }),
getVisibleRooms: jest.fn().mockReturnValue([]),
});

Expand Down Expand Up @@ -386,7 +387,7 @@ describe('<LocationShareMenu />', () => {
expect(getShareTypeOption(component, LocationShareType.Live).length).toBeFalsy();
});

it('creates beacon info event on submission', () => {
it('creates beacon info event on submission', async () => {
const onFinished = jest.fn();
const component = getComponent({ onFinished });

Expand All @@ -399,6 +400,9 @@ describe('<LocationShareMenu />', () => {
component.setProps({});
});

// flush stopping existing beacons promises
await flushPromisesWithFakeTimers();

expect(onFinished).toHaveBeenCalled();
const [eventRoomId, eventContent] = mockClient.unstable_createLiveBeacon.mock.calls[0];
expect(eventRoomId).toEqual(defaultProps.roomId);
Expand Down Expand Up @@ -429,6 +433,7 @@ describe('<LocationShareMenu />', () => {
component.setProps({});
});

await flushPromisesWithFakeTimers();
await flushPromisesWithFakeTimers();
await flushPromisesWithFakeTimers();

Expand Down
24 changes: 24 additions & 0 deletions test/stores/OwnBeaconStore-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1347,5 +1347,29 @@ describe('OwnBeaconStore', () => {
// didn't throw, no error log
expect(loggerErrorSpy).not.toHaveBeenCalled();
});

it('stops existing live beacon for room before creates new beacon', async () => {
// room1 already has a live beacon for alice
makeRoomsWithStateEvents([
alicesRoom1BeaconInfo,
alicesRoom2BeaconInfo,
]);
const store = await makeOwnBeaconStore();

const content = makeBeaconInfoContent(100);
await store.createLiveBeacon(room1Id, content);

// stop alicesRoom1BeaconInfo
expect(mockClient.unstable_setLiveBeacon).toHaveBeenCalledWith(
room1Id, expect.objectContaining({ live: false }),
);
// only called for beacons in room1, room2 beacon is not stopped
expect(mockClient.unstable_setLiveBeacon).toHaveBeenCalledTimes(1);

// new beacon created
expect(mockClient.unstable_createLiveBeacon).toHaveBeenCalledWith(
room1Id, content,
);
});
});
});