feat: PrivateHD watcher ve item tabanli scraper entegrasyonunu ekle
This commit is contained in:
@@ -104,7 +104,9 @@ export const WatcherPage = () => {
|
||||
const pushAlert = useUiStore((s) => s.pushAlert);
|
||||
|
||||
const [selectedWatcherId, setSelectedWatcherId] = useState<string | null>(null);
|
||||
const [isCreatingNew, setIsCreatingNew] = useState(false);
|
||||
const [tracker, setTracker] = useState("happyfappy");
|
||||
const [wishlistUrl, setWishlistUrl] = useState("");
|
||||
const [cookie, setCookie] = useState("");
|
||||
const [category, setCategory] = useState("__none__");
|
||||
const [showCookie, setShowCookie] = useState(false);
|
||||
@@ -152,7 +154,7 @@ export const WatcherPage = () => {
|
||||
}
|
||||
if (watchersLoaded) {
|
||||
setWatchers(watchersLoaded);
|
||||
if (!selectedWatcherId && watchersLoaded[0]?.id) {
|
||||
if (!selectedWatcherId && !isCreatingNew && watchersLoaded[0]?.id) {
|
||||
setSelectedWatcherId(watchersLoaded[0].id);
|
||||
}
|
||||
}
|
||||
@@ -168,13 +170,15 @@ export const WatcherPage = () => {
|
||||
load();
|
||||
const interval = setInterval(load, 15000);
|
||||
return () => clearInterval(interval);
|
||||
}, []);
|
||||
}, [selectedWatcherId, isCreatingNew]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!selectedWatcher) {
|
||||
return;
|
||||
}
|
||||
setIsCreatingNew(false);
|
||||
setTracker(selectedWatcher.tracker);
|
||||
setWishlistUrl(selectedWatcher.wishlistUrl ?? "");
|
||||
setCategory(selectedWatcher.category ?? "__none__");
|
||||
setCookie("");
|
||||
setShowCookie(false);
|
||||
@@ -194,8 +198,10 @@ export const WatcherPage = () => {
|
||||
}, [intervalUnit, intervalValue]);
|
||||
|
||||
const resetForm = () => {
|
||||
setIsCreatingNew(true);
|
||||
setSelectedWatcherId(null);
|
||||
setTracker(watcherTrackers[0]?.key ?? "happyfappy");
|
||||
setWishlistUrl("");
|
||||
setCategory("__none__");
|
||||
setCookie("");
|
||||
setShowCookie(false);
|
||||
@@ -204,6 +210,8 @@ export const WatcherPage = () => {
|
||||
setEnabled(true);
|
||||
};
|
||||
|
||||
const requiresWishlistUrl = tracker === "privatehd";
|
||||
|
||||
const submit = async () => {
|
||||
if (!cookie.trim() && !selectedWatcher) {
|
||||
pushAlert({
|
||||
@@ -213,12 +221,21 @@ export const WatcherPage = () => {
|
||||
});
|
||||
return;
|
||||
}
|
||||
if (requiresWishlistUrl && !wishlistUrl.trim()) {
|
||||
pushAlert({
|
||||
title: "Wishlist URL gerekli",
|
||||
description: "PrivateHD watcher icin wishlist URL girin.",
|
||||
variant: "warn",
|
||||
});
|
||||
return;
|
||||
}
|
||||
setSaving(true);
|
||||
try {
|
||||
if (selectedWatcher) {
|
||||
await api.patch(`/api/watchers/${selectedWatcher.id}`, {
|
||||
tracker,
|
||||
category: category === "__none__" ? "" : category,
|
||||
wishlistUrl,
|
||||
intervalMinutes,
|
||||
enabled,
|
||||
...(cookie.trim() ? { cookie } : {}),
|
||||
@@ -232,11 +249,13 @@ export const WatcherPage = () => {
|
||||
const response = await api.post("/api/watchers", {
|
||||
tracker,
|
||||
category: category === "__none__" ? "" : category,
|
||||
wishlistUrl,
|
||||
cookie,
|
||||
intervalMinutes,
|
||||
enabled,
|
||||
});
|
||||
setWatchers([response.data, ...watchers]);
|
||||
setIsCreatingNew(false);
|
||||
setSelectedWatcherId(response.data.id);
|
||||
pushAlert({
|
||||
title: "Watcher eklendi",
|
||||
@@ -499,7 +518,16 @@ export const WatcherPage = () => {
|
||||
<span className="text-xs font-semibold uppercase tracking-[0.18em] text-slate-500">
|
||||
Tracker
|
||||
</span>
|
||||
<Select value={tracker} onValueChange={setTracker} disabled={Boolean(selectedWatcher)}>
|
||||
<Select
|
||||
value={tracker}
|
||||
onValueChange={(value) => {
|
||||
setTracker(value);
|
||||
if (!selectedWatcher) {
|
||||
setIsCreatingNew(true);
|
||||
}
|
||||
}}
|
||||
disabled={Boolean(selectedWatcher)}
|
||||
>
|
||||
<SelectTrigger className="w-full rounded-xl">
|
||||
<SelectValue placeholder="Tracker sec" />
|
||||
</SelectTrigger>
|
||||
@@ -513,6 +541,28 @@ export const WatcherPage = () => {
|
||||
</Select>
|
||||
</label>
|
||||
|
||||
<label className="block space-y-2">
|
||||
<span className="text-xs font-semibold uppercase tracking-[0.18em] text-slate-500">
|
||||
Wishlist URL
|
||||
</span>
|
||||
<Input
|
||||
type="text"
|
||||
value={wishlistUrl}
|
||||
onChange={(event) => setWishlistUrl(event.target.value)}
|
||||
placeholder={
|
||||
requiresWishlistUrl
|
||||
? "https://privatehd.to/profile/kullanici/wishlist"
|
||||
: "Bu tracker icin bos birakilabilir"
|
||||
}
|
||||
className="rounded-xl"
|
||||
/>
|
||||
<div className="text-xs text-slate-500">
|
||||
{requiresWishlistUrl
|
||||
? "PrivateHD icin bookmark kaynaginin tam URL'si zorunlu."
|
||||
: "HappyFappy gibi tracker'larda bu alan opsiyoneldir."}
|
||||
</div>
|
||||
</label>
|
||||
|
||||
<label className="block space-y-2">
|
||||
<div className="flex items-center justify-between">
|
||||
<span className="text-xs font-semibold uppercase tracking-[0.18em] text-slate-500">
|
||||
|
||||
@@ -91,6 +91,7 @@ export interface Watcher {
|
||||
id: string;
|
||||
tracker: string;
|
||||
trackerLabel: string;
|
||||
wishlistUrl?: string;
|
||||
category?: string;
|
||||
cookieHint: string;
|
||||
hasCookie: boolean;
|
||||
@@ -115,6 +116,8 @@ export interface WatcherItem {
|
||||
pageUrl: string;
|
||||
title: string;
|
||||
imageUrl?: string;
|
||||
downloadUrl?: string;
|
||||
removeToken?: string;
|
||||
status: string;
|
||||
statusLabel: string;
|
||||
qbitHash?: string;
|
||||
|
||||
Reference in New Issue
Block a user