This commit is contained in:
Lachezar Lechev 2025-12-22 13:55:48 +00:00 committed by GitHub
commit ced65ab216
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 44 additions and 31 deletions

View file

@ -23,12 +23,16 @@ const NavMenuContent = ({ onClick }) => {
const { createTorrentFromMagnet } = useTorrent();
const [fullscreen, requestFullscreen, exitFullscreen] = useFullscreen();
const [isIOSPWA, isAndroidPWA] = usePWA();
const streamingServerWarningDismissed = React.useMemo(() => {
return streamingServer.settings !== null && streamingServer.settings.type === 'Ready' || (
!isNaN(profile.settings.streamingServerWarningDismissed.getTime()) &&
profile.settings.streamingServerWarningDismissed.getTime() > Date.now()
);
}, [profile.settings, streamingServer.settings]);
const showStreamingServerWarning = React.useMemo(() => {
return streamingServer.state === null ||
streamingServer.state.type === 'Err' ||
(streamingServer.state.type === 'Ready' && streamingServer.state.content === 'notRunning') ?
(
isNaN(profile.settings.streamingServerWarningDismissed.getTime()) ||
profile.settings.streamingServerWarningDismissed.getTime() < Date.now()
)
: false;
}, [profile.settings, streamingServer.state]);
const logoutButtonOnClick = React.useCallback(() => {
core.transport.dispatch({
action: 'Ctx',
@ -41,12 +45,12 @@ const NavMenuContent = ({ onClick }) => {
try {
const clipboardText = await navigator.clipboard.readText();
createTorrentFromMagnet(clipboardText);
} catch(e) {
} catch (e) {
console.error(e);
}
}, []);
return (
<div className={classnames(styles['nav-menu-container'], 'animation-fade-in', { [styles['with-warning']]: !streamingServerWarningDismissed } )} onClick={onClick}>
<div className={classnames(styles['nav-menu-container'], 'animation-fade-in', { [styles['with-warning']]: showStreamingServerWarning })} onClick={onClick}>
<div className={styles['user-info-container']}>
<div
className={styles['avatar-container']}
@ -81,34 +85,34 @@ const NavMenuContent = ({ onClick }) => {
null
}
<div className={styles['nav-menu-section']}>
<Button className={styles['nav-menu-option-container']} title={ t('SETTINGS') } href={'#/settings'}>
<Button className={styles['nav-menu-option-container']} title={t('SETTINGS')} href={'#/settings'}>
<Icon className={styles['icon']} name={'settings'} />
<div className={styles['nav-menu-option-label']}>{ t('SETTINGS') }</div>
<div className={styles['nav-menu-option-label']}>{t('SETTINGS')}</div>
</Button>
<Button className={styles['nav-menu-option-container']} title={ t('ADDONS') } href={'#/addons'}>
<Button className={styles['nav-menu-option-container']} title={t('ADDONS')} href={'#/addons'}>
<Icon className={styles['icon']} name={'addons-outline'} />
<div className={styles['nav-menu-option-label']}>{ t('ADDONS') }</div>
<div className={styles['nav-menu-option-label']}>{t('ADDONS')}</div>
</Button>
<Button className={styles['nav-menu-option-container']} title={ t('PLAY_URL_MAGNET_LINK') } onClick={onPlayMagnetLinkClick}>
<Button className={styles['nav-menu-option-container']} title={t('PLAY_URL_MAGNET_LINK')} onClick={onPlayMagnetLinkClick}>
<Icon className={styles['icon']} name={'magnet-link'} />
<div className={styles['nav-menu-option-label']}>{ t('PLAY_URL_MAGNET_LINK') }</div>
<div className={styles['nav-menu-option-label']}>{t('PLAY_URL_MAGNET_LINK')}</div>
</Button>
<Button className={styles['nav-menu-option-container']} title={ t('HELP_FEEDBACK') } href={'https://stremio.zendesk.com/'} target={'_blank'}>
<Button className={styles['nav-menu-option-container']} title={t('HELP_FEEDBACK')} href={'https://stremio.zendesk.com/'} target={'_blank'}>
<Icon className={styles['icon']} name={'help'} />
<div className={styles['nav-menu-option-label']}>{ t('HELP_FEEDBACK') }</div>
<div className={styles['nav-menu-option-label']}>{t('HELP_FEEDBACK')}</div>
</Button>
</div>
<div className={styles['nav-menu-section']}>
<Button className={styles['nav-menu-option-container']} title={ t('TERMS_OF_SERVICE') } href={'https://www.stremio.com/tos'} target={'_blank'}>
<div className={styles['nav-menu-option-label']}>{ t('TERMS_OF_SERVICE') }</div>
<Button className={styles['nav-menu-option-container']} title={t('TERMS_OF_SERVICE')} href={'https://www.stremio.com/tos'} target={'_blank'}>
<div className={styles['nav-menu-option-label']}>{t('TERMS_OF_SERVICE')}</div>
</Button>
<Button className={styles['nav-menu-option-container']} title={ t('PRIVACY_POLICY') } href={'https://www.stremio.com/privacy'} target={'_blank'}>
<div className={styles['nav-menu-option-label']}>{ t('PRIVACY_POLICY') }</div>
<Button className={styles['nav-menu-option-container']} title={t('PRIVACY_POLICY')} href={'https://www.stremio.com/privacy'} target={'_blank'}>
<div className={styles['nav-menu-option-label']}>{t('PRIVACY_POLICY')}</div>
</Button>
{
profile.auth !== null ?
<Button className={styles['nav-menu-option-container']} title={ t('USER_PANEL') } href={'https://www.stremio.com/acc-settings'} target={'_blank'}>
<div className={styles['nav-menu-option-label']}>{ t('USER_PANEL') }</div>
<Button className={styles['nav-menu-option-container']} title={t('USER_PANEL')} href={'https://www.stremio.com/acc-settings'} target={'_blank'}>
<div className={styles['nav-menu-option-label']}>{t('USER_PANEL')}</div>
</Button>
:
null

View file

@ -23,10 +23,16 @@ const Board = () => {
const boardCatalogsOffset = continueWatchingPreview.items.length > 0 ? 1 : 0;
const scrollContainerRef = React.useRef();
const showStreamingServerWarning = React.useMemo(() => {
return streamingServer.settings !== null && streamingServer.settings.type === 'Err' && (
isNaN(profile.settings.streamingServerWarningDismissed.getTime()) ||
profile.settings.streamingServerWarningDismissed.getTime() < Date.now());
}, [profile.settings, streamingServer.settings]);
return streamingServer.state === null ||
streamingServer.state.type === 'Err' ||
(streamingServer.state.type === 'Ready' && streamingServer.state.content === 'notRunning') ?
(
isNaN(profile.settings.streamingServerWarningDismissed.getTime()) ||
profile.settings.streamingServerWarningDismissed.getTime() < Date.now()
)
: false;
}, [profile.settings, streamingServer.state]);
const onVisibleRangeChange = React.useCallback(() => {
const range = getVisibleChildrenRange(scrollContainerRef.current);
if (range === null) {

View file

@ -23,6 +23,8 @@ const Item = ({ url }: Props) => {
const selected = useMemo(() => profile.settings.streamingServerUrl === url, [url, profile.settings]);
const defaultUrl = useMemo(() => url === DEFAULT_STREAMING_SERVER_URL, [url]);
const serverReady = useMemo(() => streamingServer.state?.type === 'Ready' && streamingServer.state.content === 'running', [streamingServer]);
const serverError = useMemo(() => streamingServer.state?.type === 'Err' || (streamingServer.state?.type === 'Ready' && streamingServer.state.content === 'notRunning'), [streamingServer]);
const handleDelete = useCallback(() => {
deleteServerUrl(url);
@ -43,19 +45,19 @@ const Item = ({ url }: Props) => {
{
selected ?
<div className={styles['status']}>
<div className={classNames(styles['icon'], { [styles['ready']]: streamingServer.settings?.type === 'Ready' }, { [styles['error']]: streamingServer.settings?.type === 'Err' })} />
<div className={classNames(styles['icon'], { [styles['ready']]: serverReady }, { [styles['error']]: serverError })} />
<div className={styles['label']}>
{
streamingServer.settings === null ?
streamingServer.state === null ?
'NotLoaded'
:
streamingServer.settings.type === 'Ready' ?
serverReady ?
t('SETTINGS_SERVER_STATUS_ONLINE')
:
streamingServer.settings.type === 'Err' ?
serverError ?
t('SETTINGS_SERVER_STATUS_ERROR')
:
streamingServer.settings.type
streamingServer.state.type
}
</div>
</div>

View file

@ -127,4 +127,5 @@ type StreamingServer = {
playbackDevices: Loadable<PlaybackDevice[]> | null,
networkInfo: Loadable<NetworkInfo> | null,
deviceInfo: Loadable<DeviceInfo> | null,
state: Loadable<string> | null
};