Skip to content

Commit

Permalink
* added edit / delete comment + addressed marker behavior in those co…
Browse files Browse the repository at this point in the history
…nditions + bug fixes
  • Loading branch information
nickcastel50 committed Jan 8, 2025
1 parent 3df9b0c commit 48c0401
Show file tree
Hide file tree
Showing 9 changed files with 107 additions and 26 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "bldrs",
"version": "1.0.1226",
"version": "1.0.1231",
"main": "src/index.jsx",
"license": "AGPL-3.0",
"homepage": "https://github.com/bldrs-ai/Share",
Expand Down
3 changes: 2 additions & 1 deletion src/Components/Markers/MarkerControl.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@ export function PlacemarkHandlers() {
// Access markers and the necessary store functions
const markers = useStore((state) => state.markers)
const setSelectedPlaceMarkId = useStore((state) => state.setSelectedPlaceMarkId)
const commentMutatedSignal = useStore((state) => state.commentMutatedSignal)
// eslint-disable-next-line no-unused-vars
const {selectedPlaceMarkInNoteId, cameraHash} = useStore((state) => ({
selectedPlaceMarkInNoteId: state.selectedPlaceMarkInNoteId,
Expand Down Expand Up @@ -232,7 +233,7 @@ export function PlacemarkHandlers() {
})()
// Add markers to the dependency array so useEffect re-runs on markers change
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [markers])
}, [markers, commentMutatedSignal])


// Save a placemark
Expand Down
50 changes: 38 additions & 12 deletions src/Components/Notes/NoteCard.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import Card from '@mui/material/Card'
import CardHeader from '@mui/material/CardHeader'
import NoteBodyEdit from './NoteBodyEdit'
import {useAuth0} from '../../Auth0/Auth0Proxy'
import {updateComment} from '../../net/github/Comments'
import {
closeIssue,
updateIssue,
Expand All @@ -25,6 +26,7 @@ import NoteContent from './NoteContent'
import {HASH_PREFIX_NOTES, HASH_PREFIX_COMMENT} from './hashState'
import NoteFooter from './NoteFooter'
import NoteMenu from './NoteMenu'
import {deleteComment} from '../../net/github/Comments'


/**
Expand Down Expand Up @@ -61,7 +63,6 @@ export default function NoteCard({
const notes = useStore((state) => state.notes)
const repository = useStore((state) => state.repository)
const selectedNoteId = useStore((state) => state.selectedNoteId)
// TODO(pablo)
// const comments = useStore((state) => state.comments)
// const setComments = useStore((state) => state.setComments)
const setNotes = useStore((state) => state.setNotes)
Expand All @@ -81,6 +82,8 @@ export default function NoteCard({

const setEditOriginalBody = useStore((state) => state.setEditOriginalBody)

const signalCommentMutated = useStore((state) => state.signalCommentMutated)


const handleEditBodyChange = (newBody) => {
setEditBody(newBody) // Update local editBody state
Expand Down Expand Up @@ -226,7 +229,7 @@ export default function NoteCard({
*
* @param {number} noteNumber obtained from github issue
*/
async function onDeleteClick(noteNumberToDelete) {
async function onDeleteNote(noteNumberToDelete) {
// TODO(pablo): handle response
const res = await closeIssue(repository, noteNumberToDelete, accessToken)
const updatedNotes = notes.filter((note) => note.number !== noteNumberToDelete)
Expand All @@ -235,6 +238,19 @@ export default function NoteCard({
return res
}

/**
*
*/
async function onDeleteComment(commentID) {
// TODO(nickcastel50): handle response
const NO_CONTENT = 204
const res = await deleteComment(repository, commentID, accessToken)

if (res.status === NO_CONTENT) {
signalCommentMutated()
}
}


/**
* Delete comment from repo and remove from UI
Expand All @@ -256,19 +272,32 @@ export default function NoteCard({


/** Update issue on GH, set read-only */
async function submitUpdate() {
async function submitNoteUpdate() {
const res = await updateIssue(repository, noteNumber, title, editBody, accessToken)
const editedNote = notes.find((note) => note.id === id)
editedNote.body = res.data.body
setNotes(notes)
setEditMode(false)
setEditModeGlobal(id, false)
signalCommentMutated()
}

/**
* Update comment in github
*
* @param {number} commentId
*/
async function submitCommentUpdate(commentId) {
// eslint-disable-next-line no-unused-vars
const updatedComment = await updateComment(repository, commentId, editBody, accessToken)
setEditMode(false)
setEditModeGlobal(commentId, false)
signalCommentMutated()
}


return (
<Card elevation={1} data-testid='note-card' ref={noteCardRef}>
{isNote ?
<CardHeader
title={title}
avatar={<Avatar alt={username} src={avatarUrl}/>}
Expand All @@ -284,19 +313,15 @@ export default function NoteCard({
setEditOriginalBody(id, body)
setEditBodyGlobal(id, body) // Update global editBody state
}}
onDeleteClick={() => onDeleteClick(noteNumber)}
onDeleteClick={() => isNote ? onDeleteNote(noteNumber) : onDeleteComment(id)}
noteNumber={noteNumber}
/>
}
/> :
<CardHeader
avatar={<Avatar alt={username} src={avatarUrl}/>}
subheader={`${username}\n${dateParts[0]} ${dateParts[1]}`}
/>}
/>
{isNote && !editMode && !selected &&
<NoteBody selectCard={selectCard} markdownContent={editBody} issueID={id} commentID={null}/>}
{selected && !editMode && <NoteContent markdownContent={editBody}/>}
{!isNote && <NoteContent markdownContent={editBody} issueID={selectedNoteId} commentID={id}/>}
{!isNote && !editMode && <NoteContent markdownContent={editBody} issueID={selectedNoteId} commentID={id}/>}
{editMode &&
<NoteBodyEdit
handleTextUpdate={(event) => handleEditBodyChange(event.target.value)}
Expand All @@ -319,7 +344,8 @@ export default function NoteCard({
onClickShare={isNote ? shareIssue : shareComment}
selectCard={selectCard}
selected={selected}
submitUpdate={submitUpdate}
submitNoteUpdate={submitNoteUpdate}
submitCommentUpdate={submitCommentUpdate}
synched={synched}
username={username}
/>
Expand Down
3 changes: 3 additions & 0 deletions src/Components/Notes/NoteContent.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {HASH_PREFIX_NOTES, HASH_PREFIX_COMMENT} from './hashState'
*/
export default function NoteContent({markdownContent, issueID, commentID}) {
const setSelectedPlaceMarkInNoteIdData = useStore((state) => state.setSelectedPlaceMarkInNoteIdData)
const setSelectedPlaceMarkId = useStore((state) => state.setSelectedPlaceMarkId)

// eslint-disable-next-line no-unused-vars
const {selectedPlaceMarkInNoteId, cameraHash, forceMarkerNoteSync} = useStore((state) => ({
Expand Down Expand Up @@ -62,6 +63,7 @@ export default function NoteContent({markdownContent, issueID, commentID}) {
if (params) {
const cameraHash_ = getHashParamsFromHashStr(url.hash, HASH_PREFIX_CAMERA)
setSelectedPlaceMarkInNoteIdData(params[0], cameraHash_, !forceMarkerNoteSync)
setSelectedPlaceMarkId(Number(params[0]))
event.preventDefault() // Prevent the default navigation
}
} else if (noteHash) {
Expand All @@ -70,6 +72,7 @@ export default function NoteContent({markdownContent, issueID, commentID}) {
if (params) {
const cameraHash_ = getHashParamsFromHashStr(url.hash, HASH_PREFIX_CAMERA)
setSelectedPlaceMarkInNoteIdData(params[0], cameraHash_, !forceMarkerNoteSync)
setSelectedPlaceMarkId(Number(params[0]))
event.preventDefault() // Prevent the default navigation
}
}
Expand Down
39 changes: 31 additions & 8 deletions src/Components/Notes/NoteFooter.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ export default function NoteFooter({
selectCard,
selected,
showCreateComment,
submitUpdate,
submitNoteUpdate,
submitCommentUpdate,
synched,
username,
}) {
Expand All @@ -54,6 +55,7 @@ export default function NoteFooter({
const placeMarkActivated = useStore((state) => state.placeMarkActivated)
const markers = useStore((state) => state.markers)
const {togglePlaceMarkActive} = placemarkHandlers()
const selectedPlaceMarkId = useStore((state) => state.selectedPlaceMarkId)

const [shareIssue, setShareIssue] = useState(false)
const [screenshotUri, setScreenshotUri] = useState(null)
Expand All @@ -71,8 +73,31 @@ export default function NoteFooter({
'_blank')
}

const marker = markers.find((m) => m.id === id)
const hasActiveMarker = marker ? marker.isActive : false // Check isActive only if the marker is found
/** Navigate to github comment */
function openGithubComment() {
window.open(
`https://github.com/${repository.orgName}/${repository.name}/issues/${noteNumber}#issuecomment-${id}`,
'_blank')
}

let marker = null
marker = markers.find((m) => m.id === id)

if (!marker) {
// check comment IDs
marker = markers.find((m) => m.commentId === id)
}

let hasActiveMarker = false

if (marker) {
if (marker.commentId !== null) {
hasActiveMarker = marker ? marker.commentId === selectedPlaceMarkId : false
} else {
hasActiveMarker = marker ? marker.id === selectedPlaceMarkId : false
}
}


return (
<CardActions>
Expand Down Expand Up @@ -100,7 +125,7 @@ export default function NoteFooter({
</Box>
}

{isNote && selected && synched &&
{((isNote && selected) || !isNote) && synched &&
user && user.nickname === username &&
<Box
sx={{
Expand Down Expand Up @@ -155,7 +180,7 @@ export default function NoteFooter({
title='Save'
placement='left'
icon={<CheckIcon className='icon-share'/>}
onClick={() => submitUpdate(repository, accessToken, id)}
onClick={() => isNote ? submitNoteUpdate(id) : submitCommentUpdate(id)}
/>
<TooltipIconButton
title='Cancel'
Expand Down Expand Up @@ -196,15 +221,13 @@ export default function NoteFooter({
}
</Stack>
<Stack direction='row'>
{isNote &&
<TooltipIconButton
title='Open in Github'
size='small'
placement='bottom'
onClick={openGithubIssue}
onClick={isNote ? openGithubIssue : openGithubComment}
icon={<GitHubIcon className='icon-share'/>}
/>
}

{selected &&
<TooltipIconButton
Expand Down
11 changes: 8 additions & 3 deletions src/Components/Notes/Notes.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ export default function Notes() {
const repository = useStore((state) => state.repository)
const selectedNoteId = useStore((state) => state.selectedNoteId)
const setComments = useStore((state) => state.setComments)
const commentMutatedSignal = useStore((state) => state.commentMutatedSignal)

// Access markers and the necessary store functions
const markers = useStore((state) => state.markers)
Expand Down Expand Up @@ -103,20 +104,23 @@ export default function Notes() {

if (issueMarker) {
issueMarker.isActive = !(hasActiveMarker)
if (issueMarker.isActive) {
setSelectedPlaceMarkId(issueMarker.id)
}
}
const allMarkers = issueMarker ? [issueMarker, ...commentMarkers] : commentMarkers

// Update state with new comments and markers
setComments(newComments)
toggleSynchSidebar()
writeMarkers(allMarkers) // Assuming `setMarkers` is a function in your store or component state to update markers
writeMarkers(allMarkers)
} catch (e) {
debug().warn('failed to fetch comments: ', e)
handleError(e)
}
})()
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [selectedNote])
}, [selectedNote, commentMutatedSignal])


/**
Expand Down Expand Up @@ -158,7 +162,7 @@ export default function Notes() {
if (activePlaceMarkHash && hash.startsWith(activePlaceMarkHash)) {
activePlaceMarkHash = newHash
isActive = true
setSelectedPlaceMarkId(selectedNoteId)
setSelectedPlaceMarkId(comment.id)
}

return {
Expand Down Expand Up @@ -258,6 +262,7 @@ export default function Notes() {
username={comment.username}
avatarUrl={comment.avatarUrl}
synched={comment.synched}
noteNumber={selectedNote.number}
/>
</ListItem>
)
Expand Down
4 changes: 4 additions & 0 deletions src/Components/Notes/NotesControl.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ export default function NotesControl() {
let activePlaceMarkHash = getActivePlaceMarkHash()
const inactiveColor = MARKER_COLOR_INACTIVE
const activeColor = MARKER_COLOR_ACTIVE
const setSelectedPlaceMarkId = useStore((state) => state.setSelectedPlaceMarkId)


// Fetch issues/notes
Expand Down Expand Up @@ -116,6 +117,8 @@ export default function NotesControl() {
parseFloat(lastElement),
]

setSelectedPlaceMarkId('temporary')

return {
id: 'temporary',
commentId: null,
Expand Down Expand Up @@ -160,6 +163,7 @@ export default function NotesControl() {
if (activePlaceMarkHash && hash.startsWith(activePlaceMarkHash)) {
activePlaceMarkHash = newHash
isActive = true
setSelectedPlaceMarkId(issue.id)
}

return {
Expand Down
19 changes: 18 additions & 1 deletion src/net/github/Comments.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {assertDefined} from '../../utils/assert'
import {getGitHub, postGitHub, deleteGitHub} from './Http'
import {getGitHub, postGitHub, deleteGitHub, patchGitHub} from './Http'


/**
Expand Down Expand Up @@ -57,3 +57,20 @@ export async function deleteComment(repository, commentId, accessToken) {
assertDefined(...arguments)
return await deleteGitHub(repository, `issues/comments/{commentId}`, {commentId}, accessToken)
}

/**
* @param {object} repository - Repository object containing orgName and name.
* @param {number} commentId - ID of the comment to be updated.
* @param {string} body - New body of the comment.
* @param {string} accessToken - GitHub access token.
* @return {object} response from GitHub.
*/
export async function updateComment(repository, commentId, body, accessToken) {
assertDefined(...arguments)

const args = {
body,
}

return await patchGitHub(repository, `issues/comments/${commentId}`, args, accessToken)
}
2 changes: 2 additions & 0 deletions src/store/NotesSlice.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ export default function createNotesSlice(set, get) {

comments: [],
setComments: (comments) => set(() => ({comments: comments})),
commentMutatedSignal: false,
signalCommentMutated: () => set((state) => ({commentMutatedSignal: !state.commentMutatedSignal})),

createdNotes: null,
setCreatedNotes: (createdNotes) => set(() => ({createdNotes: createdNotes})),
Expand Down

0 comments on commit 48c0401

Please sign in to comment.