improve floating behavior when coming from embeds
This commit is contained in:
parent
5152e78f09
commit
8d888d3e23
8 changed files with 40 additions and 27 deletions
|
@ -1,23 +1,26 @@
|
||||||
// @flow
|
// @flow
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import classnames from 'classnames';
|
||||||
import Spinner from 'component/spinner';
|
import Spinner from 'component/spinner';
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
status?: string,
|
status?: string,
|
||||||
spinner: boolean,
|
spinner: boolean,
|
||||||
|
isDocument: boolean,
|
||||||
};
|
};
|
||||||
|
|
||||||
class LoadingScreen extends React.PureComponent<Props> {
|
class LoadingScreen extends React.PureComponent<Props> {
|
||||||
static defaultProps = {
|
static defaultProps = {
|
||||||
spinner: true,
|
spinner: true,
|
||||||
|
isDocument: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { status, spinner } = this.props;
|
const { status, spinner, isDocument } = this.props;
|
||||||
return (
|
return (
|
||||||
<div className="content__loading">
|
<div className={classnames('content__loading', { 'content__loading--document': isDocument })}>
|
||||||
{spinner && <Spinner light />}
|
{spinner && <Spinner light={!isDocument} />}
|
||||||
{status && <span className="content__loading-text">{status}</span>}
|
{status && <span className={classnames('content__loading-text')}>{status}</span>}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@ import * as SETTINGS from 'constants/settings';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { makeSelectThumbnailForUri, doResolveUri, makeSelectClaimForUri } from 'lbry-redux';
|
import { makeSelectThumbnailForUri, doResolveUri, makeSelectClaimForUri } from 'lbry-redux';
|
||||||
import { doFetchCostInfoForUri } from 'lbryinc';
|
import { doFetchCostInfoForUri } from 'lbryinc';
|
||||||
import { doSetFloatingUri } from 'redux/actions/content';
|
import { doSetFloatingUri, doPlayUri } from 'redux/actions/content';
|
||||||
import { makeSelectClientSetting } from 'redux/selectors/settings';
|
import { makeSelectClientSetting } from 'redux/selectors/settings';
|
||||||
import ChannelThumbnail from './view';
|
import ChannelThumbnail from './view';
|
||||||
|
|
||||||
|
@ -16,4 +16,5 @@ export default connect(select, {
|
||||||
doResolveUri,
|
doResolveUri,
|
||||||
doFetchCostInfoForUri,
|
doFetchCostInfoForUri,
|
||||||
doSetFloatingUri,
|
doSetFloatingUri,
|
||||||
|
doPlayUri,
|
||||||
})(ChannelThumbnail);
|
})(ChannelThumbnail);
|
||||||
|
|
|
@ -14,6 +14,7 @@ type Props = {
|
||||||
doFetchCostInfoForUri: string => void,
|
doFetchCostInfoForUri: string => void,
|
||||||
doSetFloatingUri: string => void,
|
doSetFloatingUri: string => void,
|
||||||
floatingPlayerEnabled: boolean,
|
floatingPlayerEnabled: boolean,
|
||||||
|
doPlayUri: string => void,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function FileRenderFloating(props: Props) {
|
export default function FileRenderFloating(props: Props) {
|
||||||
|
@ -25,6 +26,7 @@ export default function FileRenderFloating(props: Props) {
|
||||||
doFetchCostInfoForUri,
|
doFetchCostInfoForUri,
|
||||||
doSetFloatingUri,
|
doSetFloatingUri,
|
||||||
floatingPlayerEnabled,
|
floatingPlayerEnabled,
|
||||||
|
doPlayUri,
|
||||||
} = props;
|
} = props;
|
||||||
const { push } = useHistory();
|
const { push } = useHistory();
|
||||||
const isMobile = useIsMobile();
|
const isMobile = useIsMobile();
|
||||||
|
@ -43,6 +45,9 @@ export default function FileRenderFloating(props: Props) {
|
||||||
push(formattedUrl);
|
push(formattedUrl);
|
||||||
} else {
|
} else {
|
||||||
doSetFloatingUri(uri);
|
doSetFloatingUri(uri);
|
||||||
|
// @if TARGET='app'
|
||||||
|
doPlayUri(uri);
|
||||||
|
// @endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -118,7 +118,14 @@ export default function FileRenderFloating(props: Props) {
|
||||||
<span className="media__uri--inline">{uri}</span>
|
<span className="media__uri--inline">{uri}</span>
|
||||||
<div className="content__actions">
|
<div className="content__actions">
|
||||||
<Tooltip label={__('View File')}>
|
<Tooltip label={__('View File')}>
|
||||||
<Button navigate={uri} onClick={() => setPlayingUri(uri)} icon={ICONS.VIEW} button="primary" />
|
<Button
|
||||||
|
navigate={uri}
|
||||||
|
onClick={() => {
|
||||||
|
setPlayingUri(uri);
|
||||||
|
}}
|
||||||
|
icon={ICONS.VIEW}
|
||||||
|
button="primary"
|
||||||
|
/>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
<Tooltip label={__('Close')}>
|
<Tooltip label={__('Close')}>
|
||||||
<Button onClick={closeFloatingPlayer} icon={ICONS.REMOVE} button="primary" />
|
<Button onClick={closeFloatingPlayer} icon={ICONS.REMOVE} button="primary" />
|
||||||
|
|
|
@ -52,5 +52,5 @@ export default function FileRenderInline(props: Props) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return renderContent ? <FileRender uri={uri} /> : <LoadingScreen status={__('Preparing your content')} />;
|
return renderContent ? <FileRender uri={uri} /> : <LoadingScreen status={__('Preparing your content')} isDocument />;
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,20 +37,18 @@ export const makeSelectIsPlaying = (uri: string) => createSelector(selectPlaying
|
||||||
|
|
||||||
// below is dumb, some context: https://stackoverflow.com/questions/39622864/access-react-router-state-in-selector
|
// below is dumb, some context: https://stackoverflow.com/questions/39622864/access-react-router-state-in-selector
|
||||||
export const makeSelectIsPlayerFloating = (location: UrlLocation) =>
|
export const makeSelectIsPlayerFloating = (location: UrlLocation) =>
|
||||||
createSelector(selectFloatingUri, selectPlayingUri, (floatingUri, playingUri) => {
|
createSelector(selectFloatingUri, selectPlayingUri, selectClaimsByUri, (floatingUri, playingUri, claimsByUri) => {
|
||||||
if (floatingUri) {
|
if (playingUri && floatingUri && playingUri !== floatingUri) {
|
||||||
if (!playingUri) {
|
return true;
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return floatingUri !== playingUri;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// If there is no floatingPlayer explicitly set, see if the playingUri can float
|
// If there is no floatingPlayer explicitly set, see if the playingUri can float
|
||||||
try {
|
try {
|
||||||
const { pathname, hash } = location;
|
const { pathname } = location;
|
||||||
const newpath = buildURI(parseURI(pathname.slice(1).replace(/:/g, '#')));
|
const pageUrl = buildURI(parseURI(pathname.slice(1).replace(/:/g, '#')));
|
||||||
return playingUri && playingUri !== newpath + hash;
|
const claimFromUrl = claimsByUri[pageUrl];
|
||||||
|
const playingClaim = claimsByUri[playingUri];
|
||||||
|
return (claimFromUrl && claimFromUrl.claim_id) !== (playingClaim && playingClaim.claim_id);
|
||||||
} catch (e) {}
|
} catch (e) {}
|
||||||
|
|
||||||
return !!playingUri;
|
return !!playingUri;
|
||||||
|
|
|
@ -155,6 +155,15 @@
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 0 var(--spacing-large);
|
padding: 0 var(--spacing-large);
|
||||||
background-color: #000;
|
background-color: #000;
|
||||||
|
|
||||||
|
&.content__loading--document {
|
||||||
|
background-color: var(--color-card-background);
|
||||||
|
padding: calc(var(--spacing-xlarge) * 3) 0;
|
||||||
|
|
||||||
|
.content__loading-text {
|
||||||
|
color: var(--color-text);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.content__loading-text {
|
.content__loading-text {
|
||||||
|
|
|
@ -51,16 +51,6 @@
|
||||||
max-height: none;
|
max-height: none;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
|
|
||||||
.content__loading {
|
|
||||||
background-color: transparent;
|
|
||||||
padding: 0;
|
|
||||||
margin: var(--spacing-xlarge) 0;
|
|
||||||
|
|
||||||
.content__loading-text {
|
|
||||||
color: var(--color-text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.markdown-preview {
|
.markdown-preview {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
|
|
Loading…
Add table
Reference in a new issue