mirror of
https://github.com/jaypyles/Scraperr.git
synced 2025-12-08 08:45:38 +00:00
chore: refactor wip
This commit is contained in:
@@ -1,17 +1,17 @@
|
|||||||
import React, { useState, Dispatch, useEffect } from "react";
|
import { Job } from "@/types";
|
||||||
import { Job } from "../../types";
|
|
||||||
import Box from "@mui/material/Box";
|
|
||||||
import InputLabel from "@mui/material/InputLabel";
|
|
||||||
import FormControl from "@mui/material/FormControl";
|
|
||||||
import Select from "@mui/material/Select";
|
|
||||||
import Popover from "@mui/material/Popover";
|
|
||||||
import {
|
import {
|
||||||
Typography,
|
|
||||||
MenuItem,
|
|
||||||
useTheme,
|
|
||||||
ClickAwayListener,
|
ClickAwayListener,
|
||||||
|
MenuItem,
|
||||||
|
SxProps,
|
||||||
|
Typography,
|
||||||
|
useTheme,
|
||||||
} from "@mui/material";
|
} from "@mui/material";
|
||||||
import { SxProps } from "@mui/material";
|
import Box from "@mui/material/Box";
|
||||||
|
import FormControl from "@mui/material/FormControl";
|
||||||
|
import InputLabel from "@mui/material/InputLabel";
|
||||||
|
import Popover from "@mui/material/Popover";
|
||||||
|
import Select from "@mui/material/Select";
|
||||||
|
import React, { Dispatch, useEffect, useState } from "react";
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
sxProps?: SxProps;
|
sxProps?: SxProps;
|
||||||
@@ -19,7 +19,6 @@ interface Props {
|
|||||||
| Dispatch<React.SetStateAction<Job | null>>
|
| Dispatch<React.SetStateAction<Job | null>>
|
||||||
| ((job: Job) => void);
|
| ((job: Job) => void);
|
||||||
selectedJob: Job | null;
|
selectedJob: Job | null;
|
||||||
setJobs: Dispatch<React.SetStateAction<Job[]>>;
|
|
||||||
jobs: Job[];
|
jobs: Job[];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -27,7 +26,6 @@ export const JobSelector = ({
|
|||||||
sxProps,
|
sxProps,
|
||||||
selectedJob,
|
selectedJob,
|
||||||
setSelectedJob,
|
setSelectedJob,
|
||||||
setJobs,
|
|
||||||
jobs,
|
jobs,
|
||||||
}: Props) => {
|
}: Props) => {
|
||||||
const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);
|
const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);
|
||||||
@@ -1,43 +1,32 @@
|
|||||||
import React, { SetStateAction, useState } from "react";
|
import { JobDownloadDialog } from "@/components/common/job-download-dialog";
|
||||||
import {
|
import { ApiService } from "@/services";
|
||||||
IconButton,
|
import { COLOR_MAP, Job } from "@/types";
|
||||||
Box,
|
|
||||||
Typography,
|
|
||||||
Tooltip,
|
|
||||||
TextField,
|
|
||||||
FormControl,
|
|
||||||
InputLabel,
|
|
||||||
Select,
|
|
||||||
MenuItem,
|
|
||||||
SelectChangeEvent,
|
|
||||||
} from "@mui/material";
|
|
||||||
import DeleteIcon from "@mui/icons-material/Delete";
|
import DeleteIcon from "@mui/icons-material/Delete";
|
||||||
import SelectAllIcon from "@mui/icons-material/SelectAll";
|
|
||||||
import DownloadIcon from "@mui/icons-material/Download";
|
import DownloadIcon from "@mui/icons-material/Download";
|
||||||
|
import SelectAllIcon from "@mui/icons-material/SelectAll";
|
||||||
import StarIcon from "@mui/icons-material/Star";
|
import StarIcon from "@mui/icons-material/Star";
|
||||||
import { useRouter } from "next/router";
|
import {
|
||||||
import { Favorites, JobQueue } from ".";
|
Box,
|
||||||
import { Job } from "../../types";
|
FormControl,
|
||||||
import Cookies from "js-cookie";
|
IconButton,
|
||||||
|
InputLabel,
|
||||||
|
MenuItem,
|
||||||
|
Select,
|
||||||
|
SelectChangeEvent,
|
||||||
|
TextField,
|
||||||
|
Tooltip,
|
||||||
|
Typography,
|
||||||
|
} from "@mui/material";
|
||||||
import { useSearchParams } from "next/navigation";
|
import { useSearchParams } from "next/navigation";
|
||||||
import { JobDownloadDialog } from "../common/job-download-dialog";
|
import { useRouter } from "next/router";
|
||||||
|
import React, { SetStateAction, useState } from "react";
|
||||||
|
import { Favorites, JobQueue } from ".";
|
||||||
|
|
||||||
interface JobTableProps {
|
interface JobTableProps {
|
||||||
jobs: Job[];
|
jobs: Job[];
|
||||||
setJobs: React.Dispatch<SetStateAction<Job[]>>;
|
setJobs: React.Dispatch<SetStateAction<Job[]>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ColorMap {
|
|
||||||
[key: string]: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
const COLOR_MAP: ColorMap = {
|
|
||||||
Queued: "rgba(255,201,5,0.25)",
|
|
||||||
Scraping: "rgba(3,104,255,0.25)",
|
|
||||||
Completed: "rgba(5,255,51,0.25)",
|
|
||||||
Failed: "rgba(214,0,25,0.25)",
|
|
||||||
};
|
|
||||||
|
|
||||||
export const JobTable: React.FC<JobTableProps> = ({ jobs, setJobs }) => {
|
export const JobTable: React.FC<JobTableProps> = ({ jobs, setJobs }) => {
|
||||||
const searchParams = useSearchParams();
|
const searchParams = useSearchParams();
|
||||||
const search = searchParams.get("search");
|
const search = searchParams.get("search");
|
||||||
@@ -51,7 +40,6 @@ export const JobTable: React.FC<JobTableProps> = ({ jobs, setJobs }) => {
|
|||||||
const [jobDownloadDialogOpen, setJobDownloadDialogOpen] =
|
const [jobDownloadDialogOpen, setJobDownloadDialogOpen] =
|
||||||
useState<boolean>(false);
|
useState<boolean>(false);
|
||||||
|
|
||||||
const token = Cookies.get("token");
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
const handleDownload = (ids: string[]) => {
|
const handleDownload = (ids: string[]) => {
|
||||||
@@ -78,6 +66,7 @@ export const JobTable: React.FC<JobTableProps> = ({ jobs, setJobs }) => {
|
|||||||
} else {
|
} else {
|
||||||
newSelected.add(id);
|
newSelected.add(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
return newSelected;
|
return newSelected;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -89,14 +78,13 @@ export const JobTable: React.FC<JobTableProps> = ({ jobs, setJobs }) => {
|
|||||||
const allJobIds = new Set(jobs.map((job) => job.id));
|
const allJobIds = new Set(jobs.map((job) => job.id));
|
||||||
setSelectedJobs(allJobIds);
|
setSelectedJobs(allJobIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
setAllSelected(!allSelected);
|
setAllSelected(!allSelected);
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleDeleteSelected = async () => {
|
const handleDeleteSelected = async () => {
|
||||||
const response = await fetch("/api/delete", {
|
const response = await ApiService.deleteJob({
|
||||||
method: "POST",
|
ids: Array.from(selectedJobs),
|
||||||
headers: { "Content-Type": "application/json" },
|
|
||||||
body: JSON.stringify({ data: { ids: Array.from(selectedJobs) } }),
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (response.ok) {
|
if (response.ok) {
|
||||||
@@ -115,6 +103,7 @@ export const JobTable: React.FC<JobTableProps> = ({ jobs, setJobs }) => {
|
|||||||
} else if (searchMode === "status") {
|
} else if (searchMode === "status") {
|
||||||
return job.status.toLowerCase().includes(searchQuery.toLowerCase());
|
return job.status.toLowerCase().includes(searchQuery.toLowerCase());
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -125,19 +114,10 @@ export const JobTable: React.FC<JobTableProps> = ({ jobs, setJobs }) => {
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
const postBody = {
|
await ApiService.updateJob({
|
||||||
ids: ids,
|
ids: ids,
|
||||||
field: field,
|
field: field,
|
||||||
value: value,
|
value: value,
|
||||||
};
|
|
||||||
|
|
||||||
await fetch("/api/update", {
|
|
||||||
method: "POST",
|
|
||||||
headers: {
|
|
||||||
"Content-Type": "application/json",
|
|
||||||
Authorization: `Bearer ${token}`,
|
|
||||||
},
|
|
||||||
body: JSON.stringify({ data: postBody }),
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
import React, { useEffect, useState } from "react";
|
import { JobSelector } from "@/components/common/job-selector";
|
||||||
|
import { useGetCurrentJobs } from "@/hooks/use-get-current-jobs";
|
||||||
|
import { checkAI, fetchJob, updateJob } from "@/lib";
|
||||||
|
import { Job, Message } from "@/types";
|
||||||
|
import EditNoteIcon from "@mui/icons-material/EditNote";
|
||||||
|
import SendIcon from "@mui/icons-material/Send";
|
||||||
import {
|
import {
|
||||||
Box,
|
Box,
|
||||||
TextField,
|
|
||||||
Typography,
|
|
||||||
Paper,
|
|
||||||
useTheme,
|
|
||||||
IconButton,
|
IconButton,
|
||||||
|
Paper,
|
||||||
|
TextField,
|
||||||
Tooltip,
|
Tooltip,
|
||||||
|
Typography,
|
||||||
|
useTheme,
|
||||||
} from "@mui/material";
|
} from "@mui/material";
|
||||||
import { Job, Message } from "@/types";
|
|
||||||
import { useSearchParams } from "next/navigation";
|
import { useSearchParams } from "next/navigation";
|
||||||
import { fetchJob, updateJob, checkAI } from "@/lib";
|
import React, { useEffect, useState } from "react";
|
||||||
import SendIcon from "@mui/icons-material/Send";
|
|
||||||
import EditNoteIcon from "@mui/icons-material/EditNote";
|
|
||||||
import { JobSelector } from "@/components/ai";
|
|
||||||
import { useGetCurrentJobs } from "@/hooks/use-get-current-jobs";
|
|
||||||
|
|
||||||
export const AI: React.FC = () => {
|
export const AI: React.FC = () => {
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
@@ -184,7 +184,6 @@ export const AI: React.FC = () => {
|
|||||||
<JobSelector
|
<JobSelector
|
||||||
selectedJob={selectedJob}
|
selectedJob={selectedJob}
|
||||||
setSelectedJob={setSelectedJob}
|
setSelectedJob={setSelectedJob}
|
||||||
setJobs={setJobs}
|
|
||||||
jobs={jobs}
|
jobs={jobs}
|
||||||
sxProps={{
|
sxProps={{
|
||||||
position: "absolute",
|
position: "absolute",
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
import { Job, CronJob } from "@/types/job";
|
import { CronJob, Job } from "@/types/job";
|
||||||
import { useState, useEffect } from "react";
|
|
||||||
import { CreateCronJobs } from "./create-cron-jobs";
|
|
||||||
import {
|
import {
|
||||||
|
Box,
|
||||||
|
Button,
|
||||||
Table,
|
Table,
|
||||||
|
TableBody,
|
||||||
|
TableCell,
|
||||||
TableHead,
|
TableHead,
|
||||||
TableRow,
|
TableRow,
|
||||||
TableCell,
|
|
||||||
TableBody,
|
|
||||||
Button,
|
|
||||||
Box,
|
|
||||||
useTheme,
|
useTheme,
|
||||||
} from "@mui/material";
|
} from "@mui/material";
|
||||||
import Cookies from "js-cookie";
|
import { useEffect, useState } from "react";
|
||||||
|
import { CreateCronJobs } from "./create-cron-jobs";
|
||||||
|
|
||||||
|
import { ApiService } from "@/services/api-service";
|
||||||
export type CronJobsProps = {
|
export type CronJobsProps = {
|
||||||
initialJobs: Job[];
|
initialJobs: Job[];
|
||||||
initialCronJobs: CronJob[];
|
initialCronJobs: CronJob[];
|
||||||
@@ -36,14 +36,9 @@ export const CronJobs = ({
|
|||||||
}, [initialJobs, initialCronJobs, initialUser]);
|
}, [initialJobs, initialCronJobs, initialUser]);
|
||||||
|
|
||||||
const handleDeleteCronJob = async (id: string) => {
|
const handleDeleteCronJob = async (id: string) => {
|
||||||
const token = Cookies.get("token");
|
const response = await ApiService.deleteCronJobs({
|
||||||
const response = await fetch("/api/delete-cron-job", {
|
id,
|
||||||
method: "POST",
|
user_email: user.email,
|
||||||
headers: {
|
|
||||||
"Content-Type": "application/json",
|
|
||||||
Authorization: `Bearer ${token}`,
|
|
||||||
},
|
|
||||||
body: JSON.stringify({ data: { id, user_email: user.email } }),
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (response.ok) {
|
if (response.ok) {
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
import { JobSelector } from "@/components/ai";
|
import { JobSelector } from "@/components/common/job-selector";
|
||||||
|
import { MediaViewer } from "@/components/common/media-viewer";
|
||||||
|
import { TileGridView } from "@/components/common/media-viewer/tile-grid-view";
|
||||||
|
import { useGetCurrentJobs } from "@/hooks/use-get-current-jobs";
|
||||||
import { Job } from "@/types";
|
import { Job } from "@/types";
|
||||||
import {
|
import {
|
||||||
Box,
|
|
||||||
useTheme,
|
|
||||||
Typography,
|
|
||||||
CircularProgress,
|
|
||||||
Alert,
|
Alert,
|
||||||
|
Box,
|
||||||
|
CircularProgress,
|
||||||
Paper,
|
Paper,
|
||||||
Tabs,
|
|
||||||
Tab,
|
Tab,
|
||||||
|
Tabs,
|
||||||
|
Typography,
|
||||||
|
useTheme,
|
||||||
} from "@mui/material";
|
} from "@mui/material";
|
||||||
import { useRouter, useSearchParams } from "next/navigation";
|
import { useRouter, useSearchParams } from "next/navigation";
|
||||||
import { useState, useEffect } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { TileGridView } from "@/components/common/media-viewer/tile-grid-view";
|
|
||||||
import { MediaViewer } from "@/components/common/media-viewer";
|
|
||||||
import { useGetCurrentJobs } from "@/hooks/use-get-current-jobs";
|
|
||||||
|
|
||||||
export interface MediaFiles {
|
export interface MediaFiles {
|
||||||
audio: string[];
|
audio: string[];
|
||||||
@@ -196,7 +196,6 @@ export const MediaId = () => {
|
|||||||
<JobSelector
|
<JobSelector
|
||||||
setSelectedJob={handleSelectJob}
|
setSelectedJob={handleSelectJob}
|
||||||
selectedJob={selectedJob}
|
selectedJob={selectedJob}
|
||||||
setJobs={setJobs}
|
|
||||||
jobs={jobs}
|
jobs={jobs}
|
||||||
/>
|
/>
|
||||||
</Box>
|
</Box>
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
import { JobSelector } from "@/components/ai";
|
import { JobSelector } from "@/components/common/job-selector";
|
||||||
import { useGetCurrentJobs } from "@/hooks/use-get-current-jobs";
|
import { useGetCurrentJobs } from "@/hooks/use-get-current-jobs";
|
||||||
import { useUserSettings } from "@/store/hooks";
|
import { useUserSettings } from "@/store/hooks";
|
||||||
import { Job } from "@/types";
|
import { Job } from "@/types";
|
||||||
import {
|
import {
|
||||||
Box,
|
|
||||||
useTheme,
|
|
||||||
Typography,
|
|
||||||
CircularProgress,
|
|
||||||
Alert,
|
Alert,
|
||||||
|
Box,
|
||||||
|
CircularProgress,
|
||||||
Paper,
|
Paper,
|
||||||
|
Typography,
|
||||||
|
useTheme,
|
||||||
} from "@mui/material";
|
} from "@mui/material";
|
||||||
import { useRouter, useSearchParams } from "next/navigation";
|
import { useRouter, useSearchParams } from "next/navigation";
|
||||||
import { useState, useEffect } from "react";
|
import { useEffect, useState } from "react";
|
||||||
|
|
||||||
export const RecordingId = () => {
|
export const RecordingId = () => {
|
||||||
const searchParams = useSearchParams();
|
const searchParams = useSearchParams();
|
||||||
@@ -106,7 +106,6 @@ export const RecordingId = () => {
|
|||||||
<JobSelector
|
<JobSelector
|
||||||
setSelectedJob={handleSelectJob}
|
setSelectedJob={handleSelectJob}
|
||||||
selectedJob={selectedJob}
|
selectedJob={selectedJob}
|
||||||
setJobs={setJobs}
|
|
||||||
jobs={jobs}
|
jobs={jobs}
|
||||||
sxProps={{}}
|
sxProps={{}}
|
||||||
/>
|
/>
|
||||||
|
|||||||
21
src/services/api-service/functions/delete-cron-jobs.ts
Normal file
21
src/services/api-service/functions/delete-cron-jobs.ts
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
import Cookies from "js-cookie";
|
||||||
|
|
||||||
|
export type DeleteCronJobsParams = {
|
||||||
|
id: string;
|
||||||
|
user_email: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const deleteCronJobs = async (params: DeleteCronJobsParams) => {
|
||||||
|
const token = Cookies.get("token");
|
||||||
|
|
||||||
|
const response = await fetch("/api/delete-cron-jobs", {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
Authorization: `Bearer ${token}`,
|
||||||
|
},
|
||||||
|
body: JSON.stringify({ data: params }),
|
||||||
|
});
|
||||||
|
|
||||||
|
return response;
|
||||||
|
};
|
||||||
24
src/services/api-service/functions/delete-job.ts
Normal file
24
src/services/api-service/functions/delete-job.ts
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
import Cookies from "js-cookie";
|
||||||
|
|
||||||
|
export type DeleteJobParams = {
|
||||||
|
ids: string[];
|
||||||
|
};
|
||||||
|
|
||||||
|
export const deleteJob = async (params: DeleteJobParams) => {
|
||||||
|
const token = Cookies.get("token");
|
||||||
|
|
||||||
|
const response = await fetch("/api/delete", {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
Authorization: `Bearer ${token}`,
|
||||||
|
},
|
||||||
|
body: JSON.stringify({ data: params }),
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error("Failed to delete job");
|
||||||
|
}
|
||||||
|
|
||||||
|
return response;
|
||||||
|
};
|
||||||
@@ -1,3 +1,6 @@
|
|||||||
export * from "./submit-job";
|
export * from "./delete-cron-jobs";
|
||||||
|
export * from "./delete-job";
|
||||||
export * from "./login";
|
export * from "./login";
|
||||||
export * from "./register";
|
export * from "./register";
|
||||||
|
export * from "./submit-job";
|
||||||
|
export * from "./update-job";
|
||||||
|
|||||||
26
src/services/api-service/functions/update-job.ts
Normal file
26
src/services/api-service/functions/update-job.ts
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
import Cookies from "js-cookie";
|
||||||
|
|
||||||
|
export type UpdateJobParams = {
|
||||||
|
ids: string[];
|
||||||
|
field: string;
|
||||||
|
value: any;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const updateJob = async (params: UpdateJobParams) => {
|
||||||
|
const token = Cookies.get("token");
|
||||||
|
|
||||||
|
const response = await fetch("/api/update", {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
Authorization: `Bearer ${token}`,
|
||||||
|
},
|
||||||
|
body: JSON.stringify({ data: params }),
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error("Failed to update job");
|
||||||
|
}
|
||||||
|
|
||||||
|
return response.json();
|
||||||
|
};
|
||||||
@@ -59,3 +59,10 @@ export const initialJobOptions: RawJobOptions = {
|
|||||||
collect_media: false,
|
collect_media: false,
|
||||||
custom_cookies: null,
|
custom_cookies: null,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const COLOR_MAP: Record<string, string> = {
|
||||||
|
Queued: "rgba(255,201,5,0.25)",
|
||||||
|
Scraping: "rgba(3,104,255,0.25)",
|
||||||
|
Completed: "rgba(5,255,51,0.25)",
|
||||||
|
Failed: "rgba(214,0,25,0.25)",
|
||||||
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user