feat: allow user to drag-n-drop audio clip into audio tracks; added m4a support

This commit is contained in:
Xiaohan-Tian
2026-05-28 17:25:08 -07:00
parent c8af2ddcca
commit cd4d5847eb
8 changed files with 762 additions and 148 deletions
@@ -0,0 +1,75 @@
import React from 'react';
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { render } from '@testing-library/react';
import TrackInfoItem from './TrackInfoItem';
import { KGAudioTrack } from '../../core/track/KGAudioTrack';
const storeState = {
selectedTrackId: null as string | null,
setSelectedTrack: vi.fn(),
removeTrack: vi.fn(),
toggleInstrumentSelectionForTrack: vi.fn(),
importAudioToTrack: vi.fn(),
tracks: [] as KGAudioTrack[],
activeTrackAutomationTrackId: null as string | null,
activeTrackAutomationType: null as string | null,
setTrackAutomationView: vi.fn(),
};
let fileImportModalProps: Record<string, unknown> | null = null;
vi.mock('../../stores/projectStore', () => ({
useProjectStore: (selector?: (state: typeof storeState) => unknown) => (
selector ? selector(storeState) : storeState
),
}));
vi.mock('../common/KGDropdown', () => ({
default: () => null,
}));
vi.mock('../common/FileImportModal', () => ({
default: (props: Record<string, unknown>) => {
fileImportModalProps = props;
return null;
},
}));
vi.mock('../../util/dialogUtil', () => ({
showAlert: vi.fn(),
showConfirm: vi.fn(),
}));
describe('TrackInfoItem audio import', () => {
beforeEach(() => {
fileImportModalProps = null;
storeState.selectedTrackId = null;
storeState.setSelectedTrack.mockReset();
storeState.removeTrack.mockReset();
storeState.toggleInstrumentSelectionForTrack.mockReset();
storeState.importAudioToTrack.mockReset();
storeState.setTrackAutomationView.mockReset();
});
it('advertises m4a support in the track audio import modal', () => {
const audioTrack = new KGAudioTrack('Audio Track', 1);
audioTrack.setTrackIndex(0);
storeState.tracks = [audioTrack];
render(
<TrackInfoItem
track={audioTrack}
index={0}
isDragging={false}
isDragOver={false}
onTrackNameEdit={vi.fn()}
onDragStart={vi.fn()}
onDragOver={vi.fn()}
onDrop={vi.fn()}
onDragEnd={vi.fn()}
/>
);
expect(fileImportModalProps?.acceptedTypes).toEqual(['.wav', '.mp3', '.ogg', '.flac', '.aac', '.m4a']);
});
});