Create transient "status bar" to display the hover URL.

Implementation:
- <StatusBar> listens to 'update-target-url' and will show/hide itself as needed.
- Handled the display of "lbry://" protocol.

CSS:
- The colors chosen should work on both Light and Dark Theme.
- The delay is necessary to avoid blinkies when the mouse is moving around.

#4259
This commit is contained in:
infiinte-persistence 2020-05-28 17:47:18 +08:00 committed by Sean Yesmunt
parent 5d1d36d4af
commit ae82b3fc05
4 changed files with 84 additions and 0 deletions

View file

@ -164,5 +164,17 @@ export default appState => {
shell.openExternal(url);
});
window.webContents.on('update-target-url', (event, url) => {
// Change internal links to the lbry protocol. External (https) links should remain unchanged.
let dispUrl = url.replace(`http://localhost:${WEBPACK_ELECTRON_PORT}/`, lbryProto);
// Non-claims don't need the lbry protocol:
if (dispUrl === lbryProto) {
dispUrl = 'Home';
} else if (dispUrl.startsWith(lbryProto + '$/')) {
dispUrl = dispUrl.replace(lbryProto, '/');
}
window.webContents.send('update-target-url', dispUrl);
});
return window;
};

View file

@ -0,0 +1,48 @@
// @flow
import React from 'react';
import { ipcRenderer } from 'electron';
import classnames from 'classnames';
type Props = {};
type State = {
hoverUrl: string,
show: boolean,
};
class StatusBar extends React.PureComponent<Props, State> {
constructor() {
super();
this.state = {
hoverUrl: '',
show: false,
};
(this: any).handleUrlChange = this.handleUrlChange.bind(this);
}
componentDidMount() {
ipcRenderer.on('update-target-url', this.handleUrlChange);
}
componentWillUnmount() {
ipcRenderer.removeListener('update-target-url', this.handleUrlChange);
}
handleUrlChange(event: any, url: string) {
// We want to retain the previous URL so that it can fade out
// without the component collapsing.
if (url === '') {
this.setState({ show: false });
} else {
this.setState({ show: true });
this.setState({ hoverUrl: url });
}
}
render() {
const { hoverUrl, show } = this.state;
return <div className={classnames('status-bar', { visible: show })}>{hoverUrl}</div>;
}
}
export default StatusBar;

View file

@ -44,6 +44,7 @@
@import 'component/snack-bar';
@import 'component/spinner';
@import 'component/splash';
@import 'component/status-bar';
@import 'component/subscriptions';
@import 'component/syntax-highlighter';
@import 'component/table';

View file

@ -0,0 +1,23 @@
.status-bar {
background-color: #505050;
border: solid 1px #707070;
border-bottom-color: #505050;
border-left-color: #505050;
color: #e0e0e0;
position: fixed;
left: 0;
bottom: 0;
font-size: var(--font-small);
padding-top: 2px;
padding-left: var(--spacing-xsmall);
padding-right: var(--spacing-xsmall);
border-top-right-radius: var(--spacing-xsmall);
opacity: 0;
transition: opacity 0.3s ease;
transition-delay: 400ms;
&.visible {
opacity: 1;
transition-delay: 0s;
}
}