mirror of
https://github.com/p-stream/p-stream.git
synced 2026-04-20 06:12:08 +00:00
69 lines
1.7 KiB
TypeScript
69 lines
1.7 KiB
TypeScript
import { MWPortableMedia } from "providers";
|
|
import React, { createContext, ReactNode, useContext, useState } from "react";
|
|
import { VideoProgressStore } from "./store";
|
|
|
|
interface WatchedStoreItem extends MWPortableMedia {
|
|
progress: number;
|
|
percentage: number;
|
|
}
|
|
|
|
interface WatchedStoreData {
|
|
items: WatchedStoreItem[];
|
|
}
|
|
|
|
interface WatchedStoreDataWrapper {
|
|
setWatched: React.Dispatch<React.SetStateAction<WatchedStoreData>>;
|
|
watched: WatchedStoreData;
|
|
}
|
|
|
|
const WatchedContext = createContext<WatchedStoreDataWrapper>({
|
|
setWatched: () => {},
|
|
watched: {
|
|
items: [],
|
|
},
|
|
});
|
|
WatchedContext.displayName = "WatchedContext";
|
|
|
|
export function WatchedContextProvider(props: { children: ReactNode }) {
|
|
const watchedLocalstorage = VideoProgressStore.get();
|
|
const [watched, setWatched] = useState<WatchedStoreData>(
|
|
watchedLocalstorage as WatchedStoreData
|
|
);
|
|
const contextValue = {
|
|
setWatched(data: any) {
|
|
setWatched((old) => {
|
|
let newData = data;
|
|
if (data.constructor === Function) {
|
|
newData = data(old);
|
|
}
|
|
watchedLocalstorage.save(newData);
|
|
return newData;
|
|
});
|
|
},
|
|
watched,
|
|
};
|
|
|
|
return (
|
|
<WatchedContext.Provider value={contextValue}>
|
|
{props.children}
|
|
</WatchedContext.Provider>
|
|
);
|
|
}
|
|
|
|
export function useWatchedContext() {
|
|
return useContext(WatchedContext);
|
|
}
|
|
|
|
export function getWatchedFromPortable(
|
|
store: WatchedStoreData,
|
|
media: MWPortableMedia
|
|
): WatchedStoreItem | undefined {
|
|
return store.items.find((v) => {
|
|
return (
|
|
v.mediaId === media.mediaId &&
|
|
v.providerId === media.providerId &&
|
|
v.episode === media.episode &&
|
|
v.season === media.season
|
|
);
|
|
});
|
|
}
|