|
|
|
@ -75,6 +75,7 @@ function CustomCaptionOption() {
@@ -75,6 +75,7 @@ function CustomCaptionOption() {
|
|
|
|
|
setCaption({ |
|
|
|
|
language: "custom", |
|
|
|
|
srtData: converted, |
|
|
|
|
id: "custom-caption", |
|
|
|
|
}); |
|
|
|
|
setCustomSubs(); |
|
|
|
|
}); |
|
|
|
@ -115,39 +116,38 @@ function useSubtitleList(subs: CaptionListItem[], searchQuery: string) {
@@ -115,39 +116,38 @@ function useSubtitleList(subs: CaptionListItem[], searchQuery: string) {
|
|
|
|
|
export function CaptionsView({ id }: { id: string }) { |
|
|
|
|
const { t } = useTranslation(); |
|
|
|
|
const router = useOverlayRouter(id); |
|
|
|
|
const lang = usePlayerStore((s) => s.caption.selected?.language); |
|
|
|
|
const selectedCaptionId = usePlayerStore((s) => s.caption.selected?.id); |
|
|
|
|
const [currentlyDownloading, setCurrentlyDownloading] = useState< |
|
|
|
|
string | null |
|
|
|
|
>(null); |
|
|
|
|
const { selectLanguage, disable } = useCaptions(); |
|
|
|
|
const { selectCaptionById, disable } = useCaptions(); |
|
|
|
|
const captionList = usePlayerStore((s) => s.captionList); |
|
|
|
|
|
|
|
|
|
const [searchQuery, setSearchQuery] = useState(""); |
|
|
|
|
const subtitleList = useSubtitleList(captionList, searchQuery); |
|
|
|
|
|
|
|
|
|
const [downloadReq, startDownload] = useAsyncFn( |
|
|
|
|
async (language: string) => { |
|
|
|
|
setCurrentlyDownloading(language); |
|
|
|
|
return selectLanguage(language); |
|
|
|
|
async (captionId: string) => { |
|
|
|
|
setCurrentlyDownloading(captionId); |
|
|
|
|
return selectCaptionById(captionId); |
|
|
|
|
}, |
|
|
|
|
[selectLanguage, setCurrentlyDownloading], |
|
|
|
|
[selectCaptionById, setCurrentlyDownloading], |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
const content = subtitleList.map((v, i) => { |
|
|
|
|
return ( |
|
|
|
|
<CaptionOption |
|
|
|
|
// key must use index to prevent url collisions
|
|
|
|
|
// eslint-disable-next-line react/no-array-index-key
|
|
|
|
|
key={`${i}-${v.url}`} |
|
|
|
|
key={v.id} |
|
|
|
|
countryCode={v.language} |
|
|
|
|
selected={lang === v.language} |
|
|
|
|
loading={v.language === currentlyDownloading && downloadReq.loading} |
|
|
|
|
selected={v.id === selectedCaptionId} |
|
|
|
|
loading={v.id === currentlyDownloading && downloadReq.loading} |
|
|
|
|
error={ |
|
|
|
|
v.language === currentlyDownloading && downloadReq.error |
|
|
|
|
v.id === currentlyDownloading && downloadReq.error |
|
|
|
|
? downloadReq.error.toString() |
|
|
|
|
: undefined |
|
|
|
|
} |
|
|
|
|
onClick={() => startDownload(v.language)} |
|
|
|
|
onClick={() => startDownload(v.id)} |
|
|
|
|
> |
|
|
|
|
{v.languageName} |
|
|
|
|
</CaptionOption> |
|
|
|
@ -176,7 +176,7 @@ export function CaptionsView({ id }: { id: string }) {
@@ -176,7 +176,7 @@ export function CaptionsView({ id }: { id: string }) {
|
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<Menu.ScrollToActiveSection className="!pt-1 mt-2 pb-3"> |
|
|
|
|
<CaptionOption onClick={() => disable()} selected={!lang}> |
|
|
|
|
<CaptionOption onClick={() => disable()} selected={!selectedCaptionId}> |
|
|
|
|
{t("player.menus.subtitles.offChoice")} |
|
|
|
|
</CaptionOption> |
|
|
|
|
<CustomCaptionOption /> |
|
|
|
|