+
diff --git a/front/composables/useFeatureMeta.ts b/front/composables/useFeatureMeta.ts
new file mode 100644
index 0000000..fb96e82
--- /dev/null
+++ b/front/composables/useFeatureMeta.ts
@@ -0,0 +1,49 @@
+import { LucideShare, LucideImageMinus, LucideArrowRightLeft } from 'lucide-vue-next'
+import useMyAppConfig from '@/composables/useMyAppConfig'
+import type { FileHandleKey, TextHandleKey } from '../components/Preprocessing/types'
+
+export type FeatureKey = FileHandleKey | TextHandleKey
+
+export type FeatureMeta = {
+ key: FeatureKey
+ label: string
+ icon: any
+ className: string
+}
+
+const allFeatureMeta = (t: (key: string) => string): FeatureMeta[] => [
+ {
+ key: 'file-share',
+ label: t('page.upload.file.handleType.file-share'),
+ icon: LucideShare,
+ className: 'bg-green-300',
+ },
+ {
+ key: 'file-image-compress',
+ label: t('page.upload.file.handleType.file-image-compress'),
+ icon: LucideImageMinus,
+ className: 'bg-red-300',
+ },
+ {
+ key: 'file-image-convert',
+ label: t('page.upload.file.handleType.file-image-convert'),
+ icon: LucideArrowRightLeft,
+ className: 'bg-purple-300',
+ },
+ {
+ key: 'text-share',
+ label: t('page.upload.text.handleType.text-share'),
+ icon: LucideShare,
+ className: 'bg-green-300',
+ },
+]
+
+export function useFeatureMeta() {
+ const { t } = useI18n()
+ const appConfig = useMyAppConfig()
+
+ return computed(() => {
+ const enabledKeys = appConfig.value?.features ?? []
+ return allFeatureMeta(t).filter((meta) => enabledKeys.includes(meta.key))
+ })
+}
diff --git a/front/composables/useMyAppConfig.ts b/front/composables/useMyAppConfig.ts
index e6a4b72..37e6e07 100644
--- a/front/composables/useMyAppConfig.ts
+++ b/front/composables/useMyAppConfig.ts
@@ -8,6 +8,7 @@ const useMyAppConfig = () => {
site_bg_url: string
version: string
build_time: number
+ features: string[]
}
}>('/api/config')
return computed(() => data?.value?.data)