|
1 | 1 | import React, {useState, useEffect} from 'react'; |
2 | | -import styled from 'styled-components'; |
| 2 | +import styled, { keyframes } from 'styled-components'; |
3 | 3 | import PlayCircleOutlineIcon from '@mui/icons-material/PlayCircleOutline'; |
4 | 4 | import StopCircleOutlinedIcon from '@mui/icons-material/StopCircleOutlined'; |
5 | 5 | import BlockIcon from '@mui/icons-material/Block'; |
6 | 6 | import WarningAmberIcon from '@mui/icons-material/WarningAmber'; |
| 7 | +import TimerOffIcon from '@mui/icons-material/TimerOff'; |
7 | 8 | import {ThemeType} from "../../styles/theme.ts"; |
8 | 9 | import {LogPanel} from "../LogPanel.tsx"; |
9 | 10 | import {toast} from "../toast/toast-core.ts"; |
@@ -245,6 +246,45 @@ const AdminWarningBanner = styled.div<{ theme: ThemeType }>` |
245 | 246 | gap: 6px; |
246 | 247 | `; |
247 | 248 |
|
| 249 | +/** 横幅滑入动画 - 从上方滑入并淡入 */ |
| 250 | +const slideInFromTop = keyframes` |
| 251 | + from { |
| 252 | + opacity: 0; |
| 253 | + transform: translateY(-10px); |
| 254 | + max-height: 0; |
| 255 | + padding: 0 12px; |
| 256 | + margin-bottom: 0; |
| 257 | + margin-top: 0; |
| 258 | + } |
| 259 | + to { |
| 260 | + opacity: 1; |
| 261 | + transform: translateY(0); |
| 262 | + max-height: 50px; |
| 263 | + padding: 6px 12px; |
| 264 | + margin-bottom: 12px; |
| 265 | + margin-top: -12px; |
| 266 | + } |
| 267 | +`; |
| 268 | + |
| 269 | +/** "本局结束后停止"信息横幅 */ |
| 270 | +const StopAfterGameBanner = styled.div<{ theme: ThemeType }>` |
| 271 | + background-color: ${props => props.theme.colors.primary}20; |
| 272 | + border: 1px solid ${props => props.theme.colors.primary}60; |
| 273 | + border-radius: ${props => props.theme.borderRadius}; |
| 274 | + padding: 6px 12px; |
| 275 | + margin-bottom: 12px; |
| 276 | + margin-top: -12px; |
| 277 | + font-size: 1rem; |
| 278 | + color: ${props => props.theme.colors.primary}; |
| 279 | + display: flex; |
| 280 | + align-items: center; |
| 281 | + gap: 6px; |
| 282 | + overflow: hidden; |
| 283 | + |
| 284 | + /* 入场动画 */ |
| 285 | + animation: ${slideInFromTop} 0.3s ease-out forwards; |
| 286 | +`; |
| 287 | + |
248 | 288 | // ============================================ |
249 | 289 | // 游戏模式切换样式 |
250 | 290 | // ============================================ |
@@ -811,6 +851,8 @@ export const HomePage = () => { |
811 | 851 | const [logMode, setLogMode] = useState<LogMode>(LogMode.SIMPLE); |
812 | 852 | // 新增:管理员权限状态(null 表示还在检测中) |
813 | 853 | const [isElevated, setIsElevated] = useState<boolean | null>(null); |
| 854 | + // 新增:"本局结束后停止"状态 |
| 855 | + const [stopAfterGame, setStopAfterGame] = useState(false); |
814 | 856 |
|
815 | 857 | /** |
816 | 858 | * 获取召唤师信息的函数 |
@@ -927,6 +969,25 @@ export const HomePage = () => { |
927 | 969 | toast.success('海克斯科技启动!'); |
928 | 970 | } else { |
929 | 971 | toast.success('海克斯科技已关闭!'); |
| 972 | + // 停止时清除"本局结束后停止"状态 |
| 973 | + setStopAfterGame(false); |
| 974 | + } |
| 975 | + }); |
| 976 | + |
| 977 | + return () => cleanup(); |
| 978 | + }, []); |
| 979 | + |
| 980 | + // 监听快捷键触发的"本局结束后停止"切换事件 |
| 981 | + useEffect(() => { |
| 982 | + const cleanup = window.hex.onStopAfterGameTriggered((newState: boolean) => { |
| 983 | + console.log('🎮 [HomePage] 收到"本局结束后停止"切换事件,新状态:', newState); |
| 984 | + setStopAfterGame(newState); |
| 985 | + |
| 986 | + // 显示提示 |
| 987 | + if (newState) { |
| 988 | + toast.info('对局结束后自动停止挂机'); |
| 989 | + } else { |
| 990 | + toast.info('已取消对局结束后停止'); |
930 | 991 | } |
931 | 992 | }); |
932 | 993 |
|
@@ -1086,6 +1147,14 @@ export const HomePage = () => { |
1086 | 1147 | </LoadingPlaceholder> |
1087 | 1148 | )} |
1088 | 1149 | </SummonerSection> |
| 1150 | + |
| 1151 | + {/* "本局结束后停止"状态提示 - 在召唤师区域下方显示 */} |
| 1152 | + {stopAfterGame && ( |
| 1153 | + <StopAfterGameBanner> |
| 1154 | + <TimerOffIcon style={{ fontSize: '1rem' }} /> |
| 1155 | + 对局结束后自动停止挂机 |
| 1156 | + </StopAfterGameBanner> |
| 1157 | + )} |
1089 | 1158 |
|
1090 | 1159 | {/* 控制区域 - Flexbox 水平排列 */} |
1091 | 1160 | <ControlRow> |
|
0 commit comments