diff --git a/apps/client/src/common/hooks/useSocket.ts b/apps/client/src/common/hooks/useSocket.ts index 24753b5df..6ebfe9cd6 100644 --- a/apps/client/src/common/hooks/useSocket.ts +++ b/apps/client/src/common/hooks/useSocket.ts @@ -103,6 +103,14 @@ export const useAuxTimersName = createSelector((state: RuntimeStore) => { }; }); +export const useAuxTimersActive = createSelector((state: RuntimeStore) => { + return ( + state.auxtimer1.playback === SimplePlayback.Start || + state.auxtimer2.playback === SimplePlayback.Start || + state.auxtimer3.playback === SimplePlayback.Start + ); +}); + export const useAuxTimerTime = (index: number) => createSelector((state: RuntimeStore) => { if (index === 1) return state.auxtimer1.current; diff --git a/apps/client/src/common/stores/editorSettings.ts b/apps/client/src/common/stores/editorSettings.ts index bedebf976..2686a1d32 100644 --- a/apps/client/src/common/stores/editorSettings.ts +++ b/apps/client/src/common/stores/editorSettings.ts @@ -13,6 +13,7 @@ type EditorSettingsStore = { defaultTimerType: TimerType; defaultEndAction: EndAction; inheritGroupColour: boolean; + auxTimersCollapsed: boolean; setDefaultDuration: (defaultDuration: string) => void; setLinkPrevious: (linkPrevious: boolean) => void; setInheritGroupColour: (inheritGroupColour: boolean) => void; @@ -21,6 +22,7 @@ type EditorSettingsStore = { setDangerTime: (dangerTime: string) => void; setDefaultTimerType: (defaultTimerType: TimerType) => void; setDefaultEndAction: (defaultEndAction: EndAction) => void; + setAuxTimersCollapsed: (auxTimersCollapsed: boolean) => void; }; export const editorSettingsDefaults = { @@ -32,6 +34,7 @@ export const editorSettingsDefaults = { timerType: TimerType.CountDown, endAction: EndAction.None, inheritGroupColour: false, + auxTimersCollapsed: false, }; enum EditorSettingsKeys { @@ -43,6 +46,7 @@ enum EditorSettingsKeys { DefaultTimerType = 'ontime-default-timer-type', DefaultEndAction = 'ontime-default-end-action', InheritGroupColour = 'ontime-inherit-group-colour', + AuxTimersCollapsed = 'ontime-aux-timers-collapsed', } export const useEditorSettings = create((set) => { @@ -67,6 +71,10 @@ export const useEditorSettings = create((set) => { EditorSettingsKeys.InheritGroupColour, editorSettingsDefaults.inheritGroupColour, ), + auxTimersCollapsed: booleanFromLocalStorage( + EditorSettingsKeys.AuxTimersCollapsed, + editorSettingsDefaults.auxTimersCollapsed, + ), setDefaultDuration: (defaultDuration) => set(() => { @@ -110,5 +118,10 @@ export const useEditorSettings = create((set) => { localStorage.setItem(EditorSettingsKeys.InheritGroupColour, String(inheritGroupColour)); return { inheritGroupColour }; }), + setAuxTimersCollapsed: (auxTimersCollapsed) => + set(() => { + localStorage.setItem(EditorSettingsKeys.AuxTimersCollapsed, String(auxTimersCollapsed)); + return { auxTimersCollapsed }; + }), }; }); diff --git a/apps/client/src/features/control/playback/PlaybackControl.module.scss b/apps/client/src/features/control/playback/PlaybackControl.module.scss index eee06cbab..402ff6aca 100644 --- a/apps/client/src/features/control/playback/PlaybackControl.module.scss +++ b/apps/client/src/features/control/playback/PlaybackControl.module.scss @@ -11,10 +11,26 @@ } .label { + display: flex; + align-items: center; + gap: 0.5rem; font-size: $inner-section-text-size; color: $label-gray; } +.auxHeaderButtons { + display: flex; + align-items: center; + gap: 0.25rem; +} + +.activeIndicator { + width: 0.5rem; + height: 0.5rem; + border-radius: 50%; + background-color: $active-indicator; +} + .auxTimers { display: grid; grid-template-columns: 1fr 1fr 1fr; diff --git a/apps/client/src/features/control/playback/PlaybackControl.tsx b/apps/client/src/features/control/playback/PlaybackControl.tsx index 8b69cdcb7..6fd54a806 100644 --- a/apps/client/src/features/control/playback/PlaybackControl.tsx +++ b/apps/client/src/features/control/playback/PlaybackControl.tsx @@ -1,8 +1,9 @@ -import { IoSettingsOutline } from 'react-icons/io5'; +import { IoChevronDown, IoChevronUp, IoSettingsOutline } from 'react-icons/io5'; import IconButton from '../../../common/components/buttons/IconButton'; import Tooltip from '../../../common/components/tooltip/Tooltip'; -import { usePlaybackControl } from '../../../common/hooks/useSocket'; +import { useAuxTimersActive, usePlaybackControl } from '../../../common/hooks/useSocket'; +import { useEditorSettings } from '../../../common/stores/editorSettings'; import useAppSettingsNavigation from '../../app-settings/useAppSettingsNavigation'; import AddTime from './add-time/AddTime'; import { AuxTimer } from './aux-timer/AuxTimer'; @@ -14,6 +15,8 @@ import style from './PlaybackControl.module.scss'; export default function PlaybackControl() { const data = usePlaybackControl(); const { setLocation } = useAppSettingsNavigation(); + const { auxTimersCollapsed, setAuxTimersCollapsed } = useEditorSettings(); + const isAuxTimerActive = useAuxTimersActive(); return (
@@ -27,26 +30,41 @@ export default function PlaybackControl() { timerPhase={data.timerPhase} />
- Aux timers - setLocation('settings__aux-timers')} - /> - } - > - - -
-
- - - + + Aux timers + {auxTimersCollapsed && isAuxTimerActive && } + +
+ setLocation('settings__aux-timers')} + /> + } + > + + + setAuxTimersCollapsed(!auxTimersCollapsed)} + > + {auxTimersCollapsed ? : } + +
+ {!auxTimersCollapsed && ( +
+ + + +
+ )}
); }