事件中心不提示通知修复,增加开启/关闭通知按钮。修复edge或者opera浏览器登录扫码无跳转的问题
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
// src/views/Community/index.js
|
||||
import React, { useEffect, useRef } from 'react';
|
||||
import React, { useEffect, useRef, useState } from 'react';
|
||||
import { useNavigate } from 'react-router-dom';
|
||||
import { useSelector, useDispatch } from 'react-redux';
|
||||
import {
|
||||
@@ -10,6 +10,15 @@ import {
|
||||
Box,
|
||||
Container,
|
||||
useColorModeValue,
|
||||
Alert,
|
||||
AlertIcon,
|
||||
AlertTitle,
|
||||
AlertDescription,
|
||||
Button,
|
||||
CloseButton,
|
||||
HStack,
|
||||
VStack,
|
||||
Text,
|
||||
} from '@chakra-ui/react';
|
||||
|
||||
// 导入组件
|
||||
@@ -40,7 +49,10 @@ const Community = () => {
|
||||
const containerRef = useRef(null);
|
||||
|
||||
// ⚡ 通知权限引导
|
||||
const { showCommunityGuide } = useNotification();
|
||||
const { browserPermission, requestBrowserPermission } = useNotification();
|
||||
|
||||
// 通知横幅显示状态
|
||||
const [showNotificationBanner, setShowNotificationBanner] = useState(false);
|
||||
|
||||
// 🎯 初始化Community埋点Hook
|
||||
const communityEvents = useCommunityEvents({ navigate });
|
||||
@@ -71,17 +83,38 @@ const Community = () => {
|
||||
}
|
||||
}, [events, loading, pagination, filters]);
|
||||
|
||||
// ⚡ 首次访问社区时,延迟显示权限引导
|
||||
// ⚡ 检查通知权限状态,显示横幅提示
|
||||
useEffect(() => {
|
||||
if (showCommunityGuide) {
|
||||
const timer = setTimeout(() => {
|
||||
logger.info('Community', '显示社区权限引导');
|
||||
showCommunityGuide();
|
||||
}, 5000); // 延迟 5 秒,让用户先浏览页面
|
||||
// 延迟3秒显示,让用户先浏览页面
|
||||
const timer = setTimeout(() => {
|
||||
// 如果未授权或未请求过权限,显示横幅
|
||||
if (browserPermission !== 'granted') {
|
||||
const hasClosedBanner = localStorage.getItem('notification_banner_closed');
|
||||
if (!hasClosedBanner) {
|
||||
setShowNotificationBanner(true);
|
||||
logger.info('Community', '显示通知权限横幅');
|
||||
}
|
||||
}
|
||||
}, 3000);
|
||||
|
||||
return () => clearTimeout(timer);
|
||||
return () => clearTimeout(timer);
|
||||
}, [browserPermission]);
|
||||
|
||||
// 处理开启通知
|
||||
const handleEnableNotifications = async () => {
|
||||
const permission = await requestBrowserPermission();
|
||||
if (permission === 'granted') {
|
||||
setShowNotificationBanner(false);
|
||||
logger.info('Community', '通知权限已授予');
|
||||
}
|
||||
}, [showCommunityGuide]); // 只在组件挂载时执行一次
|
||||
};
|
||||
|
||||
// 处理关闭横幅
|
||||
const handleCloseBanner = () => {
|
||||
setShowNotificationBanner(false);
|
||||
localStorage.setItem('notification_banner_closed', 'true');
|
||||
logger.info('Community', '通知横幅已关闭');
|
||||
};
|
||||
|
||||
// ⚡ 首次进入页面时滚动到内容区域(考虑导航栏高度)
|
||||
useEffect(() => {
|
||||
@@ -104,6 +137,42 @@ const Community = () => {
|
||||
<Box minH="100vh" bg={bgColor}>
|
||||
{/* 主内容区域 */}
|
||||
<Container ref={containerRef} maxW="1600px" pt={6} pb={8}>
|
||||
{/* 通知权限提示横幅 */}
|
||||
{showNotificationBanner && (
|
||||
<Alert
|
||||
status="info"
|
||||
variant="subtle"
|
||||
borderRadius="lg"
|
||||
mb={4}
|
||||
boxShadow="md"
|
||||
bg={useColorModeValue('blue.50', 'blue.900')}
|
||||
borderWidth="1px"
|
||||
borderColor={useColorModeValue('blue.200', 'blue.700')}
|
||||
>
|
||||
<AlertIcon />
|
||||
<Box flex="1">
|
||||
<AlertTitle fontSize="md" mb={1}>
|
||||
开启桌面通知,不错过重要事件
|
||||
</AlertTitle>
|
||||
<AlertDescription fontSize="sm">
|
||||
即使浏览器最小化,也能第一时间接收新事件推送通知
|
||||
</AlertDescription>
|
||||
</Box>
|
||||
<HStack spacing={2} ml={4}>
|
||||
<Button
|
||||
size="sm"
|
||||
colorScheme="blue"
|
||||
onClick={handleEnableNotifications}
|
||||
>
|
||||
立即开启
|
||||
</Button>
|
||||
<CloseButton
|
||||
onClick={handleCloseBanner}
|
||||
position="relative"
|
||||
/>
|
||||
</HStack>
|
||||
</Alert>
|
||||
)}
|
||||
{/* 热点事件区域 */}
|
||||
<HotEventsSection
|
||||
events={hotEvents}
|
||||
|
||||
Reference in New Issue
Block a user