Skip to content

Commit e504c30

Browse files
committed
dev-check
1 parent 611e93d commit e504c30

4 files changed

Lines changed: 153 additions & 14 deletions

File tree

website/src/pages/documents/document-info.css.ts

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ export const container = style({
1111
export const header = style({
1212
position: "relative",
1313
textAlign: "center",
14-
marginBottom: "32px",
14+
display: "flex",
15+
flexDirection: "column",
16+
alignItems: "center",
17+
gap: "4px",
1518
})
1619

1720
export const editButton = style({
@@ -85,3 +88,53 @@ export const link = style({
8588
color: "#4A90E2",
8689
textDecoration: "underline",
8790
})
91+
92+
export const message = style({
93+
display: "flex",
94+
justifyContent: "center",
95+
alignItems: "center",
96+
position: "fixed",
97+
borderRadius: "8px",
98+
zIndex: 9999,
99+
fontSize: "16px",
100+
background: "white",
101+
color: "#black",
102+
boxShadow: "0 6px 14px rgba(0,0,0,0.3)",
103+
})
104+
105+
export const messageCloseButton = style({
106+
marginLeft: "auto",
107+
display: "flex",
108+
alignItems: "center",
109+
justifyContent: "center",
110+
cursor: "pointer",
111+
})
112+
113+
export const globalMessageOverlay = style({
114+
position: "fixed",
115+
inset: 0,
116+
background: "rgba(0, 0, 0, 0.6)",
117+
display: "flex",
118+
alignItems: "center",
119+
justifyContent: "center",
120+
zIndex: 9999,
121+
})
122+
123+
export const globalMessageBox = style({
124+
background: "white",
125+
padding: "20px 24px",
126+
borderRadius: "10px",
127+
minWidth: "320px",
128+
display: "flex",
129+
justifyContent: "space-between",
130+
alignItems: "center",
131+
gap: "12px",
132+
})
133+
134+
export const success = style({
135+
borderLeft: "6px solid #2ecc71",
136+
})
137+
138+
export const error = style({
139+
borderLeft: "6px solid #e74c3c",
140+
})

website/src/pages/documents/document-info.tsx

Lines changed: 56 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import "@reach/dialog/styles.css"
22
import React, { Fragment } from "react"
33
import { Helmet } from "react-helmet"
4+
import { MdClose } from "react-icons/md"
45
import { unstable_Form as Form } from "reakit"
56
import { useCredentials } from "src/auth"
6-
import { Link } from "src/components"
7+
import { IconButton, Link } from "src/components"
78
import { useForm } from "src/edit-doc-data-form-context"
89
import EditDocPanel, { EditButton } from "src/edit-doc-data-panel"
910
import * as Dailp from "src/graphql/dailp"
@@ -22,7 +23,10 @@ export type TabSegment = Dailp.DocumentMetadataUpdate | Document
2223
export type Document = NonNullable<Dailp.AnnotatedDocumentQuery["document"]>
2324

2425
export 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{" "}

website/src/pages/documents/edit-document-modal.css.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export const overlay = style({
1515

1616
export const modal = style({
1717
backgroundColor: "white",
18+
position: "relative",
1819
borderRadius: "45px",
1920
padding: "32px",
2021
maxWidth: "600px",
@@ -183,3 +184,21 @@ export const addTagButton = style({
183184
},
184185
},
185186
})
187+
188+
export const successBanner = style({
189+
marginTop: "12px",
190+
padding: "10px 12px",
191+
borderRadius: "8px",
192+
backgroundColor: "#e6ffed",
193+
color: "#137333",
194+
fontSize: "14px",
195+
})
196+
197+
export const errorBanner = style({
198+
marginTop: "12px",
199+
padding: "10px 12px",
200+
borderRadius: "8px",
201+
backgroundColor: "#ffe6e6",
202+
color: "#a50e0e",
203+
fontSize: "14px",
204+
})

website/src/pages/documents/edit-document-modal.tsx

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@ import { plugins } from "@citation-js/core"
22
import type React from "react"
33
import { useEffect, useMemo, useState } from "react"
44
import DatePicker from "react-date-picker"
5+
import { MdClose } from "react-icons/md/index"
56
import TextareaAutosize from "react-textarea-autosize"
67
import { v4 as uuidv4 } from "uuid"
8+
import { IconButton } from "src/components"
79
import { form } from "src/edit-word-feature.css"
810
import * as Dailp from "src/graphql/dailp"
911
import { UserRole, useUserRole } from "../../auth"
1012
import { useTagSelector } from "../../hooks/use-tag-selector"
13+
import * as css from "../../mode.css"
1114
import { buildCitationMetadata } from "../../utils/build-citation-metadata"
1215
import Cite from "../../utils/citation-config"
1316
import { Dropdown } from "./dropdown"
@@ -18,7 +21,7 @@ import { TagSelector } from "./tag-selector"
1821
export type EditDocumentModalProps = {
1922
isOpen: boolean
2023
onClose: () => void
21-
onSubmit: (data: any) => void
24+
onSubmit: (data: any) => Promise<{ ok: boolean; error?: string }>
2225
documentMetadata: Dailp.AnnotatedDoc
2326
initialCiteFormat?: string
2427
}
@@ -489,7 +492,7 @@ export const EditDocumentModal: React.FC<EditDocumentModalProps> = ({
489492
setIsEditing(false)
490493
}
491494

492-
const handleSubmit = (e: React.FormEvent) => {
495+
const handleSubmit = async (e: React.FormEvent) => {
493496
e.preventDefault()
494497

495498
// Format date for submission
@@ -573,6 +576,17 @@ export const EditDocumentModal: React.FC<EditDocumentModalProps> = ({
573576
citeFormat: citeFormat,
574577
}
575578

579+
// Return if editing was successful or if there was an error
580+
let result
581+
582+
try {
583+
result = await onSubmit(updatedMetadata)
584+
} catch (err) {
585+
return { ok: false, error: "Network or server error" }
586+
}
587+
588+
return result
589+
576590
// Update backup state to new submitted state
577591
// setBackupState({
578592
// title,
@@ -586,14 +600,21 @@ export const EditDocumentModal: React.FC<EditDocumentModalProps> = ({
586600
// })
587601

588602
// setIsEditing(false)
589-
onSubmit(updatedMetadata)
590603
// onClose()
591604
}
592605

593606
// Pass UUID of the keyword
594607
return (
595608
<div className={styles.overlay}>
596609
<div className={styles.modal} onClick={(e) => e.stopPropagation()}>
610+
<IconButton
611+
className={css.closeButton}
612+
onClick={onClose}
613+
aria-label="Close modal"
614+
>
615+
<MdClose size={32} />
616+
</IconButton>
617+
597618
<h2 className={styles.title}>Editing Document Information</h2>
598619
<p className={styles.subtitle}>* indicates a required field</p>
599620

0 commit comments

Comments
 (0)