diff --git a/src/ui/component/app/index.js b/src/ui/component/app/index.js index 1054f5f81..5d5460c33 100644 --- a/src/ui/component/app/index.js +++ b/src/ui/component/app/index.js @@ -3,12 +3,16 @@ import { connect } from 'react-redux'; import { doError, doFetchTransactions } from 'lbry-redux'; import { selectUser, doRewardList, doFetchRewardedContent, doFetchAccessToken, selectAccessToken } from 'lbryinc'; import { selectThemePath } from 'redux/selectors/settings'; +import { selectIsUpgradeAvailable, selectAutoUpdateDownloaded } from 'redux/selectors/app'; +import { doDownloadUpgradeRequested } from 'redux/actions/app'; import App from './view'; const select = state => ({ user: selectUser(state), theme: selectThemePath(state), accessToken: selectAccessToken(state), + autoUpdateDownloaded: selectAutoUpdateDownloaded(state), + isUpgradeAvailable: selectIsUpgradeAvailable(state), }); const perform = dispatch => ({ @@ -17,6 +21,7 @@ const perform = dispatch => ({ fetchRewardedContent: () => dispatch(doFetchRewardedContent()), fetchTransactions: () => dispatch(doFetchTransactions()), fetchAccessToken: () => dispatch(doFetchAccessToken()), + requestDownloadUpgrade: () => dispatch(doDownloadUpgradeRequested()), }); export default hot( diff --git a/src/ui/component/app/view.jsx b/src/ui/component/app/view.jsx index e8ccf19bf..af7e4b5ca 100644 --- a/src/ui/component/app/view.jsx +++ b/src/ui/component/app/view.jsx @@ -1,4 +1,5 @@ // @flow +import * as ICONS from 'constants/icons'; import React, { useEffect, useRef } from 'react'; import analytics from 'analytics'; import { Lbry, buildURI, parseURI } from 'lbry-redux'; @@ -7,6 +8,7 @@ import ModalRouter from 'modal/modalRouter'; import ReactModal from 'react-modal'; import SideBar from 'component/sideBar'; import Header from 'component/header'; +import Button from 'component/button'; import { openContextMenu } from 'util/context-menu'; import useKonamiListener from 'util/enhanced-layout'; import Yrbl from 'component/yrbl'; @@ -28,10 +30,24 @@ type Props = { fetchRewardedContent: () => void, fetchTransactions: () => void, fetchAccessToken: () => void, + autoUpdateDownloaded: boolean, + isUpgradeAvailable: boolean, + requestDownloadUpgrade: () => void, }; function App(props: Props) { - const { theme, fetchRewards, fetchRewardedContent, fetchTransactions, user, fetchAccessToken, accessToken } = props; + const { + theme, + fetchRewards, + fetchRewardedContent, + fetchTransactions, + user, + fetchAccessToken, + accessToken, + requestDownloadUpgrade, + autoUpdateDownloaded, + isUpgradeAvailable, + } = props; const appRef = useRef(); const isEnhancedLayout = useKonamiListener(); const userId = user && user.id; @@ -41,6 +57,7 @@ function App(props: Props) { const previousHasVerifiedEmail = usePrevious(hasVerifiedEmail); const previousRewardApproved = usePrevious(isRewardApproved); const { pathname, hash } = props.location; + const showUpgradeButton = autoUpdateDownloaded || (process.platform === 'linux' && isUpgradeAvailable); let uri; try { @@ -104,6 +121,20 @@ function App(props: Props) { <ModalRouter /> <FileViewer pageUri={uri} /> + {/* @if TARGET='app' */} + {showUpgradeButton && ( + <div className="snack-bar--upgrade"> + {__('Upgrade is ready')} + <Button + className="snack-bar__action" + button="alt" + icon={ICONS.DOWNLOAD} + label={__('Install now')} + onClick={requestDownloadUpgrade} + /> + </div> + )} + {/* @endif */} {isEnhancedLayout && <Yrbl className="yrbl--enhanced" />} </div> ); diff --git a/src/ui/component/header/index.js b/src/ui/component/header/index.js index 9d381c566..12c91ad43 100644 --- a/src/ui/component/header/index.js +++ b/src/ui/component/header/index.js @@ -4,8 +4,6 @@ import { selectBalance, SETTINGS as LBRY_REDUX_SETTINGS } from 'lbry-redux'; import { formatCredits } from 'util/format-credits'; import { doSetClientSetting } from 'redux/actions/settings'; import { makeSelectClientSetting } from 'redux/selectors/settings'; -import { selectIsUpgradeAvailable, selectAutoUpdateDownloaded } from 'redux/selectors/app'; -import { doDownloadUpgradeRequested } from 'redux/actions/app'; import Header from './view'; @@ -16,13 +14,10 @@ const select = state => ({ currentTheme: makeSelectClientSetting(SETTINGS.THEME)(state), automaticDarkModeEnabled: makeSelectClientSetting(SETTINGS.AUTOMATIC_DARK_MODE_ENABLED)(state), hideBalance: makeSelectClientSetting(SETTINGS.HIDE_BALANCE)(state), - autoUpdateDownloaded: selectAutoUpdateDownloaded(state), - isUpgradeAvailable: selectIsUpgradeAvailable(state), }); const perform = dispatch => ({ setClientSetting: (key, value) => dispatch(doSetClientSetting(key, value)), - doDownloadUpgradeRequested: () => dispatch(doDownloadUpgradeRequested()), }); export default connect( diff --git a/src/ui/component/header/view.jsx b/src/ui/component/header/view.jsx index 7e0606cb7..4dbb85374 100644 --- a/src/ui/component/header/view.jsx +++ b/src/ui/component/header/view.jsx @@ -20,24 +20,10 @@ type Props = { automaticDarkModeEnabled: boolean, setClientSetting: (string, boolean | string) => void, hideBalance: boolean, - autoUpdateDownloaded: boolean, - isUpgradeAvailable: boolean, - doDownloadUpgradeRequested: () => void, }; const Header = (props: Props) => { - const { - roundedBalance, - history, - setClientSetting, - currentTheme, - automaticDarkModeEnabled, - hideBalance, - autoUpdateDownloaded, - isUpgradeAvailable, - doDownloadUpgradeRequested, - } = props; - const showUpgradeButton = autoUpdateDownloaded || (process.platform === 'linux' && isUpgradeAvailable); + const { roundedBalance, history, setClientSetting, currentTheme, automaticDarkModeEnabled, hideBalance } = props; function handleThemeToggle() { if (automaticDarkModeEnabled) { @@ -143,16 +129,6 @@ const Header = (props: Props) => { </Menu> </div> </div> - {/* @if TARGET='app' */} - {showUpgradeButton && ( - <div className="header__banner-background"> - <div className="header__banner-contents"> - {__('Upgrade is ready')} - <Button button="alt" icon={ICONS.DOWNLOAD} label={__('Install now')} onClick={doDownloadUpgradeRequested} /> - </div> - </div> - )} - {/* @endif */} </header> ); }; diff --git a/src/ui/scss/component/_snack-bar.scss b/src/ui/scss/component/_snack-bar.scss index 2bed39e7a..ae06fc0d0 100644 --- a/src/ui/scss/component/_snack-bar.scss +++ b/src/ui/scss/component/_snack-bar.scss @@ -1,7 +1,6 @@ .snack-bar { bottom: 2rem; left: 2rem; - background-color: $lbry-teal-4; border-radius: 0.5rem; color: $lbry-white; @@ -11,6 +10,17 @@ z-index: 10000; // hack to get it over react modal } +.snack-bar--upgrade { + @extend .snack-bar; + left: auto; + right: 2rem; + background-color: $lbry-grape-4; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + .snack-bar--error { background-color: $lbry-red-5; } @@ -19,7 +29,6 @@ display: inline-block; margin: var(--spacing-small) 0; min-width: min-content; - text-transform: uppercase; span:hover { text-decoration: underline;