49 lines
1.3 KiB
TypeScript
49 lines
1.3 KiB
TypeScript
|
|
import { RoomMember } from 'matrix-js-sdk';
|
||
|
|
import { useMemo } from 'react';
|
||
|
|
|
||
|
|
export const MemberSort = {
|
||
|
|
Ascending: (a: RoomMember, b: RoomMember) =>
|
||
|
|
a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1,
|
||
|
|
Descending: (a: RoomMember, b: RoomMember) =>
|
||
|
|
a.name.toLowerCase() > b.name.toLowerCase() ? -1 : 1,
|
||
|
|
NewestFirst: (a: RoomMember, b: RoomMember) =>
|
||
|
|
(b.events.member?.getTs() ?? 0) - (a.events.member?.getTs() ?? 0),
|
||
|
|
Oldest: (a: RoomMember, b: RoomMember) =>
|
||
|
|
(a.events.member?.getTs() ?? 0) - (b.events.member?.getTs() ?? 0),
|
||
|
|
};
|
||
|
|
|
||
|
|
export type MemberSortFn = (a: RoomMember, b: RoomMember) => number;
|
||
|
|
|
||
|
|
export type MemberSortItem = {
|
||
|
|
name: string;
|
||
|
|
sortFn: MemberSortFn;
|
||
|
|
};
|
||
|
|
|
||
|
|
export const useMemberSortMenu = (): MemberSortItem[] =>
|
||
|
|
useMemo(
|
||
|
|
() => [
|
||
|
|
{
|
||
|
|
name: 'A to Z',
|
||
|
|
sortFn: MemberSort.Ascending,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: 'Z to A',
|
||
|
|
sortFn: MemberSort.Descending,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: 'Newest',
|
||
|
|
sortFn: MemberSort.NewestFirst,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: 'Oldest',
|
||
|
|
sortFn: MemberSort.Oldest,
|
||
|
|
},
|
||
|
|
],
|
||
|
|
[]
|
||
|
|
);
|
||
|
|
|
||
|
|
export const useMemberSort = (index: number, memberSort: MemberSortItem[]): MemberSortItem => {
|
||
|
|
const item = memberSort[index] ?? memberSort[0];
|
||
|
|
return item;
|
||
|
|
};
|