import { flattenAreaTree, formatAreaListToTree } from '@12333/utils';
|
import * as flexWorkerServices from '@12333/services/api/FlexWorker';
|
import { useQuery, useQueryClient } from '@tanstack/vue-query';
|
import { computed, onMounted, onUnmounted, ref } from 'vue';
|
import { AreaType } from '@12333/constants';
|
import Taro, { EventChannel } from '@tarojs/taro';
|
|
export function useArea() {
|
// const completeAreaList = ref<API.AreaInfo[]>([]);
|
// const completeAreaTree = ref<API.AreaTreeNode[]>([]);
|
// const provinceList = ref<API.AreaInfo[]>([]);
|
// const areaItemMap = ref<Record<API.AreaInfo['areaCode'], API.AreaInfo>>({});
|
|
const queryClient = useQueryClient();
|
|
const { data: areaStore } = useQuery({
|
queryKey: ['flexWorkerServices/getAreaList'],
|
queryFn: async () => {
|
return await flexWorkerServices.getAreaList({}, { showLoading: false });
|
},
|
placeholderData: () => [] as API.AreaDto[],
|
staleTime: Infinity,
|
select(data) {
|
const areaItemMap: Record<API.AreaDto['areaCode'], API.AreaDto> = {};
|
data.forEach((item) => {
|
areaItemMap[item.areaCode] = item;
|
});
|
const completeAreaList = flattenAreaTree([...data]);
|
return {
|
completeAreaList: completeAreaList,
|
completeAreaTree: [...data],
|
// cityAreaTree: formatAreaListToTree(completeAreaList, 0, AreaType.City),
|
provinceList: [...data],
|
areaItemMap: areaItemMap,
|
};
|
},
|
});
|
|
// onMounted(async () => {
|
// let data: API.AreaInfo[] = await queryClient.ensureQueryData({
|
// queryKey: ['areaServices/getRegionalManagementList'],
|
// });
|
// completeAreaList.value = flattenAreaTree([...data]);
|
// completeAreaTree.value = [...data];
|
// provinceList.value = [...data];
|
// setAreaMap([...data]);
|
// });
|
|
// function setAreaMap(areaList: API.AreaInfo[]) {
|
// areaList.forEach((item) => {
|
// areaItemMap[item.areaCode] = item;
|
// });
|
// }
|
|
function getAreaFromCompleteAreaList(areaCode: number) {
|
return areaStore.value.completeAreaList.find((x) => x.areaCode === areaCode);
|
}
|
|
function getAreaByAreaCode(areaCode: number) {
|
return areaStore.value.areaItemMap[areaCode];
|
}
|
|
return {
|
completeAreaList: computed(() => areaStore.value.completeAreaList),
|
completeAreaTree: computed(() => areaStore.value.completeAreaTree),
|
cityAreaTree: computed(() =>
|
areaStore.value.completeAreaTree.map((x) => ({
|
...x,
|
children: x.children.map((y) => ({
|
...y,
|
children: undefined,
|
})),
|
}))
|
),
|
provinceList: computed(() => areaStore.value.provinceList),
|
areaItemMap: computed(() => areaStore.value.areaItemMap),
|
getAreaFromCompleteAreaList,
|
getAreaByAreaCode,
|
};
|
}
|
|
export function useAllAreaList() {
|
const { completeAreaTree, provinceList, completeAreaList, cityAreaTree } = useArea();
|
|
const findAreaCodeFromName = (areaName: string) => {
|
const areaItem = completeAreaList.value.find((x) => x.areaName === areaName);
|
return areaItem?.areaCode ?? 0;
|
};
|
|
const findAreaNameFromCode = (areaCode: number) => {
|
const areaItem = completeAreaList.value.find((x) => x.areaCode === areaCode);
|
return areaItem?.areaName ?? '';
|
};
|
|
const findAreaItemFromCode = (areaCode: number) => {
|
const areaItem = completeAreaList.value.find((x) => x.areaCode === areaCode);
|
return areaItem;
|
};
|
|
return {
|
findAreaCodeFromName,
|
findAreaNameFromCode,
|
findAreaItemFromCode,
|
areaTreeList: completeAreaTree,
|
provinceList,
|
cityAreaTree,
|
};
|
}
|
|
export function useProvinceList() {
|
const { provinceList } = useArea();
|
|
return {
|
provinceList,
|
};
|
}
|
|
export const globalEventEmitter = new Taro.Events();
|
|
export function useEvent(eventName: string, fn: TaroGeneral.EventCallback) {
|
onMounted(() => {
|
if (globalEventEmitter?.on) {
|
globalEventEmitter.on(eventName, fn);
|
}
|
});
|
|
onUnmounted(() => {
|
if (globalEventEmitter?.off) {
|
globalEventEmitter.off(eventName, fn);
|
}
|
});
|
}
|