Fix aci value in mentions
This commit is contained in:
parent
e56d0ed9fb
commit
3e7e8328f7
5 changed files with 111 additions and 76 deletions
|
@ -5,9 +5,37 @@ import Fuse from 'fuse.js';
|
|||
import { get } from 'lodash';
|
||||
|
||||
import type { ConversationType } from '../state/ducks/conversations';
|
||||
import type { ServiceIdString } from '../types/ServiceId';
|
||||
import type { AciString } from '../types/ServiceId';
|
||||
import { isAciString } from '../types/ServiceId';
|
||||
import { filter, map } from '../util/iterables';
|
||||
import { removeDiacritics } from '../util/removeDiacritics';
|
||||
import { isNotNil } from '../util/isNotNil';
|
||||
|
||||
export type MemberType = Omit<ConversationType, 'serviceId'> &
|
||||
Readonly<{
|
||||
aci: AciString;
|
||||
}>;
|
||||
|
||||
function toMember({
|
||||
serviceId,
|
||||
...restOfConvo
|
||||
}: ConversationType): MemberType | undefined {
|
||||
if (!isAciString(serviceId)) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
return {
|
||||
...restOfConvo,
|
||||
aci: serviceId,
|
||||
};
|
||||
}
|
||||
|
||||
// Exported for testing
|
||||
export function _toMembers(
|
||||
conversations: ReadonlyArray<ConversationType>
|
||||
): Array<MemberType> {
|
||||
return conversations.map(toMember).filter(isNotNil);
|
||||
}
|
||||
|
||||
const FUSE_OPTIONS = {
|
||||
location: 0,
|
||||
|
@ -17,7 +45,7 @@ const FUSE_OPTIONS = {
|
|||
minMatchCharLength: 1,
|
||||
keys: ['name', 'firstName', 'profileName', 'title'],
|
||||
getFn(
|
||||
conversation: Readonly<ConversationType>,
|
||||
conversation: Readonly<MemberType>,
|
||||
path: string | Array<string>
|
||||
): ReadonlyArray<string> | string {
|
||||
// It'd be nice to avoid this cast, but Fuse's types don't allow it.
|
||||
|
@ -40,21 +68,21 @@ const FUSE_OPTIONS = {
|
|||
};
|
||||
|
||||
export class MemberRepository {
|
||||
private members: ReadonlyArray<MemberType>;
|
||||
private isFuseReady = false;
|
||||
|
||||
private fuse: Fuse<ConversationType> = new Fuse<ConversationType>(
|
||||
[],
|
||||
FUSE_OPTIONS
|
||||
);
|
||||
private fuse = new Fuse<MemberType>([], FUSE_OPTIONS);
|
||||
|
||||
constructor(private members: ReadonlyArray<ConversationType> = []) {}
|
||||
constructor(conversations: ReadonlyArray<ConversationType> = []) {
|
||||
this.members = _toMembers(conversations);
|
||||
}
|
||||
|
||||
updateMembers(members: ReadonlyArray<ConversationType>): void {
|
||||
this.members = members;
|
||||
updateMembers(conversations: ReadonlyArray<ConversationType>): void {
|
||||
this.members = _toMembers(conversations);
|
||||
this.isFuseReady = false;
|
||||
}
|
||||
|
||||
getMembers(omit?: ConversationType): ReadonlyArray<ConversationType> {
|
||||
getMembers(omit?: Pick<MemberType, 'id'>): ReadonlyArray<MemberType> {
|
||||
if (omit) {
|
||||
return this.members.filter(({ id }) => id !== omit.id);
|
||||
}
|
||||
|
@ -62,26 +90,22 @@ export class MemberRepository {
|
|||
return this.members;
|
||||
}
|
||||
|
||||
getMemberById(id?: string): ConversationType | undefined {
|
||||
getMemberById(id?: string): MemberType | undefined {
|
||||
return id
|
||||
? this.members.find(({ id: memberId }) => memberId === id)
|
||||
: undefined;
|
||||
}
|
||||
|
||||
getMemberByServiceId(
|
||||
serviceId?: ServiceIdString
|
||||
): ConversationType | undefined {
|
||||
return serviceId
|
||||
? this.members.find(
|
||||
({ serviceId: memberServiceId }) => memberServiceId === serviceId
|
||||
)
|
||||
getMemberByAci(aci?: AciString): MemberType | undefined {
|
||||
return aci
|
||||
? this.members.find(({ aci: memberAci }) => memberAci === aci)
|
||||
: undefined;
|
||||
}
|
||||
|
||||
search(
|
||||
pattern: string,
|
||||
omit?: ConversationType
|
||||
): ReadonlyArray<ConversationType> {
|
||||
omit?: Pick<MemberType, 'id'>
|
||||
): ReadonlyArray<MemberType> {
|
||||
if (!this.isFuseReady) {
|
||||
this.fuse.setCollection(this.members);
|
||||
this.isFuseReady = true;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue