mirror of
https://github.com/n8n-io/n8n.git
synced 2024-12-28 05:59:42 -08:00
df783151b8
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
124 lines
3.4 KiB
TypeScript
124 lines
3.4 KiB
TypeScript
import type { AuthenticationChatOption, LoadPreviousSessionChatOption } from './types';
|
|
|
|
export function createPage({
|
|
instanceId,
|
|
webhookUrl,
|
|
showWelcomeScreen,
|
|
loadPreviousSession,
|
|
i18n: { en },
|
|
initialMessages,
|
|
authentication,
|
|
allowFileUploads,
|
|
allowedFilesMimeTypes,
|
|
}: {
|
|
instanceId: string;
|
|
webhookUrl?: string;
|
|
showWelcomeScreen?: boolean;
|
|
loadPreviousSession?: LoadPreviousSessionChatOption;
|
|
i18n: {
|
|
en: Record<string, string>;
|
|
};
|
|
initialMessages: string[];
|
|
mode: 'test' | 'production';
|
|
authentication: AuthenticationChatOption;
|
|
allowFileUploads?: boolean;
|
|
allowedFilesMimeTypes?: string;
|
|
}) {
|
|
const validAuthenticationOptions: AuthenticationChatOption[] = [
|
|
'none',
|
|
'basicAuth',
|
|
'n8nUserAuth',
|
|
];
|
|
const validLoadPreviousSessionOptions: LoadPreviousSessionChatOption[] = [
|
|
'manually',
|
|
'memory',
|
|
'notSupported',
|
|
];
|
|
|
|
const sanitizedAuthentication = validAuthenticationOptions.includes(authentication)
|
|
? authentication
|
|
: 'none';
|
|
const sanitizedShowWelcomeScreen = !!showWelcomeScreen;
|
|
const sanitizedAllowFileUploads = !!allowFileUploads;
|
|
const sanitizedAllowedFilesMimeTypes = allowedFilesMimeTypes?.toString() ?? '';
|
|
const sanitizedLoadPreviousSession = validLoadPreviousSessionOptions.includes(
|
|
loadPreviousSession as LoadPreviousSessionChatOption,
|
|
)
|
|
? loadPreviousSession
|
|
: 'notSupported';
|
|
|
|
return `<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>Chat</title>
|
|
<link href="https://cdn.jsdelivr.net/npm/normalize.css@8.0.1/normalize.min.css" rel="stylesheet" />
|
|
<link href="https://cdn.jsdelivr.net/npm/@n8n/chat/dist/style.css" rel="stylesheet" />
|
|
<style>
|
|
html,
|
|
body,
|
|
#n8n-chat {
|
|
width: 100%;
|
|
height: 100%;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<script type="module">
|
|
import { createChat } from 'https://cdn.jsdelivr.net/npm/@n8n/chat/dist/chat.bundle.es.js';
|
|
|
|
(async function () {
|
|
const authentication = '${sanitizedAuthentication}';
|
|
let metadata;
|
|
if (authentication === 'n8nUserAuth') {
|
|
try {
|
|
const response = await fetch('/rest/login', {
|
|
method: 'GET',
|
|
headers: { 'browser-id': localStorage.getItem('n8n-browserId') }
|
|
});
|
|
|
|
if (response.status !== 200) {
|
|
throw new Error('Not logged in');
|
|
}
|
|
|
|
const responseData = await response.json();
|
|
metadata = {
|
|
user: {
|
|
id: responseData.data.id,
|
|
firstName: responseData.data.firstName,
|
|
lastName: responseData.data.lastName,
|
|
email: responseData.data.email,
|
|
},
|
|
};
|
|
} catch (error) {
|
|
window.location.href = '/signin?redirect=' + window.location.href;
|
|
return;
|
|
}
|
|
}
|
|
|
|
createChat({
|
|
mode: 'fullscreen',
|
|
webhookUrl: '${webhookUrl}',
|
|
showWelcomeScreen: ${sanitizedShowWelcomeScreen},
|
|
loadPreviousSession: ${sanitizedLoadPreviousSession !== 'notSupported'},
|
|
metadata: metadata,
|
|
webhookConfig: {
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'X-Instance-Id': '${instanceId}',
|
|
}
|
|
},
|
|
allowFileUploads: ${sanitizedAllowFileUploads},
|
|
allowedFilesMimeTypes: '${sanitizedAllowedFilesMimeTypes}',
|
|
i18n: {
|
|
${en ? `en: ${JSON.stringify(en)},` : ''}
|
|
},
|
|
${initialMessages.length ? `initialMessages: ${JSON.stringify(initialMessages)},` : ''}
|
|
});
|
|
})();
|
|
</script>
|
|
</body>
|
|
</html>`;
|
|
}
|