village.vue 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. <template>
  2. <CommonTopBanner title="村社排名">
  3. <SimplePageContentLoader :loader="villageRankListLoader">
  4. <FlexCol v-if="villageRankListLoader.isLoaded.value" gap="gap.lg" padding="space.md">
  5. <RankVillageItem
  6. v-for="item in villageRankListLoader.content.value"
  7. :key="item.id"
  8. :id="item.id"
  9. :image="item.image"
  10. :rank="item.rank"
  11. :title="item.title"
  12. :points="item.points"
  13. @click="handleGoDetails(item)"
  14. />
  15. </FlexCol>
  16. </SimplePageContentLoader>
  17. </CommonTopBanner>
  18. </template>
  19. <script setup lang="ts">
  20. import { useSimpleDataLoader } from '@/components/composeabe/loader/SimpleDataLoader';
  21. import { useLoadQuerys } from '@/components/composeabe/LoadQuerys';
  22. import { useVillageStore } from '@/store/village';
  23. import { backAndCallOnPageBack, navTo } from '@/components/utils/PageAction';
  24. import FlexCol from '@/components/layout/FlexCol.vue';
  25. import LightVillageApi from '@/api/light/LightVillageApi';
  26. import { waitTimeOut } from '@imengyu/imengyu-utils';
  27. import CommonTopBanner from '@/common/components/CommonTopBanner.vue';
  28. import SimplePageContentLoader from '@/components/loader/SimplePageContentLoader.vue';
  29. import RankVillageItem from './components/RankVillageItem.vue';
  30. const { querys } = useLoadQuerys({
  31. regionId: 0,
  32. }, () => {
  33. villageRankListLoader.reload();
  34. });
  35. const villageRankListLoader = useSimpleDataLoader(async () => {
  36. const res = await LightVillageApi.getVillageRankList({
  37. region_id: querys.value.regionId || undefined,
  38. num: 30
  39. });
  40. return res.map((item, i) => ({
  41. image: item.image ?? '',
  42. title: item.name,
  43. rank: i + 1,
  44. id: item.id,
  45. points: item.points,
  46. }));
  47. });
  48. const villageStore = useVillageStore();
  49. async function handleGoDetails(item: { id: number }) {
  50. const details = await LightVillageApi.getVillageDetails(item.id);
  51. villageStore.setCurrentVillage(details);
  52. await waitTimeOut(100);
  53. backAndCallOnPageBack('goVillage', {
  54. id: item.id,
  55. })
  56. }
  57. </script>