// Copyright 2021-2022 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only export function graphemeAwareSlice( str: string, length: number, buffer = 100 ): { hasReadMore: boolean; text: string; } { if (str.length <= length + buffer) { return { text: str, hasReadMore: false }; } let text: string | undefined; for (const { index } of new Intl.Segmenter().segment(str)) { if (!text && index >= length) { text = str.slice(0, index); } if (text && index > length) { return { text, hasReadMore: true, }; } } return { text: str, hasReadMore: false, }; }