-
Notifications
You must be signed in to change notification settings - Fork 243
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #289 from Stremio/core-async-api
Core async api
- Loading branch information
Showing
46 changed files
with
842 additions
and
620 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -15,7 +15,7 @@ | |
"@babel/runtime": "7.16.0", | ||
"@sentry/browser": "6.13.3", | ||
"@stremio/stremio-colors": "4.0.1", | ||
"@stremio/stremio-core-web": "0.43.0", | ||
"@stremio/stremio-core-web": "0.44.0", | ||
"@stremio/stremio-icons": "3.0.5", | ||
"@stremio/stremio-video": "0.0.20-rc.4", | ||
"a-color-picker": "1.2.1", | ||
|
@@ -25,13 +25,16 @@ | |
"eventemitter3": "4.0.7", | ||
"filter-invalid-dom-props": "2.1.0", | ||
"lodash.debounce": "4.0.8", | ||
"lodash.intersection": "4.4.0", | ||
"lodash.isequal": "4.5.0", | ||
"lodash.throttle": "4.1.1", | ||
"prop-types": "15.7.2", | ||
"react": "16.12.0", | ||
"react-dom": "16.12.0", | ||
"react-focus-lock": "2.2.1", | ||
"spatial-navigation-polyfill": "git+https://[email protected]/Stremio/spatial-navigation.git#64871b1422466f5f45d24ebc8bbd315b2ebab6a6" | ||
"react": "18.2.0", | ||
"react-dom": "18.2.0", | ||
"react-is": "18.2.0", | ||
"react-focus-lock": "2.9.1", | ||
"spatial-navigation-polyfill": "git+https://[email protected]/Stremio/spatial-navigation.git#64871b1422466f5f45d24ebc8bbd315b2ebab6a6", | ||
"url": "0.11.0" | ||
}, | ||
"devDependencies": { | ||
"@babel/core": "7.16.0", | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
// Copyright (C) 2017-2022 Smart code 203358507 | ||
|
||
const React = require('react'); | ||
const { useServices } = require('stremio/services'); | ||
|
||
const CoreSuspenderContext = React.createContext(null); | ||
|
||
CoreSuspenderContext.displayName = 'CoreSuspenderContext'; | ||
|
||
function wrapPromise(promise) { | ||
let status = 'pending'; | ||
let result; | ||
const suspender = promise.then( | ||
(resp) => { | ||
status = 'success'; | ||
result = resp; | ||
}, | ||
(error) => { | ||
status = 'error'; | ||
result = error; | ||
} | ||
); | ||
return { | ||
read() { | ||
if (status === 'pending') { | ||
throw suspender; | ||
} else if (status === 'error') { | ||
throw result; | ||
} else if (status === 'success') { | ||
return result; | ||
} | ||
} | ||
}; | ||
} | ||
|
||
const useCoreSuspender = () => { | ||
return React.useContext(CoreSuspenderContext); | ||
}; | ||
|
||
const withCoreSuspender = (Component, Fallback = () => { }) => { | ||
return function withCoreSuspender(props) { | ||
const { core } = useServices(); | ||
const parentSuspender = useCoreSuspender(); | ||
const [render, setRender] = React.useState(parentSuspender === null); | ||
const statesRef = React.useRef({}); | ||
const streamsRef = React.useRef({}); | ||
const getState = React.useCallback((model) => { | ||
if (!statesRef.current[model]) { | ||
statesRef.current[model] = wrapPromise(core.transport.getState(model)); | ||
} | ||
|
||
return statesRef.current[model].read(); | ||
}, []); | ||
const decodeStream = React.useCallback((stream) => { | ||
if (!streamsRef.current[stream]) { | ||
streamsRef.current[stream] = wrapPromise(core.transport.decodeStream(stream)); | ||
} | ||
|
||
return streamsRef.current[stream].read(); | ||
}, []); | ||
const suspender = React.useMemo(() => ({ getState, decodeStream }), []); | ||
React.useLayoutEffect(() => { | ||
if (!render) { | ||
setRender(true); | ||
} | ||
}, []); | ||
return render ? | ||
<React.Suspense fallback={<Fallback {...props} />}> | ||
<CoreSuspenderContext.Provider value={suspender}> | ||
<Component {...props} /> | ||
</CoreSuspenderContext.Provider> | ||
</React.Suspense> | ||
: | ||
null; | ||
}; | ||
}; | ||
|
||
module.exports = { withCoreSuspender, useCoreSuspender }; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
// Copyright (C) 2017-2022 Smart code 203358507 | ||
|
||
const React = require('react'); | ||
const PropTypes = require('prop-types'); | ||
|
||
const DelayedRenderer = ({ children, delay }) => { | ||
const [render, setRender] = React.useState(false); | ||
React.useEffect(() => { | ||
const timeout = setTimeout(() => { | ||
setRender(true); | ||
}, delay); | ||
return () => { | ||
clearTimeout(timeout); | ||
}; | ||
}, []); | ||
return render ? children : null; | ||
}; | ||
|
||
DelayedRenderer.propTypes = { | ||
children: PropTypes.node | ||
}; | ||
|
||
module.exports = DelayedRenderer; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
// Copyright (C) 2017-2022 Smart code 203358507 | ||
|
||
const DelayedRenderer = require('./DelayedRenderer'); | ||
|
||
module.exports = DelayedRenderer; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.