diff options
| author | enkeii64 <imenkei64@gmail.com> | 2025-07-16 22:43:01 +1000 |
|---|---|---|
| committer | enkeii64 <imenkei64@gmail.com> | 2025-07-16 22:43:01 +1000 |
| commit | f83f647299fe4e650052371e0c5efd1aa9801be9 (patch) | |
| tree | 5dfcbc2da7c2d4be38b5d21f7916113a745e728e /apps | |
| parent | fe1c0edb8f69b77fdb4fe13784784a099c353ec1 (diff) | |
| download | opencut-f83f647299fe4e650052371e0c5efd1aa9801be9.tar.gz | |
refactor: improve type safety and security in projects page
Diffstat (limited to 'apps')
| -rw-r--r-- | apps/web/src/app/projects/page.tsx | 16 |
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) => |
