import { invoke } from '@tauri-apps/api/core'; import { ask } from '@tauri-apps/plugin-dialog'; import dayjs from 'dayjs'; import { useAtomValue, useSetAtom } from 'jotai'; import { FC, useCallback, useMemo } from 'react'; import { useNavigate } from 'react-router-dom'; import { NotificationType, useNotification } from '../../components/Notifications'; import PatternPreview from '../../components/PatternPreview'; import { CurrentPatternAtom, PatternsAtom, SelectedPatternIdAtom } from '../../context/Patterns'; import { Pattern, totalDuration } from '../../context/pattern-model'; import styles from './PatternDetail.module.css'; const EmptyPromption: FC = () => { return (
Select a pattern from left first.
); }; const Detail: FC<{ pattern: Pattern }> = ({ pattern }) => { const { showToast } = useNotification(); const navigate = useNavigate(); const refreshPatterns = useSetAtom(PatternsAtom); const resetSelected = useSetAtom(SelectedPatternIdAtom); const patternDuration = useMemo(() => totalDuration(pattern), [pattern]); const createTime = useMemo( () => dayjs(pattern.createdAt).format('YYYY-MM-DD HH:mm:ss'), [pattern], ); const handleDeleteAction = useCallback(async () => { try { const answer = await ask( `The pattern ${pattern.name} will be deleted, and cannot be revoked. Are you sure?`, { title: 'Confirm action', kind: 'warning', }, ); if (answer) { await invoke('remove_pattern', { patternId: pattern.id }); showToast(NotificationType.SUCCESS, 'Pattern deleted.'); refreshPatterns(); resetSelected(null); } } catch (e) { console.error('[delete pattern]', e); showToast(NotificationType.ERROR, 'Failed to delete pattern. Please try again.'); } }, [pattern]); return (

{createTime}
{(patternDuration / 1000).toFixed(2)} s
{pattern.pulses.length} key frame{pattern.pulses.length > 1 && 's'}

); }; const PatternDetail: FC = () => { const currentPattern = useAtomValue(CurrentPatternAtom); return !currentPattern ? : ; }; export default PatternDetail;