diff --git a/src/renderer/components/merge-requests/MergeRequestsPage.tsx b/src/renderer/components/merge-requests/MergeRequestsPage.tsx index c74115c..8d23a93 100644 --- a/src/renderer/components/merge-requests/MergeRequestsPage.tsx +++ b/src/renderer/components/merge-requests/MergeRequestsPage.tsx @@ -17,6 +17,7 @@ const renderMergeRequest = (mergeRequest: MergeRequest) => { const time = moment(mergeRequest.updated_at).format('DD.MM. HH:mm') const assignee = mergeRequest.assignee ? ` — ${mergeRequest.assignee.name}` : '' const secondaryText = `${time} ${assignee}` + const commentCount = mergeRequest.user_notes.all ? `${mergeRequest.user_notes.resolved}/${mergeRequest.user_notes.all}` : undefined return ( { stats={{ downVotes: mergeRequest.downvotes, upVotes: mergeRequest.upvotes, - commentCount: mergeRequest.user_notes_count, + commentCount, pipelineStatus: mergeRequest.pipeline_status, }} onClick={openMergeRequest(mergeRequest.web_url)} diff --git a/src/renderer/components/merge-requests/list/MergeRequestItem.tsx b/src/renderer/components/merge-requests/list/MergeRequestItem.tsx index b40b62c..634d005 100644 --- a/src/renderer/components/merge-requests/list/MergeRequestItem.tsx +++ b/src/renderer/components/merge-requests/list/MergeRequestItem.tsx @@ -7,7 +7,7 @@ import { Stats } from './Stats' interface MergeRequestItemStats { upVotes: number downVotes: number - commentCount: number + commentCount?: string pipelineStatus?: PipelineStatus } diff --git a/src/renderer/components/merge-requests/list/Stats.tsx b/src/renderer/components/merge-requests/list/Stats.tsx index 9857047..d08c41d 100644 --- a/src/renderer/components/merge-requests/list/Stats.tsx +++ b/src/renderer/components/merge-requests/list/Stats.tsx @@ -11,7 +11,7 @@ import { PipelineStatusIndicator } from './PipelineStatusIndicator' export interface StatsProps { upVotes: number downVotes: number - commentCount: number + commentCount?: string pipelineStatus?: PipelineStatus } @@ -21,7 +21,7 @@ export const Stats: React.FunctionComponent = ({ upVotes, downVotes, { count: downVotes, Icon: ThumbDownIcon }, { count: commentCount, Icon: CommentIcon }, ] - .filter(({ count }) => count > 0) + .filter(({ count }) => count) .map(({ count, Icon }) => ( <> diff --git a/src/renderer/hooks/merge-requests/loadData.ts b/src/renderer/hooks/merge-requests/loadData.ts index 8667520..b38d9e9 100644 --- a/src/renderer/hooks/merge-requests/loadData.ts +++ b/src/renderer/hooks/merge-requests/loadData.ts @@ -1,7 +1,7 @@ import * as request from 'superagent' import { Config } from '../config' -import { Group, GroupedMergeRequest, MergeRequest, MergeRequestWithProject, PipelineStatus, Project } from './types' +import { Group, GroupedMergeRequest, MergeRequest, MergeRequestWithProject, Note, PipelineStatus, Project, UserNotesStatus } from './types' import sleep from '../../util/sleep' const projectCache: { [id: number]: Project } = {} @@ -96,6 +96,7 @@ const loadMergeRequests = async (config: Config): Promise => { return { ...mergeRequest, pipeline_status: await loadPipelineStatus(config, mergeRequest.project_id, mergeRequest.iid), + user_notes: await loadUserNotes(config, mergeRequest.project_id, mergeRequest.iid), } }), ) @@ -104,6 +105,24 @@ const loadMergeRequests = async (config: Config): Promise => { ) } +const loadUserNotes = async (config: Config, projectId: number, mergeRequestIid: number): Promise => { + const apiUrl = `${config.url}/api/v4/projects/${projectId}/merge_requests/${mergeRequestIid}/notes` + + const notes = await request + .get(apiUrl) + .set('Private-Token', config.token) + .timeout(4000) + .then(res => res.body as Note[]) + + const all = notes.filter(note => note.resolvable).length + const resolved = notes.filter(note => note.resolved).length + + return { + all, + resolved, + } +} + const loadPipelineStatus = async (config: Config, projectId: number, mergeRequestIid: number): Promise => { const apiUrl = `${config.url}/api/v4/projects/${projectId}/merge_requests/${mergeRequestIid}/pipelines` diff --git a/src/renderer/hooks/merge-requests/testData.ts b/src/renderer/hooks/merge-requests/testData.ts index 307e44f..e80f3ad 100644 --- a/src/renderer/hooks/merge-requests/testData.ts +++ b/src/renderer/hooks/merge-requests/testData.ts @@ -8,13 +8,13 @@ const users: User[] = [ id: 1, name: 'Matthias', username: 'ruettenm', - avatar_url: require('../../images/matthias.jpg'), + avatar_url: require('../../images/matthias.jpg').default, }, { id: 2, name: 'Julian', username: 'jukempff', - avatar_url: require('../../images/julian.jpg'), + avatar_url: require('../../images/julian.jpg').default, }, ] @@ -39,7 +39,10 @@ const createMr = (title: string, projectId: number): MergeRequest => { assignee: randomArrayEntry(users), source_project_id: projectId, work_in_progress: false, - user_notes_count: randomArrayEntry([0, 0, 0, 0, 0, 1, 3, 5]), + user_notes: { + all: randomArrayEntry([3, 5]), + resolved: randomArrayEntry([1, 2, 3]), + }, web_url: `https://www.google.de?q=mr-${mrId}`, pipeline_status: randomArrayEntry(['running', 'pending', 'success', 'failed']), } diff --git a/src/renderer/hooks/merge-requests/types.d.ts b/src/renderer/hooks/merge-requests/types.d.ts index ac86eb0..12f67e6 100644 --- a/src/renderer/hooks/merge-requests/types.d.ts +++ b/src/renderer/hooks/merge-requests/types.d.ts @@ -16,6 +16,11 @@ export interface User { export type PipelineStatus = 'running' | 'pending' | 'success' | 'failed' +export interface UserNotesStatus { + all: number + resolved: number +} + export interface Group { id: number name: string @@ -24,6 +29,17 @@ export interface Group { visibility: 'private' | 'internal' | 'public' } +export interface Note { + id: number + noteable_id: number + noteable_iid: number + type: null + author: User + resolvable: boolean + resolved?: boolean + resolved_by?: User +} + export interface MergeRequest { id: number iid: number @@ -40,8 +56,8 @@ export interface MergeRequest { assignee?: User source_project_id: number work_in_progress: boolean - user_notes_count: number web_url: string + user_notes: UserNotesStatus pipeline_status?: PipelineStatus }