diff --git a/package-lock.json b/package-lock.json index a519e66..44991b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { - "name": "qtube", - "version": "0.0.0", + "name": "qsupport", + "version": "1.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "qtube", - "version": "0.0.0", + "name": "qsupport", + "version": "1.0.0", "dependencies": { "@emotion/react": "^11.10.6", "@emotion/styled": "^11.10.6", @@ -41,7 +41,7 @@ "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.3.4", "typescript": "^5.0.2", - "vite": "^4.3.2" + "vite": "6.0.0-alpha.1" } }, "node_modules/@ampproject/remapping": { @@ -542,10 +542,26 @@ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", "cpu": [ "arm" ], @@ -559,9 +575,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", "cpu": [ "arm64" ], @@ -575,9 +591,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", "cpu": [ "x64" ], @@ -591,9 +607,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", "cpu": [ "arm64" ], @@ -607,9 +623,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", "cpu": [ "x64" ], @@ -623,9 +639,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", "cpu": [ "arm64" ], @@ -639,9 +655,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", "cpu": [ "x64" ], @@ -655,9 +671,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", "cpu": [ "arm" ], @@ -671,9 +687,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", "cpu": [ "arm64" ], @@ -687,9 +703,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", "cpu": [ "ia32" ], @@ -703,9 +719,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", "cpu": [ "loong64" ], @@ -719,9 +735,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", "cpu": [ "mips64el" ], @@ -735,9 +751,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", "cpu": [ "ppc64" ], @@ -751,9 +767,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", "cpu": [ "riscv64" ], @@ -767,9 +783,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", "cpu": [ "s390x" ], @@ -783,9 +799,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", "cpu": [ "x64" ], @@ -799,9 +815,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", "cpu": [ "x64" ], @@ -815,9 +831,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", "cpu": [ "x64" ], @@ -831,9 +847,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", "cpu": [ "x64" ], @@ -847,9 +863,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", "cpu": [ "arm64" ], @@ -863,9 +879,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", "cpu": [ "ia32" ], @@ -879,9 +895,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", "cpu": [ "x64" ], @@ -1368,6 +1384,207 @@ "node": ">=14" } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.1.tgz", + "integrity": "sha512-fH8/o8nSUek8ceQnT7K4EQbSiV7jgkHq81m9lWZFIXjJ7lJzpWXbQFpT/Zh6OZYnpFykvzC3fbEvEAFZu03dPA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.1.tgz", + "integrity": "sha512-Y/9OHLjzkunF+KGEoJr3heiD5X9OLa8sbT1lm0NYeKyaM3oMhhQFvPB0bNZYJwlq93j8Z6wSxh9+cyKQaxS7PQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.1.tgz", + "integrity": "sha512-+kecg3FY84WadgcuSVm6llrABOdQAEbNdnpi5X3UwWiFVhZIZvKgGrF7kmLguvxHNQy+UuRV66cLVl3S+Rkt+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.1.tgz", + "integrity": "sha512-2pYRzEjVqq2TB/UNv47BV/8vQiXkFGVmPFwJb+1E0IFFZbIX8/jo1olxqqMbo6xCXf8kabANhp5bzCij2tFLUA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.1.tgz", + "integrity": "sha512-mS6wQ6Do6/wmrF9aTFVpIJ3/IDXhg1EZcQFYHZLHqw6AzMBjTHWnCG35HxSqUNphh0EHqSM6wRTT8HsL1C0x5g==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.1.tgz", + "integrity": "sha512-p9rGKYkHdFMzhckOTFubfxgyIO1vw//7IIjBBRVzyZebWlzRLeNhqxuSaZ7kCEKVkm/kuC9fVRW9HkC/zNRG2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.1.tgz", + "integrity": "sha512-nDY6Yz5xS/Y4M2i9JLQd3Rofh5OR8Bn8qe3Mv/qCVpHFlwtZSBYSPaU4mrGazWkXrdQ98GB//H0BirGR/SKFSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.1.tgz", + "integrity": "sha512-im7HE4VBL+aDswvcmfx88Mp1soqL9OBsdDBU8NqDEYtkri0qV0THhQsvZtZeNNlLeCUQ16PZyv7cqutjDF35qw==", + "cpu": [ + "ppc64le" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.1.tgz", + "integrity": "sha512-RWdiHuAxWmzPJgaHJdpvUUlDz8sdQz4P2uv367T2JocdDa98iRw2UjIJ4QxSyt077mXZT2X6pKfT2iYtVEvOFw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.1.tgz", + "integrity": "sha512-VMgaGQ5zRX6ZqV/fas65/sUGc9cPmsntq2FiGmayW9KMNfWVG/j0BAqImvU4KTeOOgYSf1F+k6at1UfNONuNjA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.1.tgz", + "integrity": "sha512-9Q7DGjZN+hTdJomaQ3Iub4m6VPu1r94bmK2z3UeWP3dGUecRC54tmVu9vKHTm1bOt3ASoYtEz6JSRLFzrysKlA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.1.tgz", + "integrity": "sha512-JNEG/Ti55413SsreTguSx0LOVKX902OfXIKVg+TCXO6Gjans/k9O6ww9q3oLGjNDaTLxM+IHFMeXy/0RXL5R/g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.1.tgz", + "integrity": "sha512-ryS22I9y0mumlLNwDFYZRDFLwWh3aKaC72CWjFcFvxK0U6v/mOkM5Up1bTbCRAhv3kEIwW2ajROegCIQViUCeA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.1.tgz", + "integrity": "sha512-TdloItiGk+T0mTxKx7Hp279xy30LspMso+GzQvV2maYePMAWdmrzqSNZhUpPj3CGw12aGj57I026PgLCTu8CGg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.1.tgz", + "integrity": "sha512-wQGI+LY/Py20zdUPq+XCem7JcPOyzIJBm3dli+56DJsQOHbnXZFEwgmnC6el1TPAfC8lBT3m+z69RmLykNUbew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, "node_modules/@types/hoist-non-react-statics": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", @@ -2086,9 +2303,9 @@ } }, "node_modules/esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", "dev": true, "hasInstallScript": true, "bin": { @@ -2098,28 +2315,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" } }, "node_modules/escalade": { @@ -2588,9 +2806,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -3180,9 +3398,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -3394,9 +3612,9 @@ } }, "node_modules/postcss": { - "version": "8.4.24", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", - "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "dev": true, "funding": [ { @@ -3413,9 +3631,9 @@ } ], "dependencies": { - "nanoid": "^3.3.6", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" @@ -3839,18 +4057,36 @@ } }, "node_modules/rollup": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.25.1.tgz", - "integrity": "sha512-tywOR+rwIt5m2ZAWSe5AIJcTat8vGlnPFAv15ycCrw33t6iFsXZ6mzHVFh2psSjxQPmI+xgzMZZizUAukBI4aQ==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.1.tgz", + "integrity": "sha512-4LnHSdd3QK2pa1J6dFbfm1HN0D7vSK/ZuZTsdyUAlA6Rr1yTouUTL13HaDOGJVgby461AhrNGBS7sCGXXtT+SA==", "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.18.0", + "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.14.1", + "@rollup/rollup-android-arm64": "4.14.1", + "@rollup/rollup-darwin-arm64": "4.14.1", + "@rollup/rollup-darwin-x64": "4.14.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.14.1", + "@rollup/rollup-linux-arm64-gnu": "4.14.1", + "@rollup/rollup-linux-arm64-musl": "4.14.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.14.1", + "@rollup/rollup-linux-riscv64-gnu": "4.14.1", + "@rollup/rollup-linux-s390x-gnu": "4.14.1", + "@rollup/rollup-linux-x64-gnu": "4.14.1", + "@rollup/rollup-linux-x64-musl": "4.14.1", + "@rollup/rollup-win32-arm64-msvc": "4.14.1", + "@rollup/rollup-win32-ia32-msvc": "4.14.1", + "@rollup/rollup-win32-x64-msvc": "4.14.1", "fsevents": "~2.3.2" } }, @@ -3993,9 +4229,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -4194,27 +4430,31 @@ } }, "node_modules/vite": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", - "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", + "version": "6.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.0-alpha.1.tgz", + "integrity": "sha512-LVvQVG3AftURxT11TgWXpfVIqBKC4D/NA5ikYQb9hDORF0hvO+gsyvNu8GR73/oag09A5JJAPAFU+r7ly4+9Lw==", "dev": true, "dependencies": { - "esbuild": "^0.17.5", - "postcss": "^8.4.23", - "rollup": "^3.21.0" + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": ">= 14", + "@types/node": "^18.0.0 || >=20.0.0", "less": "*", + "lightningcss": "^1.21.0", "sass": "*", "stylus": "*", "sugarss": "*", @@ -4227,6 +4467,9 @@ "less": { "optional": true }, + "lightningcss": { + "optional": true + }, "sass": { "optional": true }, @@ -4682,157 +4925,164 @@ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, + "@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "dev": true, + "optional": true + }, "@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", "dev": true, "optional": true }, "@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", "dev": true, "optional": true }, "@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", "dev": true, "optional": true }, "@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", "dev": true, "optional": true }, "@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", "dev": true, "optional": true }, "@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", "dev": true, "optional": true }, "@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", "dev": true, "optional": true }, "@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", "dev": true, "optional": true }, "@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", "dev": true, "optional": true }, "@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", "dev": true, "optional": true }, "@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", "dev": true, "optional": true }, "@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", "dev": true, "optional": true }, "@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", "dev": true, "optional": true }, "@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", "dev": true, "optional": true }, "@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", "dev": true, "optional": true }, "@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", "dev": true, "optional": true }, "@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", "dev": true, "optional": true }, "@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", "dev": true, "optional": true }, "@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", "dev": true, "optional": true }, "@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", "dev": true, "optional": true }, "@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", "dev": true, "optional": true }, "@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", "dev": true, "optional": true }, @@ -5103,6 +5353,117 @@ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.3.tgz", "integrity": "sha512-EXJysQ7J3veRECd0kZFQwYYd5sJMcq2O/m60zu1W2l3oVQ9xtub8jTOtYRE0+M2iomyG/W3Ps7+vp2kna0C27Q==" }, + "@rollup/rollup-android-arm-eabi": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.1.tgz", + "integrity": "sha512-fH8/o8nSUek8ceQnT7K4EQbSiV7jgkHq81m9lWZFIXjJ7lJzpWXbQFpT/Zh6OZYnpFykvzC3fbEvEAFZu03dPA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-android-arm64": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.1.tgz", + "integrity": "sha512-Y/9OHLjzkunF+KGEoJr3heiD5X9OLa8sbT1lm0NYeKyaM3oMhhQFvPB0bNZYJwlq93j8Z6wSxh9+cyKQaxS7PQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-arm64": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.1.tgz", + "integrity": "sha512-+kecg3FY84WadgcuSVm6llrABOdQAEbNdnpi5X3UwWiFVhZIZvKgGrF7kmLguvxHNQy+UuRV66cLVl3S+Rkt+Q==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-x64": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.1.tgz", + "integrity": "sha512-2pYRzEjVqq2TB/UNv47BV/8vQiXkFGVmPFwJb+1E0IFFZbIX8/jo1olxqqMbo6xCXf8kabANhp5bzCij2tFLUA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.1.tgz", + "integrity": "sha512-mS6wQ6Do6/wmrF9aTFVpIJ3/IDXhg1EZcQFYHZLHqw6AzMBjTHWnCG35HxSqUNphh0EHqSM6wRTT8HsL1C0x5g==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.1.tgz", + "integrity": "sha512-p9rGKYkHdFMzhckOTFubfxgyIO1vw//7IIjBBRVzyZebWlzRLeNhqxuSaZ7kCEKVkm/kuC9fVRW9HkC/zNRG2w==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-musl": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.1.tgz", + "integrity": "sha512-nDY6Yz5xS/Y4M2i9JLQd3Rofh5OR8Bn8qe3Mv/qCVpHFlwtZSBYSPaU4mrGazWkXrdQ98GB//H0BirGR/SKFSw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.1.tgz", + "integrity": "sha512-im7HE4VBL+aDswvcmfx88Mp1soqL9OBsdDBU8NqDEYtkri0qV0THhQsvZtZeNNlLeCUQ16PZyv7cqutjDF35qw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-riscv64-gnu": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.1.tgz", + "integrity": "sha512-RWdiHuAxWmzPJgaHJdpvUUlDz8sdQz4P2uv367T2JocdDa98iRw2UjIJ4QxSyt077mXZT2X6pKfT2iYtVEvOFw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-s390x-gnu": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.1.tgz", + "integrity": "sha512-VMgaGQ5zRX6ZqV/fas65/sUGc9cPmsntq2FiGmayW9KMNfWVG/j0BAqImvU4KTeOOgYSf1F+k6at1UfNONuNjA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-gnu": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.1.tgz", + "integrity": "sha512-9Q7DGjZN+hTdJomaQ3Iub4m6VPu1r94bmK2z3UeWP3dGUecRC54tmVu9vKHTm1bOt3ASoYtEz6JSRLFzrysKlA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-musl": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.1.tgz", + "integrity": "sha512-JNEG/Ti55413SsreTguSx0LOVKX902OfXIKVg+TCXO6Gjans/k9O6ww9q3oLGjNDaTLxM+IHFMeXy/0RXL5R/g==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.1.tgz", + "integrity": "sha512-ryS22I9y0mumlLNwDFYZRDFLwWh3aKaC72CWjFcFvxK0U6v/mOkM5Up1bTbCRAhv3kEIwW2ajROegCIQViUCeA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-ia32-msvc": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.1.tgz", + "integrity": "sha512-TdloItiGk+T0mTxKx7Hp279xy30LspMso+GzQvV2maYePMAWdmrzqSNZhUpPj3CGw12aGj57I026PgLCTu8CGg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-x64-msvc": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.1.tgz", + "integrity": "sha512-wQGI+LY/Py20zdUPq+XCem7JcPOyzIJBm3dli+56DJsQOHbnXZFEwgmnC6el1TPAfC8lBT3m+z69RmLykNUbew==", + "dev": true, + "optional": true + }, + "@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, "@types/hoist-non-react-statics": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", @@ -5610,33 +5971,34 @@ } }, "esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", "dev": true, "requires": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" } }, "escalade": { @@ -5995,9 +6357,9 @@ "dev": true }, "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "optional": true }, @@ -6425,9 +6787,9 @@ "dev": true }, "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true }, "natural-compare": { @@ -6573,14 +6935,14 @@ "dev": true }, "postcss": { - "version": "8.4.24", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", - "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "dev": true, "requires": { - "nanoid": "^3.3.6", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" } }, "prelude-ls": { @@ -6863,11 +7225,27 @@ } }, "rollup": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.25.1.tgz", - "integrity": "sha512-tywOR+rwIt5m2ZAWSe5AIJcTat8vGlnPFAv15ycCrw33t6iFsXZ6mzHVFh2psSjxQPmI+xgzMZZizUAukBI4aQ==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.1.tgz", + "integrity": "sha512-4LnHSdd3QK2pa1J6dFbfm1HN0D7vSK/ZuZTsdyUAlA6Rr1yTouUTL13HaDOGJVgby461AhrNGBS7sCGXXtT+SA==", "dev": true, "requires": { + "@rollup/rollup-android-arm-eabi": "4.14.1", + "@rollup/rollup-android-arm64": "4.14.1", + "@rollup/rollup-darwin-arm64": "4.14.1", + "@rollup/rollup-darwin-x64": "4.14.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.14.1", + "@rollup/rollup-linux-arm64-gnu": "4.14.1", + "@rollup/rollup-linux-arm64-musl": "4.14.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.14.1", + "@rollup/rollup-linux-riscv64-gnu": "4.14.1", + "@rollup/rollup-linux-s390x-gnu": "4.14.1", + "@rollup/rollup-linux-x64-gnu": "4.14.1", + "@rollup/rollup-linux-x64-musl": "4.14.1", + "@rollup/rollup-win32-arm64-msvc": "4.14.1", + "@rollup/rollup-win32-ia32-msvc": "4.14.1", + "@rollup/rollup-win32-x64-msvc": "4.14.1", + "@types/estree": "1.0.5", "fsevents": "~2.3.2" } }, @@ -6967,9 +7345,9 @@ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" }, "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true }, "strip-ansi": { @@ -7099,15 +7477,15 @@ "requires": {} }, "vite": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", - "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", + "version": "6.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.0-alpha.1.tgz", + "integrity": "sha512-LVvQVG3AftURxT11TgWXpfVIqBKC4D/NA5ikYQb9hDORF0hvO+gsyvNu8GR73/oag09A5JJAPAFU+r7ly4+9Lw==", "dev": true, "requires": { - "esbuild": "^0.17.5", - "fsevents": "~2.3.2", - "postcss": "^8.4.23", - "rollup": "^3.21.0" + "esbuild": "^0.20.1", + "fsevents": "~2.3.3", + "postcss": "^8.4.38", + "rollup": "^4.13.0" } }, "which": { diff --git a/package.json b/package.json index 7ba80c6..6f3aea4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "qtube", + "name": "qsupport", "private": true, - "version": "0.0.0", + "version": "1.0.0", "type": "module", "scripts": { "dev": "vite", @@ -43,6 +43,6 @@ "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.3.4", "typescript": "^5.0.2", - "vite": "^4.3.2" + "vite": "6.0.0-alpha.1" } } diff --git a/src/App.tsx b/src/App.tsx index 72152d6..46a84ca 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,14 +1,14 @@ import { useState } from "react"; -import { Routes, Route } from "react-router-dom"; +import { Route, Routes } from "react-router-dom"; import { ThemeProvider } from "@mui/material/styles"; import { CssBaseline } from "@mui/material"; -import { lightTheme, darkTheme } from "./styles/theme"; +import { darkTheme, lightTheme } from "./styles/theme"; import { store } from "./state/store"; import { Provider } from "react-redux"; import GlobalWrapper from "./wrappers/GlobalWrapper"; import Notification from "./components/common/Notification/Notification"; import { Home } from "./pages/Home/Home"; -import { FileContent } from "./pages/FileContent/FileContent.tsx"; +import { IssueContent } from "./pages/IssueContent/IssueContent.tsx"; import DownloadWrapper from "./wrappers/DownloadWrapper"; import { IndividualProfile } from "./pages/IndividualProfile/IndividualProfile"; @@ -26,7 +26,7 @@ function App() { } /> - } /> + } /> } /> diff --git a/src/assets/icons/ClosedIcon.png b/src/assets/icons/ClosedIcon.png new file mode 100644 index 0000000..4e2a8f7 Binary files /dev/null and b/src/assets/icons/ClosedIcon.png differ diff --git a/src/assets/icons/CompleteIcon.png b/src/assets/icons/CompleteIcon.png new file mode 100644 index 0000000..6913308 Binary files /dev/null and b/src/assets/icons/CompleteIcon.png differ diff --git a/src/assets/icons/InProgressIcon.png b/src/assets/icons/InProgressIcon.png new file mode 100644 index 0000000..b699642 Binary files /dev/null and b/src/assets/icons/InProgressIcon.png differ diff --git a/src/assets/icons/OpenIcon.png b/src/assets/icons/OpenIcon.png new file mode 100644 index 0000000..c516754 Binary files /dev/null and b/src/assets/icons/OpenIcon.png differ diff --git a/src/assets/img/Q-SupportIcon.webp b/src/assets/img/Q-SupportIcon.webp new file mode 100644 index 0000000..c1909d3 Binary files /dev/null and b/src/assets/img/Q-SupportIcon.webp differ diff --git a/src/assets/img/logo.png b/src/assets/img/logo.png deleted file mode 100644 index 9e631a0..0000000 Binary files a/src/assets/img/logo.png and /dev/null differ diff --git a/src/assets/img/logo2.jpg b/src/assets/img/logo2.jpg deleted file mode 100644 index 09bdc3a..0000000 Binary files a/src/assets/img/logo2.jpg and /dev/null differ diff --git a/src/assets/img/logo3.jpg b/src/assets/img/logo3.jpg deleted file mode 100644 index 2c2c884..0000000 Binary files a/src/assets/img/logo3.jpg and /dev/null differ diff --git a/src/assets/img/q-share-icon.webp b/src/assets/img/q-share-icon.webp deleted file mode 100644 index d3bb8dd..0000000 Binary files a/src/assets/img/q-share-icon.webp and /dev/null differ diff --git a/src/components/EditFile/EditFile.tsx b/src/components/EditIssue/EditIssue.tsx similarity index 86% rename from src/components/EditFile/EditFile.tsx rename to src/components/EditIssue/EditIssue.tsx index 54db6f7..f538e58 100644 --- a/src/components/EditFile/EditFile.tsx +++ b/src/components/EditIssue/EditIssue.tsx @@ -21,7 +21,7 @@ import { updateFile, updateInHashMap, } from "../../state/features/fileSlice.ts"; -import { QSHARE_FILE_BASE } from "../../constants/Identifiers.ts"; +import { QSUPPORT_FILE_BASE } from "../../constants/Identifiers.ts"; import { MultiplePublish } from "../common/MultiplePublish/MultiplePublishAll"; import { TextEditor } from "../common/TextEditor/TextEditor"; import { extractTextFromHTML } from "../common/TextEditor/utils"; @@ -32,6 +32,10 @@ import { CategoryListRef, getCategoriesFromObject, } from "../common/CategoryList/CategoryList.tsx"; +import { + ImagePublisher, + ImagePublisherRef, +} from "../common/ImagePublisher/ImagePublisher.tsx"; const uid = new ShortUniqueId(); const shortuid = new ShortUniqueId({ length: 5 }); @@ -53,7 +57,7 @@ interface VideoFile { identifier?: string; filename?: string; } -export const EditFile = () => { +export const EditIssue = () => { const theme = useTheme(); const dispatch = useDispatch(); const username = useSelector((state: RootState) => state.auth?.user?.name); @@ -75,6 +79,7 @@ export const EditFile = () => { const [files, setFiles] = useState([]); const [editCategories, setEditCategories] = useState([]); const categoryListRef = useRef(null); + const imagePublisherRef = useRef(null); const { getRootProps, getInputProps } = useDropzone({ maxFiles: 10, @@ -121,7 +126,10 @@ export const EditFile = () => { const paragraph = `

${editFileProperties?.fullDescription}

`; setDescription(paragraph); } - setEditCategories(getCategoriesFromObject(editFileProperties)); + + const categoriesFromEditFile = + getCategoriesFromObject(editFileProperties); + setEditCategories(categoriesFromEditFile); } }, [editFileProperties]); const onClose = () => { @@ -141,7 +149,6 @@ export const EditFile = () => { if (!categoryList[0]) throw new Error("Please select a category"); if (!editFileProperties) return; if (!userAddress) throw new Error("Unable to locate user address"); - if (files.length === 0) throw new Error("Add at least one file"); let errorMsg = ""; let name = ""; @@ -186,7 +193,7 @@ export const EditFile = () => { const file = publish.file; const id = uid(); - const identifier = `${QSHARE_FILE_BASE}${sanitizeTitle.slice(0, 30)}_${id}`; + const identifier = `${QSUPPORT_FILE_BASE}${sanitizeTitle.slice(0, 30)}_${id}`; let fileExtension = ""; const fileExtensionSplit = file?.name?.split("."); @@ -227,7 +234,7 @@ export const EditFile = () => { description: metadescription, identifier, filename, - tag1: QSHARE_FILE_BASE, + tag1: QSUPPORT_FILE_BASE, }; listOfPublishes.push(requestBodyVideo); fileReferences.push({ @@ -248,24 +255,25 @@ export const EditFile = () => { commentsId: editFileProperties.commentsId, ...categoryListRef.current?.categoriesToObject(), files: fileReferences, + images: imagePublisherRef?.current?.getImageArray(), }; let metadescription = `**${categoryListRef.current?.getCategoriesFetchString()}**` + fullDescription.slice(0, 150); - const crowdfundObjectToBase64 = await objectToBase64(fileObject); + const fileObjectToBase64 = await objectToBase64(fileObject); // Description is obtained from raw data const requestBodyJson: any = { action: "PUBLISH_QDN_RESOURCE", name: name, service: "DOCUMENT", - data64: crowdfundObjectToBase64, + data64: fileObjectToBase64, title: title.slice(0, 50), description: metadescription, identifier: editFileProperties.id, - tag1: QSHARE_FILE_BASE, + tag1: QSUPPORT_FILE_BASE, filename: `video_metadata.json`, }; listOfPublishes.push(requestBodyJson); @@ -336,7 +344,7 @@ export const EditFile = () => { justifyContent: "space-between", }} > - Update share + Update Issue <> { alignItems: "flex-start", }} > - {files?.length > 0 && ( - <> - - - - - )} + + + - {files?.length > 0 && ( - <> - { - const value = e.target.value; - const formattedValue = value.replace(titleFormatter, ""); - setTitle(formattedValue); - }} - inputProps={{ maxLength: 180 }} - required - /> - - Description of share - - { - setDescription(value); - }} - /> - - )} + + { + const value = e.target.value; + const formattedValue = value.replace(titleFormatter, ""); + setTitle(formattedValue); + }} + inputProps={{ maxLength: 180 }} + required + /> + + Description of Issue + + { + setDescription(value); + }} + /> diff --git a/src/components/EditFile/Upload-styles.tsx b/src/components/EditIssue/Upload-styles.tsx similarity index 100% rename from src/components/EditFile/Upload-styles.tsx rename to src/components/EditIssue/Upload-styles.tsx diff --git a/src/components/EditPlaylist/EditPlaylist.tsx b/src/components/EditPlaylist/EditPlaylist.tsx index 2c8c8ae..aab2f93 100644 --- a/src/components/EditPlaylist/EditPlaylist.tsx +++ b/src/components/EditPlaylist/EditPlaylist.tsx @@ -6,11 +6,9 @@ import { CrowdfundActionButton, CrowdfundActionButtonRow, CustomInputField, - CustomSelect, LogoPreviewRow, ModalBody, NewCrowdfundTitle, - StyledButton, TimesIcon, } from "./Upload-styles.tsx"; import { @@ -27,27 +25,20 @@ import { } from "@mui/material"; import ShortUniqueId from "short-unique-id"; import { useDispatch, useSelector } from "react-redux"; -import AddBoxIcon from "@mui/icons-material/AddBox"; -import { useDropzone } from "react-dropzone"; import { setNotification } from "../../state/features/notificationsSlice"; -import { objectToBase64, uint8ArrayToBase64 } from "../../utils/toBase64"; +import { objectToBase64 } from "../../utils/toBase64"; import { RootState } from "../../state/store"; import { - upsertFilesBeginning, - addToHashMap, - upsertFiles, - setEditFile, + setEditPlaylist, updateFile, updateInHashMap, - setEditPlaylist, } from "../../state/features/fileSlice.ts"; -import ImageUploader from "../common/ImageUploader"; +import ImageUploader from "../common/ImagePublisher/ImageUploader.tsx"; import { - QSHARE_PLAYLIST_BASE, - QSHARE_FILE_BASE, + QSUPPORT_FILE_BASE, + QSUPPORT_PLAYLIST_BASE, } from "../../constants/Identifiers.ts"; -import { Playlists } from "../Playlists/Playlists"; import { PlaylistListEdit } from "../PlaylistListEdit/PlaylistListEdit"; import { TextEditor } from "../common/TextEditor/TextEditor"; import { extractTextFromHTML } from "../common/TextEditor/utils"; @@ -87,7 +78,7 @@ export const EditPlaylist = () => { const [playlistData, setPlaylistData] = useState(null); const [title, setTitle] = useState(""); const [description, setDescription] = useState(""); - const [coverImage, setCoverImage] = useState(""); + const [coverImage, setCoverImage] = useState([]); const [videos, setVideos] = useState([]); const [selectedCategoryVideos, setSelectedCategoryVideos] = useState(null); @@ -222,7 +213,7 @@ export const EditPlaylist = () => { setPlaylistData(null); setSelectedCategoryVideos(null); setSelectedSubCategoryVideos(null); - setCoverImage(""); + setCoverImage([]); dispatch(setEditPlaylist(null)); }; @@ -292,7 +283,7 @@ export const EditPlaylist = () => { let commentsId = editVideoProperties?.id; if (isNew) { - commentsId = `${QSHARE_PLAYLIST_BASE}_cm_${id}`; + commentsId = `${QSUPPORT_PLAYLIST_BASE}_cm_${id}`; } const stringDescription = extractTextFromHTML(description); @@ -324,7 +315,7 @@ export const EditPlaylist = () => { .trim() .toLowerCase(); if (isNew) { - identifier = `${QSHARE_PLAYLIST_BASE}${sanitizeTitle.slice(0, 30)}_${id}`; + identifier = `${QSUPPORT_PLAYLIST_BASE}${sanitizeTitle.slice(0, 30)}_${id}`; } const requestBodyJson: any = { action: "PUBLISH_QDN_RESOURCE", @@ -334,7 +325,7 @@ export const EditPlaylist = () => { title: title.slice(0, 50), description: metadescription, identifier: identifier, - tag1: QSHARE_FILE_BASE, + tag1: QSUPPORT_FILE_BASE, }; await qortalRequest(requestBodyJson); @@ -519,7 +510,7 @@ export const EditPlaylist = () => { {!coverImage ? ( - setCoverImage(img)}> + setCoverImage(img)}> Add Cover Image { ) : ( - + {coverImage.map( + image => + image && ( + + ) + )} setCoverImage("")} + onClickFunc={() => setCoverImage([])} height={"32"} width={"32"} > diff --git a/src/components/PlaylistListEdit/PlaylistListEdit.tsx b/src/components/PlaylistListEdit/PlaylistListEdit.tsx index 266d7b6..7a9c208 100644 --- a/src/components/PlaylistListEdit/PlaylistListEdit.tsx +++ b/src/components/PlaylistListEdit/PlaylistListEdit.tsx @@ -3,15 +3,15 @@ import { CardContentContainerComment } from "../common/Comments/Comments-styles" import { CrowdfundSubTitle, CrowdfundSubTitleRow, -} from "../PublishFile/Upload-styles.tsx"; +} from "../PublishIssue/Upload-styles.tsx"; import { Box, Button, Input, Typography, useTheme } from "@mui/material"; import { useNavigate } from "react-router-dom"; import DeleteOutlineIcon from "@mui/icons-material/DeleteOutline"; -import { removeFile } from "../../state/features/fileSlice.ts"; import AddIcon from "@mui/icons-material/Add"; -import { QSHARE_FILE_BASE } from "../../constants/Identifiers.ts"; +import { QSUPPORT_FILE_BASE } from "../../constants/Identifiers.ts"; import { useSelector } from "react-redux"; import { RootState } from "../../state/store"; + export const PlaylistListEdit = ({ playlistData, removeVideo, addVideo }) => { const theme = useTheme(); const navigate = useNavigate(); @@ -20,7 +20,7 @@ export const PlaylistListEdit = ({ playlistData, removeVideo, addVideo }) => { const [searchResults, setSearchResults] = useState([]); const [filterSearch, setFilterSearch] = useState(""); const search = async () => { - const url = `/arbitrary/resources/search?mode=ALL&service=DOCUMENT&mode=ALL&identifier=${QSHARE_FILE_BASE}&title=${filterSearch}&limit=20&includemetadata=true&reverse=true&name=${username}&exactmatchnames=true&offset=0`; + const url = `/arbitrary/resources/search?mode=ALL&service=DOCUMENT&mode=ALL&identifier=${QSUPPORT_FILE_BASE}&title=${filterSearch}&limit=20&includemetadata=true&reverse=true&name=${username}&exactmatchnames=true&offset=0`; const response = await fetch(url, { method: "GET", headers: { diff --git a/src/components/Playlists/Playlists.tsx b/src/components/Playlists/Playlists.tsx index 3e60c90..0ac3c6f 100644 --- a/src/components/Playlists/Playlists.tsx +++ b/src/components/Playlists/Playlists.tsx @@ -1,66 +1,79 @@ -import React from 'react' -import { CardContentContainerComment } from '../common/Comments/Comments-styles' -import { CrowdfundSubTitle, CrowdfundSubTitleRow } from '../PublishFile/Upload-styles.tsx' -import { Box, Typography, useTheme } from '@mui/material' -import { useNavigate } from 'react-router-dom' - -export const Playlists = ({playlistData, currentVideoIdentifier}) => { - const theme = useTheme(); - const navigate = useNavigate() +import React from "react"; +import { CardContentContainerComment } from "../common/Comments/Comments-styles"; +import { + CrowdfundSubTitle, + CrowdfundSubTitleRow, +} from "../PublishIssue/Upload-styles.tsx"; +import { Box, Typography, useTheme } from "@mui/material"; +import { useNavigate } from "react-router-dom"; +export const Playlists = ({ playlistData, currentVideoIdentifier }) => { + const theme = useTheme(); + const navigate = useNavigate(); return ( - - + + Playlist - - {playlistData?.videos?.map((vid, index)=> { - const isCurrentVidPlayling = vid?.identifier === currentVideoIdentifier; - - - - return ( - { - if(isCurrentVidPlayling) return + + {playlistData?.videos?.map((vid, index) => { + const isCurrentVidPlayling = + vid?.identifier === currentVideoIdentifier; - navigate(`/video/${vid.name}/${vid.identifier}`) + return ( + { + if (isCurrentVidPlayling) return; + + navigate(`/video/${vid.name}/${vid.identifier}`); + }} + > + - {index + 1} - {vid?.metadata?.title} - - - ) + > + {index + 1} + + + {vid?.metadata?.title} + + + ); })} - + - - ) -} + ); +}; diff --git a/src/components/PublishFile/PublishFile.tsx b/src/components/PublishIssue/PublishIssue.tsx similarity index 76% rename from src/components/PublishFile/PublishFile.tsx rename to src/components/PublishIssue/PublishIssue.tsx index 237a1bf..2fddf9c 100644 --- a/src/components/PublishFile/PublishFile.tsx +++ b/src/components/PublishIssue/PublishIssue.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useRef, useState } from "react"; import { - CrowdfundActionButton, - CrowdfundActionButtonRow, + ActionButton, + ActionButtonRow, CustomInputField, ModalBody, NewCrowdfundTitle, @@ -17,16 +17,22 @@ import { useDropzone } from "react-dropzone"; import { setNotification } from "../../state/features/notificationsSlice"; import { objectToBase64 } from "../../utils/toBase64"; import { RootState } from "../../state/store"; -import { QSHARE_FILE_BASE } from "../../constants/Identifiers.ts"; +import { QSUPPORT_FILE_BASE } from "../../constants/Identifiers.ts"; import { MultiplePublish } from "../common/MultiplePublish/MultiplePublishAll"; import { TextEditor } from "../common/TextEditor/TextEditor"; import { extractTextFromHTML } from "../common/TextEditor/utils"; import { allCategoryData } from "../../constants/Categories/1stCategories.ts"; import { titleFormatter } from "../../constants/Misc.ts"; import { + appendCategoryToList, CategoryList, CategoryListRef, } from "../common/CategoryList/CategoryList.tsx"; +import { SupportState } from "../../constants/Categories/2ndCategories.ts"; +import { + ImagePublisher, + ImagePublisherRef, +} from "../common/ImagePublisher/ImagePublisher.tsx"; const uid = new ShortUniqueId(); const shortuid = new ShortUniqueId({ length: 5 }); @@ -46,7 +52,7 @@ interface VideoFile { description: string; coverImage?: string; } -export const PublishFile = ({ editId, editContent }: NewCrowdfundProps) => { +export const PublishIssue = ({ editId, editContent }: NewCrowdfundProps) => { const theme = useTheme(); const dispatch = useDispatch(); const [isOpenMultiplePublish, setIsOpenMultiplePublish] = useState(false); @@ -73,7 +79,7 @@ export const PublishFile = ({ editId, editContent }: NewCrowdfundProps) => { const [playlistSetting, setPlaylistSetting] = useState(null); const [publishes, setPublishes] = useState(null); const categoryListRef = useRef(null); - + const imagePublisherRef = useRef(null); const { getRootProps, getInputProps } = useDropzone({ maxFiles: 10, maxSize: 419430400, // 400 MB in bytes @@ -127,7 +133,6 @@ export const PublishFile = ({ editId, editContent }: NewCrowdfundProps) => { if (!description) throw new Error("Please enter a description"); if (!categoryListRef.current?.getSelectedCategories()[0]) throw new Error("Please select a category"); - if (files.length === 0) throw new Error("Add at least one file"); let errorMsg = ""; let name = ""; if (username) { @@ -169,7 +174,7 @@ export const PublishFile = ({ editId, editContent }: NewCrowdfundProps) => { const file = publish.file; const id = uid(); - const identifier = `${QSHARE_FILE_BASE}${sanitizeTitle.slice(0, 30)}_${id}`; + const identifier = `${QSUPPORT_FILE_BASE}${sanitizeTitle.slice(0, 30)}_${id}`; let fileExtension = ""; const fileExtensionSplit = file?.name?.split("."); @@ -197,9 +202,12 @@ export const PublishFile = ({ editId, editContent }: NewCrowdfundProps) => { filename = alphanumericString; } - let metadescription = - `**${categoryListRef.current?.getCategoriesFetchString()}**` + - fullDescription.slice(0, 150); + const categoryList = appendCategoryToList( + categoryListRef.current?.getSelectedCategories(), + "101" + ); + const categoryString = `**${categoryListRef.current?.getCategoriesFetchString(categoryList)}**`; + let metadescription = categoryString + fullDescription.slice(0, 150); const requestBodyVideo: any = { action: "PUBLISH_QDN_RESOURCE", @@ -210,7 +218,7 @@ export const PublishFile = ({ editId, editContent }: NewCrowdfundProps) => { description: metadescription, identifier, filename, - tag1: QSHARE_FILE_BASE, + tag1: QSUPPORT_FILE_BASE, }; listOfPublishes.push(requestBodyVideo); fileReferences.push({ @@ -224,32 +232,38 @@ export const PublishFile = ({ editId, editContent }: NewCrowdfundProps) => { } const idMeta = uid(); - const identifier = `${QSHARE_FILE_BASE}${sanitizeTitle.slice(0, 30)}_${idMeta}`; + const identifier = `${QSUPPORT_FILE_BASE}${sanitizeTitle.slice(0, 30)}_${idMeta}`; + + const categoryList = appendCategoryToList( + categoryListRef.current?.getSelectedCategories(), + "101" + ); + const fileObject: any = { title, version: 1, fullDescription, htmlDescription: description, - commentsId: `${QSHARE_FILE_BASE}_cm_${idMeta}`, - ...categoryListRef.current?.categoriesToObject(), + commentsId: `${QSUPPORT_FILE_BASE}_cm_${idMeta}`, + ...categoryListRef.current?.categoriesToObject(categoryList), files: fileReferences, + images: imagePublisherRef?.current?.getImageArray(), }; - let metadescription = - `**${categoryListRef.current?.getCategoriesFetchString()}**` + - fullDescription.slice(0, 150); + const categoryString = `**${categoryListRef.current?.getCategoriesFetchString(categoryList)}**`; + let metadescription = categoryString + fullDescription.slice(0, 150); - const crowdfundObjectToBase64 = await objectToBase64(fileObject); + const fileObjectToBase64 = await objectToBase64(fileObject); // Description is obtained from raw data const requestBodyJson: any = { action: "PUBLISH_QDN_RESOURCE", name: name, service: "DOCUMENT", - data64: crowdfundObjectToBase64, + data64: fileObjectToBase64, title: title.slice(0, 50), description: metadescription, identifier: identifier + "_metadata", - tag1: QSHARE_FILE_BASE, + tag1: QSUPPORT_FILE_BASE, filename: `video_metadata.json`, }; listOfPublishes.push(requestBodyJson); @@ -264,17 +278,17 @@ export const PublishFile = ({ editId, editContent }: NewCrowdfundProps) => { let notificationObj: any = null; if (typeof error === "string") { notificationObj = { - msg: error || "Failed to publish share", + msg: error || "Failed to publish issue", alertType: "error", }; } else if (typeof error?.error === "string") { notificationObj = { - msg: error?.error || "Failed to publish share", + msg: error?.error || "Failed to publish issue", alertType: "error", }; } else { notificationObj = { - msg: error?.message || "Failed to publish share", + msg: error?.message || "Failed to publish issue", alertType: "error", }; } @@ -295,7 +309,7 @@ export const PublishFile = ({ editId, editContent }: NewCrowdfundProps) => { setIsOpen(true); }} > - share + Open an Issue )} @@ -314,7 +328,7 @@ export const PublishFile = ({ editId, editContent }: NewCrowdfundProps) => { justifyContent: "space-between", }} > - Share + Issue {step === "videos" && ( @@ -331,7 +345,7 @@ export const PublishFile = ({ editId, editContent }: NewCrowdfundProps) => { > - Drag and drop files here or click to select files + Publish files related to issue (Optional) {files.map((file, index) => { @@ -362,53 +376,53 @@ export const PublishFile = ({ editId, editContent }: NewCrowdfundProps) => { ); })} - {files?.length > 0 && ( - <> - - - - { - const value = e.target.value; - const formattedValue = value.replace(titleFormatter, ""); - setTitle(formattedValue); - }} - inputProps={{ maxLength: 180 }} - required + <> + + - - Description of share - - { - setDescription(value); - }} - /> - - )} + + + { + const value = e.target.value; + const formattedValue = value.replace(titleFormatter, ""); + setTitle(formattedValue); + }} + inputProps={{ maxLength: 180 }} + required + /> + + Description of Issue + + { + setDescription(value); + }} + /> + )} - - + { onClose(); }} @@ -416,7 +430,7 @@ export const PublishFile = ({ editId, editContent }: NewCrowdfundProps) => { color="error" > Cancel - + { alignItems: "center", }} > - { publishQDNResource(); }} > Publish - + - + @@ -466,7 +480,7 @@ export const PublishFile = ({ editId, editContent }: NewCrowdfundProps) => { categoryListRef.current?.clearCategories(); dispatch( setNotification({ - msg: "Files published", + msg: "Issue published", alertType: "success", }) ); diff --git a/src/components/PublishFile/Upload-styles.tsx b/src/components/PublishIssue/Upload-styles.tsx similarity index 93% rename from src/components/PublishFile/Upload-styles.tsx rename to src/components/PublishIssue/Upload-styles.tsx index d31aa96..b448902 100644 --- a/src/components/PublishFile/Upload-styles.tsx +++ b/src/components/PublishIssue/Upload-styles.tsx @@ -7,9 +7,9 @@ import { Button, Grid, Rating, + Select, TextField, Typography, - Select } from "@mui/material"; import AddPhotoAlternateIcon from "@mui/icons-material/AddPhotoAlternate"; import { TimesSVG } from "../../assets/svgs/TimesSVG"; @@ -67,9 +67,9 @@ export const ModalBody = styled(Box)(({ theme }) => ({ overflowY: "auto", maxHeight: "95vh", boxShadow: - theme.palette.mode === "dark" - ? "0px 4px 5px 0px hsla(0,0%,0%,0.14), 0px 1px 10px 0px hsla(0,0%,0%,0.12), 0px 2px 4px -1px hsla(0,0%,0%,0.2)" - : "rgba(99, 99, 99, 0.2) 0px 2px 8px 0px", + theme.palette.mode === "dark" + ? "0px 4px 5px 0px hsla(0,0%,0%,0.14), 0px 1px 10px 0px hsla(0,0%,0%,0.12), 0px 2px 4px -1px hsla(0,0%,0%,0.2)" + : "rgba(99, 99, 99, 0.2) 0px 2px 8px 0px", "&::-webkit-scrollbar-track": { backgroundColor: theme.palette.background.paper, }, @@ -159,8 +159,6 @@ export const CustomInputField = styled(TextField)(({ theme }) => ({ }, })); - - export const CrowdfundTitle = styled(Typography)(({ theme }) => ({ fontFamily: "Copse", letterSpacing: "1px", @@ -203,11 +201,11 @@ export const CrowdfundDescription = styled(Typography)(({ theme }) => ({ export const Spacer = ({ height }: any) => { return ( - + ); }; @@ -314,14 +312,14 @@ export const AddCrowdFundButton = styled(Button)(({ theme }) => ({ gap: "8px", color: "#ffffff", backgroundColor: - theme.palette.mode === "dark" ? theme.palette.primary.main : "#2a9a86", + theme.palette.mode === "dark" ? theme.palette.primary.main : "#2a9a86", border: "none", borderRadius: "5px", transition: "all 0.3s ease-in-out", "&:hover": { cursor: "pointer", backgroundColor: - theme.palette.mode === "dark" ? theme.palette.primary.dark : "#217e6d", + theme.palette.mode === "dark" ? theme.palette.primary.dark : "#217e6d", }, })); @@ -333,14 +331,14 @@ export const EditCrowdFundButton = styled(Button)(({ theme }) => ({ gap: "8px", color: "#ffffff", backgroundColor: - theme.palette.mode === "dark" ? theme.palette.primary.main : "#2a9a86", + theme.palette.mode === "dark" ? theme.palette.primary.main : "#2a9a86", border: "none", borderRadius: "5px", transition: "all 0.3s ease-in-out", "&:hover": { cursor: "pointer", backgroundColor: - theme.palette.mode === "dark" ? theme.palette.primary.dark : "#217e6d", + theme.palette.mode === "dark" ? theme.palette.primary.dark : "#217e6d", }, })); @@ -466,14 +464,14 @@ export const CoverImage = styled("img")({ objectPosition: "center", }); -export const CrowdfundActionButtonRow = styled(Box)({ +export const ActionButtonRow = styled(Box)({ display: "flex", alignItems: "center", justifyContent: "space-between", width: "100%", }); -export const CrowdfundActionButton = styled(Button)(({ theme }) => ({ +export const ActionButton = styled(Button)(({ theme }) => ({ display: "flex", alignItems: "center", fontFamily: "Montserrat", @@ -540,8 +538,8 @@ export const NoReviewsFont = styled(Typography)(({ theme }) => ({ export const StyledButton = styled(Button)(({ theme }) => ({ fontWeight: 600, color: theme.palette.text.primary, - fontFamily: "Cairo" -})) + fontFamily: "Cairo", +})); export const CustomSelect = styled(Select)(({ theme }) => ({ fontFamily: "Mulish", @@ -550,38 +548,38 @@ export const CustomSelect = styled(Select)(({ theme }) => ({ fontWeight: 400, color: theme.palette.text.primary, backgroundColor: theme.palette.background.default, - '& .MuiSelect-select': { - padding: '12px', + "& .MuiSelect-select": { + padding: "12px", fontFamily: "Mulish", fontSize: "19px", letterSpacing: "0px", fontWeight: 400, borderRadius: theme.shape.borderRadius, // Match border radius }, - '&:before': { + "&:before": { // Underline style borderBottomColor: theme.palette.mode === "light" ? "#B2BAC2" : "#c9cccf", }, - '&:after': { + "&:after": { // Underline style when focused borderBottomColor: theme.palette.secondary.main, }, - '& .MuiOutlinedInput-root': { - '& fieldset': { + "& .MuiOutlinedInput-root": { + "& fieldset": { borderColor: "#E0E3E7", }, - '&:hover fieldset': { + "&:hover fieldset": { borderColor: "#B2BAC2", }, - '&.Mui-focused fieldset': { + "&.Mui-focused fieldset": { borderColor: "#6F7E8C", }, }, - '& .MuiInputBase-root': { + "& .MuiInputBase-root": { fontFamily: "Mulish", fontSize: "19px", letterSpacing: "0px", fontWeight: 400, color: theme.palette.text.primary, }, -})); \ No newline at end of file +})); diff --git a/src/components/StatsData.tsx b/src/components/StatsData.tsx index 5e3a6f7..cf25422 100644 --- a/src/components/StatsData.tsx +++ b/src/components/StatsData.tsx @@ -25,13 +25,13 @@ export const StatsData = () => { getFilesCount, } = useFetchFiles(); - const totalVideosPublished = useSelector( + const totalIssuesPublished = useSelector( (state: RootState) => state.global.totalFilesPublished ); const totalNamesPublished = useSelector( (state: RootState) => state.global.totalNamesPublished ); - const videosPerNamePublished = useSelector( + const issuesPerNamePublished = useSelector( (state: RootState) => state.global.filesPerNamePublished ); @@ -40,22 +40,28 @@ export const StatsData = () => { }, [getFilesCount]); return ( - -
- Shares:{" "} - {totalVideosPublished} -
-
- Publishers:{" "} - {totalNamesPublished} -
-
- Average:{" "} - - {videosPerNamePublished > 0 && - Number(videosPerNamePublished).toFixed(0)} - -
-
+ totalIssuesPublished > 0 && ( + +
+ Issues Published:{" "} + + {totalIssuesPublished || ""} + +
+
+ Publishers:{" "} + + {totalNamesPublished || ""} + +
+
+ Average:{" "} + + {issuesPerNamePublished > 0 && + Number(issuesPerNamePublished).toFixed(0)} + +
+
+ ) ); }; diff --git a/src/components/common/CategoryList/CategoryList.tsx b/src/components/common/CategoryList/CategoryList.tsx index 167ab5e..b4057fc 100644 --- a/src/components/common/CategoryList/CategoryList.tsx +++ b/src/components/common/CategoryList/CategoryList.tsx @@ -10,9 +10,10 @@ import { Theme, } from "@mui/material"; -import React, { forwardRef, useImperativeHandle, useState } from "react"; +import React, { useEffect, useImperativeHandle, useState } from "react"; import { CategoryContainer } from "./CategoryList-styles.tsx"; import { allCategoryData } from "../../../constants/Categories/1stCategories.ts"; +import { log } from "../../../constants/Misc.ts"; export interface Category { id: number; @@ -29,19 +30,22 @@ export interface CategoryData { } type ListDirection = "column" | "row"; + interface CategoryListProps { sx?: SxProps; categoryData: CategoryData; initialCategories?: string[]; columns?: number; + afterChange?: (categories: string[]) => void; + excludeCategories?: Category[]; } export type CategoryListRef = { getSelectedCategories: () => string[]; setSelectedCategories: (arr: string[]) => void; clearCategories: () => void; - getCategoriesFetchString: () => string; - categoriesToObject: () => object; + getCategoriesFetchString: (categories?: string[]) => string; + categoriesToObject: (categories?: string[]) => object; }; export const CategoryList = React.forwardRef< @@ -49,7 +53,14 @@ export const CategoryList = React.forwardRef< CategoryListProps >( ( - { sx, categoryData, initialCategories, columns = 1 }: CategoryListProps, + { + sx, + categoryData, + initialCategories, + columns = 1, + afterChange, + excludeCategories, + }: CategoryListProps, ref ) => { const categoriesLength = categoryData.subCategories.length + 1; @@ -60,20 +71,27 @@ export const CategoryList = React.forwardRef< const [selectedCategories, setSelectedCategories] = useState( initialCategories || emptyCategories ); + useEffect(() => { + if (initialCategories) setSelectedCategories(initialCategories); + }, [initialCategories]); - const categoriesToObject = () => { + const updateCategories = (categories: string[]) => { + setSelectedCategories(categories); + if (afterChange) afterChange(categories); + }; + const categoriesToObject = (categories: string[]) => { let categoriesObject = {}; - selectedCategories.map((category, index) => { + categories.map((category, index) => { if (index === 0) categoriesObject["category"] = category; else if (index === 1) categoriesObject["subcategory"] = category; else categoriesObject[`subcategory${index}`] = category; }); - console.log("categoriesObject is: ", categoriesObject); + if (log) console.log("categoriesObject is: ", categoriesObject); return categoriesObject; }; const clearCategories = () => { - setSelectedCategories(emptyCategories); + updateCategories(emptyCategories); }; useImperativeHandle(ref, () => ({ @@ -81,26 +99,31 @@ export const CategoryList = React.forwardRef< return selectedCategories; }, setSelectedCategories: categories => { - console.log("setSelectedCategories: ", categories); - //categories.map((category, index) => selectCategory(category, index)); - setSelectedCategories(categories); + if (log) console.log("setSelectedCategories: ", categories); + updateCategories(categories); }, clearCategories, - getCategoriesFetchString: () => - getCategoriesFetchString(selectedCategories), - categoriesToObject, + getCategoriesFetchString: (categories?: string[]) => + getCategoriesFetchString(categories || selectedCategories), + categoriesToObject: (categories?: string[]) => + categoriesToObject(categories || selectedCategories), })); const selectCategory = (optionId: string, index: number) => { const isMainCategory = index === 0; const subCategoryIndex = index - 1; + let selectedOption: Category | undefined; + if (isMainCategory) + selectedOption = categoryData.category.find( + option => option.id === +optionId + ); + else { + const subCategoryLevel = categoryData.subCategories[subCategoryIndex]; + const parentCategory = selectedCategories[subCategoryIndex]; + const subCategory = subCategoryLevel[parentCategory]; - const selectedOption = isMainCategory - ? categoryData.category.find(option => option.id === +optionId) - : categoryData.subCategories[subCategoryIndex][ - selectedCategories[subCategoryIndex] - ].find(option => option.id === +optionId); - + selectedOption = subCategory.find(option => option.id === +optionId); + } const newSelectedCategories: string[] = selectedCategories.map( (category, categoryIndex) => { if (index > categoryIndex) return category; @@ -108,7 +131,7 @@ export const CategoryList = React.forwardRef< else return ""; } ); - setSelectedCategories(newSelectedCategories); + updateCategories(newSelectedCategories); }; const selectCategoryEvent = (event: SelectChangeEvent, index: number) => { @@ -136,15 +159,16 @@ export const CategoryList = React.forwardRef< const fillMenu = (category: Categories, index: number) => { const subCategoryIndex = selectedCategories[index]; - console.log("selected categories: ", selectedCategories); - console.log("index is: ", index); - console.log("subCategoryIndex is: ", subCategoryIndex); - console.log("category is: ", category); - console.log( - "subCategoryIndex within category: ", - selectedCategories[subCategoryIndex] - ); - console.log("categoryData: ", categoryData); + if (log) console.log("selected categories: ", selectedCategories); + if (log) console.log("index is: ", index); + if (log) console.log("subCategoryIndex is: ", subCategoryIndex); + if (log) console.log("category is: ", category); + if (log) + console.log( + "subCategoryIndex within category: ", + selectedCategories[subCategoryIndex] + ); + if (log) console.log("categoryData: ", categoryData); const menuToFill = category[subCategoryIndex]; if (menuToFill) @@ -158,6 +182,7 @@ export const CategoryList = React.forwardRef< const hasSubCategory = (category: Categories, index: number) => { const subCategoryIndex = selectedCategories[index]; const subCategory = category[subCategoryIndex]; + if (excludeCategories && subCategory === excludeCategories) return false; return subCategory && subCategoryIndex; }; @@ -265,10 +290,21 @@ export const getCategoriesFetchString = (categories: string[]) => { else fetchString += `;sub${index}:${category}`; } }); - console.log("categoriesAsDescription: ", fetchString); + if (log) console.log("categoriesAsDescription: ", fetchString); return fetchString; }; +export const appendCategoryToList = ( + categories: string[], + appendedCategoryID: string +) => { + const filteredCategories = categories.filter( + categoryString => categoryString.length > 0 + ); + filteredCategories.push(appendedCategoryID); + return filteredCategories; +}; + export const getCategoriesFromObject = (editFileProperties: any) => { const categoryList: string[] = []; const categoryCount = allCategoryData.subCategories.length + 1; diff --git a/src/components/common/Comments/CommentEditor.tsx b/src/components/common/Comments/CommentEditor.tsx index 1911680..2a25759 100644 --- a/src/components/common/Comments/CommentEditor.tsx +++ b/src/components/common/Comments/CommentEditor.tsx @@ -11,7 +11,7 @@ import { CommentInputContainer, SubmitCommentButton, } from "./Comments-styles"; -import { QSHARE_COMMENT_BASE } from "../../../constants/Identifiers.ts"; +import { QSUPPORT_COMMENT_BASE } from "../../../constants/Identifiers.ts"; const uid = new ShortUniqueId(); const notification = localforage.createInstance({ @@ -201,13 +201,13 @@ export const CommentEditor = ({ try { const id = uid(); - let identifier = `${QSHARE_COMMENT_BASE}${postId.slice(-12)}_base_${id}`; + let identifier = `${QSUPPORT_COMMENT_BASE}${postId.slice(-12)}_base_${id}`; let idForNotification = identifier; if (isReply && commentId) { const removeBaseCommentId = commentId; removeBaseCommentId.replace("_base_", ""); - identifier = `${QSHARE_COMMENT_BASE}${postId.slice( + identifier = `${QSUPPORT_COMMENT_BASE}${postId.slice( -12 )}_reply_${removeBaseCommentId.slice(-6)}_${id}`; idForNotification = commentId; diff --git a/src/components/common/Comments/CommentSection.tsx b/src/components/common/Comments/CommentSection.tsx index a6cb325..8f350bf 100644 --- a/src/components/common/Comments/CommentSection.tsx +++ b/src/components/common/Comments/CommentSection.tsx @@ -1,11 +1,11 @@ -import { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { useCallback, useEffect, useMemo, useState } from "react"; import { CommentEditor } from "./CommentEditor"; import { Comment } from "./Comment"; -import { Box, Button, CircularProgress, useTheme } from "@mui/material"; +import { CircularProgress } from "@mui/material"; import { styled } from "@mui/system"; import { useSelector } from "react-redux"; import { RootState } from "../../../state/store"; -import { useNavigate, useLocation } from "react-router-dom"; +import { useLocation, useNavigate } from "react-router-dom"; import { CommentContainer, CommentEditorContainer, @@ -14,8 +14,11 @@ import { LoadMoreCommentsButtonRow, NoCommentsRow, } from "./Comments-styles"; -import { QSHARE_COMMENT_BASE } from "../../../constants/Identifiers.ts"; -import { CrowdfundSubTitle, CrowdfundSubTitleRow } from "../../PublishFile/Upload-styles.tsx"; +import { QSUPPORT_COMMENT_BASE } from "../../../constants/Identifiers.ts"; +import { + CrowdfundSubTitle, + CrowdfundSubTitleRow, +} from "../../PublishIssue/Upload-styles.tsx"; interface CommentSectionProps { postId: string; @@ -105,7 +108,7 @@ export const CommentSection = ({ postId, postName }: CommentSectionProps) => { const offset = 0; const removeBaseCommentId = commentId.replace("_base_", ""); - const url = `/arbitrary/resources/search?mode=ALL&service=BLOG_COMMENT&query=${QSHARE_COMMENT_BASE}${postId.slice( + const url = `/arbitrary/resources/search?mode=ALL&service=BLOG_COMMENT&query=${QSUPPORT_COMMENT_BASE}${postId.slice( -12 )}_reply_${removeBaseCommentId.slice( -6 @@ -150,7 +153,7 @@ export const CommentSection = ({ postId, postName }: CommentSectionProps) => { if (isNewMessages && numberOfComments) { offset = numberOfComments; } - const url = `/arbitrary/resources/search?mode=ALL&service=BLOG_COMMENT&query=${QSHARE_COMMENT_BASE}${postId.slice( + const url = `/arbitrary/resources/search?mode=ALL&service=BLOG_COMMENT&query=${QSUPPORT_COMMENT_BASE}${postId.slice( -12 )}_base_&limit=20&includemetadata=false&offset=${offset}&reverse=false&excludeblocked=true`; const response = await fetch(url, { @@ -218,11 +221,10 @@ export const CommentSection = ({ postId, postName }: CommentSectionProps) => { return ( <> - - - Comments - + + Comments + {loadingComments ? ( diff --git a/src/components/common/ImagePublisher/ImagePublisher-styles.tsx b/src/components/common/ImagePublisher/ImagePublisher-styles.tsx new file mode 100644 index 0000000..00c4f3a --- /dev/null +++ b/src/components/common/ImagePublisher/ImagePublisher-styles.tsx @@ -0,0 +1,47 @@ +import { Box, Button } from "@mui/material"; +import { styled } from "@mui/system"; +import AddPhotoAlternateIcon from "@mui/icons-material/AddPhotoAlternate"; +import { TimesSVG } from "./TimesSVG.tsx"; + +export const AddCoverImageButton = styled(Button)(({ theme }) => ({ + display: "flex", + alignItems: "center", + fontFamily: "Montserrat", + fontSize: "16px", + fontWeight: 400, + letterSpacing: "0.2px", + color: "white", + gap: "5px", +})); + +export const AddLogoIcon = styled(AddPhotoAlternateIcon)(({ theme }) => ({ + color: "#fff", + height: "25px", + width: "auto", +})); + +export const LogoPreviewRow = styled(Box)(({ theme }) => ({ + display: "flex", + alignItems: "center", + gap: "10px", +})); + +export const CoverImagePreview = styled("img")(({ theme }) => ({ + width: "100px", + height: "100px", + objectFit: "contain", + userSelect: "none", + borderRadius: "3px", + marginBottom: "10px", +})); + +export const TimesIcon = styled(TimesSVG)(({ theme }) => ({ + backgroundColor: theme.palette.background.paper, + borderRadius: "50%", + padding: "5px", + transition: "all 0.2s ease-in-out", + "&:hover": { + cursor: "pointer", + scale: "1.1", + }, +})); diff --git a/src/components/common/ImagePublisher/ImagePublisher.tsx b/src/components/common/ImagePublisher/ImagePublisher.tsx new file mode 100644 index 0000000..5358b71 --- /dev/null +++ b/src/components/common/ImagePublisher/ImagePublisher.tsx @@ -0,0 +1,62 @@ +import ImageUploader from "./ImageUploader.tsx"; +import React, { useImperativeHandle, useState } from "react"; +import { + AddCoverImageButton, + AddLogoIcon, + CoverImagePreview, + LogoPreviewRow, + TimesIcon, +} from "./ImagePublisher-styles.tsx"; +import { useTheme } from "@mui/material"; + +export type ImagePublisherRef = { + getImageArray: () => string[]; +}; + +interface ImagePublisherProps { + initialImages?: string[]; +} +export const ImagePublisher = React.forwardRef< + ImagePublisherRef, + ImagePublisherProps +>(({ initialImages }: ImagePublisherProps, ref) => { + const theme = useTheme(); + const [imageArray, setImageArray] = useState(initialImages || []); + + useImperativeHandle(ref, () => ({ + getImageArray: () => { + return imageArray; + }, + })); + + return ( + <> + {imageArray.length === 0 ? ( + setImageArray(img)}> + + Add Images + + + + ) : ( + + {imageArray.map( + image => + image && + )} + setImageArray([])} + height={"32"} + width={"32"} + > + + )} + + ); +}); diff --git a/src/components/common/ImagePublisher/ImageUploader.tsx b/src/components/common/ImagePublisher/ImageUploader.tsx new file mode 100644 index 0000000..6919bff --- /dev/null +++ b/src/components/common/ImagePublisher/ImageUploader.tsx @@ -0,0 +1,109 @@ +import React, { useCallback } from "react"; +import { Box } from "@mui/material"; +import { + DropzoneInputProps, + DropzoneRootProps, + useDropzone, +} from "react-dropzone"; +import Compressor from "compressorjs"; +import { setNotification } from "../../../state/features/notificationsSlice.ts"; +import { useDispatch } from "react-redux"; + +const toBase64 = (file: File): Promise => + new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = () => resolve(reader.result); + reader.onerror = error => { + reject(error); + }; + }); + +interface ImageUploaderProps { + children: React.ReactNode; + onPick: (base64Img: string[]) => void; +} + +export const ImageUploader: React.FC = ({ + children, + onPick, +}) => { + const dispatch = useDispatch(); + const imageLimit = 3; + + const compressImages = async (images: File[]) => { + const promises = images.map(image => { + return new Promise(resolve => { + new Compressor(image, { + quality: 0.6, + maxWidth: 1200, + mimeType: "image/webp", + success(result) { + const file = new File([result], "name", { + type: "image/webp", + }); + resolve(result); + }, + error(err) {}, + }); + }); + }); + return await Promise.all(promises); + }; + + const onDrop = useCallback( + async (acceptedFiles: File[]) => { + if (acceptedFiles.length > imageLimit) { + const notificationObj = { + msg: `Only ${imageLimit} images can be published`, + alertType: "error", + }; + dispatch(setNotification(notificationObj)); + return; + } + + try { + const compressedImages = await compressImages(acceptedFiles); + if (!compressedImages) return; + + const base64Iamges = await Promise.all( + compressedImages.map(image => toBase64(image as File)) + ); + + onPick(base64Iamges as string[]); + } catch (error) { + console.error(error); + } + }, + [onPick] + ); + + const { + getRootProps, + getInputProps, + isDragActive, + }: { + getRootProps: () => DropzoneRootProps; + getInputProps: () => DropzoneInputProps; + isDragActive: boolean; + } = useDropzone({ + onDrop, + accept: { + "image/*": [], + }, + }); + + return ( + + + {children} + + ); +}; + +export default ImageUploader; diff --git a/src/components/common/ImagePublisher/TimesSVG.tsx b/src/components/common/ImagePublisher/TimesSVG.tsx new file mode 100644 index 0000000..4f97ce4 --- /dev/null +++ b/src/components/common/ImagePublisher/TimesSVG.tsx @@ -0,0 +1,28 @@ +export interface IconTypes { + color?: string; + height: string; + width: string; + className?: string; + onClickFunc?: (e?: any) => void; +} +export const TimesSVG: React.FC = ({ + color, + height, + width, + className, + onClickFunc, +}) => { + return ( + + + + ); +}; diff --git a/src/components/common/ImageUploader.tsx b/src/components/common/ImageUploader.tsx deleted file mode 100644 index 0cac393..0000000 --- a/src/components/common/ImageUploader.tsx +++ /dev/null @@ -1,89 +0,0 @@ -import React, { useCallback } from 'react' -import { Box, Button, TextField, Typography, Modal } from '@mui/material' -import { - useDropzone, - DropzoneRootProps, - DropzoneInputProps -} from 'react-dropzone' -import Compressor from 'compressorjs' - -const toBase64 = (file: File): Promise => - new Promise((resolve, reject) => { - const reader = new FileReader() - reader.readAsDataURL(file) - reader.onload = () => resolve(reader.result) - reader.onerror = (error) => { - reject(error) - } - }) - -interface ImageUploaderProps { - children: React.ReactNode - onPick: (base64Img: string) => void -} - -const ImageUploader: React.FC = ({ children, onPick }) => { - const onDrop = useCallback( - async (acceptedFiles: File[]) => { - if (acceptedFiles.length > 1) { - return - } - let compressedFile: File | undefined - - try { - const image = acceptedFiles[0] - await new Promise((resolve) => { - new Compressor(image, { - quality: 0.6, - maxWidth: 1200, - mimeType: 'image/webp', - success(result) { - const file = new File([result], 'name', { - type: 'image/webp' - }) - compressedFile = file - resolve() - }, - error(err) {} - }) - }) - if (!compressedFile) return - const base64Img = await toBase64(compressedFile) - - onPick(base64Img as string) - } catch (error) { - console.error(error) - } - }, - [onPick] - ) - - const { - getRootProps, - getInputProps, - isDragActive - }: { - getRootProps: () => DropzoneRootProps - getInputProps: () => DropzoneInputProps - isDragActive: boolean - } = useDropzone({ - onDrop, - accept: { - 'image/*': [] - } - }) - - return ( - - - {children} - - ) -} - -export default ImageUploader diff --git a/src/components/layout/Navbar/Navbar-styles.tsx b/src/components/layout/Navbar/Navbar-styles.tsx index c3e73a8..4c3fed0 100644 --- a/src/components/layout/Navbar/Navbar-styles.tsx +++ b/src/components/layout/Navbar/Navbar-styles.tsx @@ -14,26 +14,22 @@ export const CustomAppBar = styled(AppBar)(({ theme }) => ({ borderBottom: `1px solid ${theme.palette.primary.light}`, backgroundColor: theme.palette.background.default, [theme.breakpoints.only("xs")]: { - gap: "15px" + gap: "15px", }, - height: '55px' + height: "100px", })); export const LogoContainer = styled("div")({ - cursor: 'pointer', - height: '100%', - display: 'flex', - alignItems: 'center' + cursor: "pointer", + height: "100%", + display: "flex", + alignItems: "center", }); - - - export const CustomTitle = styled(Typography)({ fontWeight: 600, - color: "#000000" + color: "#000000", }); - export const AuthenticateButton = styled(Button)(({ theme }) => ({ display: "flex", flexDirection: "row", @@ -50,8 +46,8 @@ export const AuthenticateButton = styled(Button)(({ theme }) => ({ cursor: "pointer", boxShadow: "rgba(0, 0, 0, 0.15) 1.95px 1.95px 2.6px;", backgroundColor: theme.palette.secondary.dark, - filter: "brightness(1.1)" - } + filter: "brightness(1.1)", + }, })); export const AvatarContainer = styled(Box)({ @@ -61,9 +57,9 @@ export const AvatarContainer = styled(Box)({ cursor: "pointer", "& #expand-icon": { transition: "all 0.3s ease-in-out", - filter: "brightness(0.7)" - } - } + filter: "brightness(0.7)", + }, + }, }); export const DropdownContainer = styled(Box)(({ theme }) => ({ @@ -76,22 +72,22 @@ export const DropdownContainer = styled(Box)(({ theme }) => ({ "&:hover": { cursor: "pointer", filter: - theme.palette.mode === "light" ? "brightness(0.95)" : "brightness(1.1)" - } + theme.palette.mode === "light" ? "brightness(0.95)" : "brightness(1.1)", + }, })); export const DropdownText = styled(Typography)(({ theme }) => ({ fontFamily: "Raleway", fontSize: "16px", color: theme.palette.text.primary, - userSelect: "none" + userSelect: "none", })); export const NavbarName = styled(Typography)(({ theme }) => ({ fontFamily: "Raleway", fontSize: "18px", color: theme.palette.text.primary, - margin: "0 10px" + margin: "0 10px", })); export const ThemeSelectRow = styled(Box)({ @@ -99,7 +95,7 @@ export const ThemeSelectRow = styled(Box)({ alignItems: "center", gap: "5px", flexBasis: 0, - height: '100%' + height: "100%", }); export const LightModeIcon = styled(LightModeSVG)(({ theme }) => ({ @@ -109,8 +105,8 @@ export const LightModeIcon = styled(LightModeSVG)(({ theme }) => ({ filter: theme.palette.mode === "dark" ? "drop-shadow(0px 4px 6px rgba(255, 255, 255, 0.6))" - : "drop-shadow(0px 4px 6px rgba(99, 88, 88, 0.1))" - } + : "drop-shadow(0px 4px 6px rgba(99, 88, 88, 0.1))", + }, })); export const DarkModeIcon = styled(DarkModeSVG)(({ theme }) => ({ @@ -120,6 +116,6 @@ export const DarkModeIcon = styled(DarkModeSVG)(({ theme }) => ({ filter: theme.palette.mode === "dark" ? "drop-shadow(0px 4px 6px rgba(255, 255, 255, 0.6))" - : "drop-shadow(0px 4px 6px rgba(99, 88, 88, 0.1))" - } + : "drop-shadow(0px 4px 6px rgba(99, 88, 88, 0.1))", + }, })); diff --git a/src/components/layout/Navbar/Navbar.tsx b/src/components/layout/Navbar/Navbar.tsx index 3fee969..f184c92 100644 --- a/src/components/layout/Navbar/Navbar.tsx +++ b/src/components/layout/Navbar/Navbar.tsx @@ -1,27 +1,15 @@ -import React, { useState, useRef } from "react"; -import { - Box, - Button, - Input, - Popover, - Typography, - useTheme, -} from "@mui/material"; -import ExitToAppIcon from "@mui/icons-material/ExitToApp"; +import React, { useRef, useState } from "react"; +import { Box, Input, Popover, Typography, useTheme } from "@mui/material"; import { BlockedNamesModal } from "../../common/BlockedNamesModal/BlockedNamesModal"; -import AddBoxIcon from "@mui/icons-material/AddBox"; import { AvatarContainer, CustomAppBar, DropdownContainer, DropdownText, - AuthenticateButton, - NavbarName, - LightModeIcon, - DarkModeIcon, - ThemeSelectRow, LogoContainer, + NavbarName, + ThemeSelectRow, } from "./Navbar-styles"; import { AccountCircleSVG } from "../../../assets/svgs/AccountCircleSVG"; import BackspaceIcon from "@mui/icons-material/Backspace"; @@ -32,18 +20,17 @@ import { useNavigate } from "react-router-dom"; import SearchIcon from "@mui/icons-material/Search"; import { DownloadTaskManager } from "../../common/DownloadTaskManager"; -import QShareLogo from "../../../assets/img/q-share-icon.webp"; +import QSupportLogo from "../../../assets/img/Q-SupportIcon.webp"; import { useDispatch, useSelector } from "react-redux"; import { addFilteredFiles, - setEditPlaylist, setFilterValue, setIsFiltering, } from "../../../state/features/fileSlice.ts"; import { RootState } from "../../../state/store"; import { useWindowSize } from "../../../hooks/useWindowSize"; -import { PublishFile } from "../../PublishFile/PublishFile.tsx"; -import { StyledButton } from "../../PublishFile/Upload-styles.tsx"; +import { PublishIssue } from "../../PublishIssue/PublishIssue.tsx"; + interface Props { isAuthenticated: boolean; userName: string | null; @@ -125,21 +112,21 @@ const NavBar: React.FC = ({ }} > - Sharing is caring + Welcome to Q-Support
@@ -150,135 +137,6 @@ const NavBar: React.FC = ({ gap: "10px", }} > - {/* {windowSize.width <= 600 ? ( - - - - - {filterValue && ( - { - dispatch(setIsFiltering(false)) - dispatch(setFilterValue('')) - dispatch(addFilteredVideos([])) - searchValRef.current = '' - if (!inputRef.current) return - inputRef.current.value = '' - }} - /> - )} - - - ): ( - - { - searchValRef.current = e.target.value - }} - onKeyDown={(event) => { - if (event.key === 'Enter' || event.keyCode === 13) { - if (!searchValRef.current) { - dispatch(setIsFiltering(false)) - dispatch(setFilterValue('')) - dispatch(addFilteredVideos([])) - searchValRef.current = '' - if (!inputRef.current) return - inputRef.current.value = '' - return - } - navigate('/') - dispatch(setIsFiltering(true)) - dispatch(addFilteredVideos([])) - dispatch(setFilterValue(searchValRef.current)) - } - }} - placeholder="Search" - sx={{ - '&&:before': { - borderBottom: 'none' - }, - '&&:after': { - borderBottom: 'none' - }, - '&&:hover:before': { - borderBottom: 'none' - }, - '&&.Mui-focused:before': { - borderBottom: 'none' - }, - '&&.Mui-focused': { - outline: 'none' - }, - fontSize: '18px' - }} - /> - - { - if (!searchValRef.current) { - dispatch(setIsFiltering(false)) - dispatch(setFilterValue('')) - dispatch(addFilteredVideos([])) - searchValRef.current = '' - if (!inputRef.current) return - inputRef.current.value = '' - return - } - navigate('/') - dispatch(setIsFiltering(true)) - dispatch(addFilteredVideos([])) - dispatch(setFilterValue(searchValRef.current)) - }} - /> - {filterValue && ( - { - dispatch(setIsFiltering(false)) - dispatch(setFilterValue('')) - dispatch(addFilteredVideos([])) - searchValRef.current = '' - if (!inputRef.current) return - inputRef.current.value = '' - }} - /> - )} - - - )} */} - = ({ {isAuthenticated && userName && ( <> - + )} diff --git a/src/constants/Categories/1stCategories.ts b/src/constants/Categories/1stCategories.ts index dea8761..a074e55 100644 --- a/src/constants/Categories/1stCategories.ts +++ b/src/constants/Categories/1stCategories.ts @@ -7,15 +7,6 @@ import softwareIcon from "../../assets/icons/software.webp"; import unknownIcon from "../../assets/icons/unknown.webp"; import videoIcon from "../../assets/icons/video.webp"; -import { - audioSubCategories, - bookSubCategories, - documentSubCategories, - imageSubCategories, - softwareSubCategories, - videoSubCategories, -} from "./2ndCategories.ts"; -import { musicSubCategories } from "./3rdCategories.ts"; import { Categories, Category, @@ -25,30 +16,30 @@ import { getAllCategoriesWithIcons, sortCategory, } from "./CategoryFunctions.ts"; +import { QappCategories, SupportState } from "./2ndCategories.ts"; export const firstCategories: Category[] = [ - { id: 1, name: "Software", icon: softwareIcon }, - { id: 2, name: "Gaming", icon: gamingIcon }, - { id: 3, name: "Audio", icon: audioIcon }, - { id: 4, name: "Video", icon: videoIcon }, - { id: 5, name: "Image", icon: imageIcon }, - { id: 6, name: "Document", icon: documentIcon }, - { id: 7, name: "Book", icon: bookIcon }, - { id: 99, name: "Other", icon: unknownIcon }, -].sort(sortCategory); + { id: 1, name: "Core" }, + { id: 2, name: "UI" }, + { id: 3, name: "Q-Apps" }, + { id: 4, name: "Website" }, + { id: 5, name: "Marketing" }, + { id: 99, name: "Other" }, +]; export const secondCategories: Categories = { - 1: softwareSubCategories.sort(sortCategory), - 3: audioSubCategories.sort(sortCategory), - 4: videoSubCategories.sort(sortCategory), - 5: imageSubCategories.sort(sortCategory), - 6: documentSubCategories.sort(sortCategory), - 7: bookSubCategories.sort(sortCategory), -}; - -export const thirdCategories: Categories = { - 301: musicSubCategories, + 1: SupportState, + 2: SupportState, + 3: QappCategories, + 4: SupportState, + 5: SupportState, + 99: SupportState, }; +export let thirdCategories: Categories = {}; +QappCategories.map( + supportStateCategory => + (thirdCategories[supportStateCategory.id] = SupportState) +); export const allCategoryData: CategoryData = { category: firstCategories, subCategories: [secondCategories, thirdCategories], diff --git a/src/constants/Categories/2ndCategories.ts b/src/constants/Categories/2ndCategories.ts index 4f5dc26..ead50e9 100644 --- a/src/constants/Categories/2ndCategories.ts +++ b/src/constants/Categories/2ndCategories.ts @@ -1,88 +1,23 @@ -export const softwareSubCategories = [ - { id: 101, name: "OS" }, - { id: 102, name: "Application" }, - { id: 103, name: "Source Code" }, - { id: 104, name: "Plugin" }, - { id: 199, name: "Other" }, +import OpenIcon from "../../assets/icons/OpenIcon.png"; +import ClosedIcon from "../../assets/icons/ClosedIcon.png"; +import InProgressIcon from "../../assets/icons/InProgressIcon.png"; +import CompleteIcon from "../../assets/icons/CompleteIcon.png"; + +export const SupportState = [ + { id: 101, name: "Open", icon: OpenIcon }, + { id: 102, name: "Closed", icon: ClosedIcon }, + { id: 103, name: "In Progress", icon: InProgressIcon }, + { id: 104, name: "Complete", icon: CompleteIcon }, ]; -export const audioSubCategories = [ - { id: 301, name: "Music" }, - { id: 302, name: "Podcast" }, - { id: 303, name: "Audiobook" }, - { id: 304, name: "Sound Effect" }, - { id: 305, name: "Lecture or Speech" }, - { id: 306, name: "Radio Show" }, - { id: 307, name: "Ambient Sound" }, - { id: 308, name: "Language Learning Material" }, - { id: 309, name: "Comedy & Satire" }, - { id: 310, name: "Documentary" }, - { id: 311, name: "Guided Meditation & Yoga" }, - { id: 312, name: "Live Performance" }, - { id: 313, name: "Nature Sound" }, - { id: 314, name: "Soundtrack" }, - { id: 315, name: "Interview" }, +export const QappCategories = [ + { id: 301, name: "Q-Blog" }, + { id: 302, name: "Q-Mail" }, + { id: 303, name: "Q-Shop" }, + { id: 304, name: "Q-Fund" }, + { id: 305, name: "Ear-Bump" }, + { id: 306, name: "Q-Tube" }, + { id: 307, name: "Q-Share" }, + { id: 308, name: "Q-Support" }, { id: 399, name: "Other" }, ]; - -export const videoSubCategories = [ - { id: 404, name: "Education" }, - { id: 405, name: "Lifestyle" }, - { id: 406, name: "Gaming" }, - { id: 407, name: "Technology" }, - { id: 408, name: "Sports" }, - { id: 409, name: "News & Politics" }, - { id: 410, name: "Cooking & Food" }, - { id: 411, name: "Animation" }, - { id: 412, name: "Science" }, - { id: 413, name: "Health & Wellness" }, - { id: 414, name: "DIY & Crafts" }, - { id: 415, name: "Kids & Family" }, - { id: 416, name: "Comedy" }, - { id: 417, name: "Travel & Adventure" }, - { id: 418, name: "Art & Design" }, - { id: 419, name: "Nature & Environment" }, - { id: 420, name: "Business & Finance" }, - { id: 421, name: "Personal Development" }, - { id: 423, name: "History" }, - { id: 499, name: "Other" }, -]; - -export const imageSubCategories = [ - { id: 501, name: "Nature" }, - { id: 502, name: "Urban & Cityscapes" }, - { id: 503, name: "People & Portraits" }, - { id: 504, name: "Art & Abstract" }, - { id: 505, name: "Travel & Adventure" }, - { id: 506, name: "Animals & Wildlife" }, - { id: 507, name: "Sports & Action" }, - { id: 508, name: "Food & Cuisine" }, - { id: 509, name: "Fashion & Beauty" }, - { id: 510, name: "Technology & Science" }, - { id: 511, name: "Historical & Cultural" }, - { id: 512, name: "Aerial & Drone" }, - { id: 513, name: "Black & White" }, - { id: 514, name: "Events & Celebrations" }, - { id: 515, name: "Business & Corporate" }, - { id: 516, name: "Health & Wellness" }, - { id: 517, name: "Transportation & Vehicles" }, - { id: 518, name: "Still Life & Objects" }, - { id: 519, name: "Architecture & Buildings" }, - { id: 520, name: "Landscapes & Seascapes" }, - { id: 599, name: "Other" }, -]; - -export const documentSubCategories = [ - { id: 601, name: "PDF" }, - { id: 602, name: "Word Document" }, - { id: 603, name: "Spreadsheet" }, - { id: 604, name: "Powerpoint" }, - { id: 699, name: "Other" }, -]; - -export const bookSubCategories = [ - { id: 701, name: "Audiobook" }, - { id: 702, name: "Comic" }, - { id: 703, name: "Magazine" }, - { id: 799, name: "Other" }, -]; diff --git a/src/constants/Categories/3rdCategories.ts b/src/constants/Categories/3rdCategories.ts index b31d3ac..e69de29 100644 --- a/src/constants/Categories/3rdCategories.ts +++ b/src/constants/Categories/3rdCategories.ts @@ -1,23 +0,0 @@ -export const musicSubCategories = [ - { id: 30101, name: "Rock" }, - { id: 30102, name: "Pop" }, - { id: 30103, name: "Classical" }, - { id: 30104, name: "Jazz" }, - { id: 30105, name: "Electronic" }, - { id: 30106, name: "Country" }, - { id: 30107, name: "Hip Hop/Rap" }, - { id: 30108, name: "Blues" }, - { id: 30109, name: "R&B/Soul" }, - { id: 30110, name: "Reggae" }, - { id: 30111, name: "Folk" }, - { id: 30112, name: "Metal" }, - { id: 30113, name: "World Music" }, - { id: 30114, name: "Latin" }, - { id: 30115, name: "Indie" }, - { id: 30116, name: "Punk" }, - { id: 30117, name: "Soundtracks" }, - { id: 30118, name: "Children's Music" }, - { id: 30119, name: "New Age" }, - { id: 30120, name: "Classical Crossover" }, - { id: 30199, name: "Other" }, -]; diff --git a/src/constants/Identifiers.ts b/src/constants/Identifiers.ts index b09ba1a..446f2b3 100644 --- a/src/constants/Identifiers.ts +++ b/src/constants/Identifiers.ts @@ -1,13 +1,13 @@ const useTestIdentifiers = false; -export const QSHARE_FILE_BASE = useTestIdentifiers - ? "MYTEST_share_vid_" - : "qshare_file_"; +export const QSUPPORT_FILE_BASE = useTestIdentifiers + ? "MYTEST_support_issue_" + : "q_support_issue_"; -export const QSHARE_PLAYLIST_BASE = useTestIdentifiers - ? "MYTEST_share_playlist_" - : "qshare_playlist_"; +export const QSUPPORT_PLAYLIST_BASE = useTestIdentifiers + ? "MYTEST_support_playlist_" + : "q_support_playlist_"; -export const QSHARE_COMMENT_BASE = useTestIdentifiers - ? "qcomment_v1_MYTEST_" - : "qcomment_v1_qshare_"; +export const QSUPPORT_COMMENT_BASE = useTestIdentifiers + ? "qcomment_v1_MYTEST_support_" + : "qcomment_v1_q_support_"; diff --git a/src/constants/Misc.ts b/src/constants/Misc.ts index 0edb22b..7de896c 100644 --- a/src/constants/Misc.ts +++ b/src/constants/Misc.ts @@ -1,3 +1,5 @@ export const minPriceSuperlike = 10; export const titleFormatter = /[^a-zA-Z0-9\s-_!?()&'",.;:|—~@#$%^*+=<>]/g; -export const titleFormatterOnSave = /[^a-zA-Z0-9\s-_!()&',.;—~@#$%^+=]/g; \ No newline at end of file +export const titleFormatterOnSave = /[^a-zA-Z0-9\s-_!()&',.;—~@#$%^+=]/g; + +export const log = false; diff --git a/src/hooks/useFetchFiles.tsx b/src/hooks/useFetchFiles.tsx index d6c81f4..d9d8dd9 100644 --- a/src/hooks/useFetchFiles.tsx +++ b/src/hooks/useFetchFiles.tsx @@ -19,8 +19,8 @@ import { import { RootState } from "../state/store"; import { fetchAndEvaluateVideos } from "../utils/fetchVideos"; import { - QSHARE_PLAYLIST_BASE, - QSHARE_FILE_BASE, + QSUPPORT_PLAYLIST_BASE, + QSUPPORT_FILE_BASE, } from "../constants/Identifiers.ts"; import { RequestQueue } from "../utils/queue"; import { queue } from "../wrappers/GlobalWrapper"; @@ -114,7 +114,7 @@ export const useFetchFiles = () => { try { dispatch(setIsLoadingGlobal(true)); - const url = `/arbitrary/resources/search?mode=ALL&service=DOCUMENT&query=${QSHARE_FILE_BASE}&limit=20&includemetadata=false&reverse=true&excludeblocked=true&exactmatchnames=true`; + const url = `/arbitrary/resources/search?mode=ALL&service=DOCUMENT&query=${QSUPPORT_FILE_BASE}&limit=20&includemetadata=false&reverse=true&excludeblocked=true&exactmatchnames=true`; const response = await fetch(url, { method: "GET", headers: { @@ -218,10 +218,10 @@ export const useFetchFiles = () => { } if (type === "playlists") { defaultUrl = defaultUrl + `&service=PLAYLIST`; - defaultUrl = defaultUrl + `&identifier=${QSHARE_PLAYLIST_BASE}`; + defaultUrl = defaultUrl + `&identifier=${QSUPPORT_PLAYLIST_BASE}`; } else { defaultUrl = defaultUrl + `&service=DOCUMENT`; - defaultUrl = defaultUrl + `&identifier=${QSHARE_FILE_BASE}`; + defaultUrl = defaultUrl + `&identifier=${QSUPPORT_FILE_BASE}`; } // const url = `/arbitrary/resources/search?mode=ALL&service=DOCUMENT&query=${QTUBE_VIDEO_BASE}&limit=${videoLimit}&includemetadata=false&reverse=true&excludeblocked=true&exactmatchnames=true&offset=${offset}` @@ -289,7 +289,7 @@ export const useFetchFiles = () => { const offset = filteredVideos.length; const replaceSpacesWithUnderscore = filterValue.replace(/ /g, "_"); - const url = `/arbitrary/resources/search?mode=ALL&service=DOCUMENT&query=${replaceSpacesWithUnderscore}&identifier=${QSHARE_FILE_BASE}&limit=10&includemetadata=false&reverse=true&excludeblocked=true&exactmatchnames=true&offset=${offset}`; + const url = `/arbitrary/resources/search?mode=ALL&service=DOCUMENT&query=${replaceSpacesWithUnderscore}&identifier=${QSUPPORT_FILE_BASE}&limit=10&includemetadata=false&reverse=true&excludeblocked=true&exactmatchnames=true&offset=${offset}`; const response = await fetch(url, { method: "GET", headers: { @@ -345,7 +345,7 @@ export const useFetchFiles = () => { const checkNewFiles = React.useCallback(async () => { try { - const url = `/arbitrary/resources/search?mode=ALL&service=DOCUMENT&query=${QSHARE_FILE_BASE}&limit=20&includemetadata=false&reverse=true&excludeblocked=true&exactmatchnames=true`; + const url = `/arbitrary/resources/search?mode=ALL&service=DOCUMENT&query=${QSUPPORT_FILE_BASE}&limit=20&includemetadata=false&reverse=true&excludeblocked=true&exactmatchnames=true`; const response = await fetch(url, { method: "GET", headers: { @@ -382,7 +382,7 @@ export const useFetchFiles = () => { const getFilesCount = React.useCallback(async () => { try { - let url = `/arbitrary/resources/search?mode=ALL&includemetadata=false&limit=0&service=DOCUMENT&identifier=${QSHARE_FILE_BASE}`; + let url = `/arbitrary/resources/search?mode=ALL&includemetadata=false&limit=0&service=DOCUMENT&identifier=${QSUPPORT_FILE_BASE}`; const response = await fetch(url, { method: "GET", diff --git a/src/pages/Home/FileList.tsx b/src/pages/Home/FileList.tsx index ff0c07d..85d7929 100644 --- a/src/pages/Home/FileList.tsx +++ b/src/pages/Home/FileList.tsx @@ -2,12 +2,12 @@ import { Avatar, Box, Skeleton, Tooltip } from "@mui/material"; import { BlockIconContainer, BottomParent, + FileContainer, IconsBox, NameContainer, VideoCard, VideoCardName, VideoCardTitle, - FileContainer, VideoUploadDate, } from "./FileList-styles.tsx"; import EditIcon from "@mui/icons-material/Edit"; @@ -18,7 +18,7 @@ import { } from "../../state/features/fileSlice.ts"; import BlockIcon from "@mui/icons-material/Block"; import AttachFileIcon from "@mui/icons-material/AttachFile"; -import { formatBytes } from "../FileContent/FileContent.tsx"; +import { formatBytes } from "../IssueContent/IssueContent.tsx"; import { formatDate } from "../../utils/time.ts"; import React, { useState } from "react"; import { useDispatch, useSelector } from "react-redux"; @@ -88,7 +88,7 @@ export const FileList = ({ files }: FileListProps) => { }} > {fileObj?.user === username && ( - + { diff --git a/src/pages/Home/FileListComponentLevel.tsx b/src/pages/Home/FileListComponentLevel.tsx index e32c7c0..43a5b54 100644 --- a/src/pages/Home/FileListComponentLevel.tsx +++ b/src/pages/Home/FileListComponentLevel.tsx @@ -19,8 +19,8 @@ import { import { formatDate } from "../../utils/time"; import { Video } from "../../state/features/fileSlice.ts"; import { queue } from "../../wrappers/GlobalWrapper"; -import { QSHARE_FILE_BASE } from "../../constants/Identifiers.ts"; -import { formatBytes } from "../FileContent/FileContent.tsx"; +import { QSUPPORT_FILE_BASE } from "../../constants/Identifiers.ts"; +import { formatBytes } from "../IssueContent/IssueContent.tsx"; import { getIconsFromObject } from "../../constants/Categories/CategoryFunctions.ts"; interface VideoListProps { @@ -46,7 +46,7 @@ export const FileListComponentLevel = ({ mode }: VideoListProps) => { const getVideos = React.useCallback(async () => { try { const offset = videos.length; - const url = `/arbitrary/resources/search?mode=ALL&service=DOCUMENT&query=${QSHARE_FILE_BASE}_&limit=50&includemetadata=false&reverse=true&excludeblocked=true&name=${paramName}&exactmatchnames=true&offset=${offset}`; + const url = `/arbitrary/resources/search?mode=ALL&service=DOCUMENT&query=${QSUPPORT_FILE_BASE}_&limit=50&includemetadata=false&reverse=true&excludeblocked=true&name=${paramName}&exactmatchnames=true&offset=${offset}`; const response = await fetch(url, { method: "GET", headers: { diff --git a/src/pages/Home/Home.tsx b/src/pages/Home/Home.tsx index 48620be..8bb41ae 100644 --- a/src/pages/Home/Home.tsx +++ b/src/pages/Home/Home.tsx @@ -275,6 +275,8 @@ export const Home = ({ mode }: HomeProps) => { }} sx={{ marginTop: "20px", + fontWeight: 1000, + color: "white", }} variant="contained" > @@ -286,6 +288,8 @@ export const Home = ({ mode }: HomeProps) => { }} sx={{ marginTop: "20px", + fontWeight: 1000, + color: "white", }} variant="contained" > diff --git a/src/pages/IndividualProfile/IndividualProfile.tsx b/src/pages/IndividualProfile/IndividualProfile.tsx index d77ca1c..8c76fac 100644 --- a/src/pages/IndividualProfile/IndividualProfile.tsx +++ b/src/pages/IndividualProfile/IndividualProfile.tsx @@ -5,11 +5,10 @@ import { AuthorTextComment, StyledCardColComment, StyledCardHeaderComment, -} from "../FileContent/FileContent-styles.tsx"; +} from "../IssueContent/IssueContent-styles.tsx"; import { Avatar, Box, useTheme } from "@mui/material"; import { useParams } from "react-router-dom"; import { useSelector } from "react-redux"; -import { setUserAvatarHash } from "../../state/features/globalSlice"; import { RootState } from "../../state/store"; export const IndividualProfile = () => { diff --git a/src/pages/FileContent/FileContent-styles.tsx b/src/pages/IssueContent/IssueContent-styles.tsx similarity index 93% rename from src/pages/FileContent/FileContent-styles.tsx rename to src/pages/IssueContent/IssueContent-styles.tsx index 35c53eb..7f95ce8 100644 --- a/src/pages/FileContent/FileContent-styles.tsx +++ b/src/pages/IssueContent/IssueContent-styles.tsx @@ -1,5 +1,5 @@ import { styled } from "@mui/system"; -import { Box, Grid, Typography, Checkbox } from "@mui/material"; +import { Box, Typography } from "@mui/material"; export const FilePlayerContainer = styled(Box)(({ theme }) => ({ maxWidth: "95%", @@ -25,6 +25,10 @@ export const FileDescription = styled(Typography)(({ theme }) => ({ wordBreak: "break-word", })); +export const ImageContainer = styled(Box)(({ theme }) => ({ + display: "flex", +})); + export const Spacer = ({ height }: any) => { return ( { +export const IssueContent = () => { const { name, id } = useParams(); const [isExpandedDescription, setIsExpandedDescription] = useState(false); @@ -106,7 +99,7 @@ export const FileContent = () => { if (!name || !id) return; dispatch(setIsLoadingGlobal(true)); - const url = `/arbitrary/resources/search?mode=ALL&service=DOCUMENT&query=${QSHARE_FILE_BASE}&limit=1&includemetadata=true&reverse=true&excludeblocked=true&name=${name}&exactmatchnames=true&offset=0&identifier=${id}`; + const url = `/arbitrary/resources/search?mode=ALL&service=DOCUMENT&query=${QSUPPORT_FILE_BASE}&limit=1&includemetadata=true&reverse=true&excludeblocked=true&name=${name}&exactmatchnames=true&offset=0&identifier=${id}`; const response = await fetch(url, { method: "GET", headers: { @@ -272,8 +265,6 @@ export const FileContent = () => { } } if (fileData) { - //const icon = getIconsFromObject(fileData)[0]?.icon || null; - const icon = getIconsFromObject(fileData); setIcon(icon); } @@ -415,6 +406,19 @@ export const FileContent = () => { {categoriesDisplay} + + {fileData?.images && + fileData.images.map(image => { + return ( + + ); + })} + = ({ children, setTheme }) => { userAvatar={userAvatar} authenticate={askForAccountInformation} /> - +