47 lines
1.3 KiB
TypeScript
47 lines
1.3 KiB
TypeScript
export type ComposerMenuButton = {
|
|
type: 'web_app';
|
|
text: string;
|
|
web_app: { url: string };
|
|
};
|
|
|
|
export function parseComposerMenuButtonJson(raw?: string | null): ComposerMenuButton | null {
|
|
if (!raw?.trim()) {
|
|
return null;
|
|
}
|
|
try {
|
|
const parsed = JSON.parse(raw) as unknown;
|
|
if (
|
|
typeof parsed === 'object' &&
|
|
parsed !== null &&
|
|
(parsed as ComposerMenuButton).type === 'web_app' &&
|
|
typeof (parsed as ComposerMenuButton).text === 'string' &&
|
|
typeof (parsed as ComposerMenuButton).web_app?.url === 'string'
|
|
) {
|
|
const button = parsed as ComposerMenuButton;
|
|
const url = button.web_app.url.trim();
|
|
if (!url) {
|
|
return null;
|
|
}
|
|
return { type: 'web_app', text: button.text.trim() || 'App', web_app: { url } };
|
|
}
|
|
} catch {
|
|
return null;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
export function resolveComposerMenuButton(options: {
|
|
composerMenuButtonJson?: string | null;
|
|
composerWebAppUrl?: string | null;
|
|
}): ComposerMenuButton | null {
|
|
const fromJson = parseComposerMenuButtonJson(options.composerMenuButtonJson);
|
|
if (fromJson) {
|
|
return fromJson;
|
|
}
|
|
const url = options.composerWebAppUrl?.trim();
|
|
if (url) {
|
|
return { type: 'web_app', text: 'App', web_app: { url } };
|
|
}
|
|
return null;
|
|
}
|