Skip to content

Commit 280d03b

Browse files
committed
export diff section component, fix get diff, pass diff data, remove useEffect
1 parent b60e96a commit 280d03b

File tree

17 files changed

+1503
-110
lines changed

17 files changed

+1503
-110
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,6 @@ If you are upgrading from a version prior to 2.0.0, please note the changes to p
189189

190190
-- Add support for Dolt diff.
191191

192-
## [2.3.3]
192+
## [2.3.8]
193193

194194
-- Diff section UI fixes.

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -212,16 +212,16 @@ Represents changes between two commits:
212212

213213
```typescript
214214
export type Diff = {
215-
files: ChangedFile[];
215+
files: ChangedItem[];
216216
};
217217
```
218218

219-
### `ChangedFile` Type
219+
### `ChangedItem` Type
220220

221221
Details of files changed between commits:
222222

223223
```typescript
224-
export type ChangedFile = {
224+
export type ChangedItem = {
225225
filename: string;
226226
status: string; // "added", "modified", or "deleted"
227227
additions: number;

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "commit-graph",
3-
"version": "2.3.3",
3+
"version": "2.3.8",
44
"homepage": "https://liuliu-dev.github.io/CommitGraph/",
55
"author": "Liu Liu <[email protected]>",
66
"description": "A React component to visualize a commit graph.",
@@ -46,6 +46,7 @@
4646
]
4747
},
4848
"dependencies": {
49+
"@dolthub/react-components": "^0.2.7",
4950
"@dolthub/react-hooks": "^0.1.7",
5051
"@dolthub/web-utils": "^0.1.5",
5152
"@rollup/plugin-typescript": "11.1.6",

rollup.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export default [
3535
},
3636
{
3737
input: "src/index.ts",
38-
output: [{ file: "dist/types.d.ts", format: "es" }],
38+
output: [{ file: "dist/index.d.ts", format: "es" }],
3939
plugins: [dts.default()],
4040
},
4141
];

src/components/CommitDetails/index.module.css

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,20 +38,6 @@
3838
visibility: visible;
3939
}
4040

41-
.diffSection {
42-
font-family: "Source Sans Pro";
43-
font-size: small;
44-
border: 1px solid #e1e4e8;
45-
background-color: white;
46-
position: absolute;
47-
width: 360px;
48-
right: 1rem;
49-
top: 1rem;
50-
z-index: 10;
51-
color: #010a40;
52-
border-radius: 0.5rem;
53-
}
54-
5541
.comments {
5642
border: 1px solid #e1e4e8;
5743
background-color: white;

src/components/CommitDetails/index.tsx

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import css from "./index.module.css";
66
import { Tooltip } from "react-tooltip";
77
import DiffSection from "../DiffSection";
88
import { useOnClickOutside } from "@dolthub/react-hooks";
9+
import { fromCommitNodeToCommit } from "src/helpers/utils";
910

1011
type Props = {
1112
commit: CommitNode;
@@ -21,6 +22,8 @@ type Props = {
2122
forDolt?: boolean;
2223
};
2324

25+
const diffCache: { [key: string]: Diff | undefined } = {};
26+
2427
export default function CommitDetails({
2528
commit,
2629
branch,
@@ -48,6 +51,8 @@ export default function CommitDetails({
4851
useOnClickOutside(diffRef, () => {
4952
setShowDiff(false);
5053
});
54+
const [diff, setDiff] = useState<Diff | undefined>(undefined);
55+
const [loading, setLoading] = useState(false);
5156

5257
return (
5358
<>
@@ -80,7 +85,22 @@ export default function CommitDetails({
8085
<button
8186
type="button"
8287
className={css.button}
83-
onClick={() => setShowDiff(true)}
88+
onClick={async () => {
89+
setLoading(true);
90+
setShowDiff(true);
91+
const cacheKey = `${commit.parents[0]}-${commit.hash}`;
92+
if (diffCache[cacheKey]) {
93+
setDiff(diffCache[cacheKey]);
94+
} else {
95+
const result = await getDiff(
96+
commit.parents[0],
97+
commit.hash,
98+
);
99+
diffCache[cacheKey] = result;
100+
setDiff(result);
101+
}
102+
setLoading(false);
103+
}}
84104
>
85105
See commit overview
86106
</button>
@@ -100,17 +120,22 @@ export default function CommitDetails({
100120
>
101121
{excerpt(message, 80)}
102122
</div>
103-
{message.length > 80 && (
123+
{message.length > 80 && !getDiff && (
104124
<Tooltip
105125
id={`commit-${commit.hash}-msg`}
106126
className={css.tooltip}
107127
noArrow
108128
/>
109129
)}
110130
</div>
111-
{showDiff && !!getDiff && (
112-
<div className={css.diffSection} ref={diffRef}>
113-
<DiffSection commit={commit} getDiff={getDiff} forDolt={forDolt} />
131+
{showDiff && (
132+
<div ref={diffRef}>
133+
<DiffSection
134+
commit={fromCommitNodeToCommit(commit)}
135+
diff={diff}
136+
forDolt={forDolt}
137+
loading={loading}
138+
/>
114139
</div>
115140
)}
116141
</>

src/components/CommitGraph/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useRef, useState } from "react";
1+
import React, { useState } from "react";
22
import { Branch, Commit, CommitNode, Diff, GraphStyle } from "../../types";
33
import {
44
defaultStyle,

src/components/DiffSection/ChangedFileDetails.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { FiPlus } from "react-icons/fi";
2-
import { ChangedFile } from "../../types";
2+
import { ChangedItem } from "../../types";
33
import css from "./index.module.css";
44
import React from "react";
55
import { RiPencilFill } from "react-icons/ri";
66
import { FiMinus } from "react-icons/fi";
77

88
type Props = {
9-
file: ChangedFile;
9+
file: ChangedItem;
1010
};
1111

1212
export default function ChangedFileDetails({ file }: Props) {

src/components/DiffSection/index.module.css

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,17 @@
1+
.diffSection {
2+
font-family: "Source Sans Pro";
3+
font-size: small;
4+
border: 1px solid #e1e4e8;
5+
background-color: white;
6+
position: absolute;
7+
width: 360px;
8+
right: 1rem;
9+
top: 1rem;
10+
z-index: 10;
11+
color: #010a40;
12+
border-radius: 0.5rem;
13+
}
14+
115
.top {
216
padding: 1rem 1.5rem;
317
}
@@ -80,3 +94,9 @@
8094
.link:hover {
8195
color: #3d91f0;
8296
}
97+
98+
.loading {
99+
display: flex;
100+
justify-content: center;
101+
padding: 1rem;
102+
}

src/components/DiffSection/index.tsx

Lines changed: 17 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,49 @@
11
import React, { useEffect, useState } from "react";
2-
import { ChangedFile, CommitNode, Diff } from "../../types";
2+
import { ChangedItem, Commit, Diff } from "../../types";
33
import css from "./index.module.css";
44
import ChangedFileDetails from "./ChangedFileDetails";
55
import { pluralize } from "@dolthub/web-utils";
6+
import { SmallLoader } from "@dolthub/react-components";
67

78
type Props = {
8-
commit: CommitNode;
9-
getDiff: (base: string, head: string) => Promise<Diff | undefined>;
9+
commit: Commit;
10+
diff?: Diff;
1011
forDolt?: boolean;
12+
loading?: boolean;
1113
};
1214

13-
const diffCache: { [key: string]: Diff | undefined } = {};
14-
15-
export default function DiffSection({ commit, getDiff, forDolt }: Props) {
16-
const [diff, setDiff] = useState<Diff | undefined>(undefined);
17-
18-
useEffect(() => {
19-
const fetchDiff = async () => {
20-
const cacheKey = `${commit.parents[0]}-${commit.hash}`;
21-
if (diffCache[cacheKey]) {
22-
setDiff(diffCache[cacheKey]);
23-
} else {
24-
const result = await getDiff(commit.parents[0], commit.hash);
25-
diffCache[cacheKey] = result;
26-
setDiff(result);
27-
}
28-
};
29-
30-
fetchDiff();
31-
}, [commit, getDiff]);
32-
15+
export default function DiffSection({ commit, diff, forDolt, loading }: Props) {
3316
const { added, modified, deleted } = getChanged(diff?.files || []);
3417
const file = forDolt ? "table" : "file";
18+
const files = diff?.files || diff?.tables;
3519

3620
return (
37-
<div>
21+
<div className={css.diffSection}>
3822
<div className={css.top}>
3923
<div className={css.commitAndParents}>
4024
<div className={css.hashes}>
4125
<div className={css.bold}>commit:</div>
42-
<div>{commit.hash}</div>
26+
<div>{commit.sha}</div>
4327
</div>
4428
<div className={css.hashes}>
4529
<div className={css.bold}>
4630
{pluralize(commit.parents.length, "parent")}:
4731
</div>
4832
<div>
4933
{commit.parents.map((p, i) => (
50-
<div>
51-
{p}
34+
<div key={p.sha}>
35+
{p.sha}
5236
{i === commit.parents.length - 1 ? "" : ","}
5337
</div>
5438
))}
5539
</div>
5640
</div>
5741
</div>
58-
<div className={css.message}>{commit.message}</div>
42+
<div className={css.message}>{commit.commit.message}</div>
43+
{loading && <SmallLoader loaded={!loading} className={css.loading} />}
44+
{/* {err && <div className={css.error}>{err}</div>} */}
5945
</div>
60-
{!!diff?.files.length && (
46+
{!!files?.length && (
6147
<>
6248
<div className={css.summary}>
6349
{!!modified && (
@@ -80,7 +66,7 @@ export default function DiffSection({ commit, getDiff, forDolt }: Props) {
8066
)}
8167
</div>
8268
<ul className={css.list}>
83-
{diff?.files.map(file => (
69+
{files.map(file => (
8470
<ChangedFileDetails key={file.filename} file={file} />
8571
))}
8672
</ul>
@@ -96,7 +82,7 @@ type GetChangedReturnType = {
9682
deleted: number;
9783
};
9884

99-
function getChanged(files: ChangedFile[]): GetChangedReturnType {
85+
function getChanged(files: ChangedItem[]): GetChangedReturnType {
10086
let added = 0;
10187
let modified = 0;
10288
let deleted = 0;

0 commit comments

Comments
 (0)