From 753c675d9f26d29ab7a6ce44229a8fd3d1770694 Mon Sep 17 00:00:00 2001 From: Torben Sorensen Date: Sat, 29 Nov 2025 13:35:10 -0800 Subject: [PATCH] acheivments + flyercorrection --- package-lock.json | 29 ++++++++++++++ package.json | 5 ++- src/App.tsx | 2 +- src/components/AchievementsList.tsx | 2 +- .../FlyerCorrectionTool.tsx | 0 src/{services => components}/MyDealsPage.tsx | 0 src/{ => components/icons}/RefreshCwIcon.tsx | 0 src/{ => components/icons}/ScanIcon.tsx | 0 .../icons}/ScissorsIcon.tsx | 0 src/features/flyer/FlyerDisplay.tsx | 2 +- src/{ => services/db}/notification.ts | 40 +++++++++++++++++++ 11 files changed, 76 insertions(+), 4 deletions(-) rename src/{services => components}/FlyerCorrectionTool.tsx (100%) rename src/{services => components}/MyDealsPage.tsx (100%) rename src/{ => components/icons}/RefreshCwIcon.tsx (100%) rename src/{ => components/icons}/ScanIcon.tsx (100%) rename src/{services => components/icons}/ScissorsIcon.tsx (100%) rename src/{ => services/db}/notification.ts (55%) diff --git a/package-lock.json b/package-lock.json index 429e856a..17e5c4d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "express-list-endpoints": "^7.1.1", "express-rate-limit": "^8.2.1", "jsonwebtoken": "^9.0.2", + "lucide-react": "^0.555.0", "multer": "^2.0.2", "nodemailer": "^7.0.10", "passport": "^0.7.0", @@ -46,6 +47,7 @@ "@types/jsonwebtoken": "^9.0.10", "@types/multer": "^2.0.0", "@types/node": "^24.10.1", + "@types/node-cron": "^3.0.11", "@types/nodemailer": "^7.0.4", "@types/passport": "^1.0.17", "@types/passport-github2": "^1.2.9", @@ -55,6 +57,7 @@ "@types/pg": "^8.15.6", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", + "@types/sharp": "^0.31.1", "@types/supertest": "^6.0.3", "@types/zxcvbn": "^4.4.5", "@typescript-eslint/eslint-plugin": "^8.47.0", @@ -4471,6 +4474,13 @@ "undici-types": "~7.16.0" } }, + "node_modules/@types/node-cron": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/node-cron/-/node-cron-3.0.11.tgz", + "integrity": "sha512-0ikrnug3/IyneSHqCBeslAhlK2aBfYek1fGo4bP4QnZPmiqSGRK+Oy7ZMisLWkesffJvQ1cqAcBnJC+8+nxIAg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/nodemailer": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-7.0.4.tgz", @@ -4646,6 +4656,16 @@ "@types/node": "*" } }, + "node_modules/@types/sharp": { + "version": "0.31.1", + "resolved": "https://registry.npmjs.org/@types/sharp/-/sharp-0.31.1.tgz", + "integrity": "sha512-5nWwamN9ZFHXaYEincMSuza8nNfOof8nmO+mcI+Agx1uMUk4/pQnNIcix+9rLPXzKrm1pS34+6WRDbDV0Jn7ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/ssh2": { "version": "1.15.5", "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-1.15.5.tgz", @@ -10797,6 +10817,15 @@ "yallist": "^3.0.2" } }, + "node_modules/lucide-react": { + "version": "0.555.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.555.0.tgz", + "integrity": "sha512-D8FvHUGbxWBRQM90NZeIyhAvkFfsh3u9ekrMvJ30Z6gnpBHS6HC6ldLg7tL45hwiIz/u66eKDtdA23gwwGsAHA==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/lz-string": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", diff --git a/package.json b/package.json index ab21f8c1..6246ef4a 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "start": "npm run start:prod", "build": "vite build", "preview": "vite preview", - "test": "node --max-old-space-size=8192 ./node_modules/vitest/vitest.mjs run", + "test": "node --max-old-space-size=8192 ./node_modules/vitest/vitest.mjs run", "test:coverage": "npm run clean; npm run test:unit -- --coverage --reporter=verbose --reporter=tree --includeTaskLocation --testTimeout=20000; npm run test:integration -- --coverage --reporter=verbose --reporter=tree --includeTaskLocation --testTimeout=20000", "test:unit": "node --max-old-space-size=8192 ./node_modules/vitest/vitest.mjs run -c vite.config.ts", "test:integration": "node --max-old-space-size=8192 ./node_modules/vitest/vitest.mjs run -c vitest.config.integration.ts", @@ -30,6 +30,7 @@ "express-list-endpoints": "^7.1.1", "express-rate-limit": "^8.2.1", "jsonwebtoken": "^9.0.2", + "lucide-react": "^0.555.0", "multer": "^2.0.2", "nodemailer": "^7.0.10", "passport": "^0.7.0", @@ -58,6 +59,7 @@ "@types/jsonwebtoken": "^9.0.10", "@types/multer": "^2.0.0", "@types/node": "^24.10.1", + "@types/node-cron": "^3.0.11", "@types/nodemailer": "^7.0.4", "@types/passport": "^1.0.17", "@types/passport-github2": "^1.2.9", @@ -67,6 +69,7 @@ "@types/pg": "^8.15.6", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", + "@types/sharp": "^0.31.1", "@types/supertest": "^6.0.3", "@types/zxcvbn": "^4.4.5", "@typescript-eslint/eslint-plugin": "^8.47.0", diff --git a/src/App.tsx b/src/App.tsx index 2696d1c4..e92eb423 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -35,7 +35,7 @@ import { ResetPasswordPage } from './pages/ResetPasswordPage'; import { AnonymousUserBanner } from './pages/admin/components/AnonymousUserBanner'; import { VoiceLabPage } from './pages/VoiceLabPage'; import { WhatsNewModal } from './components/WhatsNewModal'; -import { FlyerCorrectionTool } from './components/FlyerCorrectionTool'; // This path is now correct after moving the file +import { FlyerCorrectionTool } from './components/FlyerCorrectionTool'; import { QuestionMarkCircleIcon } from './components/icons/QuestionMarkCircleIcon'; /** diff --git a/src/components/AchievementsList.tsx b/src/components/AchievementsList.tsx index cb8c2047..8e7756c5 100644 --- a/src/components/AchievementsList.tsx +++ b/src/components/AchievementsList.tsx @@ -33,7 +33,7 @@ export const AchievementsList: React.FC = ({ achievements
{achievements.map((ach) => (
-
+
diff --git a/src/services/FlyerCorrectionTool.tsx b/src/components/FlyerCorrectionTool.tsx similarity index 100% rename from src/services/FlyerCorrectionTool.tsx rename to src/components/FlyerCorrectionTool.tsx diff --git a/src/services/MyDealsPage.tsx b/src/components/MyDealsPage.tsx similarity index 100% rename from src/services/MyDealsPage.tsx rename to src/components/MyDealsPage.tsx diff --git a/src/RefreshCwIcon.tsx b/src/components/icons/RefreshCwIcon.tsx similarity index 100% rename from src/RefreshCwIcon.tsx rename to src/components/icons/RefreshCwIcon.tsx diff --git a/src/ScanIcon.tsx b/src/components/icons/ScanIcon.tsx similarity index 100% rename from src/ScanIcon.tsx rename to src/components/icons/ScanIcon.tsx diff --git a/src/services/ScissorsIcon.tsx b/src/components/icons/ScissorsIcon.tsx similarity index 100% rename from src/services/ScissorsIcon.tsx rename to src/components/icons/ScissorsIcon.tsx diff --git a/src/features/flyer/FlyerDisplay.tsx b/src/features/flyer/FlyerDisplay.tsx index d5fa5be6..d274adbd 100644 --- a/src/features/flyer/FlyerDisplay.tsx +++ b/src/features/flyer/FlyerDisplay.tsx @@ -46,7 +46,7 @@ export const FlyerDisplay: React.FC = ({ imageUrl, store, val