11import Loader from '@sourcegraph/icons/lib/Loader'
2- import { castArray , upperFirst } from 'lodash'
2+ import { castArray , noop , upperFirst } from 'lodash'
33import AlertCircleOutlineIcon from 'mdi-react/AlertCircleOutlineIcon'
44import CloseIcon from 'mdi-react/CloseIcon'
55import InformationOutlineIcon from 'mdi-react/InformationOutlineIcon'
@@ -78,51 +78,62 @@ export const isJumpURL = (val: any): val is { jumpURL: string } =>
7878const transformMouseEvent = ( handler : ( event : MouseEvent ) => void ) => ( event : React . MouseEvent < HTMLElement > ) =>
7979 handler ( toNativeEvent ( event ) )
8080
81- export const HoverOverlay : React . StatelessComponent < HoverOverlayProps > = props => (
81+ export const HoverOverlay : React . StatelessComponent < HoverOverlayProps > = ( {
82+ definitionURLOrError,
83+ hoveredToken,
84+ hoverOrError,
85+ hoverRef,
86+ linkComponent,
87+ onCloseButtonClick,
88+ onGoToDefinitionClick,
89+ overlayPosition,
90+ showCloseButton,
91+ logTelemetryEvent = noop ,
92+ } ) => (
8293 < div
8394 className = "hover-overlay card"
84- ref = { props . hoverRef }
95+ ref = { hoverRef }
8596 // tslint:disable-next-line:jsx-ban-props needed for dynamic styling
8697 style = {
87- props . overlayPosition
98+ overlayPosition
8899 ? {
89100 opacity : 1 ,
90101 visibility : 'visible' ,
91- left : props . overlayPosition . left + 'px' ,
92- top : props . overlayPosition . top + 'px' ,
102+ left : overlayPosition . left + 'px' ,
103+ top : overlayPosition . top + 'px' ,
93104 }
94105 : {
95106 opacity : 0 ,
96107 visibility : 'hidden' ,
97108 }
98109 }
99110 >
100- { props . showCloseButton && (
111+ { showCloseButton && (
101112 < button
102113 className = "hover-overlay__close-button btn btn-icon"
103- onClick = { props . onCloseButtonClick ? transformMouseEvent ( props . onCloseButtonClick ) : undefined }
114+ onClick = { onCloseButtonClick ? transformMouseEvent ( onCloseButtonClick ) : undefined }
104115 >
105116 < CloseIcon className = "icon-inline" />
106117 </ button >
107118 ) }
108119
109- { props . hoverOrError && (
120+ { hoverOrError && (
110121 < div className = "hover-overlay__contents" >
111- { props . hoverOrError === LOADING ? (
122+ { hoverOrError === LOADING ? (
112123 < div className = "hover-overlay__row hover-overlay__loader-row" >
113124 < Loader className = "icon-inline" />
114125 </ div >
115- ) : isErrorLike ( props . hoverOrError ) ? (
126+ ) : isErrorLike ( hoverOrError ) ? (
116127 < div className = "hover-overlay__row hover-overlay__hover-error lert alert-danger" >
117128 < h4 >
118129 < AlertCircleOutlineIcon className = "icon-inline" /> Error fetching hover from language
119130 server:
120131 </ h4 >
121- { upperFirst ( props . hoverOrError . message ) }
132+ { upperFirst ( hoverOrError . message ) }
122133 </ div >
123134 ) : (
124135 // tslint:disable-next-line deprecation We want to handle the deprecated MarkedString
125- castArray < MarkedString | MarkupContent > ( props . hoverOrError . contents )
136+ castArray < MarkedString | MarkupContent > ( hoverOrError . contents )
126137 . map ( value => ( typeof value === 'string' ? { kind : MarkupKind . Markdown , value } : value ) )
127138 . map ( ( content , i ) => {
128139 if ( MarkupContent . is ( content ) ) {
@@ -165,24 +176,24 @@ export const HoverOverlay: React.StatelessComponent<HoverOverlayProps> = props =
165176
166177 < div className = "hover-overlay__actions hover-overlay__row" >
167178 < ButtonOrLink
168- linkComponent = { props . linkComponent }
169- to = { isJumpURL ( props . definitionURLOrError ) ? props . definitionURLOrError . jumpURL : undefined }
179+ linkComponent = { linkComponent }
180+ to = { isJumpURL ( definitionURLOrError ) ? definitionURLOrError . jumpURL : undefined }
170181 className = "btn btn-secondary hover-overlay__action e2e-tooltip-j2d"
171- onClick = { props . onGoToDefinitionClick ? transformMouseEvent ( props . onGoToDefinitionClick ) : undefined }
182+ onClick = { onGoToDefinitionClick ? transformMouseEvent ( onGoToDefinitionClick ) : undefined }
172183 >
173- Go to definition { props . definitionURLOrError === LOADING && < Loader className = "icon-inline" /> }
184+ Go to definition { definitionURLOrError === LOADING && < Loader className = "icon-inline" /> }
174185 </ ButtonOrLink >
175186 < ButtonOrLink
176- linkComponent = { props . linkComponent }
187+ linkComponent = { linkComponent }
177188 // tslint:disable-next-line:jsx-no-lambda
178- onClick = { ( ) => props . logTelemetryEvent ( 'FindRefsClicked' ) }
189+ onClick = { ( ) => logTelemetryEvent ( 'FindRefsClicked' ) }
179190 to = {
180- props . hoveredToken &&
191+ hoveredToken &&
181192 toPrettyBlobURL ( {
182- repoPath : props . hoveredToken . repoPath ,
183- rev : props . hoveredToken . rev ,
184- filePath : props . hoveredToken . filePath ,
185- position : props . hoveredToken ,
193+ repoPath : hoveredToken . repoPath ,
194+ rev : hoveredToken . rev ,
195+ filePath : hoveredToken . filePath ,
196+ position : hoveredToken ,
186197 viewState : 'references' ,
187198 } )
188199 }
@@ -191,16 +202,16 @@ export const HoverOverlay: React.StatelessComponent<HoverOverlayProps> = props =
191202 Find references
192203 </ ButtonOrLink >
193204 < ButtonOrLink
194- linkComponent = { props . linkComponent }
205+ linkComponent = { linkComponent }
195206 // tslint:disable-next-line:jsx-no-lambda
196- onClick = { ( ) => props . logTelemetryEvent ( 'FindImplementationsClicked' ) }
207+ onClick = { ( ) => logTelemetryEvent ( 'FindImplementationsClicked' ) }
197208 to = {
198- props . hoveredToken &&
209+ hoveredToken &&
199210 toPrettyBlobURL ( {
200- repoPath : props . hoveredToken . repoPath ,
201- rev : props . hoveredToken . rev ,
202- filePath : props . hoveredToken . filePath ,
203- position : props . hoveredToken ,
211+ repoPath : hoveredToken . repoPath ,
212+ rev : hoveredToken . rev ,
213+ filePath : hoveredToken . filePath ,
214+ position : hoveredToken ,
204215 viewState : 'impl' ,
205216 } )
206217 }
@@ -209,17 +220,17 @@ export const HoverOverlay: React.StatelessComponent<HoverOverlayProps> = props =
209220 Find implementations
210221 </ ButtonOrLink >
211222 </ div >
212- { props . definitionURLOrError === null ? (
223+ { definitionURLOrError === null ? (
213224 < div className = "alert alert-info hover-overlay__alert-below" >
214225 < InformationOutlineIcon className = "icon-inline" /> No definition found
215226 </ div >
216227 ) : (
217- isErrorLike ( props . definitionURLOrError ) && (
228+ isErrorLike ( definitionURLOrError ) && (
218229 < div className = "alert alert-danger hover-overlay__alert-below" >
219230 < strong >
220231 < AlertCircleOutlineIcon className = "icon-inline" /> Error finding definition:
221232 </ strong > { ' ' }
222- { upperFirst ( props . definitionURLOrError . message ) }
233+ { upperFirst ( definitionURLOrError . message ) }
223234 </ div >
224235 )
225236 ) }
0 commit comments