open-webui/src/lib/components/chat/Messages/Markdown/MarkdownInlineTokens/MentionToken.svelte

96 lines
2 KiB
Svelte
Raw Normal View History

2025-09-14 22:49:01 +00:00
<script lang="ts">
import type { Token } from 'marked';
2025-09-14 22:59:09 +00:00
import Tooltip from '$lib/components/common/Tooltip.svelte';
2025-09-17 02:41:47 +00:00
import { goto } from '$app/navigation';
import { channels, models } from '$lib/stores';
import i18n from '$lib/i18n';
2025-09-14 22:49:01 +00:00
export let token: Token;
2025-09-16 20:16:48 +00:00
let triggerChar = '';
let label = '';
2025-09-17 02:41:47 +00:00
let idType = null;
2025-09-16 20:16:48 +00:00
let id = '';
$: if (token) {
init();
}
const init = () => {
const _id = token?.id;
2025-09-17 02:41:47 +00:00
// split by : and take first part as idType and second part as id
const parts = _id?.split(':');
if (parts) {
idType = parts[0];
id = parts.slice(1).join(':'); // in case id contains ':'
2025-09-16 20:16:48 +00:00
} else {
2025-09-17 02:41:47 +00:00
idType = null;
2025-09-16 20:16:48 +00:00
id = _id;
}
label = token?.label ?? id;
triggerChar = token?.triggerChar ?? '@';
2025-09-17 02:41:47 +00:00
if (triggerChar === '#') {
if (idType === 'C') {
// Channel
const channel = $channels.find((c) => c.id === id);
if (channel) {
label = channel.name;
} else {
label = $i18n.t('Unknown');
}
} else if (idType === 'T') {
// Thread
}
} else if (triggerChar === '@') {
if (idType === 'U') {
// User
} else if (idType === 'A') {
// Agent/assistant/ai model
const model = $models.find((m) => m.id === id);
if (model) {
label = model.name;
} else {
label = $i18n.t('Unknown');
}
}
}
2025-09-16 20:16:48 +00:00
};
2025-09-14 22:49:01 +00:00
</script>
2025-09-17 02:41:47 +00:00
<Tooltip
as="span"
className="mention cursor-pointer"
onClick={async () => {
if (triggerChar === '@') {
if (idType === 'U') {
// Open user profile
console.log('Clicked user mention', id);
} else if (idType === 'A') {
// Open agent/assistant/ai model profile
console.log('Clicked agent mention', id);
await goto(`/?model=${id}`);
}
} else if (triggerChar === '#') {
if (idType === 'C') {
// Open channel
if ($channels.find((c) => c.id === id)) {
await goto(`/channels/${id}`);
}
} else if (idType === 'T') {
// Open thread
}
} else {
// Unknown trigger char, just log
console.log('Clicked mention', id);
}
}}
content={id}
placement="top"
>
2025-09-16 20:16:48 +00:00
{triggerChar}{label}
2025-09-14 22:49:01 +00:00
</Tooltip>