signal-desktop/ts/quill/mentions/matchers.ts

66 lines
1.8 KiB
TypeScript
Raw Normal View History

2020-11-03 01:19:52 +00:00
// Copyright 2020 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import Delta from 'quill-delta';
import type { RefObject } from 'react';
import type { Matcher, AttributeMap } from 'quill';
2023-08-16 20:54:39 +00:00
import { assertDev } from '../../util/assert';
import { isAciString } from '../../types/ServiceId';
import type { MemberRepository } from '../memberRepository';
2020-11-03 01:19:52 +00:00
export const matchMention: (
memberRepositoryRef: RefObject<MemberRepository>
) => Matcher =
2021-11-11 22:43:05 +00:00
(memberRepositoryRef: RefObject<MemberRepository>) =>
(node: HTMLElement, delta: Delta, attributes: AttributeMap): Delta => {
2021-11-11 22:43:05 +00:00
const memberRepository = memberRepositoryRef.current;
if (memberRepository) {
const { title } = node.dataset;
if (node.classList.contains('MessageBody__at-mention')) {
2021-11-11 22:43:05 +00:00
const { id } = node.dataset;
2023-08-17 18:48:42 +00:00
const member = memberRepository.getMemberById(id);
2021-11-11 22:43:05 +00:00
2023-08-17 18:48:42 +00:00
if (member && member.aci) {
const { aci } = member;
return new Delta().insert(
{
mention: {
title,
2023-08-16 20:54:39 +00:00
aci,
},
2021-11-11 22:43:05 +00:00
},
attributes
);
2021-11-11 22:43:05 +00:00
}
return new Delta().insert(`@${title}`, attributes);
2020-11-03 01:19:52 +00:00
}
2021-11-11 22:43:05 +00:00
if (node.classList.contains('mention-blot')) {
2023-08-16 20:54:39 +00:00
const { aci } = node.dataset;
assertDev(isAciString(aci), 'Mentioned blot has invalid ACI');
2023-08-17 18:48:42 +00:00
const member = memberRepository.getMemberByAci(aci);
2020-11-03 01:19:52 +00:00
2023-08-17 18:48:42 +00:00
if (member && member.aci) {
assertDev(member.aci === aci, 'Mentioned member has no ACI');
return new Delta().insert(
{
mention: {
2023-08-17 18:48:42 +00:00
title: title || member.title,
2023-08-16 20:54:39 +00:00
aci,
},
2021-11-11 22:43:05 +00:00
},
attributes
);
2021-11-11 22:43:05 +00:00
}
2020-11-03 01:19:52 +00:00
return new Delta().insert(`@${title}`, attributes);
2021-11-11 22:43:05 +00:00
}
2020-11-03 01:19:52 +00:00
}
2021-11-11 22:43:05 +00:00
return delta;
};