GoodsDetailScreen.jsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. import * as WebBrowser from 'expo-web-browser';
  2. import * as React from 'react';
  3. import { Dimensions } from 'react-native';
  4. import { Div, Button, Image, Text, Avatar } from 'react-native-magnus';
  5. import { ScrollView } from 'react-native-gesture-handler';
  6. import useModel from 'flooks';
  7. import { useRequest } from '@umijs/hooks';
  8. import User from '../../flooks/User'; // detail模块通用方法
  9. import Header from '../../components/Header';
  10. import SvgIcon from '../../components/SvgIcon';
  11. import CommentItem from './CommentCom';
  12. import request from '../../Utils/RequestUtils';
  13. const { width } = Dimensions.get('window');
  14. export default function LinksScreen({ route }) {
  15. const { userInfo } = useModel(User, ['id']);
  16. const { params } = route;
  17. const { goodsId } = params;
  18. const { data } = useRequest(`/goods/get/${goodsId}`, {
  19. initialData: () => {
  20. return {};
  21. },
  22. refreshDeps: [goodsId],
  23. });
  24. const appraisal = useRequest(
  25. () => {
  26. return request
  27. .get(`/appraisal/goods?goodsId=${goodsId}`)
  28. .then((res) => {
  29. return Promise.resolve(res);
  30. })
  31. .catch(() => {
  32. return Promise.resolve([]);
  33. });
  34. },
  35. {
  36. initialData: () => {
  37. return [];
  38. },
  39. refreshDeps: [goodsId],
  40. }
  41. );
  42. const {
  43. img,
  44. name,
  45. goodNum,
  46. badNum,
  47. monthSales,
  48. amount,
  49. discountAmount,
  50. introduction,
  51. } = data;
  52. return (
  53. <>
  54. <Header title="商品详情" />
  55. <ScrollView
  56. contentContainerStyle={{ flexGrow: 1, backgroundColor: '#eee' }}
  57. >
  58. <Image source={img} w={width} h={width} />
  59. <Div py={20} px={15} bg="white">
  60. <Text fontSize="xl" fontWeight="bold">
  61. {name}
  62. </Text>
  63. <Div row alignItems="center">
  64. <Div row alignItems="center" mr={10}>
  65. <SvgIcon name="zan" type="primary" width={18} height={18} />
  66. <Text fontSize="sm" color="brand500" ml={3} textAlign="left">
  67. {goodNum || 0}
  68. </Text>
  69. </Div>
  70. <Div row alignItems="center" mr={10}>
  71. <SvgIcon name="zan" Flip color="#000" width={18} height={18} />
  72. <Text fontSize="sm" color="gray300" ml={3} textAlign="left">
  73. {badNum || 0}
  74. </Text>
  75. </Div>
  76. <Div row alignItems="center">
  77. <Text size="c1" color="gray300" textAlign="left">
  78. 月售:
  79. {monthSales || 0}
  80. </Text>
  81. </Div>
  82. </Div>
  83. <Div
  84. row
  85. alignItems="flex-end"
  86. py={15}
  87. borderBottomWidth={1}
  88. borderBottomColor="gray100"
  89. >
  90. <Text fontSize="2xl" color="red500">
  91. {discountAmount || amount}
  92. </Text>
  93. {!!discountAmount && (
  94. <Text
  95. fontSize="sm"
  96. color="gray300"
  97. textDecorLine="line-through"
  98. textDecorStyle="solid"
  99. textDecorColor="gray300"
  100. mb={2}
  101. ml={5}
  102. >
  103. ¥{amount}
  104. </Text>
  105. )}
  106. </Div>
  107. <Text color="gray300" fontSize="sm" pt={12}>
  108. {introduction}
  109. </Text>
  110. </Div>
  111. <Div bg="gray100">
  112. <Text fontSize="xl" pt={22} pb={12} px={17}>
  113. 商品评价
  114. </Text>
  115. {appraisal.data.length === 0 ? (
  116. <Div px={10} py={20} bg="gray100">
  117. <Text color="gray300" textAlign="center">
  118. 暂无数据
  119. </Text>
  120. </Div>
  121. ) : (
  122. <Div bg="white" py={20}>
  123. {appraisal.data.map((item, index) => {
  124. return <CommentItem info={item} key={index} />;
  125. })}
  126. </Div>
  127. )}
  128. </Div>
  129. </ScrollView>
  130. </>
  131. );
  132. }