11import { useState , useMemo , Fragment } from 'react' ;
22import { Transition } from '@headlessui/react'
3+ import { FOAF } from "@inrupt/vocab-common-rdf" ;
4+ import { getUrl , setUrl , isThingLocal } from "@inrupt/solid-client" ;
35
46import NoteEditor from "./NoteEditor" ;
57import ConnectionsPanel from "./ConnectionsPanel" ;
68import { InlineLoader } from './elements'
79import { Share as ShareIcon , ArrowSquareLeft as ArrowSquareLeftIcon } from './icons'
810import { EmptySlateJSON } from "../utils/slate" ;
11+ import { useImageUploadUri } from "../hooks/uris" ;
12+ import { Tooltip } from './elements'
13+ import ImageUploadModal from './modals/ImageUpload'
14+
15+ import { UploadImage } from './icons'
916
1017function CreateNote ( { conceptName, onNoteBodyChange } ) {
1118 return (
@@ -21,36 +28,64 @@ function CreateNote({ conceptName, onNoteBodyChange }) {
2128}
2229
2330export default function ConceptBody ( {
24- concept, note, noteError, conceptPrefix, conceptIndex, myNote,
31+ concept, saveConcept , note, noteError, conceptPrefix, conceptIndex, myNote,
2532 conceptName, tagPrefix, onNoteBodyChange, conceptNames, editorId, panelStartsOpen = false ,
2633 workspaceSlug, webId, authorWebId
2734} ) {
2835 const [ panelOpen , setPanelOpen ] = useState ( panelStartsOpen )
36+ const coverImage = concept && getUrl ( concept , FOAF . img )
37+
38+ const imageUploadUri = useImageUploadUri ( webId )
39+ const [ coverImageUploaderOpen , setCoverImageUploaderOpen ] = useState ( false )
40+ async function setCoverImage ( url ) {
41+ await saveConcept ( setUrl ( concept , FOAF . img , url ) )
42+ setCoverImageUploaderOpen ( false )
43+ }
44+ const isSavedConcept = concept && ! isThingLocal ( concept )
2945 return (
3046
3147 < div className = "relative" >
32- < Transition
33- show = { ! panelOpen } as = { Fragment }
34- as = { Fragment }
35- enter = "transform transition ease-in-out duration-500 sm:duration-700"
36- enterFrom = "translate-x-full"
37- enterTo = "translate-x-0"
38- leave = "transform transition ease-in-out duration-500 sm:duration-700"
39- leaveFrom = "translate-x-0"
40- leaveTo = "translate-x-full"
41- >
42- < button onClick = { ( ) => setPanelOpen ( true ) }
43- className = "absolute top-0 right-0 w-18 h-18 bg-gray-100 rounded-bl-lg flex flex-row py-6 pl-2 pr-4"
48+ { isSavedConcept && (
49+ < Transition
50+ show = { ! panelOpen } as = { Fragment }
51+ enter = "transform transition ease-in-out duration-500 sm:duration-700"
52+ enterFrom = "translate-x-full"
53+ enterTo = "translate-x-0"
54+ leave = "transform transition ease-in-out duration-500 sm:duration-700"
55+ leaveFrom = "translate-x-0"
56+ leaveTo = "translate-x-full"
4457 >
45- < ArrowSquareLeftIcon className = "w-6 h-6" />
46- < ShareIcon className = "w-6 h-6" />
47- </ button >
48- </ Transition >
58+ < button onClick = { ( ) => setPanelOpen ( true ) }
59+ className = "absolute top-0 right-0 w-18 h-18 text-gray-500 hover:text-gray-400 bg-gray-100 rounded-bl-lg flex flex-row py-6 pl-2 pr-4 z-40"
60+ >
61+ < ArrowSquareLeftIcon className = "w-6 h-6 pointer-events-none" />
62+ < ShareIcon className = "w-6 h-6 pointer-events-none" />
63+ </ button >
64+ </ Transition >
65+ ) }
4966
5067 < div className = "flex flex-row w-full" >
51- < div className = { `flex-grow py-6 bg-white p- 18 ${ panelOpen ? 'pr-9 ' : 'pr-18' } ` } >
68+ < div className = { `flex-grow py-6 bg-white pl-6 sm:pl-12 md:pl- 18 ${ panelOpen ? 'pr-12 hidden md:block ' : 'pr-6 sm:pr-12 md: pr-18' } ` } >
5269 { note ? (
53- < NoteEditor myNote = { myNote } editorId = { editorId } note = { note } onNoteBodyChange = { onNoteBodyChange } conceptNames = { conceptNames } />
70+ < div className = "flex-col" >
71+ < div className = { `relative flex flex-row justify-center group overflow-hidden ${ coverImage ? 'h-40' : '' } ` } >
72+ { coverImage && (
73+ < img className = "absolute top-0 left-0 w-full overflow-hidden" src = { coverImage } alt = { conceptName } />
74+ ) }
75+ { myNote && (
76+ < >
77+ < Tooltip content = { < span > Upload Cover Image</ span > } >
78+ < button className = "hover:shadow-menu" onClick = { ( ) => setCoverImageUploaderOpen ( true ) } >
79+ < UploadImage className = "w-6 h-6 text-gray-700 mt-4 opacity-10 group-hover:opacity-90" />
80+ </ button >
81+ </ Tooltip >
82+ < ImageUploadModal open = { coverImageUploaderOpen } setOpen = { setCoverImageUploaderOpen }
83+ onSave = { ( url ) => setCoverImage ( url ) } uploadContainerUri = { imageUploadUri } />
84+ </ >
85+ ) }
86+ </ div >
87+ < NoteEditor myNote = { myNote } editorId = { editorId } note = { note } onNoteBodyChange = { onNoteBodyChange } conceptNames = { conceptNames } />
88+ </ div >
5489 ) : ( noteError ? (
5590 ( webId === authorWebId ) ? (
5691 < CreateNote conceptName = { conceptName } onNoteBodyChange = { onNoteBodyChange } />
@@ -65,20 +100,22 @@ export default function ConceptBody({
65100 ) ) }
66101
67102 </ div >
68- < Transition
69- show = { panelOpen } as = { Fragment }
70- enter = "transform transition ease-in-out duration-500 sm:duration-700"
71- enterFrom = "translate-x-full"
72- enterTo = "translate-x-0"
73- leave = "transform transition ease-in-out duration-500 sm:duration-700"
74- leaveFrom = "translate-x-0"
75- leaveTo = "translate-x-full"
76- >
77- < ConnectionsPanel
78- concept = { concept } conceptName = { conceptName } conceptPrefix = { conceptPrefix } tagPrefix = { tagPrefix }
79- webId = { authorWebId } workspaceSlug = { workspaceSlug } conceptIndex = { conceptIndex }
80- onClose = { ( ) => setPanelOpen ( false ) } />
81- </ Transition >
103+ { isSavedConcept && (
104+ < Transition
105+ show = { panelOpen } as = { Fragment }
106+ enter = "transform transition ease-in-out duration-500 sm:duration-700"
107+ enterFrom = "translate-x-full"
108+ enterTo = "translate-x-0"
109+ leave = "transform transition ease-in-out duration-500 sm:duration-700"
110+ leaveFrom = "translate-x-0"
111+ leaveTo = "translate-x-full"
112+ >
113+ < ConnectionsPanel className = "w-full md:w-auto"
114+ concept = { concept } conceptName = { conceptName } conceptPrefix = { conceptPrefix } tagPrefix = { tagPrefix }
115+ webId = { authorWebId } workspaceSlug = { workspaceSlug } conceptIndex = { conceptIndex }
116+ onClose = { ( ) => setPanelOpen ( false ) } />
117+ </ Transition >
118+ ) }
82119 </ div >
83120 </ div >
84121 )
0 commit comments