import type { PluginTestReqType, PluginType } from 'nocodb-sdk' export enum Action { Save = 'save', Test = 'test', } const [useProvideAccountSetupStore, useAccountSetupStore] = createInjectionState(() => { const apps = ref<(PluginType & { parsedInput?: Record; tags?: string[] })[]>([]) const { $api, $e } = useNuxtApp() const { t } = useI18n() const activePlugin = ref(null) const activePluginFormData = ref({}) const isLoading = ref(false) const loadingAction = ref(null) const showPluginUninstallModal = ref(false) const emailApps = computed(() => apps.value.filter((app) => app.category === 'Email')) const storageApps = computed(() => apps.value.filter((app) => app.category === 'Storage')) const emailConfigured = computed(() => emailApps.value.find((app) => app.active)) const storageConfigured = computed(() => storageApps.value.find((app) => app.active)) const listModalDlg = ref(false) const configModalDlg = ref(false) const categorizeApps = computed(() => { return apps.value.reduce((acc, app) => { const key = app.category.toLowerCase() if (!acc[key]) { acc[key] = [] } acc[key].push(app) return acc }, {} as Record) }) const loadSetupApps = async () => { try { const plugins = (await $api.plugin.list()).list ?? [] apps.value = plugins.map((p) => ({ ...p, tags: p.tags ? p.tags.split(',') : [], parsedInput: p.input && JSON.parse(p.input as string), })) as any[] } catch (e: any) { message.error(await extractSdkResponseErrorMsg(e)) } } const saveSettings = async () => { loadingAction.value = Action.Save try { await $api.plugin.update(activePlugin.value?.id, { input: JSON.stringify(activePluginFormData.value), active: true, }) // Plugin settings saved successfully message.success(activePlugin.value?.formDetails.msgOnInstall || t('msg.success.pluginSettingsSaved')) // load all apps again to update the pending status loadSetupApps().catch(console.error) navigateTo('/account/setup') } catch (e: any) { message.error(await extractSdkResponseErrorMsg(e)) } finally { loadingAction.value = null } } const testSettings = async () => { loadingAction.value = Action.Test try { if (activePlugin.value) { const res = await $api.plugin.test({ input: JSON.stringify(activePluginFormData.value), title: activePlugin.value.title, category: activePlugin.value.category, } as PluginTestReqType) if (res) { // Successfully tested plugin settings message.success(t('msg.success.pluginTested')) } else { // Invalid credentials message.info(t('msg.info.invalidCredentials')) } } } catch (e: any) { message.error(await extractSdkResponseErrorMsg(e)) } finally { loadingAction.value = null } } const readPluginDetails = async (id: string) => { try { isLoading.value = true const res = await $api.plugin.read(id) const formDetails = JSON.parse(res.input_schema ?? '{}') const emptyParsedInput = formDetails.array ? [{}] : {} const parsedInput = typeof res.input === 'string' ? JSON.parse(res.input) : emptyParsedInput // the type of 'secure' was XcType.SingleLineText in 0.0.1 // and it has been changed to XcType.Checkbox, since 0.0.2 // hence, change the text value to boolean here if ('secure' in parsedInput && typeof parsedInput.secure === 'string') { parsedInput.secure = parsedInput.secure === 'true' } activePlugin.value = { ...res, formDetails, parsedInput } activePluginFormData.value = activePlugin.value.parsedInput } catch (e) { console.log(e) } finally { isLoading.value = false } } const resetPlugin = async () => { try { await $api.plugin.update(activePlugin.value.id, { input: null, active: false, }) // Plugin uninstalled successfully message.success(t('msg.success.pluginUninstalled')) showPluginUninstallModal.value = false await loadSetupApps() } catch (e: any) { message.error(await extractSdkResponseErrorMsg(e)) } $e('a:appstore:reset', { app: activePlugin.value.title }) } return { apps, emailApps, storageApps, loadSetupApps, categorizeApps, activePlugin, readPluginDetails, activePluginFormData, isLoading, testSettings, saveSettings, loadingAction, emailConfigured, storageConfigured, listModalDlg, configModalDlg, showPluginUninstallModal, resetPlugin, } }) export { useProvideAccountSetupStore } export function useAccountSetupStoreOrThrow() { const columnCreateStore = useAccountSetupStore() if (columnCreateStore == null) throw new Error('Please call `useProvideAccountSetupStore` on the appropriate parent component') return columnCreateStore }