diff --git a/src/apps/dashboard/features/tasks/api/useTask.ts b/src/apps/dashboard/features/tasks/api/useTask.ts index 98800420b4..78a430cb57 100644 --- a/src/apps/dashboard/features/tasks/api/useTask.ts +++ b/src/apps/dashboard/features/tasks/api/useTask.ts @@ -13,11 +13,6 @@ const fetchTask = async ( params: ScheduledTasksApiGetTaskRequest, options?: AxiosRequestConfig ) => { - if (!api) { - console.warn('[fetchTasks] No API instance available'); - return; - } - const response = await getScheduledTasksApi(api).getTask(params, options); return response.data; diff --git a/src/apps/dashboard/features/tasks/api/useTasks.ts b/src/apps/dashboard/features/tasks/api/useTasks.ts index 928ec4d639..7a4b6e1c4d 100644 --- a/src/apps/dashboard/features/tasks/api/useTasks.ts +++ b/src/apps/dashboard/features/tasks/api/useTasks.ts @@ -22,7 +22,7 @@ export const useTasks = (params?: ScheduledTasksApiGetTasksRequest) => { const { api } = useApi(); return useQuery({ - queryKey: [QUERY_KEY], + queryKey: [ QUERY_KEY ], queryFn: ({ signal }) => fetchTasks(api!, params, { signal }), enabled: !!api diff --git a/src/apps/dashboard/features/tasks/api/useUpdateTask.ts b/src/apps/dashboard/features/tasks/api/useUpdateTask.ts index 8f34c0df38..47de050a7b 100644 --- a/src/apps/dashboard/features/tasks/api/useUpdateTask.ts +++ b/src/apps/dashboard/features/tasks/api/useUpdateTask.ts @@ -3,7 +3,7 @@ import { getScheduledTasksApi } from '@jellyfin/sdk/lib/utils/api/scheduled-task import { useMutation } from '@tanstack/react-query'; import { useApi } from 'hooks/useApi'; import { queryClient } from 'utils/query/queryClient'; -import { QUERY_KEY } from './useTasks'; +import { QUERY_KEY } from './useTask'; export const useUpdateTask = () => { const { api } = useApi(); diff --git a/src/apps/dashboard/features/tasks/components/NewTriggerForm.tsx b/src/apps/dashboard/features/tasks/components/NewTriggerForm.tsx index 53d7663f3b..7819335669 100644 --- a/src/apps/dashboard/features/tasks/components/NewTriggerForm.tsx +++ b/src/apps/dashboard/features/tasks/components/NewTriggerForm.tsx @@ -18,21 +18,50 @@ type IProps = { open: boolean, title: string, onClose?: () => void, - onSubmit?: (trigger: TaskTriggerInfo) => void + onAdd?: (trigger: TaskTriggerInfo) => void }; -const NewTriggerForm: FunctionComponent = ({ open, title, onClose, onSubmit }: IProps) => { +const NewTriggerForm: FunctionComponent = ({ open, title, onClose, onAdd }: IProps) => { const { dateFnsLocale } = useLocale(); const [triggerType, setTriggerType] = useState('DailyTrigger'); const timeOfDayOptions = useMemo(() => getTimeOfDayOptions(dateFnsLocale), [dateFnsLocale]); - const intervalOptions = useMemo(() => getIntervalOptions(dateFnsLocale), [dateFnsLocale]); const onTriggerTypeChange = useCallback((e: React.ChangeEvent) => { setTriggerType(e.target.value); }, []); + const onSubmit = useCallback((e: React.FormEvent) => { + 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 ( = ({ open, title, onClose, onSub fullWidth PaperProps={{ component: 'form', - onSubmit: (e: React.FormEvent) => { - 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); - } - } + onSubmit: onSubmit }} > {title} @@ -116,7 +117,10 @@ const NewTriggerForm: FunctionComponent = ({ open, title, onClose, onSub label={globalize.translate('LabelTime')} > {timeOfDayOptions.map((option) => { - return {option.name}; + return {option.name}; })} )} @@ -130,7 +134,10 @@ const NewTriggerForm: FunctionComponent = ({ open, title, onClose, onSub label={globalize.translate('LabelEveryXMinutes')} > {intervalOptions.map((option) => { - return {option.name}; + return {option.name}; })} )} diff --git a/src/apps/dashboard/features/tasks/constants/intervalDuration.ts b/src/apps/dashboard/features/tasks/constants/intervalDurations.ts similarity index 87% rename from src/apps/dashboard/features/tasks/constants/intervalDuration.ts rename to src/apps/dashboard/features/tasks/constants/intervalDurations.ts index 01bd6ca7f5..f90d0f0ddd 100644 --- a/src/apps/dashboard/features/tasks/constants/intervalDuration.ts +++ b/src/apps/dashboard/features/tasks/constants/intervalDurations.ts @@ -1,4 +1,4 @@ -export const INTERVAL_DURATION: number[] = [ +export const INTERVAL_DURATIONS: number[] = [ 9000000000, // 15 minutes 18000000000, // 30 minutes 27000000000, // 45 minutes diff --git a/src/apps/dashboard/features/tasks/utils/edit.ts b/src/apps/dashboard/features/tasks/utils/edit.ts index e71f563a71..536146e9c5 100644 --- a/src/apps/dashboard/features/tasks/utils/edit.ts +++ b/src/apps/dashboard/features/tasks/utils/edit.ts @@ -1,7 +1,7 @@ import type { TaskTriggerInfo } from '@jellyfin/sdk/lib/generated-client/models/task-trigger-info'; import { format, formatDistanceStrict, Locale, parse } from 'date-fns'; import globalize from 'lib/globalize'; -import { INTERVAL_DURATION } from '../constants/intervalDuration'; +import { INTERVAL_DURATIONS } from '../constants/intervalDurations'; function getDisplayTime(ticks: number, locale: Locale) { const ms = ticks / 1e4; @@ -27,7 +27,7 @@ export function getTimeOfDayOptions(locale: Locale) { export function getIntervalOptions(locale: Locale) { const options = []; - for (const ticksDuration of INTERVAL_DURATION) { + for (const ticksDuration of INTERVAL_DURATIONS) { const durationMs = Math.floor(ticksDuration / 1e4); const unit = durationMs < 36e5 ? 'minute' : 'hour'; options.push({ diff --git a/src/apps/dashboard/routes/tasks/edit.tsx b/src/apps/dashboard/routes/tasks/edit.tsx index 5120f80f05..e203dde1f7 100644 --- a/src/apps/dashboard/routes/tasks/edit.tsx +++ b/src/apps/dashboard/routes/tasks/edit.tsx @@ -60,7 +60,7 @@ const TaskEdit = () => { setIsAddTriggerDialogOpen(false); }, []); - const onNewTriggerSubmit = useCallback((trigger: TaskTriggerInfo) => { + const onNewTriggerAdd = useCallback((trigger: TaskTriggerInfo) => { if (task?.Triggers && task?.Id) { const triggers = [...task.Triggers, trigger]; @@ -150,7 +150,7 @@ const TaskEdit = () => { open={isAddTriggerDialogOpen} title={globalize.translate('ButtonAddScheduledTaskTrigger')} onClose={handleNewTriggerDialogClose} - onSubmit={onNewTriggerSubmit} + onAdd={onNewTriggerAdd} />