Skip to content
This repository was archived by the owner on Nov 25, 2021. It is now read-only.

Commit 519b211

Browse files
committed
feat: make some properties optional
This reduces boilerplate code when these properties are not used
1 parent e6dd201 commit 519b211

File tree

2 files changed

+51
-40
lines changed

2 files changed

+51
-40
lines changed

src/HoverOverlay.tsx

Lines changed: 45 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import Loader from '@sourcegraph/icons/lib/Loader'
2-
import { castArray, upperFirst } from 'lodash'
2+
import { castArray, noop, upperFirst } from 'lodash'
33
import AlertCircleOutlineIcon from 'mdi-react/AlertCircleOutlineIcon'
44
import CloseIcon from 'mdi-react/CloseIcon'
55
import InformationOutlineIcon from 'mdi-react/InformationOutlineIcon'
@@ -78,51 +78,62 @@ export const isJumpURL = (val: any): val is { jumpURL: string } =>
7878
const 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
)}

src/hoverifier.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { isEqual } from 'lodash'
2-
import { combineLatest, concat, fromEvent, merge, Observable, of, Subject, Subscription, zip } from 'rxjs'
1+
import { isEqual, noop } from 'lodash'
2+
import { combineLatest, concat, EMPTY, fromEvent, merge, Observable, of, Subject, Subscription, zip } from 'rxjs'
33
import {
44
catchError,
55
debounceTime,
@@ -70,7 +70,7 @@ export interface HoverifierOptions {
7070
/**
7171
* Called to log telemetry events
7272
*/
73-
logTelemetryEvent: (event: string, data?: any) => void
73+
logTelemetryEvent?: (event: string, data?: any) => void
7474

7575
fetchHover: HoverFetcher
7676
fetchJumpURL: JumpURLFetcher
@@ -130,7 +130,7 @@ export interface HoverifyOptions extends EventOptions {
130130
* Emit on this Observable to trigger the overlay on a position in this code view.
131131
* This Observable is intended to be used to trigger a Hover after a URL change with a position.
132132
*/
133-
positionJumps: Observable<PositionJump>
133+
positionJumps?: Observable<PositionJump>
134134
}
135135

136136
/**
@@ -228,7 +228,7 @@ export const createHoverifier = ({
228228
pushHistory,
229229
fetchHover,
230230
fetchJumpURL,
231-
logTelemetryEvent,
231+
logTelemetryEvent = noop,
232232
}: HoverifierOptions): Hoverifier => {
233233
// Internal state that is not exposed to the caller
234234
// Shared between all hoverified code views
@@ -579,7 +579,7 @@ export const createHoverifier = ({
579579
map(internalToExternalState),
580580
distinctUntilChanged((a, b) => isEqual(a, b))
581581
),
582-
hoverify({ positionEvents, positionJumps, ...eventOptions }: HoverifyOptions): Subscription {
582+
hoverify({ positionEvents, positionJumps = EMPTY, ...eventOptions }: HoverifyOptions): Subscription {
583583
const subscription = new Subscription()
584584
const eventWithOptions = map((event: PositionEvent) => ({ ...event, ...eventOptions }))
585585
// Broadcast all events from this code view

0 commit comments

Comments
 (0)