1
0
mirror of https://github.com/matrix-org/matrix-js-sdk.git synced 2025-08-09 10:22:46 +03:00

Remove m.thread filter from relations API call (#3959)

* Remove m.thread filter from relations API call

We used MSC3981 to pass the recurse param to the /relations
endpoint so that we could get relations to events in a thread, but
we kept the rel_type filter on (as m.thread) so no second-order relations
would ever have been returned (a nested thread isn't a thing).

This removes the filter and does some filtering on the client side to
remove any events that shouldn't live in the threaded timeline (ie.
non-thread relations to the thread root event).

This should help fix stuck unreads because it will avoid the event that
the receipt refers to going missing (but only on HSes that support MSC3981).

For https://github.com/vector-im/element-web/issues/26718

* Fix import cycle

* Remove params from expected calls in tests to match

* Unused import
This commit is contained in:
David Baker
2023-12-14 10:39:43 +00:00
committed by GitHub
parent b7d45e83f8
commit f604ab2f63
5 changed files with 101 additions and 28 deletions

31
src/thread-utils.ts Normal file
View File

@@ -0,0 +1,31 @@
/*
Copyright 2023 The Matrix.org Foundation C.I.C.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import { THREAD_RELATION_TYPE } from "./models/thread";
import { IEvent } from "./models/event";
/**
* Returns a filter function for the /relations endpoint to filter out relations directly
* to the thread root event that should not live in the thread timeline
*
* @param threadId - the thread ID (ie. the event ID of the root event of the thread)
* @returns the filtered list of events
*/
export function getRelationsThreadFilter(threadId: string): (e: Partial<IEvent>) => boolean {
return (e: Partial<IEvent>) =>
e.content?.["m.relates_to"]?.event_id !== threadId ||
e.content?.["m.relates_to"]?.rel_type === THREAD_RELATION_TYPE.name;
}