+
0 })}>
{
- typeof description === 'string' && description.length > 0 ?
-
-
{description}
+ typeof logo === 'string' && logo.length > 0 ?
+
+
:
null
}
+ {typeof name === 'string' && name.length > 0 ? name : id}
+ {' '}
{
- typeof transportUrl === 'string' && transportUrl.length > 0 ?
-
- URL:
- {transportUrl}
-
- :
- null
- }
- {
- Array.isArray(types) && types.length > 0 ?
-
- Supported types:
-
- {
- types.length === 1 ?
- types[0]
- :
- types.slice(0, -1).join(', ') + ' & ' + types[types.length - 1]
- }
-
-
- :
- null
- }
- {
- Array.isArray(catalogs) && catalogs.length > 0 ?
-
- Supported catalogs:
-
- {
- catalogs.length === 1 ?
- catalogs[0].name
- :
- catalogs.slice(0, -1).map(({ name }) => name).join(', ') + ' & ' + catalogs[catalogs.length - 1].name
- }
-
-
- :
- null
- }
- {
- !official ?
-
-
Using third-party add-ons will always be subject to your responsibility and the governing law of the jurisdiction you are located.
-
+ typeof version === 'string' && version.length > 0 ?
+
v.{version}
:
null
}
-
-
-
-
+ {
+ typeof description === 'string' && description.length > 0 ?
+
+ {description}
+
+ :
+ null
+ }
+ {
+ typeof transportUrl === 'string' && transportUrl.length > 0 ?
+
+ URL:
+ {transportUrl}
+
+ :
+ null
+ }
+ {
+ Array.isArray(types) && types.length > 0 ?
+
+ Supported types:
+
+ {
+ types.length === 1 ?
+ types[0]
+ :
+ types.slice(0, -1).join(', ') + ' & ' + types[types.length - 1]
+ }
+
+
+ :
+ null
+ }
+ {
+ Array.isArray(catalogs) && catalogs.length > 0 ?
+
+ Supported catalogs:
+
+ {
+ catalogs.length === 1 ?
+ catalogs[0].name
+ :
+ catalogs.slice(0, -1).map(({ name }) => name).join(', ') + ' & ' + catalogs[catalogs.length - 1].name
+ }
+
+
+ :
+ null
+ }
+ {
+ !official ?
+
+
Using third-party add-ons will always be subject to your responsibility and the governing law of the jurisdiction you are located.
+
+ :
+ null
+ }
);
};
@@ -127,11 +97,7 @@ AddonPrompt.propTypes = {
})),
version: PropTypes.string,
transportUrl: PropTypes.string,
- installed: PropTypes.bool,
- official: PropTypes.bool,
- cancel: PropTypes.func,
- onClick: PropTypes.func,
- toggle: PropTypes.func
+ official: PropTypes.bool
};
module.exports = AddonPrompt;
diff --git a/src/routes/Addons/AddonPrompt/styles.less b/src/routes/Addons/AddonPrompt/styles.less
index 11249348a..b58aafceb 100644
--- a/src/routes/Addons/AddonPrompt/styles.less
+++ b/src/routes/Addons/AddonPrompt/styles.less
@@ -1,153 +1,54 @@
.addon-prompt-container {
- position: relative;
- z-index: 0;
- display: flex;
- flex-direction: column;
- padding: 3rem 0;
- background-color: var(--color-surfacelighter);
+ .title-container {
+ font-size: 3rem;
+ font-weight: 300;
+ word-break: break-all;
- .close-button-container {
- position: absolute;
- top: 0.5rem;
- right: 0.5rem;
- z-index: 1;
- width: 2.5rem;
- height: 2.5rem;
- padding: 0.5rem;
-
- &:hover {
- background-color: var(--color-surfacelight);
+ &.title-with-logo-container {
+ &::first-line {
+ line-height: 5rem;
+ }
}
- .icon {
- display: block;
- width: 100%;
- height: 100%;
- fill: var(--color-backgrounddarker);
+ .logo-container {
+ width: 5rem;
+ height: 5rem;
+ margin-right: 0.5rem;
+ background-color: var(--color-surfacelight20);
+ float: left;
+
+ .logo {
+ display: block;
+ width: 100%;
+ height: 100%;
+ object-fit: contain;
+ object-position: center;
+ }
+ }
+
+ .version-container {
+ font-size: 1.5rem;
+ font-weight: 400;
}
}
- .addon-prompt-content {
- flex-grow: 0;
- flex-shrink: 1;
- flex-basis: auto;
- align-self: stretch;
- padding: 0 3rem;
- overflow-y: auto;
+ .section-container {
+ margin-top: 1rem;
- .title-container {
- font-size: 3rem;
+ .section-header {
+ font-size: 1.2rem;
+ }
+
+ .section-label {
+ font-size: 1.2rem;
font-weight: 300;
- word-break: break-all;
- &.title-with-logo-container {
- &::first-line {
- line-height: 5rem;
- }
+ &.transport-url-label {
+ user-select: text;
}
- .logo-container {
- width: 5rem;
- height: 5rem;
- margin-right: 0.5rem;
- background-color: var(--color-surfacelight20);
- float: left;
-
- .logo {
- display: block;
- width: 100%;
- height: 100%;
- object-fit: contain;
- object-position: center;
- }
- }
-
- .version-container {
- font-size: 1.5rem;
- font-weight: 400;
- }
- }
-
- .section-container {
- margin-top: 1rem;
-
- .section-header {
- font-size: 1.2rem;
- }
-
- .section-label {
- font-size: 1.2rem;
- font-weight: 300;
-
- &.transport-url-label {
- user-select: text;
- }
-
- &.disclaimer-label {
- font-style: italic;
- }
- }
- }
- }
-
- .buttons-container {
- flex: none;
- align-self: stretch;
- display: flex;
- flex-direction: row;
- margin-top: 2rem;
- padding: 0 3rem;
-
- .button-container {
- flex: 1;
- display: flex;
- flex-direction: row;
- align-items: center;
- justify-content: center;
- height: 4rem;
- padding: 0 1rem;
-
- &:first-child {
- margin-right: 2rem;
- }
-
- .label {
- flex-grow: 0;
- flex-shrink: 1;
- flex-basis: auto;
- max-height: 2.4em;
- font-size: 1.3rem;
- font-weight: 500;
- text-align: center;
- }
- }
-
- .cancel-button, .uninstall-button {
- outline-color: var(--color-surfacedark);
- outline-style: solid;
-
- &:hover, &:focus {
- background-color: var(--color-surfacelight);
- }
-
- .label {
- color: var(--color-backgrounddarker);
- }
- }
-
- .install-button {
- background-color: var(--color-signal5);
-
- &:hover, &:focus {
- filter: brightness(1.2);
- }
-
- &:focus {
- outline-color: var(--color-surfacedarker);
- }
-
- .label {
- color: var(--color-surfacelighter);
+ &.disclaimer-label {
+ font-style: italic;
}
}
}
diff --git a/src/routes/Addons/Addons.js b/src/routes/Addons/Addons.js
index ab5100085..e50f98116 100644
--- a/src/routes/Addons/Addons.js
+++ b/src/routes/Addons/Addons.js
@@ -1,8 +1,6 @@
const React = require('react');
-const classnames = require('classnames');
const Icon = require('stremio-icons/dom');
-const { Modal, useRouteFocused } = require('stremio-router');
-const { Button, Multiselect, NavBar, TextInput, SharePrompt } = require('stremio/common');
+const { Button, Multiselect, NavBar, TextInput, SharePrompt, ModalDialog } = require('stremio/common');
const Addon = require('./Addon');
const AddonPrompt = require('./AddonPrompt');
const useAddons = require('./useAddons');
@@ -11,7 +9,6 @@ const styles = require('./styles');
const Addons = ({ urlParams, queryParams }) => {
const inputRef = React.useRef(null);
- const focusRoute = useRouteFocused();
const [query, setQuery] = React.useState('');
const queryOnChange = React.useCallback((event) => {
setQuery(event.currentTarget.value);
@@ -29,32 +26,13 @@ const Addons = ({ urlParams, queryParams }) => {
setAddAddonModalOpened(false);
}
}, [setSelectedAddon]);
- React.useEffect(() => {
- const onKeyUp = (event) => {
- if (event.key === 'Escape' && typeof close === 'function') {
- setAddAddonModalOpened(false);
- }
- };
- if (focusRoute) {
- window.addEventListener('keyup', onKeyUp);
- }
- return () => {
- window.removeEventListener('keyup', onKeyUp);
- };
- }, [close, focusRoute]);
- const promptModalBackgroundOnClick = React.useCallback((event) => {
- if (!event.nativeEvent.clearSelectedAddonPrevented) {
- clearSelectedAddon();
- setAddAddonModalOpened(false);
- setSharedAddon(null);
- }
- }, [clearSelectedAddon]);
- const promptOnClick = React.useCallback((event) => {
- event.nativeEvent.clearSelectedAddonPrevented = true;
- }, []);
const setInstalledAddon = React.useCallback((currentAddon) => {
return installedAddons.some((installedAddon) => installedAddon.transportUrl === currentAddon.transportUrl);
}, [installedAddons]);
+ const toggleAddon = React.useCallback(() => {
+ setInstalledAddon(selectedAddon) ? uninstallSelectedAddon(selectedAddon) : installSelectedAddon(selectedAddon);
+ clearSelectedAddon();
+ });
return (
@@ -108,62 +86,77 @@ const Addons = ({ urlParams, queryParams }) => {
{
addAddonModalOpened ?
-
-
-
-
-
-
Add add-on
-
-
-
-
-
-
-
-
-
+
setAddAddonModalOpened(false)
+ }
+ },
+ {
+ label: 'Add',
+ props: {
+ title: 'Add',
+ onClick: onAddButtonClicked
+ }
+ }
+ ]}
+ onCloseRequest={() => setAddAddonModalOpened(false)}
+ >
+
+
:
null
}
{
selectedAddon !== null ?
-
-
-
setInstalledAddon(selectedAddon) ? uninstallSelectedAddon(selectedAddon) : installSelectedAddon(selectedAddon)}
- />
-
-
+
+
+
:
null
}
{
sharedAddon !== null ?
-
-
- setSharedAddon(null)}
- onClick={promptOnClick}
- />
-
-
+
setSharedAddon(null)}>
+ setSharedAddon(null)}
+ />
+
:
null
}
diff --git a/src/routes/Addons/styles.less b/src/routes/Addons/styles.less
index 5a87e221d..d97a130ea 100644
--- a/src/routes/Addons/styles.less
+++ b/src/routes/Addons/styles.less
@@ -123,145 +123,31 @@
}
}
-.prompt-modal-container {
- display: flex;
- align-items: center;
- justify-content: center;
- background-color: var(--color-background60);
+.add-addon-prompt-container {
+ width: 30rem;
- .prompt-container {
- flex: none;
- display: flex;
- flex-direction: column;
- justify-content: center;
- height: 80%;
-
- .prompt {
- flex-grow: 0;
- flex-shrink: 1;
- flex-basis: auto;
- align-self: stretch;
- }
+ .url-content {
+ flex: 1;
+ width: 100%;
+ padding: 0.5rem;
+ font-size: 0.9rem;
+ color: var(--color-surfacedark);
+ border: thin solid var(--color-surface);
}
- .add-addon-prompt-container {
- width: 30rem;
-
- .add-addon-prompt {
- 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);
- }
- }
-
- .add-addon-prompt-content {
- padding: 0 2.4rem;
-
- .add-addon-prompt-label {
- margin-bottom: 1.4rem;
- font-size: 1.3rem;
- color: var(--color-backgrounddarker);
- }
-
- .url-content {
- flex: 1;
- width: 100%;
- padding: 0.5rem;
- font-size: 0.9rem;
- color: var(--color-surfacedark);
- border: thin solid var(--color-surface);
- }
-
- .buttons-container {
- flex: none;
- align-self: stretch;
- display: flex;
- flex-direction: row;
- margin-top: 2rem;
-
- .button-container {
- flex: 1;
- display: flex;
- flex-direction: row;
- align-items: center;
- justify-content: center;
- height: 3rem;
- padding: 0 1rem;
-
- &:first-child {
- margin-right: 2rem;
- }
-
- .label {
- flex-grow: 0;
- flex-shrink: 1;
- flex-basis: auto;
- max-height: 2.4em;
- font-size: 1.2rem;
- text-align: center;
- }
- }
-
- .cancel-button {
- outline-color: var(--color-surfacedark);
- outline-style: solid;
-
- &:hover, &:focus {
- background-color: var(--color-surfacelight);
- }
-
- .label {
- color: var(--color-backgrounddarker);
- }
- }
-
- .add-button {
- background-color: var(--color-signal5);
-
- &:hover, &:focus {
- filter: brightness(1.2);
- }
-
- &:focus {
- outline-color: var(--color-surfacedarker);
- }
-
- .label {
- color: var(--color-surfacelighter);
- }
- }
- }
- }
- }
+ .cancel-button {
+ background-color: var(--color-surfacedark);
}
+}
- .addon-prompt-container {
- width: 50rem;
- }
+.addon-prompt-container {
+ width: 50rem;
- .share-prompt-container {
- width: 30rem;
+ .cancel-button {
+ background-color: var(--color-surfacedark);
}
+}
+
+.share-prompt-container {
+ width: 30rem;
}
\ No newline at end of file