diff --git a/.env b/.env index 228da808c..f53bd29e3 100644 --- a/.env +++ b/.env @@ -1,16 +1,16 @@ -APP_BASE_URL= -APP_WEBSOCKET= -APP_COMPANY_ID= -APP_PLATFORM= -APP_CUSTOM_SERVER= -APP_HOME_PAGE= -APP_TRACK= -APP_YOUSHU_TOKEN= -APP_ID= -APP_MAP_KEY= -APP_MAP_NAME= -APP_IMAGE_CDN= -APP_DIANWU_URL= +APP_BASE_URL=https://demo-ecshopx.ishopex.cn/api/h5app/wxapp +APP_WEBSOCKET=wss://demo-ecshopx.ishopex.cn/ws +APP_COMPANY_ID=38 +APP_PLATFORM=standard +APP_CUSTOM_SERVER=https://ecshopx-h5.ex-sandbox.com/ +APP_HOME_PAGE=/pages/index +APP_TRACK=youshu +APP_YOUSHU_TOKEN=bi281e87ab2424481a +APP_ID=wx1e25e45145b70faa +APP_MAP_KEY=PSPBZ-KQ5CW-CSGRF-ON2S4-K2HQJ-XEBQG +APP_MAP_NAME=oneX新零售门店定位 +APP_IMAGE_CDN=https://b-img-cdn.yuanyuanke.cn/ecshopx-vshop +APP_DIANWU_URL=https://demo-ecshopx-dianwu.shopex123.com APP_MERCHANT_URL= APP_ADAPAY= diff --git a/src/components/cookie-consent/index.js b/src/components/cookie-consent/index.js new file mode 100644 index 000000000..5051a2492 --- /dev/null +++ b/src/components/cookie-consent/index.js @@ -0,0 +1,77 @@ +import React, { useState, useEffect } from 'react' +import Taro from '@tarojs/taro' +import { View, Button } from '@tarojs/components' +import { SpHtml } from '@/components' +import api from '@/api' +import './index.scss' + +const CookieConsent = () => { + const [visible, setVisible] = useState(false) + const [animationVisible, setAnimationVisible] = useState(false) + const [policyData, setPolicyData] = useState('') + + useEffect(() => { + // 仅在 H5 环境下执行 + if (process.env.TARO_ENV === 'h5') { + const consent = Taro.getStorageSync('cookie_consent') + if (!consent) { + fetchCookiePolicy() + } + } + }, []) + + const fetchCookiePolicy = async () => { + try { + const { content } = await api.shop.getRuleInfo({ + type: 'cookie_privacy' + }) + if (content) { + setPolicyData(content) + setVisible(true) + // 延迟设置动画状态以触发 CSS transition + setTimeout(() => { + setAnimationVisible(true) + }, 50) + } + } catch (error) { + console.error('Failed to fetch cookie policy:', error) + } + } + + const handleClose = (type) => { + // 开始离开动画 + setAnimationVisible(false) + // 等待动画结束后卸载组件 + setTimeout(() => { + Taro.setStorageSync('cookie_consent', type) + setVisible(false) + }, 300) // 300ms 对应 CSS transition 时间 + } + + const handleAccept = () => { + handleClose('accepted') + } + + const handleReject = () => { + handleClose('rejected') + } + + if (!visible) return null + + return ( + + + + + + + + + + + + + ) +} + +export default CookieConsent diff --git a/src/components/cookie-consent/index.scss b/src/components/cookie-consent/index.scss new file mode 100644 index 000000000..a8e00253a --- /dev/null +++ b/src/components/cookie-consent/index.scss @@ -0,0 +1,88 @@ +.cookie-consent-modal { + .cookie-consent-modal-overlay { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background-color: rgba(0, 0, 0, 0.5); + z-index: 9998; + opacity: 0; + transition: opacity 0.3s ease-in-out; + + &.visible { + opacity: 1; + } + } + + .cookie-consent-modal-content { + position: fixed; + bottom: 0; + left: 0; + width: 100%; + height: 80vh; + background: #fff; + padding: 30px; + box-sizing: border-box; + z-index: 9999; + border-top: 1px solid #e5e5e5; + display: flex; + flex-direction: column; + transform: translateY(100%); + transition: transform 0.3s ease-in-out; + + &.visible { + transform: translateY(0); + } + } + + .cookie-text { + font-size: 28px; + line-height: 48px; + color: #000; + width: 100%; + margin-bottom: 60px; + overflow-y: auto; + flex: 1; + } + + .cookie-buttons { + display: flex; + flex-direction: column; + gap: 30px; + width: 100%; + + button { + font-family: Noto Sans SC; + font-weight: 500; + font-style: Medium; + font-size: 28px; + line-height: 44px; + width: 100%; + padding: 0; + border-radius: 0; + cursor: pointer; + margin: 0; + display: flex; + align-items: center; + justify-content: center; + height: 78px; + + &::after { + border: none; + } + + &.accept-btn { + background: #000; + color: #fff; + } + + &.reject-btn { + background: #fff; + color: #666666; + border: 1px solid #666666; + box-sizing: border-box; + } + } + } +} diff --git a/src/components/sp-page/index.js b/src/components/sp-page/index.js index 28c35db17..a9884d30a 100644 --- a/src/components/sp-page/index.js +++ b/src/components/sp-page/index.js @@ -15,6 +15,7 @@ import { View, Text, Button } from '@tarojs/components' import { useImmer } from 'use-immer' import { SpNavBar, SpFloatMenuItem, SpNote, SpLoading, SpImage } from '@/components' import { useThemsColor, useLogin } from '@/hooks' +import CookieConsent from '@/components/cookie-consent' import { TAB_PAGES, TABBAR_PATH, @@ -486,6 +487,7 @@ const SpPage = memo( )} )} + ) }) diff --git a/src/subpages/i18n/lang/index.json b/src/subpages/i18n/lang/index.json index 13d6a6339..719eac186 100644 --- a/src/subpages/i18n/lang/index.json +++ b/src/subpages/i18n/lang/index.json @@ -3213,7 +3213,7 @@ "zh-cn": "上架成功", "en": "Listed successfully", "zh-tw": "上架成功", - 750 "ar": "تم الإدراج بنجاح" + "ar": "تم الإدراج بنجاح" }, "aa12vu4": { "zh-cn": "下架成功", @@ -15160,5 +15160,41 @@ "en": "Total:", "zh-tw": "總計:", "ar": "الإجمالي:" + }, + "chl18c4": { + "zh-cn": "开票失败", + "en": "Ticket failed", + "zh-tw": "開票失敗", + "ar": "فشل الفاتورة" + }, + "d0x6rc4": { + "zh-cn": "批量处理", + "en": "Batch processing", + "zh-tw": "批量處理", + "ar": "معالجة لوحة واحدة" + }, + "7djicl6": { + "zh-cn": "请输入订单号", + "en": "Please enter order number", + "zh-tw": "請輸入訂單號", + "ar": "يرجى إدخال رقم الطلب" + }, + "cx7hgb4": { + "zh-cn": "接受所有", + "en": "Accept all", + "zh-tw": "接受所有", + "ar": "قبول الكل" + }, + "czrm8k4": { + "zh-cn": "拒绝所有", + "en": "Reject all", + "zh-tw": "拒絕所有", + "ar": "رفض الكل" + }, + "pghukv6": { + "zh-cn": "365海淘客", + "en": "365 Holiday Trader", + "zh-tw": "365海淘客", + "ar": "365 هوليداي ترايدر" } } \ No newline at end of file