11import * as React from 'react' ;
22import { getTargetScrollBarSize } from '@rc-component/util/lib/getScrollBarSize' ;
3+ import type { ColumnType , StickyOffsets } from './interface' ;
4+ import { getCellFixedInfo } from './utils/fixUtil' ;
5+ import classNames from 'classnames' ;
36
47export interface FixedColumnShadowsProps {
58 prefixCls : string ;
9+ stickyOffsets : StickyOffsets ;
10+ flattenColumns : readonly ColumnType < any > [ ] ;
11+ columnWidths : number [ ] ;
12+ fixHeader : boolean ;
13+ scrollInfo : [ scrollLeft : number , scrollRange : number ] ;
614}
715
8- export default function FixedColumnShadows ( props : FixedColumnShadowsProps ) {
9- const { prefixCls } = props ;
16+ const FixedColumnShadows = React . memo ( ( props : FixedColumnShadowsProps ) => {
17+ const { prefixCls, stickyOffsets , flattenColumns , columnWidths , fixHeader , scrollInfo } = props ;
1018 const holderRef = React . useRef < HTMLDivElement > ( null ) ;
1119
1220 const [ scrollBarSize , setScrollBarSize ] = React . useState < [ height : number , width : number ] > ( [ 0 , 0 ] ) ;
1321
22+ // console.log('>>>>', stickyOffsets, flattenColumns);
23+
24+ type FixedShadowInfo = [ index : number , offset : number , showShadowScrollDeadline : number ] ;
25+
26+ const [ fixStartShadowList , fixEndShadowList ] = React . useMemo <
27+ [ FixedShadowInfo [ ] , FixedShadowInfo [ ] ]
28+ > ( ( ) => {
29+ const nextFixStartShadowList : FixedShadowInfo [ ] = [ ] ;
30+ const nextFixEndShadowList : FixedShadowInfo [ ] = [ ] ;
31+
32+ let startShowShadowScrollDeadline = 0 ;
33+ let endShowShadowScrollDeadline = 0 ;
34+
35+ for ( let i = 0 ; i < flattenColumns . length ; i += 1 ) {
36+ const revertI = flattenColumns . length - 1 - i ;
37+
38+ const { fixStart } = getCellFixedInfo ( i , i , flattenColumns , stickyOffsets ) ;
39+ const { fixEnd } = getCellFixedInfo ( revertI , revertI , flattenColumns , stickyOffsets ) ;
40+
41+ if ( typeof fixStart === 'number' ) {
42+ nextFixStartShadowList . push ( [ i , fixStart , startShowShadowScrollDeadline ] ) ;
43+ } else {
44+ startShowShadowScrollDeadline += columnWidths [ i ] ;
45+ }
46+
47+ if ( typeof fixEnd === 'number' ) {
48+ nextFixEndShadowList . push ( [ revertI , fixEnd , endShowShadowScrollDeadline ] ) ;
49+ } else {
50+ endShowShadowScrollDeadline += columnWidths [ revertI ] ;
51+ }
52+ }
53+
54+ return [ nextFixStartShadowList , nextFixEndShadowList ] ;
55+ } , [ stickyOffsets , flattenColumns , columnWidths ] ) ;
56+
57+ // console.log('=>', fixStartShadowList, fixEndShadowList);
58+
1459 React . useEffect ( ( ) => {
1560 if ( holderRef . current ) {
1661 const { height, width } = getTargetScrollBarSize ( holderRef . current ) ;
17- setScrollBarSize ( [ height , width ] ) ;
62+ setScrollBarSize ( [ height , fixHeader ? width : 0 ] ) ;
1863 }
19- } , [ ] ) ;
64+ } , [ columnWidths , fixHeader ] ) ;
2065
2166 const fixedColumnShadowCls = `${ prefixCls } -fixed-column-shadow` ;
2267
68+ // ===================== Render =====================
69+ const [ scrollLeft , scrollRange ] = scrollInfo ;
70+
71+ // console.log('??????', scrollLeft, fixStartShadowList[1]);
72+ console . log ( 'Scroll info:' , scrollLeft , scrollRange ) ;
73+
74+ const renderShadow = ( position : 'Start' | 'End' , shadowList : FixedShadowInfo [ ] ) => {
75+ return shadowList . map ( ( [ index , offset , showShadowScrollDeadline ] ) => {
76+ const calcOffset = offset + columnWidths [ index ] ;
77+
78+ const showShadow =
79+ position === 'Start'
80+ ? scrollLeft > showShadowScrollDeadline
81+ : scrollRange - scrollLeft > showShadowScrollDeadline ;
82+
83+ return calcOffset ? (
84+ < div
85+ key = { `${ position } -${ index } ` }
86+ className = { classNames (
87+ fixedColumnShadowCls ,
88+ `${ fixedColumnShadowCls } -${ position . toLowerCase ( ) } ` ,
89+ showShadow && `${ fixedColumnShadowCls } -ping` ,
90+ ) }
91+ style = { {
92+ [ `insetInline${ position } ` ] : calcOffset ,
93+ } }
94+ />
95+ ) : null ;
96+ } ) ;
97+ } ;
98+
2399 return (
24100 < div
25101 className = { `${ fixedColumnShadowCls } -holder` }
@@ -30,7 +106,14 @@ export default function FixedColumnShadows(props: FixedColumnShadowsProps) {
30106 insetInlineEnd : scrollBarSize [ 1 ] ,
31107 } }
32108 >
33- < div className = { fixedColumnShadowCls } />
109+ { renderShadow ( 'Start' , fixStartShadowList ) }
110+ { renderShadow ( 'End' , fixEndShadowList ) }
34111 </ div >
35112 ) ;
113+ } ) ;
114+
115+ if ( process . env . NODE_ENV !== 'production' ) {
116+ FixedColumnShadows . displayName = 'FixedColumnShadows' ;
36117}
118+
119+ export default FixedColumnShadows ;
0 commit comments