11import { useCallback , useMemo , useState } from 'react'
2- import { Tab , TabList , Text , makeStyles , mergeClasses } from '@fluentui/react-components'
2+ import { Tab , TabList , makeStyles , mergeClasses } from '@fluentui/react-components'
33import WatchlistTab from './WatchlistTab'
44import StockDetailTab from './StockDetailTab'
55import { useWatchlist } from './useWatchlist'
66import type { WatchlistItem } from '../types/market'
77import { innoTokens } from '../theme/tokens'
8+ import ChromeToolButton from '../desktop/ChromeToolButton'
9+ import {
10+ DESKTOP_SIDEBAR_TOOL_ICON_PADDING ,
11+ DESKTOP_SIDEBAR_TOOL_ICON_SIZE ,
12+ DESKTOP_TITLEBAR_HEIGHT ,
13+ DESKTOP_Z_PANEL_TITLE ,
14+ } from '../desktop/constants'
15+ import {
16+ PanelRightContractRegular ,
17+ ArrowMaximizeRegular ,
18+ ArrowMinimizeRegular ,
19+ } from '../chat/chatIcons'
20+ import { electronPlatform } from '../platform/detect'
821
922type MarketTab = 'watchlist' | 'detail'
1023
@@ -16,23 +29,56 @@ const useStyles = makeStyles({
1629 flexDirection : 'column' ,
1730 backgroundColor : innoTokens . canvas ,
1831 } ,
19- header : {
32+ titleBar : {
2033 flexShrink : 0 ,
21- padding : '10px 12px 0' ,
22- borderBottom : `1px solid ${ innoTokens . separator } ` ,
34+ height : ` ${ DESKTOP_TITLEBAR_HEIGHT } px` ,
35+ boxSizing : 'border-box' ,
2336 display : 'flex' ,
24- flexDirection : 'column' ,
25- gap : '8px' ,
37+ alignItems : 'center' ,
38+ gap : '0' ,
39+ paddingLeft : '8px' ,
40+ paddingRight : '8px' ,
41+ borderBottom : `1px solid ${ innoTokens . separator } ` ,
42+ backgroundColor : innoTokens . canvas ,
43+ position : 'relative' ,
44+ zIndex : DESKTOP_Z_PANEL_TITLE ,
45+ pointerEvents : 'auto' ,
46+ } ,
47+ titleBarElectron : {
48+ WebkitAppRegion : 'drag' ,
49+ } ,
50+ titleBarWeb : {
51+ height : '40px' ,
52+ zIndex : 1 ,
2653 } ,
27- kicker : {
28- fontSize : '11px' ,
29- fontWeight : 600 ,
30- letterSpacing : '0.08em' ,
31- color : innoTokens . textTertiary ,
32- textTransform : 'uppercase' ,
54+ titleBarElectronWin : {
55+ paddingRight : '132px' ,
56+ } ,
57+ titleBarElectronMac : {
58+ paddingRight : '12px' ,
59+ } ,
60+ tabsWrap : {
61+ flexShrink : 0 ,
62+ maxWidth : '100%' ,
63+ WebkitAppRegion : 'no-drag' ,
64+ pointerEvents : 'auto' ,
3365 } ,
3466 tabs : {
35- minHeight : '34px' ,
67+ minHeight : 'unset' ,
68+ } ,
69+ dragFill : {
70+ flex : 1 ,
71+ minWidth : '8px' ,
72+ alignSelf : 'stretch' ,
73+ WebkitAppRegion : 'drag' ,
74+ } ,
75+ titleBarActions : {
76+ flexShrink : 0 ,
77+ display : 'flex' ,
78+ alignItems : 'center' ,
79+ gap : '2px' ,
80+ WebkitAppRegion : 'no-drag' ,
81+ pointerEvents : 'auto' ,
3682 } ,
3783 content : {
3884 flex : 1 ,
@@ -42,13 +88,26 @@ const useStyles = makeStyles({
4288 } ,
4389} )
4490
45- export default function RightMarketPanel ( ) {
91+ interface Props {
92+ electronChrome ?: boolean
93+ chatColumnVisible ?: boolean
94+ onToggleRightPanel ?: ( ) => void
95+ onToggleChatColumn ?: ( ) => void
96+ }
97+
98+ export default function RightMarketPanel ( {
99+ electronChrome = false ,
100+ chatColumnVisible = true ,
101+ onToggleRightPanel,
102+ onToggleChatColumn,
103+ } : Props ) {
46104 const s = useStyles ( )
47105 const { items, addItem, removeItem } = useWatchlist ( )
48106 const [ tab , setTab ] = useState < MarketTab > ( 'watchlist' )
49107 const [ selected , setSelected ] = useState < WatchlistItem | null > ( null )
50108
51109 const selectedCode = selected ?. code ?? null
110+ const electronWin = electronChrome && electronPlatform ( ) !== 'darwin'
52111
53112 const handleSelect = useCallback ( ( item : WatchlistItem ) => {
54113 setSelected ( item )
@@ -64,19 +123,58 @@ export default function RightMarketPanel() {
64123 return items . find ( item => item . code === selected . code ) ?? selected
65124 } , [ items , selected ] )
66125
126+ const showWorkspaceActions = Boolean ( onToggleRightPanel || onToggleChatColumn )
127+
67128 return (
68129 < div className = { s . root } >
69- < div className = { s . header } >
70- < Text className = { s . kicker } > MARKET DESK</ Text >
71- < TabList
72- className = { s . tabs }
73- size = "small"
74- selectedValue = { tab }
75- onTabSelect = { ( _ , data ) => setTab ( data . value as MarketTab ) }
76- >
77- < Tab value = "watchlist" > 自选</ Tab >
78- < Tab value = "detail" disabled = { ! selected } > 个股</ Tab >
79- </ TabList >
130+ < div
131+ className = { mergeClasses (
132+ s . titleBar ,
133+ ! electronChrome && s . titleBarWeb ,
134+ electronChrome && s . titleBarElectron ,
135+ electronChrome && 'inno-right-panel-title-bar' ,
136+ electronChrome && ( electronWin ? s . titleBarElectronWin : s . titleBarElectronMac ) ,
137+ ) }
138+ >
139+ < div className = { mergeClasses ( s . tabsWrap , 'inno-panel-title-no-drag' ) } >
140+ < TabList
141+ className = { s . tabs }
142+ size = "small"
143+ selectedValue = { tab }
144+ onTabSelect = { ( _ , data ) => setTab ( data . value as MarketTab ) }
145+ >
146+ < Tab value = "watchlist" > 自选</ Tab >
147+ < Tab value = "detail" disabled = { ! selected } > 个股</ Tab >
148+ </ TabList >
149+ </ div >
150+
151+ { electronChrome && < div className = { s . dragFill } aria-hidden /> }
152+
153+ { showWorkspaceActions && (
154+ < div className = { mergeClasses ( s . titleBarActions , 'inno-panel-title-no-drag' ) } >
155+ { onToggleChatColumn && (
156+ < ChromeToolButton
157+ label = { chatColumnVisible ? '最大化右侧面板' : '恢复聊天区域' }
158+ iconPadding = { DESKTOP_SIDEBAR_TOOL_ICON_PADDING }
159+ onClick = { onToggleChatColumn }
160+ >
161+ { chatColumnVisible
162+ ? < ArrowMaximizeRegular fontSize = { DESKTOP_SIDEBAR_TOOL_ICON_SIZE } />
163+ : < ArrowMinimizeRegular fontSize = { DESKTOP_SIDEBAR_TOOL_ICON_SIZE } /> }
164+ </ ChromeToolButton >
165+ ) }
166+ { onToggleRightPanel && (
167+ < ChromeToolButton
168+ label = "收起右侧面板"
169+ iconPadding = { DESKTOP_SIDEBAR_TOOL_ICON_PADDING }
170+ active
171+ onClick = { onToggleRightPanel }
172+ >
173+ < PanelRightContractRegular fontSize = { DESKTOP_SIDEBAR_TOOL_ICON_SIZE } />
174+ </ ChromeToolButton >
175+ ) }
176+ </ div >
177+ ) }
80178 </ div >
81179
82180 < div className = { s . content } >
0 commit comments