Skip to content

Commit a8028c9

Browse files
Memoized icons in refinery (#72)
* Memoized icons in refinery * Avoid additional rerendering using callbacks and refs * More memoized icons replaced * PR comments * PR comments * PR comments * PR comments * Submodules merge
1 parent 4fb516f commit a8028c9

File tree

75 files changed

+463
-370
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+463
-370
lines changed

src/components/models-download/ModelsDownload.tsx

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
import { selectModelsDownloaded, setModelsDownloaded } from "@/src/reduxStore/states/pages/models-downloaded";
2-
import { Tooltip } from "@nextui-org/react";
3-
import { IconAlertTriangleFilled, IconArrowLeft, IconCircleCheckFilled, IconExternalLink, IconLoader, IconPlus, IconTrash } from "@tabler/icons-react";
42
import { useRouter } from "next/router";
53
import { useCallback, useEffect, useState } from "react";
64
import { useDispatch, useSelector } from "react-redux";
7-
import LoadingIcon from "../../../submodules/react-components/components/LoadingIcon";
85
import { openModal, setModalStates } from "@/src/reduxStore/states/modal";
96
import { ModalEnum } from "@/src/types/shared/modal";
107
import { selectIsAdmin, selectOrganizationId } from "@/src/reduxStore/states/general";
118
import { timer } from "rxjs";
12-
import { TOOLTIPS_DICT } from "@/src/util/tooltip-constants";
139
import AddModelDownloadModal from "./AddModelDownloadModal";
1410
import DeleteModelDownloadModal from "./DeleteModelDownloadModal";
1511
import { useWebsocket } from "@/submodules/react-components/hooks/web-socket/useWebsocket";
@@ -19,6 +15,7 @@ import { MODELS_DOWNLOAD_TABLE_COLUMNS, prepareTableBodyModelsDownload } from "@
1915
import KernTable from "@/submodules/react-components/components/kern-table/KernTable";
2016
import ButtonAsText from "@/submodules/react-components/components/kern-button/ButtonAsText";
2117
import KernButton from "@/submodules/react-components/components/kern-button/KernButton";
18+
import { MemoIconArrowLeft, MemoIconPlus } from "@/submodules/react-components/components/kern-icons/icons";
2219

2320
export default function ModelsDownload() {
2421
const router = useRouter();
@@ -59,13 +56,17 @@ export default function ModelsDownload() {
5956
const orgId = useSelector(selectOrganizationId);
6057
useWebsocket(orgId, Application.REFINERY, CurrentPage.MODELS_DOWNLOAD, handleWebsocketNotification);
6158

59+
const openCreateModal = useCallback(() => {
60+
dispatch(openModal(ModalEnum.ADD_MODEL_DOWNLOAD));
61+
}, []);
62+
6263
return (<div className="p-4 bg-gray-100 flex-1 flex flex-col h-[calc(100vh-4rem)] overflow-y-auto">
6364
<div className="flex flex-row items-center">
6465
<ButtonAsText
6566
text="Go back"
6667
onClick={() => router.back()}
6768
color="green"
68-
iconLeft={IconArrowLeft}
69+
iconLeft={MemoIconArrowLeft}
6970
iconColor="green"
7071
/>
7172
</div>
@@ -86,8 +87,8 @@ export default function ModelsDownload() {
8687
<div>
8788
<KernButton
8889
text="Add new model"
89-
icon={IconPlus}
90-
onClick={() => dispatch(openModal(ModalEnum.ADD_MODEL_DOWNLOAD))}
90+
icon={MemoIconPlus}
91+
onClick={openCreateModal}
9192
/>
9293
</div>
9394
</div>

src/components/projects/ButtonsContainer.tsx

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,27 +37,31 @@ export default function ButtonsContainer() {
3737
const orgId = useSelector(selectOrganizationId);
3838
useWebsocket(orgId, Application.REFINERY, CurrentPage.PROJECTS, handleWebsocketNotification, null, CurrentPageSubKey.BUTTONS_CONTAINER);
3939

40+
const createNewProject = useCallback(() => {
41+
dispatch(setUploadFileType(UploadFileType.RECORDS_NEW));
42+
router.push("/projects/new");
43+
}, []);
44+
45+
const importSnapshot = useCallback(() => {
46+
dispatch(openModal(ModalEnum.MODAL_UPLOAD));
47+
dispatch(setUploadFileType(UploadFileType.PROJECT));
48+
}, []);
49+
4050
return (
4151
user && user.role === UserRole.ENGINEER ? (<div className="flex flex-row items-start gap-x-4 mt-4">
4252
<KernButton
4353
text='New project'
4454
buttonColor="blue"
4555
solidTheme={true}
4656
textColor="white"
47-
onClick={() => {
48-
dispatch(setUploadFileType(UploadFileType.RECORDS_NEW));
49-
router.push("/projects/new");
50-
}}
57+
onClick={createNewProject}
5158
/>
5259
<KernButton
5360
text="Import snapshot"
5461
buttonColor="blue"
5562
solidTheme={true}
5663
textColor="white"
57-
onClick={() => {
58-
dispatch(openModal(ModalEnum.MODAL_UPLOAD));
59-
dispatch(setUploadFileType(UploadFileType.PROJECT));
60-
}}
64+
onClick={importSnapshot}
6165
/>
6266
<SampleProjectsDropdown />
6367
<ModalUpload uploadOptions={uploadOptions} />

src/components/projects/ProjectCard.tsx

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
import { selectIsAdmin, selectUser } from "@/src/reduxStore/states/general";
22
import { closeModal, setModalStates } from "@/src/reduxStore/states/modal";
33
import { removeFromAllProjectsById } from "@/src/reduxStore/states/project";
4-
import { Project, ProjectCardProps, ProjectStatus } from "@/src/types/components/projects/projects-list";
4+
import { ProjectCardProps, ProjectStatus } from "@/src/types/components/projects/projects-list";
55
import { ModalEnum } from "@/src/types/shared/modal";
66
import { isStringTrue } from "@/submodules/javascript-functions/general";
77
import { Tooltip } from "@nextui-org/react";
88
import { useRouter } from "next/router";
99
import { useDispatch, useSelector } from "react-redux";
1010
import { NOT_AVAILABLE, UNKNOWN_USER } from "@/src/util/constants";
11-
import { IconArrowRight, IconX } from "@tabler/icons-react";
1211
import { TOOLTIPS_DICT } from "@/src/util/tooltip-constants";
1312
import { deleteProjectPost } from "@/src/services/base/project";
1413
import ButtonAsText from "@/submodules/react-components/components/kern-button/ButtonAsText";
14+
import { MemoIconArrowRight, MemoIconX } from "@/submodules/react-components/components/kern-icons/icons";
15+
import { useCallback } from "react";
16+
import useRefFor from "@/submodules/react-components/hooks/useRefFor";
1517

1618
export default function ProjectCard(props: ProjectCardProps) {
1719
const router = useRouter();
@@ -20,20 +22,6 @@ export default function ProjectCard(props: ProjectCardProps) {
2022
const isAdmin = useSelector(selectIsAdmin);
2123
const user = useSelector(selectUser);
2224

23-
function adminOpenOrDeleteProject(project: Project) {
24-
if (!isAdmin) return;
25-
const deleteInstant = isStringTrue(localStorage.getItem("adminInstantDelete"));
26-
if (deleteInstant) {
27-
deleteProjectPost(project.id, (res) => {
28-
dispatch(closeModal(ModalEnum.ADMIN_DELETE_PROJECT));
29-
dispatch(removeFromAllProjectsById(project.id));
30-
})
31-
}
32-
else {
33-
dispatch(setModalStates(ModalEnum.ADMIN_DELETE_PROJECT, { projectId: project.id, open: true }));
34-
}
35-
}
36-
3725
function manageProject(): void {
3826
const projectId = props.project.id;
3927
if (user?.role == 'ENGINEER') {
@@ -47,6 +35,20 @@ export default function ProjectCard(props: ProjectCardProps) {
4735
}
4836
}
4937

38+
const projectId = useRefFor(props.project.id);
39+
const adminOpenOrDeleteProjectFunc = useCallback(() => {
40+
if (!isAdmin) return;
41+
const deleteInstant = isStringTrue(localStorage.getItem("adminInstantDelete"));
42+
if (deleteInstant) {
43+
deleteProjectPost(projectId.current, (res) => {
44+
dispatch(removeFromAllProjectsById(projectId.current));
45+
})
46+
}
47+
else {
48+
dispatch(setModalStates(ModalEnum.ADMIN_DELETE_PROJECT, { projectId: projectId.current, open: true }));
49+
}
50+
}, []);
51+
5052
return (
5153
<div key={props.project.id} className="relative card shadow bg-white m-4 rounded-2xl">
5254
{(props.project.status != ProjectStatus.IN_DELETION && props.project.status != ProjectStatus.HIDDEN) && (
@@ -64,9 +66,9 @@ export default function ProjectCard(props: ProjectCardProps) {
6466
</>}
6567
</div>}
6668
{(isAdmin && props.project.status !== ProjectStatus.INIT_SAMPLE_PROJECT) &&
67-
<div className="absolute top-0 left-0 cursor-pointer" onClick={() => adminOpenOrDeleteProject(props.project)}>
69+
<div className="absolute top-0 left-0 cursor-pointer" onClick={adminOpenOrDeleteProjectFunc}>
6870
<Tooltip content={TOOLTIPS_DICT.PROJECTS.QUICK_DELETE} color="invert" offset={2} placement="right">
69-
<IconX className="h-6 w-6 text-gray-500" />
71+
<MemoIconX className="h-6 w-6 text-gray-500" />
7072
</Tooltip>
7173
</div>
7274
}
@@ -108,7 +110,7 @@ export default function ProjectCard(props: ProjectCardProps) {
108110
text="Continue project"
109111
onClick={manageProject}
110112
color="green"
111-
iconRight={IconArrowRight}
113+
iconRight={MemoIconArrowRight}
112114
iconColor="green"
113115
/>
114116
}

src/components/projects/SampleProjectsDropdown.tsx

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ import { selectAllProjects } from '@/src/reduxStore/states/project';
66
import { ModalButton, ModalEnum } from '@/src/types/shared/modal';
77
import { closeModal, openModal } from '@/src/reduxStore/states/modal';
88
import Modal from '../shared/modal/Modal';
9-
import { IconAlertTriangle, IconArrowDown, IconFishHook, IconMessageCircle, IconNews, IconQuestionMark, IconScreenshot } from '@tabler/icons-react';
109
import { setSearchGroupsStore } from '@/src/reduxStore/states/pages/data-browser';
1110
import { selectProjectIdSampleProject, setProjectIdSampleProject } from '@/src/reduxStore/states/tmp';
1211
import { createSampleProject } from '@/src/services/base/project';
1312
import KernButton from '@/submodules/react-components/components/kern-button/KernButton';
1413
import { ChevronDownIcon } from '@heroicons/react/20/solid';
14+
import { MemoIconAlertTriangle, MemoIconFishHook, MemoIconMessageCircle, MemoIconNews, MemoIconQuestionMark, MemoIconScreenshot } from '@/submodules/react-components/components/kern-icons/icons';
1515

1616
const ACCEPT_BUTTON = { buttonCaption: "Create", closeAfterClick: false, useButton: true, disabled: true };
1717

@@ -72,6 +72,10 @@ export default function SampleProjectsDropdown() {
7272
}
7373
}, []);
7474

75+
const furtherSampleProjects = useCallback(() => {
76+
window.open("https://github.com/code-kern-ai/refinery-sample-projects", "_blank")
77+
}, []);
78+
7579
return (
7680
<Menu as="div" className="relative inline-block text-left">
7781
<div>
@@ -107,7 +111,7 @@ export default function SampleProjectsDropdown() {
107111
importSampleProject("Clickbait", "Clickbait");
108112
}}>
109113
<div className="flex flex-row items-center">
110-
<IconFishHook className="h-5 w-5 inline-block" />
114+
<MemoIconFishHook className="h-5 w-5 inline-block" />
111115
<span className="ml-2">Clickbait</span>
112116
</div>
113117
<div className="mt-2">Binary classification for detecting nudging articles.</div>
@@ -133,7 +137,7 @@ export default function SampleProjectsDropdown() {
133137
importSampleProject("Conversational AI", "Conversational AI");
134138
}}>
135139
<div className="flex flex-row items-center">
136-
<IconMessageCircle className="h-5 w-5 inline-block" />
140+
<MemoIconMessageCircle className="h-5 w-5 inline-block" />
137141
<span className="ml-2">Conversational AI</span>
138142
</div>
139143
<div className="mt-2">Detecting intent within conversational lines.</div>
@@ -159,7 +163,7 @@ export default function SampleProjectsDropdown() {
159163
importSampleProject("AG News", "AG News");
160164
}}>
161165
<div className="flex flex-row items-center">
162-
<IconNews className="h-5 w-5 inline-block" />
166+
<MemoIconNews className="h-5 w-5 inline-block" />
163167
<span className="ml-2">AG News</span>
164168
</div>
165169
<div className="mt-2">Modelling topics of headline news.</div>
@@ -185,7 +189,7 @@ export default function SampleProjectsDropdown() {
185189
importSampleProject("Global Guard [References]", "Global Guard [References]");
186190
}}>
187191
<div className="flex flex-row items-center">
188-
<IconScreenshot className="h-5 w-5 inline-block" />
192+
<MemoIconScreenshot className="h-5 w-5 inline-block" />
189193
<span className="ml-2">DEV Global Guard [References]</span>
190194
</div>
191195
<div className="mt-2">References right after the wizard went through.</div>
@@ -200,7 +204,7 @@ export default function SampleProjectsDropdown() {
200204
importSampleProject("Global Guard [Questions]", "Global Guard [Questions]");
201205
}}>
202206
<div className="flex flex-row items-center">
203-
<IconQuestionMark className="h-5 w-5 inline-block" />
207+
<MemoIconQuestionMark className="h-5 w-5 inline-block" />
204208
<span className="ml-2">DEV Global Guard [Questions]</span>
205209
</div>
206210
<div className="mt-2">Questions right after the wizard went through.</div>
@@ -211,7 +215,7 @@ export default function SampleProjectsDropdown() {
211215
{({ active }) => (
212216
<a key="sample-project-6"
213217
className={`opacity-100 cursor-pointer text-gray-900 block px-3 py-2 text-sm ${active ? "bg-kernindigo text-white" : ""}`}
214-
onClick={() => window.open("https://github.com/code-kern-ai/refinery-sample-projects", "_blank")}>
218+
onClick={furtherSampleProjects}>
215219
<span>Further sample projects</span>
216220
</a>
217221
)}
@@ -235,7 +239,7 @@ export default function SampleProjectsDropdown() {
235239
</div>
236240
{projectNameExists && (<div className="text-red-700 text-xs mt-2 text-left">Project title exists</div>)}
237241
<div className="flex flex-row mt-2">
238-
<IconAlertTriangle className="h-5 w-5 text-yellow-700" />
242+
<MemoIconAlertTriangle className="h-5 w-5 text-yellow-700" />
239243
<label className="text-yellow-700 text-xs italic ml-2 text-left">The first sample project of a specific type can use the
240244
default name, but after the name is taken, the user needs a custom name.</label>
241245
</div>

0 commit comments

Comments
 (0)