Skip to content

Commit 370093f

Browse files
committed
refactor: v.0.1.2 improve notes grid rendering
before : It renders each note and calculates grid height, therefore total rendering count is twice the number of the notes. after : It renders all notes and calculates grid heights, then re-renders all notes, therefore the total rendering count is just two. But, the first rendering is opacity 0. So, only the second rendering is shown to the user
1 parent 4519d54 commit 370093f

File tree

4 files changed

+67
-22
lines changed

4 files changed

+67
-22
lines changed

src/components/Note/index.ts

+39-10
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,39 @@ interface Clipboard {
1111
write?(notes: Array<ClipboardItem>): Promise<void>;
1212
}
1313

14-
const resetHeight = (noteWrapper: HTMLElement, noteDom: HTMLElement, rowGap: number, rowHeight: number) => {
14+
export const removeGridBeforeNotesCreated = (noteWrapper: HTMLElement) => {
15+
noteWrapper.classList.add("invisible");
1516
noteWrapper.style.display = "unset";
17+
};
18+
19+
export const makeGridAfterNoteCreated = (noteWrapper: HTMLElement, noteDom: HTMLElement) => {
20+
setTimeout(() => {
21+
noteDom.style.gridRowEnd = `span ${noteDom.dataset.span}`;
22+
noteWrapper.style.display = "grid";
23+
noteWrapper.classList.remove("invisible");
24+
});
25+
};
26+
27+
export const makeGridAfterNotesCreated = (noteWrapper: HTMLElement, noteDoms: NodeListOf<HTMLElement>) => {
28+
setTimeout(() => {
29+
noteDoms.forEach((noteDom) => {
30+
noteDom.style.gridRowEnd = `span ${noteDom.dataset.span}`;
31+
});
32+
noteWrapper.style.display = "grid";
33+
noteWrapper.classList.remove("invisible");
34+
}, 0);
35+
};
36+
37+
const setHeight = (noteDom: HTMLElement, rowGap: number, rowHeight: number) => {
1638
const noteHieght = noteDom.getBoundingClientRect().height;
1739
const rowSpan = Math.ceil((noteHieght + rowGap) / (rowHeight + rowGap));
40+
noteDom.dataset.span = "" + rowSpan;
1841
noteDom.style.gridRowEnd = `span ${rowSpan}`;
42+
};
43+
44+
const resetHeight = (noteWrapper: HTMLElement, noteDom: HTMLElement, rowGap: number, rowHeight: number) => {
45+
noteWrapper.style.display = "unset";
46+
setHeight(noteDom, rowGap, rowHeight);
1947
noteWrapper.style.display = "grid";
2048
};
2149

@@ -60,7 +88,9 @@ export const createNote = (note: NerorenClipboardType, settings: Settings) => {
6088
const imageContent = document.createElement("img") as HTMLImageElement;
6189
imageContent.className = "image";
6290
imageContent.onload = () => {
63-
resetHeight(noteWrapper, noteDom, rowGap, rowHeight);
91+
setTimeout(() => {
92+
resetHeight(noteWrapper, noteDom, rowGap, rowHeight);
93+
}, 0);
6494
};
6595
imageContent.src = content;
6696
contentDom.appendChild(imageContent);
@@ -109,7 +139,7 @@ export const createNote = (note: NerorenClipboardType, settings: Settings) => {
109139
}
110140

111141
// set height for grid
112-
resetHeight(noteWrapper, noteDom, rowGap, rowHeight);
142+
setHeight(noteDom, rowGap, rowHeight);
113143
}, 0);
114144

115145
const buttonWrapper = document.createElement("div");
@@ -240,14 +270,13 @@ export const createNote = (note: NerorenClipboardType, settings: Settings) => {
240270
timeDom.className = "time";
241271
bottomWrapper.appendChild(timeDom);
242272

243-
setTimeout(() => {
244-
noteWrapper.style.display = "unset";
245-
const noteHieght = noteDom.getBoundingClientRect().height;
246-
const rowSpan = Math.ceil((noteHieght + rowGap) / (rowHeight + rowGap));
247-
noteDom.style.gridRowEnd = `span ${rowSpan}`;
248-
noteWrapper.style.display = "grid";
249-
}, 0);
250273
noteWrapper?.insertBefore(noteDom, noteWrapper.firstChild);
274+
275+
const noteHieght = noteDom.getBoundingClientRect().height;
276+
const rowSpan = Math.ceil((noteHieght + rowGap) / (rowHeight + rowGap));
277+
noteDom.dataset.span = `${rowSpan}`;
278+
279+
return noteDom;
251280
}
252281
};
253282

src/components/Note/note.scss

+13-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
11
@import "../../variables.scss";
22

3+
.note-wrapper {
4+
margin: 0 8px 8px 8px;
5+
min-height: 60px;
6+
display: grid;
7+
grid-gap: 16px;
8+
grid-template-columns: repeat(auto-fit, 310px);
9+
grid-auto-rows: 10px;
10+
11+
&.invisible * {
12+
opacity: 0;
13+
}
14+
}
15+
316
.note {
417
position: relative;
518
display: flex;
@@ -20,7 +33,6 @@
2033
.corner-shadow {
2134
content: "";
2235
position: absolute;
23-
opacity: 1;
2436
z-index: -1;
2537
right: -0px;
2638
bottom: 20px;

src/popup.scss

-9
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,3 @@ body {
33
margin: 0;
44
user-select: none;
55
}
6-
7-
.note-wrapper {
8-
margin: 0 8px 8px 8px;
9-
min-height: 60px;
10-
display: grid;
11-
grid-gap: 16px;
12-
grid-template-columns: repeat(auto-fit, 310px);
13-
grid-auto-rows: 50px;
14-
}

src/popup.ts

+15-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
import { createNote } from "./components/Note";
1+
import {
2+
createNote,
3+
removeGridBeforeNotesCreated,
4+
makeGridAfterNotesCreated,
5+
makeGridAfterNoteCreated,
6+
} from "./components/Note";
27
import { setHeader, changeHeaderLanguage } from "./components/Header";
38
import { changeTopModalLanguage } from "./components/TopModal";
49
import { Language } from "./libs/language";
@@ -67,9 +72,14 @@ export const initNotes = (settings: Settings) => {
6772
chrome.storage.local.get(NerorenClipboard, (result) => {
6873
const notes: NerorenClipboardType[] = result[NerorenClipboard];
6974
if (notes) {
75+
const noteWrapper = document.querySelector("#note-wrapper") as HTMLElement;
76+
removeGridBeforeNotesCreated(noteWrapper);
7077
notes.forEach((note) => {
7178
createNote(note, settings);
7279
});
80+
81+
const noteDoms = document.querySelectorAll<HTMLElement>(".note");
82+
makeGridAfterNotesCreated(noteWrapper, noteDoms);
7383
}
7484
});
7585
};
@@ -89,7 +99,10 @@ chrome.runtime.onMessage.addListener((message) => {
8999
switch (type) {
90100
case "createNote":
91101
const { note } = message;
92-
createNote(note, settings);
102+
const noteWrapper = document.querySelector("#note-wrapper") as HTMLElement;
103+
removeGridBeforeNotesCreated(noteWrapper);
104+
const createdNoteDom = createNote(note, settings) as HTMLElement;
105+
makeGridAfterNoteCreated(noteWrapper, createdNoteDom);
93106
break;
94107
case "changePopupLanguage":
95108
changeHeaderLanguage(settings.language);

0 commit comments

Comments
 (0)