Files
TakeoutSaaS.TenantUI/apps/web-antd/src/views/store/pickup/components/PickupModeSwitch.vue

75 lines
2.1 KiB
Vue

<script setup lang="ts">
/**
* 文件职责:自提模式切换条。
* 1. 展示大时段/精细时段切换入口。
* 2. 抛出模式变更事件。
*/
import type { PickupMode } from '#/api/store-pickup';
interface Props {
disabled?: boolean;
isSwitching?: boolean;
mode: PickupMode;
options: Array<{ label: string; value: PickupMode }>;
}
const props = defineProps<Props>();
const emit = defineEmits<{
(event: 'change', mode: PickupMode): void;
}>();
function getModeLabel(mode: PickupMode) {
return props.options.find((item) => item.value === mode)?.label ?? mode;
}
function getModeHint(mode: PickupMode) {
return mode === 'big'
? '按时段统一预约,适合固定营业节奏'
: '按精细时间点预约,适合高峰分流';
}
</script>
<template>
<div class="pickup-mode-panel" :class="{ switching: props.isSwitching }">
<div class="pickup-mode-header">
<div class="pickup-mode-title">自提预约模式</div>
<div class="pickup-mode-badge">
{{
props.isSwitching ? '切换中...' : `当前:${getModeLabel(props.mode)}`
}}
</div>
</div>
<div class="pickup-mode-grid">
<button
type="button"
class="pickup-mode-card"
:class="{ active: props.mode === 'big' }"
:disabled="props.disabled || props.isSwitching"
@click="emit('change', 'big')"
>
<div class="pickup-mode-card-title">
<span class="pickup-mode-dot"></span>
{{ getModeLabel('big') }}
</div>
<div class="pickup-mode-card-hint">{{ getModeHint('big') }}</div>
</button>
<button
type="button"
class="pickup-mode-card"
:class="{ active: props.mode === 'fine' }"
:disabled="props.disabled || props.isSwitching"
@click="emit('change', 'fine')"
>
<div class="pickup-mode-card-title">
<span class="pickup-mode-dot"></span>
{{ getModeLabel('fine') }}
</div>
<div class="pickup-mode-card-hint">{{ getModeHint('fine') }}</div>
</button>
</div>
</div>
</template>