n8n-editor-ui
Version:
Workflow Editor UI for n8n
97 lines (96 loc) • 5.16 kB
JavaScript
import { C as computed, D as createElementBlock, Gt as unref, It as ref, P as defineComponent, _t as watch, at as renderSlot, et as openBlock, vn as normalizeClass } from "./vue.runtime.esm-bundler-tP5dCd7J.js";
import { M as useLocalStorage, N as useMediaQuery, O as useEventListener } from "./_MapCache-ficiegRb.js";
import { ct as useDeviceSupport } from "./src-DgvumQTi.js";
import { t as __plugin_vue_export_helper_default } from "./_plugin-vue_export-helper-BwBpWJRZ.js";
import { y as useRouter } from "./truncate-B1HVeveJ.js";
import { Xn as useProjectsStore, gn as useCredentialsStore, gs as useSettingsStore, oa as useUIStore } from "./builder.store-sBTWwxRU.js";
import { $r as chatHubProviderSchema, Fo as stringType, Mo as nullType, No as objectType, Po as recordType, Ts as LOCAL_STORAGE_CHAT_HUB_CREDENTIALS, Xr as agentIconOrEmojiSchema, Yr as PROVIDER_CREDENTIAL_TYPE_MAP, Zr as chatHubConversationModelSchema } from "./constants-BbpucWL4.js";
import { f as MOBILE_MEDIA_QUERY, u as CHAT_VIEW } from "./constants-DLTaaipl.js";
import { l as isLlmProvider, u as isLlmProviderModel } from "./chat.store-BGFxJU_3.js";
const credentialsMapSchema = recordType(chatHubProviderSchema, stringType().or(nullType()));
const chatHubConversationModelWithCachedDisplayNameSchema = chatHubConversationModelSchema.and(objectType({
cachedDisplayName: stringType().optional(),
cachedIcon: agentIconOrEmojiSchema.optional()
})).transform((value) => ({
...value,
cachedDisplayName: value.cachedDisplayName || (isLlmProviderModel(value) ? value.model : "")
}));
function useChatCredentials(userId) {
const isInitialized = ref(false);
const credentialsStore = useCredentialsStore();
const settingsStore = useSettingsStore();
const projectStore = useProjectsStore();
const selectedCredentials = useLocalStorage(LOCAL_STORAGE_CHAT_HUB_CREDENTIALS(userId), {}, {
writeDefaults: false,
shallow: true,
serializer: {
read: (value) => {
try {
return credentialsMapSchema.parse(JSON.parse(value));
} catch (error) {
return {};
}
},
write: (value) => JSON.stringify(value)
}
});
const isCredentialsReady = computed(() => isInitialized.value || credentialsStore.allCredentials.length > 0);
const autoSelectCredentials = computed(() => Object.fromEntries(chatHubProviderSchema.options.map((provider) => {
if (!isLlmProvider(provider)) return [provider, null];
const credentialType = PROVIDER_CREDENTIAL_TYPE_MAP[provider];
if (!credentialType) return [provider, null];
const availableCredentials = credentialsStore.getCredentialsByType(credentialType);
const settings = settingsStore.moduleSettings?.["chat-hub"]?.providers[provider];
if (settings?.credentialId && availableCredentials.some((c) => c.id === settings.credentialId)) return [provider, settings.credentialId];
return [provider, availableCredentials.toSorted((a, b) => +new Date(b.createdAt) - +new Date(a.createdAt))[0]?.id ?? null];
})));
const credentialsByProvider = computed(() => isCredentialsReady.value ? chatHubProviderSchema.options.reduce((acc, provider) => {
const cred = selectedCredentials.value[provider] ?? null;
acc[provider] = cred && credentialsStore.allCredentials.some((c) => c.id === cred) ? cred : autoSelectCredentials.value[provider];
return acc;
}, {}) : null);
function selectCredential(provider, id) {
selectedCredentials.value = {
...selectedCredentials.value,
[provider]: id
};
}
watch(() => projectStore.personalProject, async (personalProject) => {
if (personalProject) {
await Promise.all([credentialsStore.fetchCredentialTypes(false), credentialsStore.fetchAllCredentialsForWorkflow({ projectId: personalProject.id })]);
isInitialized.value = true;
}
}, { immediate: true });
return {
credentialsByProvider,
selectCredential
};
}
var ChatLayout_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "ChatLayout",
setup(__props) {
const isMobileDevice$1 = useMediaQuery(MOBILE_MEDIA_QUERY);
const router = useRouter();
const uiStore = useUIStore();
const { isCtrlKeyPressed } = useDeviceSupport();
useEventListener(document, "keydown", (event) => {
if (event.key.toLowerCase() === "o" && isCtrlKeyPressed(event) && event.shiftKey && !uiStore.isAnyModalOpen) {
event.preventDefault();
event.stopPropagation();
router.push({
name: CHAT_VIEW,
force: true
});
}
});
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", { class: normalizeClass([_ctx.$style.component, { [_ctx.$style.isMobileDevice]: unref(isMobileDevice$1) }]) }, [renderSlot(_ctx.$slots, "default")], 2);
};
}
});
var ChatLayout_vue_vue_type_style_index_0_lang_module_default = {
component: "_component_gldft_123",
isMobileDevice: "_isMobileDevice_gldft_134"
};
var ChatLayout_default = /* @__PURE__ */ __plugin_vue_export_helper_default(ChatLayout_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": ChatLayout_vue_vue_type_style_index_0_lang_module_default }]]);
export { useChatCredentials as n, chatHubConversationModelWithCachedDisplayNameSchema as r, ChatLayout_default as t };