diff --git a/src/pages/playlist/content.jsx b/src/pages/playlist/content.jsx index 663b7ae..4880ceb 100644 --- a/src/pages/playlist/content.jsx +++ b/src/pages/playlist/content.jsx @@ -4,15 +4,28 @@ import { IconGripVertical } from '@tabler/icons-react'; import { StrictModeDroppable } from './StrictModeDroppable'; import { ActionIcon, Button, Center, Group, NumberInput, Paper, Text } from '@mantine/core'; import { IconTrash } from '@tabler/icons-react'; -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import ModalFileSelector from '../files/file-selector'; import API from '../../services/api'; import setNotification from '../errors/error-notification'; -import GrantAccess, { Perm } from '../../tools/grant-access'; +import GrantAccess, { Perm, checkPerm } from '../../tools/grant-access'; +import { useAuth } from '../../tools/auth-provider'; +import { parseTime } from '../../tools/timeUtil'; const Content = ({ form, playlistId, playlist }) => { const [fileSelector, setFileSelector] = useState(false); const toggleFileSelector = () => setFileSelector(!fileSelector); + const [canEdit, setCanEdit] = useState(false); + const { user } = useAuth(); + + useEffect(() => { + if (!user || !playlist) return; + const canEditTmp = checkPerm(Perm.EDIT_PLAYLIST, user, playlist); + if (canEditTmp != canEdit) { + setCanEdit(canEditTmp); + } + return () => {}; + }, [playlist, user]); const handleAddFiles = (files) => { let formFiles = form.values.files; @@ -24,7 +37,8 @@ const Content = ({ form, playlistId, playlist }) => { file.seconds = 10; const index = form.values.files.length; form.insertListItem('files', file); - API.playlists.addFile(playlistId, { position: file.position, file_id: file.id, seconds: file.seconds }) + API.playlists + .addFile(playlistId, { position: file.position, file_id: file.id, seconds: file.seconds }) .then((res) => { if (res.status !== 200) { setNotification(true, `Error when adding file (${res.status})`); @@ -55,7 +69,8 @@ const Content = ({ form, playlistId, playlist }) => { let newPosition = (below_position + above_position) / 2; // sending modification to server - API.playlists.changeOrder(playlistId, { file_id: formFiles[from].id, position: newPosition }) + API.playlists + .changeOrder(playlistId, { file_id: formFiles[from].id, position: newPosition }) .then((res) => { if (res.status === 200) { resolve(true); @@ -95,7 +110,8 @@ const Content = ({ form, playlistId, playlist }) => { const changeSeconds = (seconds, index) => { const fileId = form.values.files[index].id; - API.playlists.changeSeconds(playlistId, { file_id: fileId, seconds: seconds }) + API.playlists + .changeSeconds(playlistId, { file_id: fileId, seconds: seconds }) .then((res) => { if (res.status === 200) { setOriginSecs(); @@ -111,7 +127,8 @@ const Content = ({ form, playlistId, playlist }) => { }; const handleDelete = (index) => { - API.playlists.removeFile(playlistId, { file_id: form.values.files[index].pfid }) + API.playlists + .removeFile(playlistId, { file_id: form.values.files[index].pfid }) .then((res) => { if (res.status === 200) { form.removeListItem('files', index); @@ -132,6 +149,7 @@ const Content = ({ form, playlistId, playlist }) => { {form.getInputProps(`files.${index}.name`).value} + { canEdit ? { onChange={(secs) => handleChangeSeconds(secs, index)} error={form.getInputProps(`files.${index}.seconds`).errors && 'This field is required'} /> - handleDelete(index)}> - - + : Display time: {parseTime(form.getInputProps(`files.${index}.seconds`).value)} + } + {canEdit ? ( + handleDelete(index)}> + + + ) : ( + <> + )} -
- -
+ {canEdit ? ( +
+ +
+ ) : ( + <> + )} )} @@ -175,25 +203,23 @@ const Content = ({ form, playlistId, playlist }) => { - - - - - handleAddFiles(files)} - /> - - } - /> + {canEdit ? ( + <> + + + + handleAddFiles(files)} + /> + + ) : ( + <> + )} ); }; diff --git a/src/pages/playlists/playlist-view-editor.jsx b/src/pages/playlists/playlist-view-editor.jsx index 4519c4c..418b27b 100644 --- a/src/pages/playlists/playlist-view-editor.jsx +++ b/src/pages/playlists/playlist-view-editor.jsx @@ -11,7 +11,6 @@ const PlaylistViewEditor = ({ item, handler, buttonText, APICall }) => { }; const [isLoading, setIsLoading] = useState(false); - console.log(item); const [rolesView, setRolesView] = useState(item?.view.map((role) => role.id.toString()) ?? []); const [rolesEdit, setRolesEdit] = useState(item?.edit.map((role) => role.id.toString()) ?? []); @@ -39,7 +38,7 @@ const PlaylistViewEditor = ({ item, handler, buttonText, APICall }) => { setIsLoading(true); if (item) { await APICall(item?.id, { name: form.values.name }); - // todo permissions + // todo permissions update item.name = form.values.name; handleClose(item); } else { diff --git a/src/tools/timeUtil.js b/src/tools/timeUtil.js index da4dba8..ea2466e 100644 --- a/src/tools/timeUtil.js +++ b/src/tools/timeUtil.js @@ -1,13 +1,13 @@ -export const parseTime = (preparationTime) => { +export const parseTime = (timeInSecs) => { let res = ''; - let hours = Math.floor(preparationTime / 3600); + let hours = Math.floor(timeInSecs / 3600); res += hours > 0 ? `${hours}h` : ''; - let min = Math.floor((preparationTime % 3600) / 60); + let min = Math.floor((timeInSecs % 3600) / 60); if (min > 0 && res !== '') res += ' '; res += min > 0 ? `${min}m` : ''; - let sec = Math.floor((preparationTime % 3600) % 60); + let sec = Math.floor((timeInSecs % 3600) % 60); if (sec > 0 && res !== '') res += ' '; res += sec > 0 ? `${sec}s` : '';