diff --git a/src/dashboard/Dashboard.js b/src/dashboard/Dashboard.js index 1369d93..f3fa489 100644 --- a/src/dashboard/Dashboard.js +++ b/src/dashboard/Dashboard.js @@ -9,7 +9,6 @@ import { recordingDataAtom, activeTrackIdAtom, activeSetIdAtom, - selectedChannelAtom, flashingConstructorsAtom, recordingStateAtom, useFlashingChannels, @@ -39,7 +38,6 @@ const Dashboard = () => { const [activeTrackId, setActiveTrackId] = useAtom(activeTrackIdAtom); const [activeSetId, setActiveSetId] = useAtom(activeSetIdAtom); const [predefinedModules, setPredefinedModules] = useState([]); - const [selectedChannel, setSelectedChannel] = useAtom(selectedChannelAtom); const [, flashChannel] = useFlashingChannels(); const [, setFlashingConstructors] = useAtom(flashingConstructorsAtom); @@ -49,35 +47,12 @@ const Dashboard = () => { const { workspacePath, setWorkspacePath, - isWorkspaceModalOpen, - setIsWorkspaceModalOpen, workspaceModalMode, setWorkspaceModalMode, workspaceModalPath, setWorkspaceModalPath, - isCreateTrackOpen, - setIsCreateTrackOpen, - isCreateSetOpen, - setIsCreateSetOpen, - isSelectTrackModalOpen, - setIsSelectTrackModalOpen, - isSelectSetModalOpen, - setIsSelectSetModalOpen, - isSettingsModalOpen, - setIsSettingsModalOpen, - isInputMappingsModalOpen, - setIsInputMappingsModalOpen, - isReleaseNotesOpen, - setIsReleaseNotesOpen, - isAddModuleModalOpen, - setIsAddModuleModalOpen, - isManageModulesModalOpen, - setIsManageModulesModalOpen, - isDebugOverlayOpen, - setIsDebugOverlayOpen, selectedTrackForModuleMenu, setSelectedTrackForModuleMenu, - openAddModuleModal, handleCreateNewModule, handleCreateModule, handleEditModule, @@ -87,10 +62,7 @@ const Dashboard = () => { editingTemplateType, isNewModuleDialogOpen, setIsNewModuleDialogOpen, - confirmationModal, - setConfirmationModal, openAlertModal, - openConfirmationModal, debugLogs, setDebugLogs, isSequencerMuted, @@ -99,11 +71,8 @@ const Dashboard = () => { setIsProjectorReady, perfStats, setPerfStats, - editChannelModalState, - setEditChannelModalState, - handleEditChannel, handleDeleteChannel, - } = useDashboardUiState({ selectedChannel, setUserData, activeSetId }); + } = useDashboardUiState({ setUserData, activeSetId }); const userDataRef = useLatestRef(userData); const recordingDataRef = useLatestRef(recordingData); @@ -167,7 +136,6 @@ const Dashboard = () => { setInputStatus, setDebugLogs, sendToProjector, - isDebugOverlayOpen, setIsProjectorReady, }); @@ -200,7 +168,6 @@ const Dashboard = () => { useWorkspaceModules({ workspacePath, - isWorkspaceModalOpen, sendToProjector, userData, setUserData, @@ -236,7 +203,6 @@ const Dashboard = () => { setWorkspacePath, setWorkspaceModalMode, setWorkspaceModalPath, - setIsWorkspaceModalOpen, }); const handleSelectWorkspace = useCallback(async () => { @@ -293,14 +259,7 @@ const Dashboard = () => { return (
- setIsSelectSetModalOpen(true)} - onTracks={() => setIsSelectTrackModalOpen(true)} - onModules={() => setIsManageModulesModalOpen(true)} - onSettings={() => setIsSettingsModalOpen(true)} - onDebugOverlay={() => setIsDebugOverlayOpen(true)} - onReleases={() => setIsReleaseNotesOpen(true)} - /> +
@@ -309,8 +268,6 @@ const Dashboard = () => { activeSetId={activeSetId} activeTrackId={activeTrackId} predefinedModules={predefinedModules} - openAddModuleModal={openAddModuleModal} - openConfirmationModal={openConfirmationModal} setActiveTrackId={setActiveTrackId} inputConfig={inputConfig} config={userData.config} @@ -338,33 +295,12 @@ const Dashboard = () => { inputStatus={inputStatus} inputConfig={inputConfig} config={userData.config} - onSettingsClick={() => setIsSettingsModalOpen(true)} isMuted={isSequencerMuted} onMuteChange={setIsSequencerMuted} isProjectorReady={isProjectorReady} /> { onCreateModule={handleCreateModule} debugLogs={debugLogs} perfStats={perfStats} - selectedChannel={selectedChannel} - setSelectedChannel={setSelectedChannel} - onEditChannel={handleEditChannel} onDeleteChannel={handleDeleteChannel} workspaceModuleFiles={workspaceModuleFiles} workspaceModuleLoadFailures={workspaceModuleLoadFailures} workspaceModuleSkipped={workspaceModuleSkipped} - editChannelModalState={editChannelModalState} - setEditChannelModalState={setEditChannelModalState} - confirmationModal={confirmationModal} - setConfirmationModal={setConfirmationModal} openAlertModal={openAlertModal} - openConfirmationModal={openConfirmationModal} /> void; - openConfirmationModal: (message: string, onConfirm: () => void) => void; setActiveTrackId: (id: string | number | null) => void; inputConfig: unknown; config: Record | null; @@ -24,8 +22,6 @@ export const DashboardBody = ({ activeSetId, activeTrackId, predefinedModules, - openAddModuleModal, - openConfirmationModal, setActiveTrackId, inputConfig, config, @@ -55,8 +51,6 @@ export const DashboardBody = ({ track={track} trackIndex={trackIndex} predefinedModules={predefinedModules} - openRightMenu={openAddModuleModal} - onConfirmDelete={openConfirmationModal} setActiveTrackId={setActiveTrackId} inputConfig={inputConfig} config={config} diff --git a/src/dashboard/components/DashboardFooter.tsx b/src/dashboard/components/DashboardFooter.tsx index 0107c31..22c0880 100644 --- a/src/dashboard/components/DashboardFooter.tsx +++ b/src/dashboard/components/DashboardFooter.tsx @@ -1,8 +1,9 @@ -import { useAtom } from "jotai"; +import { useAtom, useSetAtom } from "jotai"; import { FaPlay, FaStop } from "react-icons/fa"; import { recordingDataAtom } from "../core/state"; import { Checkbox } from "./FormInputs"; import { Button } from "./Button"; +import { settingsModalAtom } from "../core/modalAtoms"; type InputConfig = { type?: string; @@ -25,7 +26,6 @@ type DashboardFooterProps = { onStop: () => void; inputStatus: InputStatus; inputConfig: InputConfig | null; - onSettingsClick: () => void; config: DashboardConfig | null; isMuted: boolean; onMuteChange: (next: boolean) => void; @@ -39,13 +39,13 @@ export const DashboardFooter = ({ onStop, inputStatus, inputConfig, - onSettingsClick, config, isMuted, onMuteChange, isProjectorReady, }: DashboardFooterProps) => { const [_recordingData] = useAtom(recordingDataAtom); + const setSettingsModalIsOpen = useSetAtom(settingsModalAtom) const getStatusColor = () => { switch (inputStatus.status) { @@ -103,7 +103,7 @@ export const DashboardFooter = ({
No track selected
{!config?.sequencerMode && ( - - - -
@@ -54,7 +47,7 @@ export const DashboardHeader = ({
nw_wrld
- @@ -227,14 +233,6 @@ export const SelectSetModal = ({ isOpen={!!editingSetId} onClose={() => setEditingSetId(null)} setId={editingSetId} - onAlert={setAlertMessage} - /> - - setAlertMessage(null)} - message={alertMessage} - type="alert" /> ); diff --git a/src/dashboard/modals/SelectTrackModal.tsx b/src/dashboard/modals/SelectTrackModal.tsx index 1cb2d73..9b7a957 100644 --- a/src/dashboard/modals/SelectTrackModal.tsx +++ b/src/dashboard/modals/SelectTrackModal.tsx @@ -1,4 +1,3 @@ -import { useState } from "react"; import { FaPlus, FaEdit, FaTrash } from "react-icons/fa"; import { Modal } from "../shared/Modal"; import { SortableWrapper } from "../shared/SortableWrapper"; @@ -16,6 +15,8 @@ import { pitchClassToName, resolveTrackTrigger, } from "../../shared/midi/midiUtils"; +import { useAtom, useSetAtom } from "jotai"; +import { confirmationModalAtom, createTrackModalAtom, editTrackModalAtom, selectTrackModalAtom } from "../core/modalAtoms"; type Track = { id: string | number; @@ -29,7 +30,6 @@ type SortableTrackItemProps = { inputType: string; globalMappings: Record; onTrackSelect: (id: string | number) => void; - onEdit: (index: number) => void; onDelete: (index: number) => void; }; @@ -40,9 +40,9 @@ const SortableTrackItem = ({ inputType, globalMappings, onTrackSelect, - onEdit, onDelete, }: SortableTrackItemProps) => { + const setEditTrack = useSetAtom(editTrackModalAtom) return ( {({ dragHandleProps, isDragging: _isDragging }) => ( @@ -90,7 +90,7 @@ const SortableTrackItem = ({ })()}
- - {editingTrackIndex !== null && ( - setEditingTrackIndex(null)} - trackIndex={editingTrackIndex} - inputConfig={userData.config?.input || {}} - /> - )} + ); }; diff --git a/src/dashboard/modals/SettingsModal.tsx b/src/dashboard/modals/SettingsModal.tsx index 3eff911..e341738 100644 --- a/src/dashboard/modals/SettingsModal.tsx +++ b/src/dashboard/modals/SettingsModal.tsx @@ -11,6 +11,8 @@ import { } from "../components/FormInputs"; import { HelpIcon } from "../components/HelpIcon"; import { HELP_TEXT } from "../../shared/helpText"; +import { useAtom } from "jotai"; +import { inputMappingsModalAtom, settingsModalAtom } from "../core/modalAtoms"; const isValidHexColor = (value: string): boolean => /^#([0-9A-F]{3}){1,2}$/i.test(value); @@ -301,8 +303,6 @@ type Config = { }; type SettingsModalProps = { - isOpen: boolean; - onClose: () => void; aspectRatio: string; setAspectRatio: (ratio: string) => void; bgColor: string; @@ -314,7 +314,6 @@ type SettingsModalProps = { inputConfig: InputConfig; setInputConfig: (config: InputConfig) => void; availableMidiDevices: MidiDevice[]; - onOpenMappings: () => void; config: Config; updateConfig: (updates: Partial) => void; workspacePath: string | null; @@ -322,8 +321,6 @@ type SettingsModalProps = { }; export const SettingsModal = ({ - isOpen, - onClose, aspectRatio, setAspectRatio, bgColor, @@ -332,12 +329,16 @@ export const SettingsModal = ({ inputConfig, setInputConfig, availableMidiDevices, - onOpenMappings, config, updateConfig, workspacePath, onSelectWorkspace, }: SettingsModalProps) => { + const [isOpen, setIsOpen] = useAtom(settingsModalAtom) + const onClose = () => setIsOpen(false) + + const [_, setIsInputMappingsModalOpen] = useAtom(inputMappingsModalAtom) + const normalizedInputType = inputConfig?.type === "osc" ? "osc" : "midi"; const signalSourceValue = config.sequencerMode ? "sequencer" @@ -345,6 +346,11 @@ export const SettingsModal = ({ ? "external-osc" : "external-midi"; + const handleOpenMappings = () => { + onClose() + setIsInputMappingsModalOpen(true); + } + return ( @@ -568,7 +574,7 @@ export const SettingsModal = ({
Global Input Mappings:
-
diff --git a/src/dashboard/modals/TrackDataModal.tsx b/src/dashboard/modals/TrackDataModal.tsx index 3d96694..22d3d90 100644 --- a/src/dashboard/modals/TrackDataModal.tsx +++ b/src/dashboard/modals/TrackDataModal.tsx @@ -1,4 +1,3 @@ -import React from "react"; import { Modal } from "../shared/Modal"; import { ModalHeader } from "../components/ModalHeader"; diff --git a/src/main/InputManager.ts b/src/main/InputManager.ts index 599d4c3..d4f96eb 100644 --- a/src/main/InputManager.ts +++ b/src/main/InputManager.ts @@ -499,7 +499,7 @@ class InputManager { })); resolve(devices); }; - webMidi.enable({ callback }); + webMidi.enable({ callback, requestMIDIAccessFunction: () => true }); }); } }