Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/renderer/components/merge-requests/MergeRequestsPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
<MergeRequestItem
Expand All @@ -27,7 +28,7 @@ const renderMergeRequest = (mergeRequest: MergeRequest) => {
stats={{
downVotes: mergeRequest.downvotes,
upVotes: mergeRequest.upvotes,
commentCount: mergeRequest.user_notes_count,
commentCount,
pipelineStatus: mergeRequest.pipeline_status,
}}
onClick={openMergeRequest(mergeRequest.web_url)}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { Stats } from './Stats'
interface MergeRequestItemStats {
upVotes: number
downVotes: number
commentCount: number
commentCount?: string
pipelineStatus?: PipelineStatus
}

Expand Down
4 changes: 2 additions & 2 deletions src/renderer/components/merge-requests/list/Stats.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { PipelineStatusIndicator } from './PipelineStatusIndicator'
export interface StatsProps {
upVotes: number
downVotes: number
commentCount: number
commentCount?: string
pipelineStatus?: PipelineStatus
}

Expand All @@ -21,7 +21,7 @@ export const Stats: React.FunctionComponent<StatsProps> = ({ upVotes, downVotes,
{ count: downVotes, Icon: ThumbDownIcon },
{ count: commentCount, Icon: CommentIcon },
]
.filter(({ count }) => count > 0)
.filter(({ count }) => count)
.map(({ count, Icon }) => (
<>
<Icon style={{ fontSize: '0.6rem', verticalAlign: 'middle' }} fontSize='small' />
Expand Down
21 changes: 20 additions & 1 deletion src/renderer/hooks/merge-requests/loadData.ts
Original file line number Diff line number Diff line change
@@ -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 } = {}
Expand Down Expand Up @@ -96,6 +96,7 @@ const loadMergeRequests = async (config: Config): Promise<MergeRequest[]> => {
return {
...mergeRequest,
pipeline_status: await loadPipelineStatus(config, mergeRequest.project_id, mergeRequest.iid),
user_notes: await loadUserNotes(config, mergeRequest.project_id, mergeRequest.iid),
}
}),
)
Expand All @@ -104,6 +105,24 @@ const loadMergeRequests = async (config: Config): Promise<MergeRequest[]> => {
)
}

const loadUserNotes = async (config: Config, projectId: number, mergeRequestIid: number): Promise<UserNotesStatus> => {
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<PipelineStatus | undefined> => {
const apiUrl = `${config.url}/api/v4/projects/${projectId}/merge_requests/${mergeRequestIid}/pipelines`

Expand Down
9 changes: 6 additions & 3 deletions src/renderer/hooks/merge-requests/testData.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
},
]

Expand All @@ -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']),
}
Expand Down
18 changes: 17 additions & 1 deletion src/renderer/hooks/merge-requests/types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
}

Expand Down