Skip to content

Commit e55d00b

Browse files
Merge pull request #3706 from verifywise-ai/mo-332-apr-10-clients-debts
Frontend Performance Audit
2 parents 36afbdd + 4b8ed91 commit e55d00b

File tree

18 files changed

+372
-200
lines changed

18 files changed

+372
-200
lines changed

.claude/settings.local.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,15 @@
1313
"Bash(grep -r \"superadmin\\\\|super.admin\\\\|SuperAdmin\" /Users/harsh/Data/vw/verifywise/Servers/src --include=*.ts -i)",
1414
"Bash(grep:*)",
1515
"Bash(git log:*)",
16-
"Bash(echo \"EXIT=$?\")"
16+
"Bash(echo \"EXIT=$?\")",
17+
"Bash(gh issue view:*)",
18+
"WebFetch(domain:github.com)",
19+
"Bash(find:*)",
20+
"Bash(wc:*)",
21+
"Bash(npx vite build:*)",
22+
"Bash(git add:*)",
23+
"Bash(git commit:*)",
24+
"Bash(git push:*)"
1725
]
1826
}
1927
}

Clients/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
"test:coverage": "vitest run --coverage",
1717
"test:e2e": "playwright test",
1818
"test:e2e:headed": "playwright test --headed",
19-
"test:e2e:debug": "playwright test --debug"
19+
"test:e2e:debug": "playwright test --debug",
20+
"analyze": "npx vite-bundle-visualizer"
2021
},
2122
"dependencies": {
2223
"@ai-sdk/react": "^3.0.148",
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

Clients/src/application/config/routes.tsx

Lines changed: 196 additions & 178 deletions
Large diffs are not rendered by default.

Clients/src/application/hooks/useWiseSearch.ts

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
SearchResult,
1515
getEntityDisplayName,
1616
} from "../repository/search.repository";
17-
import PolicyTemplates from "../data/PolicyTemplates.json";
17+
// PolicyTemplates.json loaded dynamically from /data/PolicyTemplates.json
1818

1919
/**
2020
* Recent search entry
@@ -64,12 +64,23 @@ const DEBOUNCE_MS = 300;
6464
const MIN_QUERY_LENGTH = 3;
6565

6666
/**
67-
* Search policy templates locally (from JSON file)
67+
* Search policy templates by fetching from public data
6868
*/
69-
function searchPolicyTemplates(query: string): SearchResult[] {
69+
let _policyTemplatesCache: { id: number; title: string; description: string }[] | null = null;
70+
71+
async function searchPolicyTemplates(query: string): Promise<SearchResult[]> {
72+
if (!_policyTemplatesCache) {
73+
try {
74+
const res = await fetch("/data/PolicyTemplates.json");
75+
_policyTemplatesCache = await res.json();
76+
} catch {
77+
return [];
78+
}
79+
}
80+
7081
const lowerQuery = query.toLowerCase();
7182

72-
return (PolicyTemplates as { id: number; title: string; description: string }[])
83+
return (_policyTemplatesCache ?? [])
7384
.filter(
7485
(template) =>
7586
template.title.toLowerCase().includes(lowerQuery) ||
@@ -183,7 +194,7 @@ export function useWiseSearch(): UseWiseSearchReturn {
183194
// When reviewStatus filter is active, skip local policy templates (they don't have review status)
184195
const [apiResponse, policyTemplateResults] = await Promise.all([
185196
performWiseSearch(searchParams),
186-
statusFilter ? Promise.resolve([]) : Promise.resolve(searchPolicyTemplates(searchQuery)),
197+
statusFilter ? Promise.resolve([]) : searchPolicyTemplates(searchQuery),
187198
]);
188199

189200
// Check if this request was aborted
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { lazy, ComponentType } from "react";
2+
import CircularProgress from "@mui/material/CircularProgress";
3+
import Box from "@mui/material/Box";
4+
5+
export const LazyFallback = () => (
6+
<Box
7+
sx={{
8+
display: "flex",
9+
justifyContent: "center",
10+
alignItems: "center",
11+
height: "100%",
12+
}}
13+
>
14+
<CircularProgress size={32} />
15+
</Box>
16+
);
17+
18+
/**
19+
* Wraps React.lazy() with retry logic for chunk load failures.
20+
* Retries up to 3 times with exponential backoff (1.5s, 3s, 6s).
21+
*/
22+
export function lazyRoute<T extends ComponentType<unknown>>(
23+
factory: () => Promise<{ default: T }>
24+
) {
25+
return lazy(() => retryImport(factory));
26+
}
27+
28+
function retryImport<T extends ComponentType<unknown>>(
29+
factory: () => Promise<{ default: T }>,
30+
retries = 3,
31+
delay = 1500
32+
): Promise<{ default: T }> {
33+
return factory().catch((err) => {
34+
if (retries <= 0) throw err;
35+
return new Promise<{ default: T }>((resolve) =>
36+
setTimeout(
37+
() => resolve(retryImport(factory, retries - 1, delay * 2)),
38+
delay
39+
)
40+
);
41+
});
42+
}

Clients/src/presentation/components/AddNewRiskMITForm/index.tsx

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import riskData from "../../assets/MITAIRISKDB.json";
1+
import { useState, useEffect } from "react";
22
import RiskDatabaseModal from "../RiskDatabaseModal";
33
import { RiskData, SelectedRiskData } from "../RiskDatabaseModal/types";
44
import { Likelihood, Severity } from "../RiskLevel/constants";
@@ -60,12 +60,26 @@ const AddNewRiskMITModal = ({
6060
setIsOpen,
6161
onRiskSelected,
6262
}: AddNewRiskMITModalProps) => {
63+
const [riskData, setRiskData] = useState<RiskData[]>([]);
64+
const [loaded, setLoaded] = useState(false);
65+
66+
useEffect(() => {
67+
if (!isOpen || loaded) return;
68+
fetch("/data/MITAIRISKDB.json")
69+
.then((res) => res.json())
70+
.then((data) => {
71+
setRiskData(data);
72+
setLoaded(true);
73+
})
74+
.catch(() => {});
75+
}, [isOpen, loaded]);
76+
6377
return (
6478
<RiskDatabaseModal
6579
isOpen={isOpen}
6680
setIsOpen={setIsOpen}
6781
onRiskSelected={onRiskSelected}
68-
riskData={riskData as RiskData[]}
82+
riskData={riskData}
6983
mapSeverity={mapSeverityMIT}
7084
mapLikelihood={mapLikelihoodMIT}
7185
title="Add a new risk from risk database"

0 commit comments

Comments
 (0)