@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
1414limitations under the License.
1515*/
1616
17- import { sortBy , throttle } from "lodash" ;
17+ import { ListIteratee , Many , sortBy , throttle } from "lodash" ;
1818import { EventType , RoomType } from "matrix-js-sdk/src/@types/event" ;
1919import { Room } from "matrix-js-sdk/src/models/room" ;
2020import { MatrixEvent } from "matrix-js-sdk/src/models/event" ;
@@ -61,15 +61,18 @@ const partitionSpacesAndRooms = (arr: Room[]): [Room[], Room[]] => { // [spaces,
6161 } , [ [ ] , [ ] ] ) ;
6262} ;
6363
64- const getOrder = ( ev : MatrixEvent ) : string | null => {
65- const content = ev . getContent ( ) ;
66- if ( typeof content . order === "string" && Array . from ( content . order ) . every ( ( c : string ) => {
64+ // For sorting space children using a validated `order`, `m.room.create`'s `origin_server_ts`, `room_id`
65+ export const getOrder = ( order : string , creationTs : number , roomId : string ) : Array < Many < ListIteratee < any > > > => {
66+ let validatedOrder : string = null ;
67+
68+ if ( typeof order === "string" && Array . from ( order ) . every ( ( c : string ) => {
6769 const charCode = c . charCodeAt ( 0 ) ;
6870 return charCode >= 0x20 && charCode <= 0x7F ;
6971 } ) ) {
70- return content . order ;
72+ validatedOrder = order ;
7173 }
72- return null ;
74+
75+ return [ validatedOrder , creationTs , roomId ] ;
7376}
7477
7578const getRoomFn : FetchRoomFn = ( room : Room ) => {
@@ -200,9 +203,16 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> {
200203 private getChildren ( spaceId : string ) : Room [ ] {
201204 const room = this . matrixClient ?. getRoom ( spaceId ) ;
202205 const childEvents = room ?. currentState . getStateEvents ( EventType . SpaceChild ) . filter ( ev => ev . getContent ( ) ?. via ) ;
203- return sortBy ( childEvents , getOrder )
204- . map ( ev => this . matrixClient . getRoom ( ev . getStateKey ( ) ) )
205- . filter ( room => room ?. getMyMembership ( ) === "join" || room ?. getMyMembership ( ) === "invite" ) || [ ] ;
206+ return sortBy ( childEvents , ev => {
207+ const roomId = ev . getStateKey ( ) ;
208+ const childRoom = this . matrixClient ?. getRoom ( roomId ) ;
209+ const createTs = childRoom ?. currentState . getStateEvents ( EventType . RoomCreate , "" ) ?. getTs ( ) ;
210+ return getOrder ( ev . getContent ( ) . order , createTs , roomId ) ;
211+ } ) . map ( ev => {
212+ return this . matrixClient . getRoom ( ev . getStateKey ( ) ) ;
213+ } ) . filter ( room => {
214+ return room ?. getMyMembership ( ) === "join" || room ?. getMyMembership ( ) === "invite" ;
215+ } ) || [ ] ;
206216 }
207217
208218 public getChildRooms ( spaceId : string ) : Room [ ] {
0 commit comments