diff --git a/webui/src/bug/SetStatusFragment.graphql b/webui/src/bug/SetStatusFragment.graphql
index 56e22c2b065d0456465953f7bddd61f37217dccd..0fdea01b635f209992a5c831efdfbfeb6d6b9dfe 100644
--- a/webui/src/bug/SetStatusFragment.graphql
+++ b/webui/src/bug/SetStatusFragment.graphql
@@ -1,9 +1,7 @@
#import "../Author.graphql"
-fragment SetStatus on TimelineItem {
- ... on SetStatusTimelineItem {
- date
- ...authored
- status
- }
+fragment SetStatus on SetStatusTimelineItem {
+ date
+ ...authored
+ status
}
diff --git a/webui/src/bug/SetTitle.js b/webui/src/bug/SetTitle.tsx
similarity index 76%
rename from webui/src/bug/SetTitle.js
rename to webui/src/bug/SetTitle.tsx
index 09343ad170def3a959140d76bf206a4ad6edccf4..8a578aa1c83d7ed15c90ce20e26e6edb043e832e 100644
--- a/webui/src/bug/SetTitle.js
+++ b/webui/src/bug/SetTitle.tsx
@@ -1,8 +1,9 @@
-import { makeStyles } from '@material-ui/styles';
+import { makeStyles } from '@material-ui/core/styles';
import React from 'react';
import Author from '../Author';
import Date from '../Date';
+import { SetTitleFragment } from './SetTitleFragment.generated';
const useStyles = makeStyles(theme => ({
main: {
@@ -14,7 +15,11 @@ const useStyles = makeStyles(theme => ({
},
}));
-function SetTitle({ op }) {
+type Props = {
+ op: SetTitleFragment;
+};
+
+function SetTitle({ op }: Props) {
const classes = useStyles();
return (
diff --git a/webui/src/bug/SetTitleFragment.graphql b/webui/src/bug/SetTitleFragment.graphql
index a15c3eb3138a932ecb1ef9948e47970e647ed12b..432c44492ef68b9cf1d6954cafa9dec15a716f51 100644
--- a/webui/src/bug/SetTitleFragment.graphql
+++ b/webui/src/bug/SetTitleFragment.graphql
@@ -1,10 +1,8 @@
#import "../Author.graphql"
-fragment SetTitle on TimelineItem {
- ... on SetTitleTimelineItem {
- date
- ...authored
- title
- was
- }
+fragment SetTitle on SetTitleTimelineItem {
+ date
+ ...authored
+ title
+ was
}
diff --git a/webui/src/bug/Timeline.js b/webui/src/bug/Timeline.js
deleted file mode 100644
index aeef7d2bc2e080e8ef952d2ca8879fc05923dbc0..0000000000000000000000000000000000000000
--- a/webui/src/bug/Timeline.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import { makeStyles } from '@material-ui/styles';
-import React from 'react';
-
-import LabelChange from './LabelChange';
-import Message from './Message';
-import SetStatus from './SetStatus';
-import SetTitle from './SetTitle';
-
-const useStyles = makeStyles(theme => ({
- main: {
- '& > *:not(:last-child)': {
- marginBottom: theme.spacing(2),
- },
- },
-}));
-
-const componentMap = {
- CreateTimelineItem: Message,
- AddCommentTimelineItem: Message,
- LabelChangeTimelineItem: LabelChange,
- SetTitleTimelineItem: SetTitle,
- SetStatusTimelineItem: SetStatus,
-};
-
-function Timeline({ ops }) {
- const classes = useStyles();
-
- return (
-
- {ops.map((op, index) => {
- const Component = componentMap[op.__typename];
-
- if (!Component) {
- console.warn('unsupported operation type ' + op.__typename);
- return null;
- }
-
- return ;
- })}
-
- );
-}
-
-export default Timeline;
diff --git a/webui/src/bug/Timeline.tsx b/webui/src/bug/Timeline.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..ba0f9fc7e3f6d506613bd8c0280624f78009047c
--- /dev/null
+++ b/webui/src/bug/Timeline.tsx
@@ -0,0 +1,48 @@
+import { makeStyles } from '@material-ui/core/styles';
+import React from 'react';
+
+import LabelChange from './LabelChange';
+import Message from './Message';
+import SetStatus from './SetStatus';
+import SetTitle from './SetTitle';
+import { TimelineItemFragment } from './TimelineQuery.generated';
+
+const useStyles = makeStyles(theme => ({
+ main: {
+ '& > *:not(:last-child)': {
+ marginBottom: theme.spacing(2),
+ },
+ },
+}));
+
+type Props = {
+ ops: Array
;
+};
+
+function Timeline({ ops }: Props) {
+ const classes = useStyles();
+
+ return (
+
+ {ops.map((op, index) => {
+ switch (op.__typename) {
+ case 'CreateTimelineItem':
+ return ;
+ case 'AddCommentTimelineItem':
+ return ;
+ case 'LabelChangeTimelineItem':
+ return ;
+ case 'SetTitleTimelineItem':
+ return ;
+ case 'SetStatusTimelineItem':
+ return ;
+ }
+
+ console.warn('unsupported operation type ' + op.__typename);
+ return null;
+ })}
+
+ );
+}
+
+export default Timeline;
diff --git a/webui/src/bug/TimelineQuery.graphql b/webui/src/bug/TimelineQuery.graphql
index 493f441657a3bbdb35de11cad19ca51d8f536202..6d78ab7f851a7b6c85a55bc9404881db702b5712 100644
--- a/webui/src/bug/TimelineQuery.graphql
+++ b/webui/src/bug/TimelineQuery.graphql
@@ -9,11 +9,7 @@ query Timeline($id: String!, $first: Int = 10, $after: String) {
bug(prefix: $id) {
timeline(first: $first, after: $after) {
nodes {
- ...LabelChange
- ...SetStatus
- ...SetTitle
- ...AddComment
- ...Create
+ ...TimelineItem
}
pageInfo {
hasNextPage
@@ -23,3 +19,21 @@ query Timeline($id: String!, $first: Int = 10, $after: String) {
}
}
}
+
+fragment TimelineItem on TimelineItem {
+ ... on LabelChangeTimelineItem {
+ ...LabelChange
+ }
+ ... on SetStatusTimelineItem {
+ ...SetStatus
+ }
+ ... on SetTitleTimelineItem {
+ ...SetTitle
+ }
+ ... on AddCommentTimelineItem {
+ ...AddComment
+ }
+ ... on CreateTimelineItem {
+ ...Create
+ }
+}
diff --git a/webui/src/bug/TimelineQuery.js b/webui/src/bug/TimelineQuery.tsx
similarity index 59%
rename from webui/src/bug/TimelineQuery.js
rename to webui/src/bug/TimelineQuery.tsx
index 886edab2911ffad769c0f011a0ce5b395637c5b4..9c4cf183c508be5ef0df61eb3d420463efde55d7 100644
--- a/webui/src/bug/TimelineQuery.js
+++ b/webui/src/bug/TimelineQuery.tsx
@@ -4,8 +4,12 @@ import React from 'react';
import Timeline from './Timeline';
import { useTimelineQuery } from './TimelineQuery.generated';
-const TimelineQuery = ({ id }) => {
- const { loading, error, data, fetchMore } = useTimelineQuery({
+type Props = {
+ id: string;
+};
+
+const TimelineQuery = ({ id }: Props) => {
+ const { loading, error, data } = useTimelineQuery({
variables: {
id,
first: 100,
@@ -14,9 +18,13 @@ const TimelineQuery = ({ id }) => {
if (loading) return ;
if (error) return Error: {error}
;
- return (
-
- );
+
+ const nodes = data?.repository?.bug?.timeline.nodes;
+ if (!nodes) {
+ return null;
+ }
+
+ return ;
};
export default TimelineQuery;