WishRecordModal.tsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. import { Images } from '@/constants/images';
  2. import React, { forwardRef, useImperativeHandle, useState } from 'react';
  3. import { FlatList, Image, ImageBackground, Modal, StyleSheet, Text, TouchableOpacity, View } from 'react-native';
  4. export interface WishRecordModalRef {
  5. show: () => void;
  6. close: () => void;
  7. }
  8. export const WishRecordModal = forwardRef<WishRecordModalRef, {}>((props, ref) => {
  9. const [visible, setVisible] = useState(false);
  10. const [list, setList] = useState<any[]>([]);
  11. useImperativeHandle(ref, () => ({
  12. show: () => {
  13. setVisible(true);
  14. loadData();
  15. },
  16. close: () => setVisible(false),
  17. }));
  18. const loadData = async () => {
  19. // Reuse catch record API or a new one if specified, for now assuming similar structure
  20. // If there is no specific API for wish records yet, we might need to add one.
  21. // Assuming 'getWealRecord' but maybe filtered by type?
  22. // For waiting for backend implementation, mock empty or use generic record.
  23. // Or if 'services/weal.ts' didn't have specific wish record, we stick to placeholder or generic.
  24. // Actually, let's use a placeholder for now as per plan, or maybe 'getWealRecord'.
  25. try {
  26. // const res = await Service.getWishRecord(); // Need to implement if separate
  27. // For now, let's just show structure
  28. } catch (e) {
  29. console.error(e);
  30. }
  31. };
  32. const renderItem = ({ item }: { item: any }) => (
  33. <View style={styles.item}>
  34. <Text style={styles.itemText}>{item.createTime}</Text>
  35. <Text style={styles.itemText}>{item.goodsName}</Text>
  36. </View>
  37. );
  38. if (!visible) return null;
  39. return (
  40. <Modal visible={visible} transparent animationType="fade" onRequestClose={() => setVisible(false)}>
  41. <View style={styles.overlay}>
  42. <View style={styles.contentContainer}>
  43. <ImageBackground style={styles.content} source={{ uri: Images.welfare.welfareDialogBg }} resizeMode="stretch">
  44. <View style={styles.titleBox}>
  45. <ImageBackground style={styles.titleBg} source={{ uri: Images.common.qijiDialogTitBg }} resizeMode="stretch">
  46. <Text style={styles.titleText}>祈愿记录</Text>
  47. </ImageBackground>
  48. </View>
  49. <View style={styles.closeBox}>
  50. <TouchableOpacity onPress={() => setVisible(false)}>
  51. <Image style={styles.close} source={{ uri: Images.common.closeBut }} />
  52. </TouchableOpacity>
  53. </View>
  54. <View style={styles.listContainer}>
  55. <FlatList
  56. data={list}
  57. renderItem={renderItem}
  58. keyExtractor={(item, index) => index.toString()}
  59. ListEmptyComponent={<Text style={styles.emptyText}>暂无记录</Text>}
  60. />
  61. </View>
  62. </ImageBackground>
  63. </View>
  64. </View>
  65. </Modal>
  66. );
  67. });
  68. export default WishRecordModal;
  69. const styles = StyleSheet.create({
  70. overlay: {
  71. flex: 1,
  72. backgroundColor: 'rgba(0,0,0,0.7)',
  73. justifyContent: 'center',
  74. alignItems: 'center',
  75. },
  76. contentContainer: {
  77. width: 320,
  78. height: 450,
  79. alignItems: 'center',
  80. justifyContent: 'center',
  81. },
  82. content: {
  83. width: '100%',
  84. height: '100%',
  85. alignItems: 'center',
  86. paddingTop: 40,
  87. paddingBottom: 20,
  88. },
  89. titleBox: {
  90. position: 'absolute',
  91. top: -15,
  92. zIndex: 1,
  93. },
  94. titleBg: {
  95. width: 180,
  96. height: 50,
  97. justifyContent: 'center',
  98. alignItems: 'center',
  99. },
  100. titleText: {
  101. color: '#fff',
  102. fontSize: 18,
  103. fontWeight: 'bold',
  104. marginTop: -5,
  105. },
  106. closeBox: {
  107. position: 'absolute',
  108. top: 0,
  109. right: -5,
  110. zIndex: 2,
  111. },
  112. close: {
  113. width: 30,
  114. height: 30,
  115. },
  116. listContainer: {
  117. flex: 1,
  118. width: '90%',
  119. marginTop: 20,
  120. },
  121. item: {
  122. flexDirection: 'row',
  123. justifyContent: 'space-between',
  124. paddingVertical: 10,
  125. borderBottomWidth: 1,
  126. borderBottomColor: '#eee',
  127. },
  128. itemText: {
  129. fontSize: 14,
  130. color: '#333',
  131. },
  132. emptyText: {
  133. textAlign: 'center',
  134. marginTop: 50,
  135. color: '#999',
  136. },
  137. });