diff --git a/src/components/editors/AudioEditor/index.tsx b/src/components/editors/AudioEditor/index.tsx index 6ed80107..13b8055e 100644 --- a/src/components/editors/AudioEditor/index.tsx +++ b/src/components/editors/AudioEditor/index.tsx @@ -2,9 +2,7 @@ import React, { FC, useCallback, useMemo } from 'react'; import { UploadDropzone } from '~/components/upload/UploadDropzone'; import { UploadType } from '~/constants/uploads'; -import { useNodeAudios } from '~/hooks/node/useNodeAudios'; -import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik'; -import { useNodeImages } from '~/hooks/node/useNodeImages'; +import { IFile } from '~/types'; import { NodeEditorProps } from '~/types/node'; import { useUploaderContext } from '~/utils/context/UploaderContextProvider'; import { values } from '~/utils/ramda'; @@ -17,11 +15,7 @@ import styles from './styles.module.scss'; type IProps = NodeEditorProps; const AudioEditor: FC = () => { - const formik = useNodeFormContext(); - const { pending, setFiles, uploadFiles } = useUploaderContext()!; - - const images = useNodeImages(formik.values); - const audios = useNodeAudios(formik.values); + const { pending, filesAudios, filesImages, setFiles, uploadFiles } = useUploaderContext()!; const pendingImages = useMemo( () => values(pending).filter(item => item.type === UploadType.Image), @@ -33,15 +27,20 @@ const AudioEditor: FC = () => { [pending] ); - const setImages = useCallback(values => setFiles([...values, ...audios]), [setFiles, audios]); - - const setAudios = useCallback(values => setFiles([...values, ...images]), [setFiles, images]); + const setImages = useCallback((values: IFile[]) => setFiles([...values, ...filesAudios]), [ + setFiles, + filesAudios, + ]); + const setAudios = useCallback((values: IFile[]) => setFiles([...values, ...filesImages]), [ + setFiles, + filesImages, + ]); return (
- - + +
); diff --git a/src/components/media/AudioPlayer/index.tsx b/src/components/media/AudioPlayer/index.tsx index 2a5cded9..485a7e85 100644 --- a/src/components/media/AudioPlayer/index.tsx +++ b/src/components/media/AudioPlayer/index.tsx @@ -20,15 +20,20 @@ type Props = { const AudioPlayer = memo(({ file, onDelete, isEditing, onTitleChange }: Props) => { const { toPercent, file: currentFile, setFile, play, status, progress, pause } = useAudioPlayer(); - const onPlay = useCallback(async () => { - if (file.id !== currentFile?.id) { - setFile(file); - setTimeout(() => void play(), 0); - return; - } + const onPlay = useCallback( + async event => { + event.stopPropagation(); - status === PlayerState.PLAYING ? pause() : await play(); - }, [play, pause, setFile, file, currentFile, status]); + if (file.id !== currentFile?.id) { + setFile(file); + setTimeout(() => void play(), 0); + return; + } + + status === PlayerState.PLAYING ? pause() : await play(); + }, + [play, pause, setFile, file, currentFile, status] + ); const onSeek = useCallback( event => { @@ -65,17 +70,32 @@ const AudioPlayer = memo(({ file, onDelete, isEditing, onTitleChange }: Props) = [onTitleChange, file.id] ); + const stopPropagation = useCallback( + event => { + if (!isEditing) { + return; + } + + event.stopPropagation(); + }, + [isEditing] + ); + const playing = currentFile?.id === file.id; return ( -
+
{onDelete && (
)} -
+
{playing && status === PlayerState.PLAYING ? : }
@@ -85,6 +105,7 @@ const AudioPlayer = memo(({ file, onDelete, isEditing, onTitleChange }: Props) = placeholder={title} handler={onRename} value={file.metadata && file.metadata.title} + onMouseDown={stopPropagation} />
) : ( @@ -92,7 +113,12 @@ const AudioPlayer = memo(({ file, onDelete, isEditing, onTitleChange }: Props) =
{title || ''}
-
+
)} diff --git a/src/components/sortable/SortableAudioGrid/index.tsx b/src/components/sortable/SortableAudioGrid/index.tsx index da8ded3f..90584eac 100644 --- a/src/components/sortable/SortableAudioGrid/index.tsx +++ b/src/components/sortable/SortableAudioGrid/index.tsx @@ -26,16 +26,28 @@ const SortableAudioGrid: FC = ({ onSortEnd, onTitleChange, }) => { - const renderItem = useCallback>( - ({ item }) => ( - + const renderItem = useCallback>( + ({ item, key }) => ( + ), - [] + [onTitleChange, onDelete] ); const renderLocked = useCallback>( ({ locked }) => ( - + ), [] ); diff --git a/src/components/sortable/SortableGrid/index.tsx b/src/components/sortable/SortableGrid/index.tsx index 8fdbd0db..14f8f4ca 100644 --- a/src/components/sortable/SortableGrid/index.tsx +++ b/src/components/sortable/SortableGrid/index.tsx @@ -1,16 +1,16 @@ -import React, { createElement, FC, useMemo } from "react"; +import React, { createElement, FC, useMemo } from 'react'; -import { closestCenter, DndContext, DragOverlay } from "@dnd-kit/core"; -import { rectSortingStrategy, SortableContext } from "@dnd-kit/sortable"; -import classNames from "classnames"; +import { closestCenter, DndContext, DragOverlay } from '@dnd-kit/core'; +import { rectSortingStrategy, SortableContext } from '@dnd-kit/sortable'; +import classNames from 'classnames'; -import { DragOverlayItem } from "~/components/sortable/DragOverlayItem"; -import { useSortableActions } from "~/hooks/sortable"; -import { DivProps } from "~/utils/types"; +import { DragOverlayItem } from '~/components/sortable/DragOverlayItem'; +import { useSortableActions } from '~/hooks/sortable'; +import { DivProps } from '~/utils/types'; -import { SortableItem } from "../SortableItem"; +import { SortableItem } from '../SortableItem'; -import styles from "./styles.module.scss"; +import styles from './styles.module.scss'; interface SortableGridProps { items: T[]; diff --git a/src/components/sortable/SortableList/index.tsx b/src/components/sortable/SortableList/index.tsx index 2cdabec7..9d23b3fd 100644 --- a/src/components/sortable/SortableList/index.tsx +++ b/src/components/sortable/SortableList/index.tsx @@ -1,4 +1,4 @@ -import React, { createElement, FC } from 'react'; +import React, { createElement, FC, memo } from 'react'; import { closestCenter, DndContext, DragOverlay } from '@dnd-kit/core'; import { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable'; @@ -21,56 +21,60 @@ interface SortableListProps { className?: string; } -const SortableList = ({ - items, - locked, - getID, - getLockedID, - className, - renderItem, - renderLocked, - onSortEnd, -}: SortableListProps) => { - const { sensors, onDragEnd, onDragStart, draggingItem, ids } = useSortableActions( +const SortableList = memo( + ({ items, + locked, getID, - onSortEnd - ); + getLockedID, + className, + renderItem, + renderLocked, + onSortEnd, + }: SortableListProps) => { + const { sensors, onDragEnd, onDragStart, draggingItem, ids } = useSortableActions( + items, + getID, + onSortEnd + ); - return ( - - -
- {items.map(item => ( - - {createElement(renderItem, { item })} - - ))} + return ( + + +
+ {items.map(item => ( + + {createElement(renderItem, { item, key: getID(item) })} + + ))} - {locked.map(item => - createElement(renderLocked, { locked: item, key: getLockedID(item) }) - )} + {locked.map(item => + createElement(renderLocked, { locked: item, key: getLockedID(item) }) + )} - - {draggingItem ? ( - {createElement(renderItem, { item: draggingItem })} - ) : null} - -
-
-
- ); -}; + + {draggingItem ? ( + + {createElement(renderItem, { item: draggingItem })} + + ) : null} + +
+
+
+ ); + } +); export { SortableList }; diff --git a/src/components/upload/AudioUpload/index.tsx b/src/components/upload/AudioUpload/index.tsx index 33819389..155a9932 100644 --- a/src/components/upload/AudioUpload/index.tsx +++ b/src/components/upload/AudioUpload/index.tsx @@ -1,11 +1,11 @@ -import React, { FC, useCallback } from "react"; +import React, { FC, useCallback } from 'react'; -import classNames from "classnames"; +import classNames from 'classnames'; -import { ArcProgress } from "~/components/input/ArcProgress"; -import { Icon } from "~/components/input/Icon"; +import { ArcProgress } from '~/components/input/ArcProgress'; +import { Icon } from '~/components/input/Icon'; -import styles from "./styles.module.scss"; +import styles from './styles.module.scss'; interface IProps { id?: string;