diff --git a/src/composables/use-setting-form.ts b/src/composables/use-setting-form.ts new file mode 100644 index 000000000..4f8c51aae --- /dev/null +++ b/src/composables/use-setting-form.ts @@ -0,0 +1,126 @@ +// core libs +import { ref } from "vue"; +import { apiClient } from "@halo-dev/admin-shared"; + +// libs +import cloneDeep from "lodash.clonedeep"; + +// types +import type { Ref } from "vue"; +import type { + FormKitSetting, + FormKitSettingSpec, +} from "@halo-dev/admin-shared"; +import type { ConfigMap } from "@halo-dev/api-client"; + +const initialConfigMap: ConfigMap = { + apiVersion: "v1alpha1", + kind: "ConfigMap", + metadata: { + name: "", + }, + data: {}, +}; + +export function useSettingForm( + settingName: Ref, + configMapName: Ref +) { + const settings = ref(); + const configMap = ref(cloneDeep(initialConfigMap)); + const configMapFormData = ref< + Record> | undefined + >(); + const saving = ref(false); + + const handleFetchSettings = async () => { + if (!settingName.value) { + settings.value = undefined; + return; + } + try { + const response = await apiClient.extension.setting.getv1alpha1Setting( + settingName.value + ); + settings.value = response.data as FormKitSetting; + } catch (e) { + console.error(e); + } + }; + + const handleFetchConfigMap = async () => { + if (!configMapName.value) { + configMap.value = cloneDeep(initialConfigMap); + configMapFormData.value = undefined; + return; + } + try { + const response = await apiClient.extension.configMap.getv1alpha1ConfigMap( + configMapName.value + ); + configMap.value = response.data; + + const { data } = configMap.value; + + if (data) { + configMapFormData.value = Object.keys(data).reduce((acc, key) => { + acc[key] = JSON.parse(data[key]); + return acc; + }, {}); + } + } catch (e) { + console.error(e); + } finally { + if (!configMapFormData.value) { + configMapFormData.value = settings.value?.spec.reduce((acc, item) => { + acc[item.group] = {}; + return acc; + }, {}); + } + } + }; + + const handleSaveConfigMap = async () => { + try { + saving.value = true; + + if (!configMap.value.metadata.name && configMapName.value) { + configMap.value.metadata.name = configMapName.value; + } + + settings?.value?.spec.forEach((item: FormKitSettingSpec) => { + // @ts-ignore + configMap.value.data[item.group] = JSON.stringify( + configMapFormData?.value?.[item.group] + ); + }); + + if (!configMap.value.metadata.creationTimestamp) { + await apiClient.extension.configMap.createv1alpha1ConfigMap( + configMap.value + ); + } else { + await apiClient.extension.configMap.updatev1alpha1ConfigMap( + configMap.value.metadata.name, + configMap.value + ); + } + } catch (e) { + console.error(e); + } finally { + await handleFetchSettings(); + await handleFetchConfigMap(); + saving.value = false; + } + }; + + return { + settings, + configMap, + configMapFormData, + saving, + handleFetchSettings, + handleFetchConfigMap, + handleSaveConfigMap, + }; +} diff --git a/src/modules/interface/themes/ThemeDetail.vue b/src/modules/interface/themes/ThemeDetail.vue index 1fcb6d466..a8aef3c7a 100644 --- a/src/modules/interface/themes/ThemeDetail.vue +++ b/src/modules/interface/themes/ThemeDetail.vue @@ -1,8 +1,13 @@