mirror of https://github.com/halo-dev/halo
141 lines
3.6 KiB
TypeScript
141 lines
3.6 KiB
TypeScript
![]() |
import type { ComputedRef, Ref } from "vue";
|
|||
![]() |
import { computed, ref } from "vue";
|
|||
![]() |
import type { Theme } from "@halo-dev/api-client";
|
|||
![]() |
import { apiClient } from "@/utils/api-client";
|
|||
![]() |
import { Dialog, Toast } from "@halo-dev/components";
|
|||
![]() |
import { useThemeStore } from "@console/stores/theme";
|
|||
![]() |
import { storeToRefs } from "pinia";
|
|||
![]() |
import { useI18n } from "vue-i18n";
|
|||
![]() |
|
|||
|
interface useThemeLifeCycleReturn {
|
|||
![]() |
loading: Ref<boolean>;
|
|||
![]() |
isActivated: ComputedRef<boolean>;
|
|||
![]() |
getFailedMessage: () => string | undefined;
|
|||
![]() |
handleActiveTheme: (reload?: boolean) => void;
|
|||
![]() |
handleResetSettingConfig: () => void;
|
|||
![]() |
}
|
|||
|
|
|||
![]() |
export function useThemeLifeCycle(
|
|||
|
theme: Ref<Theme | undefined>
|
|||
|
): useThemeLifeCycleReturn {
|
|||
![]() |
const { t } = useI18n();
|
|||
|
|
|||
![]() |
const loading = ref(false);
|
|||
![]() |
|
|||
![]() |
const themeStore = useThemeStore();
|
|||
![]() |
|
|||
![]() |
const { activatedTheme } = storeToRefs(themeStore);
|
|||
![]() |
|
|||
![]() |
const isActivated = computed(() => {
|
|||
|
return activatedTheme?.value?.metadata.name === theme.value?.metadata.name;
|
|||
|
});
|
|||
![]() |
|
|||
![]() |
const getFailedMessage = (): string | undefined => {
|
|||
|
if (!(theme.value?.status?.phase === "FAILED")) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
const condition = theme.value.status.conditions?.[0];
|
|||
|
|
|||
|
if (condition) {
|
|||
|
return [condition.type, condition.message].join(":");
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
![]() |
const handleActiveTheme = async (reload?: boolean) => {
|
|||
![]() |
Dialog.info({
|
|||
![]() |
title: t("core.theme.operations.active.title"),
|
|||
![]() |
description: theme.value?.spec.displayName,
|
|||
![]() |
confirmText: t("core.common.buttons.confirm"),
|
|||
|
cancelText: t("core.common.buttons.cancel"),
|
|||
![]() |
onConfirm: async () => {
|
|||
|
try {
|
|||
![]() |
if (!theme.value) return;
|
|||
![]() |
|
|||
![]() |
await apiClient.theme.activateTheme({
|
|||
|
name: theme.value?.metadata.name,
|
|||
|
});
|
|||
![]() |
|
|||
![]() |
Toast.success(t("core.theme.operations.active.toast_success"));
|
|||
![]() |
|
|||
|
if (reload) {
|
|||
|
window.location.reload();
|
|||
|
}
|
|||
![]() |
} catch (e) {
|
|||
|
console.error("Failed to active theme", e);
|
|||
|
} finally {
|
|||
![]() |
themeStore.fetchActivatedTheme();
|
|||
![]() |
}
|
|||
|
},
|
|||
|
});
|
|||
|
};
|
|||
|
|
|||
![]() |
const handleResetSettingConfig = async () => {
|
|||
|
Dialog.warning({
|
|||
![]() |
title: t("core.theme.operations.reset.title"),
|
|||
|
description: t("core.theme.operations.reset.description"),
|
|||
![]() |
confirmType: "danger",
|
|||
![]() |
confirmText: t("core.common.buttons.confirm"),
|
|||
|
cancelText: t("core.common.buttons.cancel"),
|
|||
![]() |
onConfirm: async () => {
|
|||
|
try {
|
|||
|
if (!theme?.value) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
await apiClient.theme.resetThemeConfig({
|
|||
|
name: theme.value.metadata.name as string,
|
|||
|
});
|
|||
|
|
|||
![]() |
Toast.success(t("core.theme.operations.reset.toast_success"));
|
|||
![]() |
} catch (e) {
|
|||
|
console.error("Failed to reset theme setting config", e);
|
|||
|
}
|
|||
|
},
|
|||
|
});
|
|||
|
};
|
|||
|
|
|||
![]() |
return {
|
|||
![]() |
loading,
|
|||
![]() |
isActivated,
|
|||
![]() |
getFailedMessage,
|
|||
![]() |
handleActiveTheme,
|
|||
![]() |
handleResetSettingConfig,
|
|||
![]() |
};
|
|||
|
}
|
|||
![]() |
|
|||
|
export function useThemeCustomTemplates(type: "post" | "page" | "category") {
|
|||
|
const themeStore = useThemeStore();
|
|||
![]() |
const { t } = useI18n();
|
|||
|
|
|||
![]() |
const templates = computed(() => {
|
|||
|
const defaultTemplate = [
|
|||
|
{
|
|||
![]() |
label: t("core.theme.custom_templates.default"),
|
|||
![]() |
value: "",
|
|||
|
},
|
|||
|
];
|
|||
|
|
|||
|
if (!themeStore.activatedTheme) {
|
|||
|
return defaultTemplate;
|
|||
|
}
|
|||
|
const { customTemplates } = themeStore.activatedTheme.spec;
|
|||
|
if (!customTemplates?.[type]) {
|
|||
|
return defaultTemplate;
|
|||
|
}
|
|||
|
return [
|
|||
|
...defaultTemplate,
|
|||
|
...(customTemplates[type]?.map((template) => {
|
|||
|
return {
|
|||
|
value: template.file,
|
|||
|
label: template.name || template.file,
|
|||
|
};
|
|||
|
}) || []),
|
|||
|
];
|
|||
|
});
|
|||
|
|
|||
|
return {
|
|||
|
templates,
|
|||
|
};
|
|||
|
}
|