From db9cb61164919b1a2c87b35dfdb493ace2350f20 Mon Sep 17 00:00:00 2001 From: Carlos Valente <34649812+cpvalente@users.noreply.github.com> Date: Fri, 21 Apr 2023 20:06:40 +0200 Subject: [PATCH] fix: osc modal (#352) * refactor: parse time input * fix: form dirty flag on dynamic elements --- .../integration-modal/OscIntegration.tsx | 23 +++++++++++++++---- .../integration-modal/OscSubscriptionRow.tsx | 7 +++--- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/apps/client/src/features/modals/integration-modal/OscIntegration.tsx b/apps/client/src/features/modals/integration-modal/OscIntegration.tsx index b4f500262..5a690a1d2 100644 --- a/apps/client/src/features/modals/integration-modal/OscIntegration.tsx +++ b/apps/client/src/features/modals/integration-modal/OscIntegration.tsx @@ -34,7 +34,7 @@ const sectionText: { [key in TimerLifeCycle]: { title: string; subtitle: string subtitle: 'Triggers when a running timer is stopped', }, onUpdate: { - title: 'On Update', + title: 'On Every Second', subtitle: 'Triggers when timers are updated (at least once a second, can be more)', }, onFinish: { @@ -50,37 +50,50 @@ export default function OscIntegration() { const { handleSubmit, register, + reset, formState: { isSubmitting, isDirty, isValid }, } = useForm({ defaultValues: data, values: data, }); - const resetForm = () => data?.subscriptions || oscPlaceholderSettings.subscriptions; - const [subscriptionState, setSubscription] = useState(() => resetForm()); + const [subscriptionState, setSubscription] = useState( + data?.subscriptions || oscPlaceholderSettings.subscriptions, + ); + const [hasManualChange, setHasManualChange] = useState(false); const [showSection, setShowSection] = useState(TimerLifeCycle.onLoad); + const resetForm = () => { + const originalData = data || oscPlaceholderSettings; + setSubscription(originalData.subscriptions); + // @ts-expect-error -- we know the data here is safe + reset(originalData); + }; + const deleteSubscriptionEntry = (cycle: OntimeCycle, id: string) => { setSubscription((prev) => { const newData = { ...prev }; newData[cycle] = [...prev[cycle].filter((el) => el.id !== id)]; return newData; }); + setHasManualChange(true); }; const addNewSubscriptionEntry = async (cycle: OntimeCycle) => { setSubscription((prev) => { - const newData = { ...prev }; + const newData = structuredClone(prev); newData[cycle] = [...prev[cycle], { id: generateId(), message: '', enabled: false }]; return newData; }); + setHasManualChange(true); }; const onSubmit = async (values: OSCSettings | PlaceholderSettings) => { try { // @ts-expect-error -- we know of the type mismatch, not pertinent here await mutateAsync(values); + setHasManualChange(false); } catch (error) { emitError(`Error setting OSC: ${error}`); } @@ -114,7 +127,7 @@ export default function OscIntegration() { diff --git a/apps/client/src/features/modals/integration-modal/OscSubscriptionRow.tsx b/apps/client/src/features/modals/integration-modal/OscSubscriptionRow.tsx index d89c2dc98..16d19a126 100644 --- a/apps/client/src/features/modals/integration-modal/OscSubscriptionRow.tsx +++ b/apps/client/src/features/modals/integration-modal/OscSubscriptionRow.tsx @@ -1,9 +1,10 @@ +import { UseFormRegister } from 'react-hook-form'; import { Button, IconButton, Input, Switch } from '@chakra-ui/react'; import { FiChevronUp } from '@react-icons/all-files/fi/FiChevronUp'; import { IoRemove } from '@react-icons/all-files/io5/IoRemove'; import { OscSubscriptionOptions, TimerLifeCycle } from 'ontime-types'; -import style from '../../../common/components/collapse-bar/CollapseBar.module.scss'; +import collapseStyles from '../../../common/components/collapse-bar/CollapseBar.module.scss'; import styles from '../Modal.module.scss'; interface OscSubscriptionRowProps { @@ -15,7 +16,7 @@ interface OscSubscriptionRowProps { subscriptionOptions: OscSubscriptionOptions[]; handleDelete: (cycle: TimerLifeCycle, id: string) => void; handleAddNew: (cycle: TimerLifeCycle) => void; - register: object; + register: UseFormRegister; } export default function OscSubscriptionRow(props: OscSubscriptionRowProps) { @@ -33,7 +34,7 @@ export default function OscSubscriptionRow(props: OscSubscriptionRowProps) { {title} {visible && {subtitle}} - + {visible && ( <>