diff --git a/src/gitlab_service.js b/src/gitlab_service.js index 7ab0a5c9b9c1924f7d2b58c4f05914f03f21d2c3..86a0bcdd39f42b8bba159344f7ebc9a29afc247a 100644 --- a/src/gitlab_service.js +++ b/src/gitlab_service.js @@ -386,6 +386,29 @@ async function fetchDiscussions(issuable) { return discussions; } +// TODO: Remove project fetch +async function renderMarkdown(markdown) { + let rendered = { html: markdown }; + const [ major ] = version.split('.'); + + if (parseInt(major, 10) < 11) { + return markdown; + } + + try { + const project = await fetchCurrentProject(); + rendered = await fetch('/markdown', 'POST', { + text: markdown, + project: project.path_with_namespace, + gfm: 'true', // Needs to be a string for the API + }); + } catch(e) { + return markdown; + } + + return rendered.html; +}; + exports.fetchUser = fetchUser; exports.fetchIssuesAssignedToMe = fetchIssuesAssignedToMe; exports.fetchIssuesCreatedByMe = fetchIssuesCreatedByMe; @@ -404,3 +427,4 @@ exports.createSnippet = createSnippet; exports.validateCIConfig = validateCIConfig; exports.fetchVersion = fetchVersion; exports.fetchDiscussions = fetchDiscussions; +exports.renderMarkdown = renderMarkdown; diff --git a/src/webview/src/App.vue b/src/webview/src/App.vue index 0bc2ce261d736fefe3e9eff85d0616a770908faf..1117b480e7fcd2e6245547e00bf9536b8287943d 100644 --- a/src/webview/src/App.vue +++ b/src/webview/src/App.vue @@ -2,6 +2,8 @@ import IssuableDetails from './components/IssuableDetails'; import IssuableDiscussions from './components/IssuableDiscussions'; +const vscode = acquireVsCodeApi(); + export default { name: 'app', data() { @@ -15,12 +17,36 @@ export default { IssuableDetails, IssuableDiscussions, }, + computed: { + notesById() { + const notes = {} + + this.discussions.forEach((d) => { + d.notes.forEach((n) => { + notes[n.id] = n; + }); + }); + + notes[this.issuable.id] = this.issuable; + return notes; + }, + }, created() { + window.vsCodeApi = vscode; this.isLoading = true; window.addEventListener('message', event => { - this.issuable = event.data.issuable; - this.isLoading = false; + if (event.data.type === 'issuableFetch') { + this.issuable = event.data.issuable; + this.discussions = event.data.discussions; + this.isLoading = false; + } else if (event.data.type === 'markdownRendered') { + const { ref, key, markdown } = event.data; + const note = this.notesById[ref] || {}; + + note[key] = markdown; + note.markdownRenderedOnServer = true; + } }); }, } @@ -35,6 +61,3 @@ export default { - - diff --git a/src/webview/src/components/IssuableDetails.vue b/src/webview/src/components/IssuableDetails.vue index 7949a63cbb257dd22b2690a982f26781bf71251d..9ebfb7511fdff52b195e0e735ebf8455abeedf12 100644 --- a/src/webview/src/components/IssuableDetails.vue +++ b/src/webview/src/components/IssuableDetails.vue @@ -1,5 +1,6 @@