+
+
+
+
+ (
+
+
+ {c}
+
+
+ )}
+ >
+ { member ? : "Avatar not found"}
+
+
+
+ (
+
+ {children}
+
+ )}
+ >
+
+ {conv?.username || 'username not found'}
+
+
+
+
+
+
+
+
+
+
+
-
+
)
}
diff --git a/moon/apps/web/components/MrView/MergedItem.tsx b/moon/apps/web/components/MrView/MergedItem.tsx
new file mode 100644
index 000000000..83d5ac79c
--- /dev/null
+++ b/moon/apps/web/components/MrView/MergedItem.tsx
@@ -0,0 +1,21 @@
+import { Conversation } from '@/pages/[org]/mr/[id]'
+import HandleTime from './components/HandleTime'
+
+interface MergedItemProps {
+ conv: Conversation
+}
+const MergedItem = ({ conv }: MergedItemProps) => {
+
+ return (
+ <>
+
+
Merged via the queue into main
+
+
+
+
+ >
+ )
+}
+
+export default MergedItem
diff --git a/moon/apps/web/components/MrView/ReopenItem.tsx b/moon/apps/web/components/MrView/ReopenItem.tsx
new file mode 100644
index 000000000..804c4c7a2
--- /dev/null
+++ b/moon/apps/web/components/MrView/ReopenItem.tsx
@@ -0,0 +1,42 @@
+import { ConditionalWrap } from '@gitmono/ui'
+import { useGetOrganizationMember } from '@/hooks/useGetOrganizationMember'
+import { Conversation } from '@/pages/[org]/mr/[id]'
+import { MemberHovercard } from '../InlinePost/MemberHovercard'
+import { MemberAvatar } from '../MemberAvatar'
+import { UserLinkByName } from './components/UserLinkByName'
+import HandleTime from './components/HandleTime'
+
+
+interface ReopenItemProps {
+ conv: Conversation
+}
+const ReopenItem = ({ conv }: ReopenItemProps) => {
+ const { data: member } = useGetOrganizationMember({ username: conv.username })
+
+ return (
+ <>
+
+
+ (
+
+
+ {c}
+
+
+ )}
+ >
+ {member ? : 'Avatar not found'}
+
+
+
{conv.comment}
+
+
+
+
+ >
+ )
+}
+
+export default ReopenItem
diff --git a/moon/apps/web/components/MrView/TimelineItems.tsx b/moon/apps/web/components/MrView/TimelineItems.tsx
index d45341bf4..93bc6e43f 100644
--- a/moon/apps/web/components/MrView/TimelineItems.tsx
+++ b/moon/apps/web/components/MrView/TimelineItems.tsx
@@ -1,10 +1,12 @@
import React from 'react'
import '@primer/primitives/dist/css/functional/themes/light.css'
import { BaseStyles, ThemeProvider, Timeline } from '@primer/react'
-import { FeedPullRequestClosedIcon, CommentIcon, FeedMergedIcon, IssueReopenedIcon } from '@primer/octicons-react'
+import { FeedPullRequestClosedIcon, CommentIcon, FeedMergedIcon, FeedPullRequestOpenIcon } from '@primer/octicons-react'
import MRComment from '@/components/MrView/MRComment';
-import { formatDistance, fromUnixTime } from 'date-fns';
import { MRDetail } from '@/pages/[org]/mr/[id]';
+import CloseItem from './CloseItem';
+import ReopenItem from './ReopenItem';
+import MergedItem from './MergedItem';
interface TimelineItemProps {
badge?: React.ReactNode
@@ -69,19 +71,18 @@ const TimelineItems: React.FC<{ mrDetail?: MRDetail, id: string }> = ({ mrDetail
break;
case 'Merged':
icon =
;
- children =
- 'Merged via the queue into main ' +
- formatDistance(fromUnixTime(conv.created_at), new Date(), { addSuffix: true });
+ children =
;
isOver = true;
break;
case 'Closed':
- icon =
;
- children = conv.comment;
+ icon =
;
+ children =
;
isOver = true;
break;
case 'Reopen':
- icon = ;
- children = conv.comment;
+ icon =
+ children = ;
break;
}
diff --git a/moon/apps/web/components/MrView/components/HandleTime.tsx b/moon/apps/web/components/MrView/components/HandleTime.tsx
new file mode 100644
index 000000000..de3529f31
--- /dev/null
+++ b/moon/apps/web/components/MrView/components/HandleTime.tsx
@@ -0,0 +1,25 @@
+import { format, formatDistance, fromUnixTime } from 'date-fns'
+import { Tooltip } from '@gitmono/ui'
+
+interface HandleTimeProps {
+ created_at: number
+}
+
+const HandleTime = ({ created_at }: HandleTimeProps) => {
+ const time = formatDistance(fromUnixTime(created_at), new Date(), { addSuffix: true })
+ const formatTimestamp = (timestamp: number) => {
+ const date = timestamp > 1e12 ? fromUnixTime(Math.floor(timestamp / 1000)) : fromUnixTime(timestamp)
+
+ return format(date, 'yyyy-MM-dd HH:mm:ss')
+ }
+
+ return (
+ <>
+
+ {time}
+
+ >
+ )
+}
+
+export default HandleTime
diff --git a/moon/apps/web/components/MrView/components/UserLinkByName.tsx b/moon/apps/web/components/MrView/components/UserLinkByName.tsx
new file mode 100644
index 000000000..a0c758237
--- /dev/null
+++ b/moon/apps/web/components/MrView/components/UserLinkByName.tsx
@@ -0,0 +1,18 @@
+import { Link, LinkProps } from '@gitmono/ui/Link'
+import { useScope } from '@/contexts/scope'
+
+export function UserLinkByName({
+ username,
+ children,
+ ...linkProps
+}: Omit & { username: string; children: React.ReactNode }) {
+ const { scope } = useScope()
+
+ if(!username) return <>{children}>
+
+ return (
+
+ {children}
+
+ )
+}
\ No newline at end of file
diff --git a/moon/apps/web/hooks/issues/useGetIssueDetail.ts b/moon/apps/web/hooks/issues/useGetIssueDetail.ts
index 4b06108e0..815cfec72 100644
--- a/moon/apps/web/hooks/issues/useGetIssueDetail.ts
+++ b/moon/apps/web/hooks/issues/useGetIssueDetail.ts
@@ -4,11 +4,11 @@ import { legacyApiClient } from '@/utils/queryClient'
interface conversations {
id: number
- user_id: number
conv_type: string
comment: string
created_at: number
updated_at: number
+ username: string
}
interface raw {
@@ -22,7 +22,7 @@ interface raw {
interface issueDetail {
status: string
- conversations: { id: number; user_id: number; conv_type: string; comment: string; created_at: number }[]
+ conversations: conversations[]
title: string
}
diff --git a/moon/apps/web/pages/[org]/mr/[id].tsx b/moon/apps/web/pages/[org]/mr/[id].tsx
index 938c4f392..a9ca0dc19 100644
--- a/moon/apps/web/pages/[org]/mr/[id].tsx
+++ b/moon/apps/web/pages/[org]/mr/[id].tsx
@@ -23,9 +23,11 @@ import { trimHtml } from '@/utils/trimHtml'
import { toast } from 'react-hot-toast'
import { ComposerReactionPicker } from '@/components/Reactions/ComposerReactionPicker';
import { useUploadHelpers } from '@/hooks/useUploadHelpers';
-import { CommentDiscussionIcon, FileDiffIcon } from '@primer/octicons-react'
+import { CommentDiscussionIcon, FileDiffIcon, ChecklistIcon } from '@primer/octicons-react'
import TimelineItems from '@/components/MrView/TimelineItems';
+const { UnderlinePanels } = require('@primer/react/experimental')
+
export interface MRDetail {
status: string,
conversations: Conversation[],
@@ -33,10 +35,11 @@ export interface MRDetail {
}
export interface Conversation {
id: number,
- user_id: number,
conv_type: string,
comment: string,
created_at: number,
+ updated_at: number,
+ username: string,
}
const MRDetailPage:PageWithLayout = () =>{
@@ -48,7 +51,6 @@ const MRDetailPage:PageWithLayout = () =>{
const id = typeof tempId === 'string' ? tempId : '';
const { data: MrDetailData, isLoading: detailIsLoading } = useGetMrDetail(id)
const mrDetail = MrDetailData?.data as MRDetail | undefined
- const { UnderlinePanels } = require('@primer/react/experimental')
if (mrDetail && typeof mrDetail.status === 'string') {
mrDetail.status = mrDetail.status.toLowerCase();
@@ -121,6 +123,7 @@ const MRDetailPage:PageWithLayout = () =>{
Conversation
+ Checks
Files Changed
@@ -205,6 +208,9 @@ const MRDetailPage:PageWithLayout
= () =>{
+
+ Checks
+
{fileChgIsLoading ? (