diff --git a/app/web/src/components/KeyValue/KeyValue.tsx b/app/web/src/components/KeyValue/KeyValue.tsx index f05aeea..5d93378 100644 --- a/app/web/src/components/KeyValue/KeyValue.tsx +++ b/app/web/src/components/KeyValue/KeyValue.tsx @@ -1,27 +1,47 @@ import Svg from 'src/components/Svg/Svg' +interface EditToggleType { + hasPermissionToEdit: boolean + onEdit?: React.MouseEventHandler + isEditing?: boolean +} + +const EditToggle = ({ + onEdit = () => { console.error('Field declared editable without edit action.') }, + isEditing = false, +} : EditToggleType) => ( + (isEditing ? ( + + ) : ( + + )) +) + interface KeyValueType { keyName: string children: React.ReactNode - hide?: boolean - canEdit?: boolean - onEdit?: () => void - isEditable?: boolean bottom?: boolean className?: string + edit?: EditToggleType } const KeyValue = ({ keyName, children, - hide = false, - canEdit = false, - onEdit, - isEditable = false, bottom = false, className = '', + edit = { hasPermissionToEdit: false }, }: KeyValueType) => { - if (!children || hide) return null + if (!children) return null return (
- {keyName} - {canEdit && - (isEditable ? ( - - ) : ( - - ))} + {keyName} + {edit && edit.hasPermissionToEdit && }
{children} diff --git a/app/web/src/components/ProjectCard/ProjectCard.tsx b/app/web/src/components/ProjectCard/ProjectCard.tsx index 9f6fbd4..fa0f303 100644 --- a/app/web/src/components/ProjectCard/ProjectCard.tsx +++ b/app/web/src/components/ProjectCard/ProjectCard.tsx @@ -33,8 +33,8 @@ const ProjectCard = ({ title, mainImage, user, Reaction, cadPackage }) => (
diff --git a/app/web/src/components/ProjectProfile/ProjectProfile.tsx b/app/web/src/components/ProjectProfile/ProjectProfile.tsx index d015a09..3d4c83b 100644 --- a/app/web/src/components/ProjectProfile/ProjectProfile.tsx +++ b/app/web/src/components/ProjectProfile/ProjectProfile.tsx @@ -27,7 +27,7 @@ const ProjectProfile = ({ onComment, }) => { const [comment, setComment] = useState('') - const [isEditable, setIsEditable] = useState(false) + const [isEditing, setIsEditing] = useState(false) const onCommentClear = () => { onComment(comment) setComment('') @@ -36,14 +36,14 @@ const ProjectProfile = ({ const [isReactionsModalOpen, setIsReactionsModalOpen] = useState(false) const { currentUser } = useAuth() const editorRef = useRef(null) - const canEdit = + const hasPermissionToEdit = currentUser?.sub === userProject.id || currentUser?.roles.includes('admin') const project = userProject?.Project const emotes = countEmotes(project?.Reaction) const userEmotes = project?.userReactions.map(({ emote }) => emote) useEffect(() => { - isEditable && - !canEdit && + isEditing && + !hasPermissionToEdit && navigate( routes.project({ userName: userProject.userName, @@ -55,7 +55,7 @@ const ProjectProfile = ({ const [newDescription, setNewDescription] = useState(project?.description) const onDescriptionChange = (description) => setNewDescription(description()) const onEditSaveClick = () => { - if (isEditable) { + if (isEditing) { onSave(project?.id, { description: newDescription }) return } @@ -108,26 +108,27 @@ const ProjectProfile = ({ className="px-3 py-2 rounded" />
- { - if (!isEditable) { - setIsEditable(true) - } else { - onEditSaveClick() - setIsEditable(false) - } + edit={{ + hasPermissionToEdit, + isEditing, + onEdit: () => { + if (!isEditing) { + setIsEditing(true) + } else { + onEditSaveClick() + setIsEditing(false) + } + }, }} - isEditable={isEditable} >
e?.target?.id === 'description-wrap' && @@ -137,11 +138,11 @@ const ProjectProfile = ({
-
+ }
{new Date(project?.createdAt).toDateString()} @@ -156,10 +157,11 @@ const ProjectProfile = ({ userEmotes={userEmotes} onEmote={onReaction} onShowProjectReactions={() => setIsReactionsModalOpen(true)} + className="" /> - - {!isEditable && ( + { currentUser && + {!isEditing && ( <> {currentUser && ( <> @@ -215,8 +217,8 @@ const ProjectProfile = ({ )} - - {canEdit && ( + } + {hasPermissionToEdit && ( <>

Danger Zone