diff --git a/src/App/styles.less b/src/App/styles.less
index 2b0f0b307..4ab98b8ef 100644
--- a/src/App/styles.less
+++ b/src/App/styles.less
@@ -12,6 +12,7 @@
--scroll-bar-width: 6px;
--focus-outline-size: 2px;
--color-facebook: #4267b2;
+ --color-twitter: #1DA1F2;
--color-placeholder: #60606080;
}
diff --git a/src/common/ShareModal/ShareModal.js b/src/common/ShareModal/ShareModal.js
deleted file mode 100644
index afb6f1d38..000000000
--- a/src/common/ShareModal/ShareModal.js
+++ /dev/null
@@ -1,66 +0,0 @@
-import React, { useRef } from 'react';
-import PropTypes from 'prop-types';
-import classnames from 'classnames';
-import { Input, Modal } from 'stremio/common';
-import Icon from 'stremio-icons/dom';
-import styles from './styles';
-
-const renderInput = ({ className, href, icon, label }) => {
- return (
-
- {label}
-
- );
-};
-
-const renderUrl = (url) => {
- const inputRef = useRef(null);
- const copyToClipboard = () => {
- inputRef.current.select();
- document.execCommand('copy');
- };
-
- if (url.length === 0) {
- return null;
- }
-
- return (
-
- );
-};
-
-const ShareModal = (props) => {
- return (
-
-
-
-
-
-
-
Share
-
- {renderInput({ className: styles['facebook-button'], href: `https://www.facebook.com/sharer/sharer.php?u=${props.url}`, icon: 'ic_facebook', label: 'FACEBOOK' })}
- {renderInput({ className: styles['twitter-button'], href: `https://twitter.com/home?status=${props.url}`, icon: 'ic_twitter', label: 'TWITTER' })}
-
- {renderUrl(props.url)}
-
-
-
- );
-};
-
-ShareModal.propTypes = {
- url: PropTypes.string.isRequired,
- onClose: PropTypes.func
-};
-ShareModal.defaultProps = {
- url: ''
-};
-
-export default ShareModal;
diff --git a/src/common/ShareModal/index.js b/src/common/ShareModal/index.js
deleted file mode 100644
index d57d639f4..000000000
--- a/src/common/ShareModal/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import ShareModal from './ShareModal';
-
-export default ShareModal;
diff --git a/src/common/ShareModal/styles.less b/src/common/ShareModal/styles.less
deleted file mode 100644
index ca0b05022..000000000
--- a/src/common/ShareModal/styles.less
+++ /dev/null
@@ -1,131 +0,0 @@
-.share-modal {
- --share-modal-width: 350px;
- --spacing: 20px;
- font-size: 14px;
-}
-
-.share-modal {
- padding: calc(var(--spacing) * 0.5);
- width: var(--share-modal-width);
- color: var(--color-surfacelighter);
- background-color: var(--color-surfacelighter);
-
- .x-container {
- display: flex;
- flex-direction: row;
- justify-content: flex-end;
-
- .icon {
- padding: 0.2em;
- width: 1.2em;
- height: 1.2em;
- fill: var(--color-surfacedark);
- cursor: pointer;
-
- &:hover {
- fill: var(--color-surface);
- }
- }
-
- &:focus {
- .icon {
- background-color: var(--color-surfacelight);
- }
- }
-
- &:hover {
- .icon {
- background-color: transparent;
- }
- }
- }
-
- .info-container {
- padding: 0 var(--spacing) calc(var(--spacing) * 1.2) var(--spacing);
-
- .share-label {
- font-size: 1.1em;
- color: var(--color-backgrounddarker);
- }
-
- .buttons {
- padding: var(--spacing) 0;
- display: flex;
- flex-direction: row;
-
- .button {
- flex: 1;
- height: 3.2em;
- display: flex;
- flex-direction: row;
- align-items: center;
- justify-content: center;
- font-size: 0.8em;
- color: var(--color-surfacelighter);
- cursor: pointer;
-
- .icon {
- margin-right: 0.6em;
- width: 1.4em;
- height: 1.4em;
- fill: var(--color-surfacelighter);
- }
-
- &:focus, &:hover {
- filter: brightness(1.2);
- }
-
- &:not(:last-child) {
- margin-right: 2em;
- }
- }
-
- .facebook-button {
- background-color: var(--color-secondary);
- }
-
- .twitter-button {
- background-color: var(--color-secondarylighter);
- }
- }
-
- .url-container {
- display: flex;
- flex-direction: row;
- border: calc(var(--focusable-border-size) * 0.5) solid var(--color-surface);
-
- .url {
- flex: 4;
- padding: calc(var(--spacing) * 0.5);
- font-size: 0.9em;
- text-align: center;
- color: var(--color-surfacedark);
- }
-
- .copy-button {
- flex: 1;
- padding: calc(var(--spacing) * 0.5);
- display: flex;
- flex-direction: row;
- justify-content: center;
- background-color: var(--color-surface);
- cursor: pointer;
-
- .icon {
- margin-right: 0.4em;
- width: 1em;
- height: 1em;
- fill: var(--color-surfacedarker);
- }
-
- .label {
- color: var(--color-surfacedarker);
- }
-
- &:focus, &:hover {
- background-color: var(--color-surface60);
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/src/common/SharePrompt/SharePrompt.js b/src/common/SharePrompt/SharePrompt.js
new file mode 100644
index 000000000..4a1abc80b
--- /dev/null
+++ b/src/common/SharePrompt/SharePrompt.js
@@ -0,0 +1,66 @@
+const React = require('react');
+const PropTypes = require('prop-types');
+const classnames = require('classnames');
+const Icon = require('stremio-icons/dom');
+const { useFocusable } = require('stremio-router');
+const Button = require('stremio/common/Button');
+const TextInput = require('stremio/common/TextInput');
+const styles = require('./styles');
+
+const SharePrompt = ({ className, label, url, close }) => {
+ const inputRef = React.useRef(null);
+ const focusable = useFocusable();
+ const copyToClipboard = React.useCallback(() => {
+ inputRef.current.select();
+ document.execCommand('copy');
+ }, []);
+ React.useEffect(() => {
+ const onKeyUp = (event) => {
+ if (event.key === 'Escape' && typeof close === 'function') {
+ close();
+ }
+ };
+ if (focusable) {
+ window.addEventListener('keyup', onKeyUp);
+ }
+ return () => {
+ window.removeEventListener('keyup', onKeyUp);
+ };
+ }, [close, focusable]);
+ return (
+
+
+
+
{label}
+
+
+
+
+
+
+
+ );
+};
+
+SharePrompt.propTypes = {
+ className: PropTypes.string,
+ label: PropTypes.string.isRequired,
+ url: PropTypes.string.isRequired,
+ close: PropTypes.func
+};
+
+module.exports = SharePrompt;
diff --git a/src/common/SharePrompt/index.js b/src/common/SharePrompt/index.js
new file mode 100644
index 000000000..c59eea4d0
--- /dev/null
+++ b/src/common/SharePrompt/index.js
@@ -0,0 +1,3 @@
+const SharePrompt = require('./SharePrompt');
+
+module.exports = SharePrompt;
diff --git a/src/common/SharePrompt/styles.less b/src/common/SharePrompt/styles.less
new file mode 100644
index 000000000..36c97ce7f
--- /dev/null
+++ b/src/common/SharePrompt/styles.less
@@ -0,0 +1,134 @@
+.share-prompt-container {
+ position: relative;
+ z-index: 0;
+ display: flex;
+ flex-direction: column;
+ padding: 2.4rem 0;
+ background-color: var(--color-surfacelighter);
+
+ .close-button-container {
+ position: absolute;
+ top: 0.4rem;
+ right: 0.4rem;
+ z-index: 1;
+ width: 2rem;
+ height: 2rem;
+ padding: 0.4rem;
+
+ &:hover {
+ background-color: var(--color-surfacelight);
+ }
+
+ .icon {
+ display: block;
+ width: 100%;
+ height: 100%;
+ fill: var(--color-backgrounddarker);
+ }
+ }
+
+ .share-prompt-content {
+ padding: 0 2.4rem;
+
+ .share-prompt-label {
+ font-size: 1.3rem;
+ color: var(--color-backgrounddarker);
+ }
+
+ .buttons-container {
+ flex: none;
+ align-self: stretch;
+ display: flex;
+ flex-direction: row;
+ margin: 1.4rem 0;
+
+ .button-container {
+ flex-grow: 0;
+ flex-shrink: 1;
+ flex-basis: 14rem;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: center;
+ padding: 0.6rem 1rem;
+
+ .icon {
+ flex: none;
+ width: 1.4rem;
+ height: 1.4rem;
+ margin-right: 0.6rem;
+ fill: var(--color-surfacelighter);
+ }
+
+ .label {
+ flex-grow: 0;
+ flex-shrink: 1;
+ flex-basis: auto;
+ font-size: 0.8rem;
+ font-weight: 500;
+ color: var(--color-surfacelighter);
+ text-align: center;
+ }
+
+ &:hover, &:focus {
+ filter: brightness(1.2);
+ }
+
+ &:not(:last-child) {
+ margin-right: 2rem;
+ }
+ }
+
+ .facebook-button {
+ background-color: var(--color-facebook);
+ }
+
+ .twitter-button {
+ background-color: var(--color-twitter);
+ }
+ }
+
+ .url-container {
+ display: flex;
+ flex-direction: row;
+ border: thin solid var(--color-surface);
+
+ .url-content {
+ flex: 1;
+ min-width: 12rem;
+ padding: 0.6rem 1rem;
+ font-size: 0.9rem;
+ color: var(--color-surfacedark);
+ text-align: center;
+ }
+
+ .copy-button {
+ flex-grow: 0;
+ flex-shrink: 1;
+ flex-basis: auto;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: center;
+ padding: 0.6rem 1rem;
+ background-color: var(--color-surface);
+
+ .icon {
+ flex: none;
+ width: 1.4rem;
+ height: 1.4rem;
+ margin-right: 0.6rem;
+ fill: var(--color-surfacedarker);
+ }
+
+ .label {
+ color: var(--color-surfacedarker);
+ }
+
+ &:hover, &:focus {
+ filter: brightness(1.2);
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/common/index.js b/src/common/index.js
index 5771413e0..a9c94df99 100644
--- a/src/common/index.js
+++ b/src/common/index.js
@@ -12,7 +12,7 @@ const MetaRowPlaceholder = require('./MetaRowPlaceholder');
const NavBar = require('./NavBar');
const PlayIconCircleCentered = require('./PlayIconCircleCentered');
const Popup = require('./Popup');
-const ShareModal = require('./ShareModal');
+const SharePrompt = require('./SharePrompt');
const Slider = require('./Slider');
const TextInput = require('./TextInput');
const routesRegexp = require('./routesRegexp');
@@ -37,7 +37,7 @@ module.exports = {
NavBar,
PlayIconCircleCentered,
Popup,
- ShareModal,
+ SharePrompt,
Slider,
TextInput,
routesRegexp,
diff --git a/storybook/stories/SharePrompt/SharePrompt.js b/storybook/stories/SharePrompt/SharePrompt.js
new file mode 100644
index 000000000..ab52ebd1c
--- /dev/null
+++ b/storybook/stories/SharePrompt/SharePrompt.js
@@ -0,0 +1,14 @@
+const React = require('react');
+const { storiesOf } = require('@storybook/react');
+const { action } = require('@storybook/addon-actions');
+const { SharePrompt } = require('stremio/common');
+const styles = require('./styles');
+
+storiesOf('SharePrompt', module).add('SharePrompt', () => (
+
+));
diff --git a/storybook/stories/SharePrompt/index.js b/storybook/stories/SharePrompt/index.js
new file mode 100644
index 000000000..81e66574e
--- /dev/null
+++ b/storybook/stories/SharePrompt/index.js
@@ -0,0 +1 @@
+require('./SharePrompt');
diff --git a/storybook/stories/SharePrompt/styles.less b/storybook/stories/SharePrompt/styles.less
new file mode 100644
index 000000000..bcea78a25
--- /dev/null
+++ b/storybook/stories/SharePrompt/styles.less
@@ -0,0 +1,4 @@
+.share-prompt-container {
+ width: 24rem;
+ margin: 1rem;
+}
\ No newline at end of file
diff --git a/storybook/stories/index.js b/storybook/stories/index.js
index a15267d5f..47a0282dd 100644
--- a/storybook/stories/index.js
+++ b/storybook/stories/index.js
@@ -1,3 +1,4 @@
require('./Addon');
require('./MetaItem');
require('./ColorPicker');
+require('./SharePrompt');