Files
overleaf-cep/services/web/frontend/js/shared/utils/first-character.ts
Mathias Jakobsen 6890f1bb3c Merge pull request #31038 from overleaf/jdt-mj-rm-chat-ide-redesign
Editor Redesign Cleanup: Chat

GitOrigin-RevId: 98f969ee84a86761466de182787443b8c9bacefd
2026-02-16 09:06:05 +00:00

27 lines
781 B
TypeScript

export default function firstCharacter(str: string): string {
if (!str) {
return ''
}
if (Intl?.Segmenter) {
try {
const segmenter = new Intl.Segmenter(undefined, {
granularity: 'grapheme',
})
// eslint-disable-next-line no-unreachable-loop
for (const { segment } of segmenter.segment(str)) {
return segment
}
} catch {
// Fall back to the code point approach below.
}
}
// NOTE: .charAt(0), [0], and .substring(0, 1) will all split multi-byte
// characters (e.g. emojis) into multiple characters, but the spread operator
// will keep them mostly intact. This still isn't perfect, so the grapheme
// segmenter above is preferred when available.
const [first] = [...str]
return first ?? ''
}