@websolutespa/payload-plugin-bowl-llm
Version:
LLM plugin for Bowl PayloadCms plugin
163 lines (162 loc) • 7.4 kB
JavaScript
'use client';
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
import { MinimalTemplate } from '@payloadcms/next/templates';
import { Button, Form, Modal, SelectInput, toast, useConfig, useModal, useTranslation, XIcon } from '@payloadcms/ui';
import React, { useState } from 'react';
import './GenerateRulesModal.scss';
const baseClass = 'generate-rules-options';
export const BtnGenerateRulesVectorDb = (props)=>{
const { config } = useConfig();
const { routes: { api: apiRoute } = {} } = config;
const modalKey = 'generate-rules-modal';
const { openModal, isModalOpen, closeAllModals } = useModal();
const [loading, setLoading] = React.useState(false);
const [llmApps, setllmApps] = useState([]);
const [selectedLlmApp, setSelectedLlmApp] = React.useState('');
const { t } = useTranslation();
const generateRules = async (appId)=>{
setLoading(true);
try {
const httpResponse = await fetch(`${apiRoute}/llm/rules`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
referrer: '',
body: JSON.stringify({
appId: appId
})
});
if (httpResponse.ok) {
const response = await httpResponse.json();
const gotError = response.some((element)=>element.status === 'error');
if (!gotError) {
toast.success(t('general:generateRulesSuccess'));
} else {
const toastMsg = /*#__PURE__*/ _jsxs("div", {
children: [
/*#__PURE__*/ _jsx("div", {
children: t('general:generateRulesError')
}),
/*#__PURE__*/ _jsx("ul", {
children: response.filter((element)=>element.status === 'error').map((element)=>/*#__PURE__*/ _jsx("li", {
children: /*#__PURE__*/ _jsxs("div", {
children: [
`App: ${element.name}`,
" - ",
element.error
]
})
}))
})
]
});
toast.error(toastMsg, {}); // { autoClose: false });
}
} else {
throw new Error(`Response status: ${httpResponse.status}`);
}
} catch (error) {
console.error(`${t('general:generateRulesError')}: ${error}`);
toast.error(`${t('general:generateRulesError')}: ${error}`, {}); // { autoClose: false });
} finally{
setLoading(false);
}
};
const onSubmit = async ()=>{
try {
// generate rules for the selected app
generateRules(selectedLlmApp);
closeAllModals();
} catch (error) {
console.error(t('general:generateRulesError') + ': ', error);
toast.error(t('general:generateRulesError'));
}
};
const handleClick = async ()=>{
try {
// get user apps for which it's possible to generate rules
const httpResponse = await fetch(`${apiRoute}/llm/apps`, {
method: 'GET'
});
const response = await httpResponse.json();
if (httpResponse.ok) {
const apps = response;
setllmApps(apps.map((app)=>({
value: app.id,
label: app.name
})));
if (apps.length > 1) {
// user has many apps: open modal to select the app for which to generate rules
openModal(modalKey);
} else {
// user has only one app: directly generate rules for that app
await generateRules(apps[0].id);
}
} else {
toast.error(response.message);
return;
}
} catch (error) {
console.error(t('general:generateRulesError') + ': ', error);
toast.error(t('general:generateRulesError'));
}
};
return /*#__PURE__*/ _jsxs("div", {
children: [
/*#__PURE__*/ _jsx(Button, {
onClick: handleClick,
disabled: loading,
children: loading ? t('general:generatingRules') : t('general:generateRules')
}),
/*#__PURE__*/ _jsx(Modal, {
slug: modalKey,
className: `${baseClass}__modal`,
children: isModalOpen(modalKey) && /*#__PURE__*/ _jsxs(MinimalTemplate, {
children: [
/*#__PURE__*/ _jsxs("header", {
className: `${baseClass}__header`,
children: [
/*#__PURE__*/ _jsx("h3", {
children: t('general:generateRulesModalTitle')
}),
/*#__PURE__*/ _jsx(Button, {
buttonStyle: "none",
onClick: closeAllModals,
children: /*#__PURE__*/ _jsx(XIcon, {})
})
]
}),
/*#__PURE__*/ _jsx("main", {
className: `${baseClass}__main`,
children: /*#__PURE__*/ _jsxs(Form, {
onSubmit: onSubmit,
children: [
/*#__PURE__*/ _jsx("div", {
className: "render-fields",
children: /*#__PURE__*/ _jsx(SelectInput, {
label: t('general:selectLlmApp'),
name: "llmApp",
path: 'llmApp',
options: llmApps,
value: selectedLlmApp,
onChange: (e)=>setSelectedLlmApp(e.value)
})
}),
/*#__PURE__*/ _jsx("div", {
className: `${baseClass}__foot`,
children: /*#__PURE__*/ _jsx(Button, {
type: "submit",
children: t('general:submit')
})
})
]
})
})
]
})
})
]
});
};
//# sourceMappingURL=BtnGenerateRulesVectorDb.js.map