From 56a230086c67c78f6a70229ac9de5c09e3752f6e Mon Sep 17 00:00:00 2001 From: emanuks Date: Wed, 26 Feb 2025 00:22:36 -0300 Subject: [PATCH 1/4] fix: adding ts and styling fixes --- .gitignore | 3 +- package.json | 9 +- pnpm-lock.yaml | 333 ++++++++++++++++++ src/App.tsx | 2 +- src/components/Filter/Filter.tsx | 21 ++ src/components/Filter/Filter.types.ts | 5 + src/components/Filter/index.ts | 1 + src/components/TaskItem.tsx | 30 -- src/components/TaskItem/TaskItem.tsx | 20 ++ src/components/TaskItem/TaskItem.types.ts | 8 + src/components/TaskItem/index.ts | 1 + src/components/TaskManager.tsx | 89 ----- src/components/TaskManager/TaskManager.tsx | 80 +++++ .../TaskManager/TaskManager.types.ts | 5 + src/components/TaskManager/index.ts | 1 + 15 files changed, 483 insertions(+), 125 deletions(-) create mode 100644 src/components/Filter/Filter.tsx create mode 100644 src/components/Filter/Filter.types.ts create mode 100644 src/components/Filter/index.ts delete mode 100644 src/components/TaskItem.tsx create mode 100644 src/components/TaskItem/TaskItem.tsx create mode 100644 src/components/TaskItem/TaskItem.types.ts create mode 100644 src/components/TaskItem/index.ts delete mode 100644 src/components/TaskManager.tsx create mode 100644 src/components/TaskManager/TaskManager.tsx create mode 100644 src/components/TaskManager/TaskManager.types.ts create mode 100644 src/components/TaskManager/index.ts diff --git a/.gitignore b/.gitignore index 76add87..5232681 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules -dist \ No newline at end of file +dist +.vscode diff --git a/package.json b/package.json index 72d99a3..b619564 100644 --- a/package.json +++ b/package.json @@ -8,17 +8,18 @@ "preview": "vite preview" }, "dependencies": { + "json-server": "1.0.0-beta.3", "react": "^18.2.0", "react-dom": "^18.2.0" }, "devDependencies": { "@types/react": "^18.0.0", "@types/react-dom": "^18.0.0", - "typescript": "^4.6.0", - "vite": "^4.0.0", "@vitejs/plugin-react": "^3.0.0", - "tailwindcss": "^3.0.0", + "autoprefixer": "^10.0.0", "postcss": "^8.0.0", - "autoprefixer": "^10.0.0" + "tailwindcss": "^3.0.0", + "typescript": "^4.6.0", + "vite": "^4.0.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9fe8063..f825164 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: dependencies: + json-server: + specifier: 1.0.0-beta.3 + version: 1.0.0-beta.3 react: specifier: ^18.2.0 version: 18.3.1 @@ -299,6 +302,85 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@polka/url@1.0.0-next.28': + resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + + '@tinyhttp/accepts@2.2.3': + resolution: {integrity: sha512-9pQN6pJAJOU3McmdJWTcyq7LLFW8Lj5q+DadyKcvp+sxMkEpktKX5sbfJgJuOvjk6+1xWl7pe0YL1US1vaO/1w==} + engines: {node: '>=12.20.0'} + + '@tinyhttp/app@2.5.2': + resolution: {integrity: sha512-DcB3Y8GQppLQlO2VxRYF7LzTEAoZb+VRQXuIsErcu2fNaM1xdx6NQZDso5rlZUiaeg6KYYRfU34N4XkZbv6jSA==} + engines: {node: '>=14.21.3'} + + '@tinyhttp/content-disposition@2.2.2': + resolution: {integrity: sha512-crXw1txzrS36huQOyQGYFvhTeLeG0Si1xu+/l6kXUVYpE0TjFjEZRqTbuadQLfKGZ0jaI+jJoRyqaWwxOSHW2g==} + engines: {node: '>=12.20.0'} + + '@tinyhttp/content-type@0.1.4': + resolution: {integrity: sha512-dl6f3SHIJPYbhsW1oXdrqOmLSQF/Ctlv3JnNfXAE22kIP7FosqJHxkz/qj2gv465prG8ODKH5KEyhBkvwrueKQ==} + engines: {node: '>=12.4'} + + '@tinyhttp/cookie-signature@2.1.1': + resolution: {integrity: sha512-VDsSMY5OJfQJIAtUgeQYhqMPSZptehFSfvEEtxr+4nldPA8IImlp3QVcOVuK985g4AFR4Hl1sCbWCXoqBnVWnw==} + engines: {node: '>=12.20.0'} + + '@tinyhttp/cookie@2.1.1': + resolution: {integrity: sha512-h/kL9jY0e0Dvad+/QU3efKZww0aTvZJslaHj3JTPmIPC9Oan9+kYqmh3M6L5JUQRuTJYFK2nzgL2iJtH2S+6dA==} + engines: {node: '>=12.20.0'} + + '@tinyhttp/cors@2.0.1': + resolution: {integrity: sha512-qrmo6WJuaiCzKWagv2yA/kw6hIISfF/hOqPWwmI6w0o8apeTMmRN3DoCFvQ/wNVuWVdU5J4KU7OX8aaSOEq51A==} + engines: {node: '>=12.20 || 14.x || >=16'} + + '@tinyhttp/encode-url@2.1.1': + resolution: {integrity: sha512-AhY+JqdZ56qV77tzrBm0qThXORbsVjs/IOPgGCS7x/wWnsa/Bx30zDUU/jPAUcSzNOzt860x9fhdGpzdqbUeUw==} + engines: {node: '>=12.20.0'} + + '@tinyhttp/etag@2.1.2': + resolution: {integrity: sha512-j80fPKimGqdmMh6962y+BtQsnYPVCzZfJw0HXjyH70VaJBHLKGF+iYhcKqzI3yef6QBNa8DKIPsbEYpuwApXTw==} + engines: {node: '>=12.20.0'} + + '@tinyhttp/forwarded@2.1.2': + resolution: {integrity: sha512-9H/eulJ68ElY/+zYpTpNhZ7vxGV+cnwaR6+oQSm7bVgZMyuQfgROW/qvZuhmgDTIxnGMXst+Ba4ij6w6Krcs3w==} + engines: {node: '>=12.20.0'} + + '@tinyhttp/logger@2.0.0': + resolution: {integrity: sha512-8DfLQjGDIaIJeivYamVrrpmwmsGwS8wt2DGvzlcY5HEBagdiI4QJy/veAFcUHuaJqufn4wLwmn4q5VUkW8BCpQ==} + engines: {node: '>=14.18 || >=16.20'} + + '@tinyhttp/proxy-addr@2.2.1': + resolution: {integrity: sha512-BicqMqVI91hHq2BQmnqJUh0FQUnx7DncwSGgu2ghlh+JZG2rHK2ZN/rXkfhrx1rrUw6hnd0L36O8GPMh01+dDQ==} + engines: {node: '>=12.20.0'} + + '@tinyhttp/req@2.2.5': + resolution: {integrity: sha512-trfsXwtmsNjMcGKcLJ+45h912kLRqBQCQD06ams3Tq0kf4gHLxjHjoYOC1Z9yGjOn81XllRx8wqvnvr+Kbe3gw==} + engines: {node: '>=12.20.0'} + + '@tinyhttp/res@2.2.5': + resolution: {integrity: sha512-yBsqjWygpuKAVz4moWlP4hqzwiDDqfrn2mA0wviJAcgvGiyOErtlQwXY7aj3aPiCpURvxvEFO//Gdy6yV+xEpA==} + engines: {node: '>=12.20.0'} + + '@tinyhttp/router@2.2.3': + resolution: {integrity: sha512-O0MQqWV3Vpg/uXsMYg19XsIgOhwjyhTYWh51Qng7bxqXixxx2PEvZWnFjP7c84K7kU/nUX41KpkEBTLnznk9/Q==} + engines: {node: '>=12.20.0'} + + '@tinyhttp/send@2.2.3': + resolution: {integrity: sha512-o4cVHHGQ8WjVBS8UT0EE/2WnjoybrfXikHwsRoNlG1pfrC/Sd01u1N4Te8cOd/9aNGLr4mGxWb5qTm2RRtEi7g==} + engines: {node: '>=12.20.0'} + + '@tinyhttp/type-is@2.2.4': + resolution: {integrity: sha512-7F328NheridwjIfefBB2j1PEcKKABpADgv7aCJaE8x8EON77ZFrAkI3Rir7pGjopV7V9MBmW88xUQigBEX2rmQ==} + engines: {node: '>=12.20.0'} + + '@tinyhttp/url@2.1.1': + resolution: {integrity: sha512-POJeq2GQ5jI7Zrdmj22JqOijB5/GeX+LEX7DUdml1hUnGbJOTWDx7zf2b5cCERj7RoXL67zTgyzVblBJC+NJWg==} + engines: {node: '>=12.20.0'} + + '@tinyhttp/vary@0.1.3': + resolution: {integrity: sha512-SoL83sQXAGiHN1jm2VwLUWQSQeDAAl1ywOm6T0b0Cg1CZhVsjoiZadmjhxF6FHCCY7OHHVaLnTgSMxTPIDLxMg==} + engines: {node: '>=12.20'} + '@types/prop-types@15.7.14': resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} @@ -375,10 +457,18 @@ packages: caniuse-lite@1.0.30001700: resolution: {integrity: sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==} + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -386,6 +476,9 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -405,6 +498,9 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -420,6 +516,10 @@ packages: dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dot-prop@9.0.0: + resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} + engines: {node: '>=18'} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -432,6 +532,10 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + es-escape-html@0.1.1: + resolution: {integrity: sha512-yUx1o+8RsG7UlszmYPtks+dm6Lho2m8lgHMOsLJQsFI0R8XwUJwiMhM1M4E/S8QLeGyf6MkDV/pWgjQ0tdTSyQ==} + engines: {node: '>=12.x'} + esbuild@0.18.20: resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} engines: {node: '>=12'} @@ -441,6 +545,10 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + eta@3.5.0: + resolution: {integrity: sha512-e3x3FBvGzeCIHhF+zhK8FZA2vC5uFn6b4HJjegUbIWrDb4mJ7JjTGMJY9VGIbRVpmSwHopNiaJibhjIr+HfLug==} + engines: {node: '>=6.0.0'} + fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -491,6 +599,21 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + header-range-parser@1.1.3: + resolution: {integrity: sha512-B9zCFt3jH8g09LR1vHL4pcAn8yMEtlSlOUdQemzHMRKMImNIhhszdeosYFfNW0WXKQtXIlWB+O4owHJKvEJYaA==} + engines: {node: '>=12.22.0'} + + http-status-emojis@2.2.0: + resolution: {integrity: sha512-ompKtgwpx8ff0hsbpIB7oE4ax1LXoHmftsHHStMELX56ivG3GhofTX8ZHWlUaFKfGjcGjw6G3rPk7dJRXMmbbg==} + + inflection@3.0.2: + resolution: {integrity: sha512-+Bg3+kg+J6JUWn8J6bzFmOWkTQ6L/NHfDRSYU+EVvuKHDxUDHAXgqixHfVlzuBQaPOTac8hn43aPhMNk6rMe3g==} + engines: {node: '>=18.0.0'} + + ipaddr.js@2.2.0: + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + engines: {node: '>= 10'} + is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -533,6 +656,11 @@ packages: engines: {node: '>=6'} hasBin: true + json-server@1.0.0-beta.3: + resolution: {integrity: sha512-DwE69Ep5ccwIJZBUIWEENC30Yj8bwr4Ax9W9VoIWAYnB8Sj4ReptscO8/DRHv/nXwVlmb3Bk73Ls86+VZdYkkA==} + engines: {node: '>=18.3'} + hasBin: true + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -549,6 +677,10 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + lowdb@7.0.1: + resolution: {integrity: sha512-neJAj8GwF0e8EpycYIDFqEPcx9Qz4GUho20jWFR7YiFeXzF1YMLdxB36PypcTSPMA+4+LvgyMacYhlr18Zlymw==} + engines: {node: '>=18'} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -567,6 +699,15 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + milliparsec@4.0.0: + resolution: {integrity: sha512-/wk9d4Z6/9ZvoEH/6BI4TrTCgmkpZPuSRN/6fI9aUHOfXdNTuj/VhLS7d+NqG26bi6L9YmGXutVYvWC8zQ0qtA==} + engines: {node: '>=20'} + + mime@4.0.4: + resolution: {integrity: sha512-v8yqInVjhXyqP6+Kw4fV3ZzeMRqEW6FotRsKXjRS5VMTNIuXsdRoAvklpoRgSqXm6o9VNH4/C0mgedko9DdLsQ==} + engines: {node: '>=16'} + hasBin: true + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -575,6 +716,10 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -586,6 +731,10 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} @@ -698,6 +847,14 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + regexparam@2.0.2: + resolution: {integrity: sha512-A1PeDEYMrkLrfyOwv2jwihXbo9qxdGD3atBYQA9JJgreAx8/7rC6IUkWOw2NQlOxLp2wL0ifQbh1HuidDfYA6w==} + engines: {node: '>=8'} + resolve@1.22.10: resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} engines: {node: '>= 0.4'} @@ -734,10 +891,22 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + sirv@2.0.4: + resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} + engines: {node: '>= 10'} + + sort-on@6.1.0: + resolution: {integrity: sha512-WTECP0nYNWO1n2g5bpsV0yZN9cBmZsF8ThHFbOqVN0HBFRoaQZLLEMvMmJlKHNPYQeVngeI5+jJzIfFqOIo1OA==} + engines: {node: '>=18'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + steno@4.0.2: + resolution: {integrity: sha512-yhPIQXjrlt1xv7dyPQg2P17URmXbuM5pdGkpiMB3RenprfiBlvK415Lctfe0eshk90oA7/tNq7WEiMK8RSP39A==} + engines: {node: '>=18'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -779,9 +948,17 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + type-fest@4.35.0: + resolution: {integrity: sha512-2/AwEFQDFEy30iOLjrvHDIH7e4HEWH+f1Yl1bI5XMqzuoCUqwYCdxachgsgv0og/JdVZUhbfjcJAoHj5L1753A==} + engines: {node: '>=16'} + typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} @@ -1071,6 +1248,88 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@polka/url@1.0.0-next.28': {} + + '@tinyhttp/accepts@2.2.3': + dependencies: + mime: 4.0.4 + negotiator: 0.6.4 + + '@tinyhttp/app@2.5.2': + dependencies: + '@tinyhttp/cookie': 2.1.1 + '@tinyhttp/proxy-addr': 2.2.1 + '@tinyhttp/req': 2.2.5 + '@tinyhttp/res': 2.2.5 + '@tinyhttp/router': 2.2.3 + header-range-parser: 1.1.3 + regexparam: 2.0.2 + + '@tinyhttp/content-disposition@2.2.2': {} + + '@tinyhttp/content-type@0.1.4': {} + + '@tinyhttp/cookie-signature@2.1.1': {} + + '@tinyhttp/cookie@2.1.1': {} + + '@tinyhttp/cors@2.0.1': + dependencies: + '@tinyhttp/vary': 0.1.3 + + '@tinyhttp/encode-url@2.1.1': {} + + '@tinyhttp/etag@2.1.2': {} + + '@tinyhttp/forwarded@2.1.2': {} + + '@tinyhttp/logger@2.0.0': + dependencies: + colorette: 2.0.20 + dayjs: 1.11.13 + http-status-emojis: 2.2.0 + + '@tinyhttp/proxy-addr@2.2.1': + dependencies: + '@tinyhttp/forwarded': 2.1.2 + ipaddr.js: 2.2.0 + + '@tinyhttp/req@2.2.5': + dependencies: + '@tinyhttp/accepts': 2.2.3 + '@tinyhttp/type-is': 2.2.4 + '@tinyhttp/url': 2.1.1 + header-range-parser: 1.1.3 + + '@tinyhttp/res@2.2.5': + dependencies: + '@tinyhttp/content-disposition': 2.2.2 + '@tinyhttp/cookie': 2.1.1 + '@tinyhttp/cookie-signature': 2.1.1 + '@tinyhttp/encode-url': 2.1.1 + '@tinyhttp/req': 2.2.5 + '@tinyhttp/send': 2.2.3 + '@tinyhttp/vary': 0.1.3 + es-escape-html: 0.1.1 + mime: 4.0.4 + + '@tinyhttp/router@2.2.3': {} + + '@tinyhttp/send@2.2.3': + dependencies: + '@tinyhttp/content-type': 0.1.4 + '@tinyhttp/etag': 2.1.2 + mime: 4.0.4 + + '@tinyhttp/type-is@2.2.4': + dependencies: + '@tinyhttp/content-type': 0.1.4 + mime: 4.0.4 + + '@tinyhttp/url@2.1.1': {} + + '@tinyhttp/vary@0.1.3': {} + '@types/prop-types@15.7.14': {} '@types/react-dom@18.3.5(@types/react@18.3.18)': @@ -1145,6 +1404,8 @@ snapshots: caniuse-lite@1.0.30001700: {} + chalk@5.4.1: {} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -1157,12 +1418,18 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + color-convert@2.0.1: dependencies: color-name: 1.1.4 color-name@1.1.4: {} + colorette@2.0.20: {} + commander@4.1.1: {} convert-source-map@2.0.0: {} @@ -1177,6 +1444,8 @@ snapshots: csstype@3.1.3: {} + dayjs@1.11.13: {} + debug@4.4.0: dependencies: ms: 2.1.3 @@ -1185,6 +1454,10 @@ snapshots: dlv@1.1.3: {} + dot-prop@9.0.0: + dependencies: + type-fest: 4.35.0 + eastasianwidth@0.2.0: {} electron-to-chromium@1.5.103: {} @@ -1193,6 +1466,8 @@ snapshots: emoji-regex@9.2.2: {} + es-escape-html@0.1.1: {} + esbuild@0.18.20: optionalDependencies: '@esbuild/android-arm': 0.18.20 @@ -1220,6 +1495,8 @@ snapshots: escalade@3.2.0: {} + eta@3.5.0: {} + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -1273,6 +1550,14 @@ snapshots: dependencies: function-bind: 1.1.2 + header-range-parser@1.1.3: {} + + http-status-emojis@2.2.0: {} + + inflection@3.0.2: {} + + ipaddr.js@2.2.0: {} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 @@ -1305,6 +1590,22 @@ snapshots: jsesc@3.1.0: {} + json-server@1.0.0-beta.3: + dependencies: + '@tinyhttp/app': 2.5.2 + '@tinyhttp/cors': 2.0.1 + '@tinyhttp/logger': 2.0.0 + chalk: 5.4.1 + chokidar: 4.0.3 + dot-prop: 9.0.0 + eta: 3.5.0 + inflection: 3.0.2 + json5: 2.2.3 + lowdb: 7.0.1 + milliparsec: 4.0.0 + sirv: 2.0.4 + sort-on: 6.1.0 + json5@2.2.3: {} lilconfig@3.1.3: {} @@ -1315,6 +1616,10 @@ snapshots: dependencies: js-tokens: 4.0.0 + lowdb@7.0.1: + dependencies: + steno: 4.0.2 + lru-cache@10.4.3: {} lru-cache@5.1.1: @@ -1332,12 +1637,18 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + milliparsec@4.0.0: {} + + mime@4.0.4: {} + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 minipass@7.1.2: {} + mrmime@2.0.1: {} + ms@2.1.3: {} mz@2.7.0: @@ -1348,6 +1659,8 @@ snapshots: nanoid@3.3.8: {} + negotiator@0.6.4: {} + node-releases@2.0.19: {} normalize-path@3.0.0: {} @@ -1436,6 +1749,10 @@ snapshots: dependencies: picomatch: 2.3.1 + readdirp@4.1.2: {} + + regexparam@2.0.2: {} + resolve@1.22.10: dependencies: is-core-module: 2.16.1 @@ -1466,8 +1783,20 @@ snapshots: signal-exit@4.1.0: {} + sirv@2.0.4: + dependencies: + '@polka/url': 1.0.0-next.28 + mrmime: 2.0.1 + totalist: 3.0.1 + + sort-on@6.1.0: + dependencies: + dot-prop: 9.0.0 + source-map-js@1.2.1: {} + steno@4.0.2: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -1539,8 +1868,12 @@ snapshots: dependencies: is-number: 7.0.0 + totalist@3.0.1: {} + ts-interface-checker@0.1.13: {} + type-fest@4.35.0: {} + typescript@4.9.5: {} update-browserslist-db@1.1.2(browserslist@4.24.4): diff --git a/src/App.tsx b/src/App.tsx index fcd2850..6002c16 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,6 +1,6 @@ import React from "react"; -import TaskManager from "./components/TaskManager"; +import { TaskManager } from "./components/TaskManager"; function App() { return ( diff --git a/src/components/Filter/Filter.tsx b/src/components/Filter/Filter.tsx new file mode 100644 index 0000000..8657f86 --- /dev/null +++ b/src/components/Filter/Filter.tsx @@ -0,0 +1,21 @@ +import React from "react"; + +import { FilterProps } from "./Filter.types"; + +export const Filter = ({ statuses, onFilter, currentStatus }: FilterProps) => { + return ( +
+ {statuses.map((status) => ( + + ))} +
+ ); +}; diff --git a/src/components/Filter/Filter.types.ts b/src/components/Filter/Filter.types.ts new file mode 100644 index 0000000..9b9876f --- /dev/null +++ b/src/components/Filter/Filter.types.ts @@ -0,0 +1,5 @@ +export interface FilterProps { + currentStatus: string; + statuses: string[]; + onFilter: (filter: string) => void; +} diff --git a/src/components/Filter/index.ts b/src/components/Filter/index.ts new file mode 100644 index 0000000..0eea779 --- /dev/null +++ b/src/components/Filter/index.ts @@ -0,0 +1 @@ +export * from './Filter'; diff --git a/src/components/TaskItem.tsx b/src/components/TaskItem.tsx deleted file mode 100644 index 6c2a176..0000000 --- a/src/components/TaskItem.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import React from "react"; - -const TaskItem = ({ task, onDelete, onToggle }: any) => { - return ( -
  • - onToggle(task.id)} - className={`cursor-pointer ${ - task.isCompleted ? "text-black" : "line-through text-green-500" - }`} - > - {task.title} - - - -
  • - ); -}; - -export default TaskItem; diff --git a/src/components/TaskItem/TaskItem.tsx b/src/components/TaskItem/TaskItem.tsx new file mode 100644 index 0000000..70beae7 --- /dev/null +++ b/src/components/TaskItem/TaskItem.tsx @@ -0,0 +1,20 @@ +import React from "react"; + +import { TaskItemProps } from "./TaskItem.types"; + +export const TaskItem = ({ task, onDelete, onToggle }: TaskItemProps) => { + return ( +
  • + + + +
  • + ); +}; diff --git a/src/components/TaskItem/TaskItem.types.ts b/src/components/TaskItem/TaskItem.types.ts new file mode 100644 index 0000000..de496f1 --- /dev/null +++ b/src/components/TaskItem/TaskItem.types.ts @@ -0,0 +1,8 @@ + +import { ITask } from "../TaskManager/TaskManager.types"; + +export interface TaskItemProps { + task: ITask; + onToggle: (id: number) => void; + onDelete: (id: number) => void; +} diff --git a/src/components/TaskItem/index.ts b/src/components/TaskItem/index.ts new file mode 100644 index 0000000..3d23b46 --- /dev/null +++ b/src/components/TaskItem/index.ts @@ -0,0 +1 @@ +export * from './TaskItem'; diff --git a/src/components/TaskManager.tsx b/src/components/TaskManager.tsx deleted file mode 100644 index 7b280e8..0000000 --- a/src/components/TaskManager.tsx +++ /dev/null @@ -1,89 +0,0 @@ -import React, { useState } from "react"; - -import TaskItem from "./TaskItem"; - -const TaskManager = () => { - const [tasks, setTasks] = useState([ - { id: 1, title: "Buy groceries", completed: false }, - { id: 2, title: "Clean the house", completed: true }, - ]); - const [filter, setFilter] = useState("all"); - const [newTask, setNewTask] = useState(); - - // Intentional bug: The filter conditions are reversed. - const filteredTasks = tasks.filter((task) => { - if (filter === "completed") return task.completed === false; - if (filter === "pending") return task.completed === true; - return true; - }); - - const handleAddTask = (e: React.FormEvent) => { - e.preventDefault(); - if (newTask!.trim() === "") return; - const newTaskObj = { - id: tasks.length + 1, - name: newTask, - completed: false, - }; - setTasks([...tasks, newTaskObj]); - setNewTask(""); - }; - - // Intentional bug: Directly mutating the tasks array when deleting. - const handleDeleteTask = (id: number) => { - const index = tasks.findIndex((task) => task.id === id); - if (index !== -1) { - tasks.splice(index, 1); - setTasks(tasks); - } - }; - - const toggleTaskCompletion = (id: number) => { - const task = tasks.find((task) => task.id === id); - - task.isCompleted = !task.isCompleted; - }; - - return ( -
    -
    - setNewTask(e.target.value)} - className="flex-grow border rounded-l py-2 px-3" - /> - -
    -
    - - - -
    -
      - {filteredTasks.map((task) => ( - - ))} -
    -
    - ); -}; - -export default TaskManager; diff --git a/src/components/TaskManager/TaskManager.tsx b/src/components/TaskManager/TaskManager.tsx new file mode 100644 index 0000000..1146d14 --- /dev/null +++ b/src/components/TaskManager/TaskManager.tsx @@ -0,0 +1,80 @@ +import React, { useState } from "react"; + +import { Filter } from "../Filter"; +import { TaskItem } from "../TaskItem"; + +import { ITask } from "./TaskManager.types"; + +export const TaskManager = () => { + const [tasks, setTasks] = useState([ + { id: 1, title: "Buy groceries", completed: false }, + { id: 2, title: "Clean the house", completed: true }, + ]); + const [filter, setFilter] = useState("all"); + const [newTask, setNewTask] = useState(""); + const statuses = ["all", "completed", "pending"]; + + const filteredTasks = tasks.filter((task) => { + if (filter === "completed") return task.completed; + if (filter === "pending") return !task.completed; + return true; + }); + + const handleAddTask = (e: React.FormEvent) => { + e.preventDefault(); + + if (newTask!.trim() === "") return; + + const newTaskObj = { + id: tasks.length + 1, + title: newTask, + completed: false, + }; + + setTasks([...tasks, newTaskObj]); + setNewTask(""); + }; + + const handleDeleteTask = (id: number) => { + const newTasks = tasks.filter((task) => task.id !== id); + + setTasks(newTasks); + }; + + const toggleTaskCompletion = (id: number) => { + const newTasks = tasks.map((task) => { + if (task.id === id) { + task.completed = !task.completed; + } + + return task; + }); + + setTasks(newTasks); + }; + + return ( +
    +
    + setNewTask(e.target.value)} + className="flex-grow border rounded-l py-2 px-3" + /> + +
    + + + +
      + {filteredTasks.map((task) => ( + + ))} +
    +
    + ); +}; diff --git a/src/components/TaskManager/TaskManager.types.ts b/src/components/TaskManager/TaskManager.types.ts new file mode 100644 index 0000000..f8138c7 --- /dev/null +++ b/src/components/TaskManager/TaskManager.types.ts @@ -0,0 +1,5 @@ +export interface ITask { + id: number; + title: string; + completed: boolean; +} diff --git a/src/components/TaskManager/index.ts b/src/components/TaskManager/index.ts new file mode 100644 index 0000000..c08b640 --- /dev/null +++ b/src/components/TaskManager/index.ts @@ -0,0 +1 @@ +export * from './TaskManager'; From 0f13d16c8c9c5f078b48bf3d2b29f5b30af5ebf0 Mon Sep 17 00:00:00 2001 From: emanuks Date: Wed, 26 Feb 2025 00:25:20 -0300 Subject: [PATCH 2/4] feat: adding db json --- db.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 db.json diff --git a/db.json b/db.json new file mode 100644 index 0000000..f2d4eac --- /dev/null +++ b/db.json @@ -0,0 +1,6 @@ +{ + "tasks": [ + { "id": 1, "title": "Buy groceries", "completed": false }, + { "id": 2, "title": "Clean the house", "completed": true } + ] +} From 30b1e603e0fe7b7dda7087e2cabc227aa2d4ecfa Mon Sep 17 00:00:00 2001 From: emanuks Date: Wed, 26 Feb 2025 00:55:14 -0300 Subject: [PATCH 3/4] feat: adding persistence --- db.json | 6 - package.json | 1 - pnpm-lock.yaml | 333 --------------------- src/components/TaskForm/TaskForm.tsx | 31 ++ src/components/TaskForm/TaskForm.types.ts | 3 + src/components/TaskForm/index.ts | 1 + src/components/TaskManager/TaskManager.tsx | 53 ++-- 7 files changed, 63 insertions(+), 365 deletions(-) delete mode 100644 db.json create mode 100644 src/components/TaskForm/TaskForm.tsx create mode 100644 src/components/TaskForm/TaskForm.types.ts create mode 100644 src/components/TaskForm/index.ts diff --git a/db.json b/db.json deleted file mode 100644 index f2d4eac..0000000 --- a/db.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "tasks": [ - { "id": 1, "title": "Buy groceries", "completed": false }, - { "id": 2, "title": "Clean the house", "completed": true } - ] -} diff --git a/package.json b/package.json index b619564..bd6222d 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,6 @@ "preview": "vite preview" }, "dependencies": { - "json-server": "1.0.0-beta.3", "react": "^18.2.0", "react-dom": "^18.2.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f825164..9fe8063 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,6 @@ importers: .: dependencies: - json-server: - specifier: 1.0.0-beta.3 - version: 1.0.0-beta.3 react: specifier: ^18.2.0 version: 18.3.1 @@ -302,85 +299,6 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@polka/url@1.0.0-next.28': - resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} - - '@tinyhttp/accepts@2.2.3': - resolution: {integrity: sha512-9pQN6pJAJOU3McmdJWTcyq7LLFW8Lj5q+DadyKcvp+sxMkEpktKX5sbfJgJuOvjk6+1xWl7pe0YL1US1vaO/1w==} - engines: {node: '>=12.20.0'} - - '@tinyhttp/app@2.5.2': - resolution: {integrity: sha512-DcB3Y8GQppLQlO2VxRYF7LzTEAoZb+VRQXuIsErcu2fNaM1xdx6NQZDso5rlZUiaeg6KYYRfU34N4XkZbv6jSA==} - engines: {node: '>=14.21.3'} - - '@tinyhttp/content-disposition@2.2.2': - resolution: {integrity: sha512-crXw1txzrS36huQOyQGYFvhTeLeG0Si1xu+/l6kXUVYpE0TjFjEZRqTbuadQLfKGZ0jaI+jJoRyqaWwxOSHW2g==} - engines: {node: '>=12.20.0'} - - '@tinyhttp/content-type@0.1.4': - resolution: {integrity: sha512-dl6f3SHIJPYbhsW1oXdrqOmLSQF/Ctlv3JnNfXAE22kIP7FosqJHxkz/qj2gv465prG8ODKH5KEyhBkvwrueKQ==} - engines: {node: '>=12.4'} - - '@tinyhttp/cookie-signature@2.1.1': - resolution: {integrity: sha512-VDsSMY5OJfQJIAtUgeQYhqMPSZptehFSfvEEtxr+4nldPA8IImlp3QVcOVuK985g4AFR4Hl1sCbWCXoqBnVWnw==} - engines: {node: '>=12.20.0'} - - '@tinyhttp/cookie@2.1.1': - resolution: {integrity: sha512-h/kL9jY0e0Dvad+/QU3efKZww0aTvZJslaHj3JTPmIPC9Oan9+kYqmh3M6L5JUQRuTJYFK2nzgL2iJtH2S+6dA==} - engines: {node: '>=12.20.0'} - - '@tinyhttp/cors@2.0.1': - resolution: {integrity: sha512-qrmo6WJuaiCzKWagv2yA/kw6hIISfF/hOqPWwmI6w0o8apeTMmRN3DoCFvQ/wNVuWVdU5J4KU7OX8aaSOEq51A==} - engines: {node: '>=12.20 || 14.x || >=16'} - - '@tinyhttp/encode-url@2.1.1': - resolution: {integrity: sha512-AhY+JqdZ56qV77tzrBm0qThXORbsVjs/IOPgGCS7x/wWnsa/Bx30zDUU/jPAUcSzNOzt860x9fhdGpzdqbUeUw==} - engines: {node: '>=12.20.0'} - - '@tinyhttp/etag@2.1.2': - resolution: {integrity: sha512-j80fPKimGqdmMh6962y+BtQsnYPVCzZfJw0HXjyH70VaJBHLKGF+iYhcKqzI3yef6QBNa8DKIPsbEYpuwApXTw==} - engines: {node: '>=12.20.0'} - - '@tinyhttp/forwarded@2.1.2': - resolution: {integrity: sha512-9H/eulJ68ElY/+zYpTpNhZ7vxGV+cnwaR6+oQSm7bVgZMyuQfgROW/qvZuhmgDTIxnGMXst+Ba4ij6w6Krcs3w==} - engines: {node: '>=12.20.0'} - - '@tinyhttp/logger@2.0.0': - resolution: {integrity: sha512-8DfLQjGDIaIJeivYamVrrpmwmsGwS8wt2DGvzlcY5HEBagdiI4QJy/veAFcUHuaJqufn4wLwmn4q5VUkW8BCpQ==} - engines: {node: '>=14.18 || >=16.20'} - - '@tinyhttp/proxy-addr@2.2.1': - resolution: {integrity: sha512-BicqMqVI91hHq2BQmnqJUh0FQUnx7DncwSGgu2ghlh+JZG2rHK2ZN/rXkfhrx1rrUw6hnd0L36O8GPMh01+dDQ==} - engines: {node: '>=12.20.0'} - - '@tinyhttp/req@2.2.5': - resolution: {integrity: sha512-trfsXwtmsNjMcGKcLJ+45h912kLRqBQCQD06ams3Tq0kf4gHLxjHjoYOC1Z9yGjOn81XllRx8wqvnvr+Kbe3gw==} - engines: {node: '>=12.20.0'} - - '@tinyhttp/res@2.2.5': - resolution: {integrity: sha512-yBsqjWygpuKAVz4moWlP4hqzwiDDqfrn2mA0wviJAcgvGiyOErtlQwXY7aj3aPiCpURvxvEFO//Gdy6yV+xEpA==} - engines: {node: '>=12.20.0'} - - '@tinyhttp/router@2.2.3': - resolution: {integrity: sha512-O0MQqWV3Vpg/uXsMYg19XsIgOhwjyhTYWh51Qng7bxqXixxx2PEvZWnFjP7c84K7kU/nUX41KpkEBTLnznk9/Q==} - engines: {node: '>=12.20.0'} - - '@tinyhttp/send@2.2.3': - resolution: {integrity: sha512-o4cVHHGQ8WjVBS8UT0EE/2WnjoybrfXikHwsRoNlG1pfrC/Sd01u1N4Te8cOd/9aNGLr4mGxWb5qTm2RRtEi7g==} - engines: {node: '>=12.20.0'} - - '@tinyhttp/type-is@2.2.4': - resolution: {integrity: sha512-7F328NheridwjIfefBB2j1PEcKKABpADgv7aCJaE8x8EON77ZFrAkI3Rir7pGjopV7V9MBmW88xUQigBEX2rmQ==} - engines: {node: '>=12.20.0'} - - '@tinyhttp/url@2.1.1': - resolution: {integrity: sha512-POJeq2GQ5jI7Zrdmj22JqOijB5/GeX+LEX7DUdml1hUnGbJOTWDx7zf2b5cCERj7RoXL67zTgyzVblBJC+NJWg==} - engines: {node: '>=12.20.0'} - - '@tinyhttp/vary@0.1.3': - resolution: {integrity: sha512-SoL83sQXAGiHN1jm2VwLUWQSQeDAAl1ywOm6T0b0Cg1CZhVsjoiZadmjhxF6FHCCY7OHHVaLnTgSMxTPIDLxMg==} - engines: {node: '>=12.20'} - '@types/prop-types@15.7.14': resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} @@ -457,18 +375,10 @@ packages: caniuse-lite@1.0.30001700: resolution: {integrity: sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==} - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -476,9 +386,6 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -498,9 +405,6 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - dayjs@1.11.13: - resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} - debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -516,10 +420,6 @@ packages: dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - dot-prop@9.0.0: - resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} - engines: {node: '>=18'} - eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -532,10 +432,6 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - es-escape-html@0.1.1: - resolution: {integrity: sha512-yUx1o+8RsG7UlszmYPtks+dm6Lho2m8lgHMOsLJQsFI0R8XwUJwiMhM1M4E/S8QLeGyf6MkDV/pWgjQ0tdTSyQ==} - engines: {node: '>=12.x'} - esbuild@0.18.20: resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} engines: {node: '>=12'} @@ -545,10 +441,6 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - eta@3.5.0: - resolution: {integrity: sha512-e3x3FBvGzeCIHhF+zhK8FZA2vC5uFn6b4HJjegUbIWrDb4mJ7JjTGMJY9VGIbRVpmSwHopNiaJibhjIr+HfLug==} - engines: {node: '>=6.0.0'} - fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -599,21 +491,6 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - header-range-parser@1.1.3: - resolution: {integrity: sha512-B9zCFt3jH8g09LR1vHL4pcAn8yMEtlSlOUdQemzHMRKMImNIhhszdeosYFfNW0WXKQtXIlWB+O4owHJKvEJYaA==} - engines: {node: '>=12.22.0'} - - http-status-emojis@2.2.0: - resolution: {integrity: sha512-ompKtgwpx8ff0hsbpIB7oE4ax1LXoHmftsHHStMELX56ivG3GhofTX8ZHWlUaFKfGjcGjw6G3rPk7dJRXMmbbg==} - - inflection@3.0.2: - resolution: {integrity: sha512-+Bg3+kg+J6JUWn8J6bzFmOWkTQ6L/NHfDRSYU+EVvuKHDxUDHAXgqixHfVlzuBQaPOTac8hn43aPhMNk6rMe3g==} - engines: {node: '>=18.0.0'} - - ipaddr.js@2.2.0: - resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} - engines: {node: '>= 10'} - is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -656,11 +533,6 @@ packages: engines: {node: '>=6'} hasBin: true - json-server@1.0.0-beta.3: - resolution: {integrity: sha512-DwE69Ep5ccwIJZBUIWEENC30Yj8bwr4Ax9W9VoIWAYnB8Sj4ReptscO8/DRHv/nXwVlmb3Bk73Ls86+VZdYkkA==} - engines: {node: '>=18.3'} - hasBin: true - json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -677,10 +549,6 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - lowdb@7.0.1: - resolution: {integrity: sha512-neJAj8GwF0e8EpycYIDFqEPcx9Qz4GUho20jWFR7YiFeXzF1YMLdxB36PypcTSPMA+4+LvgyMacYhlr18Zlymw==} - engines: {node: '>=18'} - lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -699,15 +567,6 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - milliparsec@4.0.0: - resolution: {integrity: sha512-/wk9d4Z6/9ZvoEH/6BI4TrTCgmkpZPuSRN/6fI9aUHOfXdNTuj/VhLS7d+NqG26bi6L9YmGXutVYvWC8zQ0qtA==} - engines: {node: '>=20'} - - mime@4.0.4: - resolution: {integrity: sha512-v8yqInVjhXyqP6+Kw4fV3ZzeMRqEW6FotRsKXjRS5VMTNIuXsdRoAvklpoRgSqXm6o9VNH4/C0mgedko9DdLsQ==} - engines: {node: '>=16'} - hasBin: true - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -716,10 +575,6 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - mrmime@2.0.1: - resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} - engines: {node: '>=10'} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -731,10 +586,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - negotiator@0.6.4: - resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} - engines: {node: '>= 0.6'} - node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} @@ -847,14 +698,6 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} - - regexparam@2.0.2: - resolution: {integrity: sha512-A1PeDEYMrkLrfyOwv2jwihXbo9qxdGD3atBYQA9JJgreAx8/7rC6IUkWOw2NQlOxLp2wL0ifQbh1HuidDfYA6w==} - engines: {node: '>=8'} - resolve@1.22.10: resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} engines: {node: '>= 0.4'} @@ -891,22 +734,10 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - sirv@2.0.4: - resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} - engines: {node: '>= 10'} - - sort-on@6.1.0: - resolution: {integrity: sha512-WTECP0nYNWO1n2g5bpsV0yZN9cBmZsF8ThHFbOqVN0HBFRoaQZLLEMvMmJlKHNPYQeVngeI5+jJzIfFqOIo1OA==} - engines: {node: '>=18'} - source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - steno@4.0.2: - resolution: {integrity: sha512-yhPIQXjrlt1xv7dyPQg2P17URmXbuM5pdGkpiMB3RenprfiBlvK415Lctfe0eshk90oA7/tNq7WEiMK8RSP39A==} - engines: {node: '>=18'} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -948,17 +779,9 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - totalist@3.0.1: - resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} - engines: {node: '>=6'} - ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - type-fest@4.35.0: - resolution: {integrity: sha512-2/AwEFQDFEy30iOLjrvHDIH7e4HEWH+f1Yl1bI5XMqzuoCUqwYCdxachgsgv0og/JdVZUhbfjcJAoHj5L1753A==} - engines: {node: '>=16'} - typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} @@ -1248,88 +1071,6 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@polka/url@1.0.0-next.28': {} - - '@tinyhttp/accepts@2.2.3': - dependencies: - mime: 4.0.4 - negotiator: 0.6.4 - - '@tinyhttp/app@2.5.2': - dependencies: - '@tinyhttp/cookie': 2.1.1 - '@tinyhttp/proxy-addr': 2.2.1 - '@tinyhttp/req': 2.2.5 - '@tinyhttp/res': 2.2.5 - '@tinyhttp/router': 2.2.3 - header-range-parser: 1.1.3 - regexparam: 2.0.2 - - '@tinyhttp/content-disposition@2.2.2': {} - - '@tinyhttp/content-type@0.1.4': {} - - '@tinyhttp/cookie-signature@2.1.1': {} - - '@tinyhttp/cookie@2.1.1': {} - - '@tinyhttp/cors@2.0.1': - dependencies: - '@tinyhttp/vary': 0.1.3 - - '@tinyhttp/encode-url@2.1.1': {} - - '@tinyhttp/etag@2.1.2': {} - - '@tinyhttp/forwarded@2.1.2': {} - - '@tinyhttp/logger@2.0.0': - dependencies: - colorette: 2.0.20 - dayjs: 1.11.13 - http-status-emojis: 2.2.0 - - '@tinyhttp/proxy-addr@2.2.1': - dependencies: - '@tinyhttp/forwarded': 2.1.2 - ipaddr.js: 2.2.0 - - '@tinyhttp/req@2.2.5': - dependencies: - '@tinyhttp/accepts': 2.2.3 - '@tinyhttp/type-is': 2.2.4 - '@tinyhttp/url': 2.1.1 - header-range-parser: 1.1.3 - - '@tinyhttp/res@2.2.5': - dependencies: - '@tinyhttp/content-disposition': 2.2.2 - '@tinyhttp/cookie': 2.1.1 - '@tinyhttp/cookie-signature': 2.1.1 - '@tinyhttp/encode-url': 2.1.1 - '@tinyhttp/req': 2.2.5 - '@tinyhttp/send': 2.2.3 - '@tinyhttp/vary': 0.1.3 - es-escape-html: 0.1.1 - mime: 4.0.4 - - '@tinyhttp/router@2.2.3': {} - - '@tinyhttp/send@2.2.3': - dependencies: - '@tinyhttp/content-type': 0.1.4 - '@tinyhttp/etag': 2.1.2 - mime: 4.0.4 - - '@tinyhttp/type-is@2.2.4': - dependencies: - '@tinyhttp/content-type': 0.1.4 - mime: 4.0.4 - - '@tinyhttp/url@2.1.1': {} - - '@tinyhttp/vary@0.1.3': {} - '@types/prop-types@15.7.14': {} '@types/react-dom@18.3.5(@types/react@18.3.18)': @@ -1404,8 +1145,6 @@ snapshots: caniuse-lite@1.0.30001700: {} - chalk@5.4.1: {} - chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -1418,18 +1157,12 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chokidar@4.0.3: - dependencies: - readdirp: 4.1.2 - color-convert@2.0.1: dependencies: color-name: 1.1.4 color-name@1.1.4: {} - colorette@2.0.20: {} - commander@4.1.1: {} convert-source-map@2.0.0: {} @@ -1444,8 +1177,6 @@ snapshots: csstype@3.1.3: {} - dayjs@1.11.13: {} - debug@4.4.0: dependencies: ms: 2.1.3 @@ -1454,10 +1185,6 @@ snapshots: dlv@1.1.3: {} - dot-prop@9.0.0: - dependencies: - type-fest: 4.35.0 - eastasianwidth@0.2.0: {} electron-to-chromium@1.5.103: {} @@ -1466,8 +1193,6 @@ snapshots: emoji-regex@9.2.2: {} - es-escape-html@0.1.1: {} - esbuild@0.18.20: optionalDependencies: '@esbuild/android-arm': 0.18.20 @@ -1495,8 +1220,6 @@ snapshots: escalade@3.2.0: {} - eta@3.5.0: {} - fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -1550,14 +1273,6 @@ snapshots: dependencies: function-bind: 1.1.2 - header-range-parser@1.1.3: {} - - http-status-emojis@2.2.0: {} - - inflection@3.0.2: {} - - ipaddr.js@2.2.0: {} - is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 @@ -1590,22 +1305,6 @@ snapshots: jsesc@3.1.0: {} - json-server@1.0.0-beta.3: - dependencies: - '@tinyhttp/app': 2.5.2 - '@tinyhttp/cors': 2.0.1 - '@tinyhttp/logger': 2.0.0 - chalk: 5.4.1 - chokidar: 4.0.3 - dot-prop: 9.0.0 - eta: 3.5.0 - inflection: 3.0.2 - json5: 2.2.3 - lowdb: 7.0.1 - milliparsec: 4.0.0 - sirv: 2.0.4 - sort-on: 6.1.0 - json5@2.2.3: {} lilconfig@3.1.3: {} @@ -1616,10 +1315,6 @@ snapshots: dependencies: js-tokens: 4.0.0 - lowdb@7.0.1: - dependencies: - steno: 4.0.2 - lru-cache@10.4.3: {} lru-cache@5.1.1: @@ -1637,18 +1332,12 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - milliparsec@4.0.0: {} - - mime@4.0.4: {} - minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 minipass@7.1.2: {} - mrmime@2.0.1: {} - ms@2.1.3: {} mz@2.7.0: @@ -1659,8 +1348,6 @@ snapshots: nanoid@3.3.8: {} - negotiator@0.6.4: {} - node-releases@2.0.19: {} normalize-path@3.0.0: {} @@ -1749,10 +1436,6 @@ snapshots: dependencies: picomatch: 2.3.1 - readdirp@4.1.2: {} - - regexparam@2.0.2: {} - resolve@1.22.10: dependencies: is-core-module: 2.16.1 @@ -1783,20 +1466,8 @@ snapshots: signal-exit@4.1.0: {} - sirv@2.0.4: - dependencies: - '@polka/url': 1.0.0-next.28 - mrmime: 2.0.1 - totalist: 3.0.1 - - sort-on@6.1.0: - dependencies: - dot-prop: 9.0.0 - source-map-js@1.2.1: {} - steno@4.0.2: {} - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -1868,12 +1539,8 @@ snapshots: dependencies: is-number: 7.0.0 - totalist@3.0.1: {} - ts-interface-checker@0.1.13: {} - type-fest@4.35.0: {} - typescript@4.9.5: {} update-browserslist-db@1.1.2(browserslist@4.24.4): diff --git a/src/components/TaskForm/TaskForm.tsx b/src/components/TaskForm/TaskForm.tsx new file mode 100644 index 0000000..cf613c8 --- /dev/null +++ b/src/components/TaskForm/TaskForm.tsx @@ -0,0 +1,31 @@ +import React, { FormEvent, useState } from "react"; + +import { TaskFormProps } from "./TaskForm.types"; + +export const TaskForm = ({ onSubmit }: TaskFormProps) => { + const [newTask, setNewTask] = useState(""); + + const handleSubmit = (event: FormEvent) => { + event.preventDefault(); + + if (newTask.trim() === "") return; + + onSubmit(newTask); + setNewTask(""); + }; + + return ( +
    + setNewTask(event.target.value)} + className="flex-grow border rounded-l py-2 px-3" + /> + +
    + ); +}; diff --git a/src/components/TaskForm/TaskForm.types.ts b/src/components/TaskForm/TaskForm.types.ts new file mode 100644 index 0000000..e432baf --- /dev/null +++ b/src/components/TaskForm/TaskForm.types.ts @@ -0,0 +1,3 @@ +export interface TaskFormProps { + onSubmit: (task: string) => void; +} diff --git a/src/components/TaskForm/index.ts b/src/components/TaskForm/index.ts new file mode 100644 index 0000000..c46c0dc --- /dev/null +++ b/src/components/TaskForm/index.ts @@ -0,0 +1 @@ +export * from './TaskForm'; diff --git a/src/components/TaskManager/TaskManager.tsx b/src/components/TaskManager/TaskManager.tsx index 1146d14..b15577f 100644 --- a/src/components/TaskManager/TaskManager.tsx +++ b/src/components/TaskManager/TaskManager.tsx @@ -1,44 +1,52 @@ -import React, { useState } from "react"; +import React, { useEffect, useState } from "react"; import { Filter } from "../Filter"; import { TaskItem } from "../TaskItem"; +import { TaskForm } from "../TaskForm"; import { ITask } from "./TaskManager.types"; export const TaskManager = () => { - const [tasks, setTasks] = useState([ - { id: 1, title: "Buy groceries", completed: false }, - { id: 2, title: "Clean the house", completed: true }, - ]); + const [tasks, setTasks] = useState([]); const [filter, setFilter] = useState("all"); - const [newTask, setNewTask] = useState(""); + const statuses = ["all", "completed", "pending"]; + useEffect(() => { + const localTasks = localStorage.getItem("tasks"); + const parsedTasks = localTasks ? JSON.parse(localTasks) : []; + + setTasks(parsedTasks); + }, []); + const filteredTasks = tasks.filter((task) => { if (filter === "completed") return task.completed; if (filter === "pending") return !task.completed; return true; }); - const handleAddTask = (e: React.FormEvent) => { - e.preventDefault(); - - if (newTask!.trim() === "") return; - + const handleAddTask = (title: string) => { const newTaskObj = { id: tasks.length + 1, - title: newTask, + title, completed: false, }; setTasks([...tasks, newTaskObj]); - setNewTask(""); + + const serializedTasks = JSON.stringify([...tasks, newTaskObj]); + + localStorage.setItem("tasks", serializedTasks); }; const handleDeleteTask = (id: number) => { const newTasks = tasks.filter((task) => task.id !== id); setTasks(newTasks); + + const serializedTasks = JSON.stringify([...newTasks]); + + localStorage.setItem("tasks", serializedTasks); }; const toggleTaskCompletion = (id: number) => { @@ -51,26 +59,21 @@ export const TaskManager = () => { }); setTasks(newTasks); + + const serializedTasks = JSON.stringify([...newTasks]); + + localStorage.setItem("tasks", serializedTasks); }; return (
    -
    - setNewTask(e.target.value)} - className="flex-grow border rounded-l py-2 px-3" - /> - -
    +
      + {filteredTasks.length === 0 &&

      No tasks found

      } + {filteredTasks.map((task) => ( ))} From eb7a74deb084d8a83a2c5a7ac69c25cbe68d0ac2 Mon Sep 17 00:00:00 2001 From: emanuks Date: Wed, 26 Feb 2025 01:13:37 -0300 Subject: [PATCH 4/4] feat: adding confirmation modal --- package.json | 1 + pnpm-lock.yaml | 182 ++++++++++++++++++ .../ConfirmationModal/ConfirmationModal.tsx | 57 ++++++ .../ConfirmationModal.types.ts | 5 + src/components/ConfirmationModal/index.ts | 1 + src/components/TaskItem/TaskItem.tsx | 18 +- 6 files changed, 262 insertions(+), 2 deletions(-) create mode 100644 src/components/ConfirmationModal/ConfirmationModal.tsx create mode 100644 src/components/ConfirmationModal/ConfirmationModal.types.ts create mode 100644 src/components/ConfirmationModal/index.ts diff --git a/package.json b/package.json index bd6222d..756eb03 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "preview": "vite preview" }, "dependencies": { + "@headlessui/react": "^2.2.0", "react": "^18.2.0", "react-dom": "^18.2.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9fe8063..2f37adf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: dependencies: + '@headlessui/react': + specifier: ^2.2.0 + version: 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.2.0 version: 18.3.1 @@ -261,6 +264,34 @@ packages: cpu: [x64] os: [win32] + '@floating-ui/core@1.6.9': + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + + '@floating-ui/dom@1.6.13': + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + + '@floating-ui/react-dom@2.1.2': + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.26.28': + resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + + '@headlessui/react@2.2.0': + resolution: {integrity: sha512-RzCEg+LXsuI7mHiSomsu/gBJSjpupm6A1qIZ5sWjd7JhARNlMiSA4kKfJpCKwU9tE+zMRterhhrP74PvfJrpXQ==} + engines: {node: '>=10'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + react-dom: ^18 || ^19 || ^19.0.0-rc + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -299,6 +330,52 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@react-aria/focus@3.19.1': + resolution: {integrity: sha512-bix9Bu1Ue7RPcYmjwcjhB14BMu2qzfJ3tMQLqDc9pweJA66nOw8DThy3IfVr8Z7j2PHktOLf9kcbiZpydKHqzg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/interactions@3.23.0': + resolution: {integrity: sha512-0qR1atBIWrb7FzQ+Tmr3s8uH5mQdyRH78n0krYaG8tng9+u1JlSi8DGRSaC9ezKyNB84m7vHT207xnHXGeJ3Fg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/ssr@3.9.7': + resolution: {integrity: sha512-GQygZaGlmYjmYM+tiNBA5C6acmiDWF52Nqd40bBp0Znk4M4hP+LTmI0lpI1BuKMw45T8RIhrAsICIfKwZvi2Gg==} + engines: {node: '>= 12'} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/utils@3.27.0': + resolution: {integrity: sha512-p681OtApnKOdbeN8ITfnnYqfdHS0z7GE+4l8EXlfLnr70Rp/9xicBO6d2rU+V/B3JujDw2gPWxYKEnEeh0CGCw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-stately/utils@3.10.5': + resolution: {integrity: sha512-iMQSGcpaecghDIh3mZEpZfoFH3ExBwTtuBEcvZ2XnGzCgQjeYXcMdIUwAfVQLXFTdHUHGF6Gu6/dFrYsCzySBQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-types/shared@3.27.0': + resolution: {integrity: sha512-gvznmLhi6JPEf0bsq7SwRYTHAKKq/wcmKqFez9sRdbED+SPMUmK5omfZ6w3EwUFQHbYUa4zPBYedQ7Knv70RMw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + + '@tanstack/react-virtual@3.13.2': + resolution: {integrity: sha512-LceSUgABBKF6HSsHK2ZqHzQ37IKV/jlaWbHm+NyTa3/WNb/JZVcThDuTainf+PixltOOcFCYXwxbLpOX9sCx+g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tanstack/virtual-core@3.13.2': + resolution: {integrity: sha512-Qzz4EgzMbO5gKrmqUondCjiHcuu4B1ftHb0pjCut661lXZdGoHeze9f/M8iwsK1t5LGR6aNuNGU7mxkowaW6RQ==} + '@types/prop-types@15.7.14': resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} @@ -379,6 +456,10 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -763,6 +844,9 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + tailwindcss@3.4.17: resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} engines: {node: '>=14.0.0'} @@ -782,6 +866,9 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} @@ -1030,6 +1117,40 @@ snapshots: '@esbuild/win32-x64@0.18.20': optional: true + '@floating-ui/core@1.6.9': + dependencies: + '@floating-ui/utils': 0.2.9 + + '@floating-ui/dom@1.6.13': + dependencies: + '@floating-ui/core': 1.6.9 + '@floating-ui/utils': 0.2.9 + + '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.6.13 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/react@0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@floating-ui/utils': 0.2.9 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tabbable: 6.2.0 + + '@floating-ui/utils@0.2.9': {} + + '@headlessui/react@2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react': 0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/focus': 3.19.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/interactions': 3.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-virtual': 3.13.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -1071,6 +1192,61 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@react-aria/focus@3.19.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/interactions': 3.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-types/shared': 3.27.0(react@18.3.1) + '@swc/helpers': 0.5.15 + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/interactions@3.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/ssr': 3.9.7(react@18.3.1) + '@react-aria/utils': 3.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-types/shared': 3.27.0(react@18.3.1) + '@swc/helpers': 0.5.15 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/ssr@3.9.7(react@18.3.1)': + dependencies: + '@swc/helpers': 0.5.15 + react: 18.3.1 + + '@react-aria/utils@3.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/ssr': 3.9.7(react@18.3.1) + '@react-stately/utils': 3.10.5(react@18.3.1) + '@react-types/shared': 3.27.0(react@18.3.1) + '@swc/helpers': 0.5.15 + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-stately/utils@3.10.5(react@18.3.1)': + dependencies: + '@swc/helpers': 0.5.15 + react: 18.3.1 + + '@react-types/shared@3.27.0(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + + '@tanstack/react-virtual@3.13.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tanstack/virtual-core': 3.13.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@tanstack/virtual-core@3.13.2': {} + '@types/prop-types@15.7.14': {} '@types/react-dom@18.3.5(@types/react@18.3.18)': @@ -1157,6 +1333,8 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + clsx@2.1.1: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -1500,6 +1678,8 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + tabbable@6.2.0: {} + tailwindcss@3.4.17: dependencies: '@alloc/quick-lru': 5.2.0 @@ -1541,6 +1721,8 @@ snapshots: ts-interface-checker@0.1.13: {} + tslib@2.8.1: {} + typescript@4.9.5: {} update-browserslist-db@1.1.2(browserslist@4.24.4): diff --git a/src/components/ConfirmationModal/ConfirmationModal.tsx b/src/components/ConfirmationModal/ConfirmationModal.tsx new file mode 100644 index 0000000..89d86b8 --- /dev/null +++ b/src/components/ConfirmationModal/ConfirmationModal.tsx @@ -0,0 +1,57 @@ +import { Dialog, DialogBackdrop, DialogPanel, DialogTitle } from "@headlessui/react"; +import React from "react"; + +import { ConfirmationModalProps } from "./ConfirmationModal.types"; + +export const ConfirmationModal = ({ open, onOpen, onDelete }: ConfirmationModalProps) => { + return ( + + + +
      +
      + +
      +
      +
      + + Delete task + +
      +

      + Are you sure you want to delete this task?
      + This action cannot be undone. +

      +
      +
      +
      +
      +
      + + +
      +
      +
      +
      +
      + ); +}; diff --git a/src/components/ConfirmationModal/ConfirmationModal.types.ts b/src/components/ConfirmationModal/ConfirmationModal.types.ts new file mode 100644 index 0000000..e1b5c3c --- /dev/null +++ b/src/components/ConfirmationModal/ConfirmationModal.types.ts @@ -0,0 +1,5 @@ +export interface ConfirmationModalProps { + open: boolean; + onOpen: (open: boolean) => void; + onDelete: () => void; +} diff --git a/src/components/ConfirmationModal/index.ts b/src/components/ConfirmationModal/index.ts new file mode 100644 index 0000000..828239d --- /dev/null +++ b/src/components/ConfirmationModal/index.ts @@ -0,0 +1 @@ +export * from './ConfirmationModal'; diff --git a/src/components/TaskItem/TaskItem.tsx b/src/components/TaskItem/TaskItem.tsx index 70beae7..9622815 100644 --- a/src/components/TaskItem/TaskItem.tsx +++ b/src/components/TaskItem/TaskItem.tsx @@ -1,8 +1,20 @@ -import React from "react"; +import React, { useState } from "react"; +import { ConfirmationModal } from "../ConfirmationModal"; import { TaskItemProps } from "./TaskItem.types"; export const TaskItem = ({ task, onDelete, onToggle }: TaskItemProps) => { + const [open, setOpen] = useState(false); + + const handleDelete = () => { + setOpen(true); + }; + + const handleConfirmDelete = () => { + onDelete(task.id); + setOpen(false); + }; + return (
    • - + +
    • ); };