11import "@reach/dialog/styles.css"
22import React , { Fragment } from "react"
33import { Helmet } from "react-helmet"
4+ import { MdClose } from "react-icons/md"
45import { unstable_Form as Form } from "reakit"
56import { useCredentials } from "src/auth"
6- import { Link } from "src/components"
7+ import { IconButton , Link } from "src/components"
78import { useForm } from "src/edit-doc-data-form-context"
89import EditDocPanel , { EditButton } from "src/edit-doc-data-panel"
910import * as Dailp from "src/graphql/dailp"
@@ -22,7 +23,10 @@ export type TabSegment = Dailp.DocumentMetadataUpdate | Document
2223export type Document = NonNullable < Dailp . AnnotatedDocumentQuery [ "document" ] >
2324
2425export const DocumentInfo = ( { doc } : { doc : Document } ) => {
26+ const isBrowser = typeof window !== "undefined"
27+
2528 const [ { data } , reexecuteQuery ] = Dailp . useDocumentDetailsQuery ( {
29+ pause : ! isBrowser ,
2630 variables : { slug : doc . slug ! } ,
2731 } )
2832 const token = useCredentials ( )
@@ -40,6 +44,12 @@ export const DocumentInfo = ({ doc }: { doc: Document }) => {
4044 return "apa"
4145 } )
4246
47+ // Success/failure message for editing metadata
48+ const [ message , setMessage ] = React . useState < null | {
49+ type : "success" | "error"
50+ message : string
51+ } > ( null )
52+
4353 const docData : Dailp . AnnotatedDoc = data ?. document as Dailp . AnnotatedDoc
4454
4555 // if (!docData) {
@@ -133,10 +143,31 @@ export const DocumentInfo = ({ doc }: { doc: Document }) => {
133143 } )
134144
135145 await reexecuteQuery ( { requestPolicy : "network-only" } )
146+
136147 setIsEditing ( false )
148+
149+ setTimeout ( ( ) => {
150+ setMessage ( {
151+ type : "success" ,
152+ message : "Metadata updated successfully!" ,
153+ } )
154+ } , 250 )
155+
156+ return { ok : true }
137157 } catch ( error ) {
138- console . error ( "Failed to update document:" , error )
139158 setIsEditing ( false )
159+
160+ setTimeout ( ( ) => {
161+ setMessage ( {
162+ type : "error" ,
163+ message : "Failed to update metadata." ,
164+ } )
165+ } , 250 )
166+
167+ return {
168+ ok : false ,
169+ error : "Failed to update metadata." ,
170+ }
140171 }
141172 }
142173
@@ -204,6 +235,8 @@ export const DocumentInfo = ({ doc }: { doc: Document }) => {
204235 < p className = { styles . subtitle } >
205236 { /* {docData.uploadedAt && `Uploaded ${new Date(docData.uploadedAt).toLocaleDateString()}` }
206237 {docData.editedAt && ` • Last Edited ${new Date(docData.editedAt).toLocaleDateString()}` } */ }
238+
239+ { token && ! isEditing && < EditButton /> }
207240 </ p >
208241 </ div >
209242
@@ -319,14 +352,7 @@ export const DocumentInfo = ({ doc }: { doc: Document }) => {
319352 { /* If the user is logged in, then display an edit button on the word
320353 panel along with its corresponding formatted header. Otherwise, display
321354 the normal word panel. */ }
322- { token ? (
323- < >
324- { ! isEditing && < > { metadataDisplay } </ > }
325- < EditButton />
326- </ >
327- ) : (
328- < > { metadataDisplay } </ >
329- ) }
355+ { ! isEditing && metadataDisplay }
330356
331357 { isEditing ? (
332358 < EditDocumentModal
@@ -347,6 +373,26 @@ export const DocumentInfo = ({ doc }: { doc: Document }) => {
347373 < Fragment >
348374 { panel }
349375
376+ { message && (
377+ < div className = { styles . globalMessageOverlay } >
378+ < div
379+ className = { `${ styles . globalMessageBox } ${
380+ message . type === "success" ? styles . success : styles . error
381+ } `}
382+ >
383+ < span > { message . message } </ span >
384+
385+ < IconButton
386+ className = { styles . messageCloseButton }
387+ onClick = { ( ) => setMessage ( null ) }
388+ aria-label = "Close message"
389+ >
390+ < MdClose size = { 18 } />
391+ </ IconButton >
392+ </ div >
393+ </ div >
394+ ) }
395+
350396 { docData . sources && docData . sources . length > 0 ? (
351397 < section className = { fullWidth } >
352398 Original document provided courtesy of{ " " }
0 commit comments