Skip to content

Commit

Permalink
feat(market): support user settings, migrate to settings API
Browse files Browse the repository at this point in the history
  • Loading branch information
shigma committed Jan 29, 2024
1 parent 4c8378c commit bc0d11f
Show file tree
Hide file tree
Showing 9 changed files with 140 additions and 91 deletions.
20 changes: 11 additions & 9 deletions plugins/market/client/components/confirm.vue
Expand Up @@ -17,7 +17,7 @@
</tr>
</thead>
<tbody>
<tr v-for="(version, name) in config.override" :key="name">
<tr v-for="(version, name) in config.market.override" :key="name">
<td>{{ name }}</td>
<td>{{ store.dependencies?.[name]?.resolved || '未安装' }}</td>
<td class="arrow"><span><k-icon name="arrow-right"></k-icon></span></td>
Expand All @@ -27,7 +27,7 @@
</table>
<template #footer>
<div class="left">
<el-checkbox :disabled="!hasRemove" v-model="config.removeConfig">
<el-checkbox :disabled="!hasRemove" v-model="removeConfig">
为新卸载的依赖删除配置
</el-checkbox>
</div>
Expand All @@ -42,26 +42,28 @@
<script lang="ts" setup>
import { computed } from 'vue'
import { store, useContext } from '@koishijs/client'
import { computed, ref } from 'vue'
import { store, useContext, useConfig } from '@koishijs/client'
import { showConfirm, install } from './utils'
import { config } from '../utils'
const ctx = useContext()
const config = useConfig()
const removeConfig = ref(config.value.market?.removeConfig)
function clear() {
showConfirm.value = false
config.value.override = {}
config.value.market.override = {}
}
const hasRemove = computed(() => {
return Object.values(config.value.override).some(version => !version)
return Object.values(config.value.market.override).some(version => !version)
})
function confirm() {
showConfirm.value = false
return install(config.value.override, async () => {
for (const [name, value] of Object.entries(config.value.override)) {
return install(config.value.market.override, async () => {
for (const [name, value] of Object.entries(config.value.market.override)) {
if (!value || store.dependencies?.[name]?.resolved) continue
ctx.configWriter?.ensure(name, true)
}
Expand Down
14 changes: 8 additions & 6 deletions plugins/market/client/components/dependencies.vue
Expand Up @@ -36,17 +36,19 @@
<script lang="ts" setup>
import { computed, watch, WatchStopHandle } from 'vue'
import { store, useContext } from '@koishijs/client'
import { config, hasUpdate } from '../utils'
import { store, useConfig, useContext } from '@koishijs/client'
import { hasUpdate } from '../utils'
import { addManual } from './utils'
import ManualInstall from './manual.vue'
import PackageView from './package.vue'
const config = useConfig()
const names = computed(() => {
return Object
.keys({
...store.dependencies,
...config.value.override,
...config.value.market.override,
})
.sort((a, b) => a > b ? 1 : -1)
})
Expand All @@ -55,12 +57,12 @@ let dispose: WatchStopHandle
watch(() => store.market?.registry, (registry) => {
dispose?.()
if (!registry) return
dispose = watch(() => config.value.override, (object) => {
dispose = watch(() => config.value.market.override, (object) => {
Object.keys(object).forEach(async (name) => {
if (store.dependencies[name]) return
addManual(name)
})
}, { immediate: true })
}, { immediate: true, deep: true })
}, { immediate: true })
const updates = computed(() => names.value.filter(hasUpdate))
Expand All @@ -72,7 +74,7 @@ ctx.action('dependencies.upgrade', {
async action() {
for (const name of updates.value) {
const versions = store.registry[name]
config.value.override[name] = Object.keys(versions)[0]
config.value.market.override[name] = Object.keys(versions)[0]
}
},
})
Expand Down
71 changes: 52 additions & 19 deletions plugins/market/client/components/install.vue
Expand Up @@ -69,7 +69,7 @@
<template v-if="active && !global.static" #footer>
<div class="left">
<el-checkbox v-model="config.bulkMode">
<el-checkbox v-model="config.market.bulkMode">
批量操作模式
<k-hint>
批量操作模式下,你可以同时安装、更新或移除多个插件。勾选此选项后,你的所有操作会被暂存,直到你点击右上角的“应用更改”按钮。
Expand All @@ -92,49 +92,82 @@
</template>
</el-dialog>
<el-dialog v-model="confirmRemoveConfig" destroy-on-close>
<el-dialog v-model="showRemoveDialog" destroy-on-close>
检测到你正在卸载一个已配置的插件,是否同时删除其配置?
<template #footer>
<el-button type="danger" @click="installDep('', false, true)">删除</el-button>
<el-button type="primary" @click="installDep('', false, false)">保留</el-button>
<div class="left">
<el-checkbox v-model="saveChoice">
记住我的选择
<k-hint>
未来将不再弹出此对话框。你仍然可以在用户设置中更改此行为。
</k-hint>
</el-checkbox>
</div>
<div class="right">
<el-button type="danger" @click="installDep('', false, true)">删除</el-button>
<el-button type="primary" @click="installDep('', false, false)">保留</el-button>
</div>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
import { computed, ref, watch, reactive } from 'vue'
import { Dict, global, send, store, useContext } from '@koishijs/client'
import { Dict, global, send, store, useContext, useConfig } from '@koishijs/client'
import { analyzeVersions, install, PeerInfo, ResultType } from './utils'
import { active, config } from '../utils'
import { active } from '../utils'
import { parse } from 'semver'
const ctx = useContext()
const confirmRemoveConfig = ref(false)
const config = useConfig()
const saveChoice = ref(false)
const showRemoveDialog = ref(false)
function installDep(version: string, checkConfig = false, removeConfig = false) {
const target = active.value
if (!target) return
// workspace packages don't need to be installed
if (config.value.bulkMode && !workspace.value) {
if (config.value.market.bulkMode && !workspace.value) {
if (dep.value?.resolved === version || !version && !dep.value) {
delete config.value.override[target]
delete config.value.market.override[target]
} else {
config.value.override[target] = version
config.value.market.override[target] = version
}
active.value = ''
return
}
// 1. The plugin is to be removed.
// 2. The plugin has config entries.
// 3. `removeConfig` is not set.
if (checkConfig && ctx.configWriter?.get(target)?.length) {
confirmRemoveConfig.value = true
return
if (typeof config.value.market?.removeConfig !== 'boolean') {
showRemoveDialog.value = true
return
} else {
removeConfig = config.value.market.removeConfig
}
}
confirmRemoveConfig.value = false
if (saveChoice.value) {
config.value.market = {
...config.value.market,
removeConfig,
}
}
saveChoice.value = false
showRemoveDialog.value = false
versions[target] = version
install(versions, async () => {
return install(versions, async () => {
if (workspace.value) return
if (version) {
ctx.configWriter?.ensure(target)
for (const key in versions) {
ctx.configWriter?.ensure(key, key !== target)
}
} else if (removeConfig) {
ctx.configWriter?.remove(target)
}
Expand Down Expand Up @@ -162,7 +195,7 @@ const selectVersion = computed({
const versions = reactive<Dict<string>>({})
function getOverride() {
return config.value.bulkMode ? config.value.override : versions
return config.value.market.bulkMode ? config.value.market.override : versions
}
function getVersion(name: string) {
Expand All @@ -189,7 +222,7 @@ const current = computed(() => store.dependencies?.[active.value]?.resolved)
const local = computed(() => store.packages?.[active.value])
const showRemoveButton = computed(() => {
return current.value || store.dependencies[active.value] || config.value.bulkMode && config.value.override[active.value]
return current.value || store.dependencies[active.value] || config.value.market.bulkMode && config.value.market.override[active.value]
})
const workspace = computed(() => getWorkspaceVersion(active.value))
Expand Down Expand Up @@ -250,7 +283,7 @@ watch(() => data.value?.[version.value]?.peers, async (peers) => {
registry = await send('market/registry', names)
}
Object.assign(registry, store.registry)
if (config.value.bulkMode) return
if (config.value.market.bulkMode) return
// rebuild versions
for (const name of Object.keys(versions)) {
Expand All @@ -269,7 +302,7 @@ watch(() => data.value?.[version.value]?.peers, async (peers) => {
watch(active, async (name) => {
if (!name) return
version.value = config.value.override[active.value]
version.value = config.value.market.override[active.value]
|| store.dependencies?.[active.value]?.request
|| Object.keys(store.registry?.[name] || {})[0]
Expand Down
8 changes: 3 additions & 5 deletions plugins/market/client/components/manual.vue
Expand Up @@ -20,15 +20,13 @@
import { computed, ref, watch } from 'vue'
import type { Registry } from '@koishijs/registry'
import { store } from '@koishijs/client'
import { store, useConfig } from '@koishijs/client'
import { useDebounceFn } from '@vueuse/core'
import { showManual, addManual } from './utils'
import { config } from '../utils'
const config = useConfig()
const invalid = computed(() => false)
const name = ref('')
const remote = ref<Registry>()
const fetchRemote = useDebounceFn(async (name2: string) => {
Expand All @@ -47,7 +45,7 @@ watch(name, (name2) => {
function onEnter() {
if (!remote.value) return
const { name } = remote.value
config.value.override[name] = remote.value['dist-tags'].latest
config.value.market.override[name] = remote.value['dist-tags'].latest
showManual.value = false
}
Expand Down
9 changes: 5 additions & 4 deletions plugins/market/client/components/market.vue
Expand Up @@ -50,9 +50,9 @@

<script setup lang="ts">
import { router, store, global } from '@koishijs/client'
import { router, store, global, useConfig } from '@koishijs/client'
import { computed, provide, ref, watch } from 'vue'
import { active, config } from '../utils'
import { active } from '../utils'
import { getSorted, kConfig, MarketFilter, MarketList, MarketSearch } from '@koishijs/market'
import { SearchObject } from '@koishijs/registry'
Expand All @@ -69,6 +69,7 @@ provide(kConfig, {
})
const root = ref()
const config = useConfig()
const words = ref<string[]>([''])
Expand Down Expand Up @@ -96,7 +97,7 @@ watch(prompt, (value) => {
function getType(data: SearchObject) {
if (global.static) return 'primary'
const version = config.value.override[data.package.name]
const version = config.value.market.override[data.package.name]
if (installed(data)) {
if (version === '') return 'danger'
if (version) return 'warning'
Expand All @@ -108,7 +109,7 @@ function getType(data: SearchObject) {
function getText(data: SearchObject) {
if (global.static) return '配置'
const version = config.value.override[data.package.name]
const version = config.value.market.override[data.package.name]
if (installed(data)) {
if (version === '') return '等待移除'
if (version) return '等待更新'
Expand Down
14 changes: 8 additions & 6 deletions plugins/market/client/components/package.vue
Expand Up @@ -35,14 +35,16 @@
<script lang="ts" setup>
import { computed } from 'vue'
import { store, isNullable } from '@koishijs/client'
import { active, config, hasUpdate } from '../utils'
import { store, isNullable, useConfig } from '@koishijs/client'
import { active, hasUpdate } from '../utils'
import { analyzeVersions } from './utils'
const props = defineProps({
name: String,
})
const config = useConfig()
const dep = computed(() => store.dependencies?.[props.name])
const compare = computed(() => {
Expand All @@ -53,7 +55,7 @@ const compare = computed(() => {
const version = computed({
get() {
const value = config.value.override[props.name]
const value = config.value.market.override[props.name]
if (dep.value?.resolved === value) {
return
} else {
Expand All @@ -62,16 +64,16 @@ const version = computed({
},
set(value) {
if (dep.value?.resolved === value || !value && !dep.value) {
delete config.value.override[props.name]
delete config.value.market.override[props.name]
} else {
config.value.override[props.name] = value
config.value.market.override[props.name] = value
}
},
})
const data = computed(() => {
if (dep.value?.workspace || dep.value?.invalid) return
return analyzeVersions(props.name, (name) => config.value.override[name])
return analyzeVersions(props.name, (name) => config.value.market.override[name])
})
</script>
Expand Down

0 comments on commit bc0d11f

Please sign in to comment.