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

70 lines
2 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;
const conversation = memberRepository.getMemberById(id);
2023-08-16 20:54:39 +00:00
if (conversation && conversation.serviceId) {
const { serviceId: aci } = conversation;
assertDev(isAciString(aci), 'Mentioned conversation has no ACI');
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');
const conversation = memberRepository.getMemberByServiceId(aci);
2020-11-03 01:19:52 +00:00
2023-08-16 20:54:39 +00:00
if (conversation && conversation.serviceId) {
assertDev(
conversation.serviceId === aci,
'Mentioned conversation has no ACI'
);
return new Delta().insert(
{
mention: {
title: title || conversation.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;
};