Files
TakeoutSaaS.TenantUI/apps/web-antd/src/views/member/points-mall/composables/points-mall-page/picker-actions.ts

84 lines
2.1 KiB
TypeScript

import type { Ref } from 'vue';
import type { ProductPickerItemDto } from '#/api/product';
import { message } from 'ant-design-vue';
import { searchProductPickerApi } from '#/api/product';
interface CreatePickerActionsOptions {
isPickerLoading: Ref<boolean>;
isPickerOpen: Ref<boolean>;
onPicked: (item: ProductPickerItemDto | undefined) => void;
pickerKeyword: Ref<string>;
pickerRows: Ref<ProductPickerItemDto[]>;
pickerSelectedId: Ref<string>;
selectedStoreId: Ref<string>;
}
export function createPickerActions(options: CreatePickerActionsOptions) {
async function loadPickerProducts() {
if (!options.selectedStoreId.value) {
options.pickerRows.value = [];
return;
}
options.isPickerLoading.value = true;
try {
options.pickerRows.value = await searchProductPickerApi({
storeId: options.selectedStoreId.value,
keyword: options.pickerKeyword.value.trim() || undefined,
limit: 500,
});
} catch (error) {
console.error(error);
options.pickerRows.value = [];
message.error('加载商品失败');
} finally {
options.isPickerLoading.value = false;
}
}
async function openPicker(currentProductId?: string) {
options.pickerKeyword.value = '';
options.pickerSelectedId.value = currentProductId ?? '';
options.pickerRows.value = [];
options.isPickerOpen.value = true;
await loadPickerProducts();
}
function setPickerOpen(value: boolean) {
options.isPickerOpen.value = value;
}
function setPickerKeyword(value: string) {
options.pickerKeyword.value = value;
}
function setPickerSelectedId(value: string) {
options.pickerSelectedId.value = value;
}
function submitPicker() {
if (!options.pickerSelectedId.value) {
message.warning('请选择商品');
return;
}
const selected = options.pickerRows.value.find(
(item) => item.id === options.pickerSelectedId.value,
);
options.onPicked(selected);
options.isPickerOpen.value = false;
}
return {
loadPickerProducts,
openPicker,
setPickerKeyword,
setPickerOpen,
setPickerSelectedId,
submitPicker,
};
}