summaryrefslogtreecommitdiff
path: root/apps/web
diff options
context:
space:
mode:
authorenkeii64 <imenkei64@gmail.com>2025-07-16 22:43:01 +1000
committerenkeii64 <imenkei64@gmail.com>2025-07-16 22:43:01 +1000
commitf83f647299fe4e650052371e0c5efd1aa9801be9 (patch)
tree5dfcbc2da7c2d4be38b5d21f7916113a745e728e /apps/web
parentfe1c0edb8f69b77fdb4fe13784784a099c353ec1 (diff)
downloadopencut-f83f647299fe4e650052371e0c5efd1aa9801be9.tar.gz
refactor: improve type safety and security in projects page
Diffstat (limited to 'apps/web')
-rw-r--r--apps/web/src/app/projects/page.tsx16
1 files changed, 12 insertions, 4 deletions
diff --git a/apps/web/src/app/projects/page.tsx b/apps/web/src/app/projects/page.tsx
index 16722815..e68c70c4 100644
--- a/apps/web/src/app/projects/page.tsx
+++ b/apps/web/src/app/projects/page.tsx
@@ -99,8 +99,14 @@ export default function ProjectsPage() {
const sortedProjects = [...filteredProjects].sort((a, b) => {
const [key, order] = sortOption.split("-");
- const aValue = a[key as keyof TProject];
- const bValue = b[key as keyof TProject];
+
+ if (key !== "createdAt" && key !== "name") {
+ console.warn(`Invalid sort key: ${key}`);
+ return 0;
+ }
+
+ const aValue = a[key];
+ const bValue = b[key];
if (aValue === undefined || bValue === undefined) return 0;
@@ -578,10 +584,12 @@ function ProjectCard({
}
function Highlight({ text, query }: { text: string; query?: string }) {
- if (!query) {
+ if (!query || query.trim() === "") {
return <span>{text}</span>;
}
- const parts = text.split(new RegExp(`(${query})`, "gi"));
+
+ const escapedQuery = query.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
+ const parts = text.split(new RegExp(`(${escapedQuery})`, "gi"));
return (
<span>
{parts.map((part, i) =>