|
1 | | -import { useCallback, useMemo } from 'react' |
| 1 | +import { KeyboardEvent, MouseEvent, useCallback, useMemo } from 'react' |
2 | 2 |
|
3 | 3 | import { |
4 | 4 | SUGGESTED_TRACK_COUNT, |
@@ -79,38 +79,65 @@ const SuggestedTrackRow = (props: SuggestedTrackProps) => { |
79 | 79 | onAddTrack(track_id) |
80 | 80 | }, [onAddTrack, track_id]) |
81 | 81 |
|
| 82 | + const handleRowKeyDown = useCallback( |
| 83 | + (e: KeyboardEvent<HTMLDivElement>) => { |
| 84 | + if (e.key === 'Enter' || e.key === ' ') { |
| 85 | + e.preventDefault() |
| 86 | + togglePlay() |
| 87 | + } |
| 88 | + }, |
| 89 | + [togglePlay] |
| 90 | + ) |
| 91 | + |
| 92 | + const handleAddClick = useCallback( |
| 93 | + (e: MouseEvent<HTMLButtonElement>) => { |
| 94 | + e.stopPropagation() |
| 95 | + handleAddTrack() |
| 96 | + }, |
| 97 | + [handleAddTrack] |
| 98 | + ) |
| 99 | + |
82 | 100 | return ( |
83 | | - <div className={styles.suggestedTrack}> |
| 101 | + <div |
| 102 | + className={styles.suggestedTrack} |
| 103 | + role='button' |
| 104 | + tabIndex={0} |
| 105 | + aria-label={isTrackPlaying ? `Pause ${title}` : `Play ${title}`} |
| 106 | + onClick={togglePlay} |
| 107 | + onKeyDown={handleRowKeyDown} |
| 108 | + > |
84 | 109 | <div className={styles.trackDetails}> |
85 | | - <button |
86 | | - type='button' |
87 | | - className={styles.artworkButton} |
88 | | - onClick={togglePlay} |
89 | | - onMouseDown={(e) => e.preventDefault()} |
90 | | - aria-label={isTrackPlaying ? `Pause ${title}` : `Play ${title}`} |
91 | | - > |
| 110 | + <div className={styles.artworkWrapper}> |
92 | 111 | <Image className={styles.trackArtwork} src={image} /> |
93 | 112 | <span |
94 | 113 | className={cn(styles.playOverlay, { |
95 | 114 | [styles.isPlaying]: isTrackPlaying |
96 | 115 | })} |
| 116 | + aria-hidden='true' |
97 | 117 | > |
98 | 118 | {isTrackPlaying ? ( |
99 | 119 | <IconPause size='s' color='staticWhite' /> |
100 | 120 | ) : ( |
101 | 121 | <IconPlay size='s' color='staticWhite' /> |
102 | 122 | )} |
103 | 123 | </span> |
104 | | - </button> |
| 124 | + </div> |
105 | 125 | <div className={styles.trackInfo}> |
106 | 126 | <p className={styles.trackName}>{title}</p> |
107 | | - {user ? <UserLink userId={user.user_id} size='s' /> : null} |
| 127 | + {user ? ( |
| 128 | + <span |
| 129 | + className={styles.userLinkWrapper} |
| 130 | + onClick={(e) => e.stopPropagation()} |
| 131 | + > |
| 132 | + <UserLink userId={user.user_id} size='s' /> |
| 133 | + </span> |
| 134 | + ) : null} |
108 | 135 | </div> |
109 | 136 | </div> |
110 | 137 | <Button |
111 | 138 | variant='secondary' |
112 | 139 | size='small' |
113 | | - onClick={handleAddTrack} |
| 140 | + onClick={handleAddClick} |
114 | 141 | onMouseDown={(e) => e.preventDefault()} |
115 | 142 | disabled={trackIsInCollection} |
116 | 143 | > |
|
0 commit comments