@apolitical/component-library 4.1.12 → 4.2.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/accessibility/visually-hidden/visually-hidden.d.ts +2 -0
  2. package/constants/discussion.d.ts +1 -0
  3. package/constants/index.d.ts +2 -0
  4. package/constants/regex.d.ts +1 -0
  5. package/discussion/components/form/form.d.ts +9 -2
  6. package/discussion/components/post/post.d.ts +11 -2
  7. package/discussion/components/post/post.helpers.d.ts +2 -1
  8. package/discussion/components/post/post.mock.d.ts +3 -0
  9. package/discussion/feeds/activities-feed/activities-feed.d.ts +3 -0
  10. package/discussion/feeds/replies-feed/nested-replies-feed/nested-replies-feed.d.ts +4 -1
  11. package/discussion/feeds/replies-feed/replies-feed.d.ts +3 -0
  12. package/discussion/index.d.ts +1 -0
  13. package/discussion/sections/activity-section/activity-section.d.ts +2 -0
  14. package/form/components/rich-text-editor/components/context/context.d.ts +3 -1
  15. package/form/components/rich-text-editor/components/editor/index.d.ts +1 -0
  16. package/form/components/rich-text-editor/components/editor/mention-popover/index.d.ts +1 -0
  17. package/form/components/rich-text-editor/components/editor/mention-popover/mention-popover.d.ts +2 -0
  18. package/form/components/rich-text-editor/helpers/ast-types/ast-types.d.ts +4 -1
  19. package/form/components/rich-text-editor/helpers/index.d.ts +1 -0
  20. package/form/components/rich-text-editor/helpers/mentions/index.d.ts +2 -0
  21. package/form/components/rich-text-editor/helpers/mentions/insert-mention.d.ts +5 -0
  22. package/form/components/rich-text-editor/helpers/mentions/should-show-mentions-popover.d.ts +5 -0
  23. package/form/components/rich-text-editor/helpers/transform/transform.d.ts +3 -3
  24. package/form/components/rich-text-editor/index.d.ts +1 -0
  25. package/form/components/rich-text-editor/plugins/index.d.ts +1 -0
  26. package/form/components/rich-text-editor/plugins/with-mentions/index.d.ts +1 -0
  27. package/form/components/rich-text-editor/plugins/with-mentions/with-mentions.d.ts +6 -0
  28. package/form/components/rich-text-editor/rich-text-editor.const.d.ts +11 -0
  29. package/form/components/rich-text-editor/rich-text-editor.d.ts +10 -2
  30. package/form/components/rich-text-editor/rich-text-editor.types.d.ts +28 -2
  31. package/general/index.d.ts +1 -0
  32. package/general/popover/index.d.ts +1 -0
  33. package/general/popover/popover.d.ts +11 -0
  34. package/helpers/cases.d.ts +1 -0
  35. package/helpers/index.d.ts +1 -0
  36. package/helpers/intl.d.ts +1 -0
  37. package/helpers/replace-mention-data.d.ts +9 -0
  38. package/index.js +51 -51
  39. package/index.mjs +7691 -7375
  40. package/package.json +1 -1
  41. package/style.css +1 -1
  42. package/styles/variables/colors/theme/_discussion.scss +1 -0
  43. package/styles/variables/colors/theme/_form.scss +1 -0
  44. package/styles/variables/colors/theme/_general.scss +3 -0
  45. package/user/member/member.d.ts +9 -2
@@ -23,6 +23,7 @@ interface Props {
23
23
  /** Additional aria props */
24
24
  'aria-expanded'?: boolean;
25
25
  'aria-controls'?: string;
26
+ 'aria-live'?: 'off' | 'polite' | 'assertive';
26
27
  }
27
28
  declare const _default: React.MemoExoticComponent<({ element, showOnFocus, children, className, ...props }: Props) => React.DetailedReactHTMLElement<{
28
29
  className: string;
@@ -42,5 +43,6 @@ declare const _default: React.MemoExoticComponent<({ element, showOnFocus, child
42
43
  /** Additional aria props */
43
44
  'aria-expanded'?: boolean | undefined;
44
45
  'aria-controls'?: string | undefined;
46
+ 'aria-live'?: "off" | "polite" | "assertive" | undefined;
45
47
  }, HTMLElement>>;
46
48
  export default _default;
@@ -0,0 +1 @@
1
+ export declare const GET_STREAM_USER_PREFIX = "SU:";
@@ -1,5 +1,7 @@
1
1
  export * from './assets';
2
2
  export * from './contact-details';
3
3
  export * from './courses';
4
+ export * from './discussion';
4
5
  export * from './error-messages';
6
+ export * from './regex';
5
7
  export * from './stats';
@@ -0,0 +1 @@
1
+ export declare const UUID_V4_REGEX: RegExp;
@@ -1,4 +1,5 @@
1
- import { DiscussionCreateContentFunction, IDiscussionContent } from './../../discussion';
1
+ import { type ListMembers } from '../../../form';
2
+ import { DiscussionCreateContentFunction, IDiscussionContent, IMentions } from './../../discussion';
2
3
  export interface IDiscussionForm {
3
4
  /** A unique ID for the form */
4
5
  id?: string;
@@ -38,16 +39,22 @@ export interface IDiscussionForm {
38
39
  handleSaveEdit?: ((arg?: string) => Promise<void>) | (() => void);
39
40
  handleCancel?: () => void;
40
41
  callback?: (args: void) => void;
42
+ listMembers?: ListMembers;
41
43
  props?: {
42
44
  create: {
43
45
  projectNames: ['questions-answers'];
44
46
  };
45
47
  };
46
48
  };
49
+ /** Data to be passed into the rich text editor */
50
+ data?: {
51
+ /** Mentions data */
52
+ mentions?: IMentions;
53
+ };
47
54
  /** The context for GTM */
48
55
  gtmContext?: string;
49
56
  /** The language to use for the text */
50
57
  locale?: string;
51
58
  }
52
- declare const Form: ({ id, content, userHasPermissions, meta, placeholder, maxLength, forceShow, functions, gtmContext, }: IDiscussionForm) => import("react/jsx-runtime").JSX.Element;
59
+ declare const Form: ({ id, content, userHasPermissions, meta, placeholder, maxLength, forceShow, functions, data, gtmContext, }: IDiscussionForm) => import("react/jsx-runtime").JSX.Element;
53
60
  export default Form;
@@ -1,10 +1,15 @@
1
1
  import React from 'react';
2
+ import { type ListMembers } from '../../../form';
2
3
  import { DiscussionCreateContentFunction, DiscussionCreateLikeFunction, DiscussionDeleteLikeFunction, IForceHide, IFullDiscussionContent } from '../../discussion';
4
+ interface PostContent extends IFullDiscussionContent {
5
+ /** The post body */
6
+ postBody?: string;
7
+ }
3
8
  interface Props {
4
9
  /** The element that will render around the content */
5
10
  element?: 'li' | 'div' | 'section' | 'article';
6
11
  /** Information about the content being posted */
7
- content: IFullDiscussionContent;
12
+ content: PostContent;
8
13
  /** If the user has permission to interact with the post box and content, e.g. if they're a member of the community */
9
14
  userHasPermissions?: boolean;
10
15
  /** If the post is still loading */
@@ -33,6 +38,10 @@ interface Props {
33
38
  /** Open comments on a post */
34
39
  openComments?: () => void;
35
40
  };
41
+ mentions: {
42
+ /** Get data to hydrate mentions */
43
+ listMembers: ListMembers;
44
+ };
36
45
  };
37
46
  /** Optional `href`s for the card to link to */
38
47
  links?: {
@@ -50,5 +59,5 @@ interface Props {
50
59
  /** If the post content is truncated */
51
60
  isTruncated?: boolean;
52
61
  }
53
- declare const Post: ({ element, content, userHasPermissions, isLoading, originalAuthorId, forceHide, functions: { content: { createContent, deleteContent, updateContent }, likes: { createLike, deleteLike }, comments: { openComments }, }, links, className, gtmContext, children, isTruncated, }: Props) => import("react/jsx-runtime").JSX.Element;
62
+ declare const Post: ({ element, content, userHasPermissions, isLoading, originalAuthorId, forceHide, functions: { content: { createContent, deleteContent, updateContent }, likes: { createLike, deleteLike }, comments: { openComments }, mentions: { listMembers }, }, links, className, gtmContext, children, isTruncated, }: Props) => import("react/jsx-runtime").JSX.Element;
54
63
  export default Post;
@@ -1,2 +1,3 @@
1
1
  import { IMentions } from './../../discussion';
2
- export declare const getPostBody: (body: string, isTruncated: boolean, mentions?: IMentions) => string;
2
+ import { ListMembers } from '../../../form';
3
+ export declare const getPostBody: (body: string, isTruncated: boolean, mentions?: IMentions, listMembers?: ListMembers) => Promise<string>;
@@ -13,6 +13,9 @@ declare namespace _default {
13
13
  namespace comments {
14
14
  function openComments(): void;
15
15
  }
16
+ namespace mentions {
17
+ function listMembers(): Promise<never[]>;
18
+ }
16
19
  }
17
20
  }
18
21
  export default _default;
@@ -1,4 +1,5 @@
1
1
  /// <reference types="react" />
2
+ import type { IMentionsFns } from '../../../discussion/discussion.d';
2
3
  import type { IQueryFns } from './cache';
3
4
  interface Props {
4
5
  /** The base path, used for slugs */
@@ -11,6 +12,8 @@ interface Props {
11
12
  functions: {
12
13
  /** Query functions for the activities */
13
14
  activities: IQueryFns;
15
+ /** Query functions for the mentions */
16
+ mentions: IMentionsFns;
14
17
  /** Function to join the community */
15
18
  join: () => Promise<void>;
16
19
  /** Function to leave the community */
@@ -1,5 +1,8 @@
1
1
  /// <reference types="react" />
2
+ import type { IMentionsFns } from '../../../../discussion/discussion.d';
2
3
  import type { IQueryFns } from './../cache';
4
+ interface NestedRepliesFunctions extends IQueryFns, IMentionsFns {
5
+ }
3
6
  interface Props {
4
7
  /** The base path, used for slugs */
5
8
  basePath: string;
@@ -12,7 +15,7 @@ interface Props {
12
15
  /** Whether the user is a member of the community */
13
16
  isMember: boolean;
14
17
  /** Functions for the replies query */
15
- functions: IQueryFns;
18
+ functions: NestedRepliesFunctions;
16
19
  }
17
20
  declare const NestedRepliesFeed: React.FC<Props>;
18
21
  export default NestedRepliesFeed;
@@ -1,4 +1,5 @@
1
1
  /// <reference types="react" />
2
+ import type { IMentionsFns } from './../../discussion';
2
3
  import type { IQueryFns } from './cache';
3
4
  interface Props {
4
5
  /** The base path, used for slugs */
@@ -13,6 +14,8 @@ interface Props {
13
14
  functions: {
14
15
  /** Query functions for the replies */
15
16
  reactions: IQueryFns;
17
+ /** Query functions for the mentions */
18
+ mentions: IMentionsFns;
16
19
  /** Function to join the community */
17
20
  join: () => Promise<void>;
18
21
  /** Function to leave the community */
@@ -1,3 +1,4 @@
1
1
  export * from './components';
2
2
  export * from './feeds';
3
3
  export * from './sections';
4
+ export type { IMentionData, IMentions } from './discussion.d';
@@ -1,5 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import type { IRepliesFeedQueryFns } from '../../../discussion/feeds';
3
+ import type { IMentionsFns } from './../../discussion.d';
3
4
  import type { IQueryFns } from './cache';
4
5
  interface IActivitySectionQueryFns extends IQueryFns {
5
6
  remove: () => Promise<void>;
@@ -12,6 +13,7 @@ interface Props {
12
13
  functions: {
13
14
  activities: IActivitySectionQueryFns;
14
15
  reactions: IRepliesFeedQueryFns;
16
+ mentions: IMentionsFns;
15
17
  join: () => Promise<void>;
16
18
  leave: () => Promise<void>;
17
19
  };
@@ -1,6 +1,6 @@
1
1
  import { Dispatch } from 'react';
2
2
  import { Point } from 'slate';
3
- import { ReportError } from './../../rich-text-editor.types';
3
+ import { ReportError, IMentionPopOver } from './../../rich-text-editor.types';
4
4
  declare const RichTextEditorContext: import("react").Context<{
5
5
  /** The id of the editor */
6
6
  id: string;
@@ -12,6 +12,8 @@ declare const RichTextEditorContext: import("react").Context<{
12
12
  openTooltip: string | null;
13
13
  /** Whether the link editor is open */
14
14
  showLinkEditor: boolean;
15
+ /** The data for the mention popover, including if it's showing, the selected user for the popover, and the possible users */
16
+ mentionPopover: IMentionPopOver;
15
17
  /** The last anchor point (used for Slate to know where the cursor is) */
16
18
  lastAnchor: Point | null;
17
19
  /** The function to update the state */
@@ -1,2 +1,3 @@
1
1
  export * from './element';
2
2
  export * from './leaf';
3
+ export * from './mention-popover';
@@ -0,0 +1 @@
1
+ export { default as MentionPopover } from './mention-popover';
@@ -0,0 +1,2 @@
1
+ declare const MentionPopover: () => import("react/jsx-runtime").JSX.Element | null;
2
+ export default MentionPopover;
@@ -7,6 +7,7 @@ export interface NodeTypes {
7
7
  [Formatting.ul]: string;
8
8
  [Formatting.ol]: string;
9
9
  [Formatting.li]: string;
10
+ [Formatting.mention]: string;
10
11
  [Formatting.heading]: {
11
12
  1: string;
12
13
  2: string;
@@ -28,6 +29,7 @@ export declare enum MdastNodes {
28
29
  list = "list",
29
30
  listItem = "listItem",
30
31
  link = "link",
32
+ mention = "mention",
31
33
  image = "image",
32
34
  blockquote = "blockquote",
33
35
  code = "code",
@@ -39,7 +41,7 @@ export declare enum MdastNodes {
39
41
  thematicBreak = "thematicBreak",
40
42
  text = "text"
41
43
  }
42
- export type MdastNodeType = MdastNodes.paragraph | MdastNodes.heading | MdastNodes.list | MdastNodes.listItem | MdastNodes.link | MdastNodes.image | MdastNodes.blockquote | MdastNodes.code | MdastNodes.html | MdastNodes.emphasis | MdastNodes.strong | MdastNodes.delete | MdastNodes.inlineCode | MdastNodes.thematicBreak | MdastNodes.text;
44
+ export type MdastNodeType = MdastNodes.paragraph | MdastNodes.heading | MdastNodes.list | MdastNodes.listItem | MdastNodes.link | MdastNodes.mention | MdastNodes.image | MdastNodes.blockquote | MdastNodes.code | MdastNodes.html | MdastNodes.emphasis | MdastNodes.strong | MdastNodes.delete | MdastNodes.inlineCode | MdastNodes.thematicBreak | MdastNodes.text;
43
45
  export declare const defaultNodeTypes: NodeTypes;
44
46
  export interface LeafType {
45
47
  text: string;
@@ -53,6 +55,7 @@ export interface BlockType {
53
55
  type: string;
54
56
  parentType?: string;
55
57
  link?: string;
58
+ mention?: string;
56
59
  caption?: string;
57
60
  language?: string;
58
61
  break?: boolean;
@@ -2,5 +2,6 @@ export * from './ast-types';
2
2
  export * from './deserialize';
3
3
  export * from './handle-text';
4
4
  export * from './hot-keys';
5
+ export * from './mentions';
5
6
  export * from './serialize';
6
7
  export * from './transform';
@@ -0,0 +1,2 @@
1
+ export { default as insertMention } from './insert-mention';
2
+ export { default as shouldShowMentionsPopover } from './should-show-mentions-popover';
@@ -0,0 +1,5 @@
1
+ import { Dispatch } from 'react';
2
+ import { BaseEditor } from 'slate';
3
+ import { IMentionPopOver } from './../../rich-text-editor.types';
4
+ declare const insertMention: (editor: BaseEditor, mentionPopover: IMentionPopOver, dispatch: Dispatch<any>) => void;
5
+ export default insertMention;
@@ -0,0 +1,5 @@
1
+ import { Dispatch } from 'react';
2
+ import { BaseEditor } from 'slate';
3
+ import { type ListMembers } from './../../rich-text-editor.types';
4
+ declare const shouldShowMentionsPopover: (editor: BaseEditor, isShowing: boolean, listMembers: ListMembers | undefined, dispatch: Dispatch<any>) => Promise<void>;
5
+ export default shouldShowMentionsPopover;
@@ -7,12 +7,12 @@ export default function transform<T extends InputNodeTypes>(node: MdastNode, opt
7
7
  }[];
8
8
  } | {
9
9
  value?: string | undefined;
10
- position?: any;
11
- url?: string | undefined;
12
10
  alt?: string | undefined;
11
+ url?: string | undefined;
12
+ position?: any;
13
13
  checked?: any;
14
14
  ordered?: boolean | undefined;
15
- depth?: 1 | 2 | 3 | 4 | 5 | 6 | undefined;
15
+ depth?: 1 | 2 | 3 | 4 | 6 | 5 | undefined;
16
16
  lang?: string | undefined;
17
17
  spread?: any;
18
18
  indent?: any;
@@ -1 +1,2 @@
1
1
  export { default as RichTextEditor } from './rich-text-editor';
2
+ export * from './rich-text-editor.types';
@@ -1,2 +1,3 @@
1
1
  export * from './with-linlines';
2
+ export * from './with-mentions';
2
3
  export * from './without-empty-links';
@@ -0,0 +1 @@
1
+ export { default as withMentions } from './with-mentions';
@@ -0,0 +1,6 @@
1
+ import { BaseEditor } from 'slate';
2
+ import { HistoryEditor } from 'slate-history';
3
+ import { ReactEditor } from 'slate-react';
4
+ import { ReportError } from './../../rich-text-editor.types';
5
+ declare const withMentions: (editor: BaseEditor & ReactEditor & HistoryEditor, reportError: ReportError) => BaseEditor & ReactEditor & HistoryEditor;
6
+ export default withMentions;
@@ -0,0 +1,11 @@
1
+ export declare const MENTION_IDENTIFIER = "MENTION: ";
2
+ export declare const FALLBACK_POSITION: {
3
+ anchor: {
4
+ offset: number;
5
+ path: number[];
6
+ };
7
+ focus: {
8
+ offset: number;
9
+ path: number[];
10
+ };
11
+ };
@@ -1,4 +1,5 @@
1
- import { ReportError } from './rich-text-editor.types';
1
+ import type { IMentions } from '../../../discussion/discussion';
2
+ import { ListMembers, ReportError } from './rich-text-editor.types';
2
3
  interface Props {
3
4
  /** The id of the rich text editor */
4
5
  id?: string;
@@ -10,6 +11,8 @@ interface Props {
10
11
  maxLength?: number;
11
12
  /** Optional functions */
12
13
  functions?: {
14
+ /** An optional function to get a filtered list of members when the user starts typing a mention */
15
+ listMembers?: ListMembers;
13
16
  /** An optional event handler, called when the rich text editor is changed */
14
17
  onChange?: (value: string) => void;
15
18
  /** An optional event handler, called when the rich text editor reports an error */
@@ -21,6 +24,11 @@ interface Props {
21
24
  'aria-invalid'?: boolean;
22
25
  /** Optional aria error message */
23
26
  'aria-errormessage'?: string;
27
+ /** Optional data for the editor */
28
+ data?: {
29
+ /** Optional mentions */
30
+ mentions?: IMentions;
31
+ };
24
32
  }
25
- declare const RichTextEditor: ({ id, value, placeholder, maxLength, functions, autoFocus, ...props }: Props) => import("react/jsx-runtime").JSX.Element | null;
33
+ declare const RichTextEditor: ({ id, value, placeholder, maxLength, functions, autoFocus, data, ...props }: Props) => import("react/jsx-runtime").JSX.Element | null;
26
34
  export default RichTextEditor;
@@ -1,4 +1,5 @@
1
- import { BaseElement, BaseText, Descendant } from 'slate';
1
+ import { BaseElement, BaseText, Descendant, Range } from 'slate';
2
+ import type { MemberDetailsProps } from '../../../user';
2
3
  export declare enum Formatting {
3
4
  blockquote = "block_quote",
4
5
  bold = "bold",
@@ -10,6 +11,7 @@ export declare enum Formatting {
10
11
  italic = "italic",
11
12
  li = "list_item",
12
13
  link = "link",
14
+ mention = "mention",
13
15
  ol = "ol_list",
14
16
  paragraph = "paragraph",
15
17
  ul = "ul_list",
@@ -26,10 +28,15 @@ export interface BaseProps {
26
28
  className?: string;
27
29
  [key: string]: unknown;
28
30
  }
29
- export type BlockOptionType = Formatting.blockquote | Formatting.link | Formatting.li | Formatting.ol | Formatting.ul | Formatting.paragraph | Formatting.span;
31
+ export type BlockOptionType = Formatting.blockquote | Formatting.link | Formatting.li | Formatting.mention | Formatting.ol | Formatting.ul | Formatting.paragraph | Formatting.span;
30
32
  export interface TypeElement extends BaseElement {
31
33
  type: BlockOptionType;
32
34
  }
35
+ export interface MentionElement extends BaseElement {
36
+ type: Formatting.mention;
37
+ id: string;
38
+ name?: string;
39
+ }
33
40
  export type MarkOptionType = Formatting.bold | Formatting.italic | Formatting.strikethrough;
34
41
  export interface TypeText extends BaseText {
35
42
  [Formatting.bold]?: boolean;
@@ -46,3 +53,22 @@ export type LinkElement = {
46
53
  children: Descendant[];
47
54
  };
48
55
  export type ReportError = (error: string) => void;
56
+ export interface IMention {
57
+ id: string;
58
+ creator?: boolean;
59
+ role?: string;
60
+ createdAt?: string;
61
+ updatedAt?: string;
62
+ userId?: string;
63
+ user: MemberDetailsProps;
64
+ }
65
+ export type ListMembers = ({ id, name, }: {
66
+ id?: string;
67
+ name?: string;
68
+ }) => Promise<IMention[]>;
69
+ export interface IMentionPopOver {
70
+ show: boolean;
71
+ selectedUser: number;
72
+ possibleUsers: IMention[];
73
+ position: Range | null;
74
+ }
@@ -2,6 +2,7 @@ export * from './buttons';
2
2
  export * from './divider';
3
3
  export * from './image-container';
4
4
  export * from './link';
5
+ export * from './popover';
5
6
  export * from './portal';
6
7
  export * from './progress-tracker';
7
8
  export * from './responsive-image';
@@ -0,0 +1 @@
1
+ export { default as Popover } from './popover';
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ interface Props {
3
+ /** Additional className */
4
+ className?: string;
5
+ /** The content of the popover */
6
+ children: React.ReactNode;
7
+ /** Optional keydown event */
8
+ onKeyDown?: (e: React.KeyboardEvent<HTMLElement>) => void;
9
+ }
10
+ declare const Popover: React.ForwardRefExoticComponent<Props & React.RefAttributes<HTMLElement | null>>;
11
+ export default Popover;
@@ -1,3 +1,4 @@
1
1
  export declare const camelCaseToDashCase: (str: string) => string;
2
2
  export declare const toCamelCase: (str?: string) => string;
3
3
  export declare const toSentenceCase: (str?: string) => string;
4
+ export declare const toCapitalisedCase: (str?: string) => string;
@@ -9,5 +9,6 @@ export * from './intl';
9
9
  export * from './numbers';
10
10
  export { default as passPropsToChildren } from './pass-props-to-children';
11
11
  export * from './prerender';
12
+ export { default as replaceMentionData } from './replace-mention-data';
12
13
  export * from './urls';
13
14
  export * from './validation';
package/helpers/intl.d.ts CHANGED
@@ -40,6 +40,7 @@ export declare const checkIntlPathExists: (path: string, language?: {
40
40
  carousel_pagination_previous: string;
41
41
  carousel_pagination_next: string;
42
42
  carousel_pagination_page: string;
43
+ carousel_pagination_aria_live: string;
43
44
  activitySection_notFoundError: string;
44
45
  communityDetails_members: string;
45
46
  communityDetails_viewAll: string;
@@ -0,0 +1,9 @@
1
+ import { IMentions } from '../discussion';
2
+ import { ListMembers } from '../form';
3
+ declare const replaceMentionData: ({ text, template, mentions, listMembers, }: {
4
+ text: string;
5
+ template: string;
6
+ mentions?: IMentions | undefined;
7
+ listMembers: ListMembers;
8
+ }) => Promise<string>;
9
+ export default replaceMentionData;