RuleModal.tsx 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import { Ionicons } from '@expo/vector-icons';
  2. import { ImageBackground } from 'expo-image';
  3. import React, { forwardRef, useImperativeHandle, useState } from 'react';
  4. import {
  5. Modal,
  6. StyleSheet,
  7. Text,
  8. TouchableOpacity,
  9. View
  10. } from 'react-native';
  11. import { Images } from '@/constants/images';
  12. export interface RuleModalRef {
  13. show: () => void;
  14. close: () => void;
  15. }
  16. export const RuleModal = forwardRef<RuleModalRef>((_, ref) => {
  17. const [visible, setVisible] = useState(false);
  18. useImperativeHandle(ref, () => ({
  19. show: () => setVisible(true),
  20. close: () => setVisible(false),
  21. }));
  22. return (
  23. <Modal visible={visible} transparent animationType="fade" onRequestClose={() => setVisible(false)}>
  24. <View style={styles.overlay}>
  25. <View style={styles.contentContainer}>
  26. <ImageBackground
  27. source={{ uri: Images.mine.dialogContentBg }}
  28. style={styles.bgContainer}
  29. resizeMode="stretch"
  30. >
  31. <View style={styles.textContent}>
  32. <Text style={styles.text}>1.房间仅可用于免费赠送手办或其它礼品</Text>
  33. <Text style={styles.text}>2.您可以查看完整版《用户协议》和《隐私政策》 以便了解我们收集、使用、存储信息的情况,以及对信息的保护措施</Text>
  34. <Text style={styles.text}>3.不支持设置私密房间</Text>
  35. <Text style={styles.text}>4.参与热度仅代表房间热度,不代表具体人数</Text>
  36. <Text style={[styles.text, { marginTop: 10, color: '#999', fontSize: 10 }]}>特别声明:本应用内包含的所有抽奖及活动(包括APP专享活动等)均由艾斯潮盒官方发起,与苹果公司(Apple Inc.)无关。苹果公司不是上述活动的赞助商,也没有以任何形式参与上述活动。</Text>
  37. </View>
  38. </ImageBackground>
  39. <View style={styles.closeContainer}>
  40. <TouchableOpacity onPress={() => setVisible(false)} style={styles.closeBtn}>
  41. <Ionicons name="close" size={20} color="#444" />
  42. </TouchableOpacity>
  43. </View>
  44. </View>
  45. </View>
  46. </Modal>
  47. );
  48. });
  49. const styles = StyleSheet.create({
  50. overlay: {
  51. flex: 1,
  52. backgroundColor: 'rgba(0,0,0,0.6)',
  53. justifyContent: 'center',
  54. alignItems: 'center',
  55. },
  56. contentContainer: {
  57. width: '100%',
  58. alignItems: 'center',
  59. },
  60. bgContainer: {
  61. width: 300, // 600rpx approx
  62. height: 340, // increased for disclaimer
  63. justifyContent: 'flex-start',
  64. paddingHorizontal: 25, // 50rpx
  65. paddingTop: 75, // 150rpx
  66. },
  67. textContent: {
  68. width: '100%',
  69. },
  70. text: {
  71. fontSize: 12,
  72. color: '#333',
  73. marginBottom: 8,
  74. lineHeight: 18,
  75. },
  76. closeContainer: {
  77. marginTop: 20,
  78. alignItems: 'center',
  79. },
  80. closeBtn: {
  81. width: 32,
  82. height: 32,
  83. borderRadius: 16,
  84. backgroundColor: '#D8D8D8',
  85. justifyContent: 'center',
  86. alignItems: 'center',
  87. },
  88. });