38 lines
823 B
TypeScript
38 lines
823 B
TypeScript
interface FoundMention {
|
|
value: string
|
|
index: number
|
|
}
|
|
|
|
export function getMentionAt(
|
|
text: string,
|
|
cursorPos: number,
|
|
): FoundMention | undefined {
|
|
let re = /(^|\s)@([a-z0-9.-]*)/gi
|
|
let match
|
|
while ((match = re.exec(text))) {
|
|
const spaceOffset = match[1].length
|
|
const index = match.index + spaceOffset
|
|
if (
|
|
cursorPos >= index &&
|
|
cursorPos <= index + match[0].length - spaceOffset
|
|
) {
|
|
return {value: match[2], index}
|
|
}
|
|
}
|
|
return undefined
|
|
}
|
|
|
|
export function insertMentionAt(
|
|
text: string,
|
|
cursorPos: number,
|
|
mention: string,
|
|
) {
|
|
const target = getMentionAt(text, cursorPos)
|
|
if (target) {
|
|
return `${text.slice(0, target.index)}@${mention} ${text.slice(
|
|
target.index + target.value.length + 1, // add 1 to include the "@"
|
|
)}`
|
|
}
|
|
return text
|
|
}
|