details.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <template>
  2. <CommonTopBanner title="皮肤详情">
  3. <SimplePageContentLoader :loader="skinLoader">
  4. <FlexCol v-if="skin" padding="padding.md">
  5. <scroll-view scroll-x>
  6. <FlexRow :width="IMAGE_WIDTH * skin.images.length" :gap="30" align="stretch">
  7. <Image
  8. v-for="item in skin.images"
  9. :key="item"
  10. :src="item"
  11. :width="IMAGE_WIDTH"
  12. radius="radius.lg"
  13. mode="widthFix"
  14. :innerStyle="{
  15. border: '1px solid #944329',
  16. }"
  17. />
  18. </FlexRow>
  19. </scroll-view>
  20. <FlexCol padding="padding.md">
  21. <FlexRow justify="space-between" align="center">
  22. <Text fontConfig="contentSpeicalText" fontFamily="SongtiSCBlack" :lines="1" :wrap="false">{{ skin.title }}</Text>
  23. <FlexCol backgroundColor="text.gold" radius="10" padding="10">
  24. <Text v-if="skin.price > 0" fontSize="fontSize.sm" fontWeight="bold" color="white" :text="`${moneyToFruit(skin.price)}乡源果`" />
  25. <Text v-else fontSize="fontSize.sm" color="white" text="免费" />
  26. </FlexCol>
  27. </FlexRow>
  28. <Text fontSize="fontSize.sm" :text="skin.desc" :lines="1" :maxWidth="400" />
  29. </FlexCol>
  30. <FlexCol padding="padding.md">
  31. <PrimaryButton v-if="!skin.isBought" radius="radius.xl" text="购买" @click="handleBuy" />
  32. <PrimaryButton v-else radius="radius.xl" text="去使用" @click="handleUse" />
  33. </FlexCol>
  34. </FlexCol>
  35. </SimplePageContentLoader>
  36. </CommonTopBanner>
  37. </template>
  38. <script setup lang="ts">
  39. import { computed } from 'vue';
  40. import { useSimpleDataLoader } from '@/components/composeabe/loader/SimpleDataLoader';
  41. import { useFruitConversion } from '@/pages/home/composeabe/FruitConverit';
  42. import { useLoadQuerys } from '@/components/composeabe/LoadQuerys';
  43. import { toast, alert } from '@/components/dialog/CommonRoot';
  44. import { navTo, callTopOnPageBack } from '@/components/utils/PageAction';
  45. import { assertNotNull } from '@imengyu/imengyu-utils';
  46. import { showError } from '@/common/composeabe/ErrorDisplay';
  47. import CommonTopBanner from '@/common/components/CommonTopBanner.vue';
  48. import FlexCol from '@/components/layout/FlexCol.vue';
  49. import SimplePageContentLoader from '@/components/loader/SimplePageContentLoader.vue';
  50. import FlexRow from '@/components/layout/FlexRow.vue';
  51. import Image from '@/components/basic/Image.vue';
  52. import Text from '@/components/basic/Text.vue';
  53. import PrimaryButton from '@/common/components/PrimaryButton.vue';
  54. import SkinApi from '@/api/light/SkinApi';
  55. import LightVillageApi from '@/api/light/LightVillageApi';
  56. const IMAGE_WIDTH = 330;
  57. const { querys } = useLoadQuerys({
  58. villageId: 0,
  59. id: 0
  60. }, () => skinLoader.load());
  61. const { moneyToFruit } = useFruitConversion();
  62. const skinLoader = useSimpleDataLoader(async () => {
  63. const list = await SkinApi.getPurchasedSkinList({ villageId: querys.value.villageId, page: 1, pageSize: 50 });
  64. const details = await SkinApi.getSkinInfo(querys.value.id);
  65. details.isBought = Boolean(list.list.find(p => p.id === details.id));
  66. return details;
  67. }, false)
  68. const skin = computed(() => skinLoader.content.value);
  69. async function handleBuy() {
  70. try {
  71. assertNotNull(skin.value);
  72. if (skin.value.price <= 0) {
  73. await SkinApi.placeOrder(
  74. querys.value.id,
  75. 3,
  76. querys.value.villageId,
  77. );
  78. toast('购买成功');
  79. skinLoader.load();
  80. return;
  81. }
  82. } catch (e) {
  83. showError(e);
  84. return;
  85. }
  86. navTo('/pages/home/village/introd/skin/buy-skin', { skinId: querys.value.id, villageId: querys.value.villageId, price: skin.value.price, })
  87. }
  88. async function handleUse() {
  89. try {
  90. await LightVillageApi.updateVillageSkin(
  91. querys.value.villageId,
  92. querys.value.id
  93. );
  94. alert({
  95. title: '使用成功',
  96. content: '您的村社皮肤已更新,请返回村社首页查看效果!',
  97. });
  98. callTopOnPageBack('backRefreshSkin', {});
  99. } catch (e) {
  100. showError(e);
  101. return;
  102. }
  103. }
  104. defineExpose({
  105. onPageBack(name: string, data: any) {
  106. if (name === 'paySuccessAndRefresh') {
  107. skinLoader.load();
  108. toast('购买成功');
  109. }
  110. },
  111. });
  112. </script>