comprehensively completed common control operations in Pattern List

This commit is contained in:
Vixalie 2025-03-11 14:31:01 +08:00
parent 579e7265fc
commit 57ba0e3d49
2 changed files with 27 additions and 5 deletions

View File

@ -1,14 +1,29 @@
import { Icon } from '@iconify/react/dist/iconify.js'; import { Icon } from '@iconify/react/dist/iconify.js';
import { FC } from 'react'; import { useAtom } from 'jotai';
import { FC, useCallback } from 'react';
import { useNavigate } from 'react-router-dom';
import EditableContent from '../../components/EditableContent'; import EditableContent from '../../components/EditableContent';
import { CurrentPatternAtom } from '../../context/Patterns';
import styles from './PatternHeader.module.css'; import styles from './PatternHeader.module.css';
const PatternHeader: FC = () => { const PatternHeader: FC = () => {
const navigate = useNavigate();
const [currentPattern, setPattern] = useAtom(CurrentPatternAtom);
const handleClosePattern = useCallback(() => {
setPattern(null);
navigate('/library');
}, [currentPattern]);
return ( return (
<div className={styles.pattern_header}> <div className={styles.pattern_header}>
<EditableContent as="h3" placeholder="Pattern Name" additionalClassName={styles.content} /> <EditableContent
as="h3"
placeholder="Pattern Name"
value={currentPattern?.name ?? null}
additionalClassName={styles.content}
/>
<div className="spacer" /> <div className="spacer" />
<button className="tonal"> <button className="tonal" onClick={handleClosePattern}>
<Icon icon="material-symbols-light:close" /> <Icon icon="material-symbols-light:close" />
Close Edit Close Edit
</button> </button>

View File

@ -2,6 +2,7 @@ import { Icon } from '@iconify/react/dist/iconify.js';
import cx from 'clsx'; import cx from 'clsx';
import { useAtom, useAtomValue } from 'jotai'; import { useAtom, useAtomValue } from 'jotai';
import { FC, useCallback, useMemo, useState } from 'react'; import { FC, useCallback, useMemo, useState } from 'react';
import { useNavigate } from 'react-router-dom';
import { useDebounce } from 'react-use'; import { useDebounce } from 'react-use';
import { ScrollArea } from '../../components/ScrollArea'; import { ScrollArea } from '../../components/ScrollArea';
import { CurrentPatternAtom, Pattern, PatternsAtom, totalDuration } from '../../context/Patterns'; import { CurrentPatternAtom, Pattern, PatternsAtom, totalDuration } from '../../context/Patterns';
@ -9,6 +10,7 @@ import styles from './Patterns.module.css';
const PatternCard: FC<{ pattern: Pattern }> = ({ pattern }) => { const PatternCard: FC<{ pattern: Pattern }> = ({ pattern }) => {
const [currentPattern, setCurrentPattern] = useAtom(CurrentPatternAtom); const [currentPattern, setCurrentPattern] = useAtom(CurrentPatternAtom);
const navigate = useNavigate();
const duration = useMemo(() => { const duration = useMemo(() => {
return totalDuration(pattern) / 1000; return totalDuration(pattern) / 1000;
}, [pattern]); }, [pattern]);
@ -20,12 +22,17 @@ const PatternCard: FC<{ pattern: Pattern }> = ({ pattern }) => {
setCurrentPattern(pattern); setCurrentPattern(pattern);
} }
}, [pattern, currentPattern]); }, [pattern, currentPattern]);
const handleDblClick = useCallback(() => {
setCurrentPattern(pattern);
navigate('/pattern-editor/edit');
}, [pattern]);
return ( return (
<div <div
className={cx(styles.pattern_card, selected && styles.selected)} className={cx(styles.pattern_card, selected && styles.selected)}
onClick={handleSingleClick}> onClick={handleSingleClick}
<h6 className={styles.name}>{pattern.name}</h6> onDoubleClick={handleDblClick}>
<h5 className={styles.name}>{pattern.name}</h5>
<span>{duration.toFixed(2)} s</span> <span>{duration.toFixed(2)} s</span>
</div> </div>
); );