diff --git a/.env.defaults b/.env.defaults new file mode 100644 index 000000000..d1981763f --- /dev/null +++ b/.env.defaults @@ -0,0 +1,12 @@ +# Copy this file to .env to make modifications +WEBPACK_WEB_PORT=9090 +WEBPACK_ELECTRON_PORT=9091 +WEB_SERVER_PORT=1337 +DOMAIN=lbry.tv +URL=https://lbry.tv +SITE_TITLE=lbry.tv +LOGO_TITLE=LBRY +LBRY_WEB_API=https://api.lbry.tv +LBRY_WEB_STREAMING_API=https://cdn.lbryplayer.xyz +WELCOME_VERSION=1.0 +DEFAULT_LANGUAGE=en diff --git a/.flowconfig b/.flowconfig index 3083a80df..677258c1d 100644 --- a/.flowconfig +++ b/.flowconfig @@ -27,8 +27,9 @@ module.name_mapper='^analytics\(.*\)$' -> '/ui/analytics\1' module.name_mapper='^i18n\(.*\)$' -> '/ui/i18n\1' module.name_mapper='^effects\(.*\)$' -> '/ui/effects\1' module.name_mapper='^config\(.*\)$' -> '/config\1' -module.name_mapper='^lbrytv\/component\(.*\)$' -> '/lbrytv/component\1' -module.name_mapper='^lbrytv\/effects\(.*\)$' -> '/lbrytv/effects\1' -module.name_mapper='^lbrytv\/page\(.*\)$' -> '/lbrytv/page\1' +module.name_mapper='^web\/component\(.*\)$' -> '/web/component\1' +module.name_mapper='^web\/effects\(.*\)$' -> '/web/effects\1' +module.name_mapper='^web\/page\(.*\)$' -> '/web/page\1' +module.name_mapper='^homepage\(.*\)$' -> '/ui/util/homepage\1' [strict] diff --git a/.gitignore b/.gitignore index 2f84810ea..cbb91c3c7 100644 --- a/.gitignore +++ b/.gitignore @@ -13,5 +13,9 @@ package-lock.json .transifexrc .idea/ /build/daemon* -/lbrytv/dist/ -/lbrytv/node_modules +/web/dist/* +/web/node_modules/* +/web/.env +/custom/* +!/custom/homepage.example.js +.env diff --git a/.lintstagedrc.json b/.lintstagedrc.json index 9333f0b94..f1722f87f 100644 --- a/.lintstagedrc.json +++ b/.lintstagedrc.json @@ -1,9 +1,9 @@ { "linters": { "ui/**/*.{js,jsx,scss,json}": ["prettier --write", "git add"], - "lbrytv/**/*.{js,jsx,scss,json}": ["prettier --write", "git add"], + "web/**/*.{js,jsx,scss,json}": ["prettier --write", "git add"], "ui/**/*.{js,jsx}": ["eslint", "flow focus-check --color always", "git add"], - "lbrytv/**/*.{js,jsx,scss}": ["eslint", "git add"] + "web/**/*.{js,jsx,scss}": ["eslint", "git add"] }, - "ignore": ["node_modules", "dist", "package-lock.json"] + "ignore": ["node_modules", "web/dist/**/*", "dist/**/*", "package-lock.json"] } diff --git a/README.md b/README.md index 61456119f..86a5e4684 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ You can run the web version (lbry.tv), the electron app, or both at the same tim - If you want to build and launch the production app you can run `yarn build`. This will give you an executable inside the `/dist` folder. We use [electron-builder](https://github.com/electron-userland/electron-builder) to create distributable packages. -#### Run the web app +#### Run the web app for development `yarn compile:web` (this is only needed the first time you run the app) @@ -100,6 +100,29 @@ You can run the web version (lbry.tv), the electron app, or both at the same tim - This uses webpack-dev-server and includes hot-reloading. If you want to debug the [web server we use in production](https://github.com/lbryio/lbry-desktop/blob/master/src/platforms/web/server.js) you can run `yarn dev:web-server`. This starts a server at `localhost:1337` and does not include hot reloading. + +#### Customize the web app + +- Enter web directory, copy .env.defaults to .env and make changes +``` +cd web +cp .env.defaults .env +nano .env +``` +- If you want to customize the homepage content +1. add `CUSTOM_HOMEPAGE=true` to the 'web/.env' file +2. copy `/custom/homepage.example.js` to `/custom/homepage.js` and make desired changes to `homepage.js` + +#### Deploy the web app (*experimental*) + +1. Create a server with a domain name and a reverse proxy https to port 1337. +2. Install pm2, node v10, yarn +3. Clone this repo +4. Make any customizations as above +5. Run 'yarn' to install +6. Run yarn compile:web to build +7. Set up pm2 to start ./web/index.js + #### Run both at the same time Run the two commands above in separate terminal windows diff --git a/config.js b/config.js index dd5700c60..4fa67f6d4 100644 --- a/config.js +++ b/config.js @@ -1,13 +1,22 @@ +// On Web, this will find .env.defaults and optional .env in web/ +// On Desktop App, this will find .env.defaults and optional .env in root dir +require('dotenv-defaults').config({silent: false}); const config = { - WEBPACK_WEB_PORT: 9090, - WEBPACK_ELECTRON_PORT: 9091, - WEB_SERVER_PORT: 1337, - DOMAIN: 'lbry.tv', - URL: 'https://lbry.tv', - SITE_TITLE: 'lbry.tv', - LBRY_TV_API: 'https://api.lbry.tv', - LBRY_TV_STREAMING_API: 'https://cdn.lbryplayer.xyz', - WELCOME_VERSION: 1.0, + WEBPACK_WEB_PORT: process.env.WEBPACK_WEB_PORT, + WEBPACK_ELECTRON_PORT: process.env.WEBPACK_ELECTRON_PORT, + WEB_SERVER_PORT: process.env.WEB_SERVER_PORT, + DOMAIN: process.env.DOMAIN, + URL: process.env.URL, //lbry.tv', + SITE_TITLE: process.env.SITE_TITLE, + LBRY_WEB_API: process.env.LBRY_WEB_API, //api.lbry.tv', + LBRY_WEB_STREAMING_API: process.env.LBRY_WEB_STREAMING_API, //cdn.lbryplayer.xyz', + WELCOME_VERSION: process.env.WELCOME_VERSION, + DEFAULT_LANGUAGE: process.env.DEFAULT_LANGUAGE, + LOGO_TITLE: process.env.LOGO_TITLE, + PINNED_URI_1: process.env.PINNED_URI_1, + PINNED_LABEL_1: process.env.PINNED_LABEL_1, + PINNED_URI_2: process.env.PINNED_URI_2, + PINNED_LABEL_2: process.env.PINNED_LABEL_2, }; config.URL_LOCAL = `http://localhost:${config.WEB_SERVER_PORT}`; diff --git a/custom/homepage.example.js b/custom/homepage.example.js new file mode 100644 index 000000000..97dc660f9 --- /dev/null +++ b/custom/homepage.example.js @@ -0,0 +1,306 @@ +// @flow + +/* +Creating custom homepage items +1) in web/ folder, copy `.env.defaults` to `.env` and make CUSTOM_HOMEPAGE=true +2) copy this file to homepage.js +3) Create item objects + { + title, // how the title link displays + link, // where the title link goes + options // what search results populate the homepage item + } +4) rowData.push(item) for each item in the order you want them + +Item object examples: + Specific Channel + + const LATEST_FROM_%CHANNEL% = { + title: 'Latest From @%channel%', + link: `/@%channelName%:%canonicalId%`, + options: { + orderBy: ['release_time'], + pageSize: 4, + channelIds: ['%channelId%'], + }, + }; + + More complex List of channels with description icon filtering by fee_amount etc are possible + + SOME_CHANNEL_IDS = ['channelId1', 'channelId2'] + SOME_TAG = ' + const SOME_CHANNELS_ITEM = { + title: '#aTitle', + link: `/$/${PAGES.DISCOVER}?${CS.TAGS_KEY}=aTag&fee_amount=>0&${CS.CLAIM_TYPE}=${CS.CLAIM_STREAM}&${ + CS.CHANNEL_IDS_KEY + }=${SOME_CHANNEL_IDS.join(',')}`, + help: ( +
+ +
+ ), + options: { // search options + feeAmount: '>0', + claimType: ['stream'], + tags: ['tagOne', 'tagTwo'], + pageSize: 8, + channelIds: SOME_CHANNEL_IDS, + }, + }; + */ +import * as PAGES from 'constants/pages'; +import * as CS from 'constants/claim_search'; +import * as ICONS from 'constants/icons'; +import { parseURI } from 'lbry-redux'; +import moment from 'moment'; +import { toCapitalCase } from 'util/string'; +import React from 'react'; +import Icon from 'component/common/icon'; + +type RowDataItem = { + title: string, + link?: string, + help?: any, + options?: {}, +}; + +export default function getHomePageRowData( + authenticated, + showPersonalizedChannels: boolean, + showPersonalizedTags: boolean, + subscribedChannels: Array, + followedTags: Array, + showIndividualTags: boolean +) { + let rowData: Array = []; + const individualTagDataItems: Array = []; + const PAID_BETA_CHANNEL_IDS_KEY = [ + '4ee7cfaf1fc50a6df858ed0b99c278d633bccca9', + '5af39f818f668d8c00943c9326c5201c4fe3c423', + 'cda9c4e92f19d6fe0764524a2012056e06ca2055', + '760da3ba3dd85830a843beaaed543a89b7a367e7', + '40c36948f0da072dcba3e4833e90f71e16de78be', + 'e8f68563d242f6ac9784dcbc41dd86c28a9391d6', + '7236fc5d2783ea7314d9076ae6c8a250e3992d1a', + '8627af93c1a1219150f06b698f4b33e6ed2f1c1e', + 'c5b0b17838df2f6c31162f64d55f60f34ae8bfc6', + 'f576d5dba905fc179de880c3fe3eb3281ea74f59', + '97dd77c93c9603cbb2583f3589f7f5a6c92baa43', + 'f399d873e0c37cf24de9569b5f22bbb30a5c6709', + 'dba870d0620d41b2b9a152c961e0c06cf875ccfc', + 'ca1fd651c9d14bf2e5088bb2aa0146ee7aeb2ae0', + '50ad846a4b1543b847bf3fdafb7b45f6b2f5844c', + 'e09ff5abe9fb44dd0dd0576894a6db60a6211603', + '7b6f7517f6b816827d076fa0eaad550aa315a4e7', + '2068452c41d8da3bd68961335da0072a99258a1a', + '3645cf2f5d0bdac0523f945be1c3ff60758f7845', + '4da85b12244839d6368b9290f1619ff9514ab2a8', + '4ad942982e43326c7700b1b6443049b3cfd82161', + '55304f219244abf82f684f759cc0c7769242f3b4', + '8f42e5b592bb7f7a03f4a94a86a41b1236bb099f', + 'e2a014d885a48f5be2dc6409610996337312facb', + 'c18996ca488753f714d36d4654715927c1d7f9c2', + 'ebc4214424cfa683a7046e1f794fea1e44788d84', + '06b6d6d6a893fb589ec2ded948f5122856921ed5', + '07e4546674268fc0222b2ca22d31d0549dc217ee', + '060940e41973d4f7f16d72a2733138e931c35f41', + 'f8d6eccd887c9cebd36b1d42aa349279b7f5c3ed', + '68098b8426f967b8d04cc566348b5c128823219e', + '2bfe6cdb24a21bdc1b76fb7c416edd50e9e85945', + '1f9bb08bfa2259629f4aaa9ed40f97e9a41b6fa1', + '2f20148495612946675fe1c8ea99171e4d950b81', + 'bc6938fa1e09e840056c2e831abf9664f397c472', + '2a6194792beac5130641e932b5ac6e5a99b5ca4f', + '185ba2bd547a5e4a77d29fe6c1484f47db5e058f', + '29cc7f6081268eaa5b3f2946e0cd0b952a94812c', + 'ffdc62ac2f7549398d3aca9d2119e83d80d588d5', + 'd7a4d2808074b0c55d6b239f69d90e7a4930f943', + 'd58aa4a0b2f6c2504c3abce8de3f1afb71800acc', + '77ae23dc7eb8a75609881d4548a79e4935a89d37', + 'f79bce8a60fbece671f6265adc39f6469f3b9b8c', + '051995fdf0af634e4911704057a551e9392e62b1', + 'b0e489f986c345aef23c4a48d91cbcf5a6fdb9ac', + '825aa21c8c0bda4ded3e69a69238763c8cfcc13b', + '49389450b1241f5d8f4c8c4271a3eb56bba33965', + 'f3b9973e1725ecb50da3e6fa4d47343c98ef0382', + '321b33d22c8e24ef207e3f357a4573f6a56611f3', + '20d694ada07e740c6fa43a8c324cb7d6e362b5ee', + 'cf7792c2a37d0d76aaaff84aff0b99a8c791429d', + '8316ac90764fedf3147799b7b81a6575a9cc398e', + '8972a1bd06de5186e5e89292b05aac8aaa817791', + '5da63df97c8255ae94a88940695b8471657dd5a1', + 'f3da2196b5151570d980b34d311ee0973225a68e', + '7644fdb8342624f6c647c79de25610801573fa68', + ]; + + const TV_PAID_BETA_ROW = { + title: '#lbrytvpaidbeta', + link: `/$/${PAGES.DISCOVER}?${CS.TAGS_KEY}=lbrytvpaidbeta&fee_amount=>0&${CS.CLAIM_TYPE}=${CS.CLAIM_STREAM}&${ + CS.CHANNEL_IDS_KEY + }=${PAID_BETA_CHANNEL_IDS_KEY.join(',')}`, + help: ( +
+ +
+ ), + options: { + feeAmount: '>0', + claimType: ['stream'], + tags: ['lbrytvpaidbeta', 'lbry tvpaidbeta'], + pageSize: 8, + channelIds: PAID_BETA_CHANNEL_IDS_KEY, + }, + }; + + if (followedTags.length) { + followedTags.forEach((tag: Tag) => { + individualTagDataItems.push({ + title: `Trending for #${toCapitalCase(tag.name)}`, + link: `/$/${PAGES.DISCOVER}?t=${tag.name}`, + options: { + pageSize: 4, + tags: [tag.name], + claimType: ['stream'], + }, + }); + }); + } + + const RECENT_FROM_FOLLOWING = { + title: 'Recent From Following', + link: `/$/${PAGES.CHANNELS_FOLLOWING}`, + options: { + orderBy: ['release_time'], + releaseTime: + subscribedChannels.length > 20 + ? `>${Math.floor( + moment() + .subtract(6, 'months') + .startOf('week') + .unix() + )}` + : `>${Math.floor( + moment() + .subtract(1, 'year') + .startOf('week') + .unix() + )}`, + pageSize: subscribedChannels.length > 3 ? 8 : 4, + channelIds: subscribedChannels.map((subscription: Subscription) => { + const { channelClaimId } = parseURI(subscription.uri); + return channelClaimId; + }), + }, + }; + + const TOP_CONTENT_TODAY = { + title: 'Top Content from Today', + link: `/$/${PAGES.DISCOVER}?${CS.ORDER_BY_KEY}=${CS.ORDER_BY_TOP}&${CS.FRESH_KEY}=${CS.FRESH_DAY}`, + options: { + pageSize: showPersonalizedChannels || showPersonalizedTags ? 4 : 8, + orderBy: ['effective_amount'], + claimType: ['stream'], + releaseTime: `>${Math.floor( + moment() + .subtract(1, 'day') + .startOf('day') + .unix() + )}`, + }, + }; + + const TOP_CHANNELS = { + title: 'Top Channels On LBRY', + link: `/$/${PAGES.DISCOVER}?claim_type=channel&${CS.ORDER_BY_KEY}=${CS.ORDER_BY_TOP}&${CS.FRESH_KEY}=${CS.FRESH_ALL}`, + options: { + orderBy: ['effective_amount'], + claimType: ['channel'], + }, + }; + + const TRENDING_CLASSICS = { + title: 'Trending Classics', + link: `/$/${PAGES.DISCOVER}?${CS.ORDER_BY_KEY}=${CS.ORDER_BY_TRENDING}&${CS.FRESH_KEY}=${CS.FRESH_WEEK}`, + options: { + pageSize: 4, + claimType: ['stream'], + releaseTime: `<${Math.floor( + moment() + .subtract(6, 'month') + .startOf('day') + .unix() + )}`, + }, + }; + + const TRENDING_ON_LBRY = { + title: 'Trending On LBRY', + link: `/$/${PAGES.DISCOVER}`, + options: { + pageSize: showPersonalizedChannels || showPersonalizedTags ? 4 : 8, + }, + }; + + const TRENDING_FOR_TAGS = { + title: 'Trending For Your Tags', + link: `/$/${PAGES.TAGS_FOLLOWING}`, + options: { + tags: followedTags.map(tag => tag.name), + claimType: ['stream'], + }, + }; + + const LATEST_FROM_LBRY = { + title: 'Latest From @lbry', + link: `/@lbry:3f`, + options: { + orderBy: ['release_time'], + pageSize: 4, + channelIds: ['3fda836a92faaceedfe398225fb9b2ee2ed1f01a'], + }, + }; + + const LATEST_FROM_LBRYCAST = { + title: 'Latest From @lbrycast', + link: `/@lbrycast:4`, + options: { + orderBy: ['release_time'], + pageSize: 4, + channelIds: ['3fda836a92faaceedfe398225fb9b2ee2ed1f01a'], + }, + }; + + if (showPersonalizedChannels) rowData.push(RECENT_FROM_FOLLOWING); + if (showPersonalizedTags && !showIndividualTags) rowData.push(TRENDING_FOR_TAGS); + if (showPersonalizedTags && showIndividualTags) { + individualTagDataItems.forEach((item: RowDataItem) => { + rowData.push(item); + }); + } + if (authenticated) { + rowData.push(TV_PAID_BETA_ROW); + } + rowData.push(TOP_CONTENT_TODAY); + rowData.push(TRENDING_ON_LBRY); + if (!showPersonalizedChannels) rowData.push(TOP_CHANNELS); + if (!authenticated) { + rowData.push(TV_PAID_BETA_ROW); + } + rowData.push(TRENDING_CLASSICS); + rowData.push(LATEST_FROM_LBRYCAST); + rowData.push(LATEST_FROM_LBRY); + + return rowData; +} diff --git a/package.json b/package.json index 90603cf43..cafe04f6f 100644 --- a/package.json +++ b/package.json @@ -21,16 +21,15 @@ "main": "./dist/electron/main.js", "scripts": { "compile:electron": "node --max_old_space_size=4096 ./node_modules/webpack/bin/webpack.js --config webpack.electron.config.js", - "compile:web": "cd ./lbrytv && node --max_old_space_size=4096 ./node_modules/webpack/bin/webpack.js --config webpack.config.js", + "compile:web": "cd web && node --max_old_space_size=4096 ./node_modules/webpack/bin/webpack.js --config webpack.config.js", "compile": "cross-env NODE_ENV=production yarn compile:electron && cross-env NODE_ENV=production yarn compile:web", "dev": "yarn dev:electron", "dev:electron": "cross-env NODE_ENV=development node ./electron/devServer.js", - "dev:web": "cd ./lbrytv && yarn dev", - "dev:web-server": "cross-env NODE_ENV=development yarn compile:web && concurrently \"cross-env NODE_ENV=development yarn compile:web --watch\" \"cd ./lbrytv && yarn dev:server\"", + "dev:web": "cd web && yarn dev", + "dev:web-server": "cross-env NODE_ENV=development yarn compile:web && concurrently \"cross-env NODE_ENV=development yarn compile:web --watch\" \"cd web && yarn dev:server\"", "dev:internal-apis": "LBRY_API_URL='http://localhost:8080' yarn dev:electron", "dev:iatv": "LBRY_API_URL='http://localhost:15400' SDK_API_URL='http://localhost:15100' yarn dev:web", - "run:web": "cross-env NODE_ENV=production yarn compile:web && node ./dist/web/server.js", - "run:web-server": "cross-env NODE_ENV=production yarn compile:web && cd ./lbrytv && yarn dev:server", + "run:web-server": "cross-env NODE_ENV=production yarn compile:web && cd web && yarn dev:server", "pack": "electron-builder --dir", "dist": "electron-builder", "build": "cross-env NODE_ENV=production yarn compile:electron && electron-builder build", @@ -40,7 +39,7 @@ "flow-defs": "flow-typed install", "precommit": "lint-staged", "preinstall": "yarn cache clean lbry-redux && yarn cache clean lbryinc", - "postinstall": "cd ./lbrytv && yarn && cd .. && if-env NODE_ENV=production && yarn postinstall:warning || if-env APP_ENV=web && echo 'Done installing deps' || yarn postinstall:electron", + "postinstall": "cd web && yarn && cd .. && if-env NODE_ENV=production && yarn postinstall:warning || if-env APP_ENV=web && echo 'Done installing deps' || yarn postinstall:electron", "postinstall:electron": "electron-builder install-app-deps && node ./build/downloadDaemon.js", "postinstall:warning": "echo '\n\nWARNING\n\nNot all node modules were installed because NODE_ENV is set to \"production\".\nThis should only be set after installing dependencies with \"yarn\". The app will not work.\n\n'" }, @@ -102,6 +101,8 @@ "del": "^3.0.0", "devtron": "^1.4.0", "dom-scroll-into-view": "^1.2.1", + "dotenv-defaults": "^1.1.1", + "dotenv-webpack": "^1.8.0", "electron": "4.1.0", "electron-builder": "^22.4.0", "electron-devtools-installer": "^2.2.4", @@ -133,7 +134,7 @@ "json-loader": "^0.5.4", "lbry-format": "https://github.com/lbryio/lbry-format.git", "lbry-redux": "lbryio/lbry-redux#d2079111b3372eb926d2753991bed860e57a970a", - "lbryinc": "lbryio/lbryinc#6a52f8026cdc7cd56d200fb5c46f852e0139bbeb", + "lbryinc": "lbryio/lbryinc#8bdf1ac44d03cef9d798df92e3192a4591845f17", "lint-staged": "^7.0.2", "localforage": "^1.7.1", "lodash-es": "^4.17.14", diff --git a/ui/component/app/view.jsx b/ui/component/app/view.jsx index c98aae335..02df1a673 100644 --- a/ui/component/app/view.jsx +++ b/ui/component/app/view.jsx @@ -18,10 +18,10 @@ import { rewards as REWARDS } from 'lbryinc'; import usePersistedState from 'effects/use-persisted-state'; import FileDrop from 'component/fileDrop'; // @if TARGET='web' -import OpenInAppLink from 'lbrytv/component/openInAppLink'; -import YoutubeWelcome from 'lbrytv/component/youtubeReferralWelcome'; -import NagDegradedPerformance from 'lbrytv/component/nag-degraded-performance'; -import NagDataCollection from 'lbrytv/component/nag-data-collection'; +import OpenInAppLink from 'web/component/openInAppLink'; +import YoutubeWelcome from 'web/component/youtubeReferralWelcome'; +import NagDegradedPerformance from 'web/component/nag-degraded-performance'; +import NagDataCollection from 'web/component/nag-data-collection'; import { useDegradedPerformance, @@ -29,7 +29,7 @@ import { STATUS_DEGRADED, STATUS_FAILING, STATUS_DOWN, -} from 'lbrytv/effects/use-degraded-performance'; +} from 'web/effects/use-degraded-performance'; // @endif export const MAIN_WRAPPER_CLASS = 'main-wrapper'; // @if TARGET='app' diff --git a/ui/component/channelContent/view.jsx b/ui/component/channelContent/view.jsx index 057c015d2..c34818a15 100644 --- a/ui/component/channelContent/view.jsx +++ b/ui/component/channelContent/view.jsx @@ -5,7 +5,7 @@ import { withRouter } from 'react-router-dom'; import Button from 'component/button'; import ClaimListDiscover from 'component/claimListDiscover'; import * as CS from 'constants/claim_search'; -import Ads from 'lbrytv/component/ads'; +import Ads from 'web/component/ads'; type Props = { uri: string, diff --git a/ui/component/common/icon-custom.jsx b/ui/component/common/icon-custom.jsx index 0423b2aff..2468dc630 100644 --- a/ui/component/common/icon-custom.jsx +++ b/ui/component/common/icon-custom.jsx @@ -629,4 +629,9 @@ export const icons = { ), + [ICONS.PINNED]: buildIcon( + + + + ), }; diff --git a/ui/component/embedTextArea/view.jsx b/ui/component/embedTextArea/view.jsx index 224754db9..4dd4379d2 100644 --- a/ui/component/embedTextArea/view.jsx +++ b/ui/component/embedTextArea/view.jsx @@ -3,7 +3,7 @@ import * as ICONS from 'constants/icons'; import { FormField } from 'component/common/form'; import Button from 'component/button'; import React, { useRef } from 'react'; -import { generateEmbedUrl } from 'util/lbrytv'; +import { generateEmbedUrl } from 'util/web'; type Props = { copyable: string, diff --git a/ui/component/header/view.jsx b/ui/component/header/view.jsx index 7e972e3e9..69254423d 100644 --- a/ui/component/header/view.jsx +++ b/ui/component/header/view.jsx @@ -12,6 +12,7 @@ import Icon from 'component/common/icon'; import { Menu, MenuList, MenuButton, MenuItem } from '@reach/menu-button'; import Tooltip from 'component/common/tooltip'; import NavigationButton from 'component/navigationButton'; +import { LOGO_TITLE } from 'config'; // @if TARGET='app' import { remote } from 'electron'; import { IS_MAC } from 'component/app/view'; @@ -137,7 +138,7 @@ const Header = (props: Props) => {