From 6f5dad1e7b2aa69b514e47e179635ca77cd951a4 Mon Sep 17 00:00:00 2001 From: Puyodead1 Date: Mon, 20 Mar 2023 21:48:51 -0400 Subject: [PATCH] base --- package.json | 7 +- pnpm-lock.yaml | 119 +++++++++++++++--- public/favicon.ico | Bin 3870 -> 15406 bytes public/index.html | 32 ++--- public/logo192.png | Bin 5347 -> 4222 bytes public/logo512.png | Bin 9664 -> 19378 bytes src/App.tsx | 28 +++-- .../images/logo/Fosscord-Icon-Rounded.svg | 10 ++ src/components/Container.tsx | 6 + src/components/Text.tsx | 5 + src/contexts/Auth.tsx | 25 ++++ src/contexts/Theme.tsx | 57 +++++++++ src/hooks/useAuth.ts | 6 + src/index.tsx | 10 +- src/pages/ErrorPage.tsx | 17 +++ src/pages/LoginPage.tsx | 7 ++ src/pages/NotFound.tsx | 7 ++ src/pages/RegistrationPage.tsx | 7 ++ src/pages/RootPage.tsx | 7 ++ src/stores/AppStore.ts | 18 +++ src/stores/ThemeStore.ts | 24 ++++ src/utils/RequireAuth.tsx | 15 +++ tsconfig.json | 14 +-- 23 files changed, 362 insertions(+), 59 deletions(-) create mode 100644 src/assets/images/logo/Fosscord-Icon-Rounded.svg create mode 100644 src/components/Container.tsx create mode 100644 src/components/Text.tsx create mode 100644 src/contexts/Auth.tsx create mode 100644 src/contexts/Theme.tsx create mode 100644 src/hooks/useAuth.ts create mode 100644 src/pages/ErrorPage.tsx create mode 100644 src/pages/LoginPage.tsx create mode 100644 src/pages/NotFound.tsx create mode 100644 src/pages/RegistrationPage.tsx create mode 100644 src/pages/RootPage.tsx create mode 100644 src/stores/AppStore.ts create mode 100644 src/stores/ThemeStore.ts create mode 100644 src/utils/RequireAuth.tsx diff --git a/package.json b/package.json index eaa287d..d173aba 100644 --- a/package.json +++ b/package.json @@ -16,16 +16,20 @@ "@types/react": "^18.0.28", "@types/react-dom": "^18.0.11", "mobx": "^6.8.0", + "mobx-react-lite": "^3.4.3", "react": "^18.2.0", "react-advanced-cropper": "^0.18.0", "react-colorful": "^5.6.1", "react-dom": "^18.2.0", + "react-error-boundary": "^3.1.4", "react-hook-form": "^7.43.7", "react-icons": "^4.8.0", "react-loading-skeleton": "^3.2.0", "react-responsive": "^9.0.2", + "react-router-dom": "^6.9.0", "react-scripts": "5.0.1", - "react-spinkit": "^3.0.0", + "react-spinners": "^0.13.8", + "reoverlay": "^1.0.3", "slate": "^0.91.4", "slate-react": "^0.92.0", "styled-components": "^5.3.9", @@ -57,6 +61,7 @@ }, "devDependencies": { "@craco/craco": "^7.1.0", + "@types/styled-components": "^5.1.26", "craco-esbuild": "^0.5.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1bf3fc0..2643f81 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,18 +14,23 @@ specifiers: '@types/node': ^16.18.16 '@types/react': ^18.0.28 '@types/react-dom': ^18.0.11 + '@types/styled-components': ^5.1.26 craco-esbuild: ^0.5.2 mobx: ^6.8.0 + mobx-react-lite: ^3.4.3 react: ^18.2.0 react-advanced-cropper: ^0.18.0 react-colorful: ^5.6.1 react-dom: ^18.2.0 + react-error-boundary: ^3.1.4 react-hook-form: ^7.43.7 react-icons: ^4.8.0 react-loading-skeleton: ^3.2.0 react-responsive: ^9.0.2 + react-router-dom: ^6.9.0 react-scripts: 5.0.1 - react-spinkit: ^3.0.0 + react-spinners: ^0.13.8 + reoverlay: ^1.0.3 slate: ^0.91.4 slate-react: ^0.92.0 styled-components: ^5.3.9 @@ -45,16 +50,20 @@ dependencies: '@types/react': 18.0.28 '@types/react-dom': 18.0.11 mobx: 6.8.0 + mobx-react-lite: 3.4.3_woojb62cqeyk443mbl7msrwu2e react: 18.2.0 react-advanced-cropper: 0.18.0_react@18.2.0 react-colorful: 5.6.1_biqbaboplfbrettd7655fr4n2y react-dom: 18.2.0_react@18.2.0 + react-error-boundary: 3.1.4_react@18.2.0 react-hook-form: 7.43.7_react@18.2.0 react-icons: 4.8.0_react@18.2.0 react-loading-skeleton: 3.2.0_react@18.2.0 react-responsive: 9.0.2_react@18.2.0 + react-router-dom: 6.9.0_biqbaboplfbrettd7655fr4n2y react-scripts: 5.0.1_j5ip3o3v6sktjzl5cxtjyfbuo4 - react-spinkit: 3.0.0 + react-spinners: 0.13.8_biqbaboplfbrettd7655fr4n2y + reoverlay: 1.0.3_biqbaboplfbrettd7655fr4n2y slate: 0.91.4 slate-react: 0.92.0_6tgy34rvmll7duwkm4ydcekf3u styled-components: 5.3.9_biqbaboplfbrettd7655fr4n2y @@ -62,6 +71,7 @@ dependencies: devDependencies: '@craco/craco': 7.1.0_t5qpnnrvp3p35ejzfaqjqkexiq + '@types/styled-components': 5.1.26 craco-esbuild: 0.5.2_u2d5pzzfsjvcxtlxpwh3btnila packages: @@ -2458,6 +2468,11 @@ packages: resolution: {integrity: sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==} dev: false + /@remix-run/router/1.4.0: + resolution: {integrity: sha512-BJ9SxXux8zAg991UmT8slpwpsd31K1dHHbD3Ba4VzD+liLQ4WAMSxQp2d2ZPRPfN0jN2NPRowcSSoM7lCaF08Q==} + engines: {node: '>=14'} + dev: false + /@rollup/plugin-babel/5.3.1_hqhlikriuul7byjexqnpgcmenu: resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} @@ -2795,6 +2810,13 @@ packages: dependencies: '@types/node': 16.18.16 + /@types/hoist-non-react-statics/3.3.1: + resolution: {integrity: sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==} + dependencies: + '@types/react': 18.0.28 + hoist-non-react-statics: 3.3.2 + dev: true + /@types/html-minifier-terser/6.1.0: resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} @@ -2851,7 +2873,6 @@ packages: /@types/prop-types/15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} - dev: false /@types/q/1.5.5: resolution: {integrity: sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==} @@ -2886,7 +2907,6 @@ packages: '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.2 csstype: 3.1.1 - dev: false /@types/resolve/1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} @@ -2898,7 +2918,6 @@ packages: /@types/scheduler/0.16.2: resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} - dev: false /@types/semver/7.3.13: resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} @@ -2922,6 +2941,14 @@ packages: /@types/stack-utils/2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + /@types/styled-components/5.1.26: + resolution: {integrity: sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw==} + dependencies: + '@types/hoist-non-react-statics': 3.3.1 + '@types/react': 18.0.28 + csstype: 3.1.1 + dev: true + /@types/testing-library__jest-dom/5.14.5: resolution: {integrity: sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ==} dependencies: @@ -4511,7 +4538,6 @@ packages: /csstype/3.1.1: resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} - dev: false /damerau-levenshtein/1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -5969,7 +5995,6 @@ packages: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} dependencies: react-is: 16.13.1 - dev: false /hoopy/0.1.4: resolution: {integrity: sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==} @@ -7316,10 +7341,6 @@ packages: resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==} engines: {node: '>= 12.13.0'} - /loaders.css/0.1.2: - resolution: {integrity: sha512-Rhowlq24ey1VOeor+3wYOt9+MjaxBOJm1u4KlQgNC3+0xJ0LS4wq4iG57D/BPzvuD/7HHDGQOWJ+81oR2EI9bQ==} - dev: false - /locate-path/3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} @@ -7544,6 +7565,24 @@ packages: dependencies: minimist: 1.2.8 + /mobx-react-lite/3.4.3_woojb62cqeyk443mbl7msrwu2e: + resolution: {integrity: sha512-NkJREyFTSUXR772Qaai51BnE1voWx56LOL80xG7qkZr6vo8vEaLF3sz1JNUVh+rxmUzxYaqOhfuxTfqUh0FXUg==} + peerDependencies: + mobx: ^6.1.0 + react: ^16.8.0 || ^17 || ^18 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + mobx: 6.8.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + dev: false + /mobx/6.8.0: resolution: {integrity: sha512-+o/DrHa4zykFMSKfS8Z+CPSEg5LW9tSNGTuN8o6MF1GKxlfkSHSeJn5UtgxvPkGgaouplnrLXCF+duAsmm6FHQ==} dev: false @@ -8877,6 +8916,16 @@ packages: scheduler: 0.23.0 dev: false + /react-error-boundary/3.1.4_react@18.2.0: + resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==} + engines: {node: '>=10', npm: '>=6'} + peerDependencies: + react: '>=16.13.1' + dependencies: + '@babel/runtime': 7.21.0 + react: 18.2.0 + dev: false + /react-error-overlay/6.0.11: resolution: {integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==} @@ -8931,6 +8980,29 @@ packages: shallow-equal: 1.2.1 dev: false + /react-router-dom/6.9.0_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-/seUAPY01VAuwkGyVBPCn1OXfVbaWGGu4QN9uj0kCPcTyNYgL1ldZpxZUpRU7BLheKQI4Twtl/OW2nHRF1u26Q==} + engines: {node: '>=14'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + '@remix-run/router': 1.4.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + react-router: 6.9.0_react@18.2.0 + dev: false + + /react-router/6.9.0_react@18.2.0: + resolution: {integrity: sha512-51lKevGNUHrt6kLuX3e/ihrXoXCa9ixY/nVWRLlob4r/l0f45x3SzBvYJe3ctleLUQQ5fVa4RGgJOTH7D9Umhw==} + engines: {node: '>=14'} + peerDependencies: + react: '>=16.8' + dependencies: + '@remix-run/router': 1.4.0 + react: 18.2.0 + dev: false + /react-scripts/5.0.1_j5ip3o3v6sktjzl5cxtjyfbuo4: resolution: {integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==} engines: {node: '>=14.0.0'} @@ -9026,13 +9098,14 @@ packages: - webpack-hot-middleware - webpack-plugin-serve - /react-spinkit/3.0.0: - resolution: {integrity: sha512-RrfGRPjqxHQiy7quPqhjPynTu0zobgQaZu1QYBMpJJ6pCSRRRK16EZMaxdE6fLVYFRJWpX/eGATWLMoVFFT5uQ==} + /react-spinners/0.13.8_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-3e+k56lUkPj0vb5NDXPVFAOkPC//XyhKPJjvcGjyMNPWsBKpplfeyialP74G7H7+It7KzhtET+MvGqbKgAqpZA==} + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 dependencies: - classnames: 2.3.2 - loaders.css: 0.1.2 - object-assign: 4.1.1 - prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 dev: false /react-transition-group/4.4.5_biqbaboplfbrettd7655fr4n2y: @@ -9169,6 +9242,18 @@ packages: lodash: 4.17.21 strip-ansi: 6.0.1 + /reoverlay/1.0.3_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-KNk8JVf49+SS6qold8Hb6R/+Y1wti6qZfiA0YfqP+2gjWADUduM2HL2oDHQPS2HWcJLOBuGKUQF1/54DXIPEXw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + nanoid: 3.3.4 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + dev: false + /repeat-element/1.1.4: resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} engines: {node: '>=0.10.0'} diff --git a/public/favicon.ico b/public/favicon.ico index a11777cc471a4344702741ab1c8a588998b1311a..e1a43ed37d0d15b7b2c1818532b01e60b1f87a73 100644 GIT binary patch literal 15406 zcmeI2e~esJ702&(TOEa(SEXv5s4MuRF+oezYD{-`cDF6RwD@Cxu)8z6wN$B4l~zp= zC29i1=s$$4poVn8#2-Opt*$05Sfa(&8U$&rtu)xJ2vR^`3zX6=bNrn5W8Ry$@6Eh7 zJF{&gH#u|P+;@I_?|tu{d+xc0m^HJFS!|4HX>tB9oM+5N+7>Nx@4wTS z9rKM@2oEAiIPFyNrAL}gYjG{K2bwgkBGIJxY@W47WwdCWlTDDMq)oPLCw4oKt%X#! z3p`!OD=ih7bH01+wNheBdoE?*(=vLe$b!7cFLyfs@7arvkNbQczg>gbxRm*X z!+!|;ZC8sleN^P8UpsBLg2Ur0t1qG5rA)WO`{Ja?6B8o6-xiq#rY-k7<8t0QpVyNy z+BcUny^j3oHor~po%30d$rB>q+fv?c%YoUrl)2QA-~WinE${~Eaqt}YkI(DLm~Nf{ zxRo*kj(ptjyBp(_#V&4}#hM%}xede} z#59-P=)@txdrv(pviK@6RL~cB?_y+P$a3Qr&rXim$>V(^aoDy8ygN?)-y! zMYadxw6ge%c8gddSZ=sOWVXg+uFM>+Z~tA8L*(xdi=4r8^LVP(#DXScy(T+6u*uk3J>xPyCRQ#-fYAj15=*9mKLnU-U7I@?5-owbmAKU$Er9R$1pa ze(H0-02Y<6YFm9r3|YM6!IHZ+o>z6e276CG=S$?7r*XPV?SVMI6uY}^R>9Y$SF3Lp zS@gxq^s^nl%tqaBRM2nVjjx+gQk!1Mv;P=mPmpe(n|5Cu;K!EQ4351p9x_jhI&s=P+??s+>v%vfq!aoe*C-8;o$d;LK zbhz(%tik`^8=5B}MQc_Z6a%K5;>Rr+#AU2 z&DNY}0$p|D8E5>DCDoM;<(<5~X#Ly^BHQxb6IPl#Mk?(I$NUz_y3N@%B1eA!UmPBH3t z2bvR%D|*KA2i~iTu5A$hm@|f`vw zajp=B|L)x)^YKef;QG*d=j=e|a#T6Wv--+y%x%prr?6Wu-YofraIx{@mpmJ1vNl{k zBC;3Xs^7+h%QNJGH*9pyYdo20)hW(YvO{4sA|?C*J*p9xJ<|y3noE9l^DYtnJ||obKO@rhRp*dghH{4HrF++Q57c^Ec{$CHx+?1CNTlZyjg*>SF@^IE!)K8*#>~zUpnCF6Rx( zRlQa_2}#E`NjZ2}ojm&$pAa`n2-t_qJF{*%~X{%~^JZ=p}& z_ekf#)j!0CaaNcbtI8y#>}4_dnb%2mDBtSuPSrDZugGhe=V|oVy!zfHq>A_x>QGym zK9Sw5&%yE-G50xoHl9LHTHfsHphf3;`#zDkU&)y?W0!`m8l9?Z#kXp}&zvfqxmLN( z^6rL<#+ARlkNpb1KMmdex2f^bcQz--Qo`JgOhSsnAMVd|{@=AbIhLfDgM8V~Ob1KG0pZV* z&>VDs;F`vgew&a4i_N3hyU8CW#DB{1DfS-nw|(Sqwcn=`DQ3k!Kn}W}Tr_*|(~2%7 z=dalH44|L0fPT&dPMbb()}olbv*8t-uMTj2q;voDpsl<+<=;#6aeg<**_iHOPi-1! zzP3aiLGpb|ry1ak@>IpI*oHXcjVpRKtbNGy95gR*YSFljz0&!$*RNroPl5T6XHM&$ z;-nIDRk0|hG-VZYI?o(0;9Cp$+L`WyexFppM=FN!Tus~$e5?A{m8=s(oRtl+UJny< j3=uaC^IYmlwoY637-P2Hw(0rz#CTt3e0c=Yjlll^)Dz-J literal 3870 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 baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ diff --git a/public/index.html b/public/index.html index e9af5a5..a2cb0f8 100644 --- a/public/index.html +++ b/public/index.html @@ -10,34 +10,20 @@ content="Web site created using create-react-app" /> - - Fosscord + +
- diff --git a/public/logo192.png b/public/logo192.png index fc44b0a3796c0e0a64c3d858ca038bd4570465d9..aa6c49f46c8441997716d75618125759283ea65b 100644 GIT binary patch literal 4222 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 U+MNJd&;S4c07*qoM6N<$f=a23SpWb4 literal 5347 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 X@eDJUQo;Ye2mwlRs{=o;~j3Yuyp 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 b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN diff --git a/src/App.tsx b/src/App.tsx index b30e2a0..67ecd7c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,14 +1,26 @@ -import Typography from "@mui/material/Typography"; -import "./App.css"; +import { Route, Routes } from "react-router-dom"; +import LoginPage from "./pages/LoginPage"; +import NotFoundPage from "./pages/NotFound"; +import RegistrationPage from "./pages/RegistrationPage"; +import RootPage from "./pages/RootPage"; +import RequireAuth from "./utils/RequireAuth"; function App() { return ( -
- - Fosscord Client - - ; -
+ + + + + } + /> + + } /> + } /> + } /> + ); } diff --git a/src/assets/images/logo/Fosscord-Icon-Rounded.svg b/src/assets/images/logo/Fosscord-Icon-Rounded.svg new file mode 100644 index 0000000..47fbe93 --- /dev/null +++ b/src/assets/images/logo/Fosscord-Icon-Rounded.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/components/Container.tsx b/src/components/Container.tsx new file mode 100644 index 0000000..7b4556c --- /dev/null +++ b/src/components/Container.tsx @@ -0,0 +1,6 @@ +import styled from "styled-components"; + +export default styled.div` + background-color: var(--background); + color: var(--text); +`; diff --git a/src/components/Text.tsx b/src/components/Text.tsx new file mode 100644 index 0000000..3cd2094 --- /dev/null +++ b/src/components/Text.tsx @@ -0,0 +1,5 @@ +import styled from "styled-components"; + +export default styled.div` + color: var(--text); +`; diff --git a/src/contexts/Auth.tsx b/src/contexts/Auth.tsx new file mode 100644 index 0000000..bf9e14a --- /dev/null +++ b/src/contexts/Auth.tsx @@ -0,0 +1,25 @@ +import React from "react"; + +interface AuthContextType { + user: any; + signin: () => void; + signout: () => void; +} + +export const AuthContext = React.createContext(null!); + +export function AuthProvider({ children }: { children: React.ReactNode }) { + let [user, setUser] = React.useState(null); + + let signin = () => { + setUser("test"); + }; + + let signout = () => { + setUser(null); + }; + + let value = { user, signin, signout }; + + return {children}; +} diff --git a/src/contexts/Theme.tsx b/src/contexts/Theme.tsx new file mode 100644 index 0000000..d3e8c3b --- /dev/null +++ b/src/contexts/Theme.tsx @@ -0,0 +1,57 @@ +import { observer } from "mobx-react-lite"; +import { createGlobalStyle } from "styled-components"; +import { useAppStore } from "../stores/AppStore"; + +export type ThemeVariables = "primary" | "secondary" | "background" | "text"; + +export type Overrides = { + [variable in ThemeVariables]: string; +}; + +export type Theme = Overrides & { + light?: boolean; +}; + +export const ThemePresets: Record = { + light: { + primary: "#FF5F00", + secondary: "#FF3D00", + background: "#e9e2e1", + text: "#000000", + }, + dark: { + primary: "#FF5F00", + secondary: "#FF3D00", + background: "#141212", + text: "#e9e2e1", + }, +}; + +const GlobalTheme = createGlobalStyle<{ theme: Theme }>` +:root { + ${(props) => generateVariables(props.theme)} +} +`; + +export const generateVariables = (theme: Theme) => { + return (Object.keys(theme) as ThemeVariables[]).map((key) => { + const colour = theme[key]; + try { + const r = parseInt(colour.substring(1, 3), 16); + const g = parseInt(colour.substring(3, 5), 16); + const b = parseInt(colour.substring(5, 7), 16); + return `--${key}: ${theme[key]}; --${key}-rgb: rgb(${r}, ${g}, ${b});`; + } catch { + return `--${key}: ${theme[key]};`; + } + }); +}; + +export default observer(() => { + const appStore = useAppStore(); + const theme = appStore.theme; + + const variables = theme.computeVariables(); + + return ; +}); diff --git a/src/hooks/useAuth.ts b/src/hooks/useAuth.ts new file mode 100644 index 0000000..645e158 --- /dev/null +++ b/src/hooks/useAuth.ts @@ -0,0 +1,6 @@ +import React from "react"; +import { AuthContext } from "../contexts/Auth"; + +export default function useAuth() { + return React.useContext(AuthContext); +} diff --git a/src/index.tsx b/src/index.tsx index 27e4993..5caf8d2 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -4,7 +4,10 @@ import "@fontsource/roboto/500.css"; import "@fontsource/roboto/700.css"; import React from "react"; import ReactDOM from "react-dom/client"; +import { BrowserRouter } from "react-router-dom"; import App from "./App"; +import { AuthProvider } from "./contexts/Auth"; +import Theme from "./contexts/Theme"; import "./index.css"; const root = ReactDOM.createRoot( @@ -12,6 +15,11 @@ const root = ReactDOM.createRoot( ); root.render( - + + + + + + ); diff --git a/src/pages/ErrorPage.tsx b/src/pages/ErrorPage.tsx new file mode 100644 index 0000000..6d3293e --- /dev/null +++ b/src/pages/ErrorPage.tsx @@ -0,0 +1,17 @@ +import Container from "../components/Container"; +import Text from "../components/Text"; + +interface Props { + error: Error; +} + +function ErrorPage({ error }: Props) { + return ( + + Oops, Something went wrong! +
{error.message}
+
+ ); +} + +export default ErrorPage; diff --git a/src/pages/LoginPage.tsx b/src/pages/LoginPage.tsx new file mode 100644 index 0000000..1a24a2c --- /dev/null +++ b/src/pages/LoginPage.tsx @@ -0,0 +1,7 @@ +import Container from "../components/Container"; + +function LoginPage() { + return LoginPage; +} + +export default LoginPage; diff --git a/src/pages/NotFound.tsx b/src/pages/NotFound.tsx new file mode 100644 index 0000000..63369be --- /dev/null +++ b/src/pages/NotFound.tsx @@ -0,0 +1,7 @@ +import Container from "../components/Container"; + +function NotFoundPage() { + return NotFound; +} + +export default NotFoundPage; diff --git a/src/pages/RegistrationPage.tsx b/src/pages/RegistrationPage.tsx new file mode 100644 index 0000000..513f84a --- /dev/null +++ b/src/pages/RegistrationPage.tsx @@ -0,0 +1,7 @@ +import Container from "../components/Container"; + +function RegistrationPage() { + return RegistrationPage; +} + +export default RegistrationPage; diff --git a/src/pages/RootPage.tsx b/src/pages/RootPage.tsx new file mode 100644 index 0000000..1765c3d --- /dev/null +++ b/src/pages/RootPage.tsx @@ -0,0 +1,7 @@ +import Container from "../components/Container"; + +function RootPage() { + return RootPage; +} + +export default RootPage; diff --git a/src/stores/AppStore.ts b/src/stores/AppStore.ts new file mode 100644 index 0000000..4718320 --- /dev/null +++ b/src/stores/AppStore.ts @@ -0,0 +1,18 @@ +import { makeAutoObservable } from "mobx"; +import ThemeStore from "./ThemeStore"; + +export default class AppStore { + theme: ThemeStore; + + constructor() { + this.theme = new ThemeStore(); + + makeAutoObservable(this); + } +} + +export const appStore = new AppStore(); + +export function useAppStore() { + return appStore; +} diff --git a/src/stores/ThemeStore.ts b/src/stores/ThemeStore.ts new file mode 100644 index 0000000..6bf2ff0 --- /dev/null +++ b/src/stores/ThemeStore.ts @@ -0,0 +1,24 @@ +import { computed, makeAutoObservable } from "mobx"; +import type { Theme } from "../contexts/Theme"; +import { ThemePresets } from "../contexts/Theme"; + +export default class ThemeStore { + constructor() { + makeAutoObservable(this); + } + + @computed + getVariables(): Theme { + return { + ...ThemePresets["dark"], + light: false, + }; + } + + @computed + computeVariables() { + const variables = this.getVariables(); + + return variables as unknown as Theme; + } +} diff --git a/src/utils/RequireAuth.tsx b/src/utils/RequireAuth.tsx new file mode 100644 index 0000000..1cd62c1 --- /dev/null +++ b/src/utils/RequireAuth.tsx @@ -0,0 +1,15 @@ +import { Navigate, useLocation } from "react-router-dom"; +import useAuth from "../hooks/useAuth"; + +function RequireAuth({ children }: { children: JSX.Element }) { + let auth = useAuth(); + let location = useLocation(); + + if (!auth.user) { + return ; + } + + return children; +} + +export default RequireAuth; diff --git a/tsconfig.json b/tsconfig.json index a273b0c..ed0e2cf 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,11 +1,7 @@ { "compilerOptions": { "target": "es5", - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], + "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, "esModuleInterop": true, @@ -18,9 +14,9 @@ "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, - "jsx": "react-jsx" + "jsx": "react-jsx", + "experimentalDecorators": true, + "emitDecoratorMetadata": true }, - "include": [ - "src" - ] + "include": ["src"] }