diff --git a/apps/frontend/src/components/media/media.component.tsx b/apps/frontend/src/components/media/media.component.tsx index 3d7e6569..1213d503 100644 --- a/apps/frontend/src/components/media/media.component.tsx +++ b/apps/frontend/src/components/media/media.component.tsx @@ -3,6 +3,7 @@ import { ClipboardEvent, FC, + Fragment, useCallback, useEffect, useMemo, @@ -19,7 +20,6 @@ import EventEmitter from 'events'; import { TopTitle } from '@gitroom/frontend/components/launches/helpers/top.title.component'; import clsx from 'clsx'; import { VideoFrame } from '@gitroom/react/helpers/video.frame'; -import { LoadingComponent } from '@gitroom/frontend/components/layout/loading'; import { MultipartFileUploader } from '@gitroom/frontend/components/media/new.uploader'; import dynamic from 'next/dynamic'; import { useUser } from '@gitroom/frontend/components/layout/user.context'; @@ -29,6 +29,7 @@ import { DropFiles } from '@gitroom/frontend/components/layout/drop.files'; import { deleteDialog } from '@gitroom/react/helpers/delete.dialog'; import { useT } from '@gitroom/react/translation/get.transation.service.client'; import { ThirdPartyMedia } from '@gitroom/frontend/components/third-parties/third-party.media'; +import { ReactSortable } from 'react-sortablejs'; const Polonto = dynamic( () => import('@gitroom/frontend/components/launches/polonto') ); @@ -204,18 +205,21 @@ export const MediaBox: FC<{ }, [selectedMedia]); const { data, mutate } = useSWR(`get-media-${page}`, loadMedia); - const finishUpload = useCallback(async (res: any) => { - const lastMedia = mediaList?.[0]?.id; - const newData = await mutate(); - const untilLastMedia = newData.results.findIndex( - (f: any) => f.id === lastMedia - ); - const onlyNewMedia = newData.results.slice( - 0, - untilLastMedia === -1 ? newData.results.length : untilLastMedia - ); - addNewMedia(onlyNewMedia)(); - }, [mutate, addNewMedia, mediaList, selectedMedia]); + const finishUpload = useCallback( + async (res: any) => { + const lastMedia = mediaList?.[0]?.id; + const newData = await mutate(); + const untilLastMedia = newData.results.findIndex( + (f: any) => f.id === lastMedia + ); + const onlyNewMedia = newData.results.slice( + 0, + untilLastMedia === -1 ? newData.results.length : untilLastMedia + ); + addNewMedia(onlyNewMedia)(); + }, + [mutate, addNewMedia, mediaList, selectedMedia] + ); const dragAndDrop = useCallback( async (event: ClipboardEvent | File[]) => { @@ -480,7 +484,8 @@ export const MultiMediaComponent: FC<{ }; }) => void; }> = (props) => { - const { onOpen, onClose, name, error, text, onChange, value, allData } = props; + const { onOpen, onClose, name, error, text, onChange, value, allData } = + props; const user = useUser(); useEffect(() => { if (value) { @@ -614,32 +619,50 @@ export const MultiMediaComponent: FC<{ )} - {!!currentMedia && - currentMedia.map((media, index) => ( - <> -
-
window.open(mediaDirectory.set(media?.path))} - > - {media?.path?.indexOf('mp4') > -1 ? ( - - ) : ( - - )} + {!!currentMedia && ( + + onChange({ target: { name: 'upload', value } }) + } + className="flex gap-[10px] sortable-container" + animation={200} + swap={true} + handle=".dragging" + > + {currentMedia.map((media, index) => ( + +
+
+ :: +
+ +
+ window.open(mediaDirectory.set(media?.path)) + } + > + {media?.path?.indexOf('mp4') > -1 ? ( + + ) : ( + + )} +
+
+ x +
-
- x -
-
- - ))} + + ))} + + )}
{error}
diff --git a/apps/frontend/src/components/new-launch/manage.modal.tsx b/apps/frontend/src/components/new-launch/manage.modal.tsx index 152d9fca..9dd978e5 100644 --- a/apps/frontend/src/components/new-launch/manage.modal.tsx +++ b/apps/frontend/src/components/new-launch/manage.modal.tsx @@ -59,6 +59,7 @@ export const ManageModal: FC = (props) => { setTags, integrations, setSelectedIntegrations, + locked, } = useLaunchStore( useShallow((state) => ({ hide: state.hide, @@ -71,6 +72,7 @@ export const ManageModal: FC = (props) => { selectedIntegrations: state.selectedIntegrations, integrations: state.integrations, setSelectedIntegrations: state.setSelectedIntegrations, + locked: state.locked, })) ); @@ -316,7 +318,7 @@ export const ManageModal: FC = (props) => { onClick={deletePost} className="rounded-[4px] border-2 border-red-400 text-red-400" secondary={true} - disabled={loading} + disabled={loading || locked} > {t('delete_post', 'Delete Post')} @@ -327,7 +329,7 @@ export const ManageModal: FC = (props) => { onClick={schedule('draft')} className="rounded-[4px] border-2 border-customColor21" secondary={true} - disabled={selectedIntegrations.length === 0 || loading} + disabled={selectedIntegrations.length === 0 || loading || locked} > {t('save_as_draft', 'Save as draft')} @@ -336,7 +338,7 @@ export const ManageModal: FC = (props) => { {addEditSets && (