mirror of
https://github.com/sussy-code/smov.git
synced 2024-12-30 16:17:41 +01:00
error states in sources and episodes empty state
This commit is contained in:
parent
6c019aa822
commit
5b145e1707
4 changed files with 63 additions and 9 deletions
|
@ -118,6 +118,11 @@ function EpisodesView({
|
||||||
else if (loadingState.value) {
|
else if (loadingState.value) {
|
||||||
content = (
|
content = (
|
||||||
<Menu.Section className="pb-6">
|
<Menu.Section className="pb-6">
|
||||||
|
{loadingState.value.season.episodes.length === 0 ? (
|
||||||
|
<Menu.TextDisplay title="No episodes found">
|
||||||
|
There are no episodes in this season, check back later!
|
||||||
|
</Menu.TextDisplay>
|
||||||
|
) : null}
|
||||||
{loadingState.value.season.episodes.map((ep) => {
|
{loadingState.value.season.episodes.map((ep) => {
|
||||||
return (
|
return (
|
||||||
<Menu.ChevronLink
|
<Menu.ChevronLink
|
||||||
|
|
|
@ -56,14 +56,14 @@ function SettingsOverlay({ id }: { id: string }) {
|
||||||
</Menu.Card>
|
</Menu.Card>
|
||||||
</OverlayPage>
|
</OverlayPage>
|
||||||
<OverlayPage id={id} path="/source" width={343} height={431}>
|
<OverlayPage id={id} path="/source" width={343} height={431}>
|
||||||
<Menu.Card>
|
<Menu.CardWithScrollable>
|
||||||
<SourceSelectionView id={id} onChoose={setChosenSourceId} />
|
<SourceSelectionView id={id} onChoose={setChosenSourceId} />
|
||||||
</Menu.Card>
|
</Menu.CardWithScrollable>
|
||||||
</OverlayPage>
|
</OverlayPage>
|
||||||
<OverlayPage id={id} path="/source/embeds" width={343} height={431}>
|
<OverlayPage id={id} path="/source/embeds" width={343} height={431}>
|
||||||
<Menu.Card>
|
<Menu.CardWithScrollable>
|
||||||
<EmbedSelectionView id={id} sourceId={chosenSourceId} />
|
<EmbedSelectionView id={id} sourceId={chosenSourceId} />
|
||||||
</Menu.Card>
|
</Menu.CardWithScrollable>
|
||||||
</OverlayPage>
|
</OverlayPage>
|
||||||
<OverlayPage id={id} path="/playback" width={343} height={215}>
|
<OverlayPage id={id} path="/playback" width={343} height={215}>
|
||||||
<Menu.Card>
|
<Menu.Card>
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import { ReactNode, useEffect, useMemo, useRef } from "react";
|
import { ReactNode, useEffect, useMemo, useRef } from "react";
|
||||||
import { useAsyncFn } from "react-use";
|
import { useAsyncFn } from "react-use";
|
||||||
|
|
||||||
|
import { Loading } from "@/components/layout/Loading";
|
||||||
import { Menu } from "@/components/player/internals/ContextMenu";
|
import { Menu } from "@/components/player/internals/ContextMenu";
|
||||||
import { SelectableLink } from "@/components/player/internals/ContextMenu/Links";
|
import { SelectableLink } from "@/components/player/internals/ContextMenu/Links";
|
||||||
import { convertRunoutputToSource } from "@/components/player/utils/convertRunoutputToSource";
|
import { convertRunoutputToSource } from "@/components/player/utils/convertRunoutputToSource";
|
||||||
|
@ -46,8 +47,19 @@ export function EmbedOption(props: {
|
||||||
}, [props.embedId, props.sourceId, meta, router]);
|
}, [props.embedId, props.sourceId, meta, router]);
|
||||||
|
|
||||||
let content: ReactNode = null;
|
let content: ReactNode = null;
|
||||||
if (request.loading) content = <span>loading...</span>;
|
if (request.loading)
|
||||||
else if (request.error) content = <span>Failed to scrape</span>;
|
content = (
|
||||||
|
<Menu.TextDisplay noIcon>
|
||||||
|
<Loading />
|
||||||
|
</Menu.TextDisplay>
|
||||||
|
);
|
||||||
|
else if (request.error)
|
||||||
|
content = (
|
||||||
|
<Menu.TextDisplay title="Failed to scrape">
|
||||||
|
We were unable to find any videos for this source. Don't come
|
||||||
|
bitchin' to us about it, just try another source.
|
||||||
|
</Menu.TextDisplay>
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SelectableLink onClick={run}>
|
<SelectableLink onClick={run}>
|
||||||
|
@ -107,10 +119,25 @@ export function EmbedSelectionView({ sourceId, id }: EmbedSelectionViewProps) {
|
||||||
}, [run, sourceId]);
|
}, [run, sourceId]);
|
||||||
|
|
||||||
let content: ReactNode = null;
|
let content: ReactNode = null;
|
||||||
if (request.loading) content = <p>loading...</p>;
|
if (request.loading)
|
||||||
else if (request.error) content = <p>Failed to scrape</p>;
|
content = (
|
||||||
|
<Menu.TextDisplay noIcon>
|
||||||
|
<Loading />
|
||||||
|
</Menu.TextDisplay>
|
||||||
|
);
|
||||||
|
else if (request.error)
|
||||||
|
content = (
|
||||||
|
<Menu.TextDisplay title="Failed to scrape">
|
||||||
|
We were unable to find any videos for this source. Don't come
|
||||||
|
bitchin' to us about it, just try another source.
|
||||||
|
</Menu.TextDisplay>
|
||||||
|
);
|
||||||
else if (request.value && request.value.length === 0)
|
else if (request.value && request.value.length === 0)
|
||||||
content = <p>No embeds found</p>;
|
content = (
|
||||||
|
<Menu.TextDisplay title="No embeds found">
|
||||||
|
We were unable to find any embeds for this source, please try another.
|
||||||
|
</Menu.TextDisplay>
|
||||||
|
);
|
||||||
else if (request.value)
|
else if (request.value)
|
||||||
content = request.value.map((v) => (
|
content = request.value.map((v) => (
|
||||||
<EmbedOption
|
<EmbedOption
|
||||||
|
|
|
@ -48,3 +48,25 @@ export function Anchor(props: {
|
||||||
export function FieldTitle(props: { children: React.ReactNode }) {
|
export function FieldTitle(props: { children: React.ReactNode }) {
|
||||||
return <p className="font-medium">{props.children}</p>;
|
return <p className="font-medium">{props.children}</p>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function TextDisplay(props: {
|
||||||
|
children: React.ReactNode;
|
||||||
|
title?: string;
|
||||||
|
noIcon?: boolean;
|
||||||
|
}) {
|
||||||
|
return (
|
||||||
|
<div className="w-full h-full flex justify-center items-center text-center">
|
||||||
|
<div className="flex items-center gap-4 flex-col">
|
||||||
|
{props.noIcon ? null : (
|
||||||
|
<div className="w-16 h-10 border border-video-context-border rounded-lg flex justify-center items-center">
|
||||||
|
<Icon className="text-xl" icon={Icons.EYE_SLASH} />
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{props.title ? (
|
||||||
|
<h2 className="text-white text-lg font-bold">{props.title}</h2>
|
||||||
|
) : null}
|
||||||
|
<div>{props.children}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue