221 lines
6.7 KiB
Vue
221 lines
6.7 KiB
Vue
<template>
|
|
<div>
|
|
<div class="container space-y-8 divide-y divide-dividerLight">
|
|
<div class="md:grid md:gap-4 md:grid-cols-3">
|
|
<div class="p-8 md:col-span-1">
|
|
<h3 class="heading">
|
|
{{ t("settings.theme") }}
|
|
</h3>
|
|
<p class="my-1 text-secondaryLight">
|
|
{{ t("settings.theme_description") }}
|
|
</p>
|
|
</div>
|
|
<div class="p-8 space-y-8 md:col-span-2">
|
|
<section>
|
|
<h4 class="font-semibold text-secondaryDark">
|
|
{{ t("settings.background") }}
|
|
</h4>
|
|
<div class="my-1 text-secondaryLight">
|
|
{{ t(getColorModeName(colorMode.preference)) }}
|
|
<span v-if="colorMode.preference === 'system'">
|
|
({{ t(getColorModeName(colorMode.value)) }})
|
|
</span>
|
|
</div>
|
|
<div class="mt-4">
|
|
<SmartColorModePicker />
|
|
</div>
|
|
</section>
|
|
<section>
|
|
<h4 class="font-semibold text-secondaryDark">
|
|
{{ t("settings.accent_color") }}
|
|
</h4>
|
|
<div class="my-1 text-secondaryLight">
|
|
{{ ACCENT_COLOR.charAt(0).toUpperCase() + ACCENT_COLOR.slice(1) }}
|
|
</div>
|
|
<div class="mt-4">
|
|
<SmartAccentModePicker />
|
|
</div>
|
|
</section>
|
|
<section>
|
|
<h4 class="font-semibold text-secondaryDark">
|
|
{{ t("settings.font_size") }}
|
|
</h4>
|
|
<div class="mt-4">
|
|
<SmartFontSizePicker />
|
|
</div>
|
|
</section>
|
|
<section>
|
|
<h4 class="font-semibold text-secondaryDark">
|
|
{{ t("settings.language") }}
|
|
</h4>
|
|
<div class="mt-4">
|
|
<SmartChangeLanguage />
|
|
</div>
|
|
</section>
|
|
<section>
|
|
<h4 class="font-semibold text-secondaryDark">
|
|
{{ t("settings.experiments") }}
|
|
</h4>
|
|
<div class="my-1 text-secondaryLight">
|
|
{{ t("settings.experiments_notice") }}
|
|
<HoppSmartAnchor
|
|
class="link"
|
|
to="https://github.com/hoppscotch/hoppscotch/issues/new/choose"
|
|
blank
|
|
:label="t('app.contact_us')"
|
|
/>.
|
|
</div>
|
|
<div class="py-4 space-y-4">
|
|
<div class="flex items-center">
|
|
<HoppSmartToggle
|
|
:on="TELEMETRY_ENABLED"
|
|
@change="showConfirmModal"
|
|
>
|
|
{{ t("settings.telemetry") }}
|
|
</HoppSmartToggle>
|
|
</div>
|
|
<div class="flex items-center">
|
|
<HoppSmartToggle
|
|
:on="EXPAND_NAVIGATION"
|
|
@change="toggleSetting('EXPAND_NAVIGATION')"
|
|
>
|
|
{{ t("settings.expand_navigation") }}
|
|
</HoppSmartToggle>
|
|
</div>
|
|
<div class="flex items-center">
|
|
<HoppSmartToggle
|
|
:on="SIDEBAR_ON_LEFT"
|
|
@change="toggleSetting('SIDEBAR_ON_LEFT')"
|
|
>
|
|
{{ t("settings.sidebar_on_left") }}
|
|
</HoppSmartToggle>
|
|
</div>
|
|
<div class="flex items-center">
|
|
<HoppSmartToggle
|
|
:on="ZEN_MODE"
|
|
@change="toggleSetting('ZEN_MODE')"
|
|
>
|
|
{{ t("layout.zen_mode") }}
|
|
</HoppSmartToggle>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="md:grid md:gap-4 md:grid-cols-3">
|
|
<div class="p-8 md:col-span-1">
|
|
<h3 class="heading">
|
|
{{ t("settings.interceptor") }}
|
|
</h3>
|
|
<p class="my-1 text-secondaryLight">
|
|
{{ t("settings.interceptor_description") }}
|
|
</p>
|
|
</div>
|
|
<div class="p-8 space-y-8 md:col-span-2">
|
|
<section v-for="[id, settings] in interceptorsWithSettings" :key="id">
|
|
<h4 class="font-semibold text-secondaryDark">
|
|
{{ settings.entryTitle(t) }}
|
|
</h4>
|
|
<component :is="settings.component" />
|
|
</section>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<HoppSmartConfirmModal
|
|
:show="confirmRemove"
|
|
:title="`${t('confirm.remove_telemetry')} ${t(
|
|
'settings.telemetry_helps_us'
|
|
)}`"
|
|
@hide-modal="confirmRemove = false"
|
|
@resolve="
|
|
() => {
|
|
toggleSetting('TELEMETRY_ENABLED')
|
|
confirmRemove = false
|
|
}
|
|
"
|
|
/>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { ref, computed, watch } from "vue"
|
|
import { applySetting, toggleSetting } from "~/newstore/settings"
|
|
import { useSetting } from "@composables/settings"
|
|
import { useI18n } from "@composables/i18n"
|
|
import { useColorMode } from "@composables/theming"
|
|
import { usePageHead } from "@composables/head"
|
|
import { useService } from "dioc/vue"
|
|
import { InterceptorService } from "~/services/interceptor.service"
|
|
import { pipe } from "fp-ts/function"
|
|
import * as O from "fp-ts/Option"
|
|
import * as A from "fp-ts/Array"
|
|
|
|
const t = useI18n()
|
|
const colorMode = useColorMode()
|
|
|
|
usePageHead({
|
|
title: computed(() => t("navigation.settings")),
|
|
})
|
|
|
|
const interceptorService = useService(InterceptorService)
|
|
const interceptorsWithSettings = computed(() =>
|
|
pipe(
|
|
interceptorService.availableInterceptors.value,
|
|
A.filterMap((interceptor) =>
|
|
interceptor.settingsPageEntry
|
|
? O.some([
|
|
interceptor.interceptorID,
|
|
interceptor.settingsPageEntry,
|
|
] as const)
|
|
: O.none
|
|
)
|
|
)
|
|
)
|
|
|
|
const ACCENT_COLOR = useSetting("THEME_COLOR")
|
|
const PROXY_URL = useSetting("PROXY_URL")
|
|
const TELEMETRY_ENABLED = useSetting("TELEMETRY_ENABLED")
|
|
const EXPAND_NAVIGATION = useSetting("EXPAND_NAVIGATION")
|
|
const SIDEBAR_ON_LEFT = useSetting("SIDEBAR_ON_LEFT")
|
|
const ZEN_MODE = useSetting("ZEN_MODE")
|
|
|
|
const confirmRemove = ref(false)
|
|
|
|
const proxySettings = computed(() => ({
|
|
url: PROXY_URL.value,
|
|
}))
|
|
|
|
watch(ZEN_MODE, (mode) => {
|
|
applySetting("EXPAND_NAVIGATION", !mode)
|
|
})
|
|
|
|
watch(
|
|
proxySettings,
|
|
({ url }) => {
|
|
applySetting("PROXY_URL", url)
|
|
},
|
|
{ deep: true }
|
|
)
|
|
|
|
const showConfirmModal = () => {
|
|
if (TELEMETRY_ENABLED.value) confirmRemove.value = true
|
|
else toggleSetting("TELEMETRY_ENABLED")
|
|
}
|
|
|
|
const getColorModeName = (colorMode: string) => {
|
|
switch (colorMode) {
|
|
case "system":
|
|
return "settings.system_mode"
|
|
case "light":
|
|
return "settings.light_mode"
|
|
case "dark":
|
|
return "settings.dark_mode"
|
|
case "black":
|
|
return "settings.black_mode"
|
|
default:
|
|
return "settings.system_mode"
|
|
}
|
|
}
|
|
</script>
|