@@ -21,6 +21,7 @@ import { CATEGORY_HEADER_HEIGHT, EMOJI_HEIGHT, EMOJIS_PER_ROW } from "./EmojiPic
2121import LazyRenderList from "../elements/LazyRenderList" ;
2222import { DATA_BY_CATEGORY , IEmoji } from "../../../emoji" ;
2323import Emoji from "./Emoji" ;
24+ import { ButtonEvent } from "../elements/AccessibleButton" ;
2425
2526const OVERFLOW_ROWS = 3 ;
2627
@@ -42,18 +43,31 @@ interface IProps {
4243 heightBefore : number ;
4344 viewportHeight : number ;
4445 scrollTop : number ;
45- onClick ( emoji : IEmoji ) : void ;
46+ onClick ( ev : ButtonEvent , emoji : IEmoji ) : void ;
4647 onMouseEnter ( emoji : IEmoji ) : void ;
4748 onMouseLeave ( emoji : IEmoji ) : void ;
4849 isEmojiDisabled ?: ( unicode : string ) => boolean ;
4950}
5051
52+ function hexEncode ( str : string ) : string {
53+ let hex : string ;
54+ let i : number ;
55+
56+ let result = "" ;
57+ for ( i = 0 ; i < str . length ; i ++ ) {
58+ hex = str . charCodeAt ( i ) . toString ( 16 ) ;
59+ result += ( "000" + hex ) . slice ( - 4 ) ;
60+ }
61+
62+ return result ;
63+ }
64+
5165class Category extends React . PureComponent < IProps > {
5266 private renderEmojiRow = ( rowIndex : number ) : JSX . Element => {
5367 const { onClick, onMouseEnter, onMouseLeave, selectedEmojis, emojis } = this . props ;
5468 const emojisForRow = emojis . slice ( rowIndex * 8 , ( rowIndex + 1 ) * 8 ) ;
5569 return (
56- < div key = { rowIndex } >
70+ < div key = { rowIndex } role = "row" >
5771 { emojisForRow . map ( ( emoji ) => (
5872 < Emoji
5973 key = { emoji . hexcode }
@@ -63,6 +77,8 @@ class Category extends React.PureComponent<IProps> {
6377 onMouseEnter = { onMouseEnter }
6478 onMouseLeave = { onMouseLeave }
6579 disabled = { this . props . isEmojiDisabled ?.( emoji . unicode ) }
80+ id = { `mx_EmojiPicker_item_${ this . props . id } _${ hexEncode ( emoji . unicode ) } ` }
81+ role = "gridcell"
6682 />
6783 ) ) }
6884 </ div >
@@ -101,7 +117,6 @@ class Category extends React.PureComponent<IProps> {
101117 >
102118 < h2 className = "mx_EmojiPicker_category_label" > { name } </ h2 >
103119 < LazyRenderList
104- element = "ul"
105120 className = "mx_EmojiPicker_list"
106121 itemHeight = { EMOJI_HEIGHT }
107122 items = { rows }
@@ -110,6 +125,7 @@ class Category extends React.PureComponent<IProps> {
110125 overflowItems = { OVERFLOW_ROWS }
111126 overflowMargin = { 0 }
112127 renderItem = { this . renderEmojiRow }
128+ role = "grid"
113129 />
114130 </ section >
115131 ) ;
0 commit comments