@@ -6,6 +6,8 @@ const _colors = require('./colors');
66const propTypes = {
77 initColor : React . PropTypes . string ,
88 onSubmit : React . PropTypes . func ,
9+ onSelect : React . PropTypes . func ,
10+ onHover : React . PropTypes . func ,
911 onReset : React . PropTypes . func ,
1012 style : React . PropTypes . object ,
1113 submitLabel : React . PropTypes . string ,
@@ -15,6 +17,8 @@ const propTypes = {
1517const defaultProps = {
1618 initColor : '#40c4ff' ,
1719 onSubmit : ( ) => { } ,
20+ onSelect : ( ) => { } ,
21+ onHover : ( ) => { } ,
1822 onReset : ( ) => { } ,
1923 submitLabel : 'Submit' ,
2024 resetLabel : 'Reset' ,
@@ -26,6 +30,7 @@ export default class MaterialColorPicker extends React.Component {
2630 this . colorNames = this . colorNameList ( _colors ) ;
2731 this . toneNames = Object . keys ( this . colorNames ) ;
2832 this . rootDivRef = null ;
33+ this . hoveredColor = '' ;
2934
3035 this . toneColorByName = this . toneColorByName . bind ( this ) ;
3136 this . satColorByName = this . satColorByName . bind ( this ) ;
@@ -55,8 +60,11 @@ export default class MaterialColorPicker extends React.Component {
5560
5661 this . titleName = this . titleName . bind ( this ) ;
5762 this . fullNameString = this . fullNameString . bind ( this ) ;
63+ this . createEvent = this . createEvent . bind ( this ) ;
64+
5865 this . onSubmit = this . onSubmit . bind ( this ) ;
5966 this . onReset = this . onReset . bind ( this ) ;
67+ this . onHover = this . onHover . bind ( this ) ;
6068
6169 this . rootDiv = this . rootDiv . bind ( this ) ;
6270 }
@@ -108,6 +116,13 @@ export default class MaterialColorPicker extends React.Component {
108116 } ;
109117 }
110118
119+ onHover ( event ) {
120+ if ( event . target . value !== this . hoveredColor ) {
121+ this . hoveredColor = event . target . value ;
122+ this . props . onHover ( event ) ;
123+ }
124+ }
125+
111126 findColorName ( colObj , colString ) {
112127 const nameList = Object . keys ( colObj ) ;
113128 const name = nameList . find ( ( val ) => { return ( colObj [ val ] === colString ) ; } ) ;
@@ -220,8 +235,8 @@ export default class MaterialColorPicker extends React.Component {
220235 this . state . selectedSat , this . state . hoveredSat ) ,
221236 } }
222237 onClick = { this . selectSat ( this . satColorByName ( val ) ) }
223- onMouseOver = { this . hoverSat ( this . satColorByName ( val ) ) }
224- onMouseOut = { this . hoverReset ( ) }
238+ onMouseEnter = { this . hoverSat ( this . satColorByName ( val ) ) }
239+ onMouseLeave = { this . hoverReset ( ) }
225240 >
226241 < div
227242 style = { { display : 'flex' , alignItems : 'center' , height : '100%' } }
@@ -293,32 +308,50 @@ export default class MaterialColorPicker extends React.Component {
293308 }
294309
295310 selectTone ( toneName ) {
296- return ( ) => {
297- this . setState ( { selectedTone : toneName } ) ;
311+ return ( e ) => {
312+ const event = this . createEvent ( e , 'select' ) ;
313+ this . setState ( { selectedTone : toneName } ,
314+ this . props . onSelect ( event )
315+ ) ;
298316 } ;
299317 }
300318
301319 selectSat ( satName ) {
302- return ( ) => {
303- this . setState ( { selectedSat : satName } ) ;
320+ return ( e ) => {
321+ const event = this . createEvent ( e , 'select' ) ;
322+ this . setState ( { selectedSat : satName } ,
323+ this . props . onSelect ( event )
324+ ) ;
304325 } ;
305326 }
306327
307328 hoverTone ( toneName ) {
308- return ( ) => {
309- this . setState ( { hoveredTone : toneName } ) ;
329+ return ( e ) => {
330+ const { nativeEvent, persist } = e ;
331+ this . setState ( { hoveredTone : toneName } , ( ) => {
332+ const event = this . createEvent ( { nativeEvent, persist} , 'hover' ) ;
333+ this . onHover ( event ) ;
334+ } ) ;
310335 } ;
311336 }
312337
313338 hoverSat ( satName ) {
314- return ( ) => {
315- this . setState ( { hoveredSat : satName } ) ;
339+ return ( e ) => {
340+ const { nativeEvent, persist} = e ;
341+ this . setState ( { hoveredSat : satName } , ( ) => {
342+ const event = this . createEvent ( { nativeEvent, persist} , 'hover' ) ;
343+ this . onHover ( event ) ;
344+ } ) ;
316345 } ;
317346 }
318347
319348 hoverReset ( ) {
320- return ( ) => {
321- this . setState ( { hoveredTone : '' , hoveredSat : '' } ) ;
349+ return ( e ) => {
350+ const { nativeEvent, persist} = e ;
351+ this . setState ( { hoveredTone : '' , hoveredSat : '' } , ( ) => {
352+ const event = this . createEvent ( { nativeEvent, persist} , 'hover' ) ;
353+ this . onHover ( event ) ;
354+ } ) ;
322355 } ;
323356 }
324357
@@ -412,6 +445,25 @@ export default class MaterialColorPicker extends React.Component {
412445 </ div > ) ;
413446 }
414447
448+ createEvent ( e , type ) {
449+ const event = {
450+ type,
451+ timeStamp : e . nativeEvent . timeStamp ,
452+ eventPhase : 3 ,
453+ target : {
454+ value : _colors [ this . fullNameString ( ) ] ,
455+ nativeEvent : e . nativeEvent ,
456+ name : 'MaterialColorPicker' ,
457+ node : this . rootDivRef ,
458+ ...this . props ,
459+ } ,
460+ persist ( ) {
461+ e . persist ( ) ;
462+ } ,
463+ } ;
464+ return event ;
465+ }
466+
415467 rootDiv ( div ) {
416468 this . rootDivRef = div ;
417469 }
0 commit comments