feat: add help links for message platform adapters in YAML and update documentation retrieval logic

This commit is contained in:
Junyan Qin
2026-03-31 00:29:24 +08:00
parent 7129dd536e
commit ea638cab80
20 changed files with 94 additions and 31 deletions

View File

@@ -105,6 +105,9 @@ export default function BotForm({
const [adapterDescriptionList, setAdapterDescriptionList] = useState<
Record<string, string>
>({});
const [adapterHelpLinks, setAdapterHelpLinks] = useState<
Record<string, Record<string, string>>
>({});
const [pipelineNameList, setPipelineNameList] = useState<IPipelineEntity[]>(
[],
@@ -212,6 +215,18 @@ export default function BotForm({
),
);
setAdapterHelpLinks(
adaptersRes.adapters.reduce(
(acc, item) => {
if (item.spec.help_links) {
acc[item.name] = item.spec.help_links;
}
return acc;
},
{} as Record<string, Record<string, string>>,
),
);
adaptersRes.adapters.forEach((rawAdapter) => {
adapterNameToDynamicConfigMap.set(
rawAdapter.name,
@@ -531,7 +546,7 @@ export default function BotForm({
{currentAdapter &&
(() => {
const docUrl = getAdapterDocUrl(
currentAdapter,
adapterHelpLinks[currentAdapter],
i18n.language,
);
return docUrl ? (

View File

@@ -1,12 +1,15 @@
/**
* Returns the documentation URL for a given adapter name,
* using link.langbot.app short links.
* Resolves the documentation URL for a given adapter from its
* spec.help_links map, selecting the best match for the current locale
* with a fallback to English.
*/
export function getAdapterDocUrl(
adapterName: string,
helpLinks: Record<string, string> | undefined,
locale: string,
): string | null {
// Map locale to doc language prefix
if (!helpLinks) return null;
// Map locale to simplified language key
let lang: string;
if (locale.startsWith('zh')) {
lang = 'zh';
@@ -16,28 +19,5 @@ export function getAdapterDocUrl(
lang = 'en';
}
// Only adapters with dedicated doc pages
const ADAPTER_DOC_SLUGS: Record<string, string> = {
telegram: 'telegram',
discord: 'discord',
slack: 'slack',
line: 'line',
kook: 'kook',
lark: 'lark',
dingtalk: 'dingtalk',
aiocqhttp: 'aiocqhttp',
qqofficial: 'qqofficial',
wecom: 'wecom',
wecomcs: 'wecomcs',
wecombot: 'wecombot',
officialaccount: 'officialaccount',
wechatpad: 'wechatpad',
openclaw_weixin: 'openclaw_weixin',
satori: 'satori',
};
const slug = ADAPTER_DOC_SLUGS[adapterName];
if (!slug) return null;
return `https://link.langbot.app/${lang}/platforms/${slug}`;
return helpLinks[lang] ?? helpLinks['en'] ?? null;
}

View File

@@ -118,6 +118,7 @@ export interface Adapter {
icon?: string;
spec: {
categories?: string[];
help_links?: Record<string, string>;
config: IDynamicFormItemSchema[];
};
}

View File

@@ -803,7 +803,7 @@ function StepPlatform({
</p>
{(() => {
const docUrl = getAdapterDocUrl(
adapter.name,
adapter.spec.help_links,
i18n.language,
);
return docUrl ? (
@@ -896,8 +896,11 @@ function StepBotConfig({
</CardTitle>
{selectedAdapterName &&
(() => {
const selectedAdapter = adapters.find(
(a) => a.name === selectedAdapterName,
);
const docUrl = getAdapterDocUrl(
selectedAdapterName,
selectedAdapter?.spec.help_links,
i18n.language,
);
return docUrl ? (