mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
Cleanup
This commit is contained in:
parent
934a05cffa
commit
145c0700b1
7 changed files with 48 additions and 46 deletions
|
@ -13,11 +13,6 @@ const fetchTask = async (
|
||||||
params: ScheduledTasksApiGetTaskRequest,
|
params: ScheduledTasksApiGetTaskRequest,
|
||||||
options?: AxiosRequestConfig
|
options?: AxiosRequestConfig
|
||||||
) => {
|
) => {
|
||||||
if (!api) {
|
|
||||||
console.warn('[fetchTasks] No API instance available');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const response = await getScheduledTasksApi(api).getTask(params, options);
|
const response = await getScheduledTasksApi(api).getTask(params, options);
|
||||||
|
|
||||||
return response.data;
|
return response.data;
|
||||||
|
|
|
@ -22,7 +22,7 @@ export const useTasks = (params?: ScheduledTasksApiGetTasksRequest) => {
|
||||||
const { api } = useApi();
|
const { api } = useApi();
|
||||||
|
|
||||||
return useQuery({
|
return useQuery({
|
||||||
queryKey: [QUERY_KEY],
|
queryKey: [ QUERY_KEY ],
|
||||||
queryFn: ({ signal }) =>
|
queryFn: ({ signal }) =>
|
||||||
fetchTasks(api!, params, { signal }),
|
fetchTasks(api!, params, { signal }),
|
||||||
enabled: !!api
|
enabled: !!api
|
||||||
|
|
|
@ -3,7 +3,7 @@ import { getScheduledTasksApi } from '@jellyfin/sdk/lib/utils/api/scheduled-task
|
||||||
import { useMutation } from '@tanstack/react-query';
|
import { useMutation } from '@tanstack/react-query';
|
||||||
import { useApi } from 'hooks/useApi';
|
import { useApi } from 'hooks/useApi';
|
||||||
import { queryClient } from 'utils/query/queryClient';
|
import { queryClient } from 'utils/query/queryClient';
|
||||||
import { QUERY_KEY } from './useTasks';
|
import { QUERY_KEY } from './useTask';
|
||||||
|
|
||||||
export const useUpdateTask = () => {
|
export const useUpdateTask = () => {
|
||||||
const { api } = useApi();
|
const { api } = useApi();
|
||||||
|
|
|
@ -18,21 +18,50 @@ type IProps = {
|
||||||
open: boolean,
|
open: boolean,
|
||||||
title: string,
|
title: string,
|
||||||
onClose?: () => void,
|
onClose?: () => void,
|
||||||
onSubmit?: (trigger: TaskTriggerInfo) => void
|
onAdd?: (trigger: TaskTriggerInfo) => void
|
||||||
};
|
};
|
||||||
|
|
||||||
const NewTriggerForm: FunctionComponent<IProps> = ({ open, title, onClose, onSubmit }: IProps) => {
|
const NewTriggerForm: FunctionComponent<IProps> = ({ open, title, onClose, onAdd }: IProps) => {
|
||||||
const { dateFnsLocale } = useLocale();
|
const { dateFnsLocale } = useLocale();
|
||||||
const [triggerType, setTriggerType] = useState('DailyTrigger');
|
const [triggerType, setTriggerType] = useState('DailyTrigger');
|
||||||
|
|
||||||
const timeOfDayOptions = useMemo(() => getTimeOfDayOptions(dateFnsLocale), [dateFnsLocale]);
|
const timeOfDayOptions = useMemo(() => getTimeOfDayOptions(dateFnsLocale), [dateFnsLocale]);
|
||||||
|
|
||||||
const intervalOptions = useMemo(() => getIntervalOptions(dateFnsLocale), [dateFnsLocale]);
|
const intervalOptions = useMemo(() => getIntervalOptions(dateFnsLocale), [dateFnsLocale]);
|
||||||
|
|
||||||
const onTriggerTypeChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
|
const onTriggerTypeChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
setTriggerType(e.target.value);
|
setTriggerType(e.target.value);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
const onSubmit = useCallback((e: React.FormEvent<HTMLFormElement>) => {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
const formData = new FormData(e.currentTarget);
|
||||||
|
const data = Object.fromEntries(formData.entries());
|
||||||
|
const trigger: TaskTriggerInfo = {
|
||||||
|
Type: data.TriggerType.toString() as TaskTriggerInfoType
|
||||||
|
};
|
||||||
|
|
||||||
|
if (trigger.Type == TaskTriggerInfoType.WeeklyTrigger) {
|
||||||
|
trigger.DayOfWeek = data.DayOfWeek.toString() as DayOfWeek;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (trigger.Type == TaskTriggerInfoType.DailyTrigger || trigger.Type == TaskTriggerInfoType.WeeklyTrigger) {
|
||||||
|
trigger.TimeOfDayTicks = parseInt(data.TimeOfDay.toString(), 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (trigger.Type == TaskTriggerInfoType.IntervalTrigger) {
|
||||||
|
trigger.IntervalTicks = parseInt(data.Interval.toString(), 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.TimeLimit.toString()) {
|
||||||
|
trigger.MaxRuntimeTicks = parseFloat(data.TimeLimit.toString()) * 3600000 * 1e4;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (onAdd) {
|
||||||
|
onAdd(trigger);
|
||||||
|
}
|
||||||
|
}, [onAdd]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Dialog
|
<Dialog
|
||||||
open={open}
|
open={open}
|
||||||
|
@ -40,35 +69,7 @@ const NewTriggerForm: FunctionComponent<IProps> = ({ open, title, onClose, onSub
|
||||||
fullWidth
|
fullWidth
|
||||||
PaperProps={{
|
PaperProps={{
|
||||||
component: 'form',
|
component: 'form',
|
||||||
onSubmit: (e: React.FormEvent<HTMLFormElement>) => {
|
onSubmit: onSubmit
|
||||||
e.preventDefault();
|
|
||||||
|
|
||||||
const formData = new FormData(e.currentTarget);
|
|
||||||
const data = Object.fromEntries(formData.entries());
|
|
||||||
const trigger: TaskTriggerInfo = {
|
|
||||||
Type: data.TriggerType.toString() as TaskTriggerInfoType
|
|
||||||
};
|
|
||||||
|
|
||||||
if (trigger.Type == TaskTriggerInfoType.WeeklyTrigger) {
|
|
||||||
trigger.DayOfWeek = data.DayOfWeek.toString() as DayOfWeek;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (trigger.Type == TaskTriggerInfoType.DailyTrigger || trigger.Type == TaskTriggerInfoType.WeeklyTrigger) {
|
|
||||||
trigger.TimeOfDayTicks = parseInt(data.TimeOfDay.toString(), 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (trigger.Type == TaskTriggerInfoType.IntervalTrigger) {
|
|
||||||
trigger.IntervalTicks = parseInt(data.Interval.toString(), 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data.TimeLimit.toString()) {
|
|
||||||
trigger.MaxRuntimeTicks = parseFloat(data.TimeLimit.toString()) * 3600000 * 1e4;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (onSubmit) {
|
|
||||||
onSubmit(trigger);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<DialogTitle>{title}</DialogTitle>
|
<DialogTitle>{title}</DialogTitle>
|
||||||
|
@ -116,7 +117,10 @@ const NewTriggerForm: FunctionComponent<IProps> = ({ open, title, onClose, onSub
|
||||||
label={globalize.translate('LabelTime')}
|
label={globalize.translate('LabelTime')}
|
||||||
>
|
>
|
||||||
{timeOfDayOptions.map((option) => {
|
{timeOfDayOptions.map((option) => {
|
||||||
return <MenuItem key={option.value} value={option.value}>{option.name}</MenuItem>;
|
return <MenuItem
|
||||||
|
key={option.value}
|
||||||
|
value={option.value}
|
||||||
|
>{option.name}</MenuItem>;
|
||||||
})}
|
})}
|
||||||
</TextField>
|
</TextField>
|
||||||
)}
|
)}
|
||||||
|
@ -130,7 +134,10 @@ const NewTriggerForm: FunctionComponent<IProps> = ({ open, title, onClose, onSub
|
||||||
label={globalize.translate('LabelEveryXMinutes')}
|
label={globalize.translate('LabelEveryXMinutes')}
|
||||||
>
|
>
|
||||||
{intervalOptions.map((option) => {
|
{intervalOptions.map((option) => {
|
||||||
return <MenuItem key={option.value} value={option.value}>{option.name}</MenuItem>;
|
return <MenuItem
|
||||||
|
key={option.value}
|
||||||
|
value={option.value}
|
||||||
|
>{option.name}</MenuItem>;
|
||||||
})}
|
})}
|
||||||
</TextField>
|
</TextField>
|
||||||
)}
|
)}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
export const INTERVAL_DURATION: number[] = [
|
export const INTERVAL_DURATIONS: number[] = [
|
||||||
9000000000, // 15 minutes
|
9000000000, // 15 minutes
|
||||||
18000000000, // 30 minutes
|
18000000000, // 30 minutes
|
||||||
27000000000, // 45 minutes
|
27000000000, // 45 minutes
|
|
@ -1,7 +1,7 @@
|
||||||
import type { TaskTriggerInfo } from '@jellyfin/sdk/lib/generated-client/models/task-trigger-info';
|
import type { TaskTriggerInfo } from '@jellyfin/sdk/lib/generated-client/models/task-trigger-info';
|
||||||
import { format, formatDistanceStrict, Locale, parse } from 'date-fns';
|
import { format, formatDistanceStrict, Locale, parse } from 'date-fns';
|
||||||
import globalize from 'lib/globalize';
|
import globalize from 'lib/globalize';
|
||||||
import { INTERVAL_DURATION } from '../constants/intervalDuration';
|
import { INTERVAL_DURATIONS } from '../constants/intervalDurations';
|
||||||
|
|
||||||
function getDisplayTime(ticks: number, locale: Locale) {
|
function getDisplayTime(ticks: number, locale: Locale) {
|
||||||
const ms = ticks / 1e4;
|
const ms = ticks / 1e4;
|
||||||
|
@ -27,7 +27,7 @@ export function getTimeOfDayOptions(locale: Locale) {
|
||||||
export function getIntervalOptions(locale: Locale) {
|
export function getIntervalOptions(locale: Locale) {
|
||||||
const options = [];
|
const options = [];
|
||||||
|
|
||||||
for (const ticksDuration of INTERVAL_DURATION) {
|
for (const ticksDuration of INTERVAL_DURATIONS) {
|
||||||
const durationMs = Math.floor(ticksDuration / 1e4);
|
const durationMs = Math.floor(ticksDuration / 1e4);
|
||||||
const unit = durationMs < 36e5 ? 'minute' : 'hour';
|
const unit = durationMs < 36e5 ? 'minute' : 'hour';
|
||||||
options.push({
|
options.push({
|
||||||
|
|
|
@ -60,7 +60,7 @@ const TaskEdit = () => {
|
||||||
setIsAddTriggerDialogOpen(false);
|
setIsAddTriggerDialogOpen(false);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const onNewTriggerSubmit = useCallback((trigger: TaskTriggerInfo) => {
|
const onNewTriggerAdd = useCallback((trigger: TaskTriggerInfo) => {
|
||||||
if (task?.Triggers && task?.Id) {
|
if (task?.Triggers && task?.Id) {
|
||||||
const triggers = [...task.Triggers, trigger];
|
const triggers = [...task.Triggers, trigger];
|
||||||
|
|
||||||
|
@ -150,7 +150,7 @@ const TaskEdit = () => {
|
||||||
open={isAddTriggerDialogOpen}
|
open={isAddTriggerDialogOpen}
|
||||||
title={globalize.translate('ButtonAddScheduledTaskTrigger')}
|
title={globalize.translate('ButtonAddScheduledTaskTrigger')}
|
||||||
onClose={handleNewTriggerDialogClose}
|
onClose={handleNewTriggerDialogClose}
|
||||||
onSubmit={onNewTriggerSubmit}
|
onAdd={onNewTriggerAdd}
|
||||||
/>
|
/>
|
||||||
<Box className='content-primary'>
|
<Box className='content-primary'>
|
||||||
<Box className='readOnlyContent'>
|
<Box className='readOnlyContent'>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue