11import * as React from 'react' ;
22import classNames from 'classnames' ;
3+ import ResizeObserver from 'rc-resize-observer' ;
4+ import { getFullWidth } from './util' ;
5+ import Item from './Item' ;
36
47export interface OverflowProps < ItemType > {
58 prefixCls ?: string ;
@@ -8,6 +11,8 @@ export interface OverflowProps<ItemType> {
811 data ?: ItemType [ ] ;
912 itemKey ?: React . Key | ( ( item : ItemType ) => React . Key ) ;
1013 renderItem ?: ( item : ItemType ) => React . ReactNode ;
14+ disabled ?: boolean ;
15+ maxCount ?: number | 'responsive' ;
1116}
1217
1318function Overflow < ItemType = any > (
@@ -21,8 +26,18 @@ function Overflow<ItemType = any>(
2126 itemKey,
2227 style,
2328 className,
29+ disabled,
30+ maxCount = 'responsive' ,
2431 } = props ;
2532
33+ const [ containerWidth , setContainerWidth ] = React . useState ( 0 ) ;
34+ const [ itemWidths , setItemWidths ] = React . useState (
35+ new Map < React . Key , number > ( ) ,
36+ ) ;
37+ const [ overflowWidth , setOverflowWidth ] = React . useState ( 0 ) ;
38+
39+ const itemPrefixCls = `${ prefixCls } -item` ;
40+
2641 // ================================= Item =================================
2742 const getKey = React . useCallback (
2843 ( item : ItemType , index : number ) => {
@@ -39,20 +54,68 @@ function Overflow<ItemType = any>(
3954 [ renderItem ] ,
4055 ) ;
4156
57+ // ================================= Size =================================
58+ function onOverflowResize ( _ : object , element : HTMLElement ) {
59+ setContainerWidth ( element . clientWidth ) ;
60+ }
61+
62+ function registerSize ( key : React . Key , width : number ) {
63+ const clone = new Map ( itemWidths ) ;
64+ console . log ( '==>>>' , key , width ) ;
65+
66+ if ( ! width ) {
67+ clone . delete ( key ) ;
68+ } else {
69+ clone . set ( key , width ) ;
70+ }
71+
72+ setItemWidths ( clone ) ;
73+ }
74+
75+ function registerOverflowSize ( _ : React . Key , width : number ) {
76+ console . log ( 'Overflow >>>' , width ) ;
77+ setOverflowWidth ( width ) ;
78+ }
79+
4280 // ================================ Render ================================
43- return (
81+ let overflowNode = (
4482 < div className = { classNames ( prefixCls , className ) } style = { style } ref = { ref } >
4583 { data . map ( ( item , index ) => {
4684 const key = getKey ( item , index ) ;
4785
4886 return (
49- < div className = { `${ prefixCls } -item` } key = { key } >
50- { mergedRenderItem ( item ) }
51- </ div >
87+ < Item < ItemType >
88+ key = { key }
89+ item = { item }
90+ prefixCls = { itemPrefixCls }
91+ renderItem = { mergedRenderItem }
92+ itemKey = { key }
93+ registerSize = { registerSize }
94+ disabled = { disabled }
95+ />
5296 ) ;
5397 } ) }
98+
99+ < Item
100+ prefixCls = { itemPrefixCls }
101+ className = { `${ itemPrefixCls } -overflow` }
102+ disabled = { disabled }
103+ registerSize = { registerOverflowSize }
104+ >
105+ Overflow
106+ </ Item >
54107 </ div >
55108 ) ;
109+
110+ if ( ! disabled ) {
111+ overflowNode = (
112+ < ResizeObserver onResize = { onOverflowResize } >
113+ { overflowNode }
114+ </ ResizeObserver >
115+ ) ;
116+ }
117+
118+ return overflowNode ;
56119}
57120
58121const ForwardOverflow = React . forwardRef ( Overflow ) ;
0 commit comments