import { useState, useEffect, useRef, lazy, Suspense } from 'react'
import { useAuth } from '@redwoodjs/auth'
import { Link, navigate, routes } from '@redwoodjs/router'
import Editor from 'rich-markdown-editor'
import Dialog from '@material-ui/core/Dialog'
import ConfirmDialog from 'src/components/ConfirmDialog/ConfirmDialog'
import EmojiReaction from 'src/components/EmojiReaction/EmojiReaction'
import Button from 'src/components/Button/Button'
import ProjectReactionsCell from '../ProjectReactionsCell'
import { countEmotes } from 'src/helpers/emote'
import { getActiveClasses } from 'get-active-classes'
import IdeHeader from 'src/components/IdeHeader/IdeHeader'
import CadPackage from 'src/components/CadPackage/CadPackage'
import Gravatar from 'src/components/Gravatar/Gravatar'
import { useIdeInit } from 'src/components/EncodedUrl/helpers'
import ProfileViewer from '../ProfileViewer/ProfileViewer'
import Svg from 'src/components/Svg/Svg'
import OpenscadStaticImageMessage from 'src/components/OpenscadStaticImageMessage/OpenscadStaticImageMessage'
const KeyValue = ({
keyName,
children,
hide = false,
canEdit = false,
onEdit,
isEditable = false,
}: {
keyName: string
children: React.ReactNode
hide?: boolean
canEdit?: boolean
onEdit?: () => void
isEditable?: boolean
}) => {
if (!children || hide) return null
return (
{keyName}
{canEdit &&
(isEditable ? (
Update
) : (
))}
{children}
)
}
const ProjectProfile = ({
userProject,
onSave,
onDelete,
onReaction,
onComment,
}) => {
const [comment, setComment] = useState('')
const [isEditable, setIsEditable] = useState(false)
const onCommentClear = () => {
onComment(comment)
setComment('')
}
const [isConfirmDialogOpen, setIsConfirmDialogOpen] = useState(false)
const [isReactionsModalOpen, setIsReactionsModalOpen] = useState(false)
const { currentUser } = useAuth()
const editorRef = useRef(null)
const canEdit =
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 &&
navigate(
routes.project({
userName: userProject.userName,
projectTitle: project?.title,
})
)
}, [currentUser])
useIdeInit(project?.cadPackage, project?.code)
const [newDescription, setNewDescription] = useState(project?.description)
const onDescriptionChange = (description) => setNewDescription(description())
const onEditSaveClick = () => {
if (isEditable) {
onSave(project?.id, { description: newDescription })
return
}
navigate(
routes.editProject({
userName: userProject?.userName,
projectTitle: project?.title,
})
)
}
return (
<>
{}}
projectTitle={project?.title}
projectOwner={userProject?.userName}
projectOwnerImage={userProject?.image}
projectOwnerId={userProject?.id}
projectId={project?.id}
/>
{/* Viewer */}
{/* Side panel */}
{project?.title.replace(/-/g, ' ')}
Built with
{
if (!isEditable) {
setIsEditable(true)
} else {
onEditSaveClick()
setIsEditable(false)
}
}}
isEditable={isEditable}
>
e?.target?.id === 'description-wrap' &&
editorRef?.current?.focusAtEnd()
}
>
{new Date(project?.createdAt).toDateString()}
{new Date(project?.updatedAt).toDateString()}
setIsReactionsModalOpen(true)}
/>
{!isEditable && (
<>
{currentUser && (
<>
Comment
>
)}
{project?.Comment.map(
({ text, user, id, createdAt }) => (
{user?.userName}
{new Date(createdAt).toDateString()}
{text}
)
)}
>
)}
{canEdit && (
<>
Danger Zone
setIsConfirmDialogOpen(true)}
>
Delete Project
>
)}
setIsConfirmDialogOpen(false)}
onConfirm={onDelete}
message="Are you sure you want to delete? This action cannot be undone."
/>
setIsReactionsModalOpen(false)}
fullWidth={true}
maxWidth={'sm'}
>
>
)
}
export default ProjectProfile