From 664adfc2dc2cf55f19ce94d5ab2a2a471b573f34 Mon Sep 17 00:00:00 2001 From: Ilya Y <75578537+ilya-bkv@users.noreply.github.com> Date: Wed, 19 Jul 2023 14:00:58 +0300 Subject: [PATCH] refacor video upload (#138) * refacor video upload * remove unused imports --- src/components/Article/FullArticle.tsx | 7 +- .../Editor/VideoUploader/VideoUploader.tsx | 133 ++++++++---------- src/components/Nav/Header.tsx | 4 +- src/components/Views/Edit.tsx | 35 ++--- src/components/_shared/Slider/Slider.tsx | 1 - .../VideoPlayer/VideoPlayer.module.scss | 8 +- .../_shared/VideoPlayer/VideoPlayer.tsx | 9 +- src/pages/types.ts | 2 +- src/utils/composeMediaItems.ts | 2 +- 9 files changed, 84 insertions(+), 117 deletions(-) diff --git a/src/components/Article/FullArticle.tsx b/src/components/Article/FullArticle.tsx index 5531cd31..e19a1c0e 100644 --- a/src/components/Article/FullArticle.tsx +++ b/src/components/Article/FullArticle.tsx @@ -180,7 +180,12 @@ export const FullArticle = (props: ArticleProps) => { {(m: MediaItem) => (
- + diff --git a/src/components/Editor/VideoUploader/VideoUploader.tsx b/src/components/Editor/VideoUploader/VideoUploader.tsx index 86bdab77..6e571c13 100644 --- a/src/components/Editor/VideoUploader/VideoUploader.tsx +++ b/src/components/Editor/VideoUploader/VideoUploader.tsx @@ -2,32 +2,24 @@ import { clsx } from 'clsx' import styles from './VideoUploader.module.scss' import { useLocalize } from '../../../context/localize' import { createDropzone } from '@solid-primitives/upload' -import { createEffect, createSignal, Show } from 'solid-js' +import { createSignal, For, Show } from 'solid-js' import { useSnackbar } from '../../../context/snackbar' import { validateUrl } from '../../../utils/validateUrl' -import { VideoPlayer } from '../../_shared/VideoPlayer' import type { MediaItem } from '../../../pages/types' -// import { handleFileUpload } from '../../../utils/handleFileUpload' +import { composeMediaItems } from '../../../utils/composeMediaItems' +import { VideoPlayer } from '../../_shared/VideoPlayer' type Props = { - class?: string - data: (value: MediaItem[]) => void + video: MediaItem[] + onVideoAdd: (value: MediaItem[]) => void + onVideoDelete: (mediaItemIndex: number) => void } export const VideoUploader = (props: Props) => { const { t } = useLocalize() const [dragActive, setDragActive] = createSignal(false) - const [dragError, setDragError] = createSignal() + const [error, setError] = createSignal() const [incorrectUrl, setIncorrectUrl] = createSignal(false) - const [data, setData] = createSignal() - - const updateData = (key, value) => { - setData((prev) => ({ ...prev, [key]: value })) - } - - createEffect(() => { - props.data([data()]) - }) const { actions: { showSnackbar } @@ -39,97 +31,84 @@ export const VideoUploader = (props: Props) => { current: null } - // const [videoUrl, setVideoUrl] = createSignal() - // const runUpload = async (file) => { - // try { - // const fileUrl = await handleFileUpload(file) - // setVideoUrl(fileUrl) - // } catch (error) { - // console.error('[runUpload]', error) - // } - // } - const { setRef: dropzoneRef, files: droppedFiles } = createDropzone({ onDrop: async () => { setDragActive(false) if (droppedFiles().length > 1) { - setDragError(t('Many files, choose only one')) + setError(t('Many files, choose only one')) } else if (droppedFiles()[0].file.type.startsWith('video/')) { await showSnackbar({ body: t( 'This functionality is currently not available, we would like to work on this issue. Use the download link.' ) }) - // await runUpload(droppedFiles()[0]) } else { - setDragError(t('Video format not supported')) + setError(t('Video format not supported')) } } }) const handleDrag = (event) => { if (event.type === 'dragenter' || event.type === 'dragover') { setDragActive(true) - setDragError() + setError() } else if (event.type === 'dragleave') { setDragActive(false) } } const handleUrlInput = async (value: string) => { + setError() if (validateUrl(value)) { - updateData('url', value) + props.onVideoAdd(composeMediaItems([{ url: value }])) } else { setIncorrectUrl(true) } } return ( -
- -
- showSnackbar({ - body: t( - 'This functionality is currently not available, we would like to work on this issue. Use the download link.' - ) - }) - } - ref={dropzoneRef} - class={clsx(styles.dropArea, { [styles.active]: dragActive() })} - > -
{t('Upload video')}
-
- -
{dragError()}
-
-
- (urlInput.current = el)} - type="text" - placeholder={t('Insert video link')} - onChange={(event) => handleUrlInput(event.currentTarget.value)} - /> -
- -
{t('It does not look like url')}
-
- - } - > - setData()} - videoUrl={data().url} - title={data().title} - description={data().body} - /> -
-
+ + {(mi, index) => ( + props.onVideoDelete(index())} videoUrl={mi?.url} /> + )} + + } + > +
+
+ showSnackbar({ + body: t( + 'This functionality is currently not available, we would like to work on this issue. Use the download link.' + ) + }) + } + ref={dropzoneRef} + class={clsx(styles.dropArea, { [styles.active]: dragActive() })} + > +
{t('Upload video')}
+
+ +
{error()}
+
+
+ (urlInput.current = el)} + type="text" + placeholder={t('Insert video link')} + onChange={(event) => handleUrlInput(event.currentTarget.value)} + /> +
+ +
{t('It does not look like url')}
+
+
+
) } diff --git a/src/components/Nav/Header.tsx b/src/components/Nav/Header.tsx index 8d9fe47e..eb952895 100644 --- a/src/components/Nav/Header.tsx +++ b/src/components/Nav/Header.tsx @@ -1,9 +1,9 @@ -import { For, Show, createSignal, createEffect, onMount, onCleanup } from 'solid-js' +import { Show, createSignal, createEffect, onMount, onCleanup } from 'solid-js' import { Icon } from '../_shared/Icon' import { Modal } from './Modal' import { AuthModal } from './AuthModal' import { useModalStore } from '../../stores/ui' -import { router, ROUTES, useRouter } from '../../stores/router' +import { router, useRouter } from '../../stores/router' import styles from './Header.module.scss' import { getPagePath } from '@nanostores/router' import { clsx } from 'clsx' diff --git a/src/components/Views/Edit.tsx b/src/components/Views/Edit.tsx index 6871d129..f9ff0db8 100644 --- a/src/components/Views/Edit.tsx +++ b/src/components/Views/Edit.tsx @@ -1,4 +1,4 @@ -import { Accessor, createMemo, createSignal, For, onCleanup, onMount, Show } from 'solid-js' +import { Accessor, createMemo, createSignal, onCleanup, onMount, Show } from 'solid-js' import { useLocalize } from '../../context/localize' import { clsx } from 'clsx' import { Title } from '@solidjs/meta' @@ -17,7 +17,6 @@ import { imageProxy } from '../../utils/imageProxy' import { GrowingTextarea } from '../_shared/GrowingTextarea' import { VideoUploader } from '../Editor/VideoUploader' import { AudioUploader } from '../Editor/AudioUploader' -import { VideoPlayer } from '../_shared/VideoPlayer' import { slugify } from '../../utils/slugify' import { SolidSwiper } from '../_shared/SolidSwiper' import { DropArea } from '../_shared/DropArea' @@ -136,7 +135,7 @@ export const EditView = (props: Props) => { setForm('media', JSON.stringify(data)) } - const handleImageDelete = (index) => { + const handleMediaDelete = (index) => { const copy = [...mediaItems()] copy.splice(index, 1) setForm('media', JSON.stringify(copy)) @@ -307,36 +306,18 @@ export const EditView = (props: Props) => { editorMode={true} images={mediaItems()} onImageChange={handleMediaChange} - onImageDelete={(index) => handleImageDelete(index)} + onImageDelete={(index) => handleMediaDelete(index)} onImagesAdd={(value) => handleAddMedia(value)} onImagesSorted={(value) => handleSortedMedia(value)} /> - { - handleAddMedia(data) - }} - /> - } - > - - {(mediaItem) => ( - <> - setForm('media', null)} - /> - - )} - - + handleAddMedia(data)} + onVideoDelete={(index) => handleMediaDelete(index)} + /> diff --git a/src/components/_shared/Slider/Slider.tsx b/src/components/_shared/Slider/Slider.tsx index d5744504..c5797459 100644 --- a/src/components/_shared/Slider/Slider.tsx +++ b/src/components/_shared/Slider/Slider.tsx @@ -25,7 +25,6 @@ interface Props { export const Slider = (props: Props) => { let el: HTMLDivElement | undefined let thumbsEl: HTMLDivElement | undefined - let pagEl: HTMLDivElement | undefined let nextEl: HTMLDivElement | undefined let prevEl: HTMLDivElement | undefined diff --git a/src/components/_shared/VideoPlayer/VideoPlayer.module.scss b/src/components/_shared/VideoPlayer/VideoPlayer.module.scss index 88a5028f..e5db7dde 100644 --- a/src/components/_shared/VideoPlayer/VideoPlayer.module.scss +++ b/src/components/_shared/VideoPlayer/VideoPlayer.module.scss @@ -3,11 +3,13 @@ flex-direction: column; align-items: center; justify-content: center; - margin: 1rem 0; + margin: 1rem auto; position: relative; - @include media-breakpoint-up(md) { - margin: 1rem -16.6666% 2rem -25%; + &.articleView { + @include media-breakpoint-up(md) { + margin: 1rem -16.6666% 2rem -25%; + } } .controls { diff --git a/src/components/_shared/VideoPlayer/VideoPlayer.tsx b/src/components/_shared/VideoPlayer/VideoPlayer.tsx index dc4885ec..3ae84ba6 100644 --- a/src/components/_shared/VideoPlayer/VideoPlayer.tsx +++ b/src/components/_shared/VideoPlayer/VideoPlayer.tsx @@ -11,7 +11,8 @@ type Props = { title?: string description?: string class?: string - deleteAction?: () => void + onVideoDelete?: () => void + articleView?: boolean } export const VideoPlayer = (props: Props) => { @@ -37,15 +38,15 @@ export const VideoPlayer = (props: Props) => { }) return ( -
- +
+ {(triggerRef: (el) => void) => (