From 911693f3c3fa8913ab7ba3bcc03841d3469f92ce Mon Sep 17 00:00:00 2001 From: etwodev Date: Tue, 11 Nov 2025 15:19:09 +0000 Subject: [PATCH] feat: initialise template --- .gitignore | 46 + .nvmrc | 1 + .prettierrc | 12 + README.md | 3 + commitlint.config.cjs | 6 + eslint.config.cjs | 83 + global.d.ts | 29 + index.html | 13 + jest.config.cjs | 10 + package.json | 67 + postcss.config.cjs | 14 + public/android-chrome-192x192.png | Bin 0 -> 26331 bytes public/android-chrome-512x512.png | Bin 0 -> 94896 bytes public/apple-touch-icon.png | Bin 0 -> 24223 bytes public/favicon-16x16.png | Bin 0 -> 553 bytes public/favicon-32x32.png | Bin 0 -> 1580 bytes public/favicon.ico | Bin 0 -> 15406 bytes src/App.tsx | 25 + src/__test__/App.test.tsx | 16 + src/components/NotFoundPage/SAJ.png | Bin 0 -> 40628 bytes src/components/NotFoundPage/index.tsx | 42 + src/components/shared/Clock/index.tsx | 23 + .../ColorSchemeToggle.module.css | 24 + .../shared/ColorSchemeToggle/index.tsx | 29 + .../shared/ConfettiButton/index.tsx | 43 + .../shared/CopyActionIcon/index.tsx | 41 + .../shared/CopyLabelButton/index.tsx | 34 + .../shared/FlexCenter/FlexCenter.module.css | 6 + src/components/shared/FlexCenter/index.tsx | 18 + src/components/shared/IconLesbian/index.tsx | 38 + .../shared/ProtectedRoute/index.tsx | 69 + src/components/shared/PublicRoute/index.tsx | 49 + src/components/shared/Tabs/Tabs.module.css | 51 + src/components/shared/Tabs/index.tsx | 107 + .../ToggleActionIcon.module.css | 11 + .../shared/ToggleActionIcon/index.tsx | 29 + src/components/shared/UploadFrame/index.tsx | 21 + src/global.css | 54 + src/index.tsx | 5 + src/lib/hooks/index.ts | 1 + src/lib/hooks/useStrictColorScheme/index.ts | 19 + src/lib/providers/index.tsx | 19 + src/lib/store/defaultState.ts | 5 + src/lib/store/index.ts | 9 + src/lib/store/slices/appSlice.ts | 24 + src/lib/theme/index.ts | 94 + src/lib/utils/auth/hooks/useAuthorize.ts | 54 + src/lib/utils/auth/hooks/useCreateClient.ts | 62 + .../utils/auth/hooks/useDeleteAdminClient.ts | 50 + .../utils/auth/hooks/useDeleteAdminUser.ts | 50 + src/lib/utils/auth/hooks/useDeleteUserData.ts | 57 + .../utils/auth/hooks/useFetchAdminClients.ts | 66 + .../utils/auth/hooks/useFetchAdminUsers.ts | 71 + src/lib/utils/auth/hooks/useFetchClient.ts | 53 + src/lib/utils/auth/hooks/useFetchClients.ts | 55 + .../utils/auth/hooks/useFetchCurrentUser.ts | 54 + src/lib/utils/auth/hooks/useLogin.ts | 49 + src/lib/utils/auth/hooks/useLogout.ts | 44 + src/lib/utils/auth/hooks/usePostUserData.ts | 45 + src/lib/utils/auth/hooks/useRefresh.ts | 44 + src/lib/utils/auth/hooks/useRegister.ts | 50 + src/lib/utils/auth/hooks/useReset.ts | 50 + src/lib/utils/auth/hooks/useSendEmailCode.ts | 55 + src/lib/utils/auth/hooks/useSession.ts | 65 + src/lib/utils/auth/hooks/useUpdateClient.ts | 63 + .../utils/auth/hooks/useUpdateCurrentUser.ts | 69 + src/lib/utils/auth/hooks/useUpdateUserRole.ts | 65 + src/lib/utils/auth/index.ts | 193 + src/lib/utils/copyToClipboard/index.ts | 39 + src/lib/utils/debounce/index.ts | 26 + src/setupTests.ts | 1 + tsconfig.json | 116 + vite.config.ts | 13 + yarn.lock | 5927 +++++++++++++++++ 74 files changed, 8676 insertions(+) create mode 100644 .gitignore create mode 100644 .nvmrc create mode 100644 .prettierrc create mode 100644 README.md create mode 100644 commitlint.config.cjs create mode 100644 eslint.config.cjs create mode 100644 global.d.ts create mode 100644 index.html create mode 100644 jest.config.cjs create mode 100644 package.json create mode 100644 postcss.config.cjs create mode 100755 public/android-chrome-192x192.png create mode 100755 public/android-chrome-512x512.png create mode 100755 public/apple-touch-icon.png create mode 100755 public/favicon-16x16.png create mode 100755 public/favicon-32x32.png create mode 100755 public/favicon.ico create mode 100755 src/App.tsx create mode 100755 src/__test__/App.test.tsx create mode 100644 src/components/NotFoundPage/SAJ.png create mode 100644 src/components/NotFoundPage/index.tsx create mode 100755 src/components/shared/Clock/index.tsx create mode 100755 src/components/shared/ColorSchemeToggle/ColorSchemeToggle.module.css create mode 100755 src/components/shared/ColorSchemeToggle/index.tsx create mode 100755 src/components/shared/ConfettiButton/index.tsx create mode 100755 src/components/shared/CopyActionIcon/index.tsx create mode 100755 src/components/shared/CopyLabelButton/index.tsx create mode 100755 src/components/shared/FlexCenter/FlexCenter.module.css create mode 100755 src/components/shared/FlexCenter/index.tsx create mode 100755 src/components/shared/IconLesbian/index.tsx create mode 100644 src/components/shared/ProtectedRoute/index.tsx create mode 100644 src/components/shared/PublicRoute/index.tsx create mode 100755 src/components/shared/Tabs/Tabs.module.css create mode 100755 src/components/shared/Tabs/index.tsx create mode 100755 src/components/shared/ToggleActionIcon/ToggleActionIcon.module.css create mode 100755 src/components/shared/ToggleActionIcon/index.tsx create mode 100755 src/components/shared/UploadFrame/index.tsx create mode 100755 src/global.css create mode 100755 src/index.tsx create mode 100755 src/lib/hooks/index.ts create mode 100755 src/lib/hooks/useStrictColorScheme/index.ts create mode 100755 src/lib/providers/index.tsx create mode 100755 src/lib/store/defaultState.ts create mode 100755 src/lib/store/index.ts create mode 100755 src/lib/store/slices/appSlice.ts create mode 100755 src/lib/theme/index.ts create mode 100644 src/lib/utils/auth/hooks/useAuthorize.ts create mode 100644 src/lib/utils/auth/hooks/useCreateClient.ts create mode 100644 src/lib/utils/auth/hooks/useDeleteAdminClient.ts create mode 100644 src/lib/utils/auth/hooks/useDeleteAdminUser.ts create mode 100644 src/lib/utils/auth/hooks/useDeleteUserData.ts create mode 100644 src/lib/utils/auth/hooks/useFetchAdminClients.ts create mode 100644 src/lib/utils/auth/hooks/useFetchAdminUsers.ts create mode 100644 src/lib/utils/auth/hooks/useFetchClient.ts create mode 100644 src/lib/utils/auth/hooks/useFetchClients.ts create mode 100644 src/lib/utils/auth/hooks/useFetchCurrentUser.ts create mode 100644 src/lib/utils/auth/hooks/useLogin.ts create mode 100644 src/lib/utils/auth/hooks/useLogout.ts create mode 100644 src/lib/utils/auth/hooks/usePostUserData.ts create mode 100644 src/lib/utils/auth/hooks/useRefresh.ts create mode 100644 src/lib/utils/auth/hooks/useRegister.ts create mode 100644 src/lib/utils/auth/hooks/useReset.ts create mode 100644 src/lib/utils/auth/hooks/useSendEmailCode.ts create mode 100644 src/lib/utils/auth/hooks/useSession.ts create mode 100644 src/lib/utils/auth/hooks/useUpdateClient.ts create mode 100644 src/lib/utils/auth/hooks/useUpdateCurrentUser.ts create mode 100644 src/lib/utils/auth/hooks/useUpdateUserRole.ts create mode 100644 src/lib/utils/auth/index.ts create mode 100755 src/lib/utils/copyToClipboard/index.ts create mode 100755 src/lib/utils/debounce/index.ts create mode 100755 src/setupTests.ts create mode 100644 tsconfig.json create mode 100644 vite.config.ts create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..14e5295 --- /dev/null +++ b/.gitignore @@ -0,0 +1,46 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage +/.swc + +# next.js +/.next/ +/out/ +/dist + +# production +/build + +# misc +.DS_Store +*.pem +.marker* + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# database +*.db +*.sqlite + +# logs +.logs diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..91d5f6f --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +22.18.0 diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..41e967f --- /dev/null +++ b/.prettierrc @@ -0,0 +1,12 @@ +{ + "tabWidth": 2, + "semi": true, + "singleQuote": true, + "trailingComma": "all", + "arrowParens": "avoid", + "bracketSpacing": true, + "printWidth": 80, + "[yaml]": { + "editor.autoIndent": "advanced" + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..69b3244 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# frontend-template + +Frontend templates for using auth.etwo.dev diff --git a/commitlint.config.cjs b/commitlint.config.cjs new file mode 100644 index 0000000..d486aa6 --- /dev/null +++ b/commitlint.config.cjs @@ -0,0 +1,6 @@ +module.exports = { + extends: ['@commitlint/config-conventional'], + rules: { + 'body-max-line-length': [0], + }, +}; diff --git a/eslint.config.cjs b/eslint.config.cjs new file mode 100644 index 0000000..6cddfb7 --- /dev/null +++ b/eslint.config.cjs @@ -0,0 +1,83 @@ +const tsParser = require('@typescript-eslint/parser'); +const stylisticPlugin = require('@stylistic/eslint-plugin'); +const tsPlugin = require ('@typescript-eslint/eslint-plugin') +const reactPlugin = require('eslint-plugin-react'); +const sortPlugin = require('eslint-plugin-simple-import-sort'); + +/** @type {import("eslint").FlatConfig[]} */ +module.exports = [ + { + ignores: ['node_modules/**', 'dist/**', 'wailjs/**'], + + languageOptions: { + globals: { + expect: 'readonly', + }, + parser: tsParser, + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + tsconfigRootDir: __dirname, + }, + }, + + plugins: { + '@stylistic': stylisticPlugin, + '@typescript-eslint': tsPlugin, + react: reactPlugin, + 'simple-import-sort': sortPlugin, + }, + + settings: { + react: { + version: 'detect', + }, + }, + + rules: { + '@typescript-eslint/no-misused-new': 'error', + semi: ['error', 'always'], + '@typescript-eslint/no-empty-function': 'error', + 'simple-import-sort/imports': 'error', + 'simple-import-sort/exports': 'error', + '@stylistic/member-delimiter-style': [ + 'error', + { + multiline: { delimiter: 'semi', requireLast: true }, + singleline: { delimiter: 'semi', requireLast: false }, + }, + ], + 'no-var': 'error', + 'no-eval': 'error', + 'eol-last': 'error', + 'no-console': 'error', + 'default-case': 'error', + semi: 'off', + 'no-regex-spaces': 'error', + 'constructor-super': 'error', + 'no-invalid-regexp': 'error', + curly: ['error', 'multi-line'], + 'no-irregular-whitespace': 'error', + 'quote-props': ['error', 'as-needed'], + 'linebreak-style': ['error', 'unix'], + 'padding-line-between-statements': [ + 'error', + { blankLine: 'always', prev: '*', next: 'return' }, + ], + 'prefer-const': ['error', { destructuring: 'all' }], + 'comma-dangle': ['error', 'always-multiline'], + indent: [ + 'error', + 2, + { SwitchCase: 1, ignoredNodes: ['ConditionalExpression', 'TemplateLiteral'] }, + ], + }, + }, + + { + files: ['.eslintrc.{js,cjs}'], + languageOptions: { + sourceType: 'script', + }, + }, +]; diff --git a/global.d.ts b/global.d.ts new file mode 100644 index 0000000..d85ec17 --- /dev/null +++ b/global.d.ts @@ -0,0 +1,29 @@ +declare module '*.module.css' { + const classes: { [key: string]: string }; + export default classes; +} + +declare module '*.png' { + const value: string; + export default value; +} + +declare module '*.jpg' { + const value: string; + export default value; +} + +declare module '*.jpeg' { + const value: string; + export default value; +} + +declare module '*.svg' { + const value: string; + export default value; +} + +declare module '*.gif' { + const value: string; + export default value; +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..c58b226 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Single Sign On - etwo.dev + + +
+ + + diff --git a/jest.config.cjs b/jest.config.cjs new file mode 100644 index 0000000..93d5013 --- /dev/null +++ b/jest.config.cjs @@ -0,0 +1,10 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'jsdom', + verbose: true, + transform: { + '^.+\\.tsx?$': 'ts-jest', + }, + setupFilesAfterEnv: ['./src/setupTests.ts'], +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000..281fefa --- /dev/null +++ b/package.json @@ -0,0 +1,67 @@ +{ + "name": "frontend", + "private": false, + "version": "1.0.0", + "main": "src/index.ts", + "type": "module", + "scripts": { + "dev": "vite --open", + "test": "jest --watch --maxWorkers=25%", + "preview": "vite preview", + "build": "tsc && vite build", + "setup": "cp .env.template .env", + "format": "prettier . --write --ignore-path=.prettierignore", + "lint": "eslint --ext .ts,.tsx,.js ." + }, + "dependencies": { + "@fontsource/bricolage-grotesque": "^5.2.8", + "@fontsource/inter": "^5.2.6", + "@mantine/core": "^8.2.4", + "@mantine/dates": "^8.2.4", + "@mantine/hooks": "^8.2.4", + "@tabler/icons-react": "^3.34.1", + "axios": "^1.11.0", + "dayjs": "^1.11.13", + "react": "^19.1.1", + "react-confetti": "^6.4.0", + "react-dom": "^19.1.1", + "react-router-dom": "^7.9.4", + "zustand": "^5.0.7" + }, + "devDependencies": { + "@commitlint/cli": "^19.8.1", + "@commitlint/config-conventional": "^19.8.1", + "@stylistic/eslint-plugin": "^5.2.3", + "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "^6.6.4", + "@testing-library/react": "^16.3.0", + "@testing-library/user-event": "^14.6.1", + "@types/jest": "^30.0.0", + "@types/node": "^24.2.0", + "@types/react": "^19.1.9", + "@types/react-dom": "^19.1.7", + "@typescript-eslint/eslint-plugin": "^8.39.0", + "@typescript-eslint/parser": "^8.39.0", + "@vitejs/plugin-react": "^4.7.0", + "eslint": "^9.32.0", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-simple-import-sort": "^12.1.1", + "jest": "^30.0.5", + "jest-environment-jsdom": "^30.0.5", + "lint-staged": "^16.1.4", + "postcss": "^8.5.6", + "postcss-preset-mantine": "^1.18.0", + "postcss-simple-vars": "^7.0.1", + "prettier": "^3.6.2", + "testdouble": "^3.20.2", + "ts-jest": "^29.4.1", + "typescript": "5.8.3", + "vite": "^7.0.6" + }, + "author": "Lea Anthony ", + "license": "MIT", + "bugs": { + "url": "https://github.com/wailsapp/wails/issues" + }, + "homepage": "https://github.com/wailsapp/wails#readme" +} diff --git a/postcss.config.cjs b/postcss.config.cjs new file mode 100644 index 0000000..bfba0dd --- /dev/null +++ b/postcss.config.cjs @@ -0,0 +1,14 @@ +module.exports = { + plugins: { + 'postcss-preset-mantine': {}, + 'postcss-simple-vars': { + variables: { + 'mantine-breakpoint-xs': '36em', + 'mantine-breakpoint-sm': '48em', + 'mantine-breakpoint-md': '62em', + 'mantine-breakpoint-lg': '75em', + 'mantine-breakpoint-xl': '88em', + }, + }, + }, +}; diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png new file mode 100755 index 0000000000000000000000000000000000000000..eed92e8c96ac5145227b2e776802159e9d276e84 GIT binary patch literal 26331 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�W#n$ftXi%p0QzAiQP=*C>6@AZys7^9QPpg6w1= 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

#$K@%#(9LAU zmys8GJq-|^mXno2^_Sg}2WLi;uG|V)JpSMESV8mmALO&Ws(kh7NAU z^@MwB6SanzLT|)shLD@j>nwJ^kf;}GQZ9TBJ)bArVN!~FK6nv`twWlj-n`al^OCs)rE@t~u;}&@~3MQ743f%c^ zk9?#3$=W40x#BD`WjtA>Fi-kEs5HtKGQ+J~Qjt4=FeR-nd?x4o_Yl9`pEss#{u|>( zZ^&eI{yI?^W*eC%5dH{WL-jYJf@3hH%0leH6AZZk$WOPt`0Dv5Pk9FpPl68TKcav* zf|*BglM1vK__E%;SzCI&_FLEa5sTpU*3~C3v`QlOKupI7f|`GTDXCRph4Rm?jpqL% z#8`@nfa}DeK+Y1|D&)2;^wf&Zf3P(;0)>$qYl;GA&xtyu{JlpEfU`+(R; z9M*JOB%Ke{F$qQ13$(vTS8XW}H=_>f0b;`FC}u7uy4LT2a?(MSNP=TxUabC^kjr8n4fJEFEJtiOiKh`azoGYn~ll(rT);aPdAc1r#c(^EZDcFuq%AX$tHZ8M~ zTTg?sHAXTs)38!d;X`s_nixSIGAJIW(OWKSO3{mZjZn6rAb?(s=TgHpc&WM9n@KPOUfD!;gtQg9M za?Xi#NKc`e3Q<5cX4`u;5$Y`2JQB=f>VnP*9B zwq_&Pudl2a3E($@iPP|#*Arl8qE;<=zgs%B&J>*o!xFM$#Yw&UV4|Z z4!iqXVg?QgzUea*&q5eWC64RG{1NqUEx_ZCGQQAAvCdcfk8Qq+9T8JLg{mUSz&lH|QLME}Xv0|CTk9YmAB`W(=1h&I z$TbpTYMp5pl)AOFYwL3aqEaj;rssI(C2$S~<_J1RtH9`AN=bV9J#P}bCjgKucqG4u zd=vi}(IxtD@ck;sdFul)T05SnH%hmUfUqYF#wNJPMi6L1zph;wmOSyqz??x

v~ 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 Ag8%>k literal 0 HcmV?d00001 diff --git a/public/android-chrome-512x512.png b/public/android-chrome-512x512.png new file mode 100755 index 0000000000000000000000000000000000000000..1a4d931b63a7e491f4e8801e445d85016223b476 GIT binary patch literal 94896 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 lv7tj7tOkFG{=6d!_Ib>~K^t*H9{{Ztj)u#Xe literal 0 HcmV?d00001 diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png new file mode 100755 index 0000000000000000000000000000000000000000..04ccb7fb631f1464908eabf1f72ffc2a44d32fa7 GIT binary patch literal 553 zcmV+^0@nSBP)G&L0MchC#YT;T!5JVD~wSt)!$U-r0p$M5+ zLp;*p8rNEFG(j8>-lGs>c#Hx(K`csf8-vKjD||sHf#v*RFpo(b!2`TWbkCM;rN0^b z%rztQ|0Bi+_vx6uo45l@`$`)^mZ4wySqEM4L6N124bW5L9tK-0~1BT21N`kECjm??7;5A?(WwAZ=LFwfO&qe}ylFMQRIEz>PnXq+f@n!b)M~Fi`wEVTsoLAh1qk?zSKWKHQdX zg};V1!}?*F@ae$R&qQyS0e(>Q-;He&whY#PFG^PA?QJdv_?ka|)AG&2rr|$M*bf}`TbE5esA=ppfUSDWB63DIVE0Z z2*9)A1?exN-wkR;WMuE%G3SIUf`k7N{Yn@&Hvj{QjLn2!)2skA?wuMQ7|p%E%@Y*0)tYC?Qamc>B8J={2d zThA4rtv{&**^f8IVp8!V@naWQB)~w>+|q<<78y4#`eEFUf^4`sIyql=+ypG;+|YWk zcRblYTn}Yii+ShXMjbl!8EXTPCuOuar?W zf{&GAes+lYNeD={WC{M3u9FIoNwzbb1+P(nSp}5Md?tdW9N}`+M~0N)cah9@0#fPq zEwD-pL6MS%9-;dh`$U*jKwqh6QI~)z1)gpL1?2i*whuHWXNL@Nb2Z%~G`s~~Nl+2Z zNl`9hJ=x&E#Eeu}ZXx@@2Hf8&VkXo@8G^+qY)#Ag=5s z!!ysa#`m8OO{J72+Tr%P~{TUejDu280trd3Mse%F9VFP+nTilMFit{@nn%ncHP-F zmjcYkr0T*>Ej=`ddgH2@Z$gLc-1uQLz;6-nCz~qi`_ISdc8zTt$Rd-By0dLA1%_Fs z^6oR8Upa2?hlk+eYo-<5fOk7lZv8F^5wt$r_?)bU-rg3ZfYpNKx)?t?MEHWB9+*dE z$)Kp4Koe3BJ_;0000Xq3oI9D8hn&+No+8z&N-5{X21_IH2h9hXSVO8#S98v%u@Unz0J)K_d_IcR z@E-4tH^=n)n<$3gw?szdXgv=ixkhzHOV-s>}Af5Y=!N?eQ$aE{QfrQ?_vq7mZH8-w44`;G587_aeU z;3+(VqhRX_*X-KOfw?dzp*DunHxK8*xyo=CY>x3L%(?lp4TF2q4bFEq9CHcWkJoS- z{H_b!>)r^>ajXez!|z+*D$KxRD8$d;_@RD6tX!&XZTQzQ9NYN1A~#}gT%R#|kN4Kq z9Mia5oB45Hv=*+%b%r(5P20T3+=l%vpr3Bew1d>=i#%@1Mj?DZH9*T?j4U*Pwb~5L zBlg{YuQx^`G;}+i0ehhjZpDL`8L>YCx1l4BMME^#)ei30D0o(^mvU5Lf5g6Z@dl z1LOvTsecw^m+i5rj-s7{5;aHA22iBBzo!WfXdU4Opo3Z=6G44VRY$71@|;|eT9 ze186{J-0LY`~>sS2TgDkMqnMx-;MAr+fKvd*owFDJG4h9T#G?SMlR>`JdB3*9`f%# z+RUZ<>Ka|st#Iwl@F0wLBd&z?U^@mqu>{6oEXI_s{gN;KfzRO{-GJj^b4&sKO6HFysf!{<_)du*L~k9GDeF2vEWIhJEPhjTfnb02JezOJ2X zB%juFCH{bXq_z{e&>!yMCV1a*u#Ro%=08~eea<~{pO?bCO-2W#Hfv%!wqrKBBMYIW z%fI8_3TwjJxEt0=Xd$nUap6-~+g-z#u}|yK+`9Mo!MY1;r(0XoH}YwI*1?*$_M5=7 zFdv=`_vIqQn=yp*`x*V)VQrdIxrU+m0y|*c#pmYF+B1C@pRVx@c;`Qq7h zyZ7#I{QR1~0r)4jVJyx@XpZk*xUc5^9VB5rn7h#YO<03nu-2?O^Anmen&Z`QoVgeh zvG27NxB`wHnmOu@+1QThuvSxBJ1&fY<}{PIxA)`C@pF`)2NZ)-fE* zG0j0f;`_><2U<&d-S8r;MV~YF?r;xXkFlG-YvCSwrn({zC*UYpJAP*l9mBC4)3Kf7 zV9mI1hW8t@c{6V7#~RMTNeK1RDC)ab&#h<2`n87KC&zFs$8_vNHOKQlV|8BlY&)!r z1@H{J<|}bd#J=&(Lb}jj#q}-|L^iT-U&} zGzQkxp>obGb+*P_4f~y>KLx(K+>}YZI2{e$+&lB(K3e0ht9it}*F7Iu@T~sS>XCsw?&*Le8YQy%_eX2)pZgMI(huBM zg}=k6_xhZUWV60}=j9+5XW?9Q!lfvR*!P-eUit97?fJJZk5n`EVhqAy+=;Q6h6Pv} zvF|nipD_s~@VT~Vf&WKyuS34gpT8--gU7>nO(}fGm0=Th;oFFPulep>jYXJ%Bnn}< zn~NW7Ka4#Sr=SP!#cV8xzY`xvw(wbvo$$A6U&OxGc0?-p^tqSe+8wVatiM(W=Ywv8 zH1p!v*I*pXUnN3(yQ9C?^SKr)@d}Jj_Pw?WZ^77ILs*C7O~g$o!kKW+|Fwm@8~g1j zMLCS!-(!CxzkzWq##D^NQ1nK(h<&dO!*D!=g@~`i|BtxV>2NOR%!Dx3rQGg-v z|I*H9?AFLue1PSc1%G?{q6^HQbf8eF^2 zPsW?rhAOPXGR(sS^halSrrV%3e5Yg~H2YpVF5+4B{z4=%9@da!JBM>Qr*j*FvDCM@ z)==+5=sV6{?1K58gK@Y6#W0q`$xoQ4Z8VN&*s-0%xt!Cvjlo(nruxj2!F}$vH8>aM z!tpj>HU^>t9MktvbC@5WlXKKHPq^-9xVI_&W8gULF#yitT+Zp-#!%n$kj1^$Y7sm~ z)?yXRiQ_ts`))2yMIO$BHC=$SaWeegu|l)&HEZiMm>++qeKzF5?;YDYoXa_@U<{?W z2ClOi(ly6$yqn;=!1H8H&Vjjc{A1xbJzxzzfJg90l)&r8XI?|j?R)K4=nJ146S40z zj_KIWF%Zt_+{RE2Yu5X$*L2PAdSW7cpH*NHtj+dtea_PrqcIP!;VrDfLU^W)(L85F z?0an_rXoD&v-U^BF&*1EtWV=zhH6wI#NqnVHS57xz1P^?yYVQ7W6K z<|Nv}8i)!EP!weL{@0;R0JOKCI+&O;<24NyzfP3IxtcL5?8n{Qsz7cbA z8+_I=9Lq5s+c}!U82iJRzk%_`>%s4hUA{BIdPD9Pa?SDc;XRqS5KmwujHMjL-X;2c zluu**0$;;5G9U9`9?nFFzcu|X7zxiwHOep+=OQ!GiO*@+gq>K4 zp>V7guvw4B*8?GMuEDjqCf63`rJJ@nr}4W-8}TJRggG|X{#H1b&AE-iSd7WojL}$) zImGXNF2FAA!7J#ER>(qV&FGwpfpEMUSeKqL^W7L>Zn||g=XAd3VLW^BF3hpHHs@gs z=QajoF(zX(Mq_mh$8ydhEQRlgeRvt&;CJ!nxQr!`HR(dv?a644$cvFcX82jdaa-vF|9)&wHrEBHRnlkFmsC zy8VjRkI#gBnhSHX5~=5xOSR22>Y4Ig;X7jsjNcq4k&SdMk1veXm@5$9x0CrhUN`(% z@AI3Q&$T=oKTnPonsb;(Yh?nAA)d#4{!Z6?fBN1Dzi;LAZ$?|B);*VMe|vm~55p?# zfbaOpD1f;)pVp+m3C~~))+4;n+R%?TxW$u*&&z@({_;({UpLNaQ828}? zxMt_DrmQXJ_8A$wH8KR&jIq1NPoN{}YCh-q#<~#36CXdE7w>Z}=Nup1vyabj5c28w z@qF@UZOh@`!6=1icndt!o^8*#xp92w>H*hg3?Yx6AF3gEz z+l1Ql=%)<+>)z%{0}i?}cw&hZttA~l~}I?$Zk7{;L-Ragg~8G^16`(E=q$2N~Q z!96mTcr$+Y%bbOJF#bhIw_ki!+w%F>d%V|q%;z!~Uk5Zsd=K0=|Ics@o`yMc4X*nQ zm^<0u0>AT~87M+4WFa)ic8+!kaTvS5bra!PPTemq9cZcfbPeWg4hA9*#~{9jO#W_< z63oX&?8F{;hV&&IYc-yQ_ZnjcLUT;Vc8&pXPUrTyuwQ4UtIoPb3F6u zIvr;&w!z;gV{%+`WA3a`bI~OFY|E!{x$jTFcl%3`S$ulEFS@{c&Gpf69i9X0b0D0< zxt!Cvjlo#L`;6{En`^dG`- z48u_LMz@H4uZ_f1EQZf|zW3uR7<)NN;atw?+=m-Gj~-~&p7|@nO_&I4$XpqR?7xLo zSczBQT4mpBYq1{2x*Pi<{_S|V!Z literal 0 HcmV?d00001 diff --git a/src/App.tsx b/src/App.tsx new file mode 100755 index 0000000..fb36b7b --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,25 @@ +import '@fontsource/inter/300.css'; +import '@fontsource/inter/400.css'; +import '@fontsource/inter/500.css'; +import '@fontsource/inter/700.css'; +import '@fontsource/inter/800.css'; +import '@fontsource/inter/900.css'; +import '@fontsource/bricolage-grotesque/300.css'; +import '@fontsource/bricolage-grotesque/400.css'; +import '@fontsource/bricolage-grotesque/500.css'; +import '@fontsource/bricolage-grotesque/700.css'; +import '@fontsource/bricolage-grotesque/800.css'; +import './global.css'; +import '@mantine/core/styles.css'; + +import { Providers } from '@/lib/providers'; +import { Route, Routes } from 'react-router-dom'; +import { NotFoundPage } from './components/NotFoundPage'; + +export const App = (): React.JSX.Element => ( + + + } /> + + +); diff --git a/src/__test__/App.test.tsx b/src/__test__/App.test.tsx new file mode 100755 index 0000000..e72d932 --- /dev/null +++ b/src/__test__/App.test.tsx @@ -0,0 +1,16 @@ +import { render, RenderResult, screen } from '@testing-library/react'; +import React from 'react'; + +import { App } from '../App'; + +describe('App.tsx', () => { + const subject = (): RenderResult => render(); + + describe('when the application is enabled', () => { + it('renders the dom', () => { + subject(); + + expect(screen.getByText('VITE + REACT + TS + WAILS')).toBeInTheDocument(); + }); + }); +}); diff --git a/src/components/NotFoundPage/SAJ.png b/src/components/NotFoundPage/SAJ.png new file mode 100644 index 0000000000000000000000000000000000000000..c1df4e3a8dd3a587ade3fe8e00e8ef20fb28a11f GIT binary patch literal 40628 zcmV)!K#;$QP)>1TSMNhZCMKnfkCNe2}LdoNrI z_IABuz4oh!1qD<@I!N!*LJOe<(%Ym=rq|QYr|tdw;|!=@uUFUato5wSnyh5z^V!dS z>ihjX;^LdW3j(ADVnND+8d%B2!Q3an(3WL*{&OMo#54N6&v zFhn^q9HmegOtpyC1|p3R3LzD`S|pySBMdyMLLpNPn4p4`66H839YN@ka2@F+eIn?QAFrf$xlszu&@#- zG!fNGi9~Y?X)B2{T*N;#j4UNkb{xAYL6{AprH+U)VWmnKM);9WWFU+JLK6~;B}ruK zaY*2gLDXL)Rm~97f^@qeSm01dNyPuA0D%b!eIF|bD31-1sH?~Ksuc4Dgb-M%B+0ru zEH{RZLPV&MLLs96KMGKf392aD#!Y3g0IyV}lADZ=504#@8y{YviI(}5(t^k@OBwl* zV-y$*lyJ3W2l2+nTN3Hat(m5dVm#AGWpV;5>0pE*^nJ8n`KJmHSpq>ETUa0?a+NB% zsa&i)HF0=2Iewxt<>Oo@TG5yg4NV!N>f@H(kc!dNkim5oepIAfDO0NWlmfwIK{GfR z3{O?9EyAte=VV&%izPDmIKqUMk|-yJv>XHxCJYFxm48nGib<4{#BI$G)oDyy1A#8# zmx=_wk2j+Lfez6oBALpNX=uh33A~{IfBzJTa+Kc*(sbol9HbFX@CT6?f+f;l*sp>P8 zD=|D-WGLr_h0xxq-NpxHEc#mX=^AD$rq$s_q?#JixS0jfl?PNiBipBq{t*J8Zyw-kfNy}O(t!DE>JE_QVBgGZ6QSrX<2A2i~)op z&^~Rgjiejfx$~yI{P-u2GCJas$|RAZgp>j6j_&1C7oW_$d5w$??L&wF+foEROy>i} zrz?z4RhgXjD3%0;3RJ=Xr6LlJBBmmeuA;s^Nkc<|OeR4#qlmcyQi75;!Z=_O=*S^5 z3Zw!AmM{Q>2Bz~Nd-qMUW%D66zcfH;+S=W_?8tXDuUodUlrV^o-}V#Y$rL+Yc>dhI z58rw7o7VNX?>KKQ3+FWBX^&iSiYO`*X^$wZBBeq~fn|ZMGANZrsuburMoYq|!gL|W z#8i<|xk8{JG9a`@8HMXe;&I3(Ez(&@BIaSq5TnZk;S}j~nq9jk-~FF$tY1HY6h4-1 zF)&i%eIHoMH~;fQq}floJPjg-A&xXQ5`hsKr6O!A#F7%F1eU734735G5eTGI7^%@B z00P1wqT+i*fscta2n&skjugsvks^jM3WKg4etSJeH1W=N-_G6l@8z(C3wZMdN6?T} zM1GmAI|jJz?pK)1Rr$#`-@->ex}4$R7Z8-OrN9_aj*YTxlu#HP!bpNPSOTQ75Yj?O zQ~N!2MBoQR+9!xSBCS!<##SzJ#tMd^!5EOr#=Q2N%EEDySg|I2onl}p$1OMC&Ep%k zv+&q+emHmS311SQzVDYD+`9Apy$|1V`{&+%1Q(t;mtua1d@({>iP{Sk0Z~)|6QV2& zfdsA4)S-0~j@?W=o}%KFnV9IuD^Jnfl%}CRf$x{mrivvZ1cpdeF-8*w9wsV-_Rv~m z1f0@X4P5@KZG7j)Pw?aKoX_Vzvw(yBFJYn>p|KIh zMG6~1h&DdPXp}SvJfx^1jE@lpOV)mli4>p_Xd)qrw7_5h3t=oQX<>wgHVTA=h+Kq` zL_i|lNJHIhPCWf`o_g*8Kl#r4`0VG`fIET-N`z$xJKjugGRem-zLuw+e2RPSzL>6_ z98*(62qOurKDKRR2$4#l0c|u&I4EsngabGTY=pEhLK5i^V*-SXh$j;$A<$Z*EQwT5 z%9jbe2%#)OtpSCUE?Nr$<04dsrlw}fr98j*^>sY`{2>+}f5DaFeb;Ctju{M;fXXmbdcJJLsZfXJ% zl}R{?Wy@zXcU~h}k0FFdNQh8A0)x@aJVbyn8X*lz!T3}aDVkZbd_E=`q)-?mm3G+l zN{SNl>qmV+QwLxGZEP*j0mefcoh$2m-1B8fbFJ2gw zgh)pi3_=KuQAllJ303p;28^(383zWT;&k?`<%d6bfiHdQT5kINCA{r@^BC%Tg1)_b z>FR06aqFm7d>ZOHNvB%a@Z3wp6Co`v2G1`ek)S0~N+Ru}ltSxp=GN9sxG@T2EToJh zWeO>5qR2<65QLy_-vE7mLkJYMD{1S@a@g{D=rE#?FV)Tm8-$G?fEUR;`apJL7CUUTO`+kBbz;+=LKG+eqWq~muG)5Q<0wV<=2t!SC zV}ho}3VU`vP9ZnWvroOkQ|osyG+49bix;&ZqB1rSpyc-#Bh8QT9KZ7p%`x_yLiU%H+4ws|P&F*dP{!J$`Jw5XnjdYfv+AaPMfqNKt^ z0wr985lCUMlte0numX@CLRK*3iS#s)DWECh#x;dvfqU^HXATYH+#rQ}OAegxULQ<}lnaYpT-8ql@@2hg@H^-PW_aw$ArZ{X~g7eRu zO*y|0h(Lmp0glqO!i~@f5upjtIz*U|DDo+l%Ty|5z#!3p0WC1vV2mU(R?XA{=m@Pn zjPXGRAbf=I5%@%2o~iL2eDmwe`N|i1nHYM8aydstz!_(s%+)vT6Aju6yt zq!6HWNJxMd8ic?|g|OpbWzix<;42Izjyb-8czlY&WC2IG96T_@iEnJ;8(%twcYgFL zHa&0X>RLcG^lK?2ipXe$2my^!0;Ry18D&Hugu>{WYqewpLe_zZArM5SijF+0rDer3;E?Q`}xpkp5Vjp zc_Ux@;TlE`JwR`_OYbbr^wa?ippms&fV2>ngHjH*ildZ;R1r`m(mqmnC|RzVR8z*7 zGU9dDR{LKR0ugD9iI4&;Wq}ezSZI;L$VRkiAr$p!kz{*=#BrQ_N(Vzj`)Zn~HO7{>@f1PevS;@o z+7FpGw*%J=h$0``sl)dY42_hSnkrH$`=pXC^XE5`&W4mqlNb}CWPlVt7?46?41|$K z0E9%T7(&F+ zA^|ACC)8Dp4v3-v2r*h>i~><}0ZJ%pr(h7&;tw<98br+?VT?dyV`K_MiYQVT?E_VW zs3Hk4IzWg3jYkj#bai!+%XP70)zz$7Gn*@~I)iFuCnEy~NhabXlWA;eqohCz2%`vu zL`v|ZDneL@sE&NzCJ{>_WRZXZj%#6}2#Ao<;CTg{m_sVrN>GiXwSyCj6A@7;=LsW& z#cL_1L`MQ;g``q-Tz&N&+_!P`;ls~)|7lJ z@BmU;C^tqBIc(f8$hKF9a9qJ@r>>!Ab{5|&AdJLzTx{1uhY^vEkTN0&3RJ5VgpeRL zLUYErGf=j-*o^3lzeDBh)asGMpc<3)zF+B1Tbt%Du z1uYzQ*c_S~>qsZ!cwT{gVVW?I=*R|kKl3+BBC2(9xU;>0tpkw$|yJm%`poIaMK$56k9#KM@9F_>t zMj}NL$4cXCn;@)NvD)wFBNT)ogrT9np^f$HxACh#KJr4>>a*9i_s-LPrG)t8jhCU6 z#mo2IcE^&$=z0J7nRBR1=b4-wBA%{i^X4I*dh8IEXrQ$%&9TQVqOKvt4+@|SQU*w+ z5k?be4~Q_vptY#w)gnS0AK&*Vm&=rkWjrsyvFnJtX$D3#*Iu`YTkamExv87S@4uTR zs}Eyv-wuWb_cK0ri2egRIdJd={9u4oI;5^nuzYDRhpm`TeWOdMG{*SoFw(?oT}329 zL@3J;MH&RPG%&3Bb|DPNTF@m$tz#&Jm`TZM-;>f{1ZZPpB12>%LhTb7gQJo(HrA7> z&oI(I%`;E$W$Tt9#zq3lfy>;vN0ZJh;qohPWM|)YPCT}rcfWfbE0^_PE1ybb8b2ta zbs5_UiN^%4WzEDg0^71tSZHl9!bVFMNiD{bA_P&z7@sKeky3%Mk-|ks5E+9pK0;Ig zO%y8JL_GsT0YAO`Zi?w8tLLpa{6()gUF+n2@$04XlP~a+9h;!#_;^%nE*;4WrVa0TGt|PrL0=I7-)iONY$%Qt`;bj z%ji&%jHfA86bBEKdF-(RJoM-=%Ie@FANl}a`^HzW;|YfM??;F@u9L)ZEMjqoe13|Z zJ2unTw}qWMU!cE#8@5xVz0={0)0VULgl>w%edKcEwbElGYBwN?h`BKg5QZT-(ikN` z7@{ylDM1wapux7CT5MuK2!lb_iZFqXv@{JZ88VHXc!d~`KGMg7_wVIUe?X?Lhgm%f zSU7(Li;#V6&NbIQ z!6RG!%jO+_{-;Icqoc6qML&MSuhAINZW_ziy!yzWf3d2~|MO!3Uf2jtE^SiM1(dGo?j&j1AITEQt>HQ$^?GxmvgKXI*KzoQDyt~QJ&j)h!XRR%clK=jFeILE$fQ#!#tKMW z$9X*}@JxtpMa-GgjjuC2aNlkoeRPn40fjUj^mMP_)YDJr=wnusu5Tjpp;9UnPb5%r zr}m0~($o}JUU?0_`OQ@f4(*_^MKY(io>{Y#w71$c*V{BSxU{!rsIPOeErV?fY)hbZ zNDu``sSrvLMIlN^qyZ%ijx7)}LQ5NAr?9LH2#LTanQ%xXvpoIuc7Aj9(*>vNxOq)o zJ)=Rj$V?D~`0Q0b0%|FVil?X+D#spr?w%(vI-#ADj_;!A4HJ*WiNc7mnnP=!$k;@Y zAn>brK?%R=5rrY4h9D3qCGkS2lnvt(B@P{`vSWLW?R%y3$9%$qx(bRx~f zM1kpCk=C|W=Fab+v%P^ib9z|1bPjXpcGJ?-gi?^39%DLJBGQsXJV7SiOrp-FZ^uEt z_wCQIf8YI__vRix`2J&wSyPM-9Yh<4pmxD=+!zK$s6zxAq{OdygpnZ9hN@S^wIs=y zB8+@myX(j_wejm;ZQ+J%cav}zFmLfuoOs*`oO;@cWLsOQF0TJ{R`~d*T>kzG?l6$j2xs&uy^-9MurcONZA-uLCGR9r$RjL)7S_dEjI0KNm^Tz zG}JjXH)lv?U1BjqD(#Sr#gQnKvaqdMZxVcbY(ia!S9O`1E-^e(V9%a$3R8nP_Bj3d z=FwF9>Ru5P%eAuiOdS2mYkyT!06;o1qC)=s+{TA)pPMOg-ucV0-Ez%mnh>cq+JGNv zOb`)<9#y|ewGvV(`Aii83WX|T<0TIC7ddpO#K55nqhpe?S5GY2OI>yrnm8zh4h$n> zqomSlq>NLpRBOJ`_@tA9hB`%iOOmCFXLIb)hjYp)N7B{XO;9Q`G&D@L8euG()|Pha z8WKEu-`)K7x8KC`U*=OEKan?_x`@f4U3le?iWeY+g>5+qsZpwy8HC!VS~d7y0LDj& z3Q7gcThz+nn9DofaXWkVwegiNew`0|@GT_jS_r)|hXw|*ZHvy%c91SRcD}-$w?D`u ze|dqYpWRVwR^i~fO+Xr9XQ^*&#tWuNrW~4@I+z?U5qhWGG*M8CkR#)h z%je1E3dCY5!oV;%oMUXo@V!E1#la&3oR}Fl+90VWs$21^C>pzpDX49G75vDn0ewgIkYiG2O=;vzV=W z_VL~C-HJA8R;^x#K~nK@luJdj=_VE|TE@;DeLVKa(-<R zYcQ-R5-4e?^=XcXl#5c!06d19Z>oL8^Mn z6_1IreT1dm#FHK$eBW7o>l{%>&K@v zzW-$cU*gyS)e30Tz?an|NIX;_uLjVnwYzc#>ROBM&Sh-t;^_Onz*Ad$|jU9r=4{cTV8mK zf&Sf`dBNLR|Lm&_4vu154zBHx%%t#2C5ls%%uUN&>-qM#f6bz$t0-1IysAe_V(A#Jpl%wEvV{#^&S;7up+_P5vbxv!nZSl@Ga6@wd#;rjtv z8=|OIo3L!btYwGsi|@a{C%>|h-(GeFAO6%w86G&q)bup1ZOt?^wz6f@HoozVA9LHC zHvt{=bRB~i#VJ=kvh`^KBk-b-#%zMLt=YY63k@wzoc-pva@29h^ONs`p>^3li1Pfk+G7syZNX>RTWV^c2VDdi8))*`v|(u?`nf4rYc zDaWDyLr4(^Bu!0?WHU*=__9%HxBCrLko_T`4-c8o2Vx8|WW_>uiRjgbj1yy#*s zx#T|?95Te?Jyb)Ric-j?I_9sN56&ck9%bQ*4%*sN9I<*KOBS`0a;s#L9-E$fi2HB< zBf<&TzxyS2zp|dTtfpExz>|Nuh2<+2aKw?zXzR&x;%O^6^4P^JSk}XEZkTw}Y!)B> zQTqBcr=9v1zWa^u)6mvTXIniw@(@bXw{t(U7tG?WdpGjiD<}B+7apW}&XEW!qFgE> zl)q-iiI+ZmoB5BzJ+gH`U6(4JA>Qq ze4K{NsWdkohj3cSv^G<mojN%};AVpcSJuu;Y;vT7#2Dc5Ua%s~_VJH$Tdfm2Y6{_PrQsGiOc@1BXWV z(EC5ct1s=Qr~61WF|>{-1tl7KdsuPw5%kV$00{ zyqS`!A(?C-3PK{SaoiZCa)o$2$+}}sAeKyW=6P=-+t|i)8@F=ft@qN{*v9h3OL=AE z7K-B)@{Fwaf=OWggayS3;qo4Ab&wrXj2l_BNqPurKySDD+-S7Dj8((^wZ001o zyH_$@u5f5@5G&zw#(Afatc&r?^H1}JHyle_T_dkN^8$N!Y~?`TW`r&hnkrFH!gVv) z%Ar!J5>F(NQX_3a&#W%m+S+m46m#b76@^J==BzH4uxkZ00VU#m-l^bI!SE@SgW9!Kg`II2eArxo7^@wO{?K z3;67`< z$M;hxKfx)-AJ1KP{*ibhLEpZ9EZZdr409LuvgPINoOZ(D{OS6)anc(Vd$(=Igph4W z;l$cly8K3tJK;UtaN9ME4-XLfnzo*9?!V`5-h9Eksd|Erj?>7O1hG_%H=KGbPSWOv z+iqgr(MR*Kk6p}dH(keuC;mctY?NYd7Z8w2#u2iL7nHGtg)J0P*n}bYzK1pj%d&7B zi*zzWGM%BVXBHhjit9@f>qt&N`)$1Z!XCy(N*Lc`YT|yH8eQ(W`)1ax zUdgWQJFx6HS}3B>uz1-#?!W61&Oh%I&VSqL7aNXPeWppIMvebh7a%@yT}=U`ZIg6d zuKUin?>%J@#1BYHA?v%OsYILnRJ%!j&6GA^w8Ton@lQ=7Y6Jb7@>b~iiU<>o_gk0 z%GHq1eD%wWP3L%K{qr2^&r>dfiXw935768kW8-swp|vT+fdhkBR+7Mg?KsSv+sV17 zp3dW&pZV|4|NOiEIhiY9!sxFG@X;ntSfPpLxA+q~IlS8#8n-?LcKCGR^fg#Om1b^cFVWe9ZQxh;iQvJV(r?sG&MHjIxYgJmaA;tvYWk!#(C)B=Xv&- zS9s&u=MkES$zl#Gm11AtFolT-E37g#els8Xzz4YU>fbWdKSa4)LL*5e({y$LgPd1n|G~XXPgmH# ze~h92X_RkMp1zMaoqY^{{_`K{KQut44Xz_9ehQ<*>(Ab>i_B-z4p1c1-d&gR)OPWeh zpm$*t-E-?`>uRFAvxi+TY-8j7H{qxvjafs=tub+;C?Z4=85=EZjF2E|V9U@*oLGWc zvu1I`;fJ$&^=f9#>LFWKM=YMijVEbpY2~P+*D}Aiov!vQtClTd_p94zZEEI?XP(B2 zBbIRV$?IsD-H0z;;_0)w>UY<1-<@~S-rbJY21`h)r2>SSAN}w$9)4him!B(O)ve^x zZ>;B(vrgkp?|2t`4h-QYGX&c3xi5W*a#gZu@ySdSBr1`np)1SY;XP!Uo4MxN+gZ9` zHIF~^JIcj_WU`7xB2N@e5d{G{QWz`*cCAfq1Qx_el(XbFcOv6_WTmr~cz zfNeXtwoP+mJu8;a=aiGyaMtO^GCJ7DuP?hCFBh_C-a?kIn#-|oIE+>67Shz7Mabpc ze$UPP>AD-~?wy0t9wrL0rC@kyfZ2=Y@~y9a(|P{k$A2?EK7nvtLQ{i{OW!MFOvv8t zTaQvx)5l+M>KTNQAdED1*$floQ`~gZZNxJzWSY7OtO%K^uzA-r+;i8>jQ91k`-$h+ zaK|l3N+eU$Xgx|8mIzI)zAmLgNHL>zdZuF-fr)S}n}+%ZT3TC4r!z>Yh(b*mg#=-M z7ldF#ePf31t`-C#JNNHo!?Ujtc?#QD?A)@6Vr87}1+(dzy&Ra$m%j3SN>kIcwbmnu za4eex`-WI~)N+nK`ZR92WfOhd3hdsS;xk|T0sW&Mqf-SE*(^8TemnQv_b~0Pt0L=2{yT1Gd~ld;FTKL^&pySz zz1tWZ>m%OO0Ic9EU;7~g2l{F6>O$)P%Se>67}!6^o6ma_%j(*W*m(E7??}fTROq8Z zA8EM`@oa{Jd-fjHo=CBH!6I^n64J7;>=^go_ZMD%c^f^wOX%#K!*Qn`%Nx%*nWK+d z%V7(bvG?Vz{NmH^iCFPte)9 zmMz=2@Qv^MfOJCxmeQCg!p!^*Z@chKJoo%wKL3>)IPui;>6$f%fuT`iafiu?9KXBj zDnO8_n@yqYquh|Lc`Y=xHgV<|XS4Q*W4YnV-!e4x3fcM)6HP-HVT`~aXP|R(24wJB zcd^!PmQtdlh-#%wK0i&lS|SKMgj6WUMLG^r)!bx0pJRCV5K~hFv^K^WI=G7)|8Nbj zJoO^egVUr_X;vS11Sgz*Dua+LNZ5JKBY#9yB%@oTaVIUbC9Ol9M9)>Umk;|dMVJ31p`iDlD znkcaPu(d4cnFY}V@wkT&GawKoQq(-3K-AitLLh3?nwlaAffRyjrObhY``EU93$MQV zDtq?yF*Y_qu}~zJ&vEe3L0)}jGq1j~nVoyKGc?*q%q^3Q1@!HDiKb+h&gNF0dGt}X zZ+!_nVX)jfEV+yuZn%xUU0bNHOQMZINI_}3%9?d+85z~wefI#zp6~{yrmJ`rjgoP; zZ{Nc!FK;6m>%sFP%9SyMEF!f>X>5YyR<7o>V@^QG2%$>oXq+hYW)MfO9s0~WsDZ$d zLd?L<&FgLH!NEaZd37@zHg075j-8B-jZ-QY@O_Vo$w_wa+{u>BTiCg4CkGDh!Skju zxF5MTS|cR2gPw{ZCJ>&UcZDS8GsdmMM&wVsz=+(=VX0|t$pX>XUODx7lK zDKuo#XN?Sw&T&(j8c}t6Y>I6!ymEpbn_6?m8&1Y(NvRs(`+sEh{NTC*8yoSGh4Q3?}vKIA=*UY0Z1YyYV@CYxy z_!9Tue;>E~`Bv_^?{4mU@ILOm`!4Rg=UyIs=t0&$wVs{3w&3~Wpe7J%oMcR~fB#N) z_w_M*(L#j*(787~>HMiJm!o@fx&f z=DBN3D*3ts2&g^t*cjWlZ|9Lm9^uco-_G6l+{L4hJi?=oKFa;~J;2>}-p|8-d5o7f zy}-!WAwr$QO$5Lg>z{rUZ9#};Vse7vp+UxmCTOVZqFmNI@|UMcq!LI~>qiR%)6-Kd zS+bO#mTu?3_PuX&g^Tb(_HEw8D^EV2Skm3W;VV~>%U3Cv19T{v7|T;Alu0Er5GvA% zG)?u5%Z3fqU+|o11RFp6hP7mYZ+6nS1WNhescMgsodQQ>_${G9(g3gq5dM-H&v9-u3?X zvgU;2(Fuo&l=w;^V;LaE&YcH9L>LobOo%oima5&z&hB24={AbRh%l5ykz{HzhY${# zOgo8WhK8m_ve`72G)#>g;+{X>#Fkf{A?5}sS)*xbV?cz68KA~%^3Og(2(&SbjgPbG zF@PpiX`>kAe{q_9enm=;g4cBwe{de=i^BWl&96}o(tO`n&5QJ>rw4Q_ew&CTb z89y}4^vEOxRU8=sakg&Viy!#7j#CRhg}@JdGIe!yx3qI$$F9`a&=6yTL&)j=gOvC0 z59f4u($L&Yp;Vz-@*vVwD+O#@;wD^d2NJHLl*=)E@F1pIAwM}r)te+?3v}e8jRsje za1b@ke=P-i-S-QOk*~V~DJ7Pruq=zJ?=dnu#@@aA*tTsu+qQ3Ici(QtC&$r5wf=pm z(NTz$Gk{Ow6GQ>kYJdbfI@)OO>cVmpNYRAELi+(yy$1c(SXPba=fsjoRda!U5D|J2 zm0}JHMJic`P!7tmP;r~));89xTg9S zL}k(mi&(-CPr5TKVu{uU+qM`P9cEx~i00-F{J>Bsl<~?n2z(d`l(MjtCW->8IwaHF zNax%hjy>sQPCxq`EF}oSGDeu1lFu-kw9$X_oc#T>3h{ReU}mxc%d)U-3#Dp^A89F^ zn1$;)C`Vx|gBD@Ujthepiog@NDn(mc2bQp?=1Wv76_l)*eA|hklq3v;S|BJi%C-oC zfYG5tq!Mx2P?sf}P9byo9Fz*w$W#)9#IY>0rg`mCTyc&79sI zmMor+P%d7ik_WF>5*M$hkDuH6XFk#zqpKxn-br?O^}*uwQ>r@mf5fW)9`G@0ov8kpIV| z)`m?OjILROQe})qi@W&Hhc9CB!ljtNB|i>c$uK(HPtt`svu6`{wG_=#3MmyMBclK) z5!9M73L+zz&X?)w?IqKYCYKvW37?oPsY@hTID0O$y4p~dAzRl7I7pGjvTTgj=qP$! z*jIVH|hV5zOgq;dj5inJcgSJ(;==AVz3hgtBJ}J~aYE%_qvgGk^bR z3B=#H3_T-%e?wl6qIE5e5=v1h6#&iK-f=EV4qL`}!DnE!MAfr#WA#+aRp!iTW5L26 z3dJ187#!E3>Q&gfm(Mf1cRov2tYmn62<1RfsgR$TW?=sT?!Wsk z9((vt%$62#_IptE7C{$o1LMd$9;i1Q$#BJ{!=$W(N zS;`@{v5=W`1Gq^BhlcRI5F;%tVG;P6`i4fjy4y%3;n-sj$CeSVKK~-uTyYgQUw0k# zjVV5S@yE$zo5<&H3z$7` z1$R936eecT+TBhvlO^zcO4U)`_O`R>ojaRcK1UdYB$FBT?(Jj4vkxzLN*HR^t~nAv3YeZ6XMAXsNACLz58ZP=Ee(x)@)Mun%rj3Xj7A8;DU41am0O#V zHd6|C?KJ-izBGTA8vb28@V`0;{o2(5X)rRvASe{_ELwONZOyZ}{IcJ0>y0-tG1gBu zD@i0YSP}*fZsDjkJ$&S&@1$7p@O^`{ERt!LJ8r+7gZuh9{nW$g@7qCf zY7!}5%a$w#4-IncQOB}+)k+TZzl;}ES#j7(zIEw$dDGc%;wL}&Z_YpWjU0a1@pN}C zXSy(nrDE8YgC#8F-zhr(paB2i694gUUjN5ZfwUCTa+#c(B9Um~J@5Yl?|k3KdH=<8=9C5^v9DDS!JoV^p3?3ZB^EA1lrmAfM zX;5)E_M~H2u;O?CDqe&RYfPcn3coWopP488Yb;QEPVsmC@9&hLrX@87kF5E!>D)B2 zcqc+;`OmL@n?1Ys@sanxpZUGBsO0iY4DBN_JNf8G-bALMk+Ja{AZc!DV$YskTz2`- zS+b~&HypQya(;@!^bo0pL#5&odJ)A!1+6VEdi%RU#F^FG#!*MF<<8sh;C=6YFE76M zGC%v-&-wjz*U;YG1LP=|%S1w8l$ohHgfn@~zy25@{-$82X1a#8R=JQ0OSw!>`$g|%<>6;? zps$a(9b@mVgFN==^9&uzam!72aPdbz#pgc#Uwrf1zo%LmC0EE18VhCHGo_$tCfzd_ zqig-~*G-{({g%I`2(R(;lmw+TQfZ6I<)-9O0K_(4`I z?Zh$_B0mCQad2>m1xuIm=C_^CmRFwP+TUHlo*g^+$VWfT6~DcOM7ojx`sUX;^Zc{; z;+KC#Jl0HZI#0Fa;n+4x0ixCd|667M=V6clDPOCLVOauYNsJM-{s{2JuYQk{&pemS z`}Z^E!~T&1TelxzVsMJm=or1-9enKK_b@q`r&x(VNrDJEI-0ogrW<%_)2rK79d*pN zEBP`eG_Q*|@7up6-Ppp8jZdw6;SWFFaMK^J=e)PPokyS8&c6NA6iZdwJ6n(nzVnUm zuw(l^7A-ykCy}63nPPanpRau73%u>TQ+Vr}FQ9MlR%Xv?W%HIN07%4ASaz)o_*%Nh z{}T-T)dJ|5a=NU6MKF{r6{WwsX>n$1pxM#hE9yal-LSxcZNeb7(Nd`lr@o zC%bv(ne7CjCX5V;M4b9;f**YUzj^Vw=Q!!q3(3^AFf=~S(C}W~a{h^Y?z0~uKT+k3 z)7Eg{;1+DVg(xgxSq3*IYJ;h$6?~+ujfL@jzgEvc)JEmhu6wOat^}5p1YShGR739e zb}!(P&wQ36PdbAqU+!Z|{{+(&$w>bMg`siE{rw!;^(4Rk&F6XR+uy?G?fX%dgEG+E z(u_0#C!cdJndQsZop{FS8>hy`|4t#L6q54v6pPm$_ng(W=vQC);wPAz9AfU=R@yr= zB-3$*M#iw*7+?ANmsq@F7CUxqV1M5Z#zv=k&pSR!Q?`Yb%hzzQ{{Xk$eHXvK_If_} z;jhrxynw2&$QMfF3njuRLRtcd5NM<@HIW)AG(rl(D4 zBo|)vcE+ZrShYC8r$6@|zHsSRxa_B&p;XQDj(1#yAjdJstss+jF(zVSY7);2`RbRy z#v9&n7LPuBGfzDEB>7^I*3Q|?p0|R&z2jW)mNPhTa0_?e_X0n?{5NQ0;Rg|gLWx4D zOr>0zp`9@^1*Jv}uZ_sjGX_u-1Qo)dN}-S^Un%NeTrpE~mRlQvF| zOkx6!_M_KDT=?zZV~i%5ZKO0k9l!a~_r3Iicf5VkRo7n63!4VmwQHQ=kpe;rx@Ofh z{HH(qDbH`*!P=uvCY4C?=)>2tVDVx6>E`Rm)>({=kI~-R%yZ9f;QjA<2g$giy)DbZ zgZn9!^JpFXuh!6Y5_ocNe}4L5$7RCWj} z*2&p#{5khN{3^?q&*SI6_#?e@k7UF1+d0@jfQ~d>9UY_+39k6{l{|Rgy`(GtPJ)%a$&nXLc+1-g_Inwr^*AY>;@&#h4mV_FsKg zEI*P@ed2Spw$0|hzyBScefCa%_VYV9@`RJP{P(xB@%f!d&rldSz+nF~eDHl2a_RTJ z#OP#>V!6hH6ei@b<@31nmb-ZO``>Z!od5Xjy!NhHK`}S|5AI03^M^OSo|@ISwzF%~ z#+48M?2Au->#JW+eC3v9RJ3=r6Hg?#{<<4^@V*Br7bj@zn8!Qb z`7SzVwNVZVpbWzb%mJudt4|M1v750Ofw5Xz>IA7tI? z?(rtAO6&K;XM@eL;dJ`-b8 z2qnqXWk{s!X>IG^uw|>b`Nmt>{PL?j|H6wH730bEFYu%9f1N#hH}c0Do@Qvg%9X$Q z1AW_H!B$gz{tF-CKR)>p`bWl@&R0pq;z$v&Y{^`nTK^ofHc`b#-kdl35a&1S{7Z#+oD7aO3qi@{V_&$GhKpIM?3rDj$5uNqp>+ zpXY<0xP%>h_tH?`$X_0KgoXgGKv2Jw%SCTJmm^lL;+kuI&e6x5!m5>L@b-7Vk68;A zGcrEL=wzP$L!(%p$L0-Ba^T>7WRsm-eDR0*_@_UBaxHf6KZtFoSh}c}{e1(Rcg7hE z9@xx}e{eR<4Ti6L^fYVeYu|1rGL)qLf22oua$Dn*;mz^0OcR4?DI!#A&Czle)S#Zoc(emMlGv4}RnW zL`qZNkYQ+G5Z|wG+Nq~<=BdYW*z%=Zchjxh_rU$^-Lsps&OQ^%jbW5awW4vIG>7&b zS$X{B49X^v+wrQ|ljN)vASD^0^PQcHL@r?B0*YrLHbR z+znZ}pqo4Yd@JvI=i6y%Yk%flpZx4G6+a~Os(-CC{mn<}D4-@GI`kOnKfvnK&Uta& zyFYu#KPDu_w6u?)#{3Y~|p=XUXOE@{^x^ zjbC1U8QpW{^UQNw$(JPYc#6gbo0Usix$>7k=3Vc6JIj}}@$L`4dD{0U2}=WrXc7@l z{G(j(qwD^$2CWp$?Om+D<+{~dZ@=P(_r2?b^Dh0bOKE8C=9Qh}?AUdPe69$>kj=!% zq>_w{PO^LFUUu!?#fw{CVY-lG&YZbOBPdMg86O*G!IC8`KYT5Ps#oj$sRWfmiTu7C1!S6oe{RHe1Kg>tow=T~TGNU`qdRlNIy=W+arYnYtKGdMJk z>%>^Npqs*U#23GK2{&H*OIEMy;6FZmEMc{epj^Vxz%Q=Yz=ao{$TzV9 z8?N2O`#y9TpS|QXj$9STjV0KyVIS9BzkzqX|I>W#%ilvfF`nJf$E#cSQuPDs8&Whj zrWqX>VaK*z?AW%GUAqo2Hc~`~5Kks)Xl!KpVTUm^bcmth1H9=i7hpLqcinY2zVCDH zx#uxHF-5r?P%c-=O&6FPFHjecGd{GN14FN3$poPem^;6h_kHLh&N%BdG=jbZ15_#j zsbq?#h9tdRNs5JjzWU{_an~L9@cm0Kq-Rc?`!Y$B{rPl_r^V5K^*#|3O}P z^<@t9A7FfJ1g}&}tNpBZE&2qW-9AFyc1W@v75Xl_k1cg}p4EM3Op<%@`C zlZ;JHB9NpKNwOJ>&ejxyGI!m2BVYOAH>m_={`A`q@XmLwg(%CXHy6%n4T_BF8ee!x3Xwq4}Q7KJ$K*9O*j34J=@lE{861;@TRp0 zGs)nsU*&?g9?mzuc`Szp_R!R_l*b+oc=x-1%BMeZ3`eeUn4TJ< z>KUe|e2{5g**3_=7Y@5gXeez&ZttZn;f`+~#N8P6-@#$$AKbkWn<$k6Z@x7~6r_uq9ZLxWp5YiMcjL#kt~FFY>PU9M5Myvx1@FT{Jb#=ivS%ANs(rdGni=bJUS3#zqg| z#!}>R0fz?1Xl&}jkmluA``EhUAW@W|wQU*4op1qbjy{Q|=3b1j7@ry=pReFo13WJv z(i-0jYDFL=FhocrK?g*piisjD+re>TwdrQkMp`yT3bgT2qBc-6nTpfV-a;zjuzSZ# zJofP2Jpb(D9O&DH?-y9PvXggQbR@?gKbIgZ5`_guM@RVOwa+pYJMo;l*17lSu>8-D z_>50~>Hky!ghWd>UfT1-_O-2(vyMKZhw-T~w(Z)_?wz9yjcDA&ES4X3606poOz-^V zG&FXhEVo8ER5np$C>4tMzCQzjt~H9#hA1*KbBJf=3AqZ}mN-s~csx!#=HR*(6BDCs z+q#(-H$1_!Pu));x0hp&n#EafTtzw&v1|LQjE;^IPbO*aXeFMA(ceEr;2Yw}7)H8W zcG>g1?QO^NpI=+f@W^JenRZOn!-wAcM~*vT32!{3p1nIaVG9Q%U8=sJRDw{uII%Qd zs5vw^$Eii5zV8!{B~eP^I4&_ahV42eQZ_^tO64iWh7YiN`>Q zaP2s@Eou!DBt}?R(wQ007S)s>itznB#ljSWhXxrubdaH;{R|K7CztCdnJjX`F-th+ z$b}S&!|dI?lR|EqL_9|C>`vO+n^DSUWO$OH!EuBH=|V(?Utazq=fCL~F8%fz#ztSj zRVk8*#k~6+*RgEnd_Mh|RcwA~J=Jmv-wUu*453`6^8xvMM4(-al^~hQ5_nY(>>J?V zz!)PFd5R?qWwp}K*iFx@CA4?UBb9ETzOjY&j#;EK^#}}M5K{F+8k<{bZmwf=WRk(b zgXE?s7#SI6baaG+`}Z(3u%CQ>klfS=+RM@1mEibeR&dnX*>tu#D3eF$CrBhEc4HjR zf^=Os`}a=pi{IQuA$7u!>*pNz1s!={^gln|(?0Z(f2jbWQ4RjUOMOSpu4L!Wbt4@*R(({bj{>tykgHryBt9Nf>oef#i3XlkmXsWHpExgFFu#;KHx zM1e(r{}}nH0!m4QEzmN><(Iw4X=fbCx4(Zh(_=3pv8Zoa&HLVc3)#8^KmFNR9N6~? zzF)=nDim@#f&eBbJSN7gC@TwAyar7ZA(o{v2qI%KHC17Fq`=g)&r~j?;%TZ?O&B@Y zu?$*U=txubd^B+``RvyzRRX^MgKtwQ)pdB2bpX^Ga08K3>@{F;--3Y?>ex7%dPI9M?t)fnNy-BaM(Y zLfBZgi|r(kR+3UBVq#*7Qn`XaVkB6xR$4mOvTNTIQxp4`+Xc-jhg3?Eh&!Y+X&lF3 zB9EXlNl?iVj|sAk7RrH4Hce%!N-!;GojaGZ6OhPc*!s!=esRUaxZS55SKrk3R1}o{ z&%>`}0snQ`zf=HW#Tb6|!P}Rocb$Lw8+sTU*;6~nl1ngR$hM}S&Y*0d?ALy1%uv-4 zS_%|377#NuY1gr^grvq&mMA+$XaqWnP)ag6mFHmpFqJ|LtZ7t4CR;~qO9ypzX%Yzw zuR6`t^aP=f=$$i%p5C6?>|Qjv=_w}1CYhSZQ>lgs6(^7>e)iMnIODV<_~B2EXJUL4 zN@%)!PvEOxe1s>T?BmXRK1hCYGu3JpduIB0q&1GRkda|*bdub3iF~fY$k-G@C>onu zuq?YaDmOHg%N2siLrRB4vJTgcAuWYvxfmUwWkAtSQ1BLjvy^Onilo|z6^#*vHIPQA zef%KA5zv^4Gd(ea5Sqh}IRYo`psX0W>Jo-A%GxKC6_SZM?!I#acRV_>v2D@G>y(Hv zI{cTt2PrMV|0&9#Y)Ptf{_CRwfeRLfN&FQQy5QOHeEt(2&GWxT3KCY5H+{4Q3mUcehpTEqN> zo%ms%@reNr4ep@qjWT;~2dA8JG7AuFLUQM;>M~- znJ1nINTniLo8xq}){)IPC{ZB{r>K-`C}qDoOcYKK1=A#x4S1C%#zqyTvSBJej8`5- znKG%kp}RfB?Ai6qp4&!ecOy-$S>iDVBF({F`xzaWB#aDN1lX>iQZ2J*|0p8SdZko~ zNQbW@EdMW&L1~PCC4TM@v1IC{v2yA=&%eBnhUQj!I-6Lqw3B1cI*eIM8%d`GerbxS z!Wg0S&{RQtsK|%VM;MKzEL_JTo^(jnrO7mANYuqi*VU$wX0wuX8Wt^T<(Oj@vSLL$ zbLJ-K=(cHVx9Oc*$Lh87IPLT!IrWSaS-N}$1}Nkwu?TUj5M?SDU44C^Jf^lDMpP9N zMO{-0Kdcai6@;-Ma*4&#n8=``3Q~sHGD4{c*9FJcXcJNP0s?J7S}0r5+S$UqMYEVQ zrh{44P*0fDE`q*}cIgojD}{LhDJq4M}qF|IlsAim=cKvRN0`fj}FyRx`tvYm#skb?GEA*T!~ij8YW*kfP@k=!jG%PD@)8 z9bL`z^fb}YT~BL!9qsM)w6*CigDVRr!s49CuP5kPzoJEA{L_|8>d>H{z#!x zq*N{aTOvav`BxHQQz@6zQu!CmTR4Z9U4uEg}bivyJxdR@&MdX=+K+(2}O1IYUEJhUV6KTH70G zZf&Nisg-mhi_n^CsYtcr6ZjBD21FU9D%dKhaT9|AVdNn!iLeaW#s-?&W|7QxQLISH z)d0(~QOaOhASLJ^q^&iL<3g#d5thafpkx4{hcG_23P>a*iKLBDV5EiZ#;|P%pV`~$2jalmIveY$X$YgCSM^Moj+{9`KQ=rRWVEgtmd-k>xss;GU z!WTZF9};*PFN(mjFbG1eiPgKb&9B2G%7m1WMiKa$c+zF=ylzBTYz+#7=*sB7B{Eju zz`vBHHc;V`mW*y(y0`;NmTHt|X%Tbcq*7Uw6T>r_$beKR7gmXh%%8WA}AyAiCL0t(k1RXD96U2(AvR>IH7TgjDxge$e4@eSh#T) zI~HME5xIiIV+o1GB7#blYPCWpm7%__m%ltV$(B7`cVEY%Iqi zj4I@dV}!a?V`1qU4J`}<+8gS~y3)6`hfDZxi3|#({5w*dICNHfgJM=&3@L&deM3Yw z9-A#tQX@@`8z}915RKTeMw01zqy>JM!`IV9I**BRC|$%v6#^X+Xj9vkB0~(-+Pasp zgzx9^syTvS8f|hIT|!VsP{g%LC_ID+K$LM}A@df@A=EAW;J;tyQy+hV-(T}8+qO;- zh7q%8w@{ZA6w4l%nT=Y)5Tfbo&ftYM=fCAje)P>pn9618Sg?wQrVe~vB{a3&gP00R zR#2jf5&;-p+bp7O!pKI*1h$4Xk0M5L37q6=!oVSyo38CLFcQZ} zacHQ@`X@ssORF&Pxv02>6OSMY349+T6h?rwCCYJUki-$l8YeNRMrbV%>NWE1zbCSi z8{}U}X|kV6VTg{_7N<99=^W1gsi~QyB?QGjM2{Mgs z*+@c!s-mnSu~-S)F5+5MEKx;LMTjDX9ATIv@bef`B?t>>Q^B$#q(g0KLs+V9A(0_O zdFtyG-8~EV!|(f9bJU->@|Hf<9kYVZeda8_`sH)D)3>k0a~oX>-U=e8 ziKS$yBch%}a4KeGePCyYF#Qj8Z06a!-$=@Mf9TOyg6)$@Oe)*+Ta zH`J$))@!3xYn1L#M}#Ioh>*Bzhysr-uWo0@_5-~1d>?xf3H2GXo(CXv!cx zY~^9gB1)7XDkF_wTlE(DgrScPJ-`R4F;bz8O%NIa-y@7b2NA8!S?U_PdHZ`Gpm8`bwU?`B_yF5B?j1Ww<@1uPE zJx5{se#W^cF6Escyq*iry&l7SI=WX7X^GK3LYo;jwZ_a~|1BkOtXk*OwjwM7rp87Y z7>#g~YiVpaf@036QmxGnloG0y5`-S}dfP}?1}`76`4x|`=>?Ejh_D=Daf|&2N4W37 zEgTxK+4y`v&u-j;vSSD#NG8)9I55D@UBkrcdTuuHI!x@}6B$pn^RFb8?ZioT9PHaS zg&{#Aovb0+wS#Nb;aDl8aS_@=2#;mUS~&I81)O>2LN2;+6~~{@gOJl`Qw0s7XVAVu zN3|INIt&p)*V@I7h2uI{wnC^HJ4Of#9ZCYfT7#6U+CG7n_7*;T$s^qR;0X8J@(Dii z!Bz&gKF70ntmn|yF?zceaO{akvhMhm^vvr-*jA0eY9fU8YAbPdgp>hwbvA7+8FEu& zT=Ub*dH%K=xbyCd`Q1;>;kLVXuwe1!?AzZ=d-qBL9Y;qYkuG6`N2oQSHbh3EwZP~Q z9s1Vr)E|!VvlON(=+GhZ!S^GCuoxQ~{bprO7CM@dXj#-1TD3S4ZJ1}&%-M{%r4+FE>C8mqV}hoFLz zwPgpEZ6lRJDyufR!f2EfxVB9qkwnVcK3!!CV(}PJr12^x1Odv{;7YpZ&f=H9+Rh(u z+|Q4{dl4s}EIGJi3p>{LG0|7zh$Gf9Ye_pMS)k;PQSwUIv51Cx2ch-MJc3|`lqU!R zNVO(7;-V9I>jzF_|K69l@5h(%{!30~%M+hqc%sPJZ@v+jPhEXGAs#_AO&E9x6QH#~ zn;1eRaV?kPbb+bK0tG*VNG>LoT0kjZq*BTwv8i}fBCW~RHL`cl0XA-YnRCuLmU*+| z6eq^nxvj|HSPNCzOCV}Jg(wmr6oED*lPM4(vAD$x&u!w>9c9wpC%i|CWI_9&L+jrX zDRjuc5`r?xL{i7w)_v@%8(-#;$9K@!)PPi8EqK#WZ8e*;3AG|Lf=Gvy%Xtcg96>ci zX$wUR+ezTYCDPJFGijrcHPS@jhxkD>vs78nOthBRQlON}Fs`KL>UUvhIYVaat7P-Vmj*mT4GW!EprXw2h`pgs!DQ-aX%=C1gAczP}Z3`JQvk@#yv3=_{7B6h&$KU@CRxa*hpnr_f zi8!T7JHo1C?wl?RdHN6TAQQJ(v2-?>jLo*KdwKZLeOL|0oovOj>t%Hi6-=Ol$$v}a zznLu%=?dAFxsQjbquzP-ty>tMHZ(Og)D|0?GEzloY4Ekdj|72ML`YByJ02qzOA~Wa zIF>!LGglIX0YT^y>Dtf-FEV&xFf&|oW<-ntrA%$HvJ}MK1TiPUXTSV7&8aNc{N^kw zx!qLqIlMr#@`S@l&Q35|9z@FkIWxU02z-E0zL8_0O#t}VQsc;w$;mOQen`&C zV4S5i)i1*<`jm6iNMp^ck5z<0KoA8eC&t`4bI?Ja#?~0?)-I!5%2UW0AWf-UVcxt} z-gxRN)*jK#*=Mg|&fE;sxjgsW^E|Ka3U{VjS3fGOHiEE)(6s&AB9*T4Z%I@_c$2jD zth#Z^dCyBc`q&;`-ZW0J zkRqMvLTZ~Z^f5-GjXNGNhAfTm?#6tbcqbCm-L!DW^2C|G;((K1N79 z5i(gC2U(@AK0zvxK>G%PMSeO!3Q1jkiZJvLD2%LaK}W%?-a1P83PHIxi%6m=SMyXt zk61cO)ej-AIsZ)ydFX*{gw+NDo#yJ_J<5SYC6ehFeo&-P8V3^+g#tr@c%lx^I7Ct+ zZEI#eLX9)6l!a?q*h(-wHqG9BC9b*l5uSZ!D{WmpG&RSFiwRtj15=_{8l+G>gjXFw z3E01Pglfg&$KSh*3r;-l^Y>o)qpi~;+uNHP6t2h-llgxs(sNq)ccf}JV>ixcx)il+ zczWZvT&I&4UL0fppawfjUYgSZccC=MQAfm>)0U%9tdOi*$YsA8;pyipG&Q#pg?U0#MQVcx6htn5qzEkw z$92hM>yQ>ip@%XW+ZI^1A(=?=T%-@ zBvQ@9Q*GGsc19)@x7@jrP20vuWSVOOjeLPHwOP5L)@17Hd4A(Q9(r&aEgiGi-#>ICJ07xT}831(b^(r+a%&Hi9{R|K`x&|DjVC4Q4I`{wy@mSFp0I<{n|jNHHo-` zlQ8(EhN97tg|b}&5pd~$-NEL~RYaKk*F}i-Lv$z! z1A&Q(jE@acsT4@0(=@fTlC4kG7RpPo1rTa9ib|xIELcQN1G5*kv38B2vF=4ow7a&3 zR|p(i;JQw2`lyi9H>6Rvpl|OU!b-#yzxg4jp0IM!oqzcGrAk^zVf{-$fRvHXzmk}3 z5tMQ~c;l7Vp1gK(`!9a-Bhv8(suhLr8KNM>=rTrxSgs-n%gpX=W6ipG=x~VqL_gJ1 zj%u}t7gPwsh$sL*fMO{i3=OeFvNjAV3K6DC5KRySqa;(B?b`w#ybnlr;8-4C`tm$h zuL-Hk#<};N16=o~ZDdm!Y!woZNo;8mg_>$LL?Uq=8;nojM?|5VStPA%+sCC-8&;tL z>{xB4PHm>IqExQX(b3AjLm58y@kbzNWbR=rIq|HsAlAsIKY2aPjY-Zua}m=M{b;R` z${`dE6+a-R%6Ns%?A!l1W7GXeOVZKt|Fw4B(RP$o8~@Ea_4M0IZcpzJ2rWP$K!8vK zDoq4Mst8sPMFS|P2x0*R=|!+0NbfC_Py*>8JvYhC?d9|`{rh81B7PK2WY&7ty=&c^ zlR0Phyzid9pZz?|w6wNSKdOQH`bO$&TZqSNK-N*Cg1z^z;KXAU#q09Ds` z{rM-Zo8D42=k}X_kEDhvlzcoC98Vw#1=BKd92-?p@qG_nH#z!<$$atTeV8_-lIpmP zA&U4;3g77`q^6nB9^=cW%x30Zqc977D3XJ!fh4TpcPz5WZsr^@mep%Ay!gmAX3U<+ zk@IFyH=&s)p6KK1A9pjhV;a$@!1GGDu7g!_kbHrm>PQ3}#B|ERHdRz%fG6WRloL%E z#|aD?W!WW{vT$7=%XKN0YzkSI-~4tSh3p829sFxvczPpmy|j%ZXZ@7L?+x>R&*!UPpI_P?SLBOYtb*wl=;~!uK<1s*5UvrfbNG#z4;?d(YU91NYg7 zEgM%IP+40+G#>g)2w&6rEa(+gtX;8mhR6^7=$7C9n(FF0y0#6_(9(gVN7&jmK%^pp zY{*FE3K+OpRvOD5VA7-n#~d?>k*8{f0>Jr`f{7#SL5=Kdj0J)?tDzIX=@-m;XHE7JV-s`vQjH{Rkq-#(GE&)J7m zY7o!%vGNvHArHQTf`{*z_`b)`aDiAnL^vw296RVQ;NbWL94AM0RSeIT$mR?9$hbBj zWcvGiX=`KYx^HEX12{U&ucDI&9gx9^Z42B_BhRh*w0YZ?2`P zGD2<0rmbRtn%Giso*|w53x&dCDB@K@p*M(EE@J%D4>{_H9%fBlLbdcHn!SXOH;gV^ zgd)&{gsR9$ijVJ?aNHt7NUUGK9bK(pO#4(!%cWE@A*8YAo->hL`ve6SRq{R)()=s# z`c%T8tZ0~Ksp@em4lQcxihvQH!&BT+e( z>#tkQbI-m(ywanmSLQ3{9Lf9>>*(!Sk0E=6brm6k`a*wifxhknxsr<>uj4m2EvLDo zn)~lNnL>6oo|8e64Uh$qNG+*kj2o_hgfE_UDEsbLM|z|iNpgdZp6yaqoxsp5*t*3+ zHFR3XRZz@!Gc=gSv?cPn6zNo!Ov(f=ge=9#W=&iNLQxGx7eP%$mI;SqghCM%-5?wd z5svuiY97@eLG{eQwcHc8xF{_}ccEf8`&4vjAPF z3=Wj&9Uj7$G$LVxXP>#9l}jJukOQiiHl+fE9Jc9@PUjdJ$upA7Qz(_NeHT?#2#0h+ zxcAxRQg9|KiMw z%IXhn%lwS#;P3tMQ`q1F&zICyi(XoL?kRIeUwYBk80t$>DEjmcCQ0TTB9SN+35^Zw z7V*N<_mUo7LuG}EB*}QbKvm;JV|BzT>M=qwR5gs{+7t^zSfyd?QX1FF;JPVfQ6w7j zh=c>_Bw5mNU5TEqA%>DA64f1yopc~I4HHq61d5^{gb$udK3^i49w40>CY$b~lp7(N zPSV}ohwDoeiVp9u=;p_l9l=ko+?#=c#bCQAB7`q%xROj&#Uy@k#bYdAk!H&D@kp}G zgmI%tC%aJOJd!ApFBCB?3)7UruS3?VQPfIm>sy&Rb$>ip;pLZJqkmwS0}niqapT94 z$_z3xu$7VF?c}lpI93u#$|8gbo{Lkm$rOs1j*n0hgd!E_dL+<>_KJAU2&Oqgb*;g^ z`%ESh)p_#Cw^+a4;%C?1%bxolM`|F2<2&H{)YR4T=Id{A@%OG^@_w_Audb28Ih*PM{|^eq19r|K>(k zEnmzfmwXG$^$CR&gu@9GErgGZWe48AnxWwP7I+r6nWvafl1UFTGSW{zGl*lRa9tZo z2tZ-^lJ#uZw279s7G~}@n?3g2k13P)B$_Ztr5#3wb2z3|HiU2jNAr9hvy`Q;uZO3e ze4L)HPBw2|!FlKH!Btlrz|g>ABo9b%W7}FuC9}w?hG{wEaz#{CK?n&=)w$-XAJWk=np^&O z3tP7)1BGwNMaTlzb;;)QNV0;ase$mLB;$F3procK2qB|t2C5Lj^EnnsGQK2}O%Jej z^9DY6{~fmX^bm{2X=!a|#$Nj{bFY0+6~TvVJ1Lqbs;1G@)P(1H+<*W5^!N2~#Nh|A z;3t=H=q!al-ZYoNfknv3cm%~GL4^9o>0JD+zcZK~%fpZSlXu_U$Tz-m9w(i63_n?L z85=sY42-1leMltYG&RQQ>>S{kCm(0Sy0uhQhM9NtTn;&GHtDR%V1EkN^YJ7P*Y|N9 z4+$AX1QKyVQg$Y~JAxe{V_Ja>uBK~9l0qhv!uMT9HB@rZd0*j!_nzbIvyMl|F3Xl~ z#qk@cY8{WNE2uIk3S^VRq_XBqb*v~}4t`2L`{7gET zFXoG`S;+aNe8DnHx$#zZs8vyNG&k4q@+)s~>M3V&`{3J9Ey*o2F(xGwFAjW zHy|;(u1m?Z@w}j&?0X(UmO&ACZV(`vrelOPViALwp&&~h-F@9GUAmNa-+qTJTeso) z5{DgjIA1>FOk_nN9EN4fH}dP7ZpLxo#1p;+h6PbI|vD|&npYUZUnef5;t9k9!SJ=LN zD=m$6oN)X+_MSNntLV_%-ye`YBn2S_qhpTm1+6E~$F@Bz+u7M=^Zh_sbcaTu>v%ie zR!Sus+p;Ly7NgtR_{kODW%Ih%xa6Xv*|Kd7x8D9D6&-UgZJK=0Khnd45kqzrU6<5I z$jDVzHFmm^5=hj2*5KFa-@oTGtW5+89_iE|`AiCYA1j}ukjqk0UoXA;%HNkxXv**L zoo{}DA76C`O|AR!#@lb=T97Z4@EkuVVn}x2)9Xn%p1)Hzc8B^m1iwpxi!6>8dV=+c5dd`=U-&jL35a~&q2t< z+1j~*tFJzv>lPfq1z#J(K+gwwo`#8prs(+iw2Yq4b-!51i?0=V;_25Z6g(PgD;Ve> zWY0bJV&>laaqb1@@%WREVVgEH_u7{u=FVmEln%_I#qhvzpztmcG@y3)B>4hglFEis zGL9qRc!5_k!V63uyue~cF1xAvlE8Lc9NR-t6l{Fz>+1Q<^*`s$m+xf3Pv$c`+{^6` zE+33F&F;`6v3$N5LQ_M845zHh8p10ZQ+(#+->KiZ`{Yxn9ThtEdlwwRZ-4&?FTK{qGfyw1WBe4d`8=8&3O_r20Qpl+C!oUOxs+W^{x$n}+pTx;@=Gre3K?8^(AfsZeHw2Ym?l|Oii*B2_h@&2-ps@db(4&S`^64tC) z%>@@+$mwUE@vn1ob_%TFmmOK99p^9k|5Dlb|2Bdic#<2ahI$f`|Nr#D%c80_K9VA# z%kZzk|HSWqcOlD`FXxYc{xDhFarkIWm?;kpPp&~XA_!c3bP&o%6w7xv06YiD zHz{N@ADB&8u7znAuxy8_ zng+&=8&7IvfSTG$G(F0qx0cbPP1^7~uXaMjO#PAF_(7A-8xA(2QhJTgErmtn&A3H0^!<2WACSQOi~gG5i- z(O!0g+(!}M`{Z+3EYn1mRYFD>Eo7kSAyiF8RfE|F$@6e*2ha0&nrq3bg3wfitfA>) zY|r8^f4-Ua`W%;DdNj|!_zJf@*qLmb`lT_d;wSOUpn5BZk(C%ijpCPmiTGc(098OP z*-L+S7nW%TbS@!-9O1*I&%JQTX^FX~oX|lsnc^=Gt>(FBH?rp*<0)AMY{$d%6&x#g zs*r_?V-+dc7Lu=`$~wrw5-CJLs&rhNLM|5wMJo!P>*KpFs;r=e-vF|y8?=?p=l9%`}@h~d%5(RCv(!t zd+^M&FY>2{wkMk=e_@O&yGh>*ta^OUMiL5YxEe``1P-mAH683&MLr3xUBb0ZhI%{M zzGW?@nJxX-qTIC$u6t7Tw#28AxUs%;XqMTMT9`3YO1aGp2C(!FzM?o@1Faa~wy_-h+;oI);XZNaivO z<#P;YGNdvEa`_^*Ws%FI=G@iN2ZXaf1samNMVnu zW0*R&p2@9oCbUG^b3zMd&ZVb!2t^4|EV>|M5sQSRkggFjG(v_>I2^;!HDot~u!oSH zk|MKz?YLr#)Klj2pCmM6lIb$5zOore8ZW#+->E?`6 z_DAwcJoVB_R`r!W@@^kBjs5rEcN~U*FCDcPEj0#iCW*jDOH}aAif*1?*7Y%`jgOkr ziLyZVj=w3Y1d2?dBq6YQ@UAmC>G%o;2Ua1=Dndwjl7#0+X=t9rU;et1ub%Tb)+e}l zc%NYZp%wJ~e&v6Qj{=(q?UBqPRai#M@o!_dz2+wofOQ|zR6*eSTc_)&3AJaQ(w zTSRhABqc=NRCw-{w>bXf{rJJe2bLitTF#abP5q-i6;5s^= z3=P-OQMFoRr4ooCN%1mbC~^f5C!H?hxGt{kp{XA6n2c@t*pAPnF^%liR>91PjqE$6 zjeRG#F>^{gGbXh&eOwDu$F?zfbURZ(rlsbN%A6*ZMnDk=@)6*{rFMl5QONJNRn;>06S3>9P_jF5_?Dmb13 zzKSeq2uVYT2&i$AsRA;v*Z4LLm_C|)r#3Tl!f2+BZf1OQ4dYvDnb_XQ#I{jPXl-O_ zM=f=AQA%bO86VG+C^}HIeVUpY7+V*mu_{7+Rf5`z1l5%>Dl4MI6A9wc81Yz`Xe>-L zs*{N7RK*SIqY8J52WC^QT|#m!1mKFmg zu1C@F$rmk_E?LTgE9daNpBzQ+`nQmL4^>t0`~;p~O?~S)e){7FxbM!lnSb1oC^+Dm zc%BrDd->oC2}Ic!(GTV!eW!?L7g5WpyCVsFUq)8LxROlCa&SB!&ksJk?fbaCgyi~2 zu3aX-24)e8qM&Iqie#ht4w`U~gg`S4l6j9;-dfC8&pn2(pLZw^{{0dD_H6#j>c+i( zF8SuC>Hz-d6~HaBTks0Fj;Y~-AseWgfoXY^EH7}W65x~yxTPGFGEhk37n69!5xi0o ziX+J85Q;T`R2o2clZ5;Xs+B@^&A@^V0ltGQxoEgVgh|LR5S1!_J#Sd)bJs;0Daf&H~l_4rD zDpZR~&7#WiXpHzYMQxfYTw1GSS}FuB6@pO-L0!b9QZ)(74zlDSgus^qH?qJ(NFd8T zzF(kNEKn+xRHrzCT^PhJ4DA-AORxCDZmj_EiW;7H_`bU;9;3QDy8`4^{?{I zn*$s-Zyz)YxMm=gO4;TS-^B~)H#;q4Ao!r7OwscFAWQZLo?(ULBFd|UR5qma2)N!# z*`&=6p5}LUF+DsS1O?kCRrJVuDza*@;lmGUs`0q^;yLU&a}@OrqtUc_wrm;VnyYSQ z&5ADO9K0VmX26E>eSFVHF5mTz=alCkl%38euH=Z0X*{lcR;>+Ab-_x+D?%RL*esjeM= zwU8`!_mF<`yL)!)g%y=my!iY}bKiOG-WMLY?R07zJbrfd(=2*pgk$IJh3w|=tw5f| z^8-p_StqJI)fz1AvgD!4LH%FygNYr_-(j20kD+!VeNlA8988Sd?wFgR5P3^e&U~eAoMzcVgLc zPLe=XH1NQ4J&dr*NZ#eeg)2Dk(xW){f`hpCp-1`Ijmxh|RJ2~L$j)vDfG~6Y><+TS zTWM~na9mqwOV0?Jp%RU#M4~>L;-g3^vZ5gr6-7~y6)AuS%AJY;RgzGopyVqgIUq3# zfh^0YvV^KCD4HHfs%l0V5i~7?tmz0v16jcnGM=miEK4CH(2#uvMe>On5^)2<6bT8F z$>S$5b>eiKVlA83r0Cu}%!IZUjy!ljLXyC>@@O(BBJlB*R1y4?1+pTeE5Xo;uSm$M zg06&6Wdl_S1;etsfvV}Knuez9XoiYr=xC~es^}<+imDpOY6w|1ko6FX7Dm;gsA>dN zHPE#XiYg-%fh2>hYS@mz7iCL&Y|<$S$&FH5ogf~K?lz=f{QSCIjvC+hi9{ldjAZBB zecNwe`QhaUaO4p!{Q2&edG_%Q?7!b$Xo`VpI=D{26%^%XH3>Nw&z1ubg}}qW!*jv) z2r7L7T-V0kVa4it2uVW7QecT9g4((yiSlSu;Ms|ADHUwYqJ`(#NU{fV!2kDL2chZ6 zl8*1nsIrWv3WV_R92?2^kcEdN`3NbfI9gsH6K6X?uU%7Q1U@c4Mks_TbR65kw*5dT zVn<@@gCtxe5qJd2vW$?V;BO)*VEJXg;CwcZ>$nI>2H!`PK~{nlMfhMAO(GSQZ0$+2 zWYq>P|KX8*^{e}G?F~=!#Iu7}9(LINKQH8SyT1k8aMO*u6#&&W^}PA!>vLaw?(P?U zfBl(^8w1PU-^6`)FD9LF2}i1N9D(agfkxgALup^awJlu7LK0q3Ko@d(p%nO@9Q<3~ z!S!6kj?KUi#EKwRYF#LNtPtJl+SLctgKF3wlt@+b5s4~ zsSSMjj9DCUL^}`s{RLipIeYWD7yRhbqM65YcW)bz{`~hxcKJo2Pz2L7`R=9XK62dQ z^(Qa5;wX~CACgVF3=a#Qdh$cwT|6{$!WU0JITWo)S+*ay>=KUSxUocS|GV!jx@Yyu z_YQ7tZ@_X)Aea{vJDjHpGF~AI1QN0=;kqu42ae~06YQ+EZGz+lHFP9;`}#O+-n@H` zoOk@yg?yn^kyXiaBub?cg+c~r#~h+0BM@cAt-$xea;!jg%kzV33@YJJ3{6vrgmokV zxm*g%G7E{yTJhJvKJ;+^KzCbPdkc9ckkK z>^W4$3e+{(Z0{f8+Fvdzo^Z;7$>SzW+LFtrb}s<#zW?vL{G$4XQQULa-QRupjR$`H z*k3Ot5#EYf7(^n3Z7Hl<4-0<&8mE8t+tX(sdf>`U>o!udEuz)+=%ECEd+`33`}@}& z*4kc2p_IpUz_TS}-$(Xrgd0?~95+xWQB`$kt5uSGR9VIM{J@4z`1rVlv=Cc5yOBci z7r%bdMMv6Zk!U!MEJ9eOh3yn^Jv#^hWMoN3(d3{pg}`=gidF$3$;ilnj1h{W2tmY9 zkQ6~WpU0I{diw^Oo_gvZo2u%fx~2*|%fYuj@Idh#bj3%LC6sar(DOhQ<=nyZ(2PLl z?w$8n@|E+ywbwy&4qv)%?K-w@-ps~ztB`Q%7(bbb(`J%PXU0GG^g~N#?_C)=aAur{ zQ9{0p1__of42y9C}9v+1S0Ep8g(& z2DUReu${rdo_&Xh2I%hE&h~BH^!4_V&Sc2vvSMi@zz*t~s+b)EgJ-PFsvExl~mGQhU& zBXn)=$B0z$_^V6iKlIl}zdxADu%UB1o40k7DHIW!0kVo!D&g36*}(XdlUzxXFe)Nc z*4Hp@%orw&8^_o&V;J4h!M^+K_k$@@_PD9Nb?h&uPM-P4(W9rnS6kPz&WKj@XLB~| zH*RIgvemq|WI69HS;F#lYj|(vI%VCBGdSaWmteq*el9w7un%H{Sb;a~TA>WkFWZd-7V8O8p;jNq3 zeKV$6k(TBNisYlnG6VfdGFfP7nVd4>)!SXkl`XR*m9hn_d>XSc2Eq3r=EVBMBT){PMtCP z#!c%x<+_?mJysEy>uM|g2@|KTNL1A)ZQDZAR5IBT0|O%{icBaRp|_`h?xTOX`GqeY zSIenin#Qv)F5<~Y-{+D`PG{`oCVsf!9$b0)b@S$(_~TS+XxDRqfXVRRK~iNr8Pk_U zF_Sl0wW1TxP0&8B5g(1`pWB44RU>O5Y|lg2G@_vh5hFxJG?+C|wNSRMuI|;E>Y9aB zm6h*In>yu{gJ#Y8?c_<5FFWwSgRl7hkFWmeH@>&vYFmnC51g|X3x0YwKfZcC*WYwH z^NycJMSWHGC71tb;#n75Jnc(oUoiR9voD@B|J1W49dYc5lV;61deY&?oY3*T%fCBj z_92HnQ&n9}YkNDb?d`O6bkNe;N<%{fEghq&Z5oB^x}V%c2^w%XjveGEWqX&v^2R2g z&ymigDHIDhu1g`G!?A+9v}pS)JI1zf`k9CFwR2~1-UTyh9i5=DrTI^zN7sDN(p39i zYfHx)9qsL}H8wUbR1_syG6UMSX_}-{!zi+gkZfehK?s{{rVk-pBJmJgHYZ7^WMnM_ z2vk{s@Z?I?ZOn7fq5IO> z9%Z<{3+w`pnMZa!YD^gqC`pY~Cx$A+5imK2BxaK#}F(Io`EVWRNAFY$i*g5L_JFwm$~TGRs9M zu^Tmzfb6Mh0n?{v+ZMXFY$iQ2%(``J=%()mQOa#2mxKPEjMCe+g-FyR zUmPKo%8<|HF-vBd+2pcz&4;XAyMnH+jcnbzfh}9tvwq!5S=V9Gr17j@m*nAxHc(gF zN@Zm=nM|70NQ&yJdN&%YVs{{nsKkE@HRKaXD9qe{VrKHBR=T@j`LZ`zx>57`Rz?N^XnV`zzx?fV9~;75Q>KFSmX;?R8?pE#OWL~ zdoI;gbqo&-;hFaMhT15VF^#b1qmoA^OQJ#}oi(k0KK3Y&J@$8Ae*PaUeg9P~%R-ek zT*tw6U0la4H)#IDmHdRe-}i&cV zzn;$rq6@ZFA`y?#JbDbt{2+BTZHyZ;9m5D?nMEAOAry{amP$Xm`ihIL3n@LEG=DO6 z)j8^FbRK`ai`(z-etoZfCmrHCWfCMVO-=2Ls%s^eF5t;39TO%ndi+F$ESH!0e?L@R zCo?=u@0LzfT|-C$%e5$)MN~y59*U6877^hPs;1z3{|Xdc*V(*zGwau`LDf`b`Ck-f z!w9o+!}_bka^|Wr?HZ%oHTrt`S@hoE@b`ao{T>Ysqq_6CY?-g);5t4+N?^nq@O2}| zu|7iNl$D_CxN^zczk2wgn=k9yw3ahZIf04eDyV7n*w)?6)~>|evkyP>>z0|{tvZ18 z%A)6X=>@tTVQ8eUan-x`E-t?dU^k>WLQeHZC-u}cQS*j8~ zkNo3J-gsy8^QWD8($U32q0D&lF|8tsqJpVnJ1}PAMB2wqLXyS5C2*e>0ForI91B@? zQDm9*8+%!~b~A-S0Y#BN_JjbS8%CM(?*CivFg!GJ_2F}lxaz?DXL8W~li09sB{%%` zmS^{yb?7mXNCfAjle&_JSt<|;S2AJROk^ScEnt1$M^!cA@i@;v{lF{RH!qwss#<4{ z$!%0rD}1ngJ&D=_&z(NwfV*;;k=?5VzVrSIySxY1)i?0SU;lWmom+b4yu%OV%ctDL zSI(Nr_r7-`x8Ly~+Xrf{J^Hw_e$uslJC5xHeem*O=94r{m`%&1Bgmx(KDG?2nhL)E zwVQtRhr3%wP2=2i&ZVvnD&p|Q>u+%R4=;c5pxFl=>AK$kJ1;Mor!!63TU(emV{ary z`NYv^%`iv~4A8YPya}grK`Kxw51PCQ_D1T{}ZRCq)*sjWEpyUhpwKn z$5B`9wbvXP>T6iCdOr6w-t}8f>_X(sy9jny; z%=Qg0&C3pTaq4L&ft+RGo2xRTCmlVuea!g5Vj;VG0r39Hg}a&t5emg96wSmH-#P7_ zd2^a4P8>6i?_P8tzrE=c_CIto7k&4SH}v$TE{{dkkA2|&o*ZBJ+PC?_SAR)=_xg|D zovKVE5@yK*K_p$f%dli5dpmE>^G#{)o9h(_W^o^|>~ z&u7yz=b!ss9M`6$HA>gk_qhL_KYXy@nguhPTUyBFa-Vp2I*x;F+Xx{(wVSCZDu%AI zWz%}rY}&?9&O%d_z-HFpJ${|4DXjT$!_~9*JN~L~oP82{3>Gi?fJ?vstrz#)f9jEn z`1pI%KTG)Q%qSraPPy6YpcYlgu$NeoO<$nzI^W2 z4xhfq9H$G|IN_K3;q4UEo#2NZtb~hQbiSeOc=wGjcZvv*!|)c&;0U{#a!+aFH|v?qjlnBW*vPrmT8gAWXpAm z;CzfwgudQRmb|-=mZl~`Asy3psBdbgqN*+^Yws>4Y`2*tl7#Pj3=Z@Wi6>Hr9ya$6 z$DeS*Yo6!P*Vl*RI+$i2UGpgvOFZ`U>s)s2U0m_Ydsww<4dIZ1ZCg0D`ERhy0{C85 zRSF%y}4*j(ludML-upU+`)kDz2*WD7+{$ZFX}<$r;|la&9`UFSc;a%9p4hl5W% zg{$tkpD*70YreAJrzm=aEj@jVZkY=@k8aeH4pDgzyo zTeri_w?4t;Klvknd;E1aZ|i1YI73CEg1W|0RM(B7uD+4lGHU7?X=-iFR@T-%rpBsh znzR?=XV0PKxFeW0?*v3FL9$S!i1a@r=X$uRPDSk~V%3ersvG_%R5i4qgc58T$+K)E zSe**8jvI-PDip{%HiOwLo4b41(%Z+D-ab~WT}!O4o}<2WI&Z(Tgx~%858QRf{k*ww z5xIPUXf#4R9t(zP|Cjyg^IicywP7RzX0I$apz5u3_2lX88=|@@PJ2r|RTVKLA(I;D z$IT9rNfsC$$}=*QAvKaGJ(6RvFUhP~vu_AhRC-G{Ze&X~hvUFVzK9ly5ld8~M-mwS zBh*lgXuOj8#zyKI8>nm84KxO*t*>WPa}%}owd6}hOb<#Pn4U|~G)az((7n9}+i{pQ zbt+>gOrT@zSjJA6$gwAWfsWB*(KHp?ws~jKV*d8fBRu)obG-ZZa=N?wF+wV4DUa*g z|H%$`*8)H)Q`L7LLFXiwPvh7{Y){}il}JSJu?ZQ1Xe5M?MY(bpyhg|>VXcIj>1NBO z9=f*;vbD2^t(|==dw&gz6zMXI@KFD7AJKRm%LdzW@jVGy*AS|VP?g<=tf_cH0^w6# z8Ko)_p>lT+FQXztO?86ChB{Lzi#})qh6e}8XYy7{QybNlRUCKxe9rp%`J8gbS2*p= zv-#Tj-=Maxp8no$ge0NsI(7B6R8?1ETQD&mV zLXMiMD#@{JNtPr;nNsiLk;!K0>*;a&dwWQY43iul+AWL>4$|M-M@2=1X;WGlKem3i zFt($XaUG2uamZ};+iP#Ob#7_3%o6cv1lNPDTf4|*GtK+V+)Mi6XHFF?eK^KFUW3iegn&2{PFfTel6e&jH6VW8Y(FYM((xWg`+ku4f11ak~kT zFZk>(as`h}+C>$W%sSvGs%l12Dis5!uOv}fRYl{dQN$}M&Obhf-glr~5K9^Q%>#BKc(d)eN z)E^Pj({s;ER)baYw6v285dM#yqGrz#JLlz;lZ zPbd^3WT;qXkw~=jS)ZWsJB0*{-No`Fn_4W0EV3m*qO#vZLHI+ytTGn6o@qG`= zDpD+D@O=kOk06UMvJ~2FNQ>WJ{<$R-I|fE%S>jK(-8%1%JMX$Tmrd1y#32XIrFqO4 zo_g|W(!<*rKXLpUmwxNq^JX7>=(_f?)7iMGXUzO#kA8I9mi5!4;V8L6j?rVLbKNg~ z&Dimi89R0qA1+_Yx#yh4nsuuHlDFOYr-SF8G=Ft}fB!CL$dVKcrW6X#n)(SGpdey1I_!NSaelJ)3WT=Q0E)mw*3KUU~He#*A%4)ihSF{E+<) z*niorcl>F_;NUQp<&jFKD;K@>)`GQb)*kG6u4$XLo6qI-a3pFqHMKmO$>)E+?*aSe zPCnr{Bq4obd3(2?rn zzI!D%{^sX9UXq_b|AgD>8X9^0v8OKV@9U0?8dVFPz_J}Aq0`(xmb!*fgbj@qA1r2| zr<=-}1lzWEame9wo<0A<^NtxD9NgsqkQEuTXwui+w=*DiQi6lYDh%x)%L#eH;<)xQiX5Ge(TaG&R=(!hPe9=Zt*Dy=w=NAB1{_sbi+na^M zVTOl?XWV+*txIH~P+e6+u~?*Jn;dk|!5lUBC?0oHc9Kp~Yfxmjggm74o?Pn>TJP zS2cI-iCC6p3WZ`#cX!w3+M24Ezutf{L((-eH4V2a3hFm0R0#-`!iO<2b~k392e9aU464O!3{agN9so z5A${=KN3=)SzK-=2w5&`=}8O@k1%%pxP`N3%{sJDDC}|oXqrYQlVSDBHTYgIiL|Q$ zP%IW}dwRETuBxhtdY)4z8H->_ND9tZQ6z*S1t!s|fe})X6`6dlNGK8}8jb}4FU!b6 zrdTLYQ(MDP^X6d~1`A(%gP!hg@})en%F3U&w~xNER4RUc0r2W8Z+&iW7K_Cg8A&#u zb=Dax`}(^p8XFtR^Z$WjrR(~EA(IfnMfSWvAQF&7aM3NtqEN`AC<>ua2qDSk(efZG z7LtVHI`j?pbNulq+;GUDhhCmer+0k|kOih`Gt@u4+gpGnN$Niy`N!H^E;G8ewg%fa z%OnvgU<(O3_-v9yp->0!-NoIyI zLdNwC4UJb=mi74sz_TyB{<-D=RaMp8eb?>B-1>*#JT7FE>goyzJyo4+axJa zbn;ve%d#*ni+mxEtSEGJbdb;GNu`p3)}RnUr_S>*O_O9Q#pG#ISAO+tUpqJy3Z+eR z*Z0I=&=c&U{qKrZyO2aC5(!><`Q>ju`sm+oHjFTeA`>=3NK(KUQp$uB(=@5At=p_? zO5C!FHKA~%ESMQMeTW^hGm-}a6rtcb!AfWt28BYAY(B?PM;&=ldt3W$0mbff3V?h6 z{P5@c6kr%3T-W5~m!7SA{+Va)O^%Gr6GD{LK4cWNYzpl<*p`iLJ4EAAFBFdSHa66+ z-e>0CFHW93?cI$VH%@!>(MNxlPN%9AC9s&aZ41x$nKXIwjVFEKMxKp69Y`+0w6cZrOa9Su&%(=bN@;wfmlH2qADBmvA`zi`j=9@}ojF z#hMRS|5-@#mxU~&X$F!kgOHHbzDso9NH{_?8fixQNqid|7zwRqyhNjEh# kHZLueEIuwY_rD$g2dYNYY3wnvyZ`_I07*qoM6N<$f(* { + const navigate = useNavigate(); + + return ( + + + + 404 – Page Not Found + + } + > + + + The page you are looking for doesn’t exist or may have been moved. + + + + + + + ); +}; diff --git a/src/components/shared/Clock/index.tsx b/src/components/shared/Clock/index.tsx new file mode 100755 index 0000000..2763c4e --- /dev/null +++ b/src/components/shared/Clock/index.tsx @@ -0,0 +1,23 @@ +import { useEffect, useState } from 'react'; + +interface ClockProps { + locales?: Intl.LocalesArgument; + options?: Intl.DateTimeFormatOptions; +} + +/** + * A very simple, unstyled, clock + */ +export const Clock = ({ locales, options }: ClockProps): React.JSX.Element => { + const [time, setTime] = useState(null); + + useEffect(() => { + const interval = setInterval(() => setTime(new Date()), 1000); + + return (): void => clearInterval(interval); + }, []); + + if (!time) return <>Loading...; + + return <>{time.toLocaleTimeString(locales, options)}; +}; diff --git a/src/components/shared/ColorSchemeToggle/ColorSchemeToggle.module.css b/src/components/shared/ColorSchemeToggle/ColorSchemeToggle.module.css new file mode 100755 index 0000000..e111fe8 --- /dev/null +++ b/src/components/shared/ColorSchemeToggle/ColorSchemeToggle.module.css @@ -0,0 +1,24 @@ +.icon { + width: 22px; + height: 22px; +} + +.dark { + @mixin dark { + display: none; + } + + @mixin light { + display: block; + } +} + +.light { + @mixin light { + display: none; + } + + @mixin dark { + display: block; + } +} diff --git a/src/components/shared/ColorSchemeToggle/index.tsx b/src/components/shared/ColorSchemeToggle/index.tsx new file mode 100755 index 0000000..5b8a229 --- /dev/null +++ b/src/components/shared/ColorSchemeToggle/index.tsx @@ -0,0 +1,29 @@ +import { ActionIcon, MantineSize } from '@mantine/core'; +import { IconMoon, IconSun } from '@tabler/icons-react'; +import cx from 'clsx'; + +import { useStrictColorScheme } from '@/lib/hooks'; + +import styles from './ColorSchemeToggle.module.css'; + +interface ColorSchemeToggleProps { + size: MantineSize; +} + +/** + * Mantine Color Scheme Toggle + * + * @see https://mantine.dev/theming/color-schemes/#color-scheme-value-caveats + */ +export const ColorSchemeToggle = ({ + size, +}: ColorSchemeToggleProps): React.JSX.Element => { + const { toggleColorScheme } = useStrictColorScheme(); + + return ( + + + + + ); +}; diff --git a/src/components/shared/ConfettiButton/index.tsx b/src/components/shared/ConfettiButton/index.tsx new file mode 100755 index 0000000..781929c --- /dev/null +++ b/src/components/shared/ConfettiButton/index.tsx @@ -0,0 +1,43 @@ +import { ActionIcon } from '@mantine/core'; +import { useState } from 'react'; +import Confetti from 'react-confetti'; + +interface ConfettiButtonProps { + density?: number; + duration?: number; + icon: React.ReactNode; +} + +export const ConfettiButton = ({ + icon, + density = 500, + duration = 1000, +}: ConfettiButtonProps): React.JSX.Element => { + const [isConfettiActive, setIsConfettiActive] = useState(false); + const [isConfettiClean, setIsConfettiClean] = useState(false); + + const handleClick = (): void => { + setIsConfettiActive(true); + setIsConfettiClean(true); + + setTimeout(() => { + setIsConfettiActive(false); + }, duration); + + setTimeout(() => { + setIsConfettiActive(false); + }, duration + 1000); + }; + + return ( + <> + + {icon} + + + {isConfettiClean && ( + + )} + + ); +}; diff --git a/src/components/shared/CopyActionIcon/index.tsx b/src/components/shared/CopyActionIcon/index.tsx new file mode 100755 index 0000000..76251bc --- /dev/null +++ b/src/components/shared/CopyActionIcon/index.tsx @@ -0,0 +1,41 @@ +import { ActionIcon, CopyButton, Tooltip } from '@mantine/core'; +import { IconCheck, IconCopy } from '@tabler/icons-react'; + +interface CopyActionIconProps { + value: string; + tooltip?: string; +} + +/** + * Mantine CopyButton + * + * @see https://mantine.dev/core/copy-button/ + */ +export const CopyActionIcon = ({ + value, + tooltip, +}: CopyActionIconProps): React.JSX.Element => ( + + {({ copied, copy }) => + tooltip ? ( + + + {copied ? ( + + ) : ( + + )} + + + ) : ( + + {copied ? ( + + ) : ( + + )} + + ) + } + +); diff --git a/src/components/shared/CopyLabelButton/index.tsx b/src/components/shared/CopyLabelButton/index.tsx new file mode 100755 index 0000000..16e5ec2 --- /dev/null +++ b/src/components/shared/CopyLabelButton/index.tsx @@ -0,0 +1,34 @@ +import { Button, ButtonProps, CopyButton } from '@mantine/core'; + +interface CopyActionIconProps { + label: string; + value: string; + copyLabel?: string; + buttonProps?: ButtonProps; +} + +/** + * Mantine CopyButton + * + * @see https://mantine.dev/core/copy-button/ + */ +export const CopyLabelButton = ({ + label, + value, + buttonProps, + copyLabel = 'copied', +}: CopyActionIconProps): React.JSX.Element => ( + + {({ copied, copy }) => ( + + )} + +); diff --git a/src/components/shared/FlexCenter/FlexCenter.module.css b/src/components/shared/FlexCenter/FlexCenter.module.css new file mode 100755 index 0000000..e6a0490 --- /dev/null +++ b/src/components/shared/FlexCenter/FlexCenter.module.css @@ -0,0 +1,6 @@ +.center { + width: 100%; + height: 100%; + align-items: center; + justify-content: center; +} diff --git a/src/components/shared/FlexCenter/index.tsx b/src/components/shared/FlexCenter/index.tsx new file mode 100755 index 0000000..081dae1 --- /dev/null +++ b/src/components/shared/FlexCenter/index.tsx @@ -0,0 +1,18 @@ +import { Flex, FlexProps } from '@mantine/core'; + +import styles from './FlexCenter.module.css'; + +interface FlexCenterProps extends FlexProps { + children: React.ReactNode; +} + +export const FlexCenter = ({ + children, + direction, + wrap, + gap, +}: FlexCenterProps): React.JSX.Element => ( + + {children} + +); diff --git a/src/components/shared/IconLesbian/index.tsx b/src/components/shared/IconLesbian/index.tsx new file mode 100755 index 0000000..752be6b --- /dev/null +++ b/src/components/shared/IconLesbian/index.tsx @@ -0,0 +1,38 @@ +interface IconProps extends React.SVGProps { + size?: number; + color?: string; + heart?: boolean; +} + +export const IconLesbian: React.FC = ({ + size = 24, + heart = false, + color = 'currentColor', + ...props +}) => { + return ( + + {heart && ( + + + + + + )} + + + + + + + + + ); +}; diff --git a/src/components/shared/ProtectedRoute/index.tsx b/src/components/shared/ProtectedRoute/index.tsx new file mode 100644 index 0000000..7290cef --- /dev/null +++ b/src/components/shared/ProtectedRoute/index.tsx @@ -0,0 +1,69 @@ +import { useEffect } from 'react'; +import { Navigate, Outlet } from 'react-router-dom'; +import { Title, Loader, Center } from '@mantine/core'; + +import { useFetchCurrentUser } from '@/lib/utils/auth/hooks/useFetchCurrentUser'; +import { useSession } from '@/lib/utils/auth/hooks/useSession'; +import { FlexCenter } from '../FlexCenter'; + +interface ProtectedRouteProps { + roles?: string[]; +} + +/** + * ProtectedRoute + * --------------- + * This route guard ensures that only authenticated users can access + * private routes such as the dashboard or internal management pages. + * + * If the user is not authenticated or the session check fails, + * they are redirected to the login page. + * + * ✅ Example usage: + * + * }> + * }> + * } /> + * } /> + * + * + * + * Behavior: + * - While checking session → shows loader + * - Authenticated user → allowed to access dashboard + * - Unauthenticated user → redirected to /login + * + * @returns JSX.Element + */ +export const PublicRoute = ({ + roles = [], +}: ProtectedRouteProps): React.JSX.Element => { + const { data, isLoading, error, fetchCurrentUser } = useFetchCurrentUser(); + + useEffect(() => { + if (!data && !isLoading && !error) fetchCurrentUser(); + }, [data, isLoading, fetchCurrentUser, error]); + + if (isLoading) { + return ( + + + Checking session... + + + + + ); + } + + if (error || !data?.data?.user_id) { + return ; + } + + const user = data.data; + if (roles.length > 0 && !roles.includes(user.role)) { + return ; + } + + return ; +}; diff --git a/src/components/shared/PublicRoute/index.tsx b/src/components/shared/PublicRoute/index.tsx new file mode 100644 index 0000000..b3828e2 --- /dev/null +++ b/src/components/shared/PublicRoute/index.tsx @@ -0,0 +1,49 @@ +import { useSession } from '@/lib/utils/auth/hooks/useSession'; +import { Title, Loader } from '@mantine/core'; +import { Navigate, Outlet } from 'react-router-dom'; +import { FlexCenter } from '../FlexCenter'; + +/** + * PublicRoute + * ------------ + * This route guard prevents authenticated users from accessing public routes + * such as login, register, or landing pages. If a valid session exists, + * the user is redirected to the dashboard instead. + * + * Otherwise, it renders the child route’s component via . + * + * ✅ Example usage: + * + * }> + * } /> + * } /> + * + * + * Behavior: + * - While checking session → shows loader + * - Authenticated user → redirected to /dashboard + * - Unauthenticated user → allowed to access the page + * + * @returns JSX.Element + */ +export const PublicRoute = (): React.JSX.Element => { + const { isLoading, error, isAuthenticated } = useSession(); + + if (isLoading) { + return ( + + + Checking session... + + + + + ); + } + + if (isAuthenticated && !error) { + return ; + } + + return ; +}; diff --git a/src/components/shared/Tabs/Tabs.module.css b/src/components/shared/Tabs/Tabs.module.css new file mode 100755 index 0000000..6dc4032 --- /dev/null +++ b/src/components/shared/Tabs/Tabs.module.css @@ -0,0 +1,51 @@ +.list { + top: 0; + left: 0; + right: 0; + z-index: 2; + display: flex; + width: min-content; + position: absolute; + justify-content: flex-start; +} + +.burger { + top: 0; + left: 0; + right: 0; + z-index: 2; + position: absolute; +} + +.indicator { + background-color: var(--mantine-color-white); + border-radius: var(--mantine-radius-md); + border: 1px solid var(--mantine-color-gray-2); + box-shadow: var(--mantine-shadow-sm); + + @mixin dark { + background-color: var(--mantine-color-dark-6); + border-color: var(--mantine-color-dark-4); + } +} + +.tab { + z-index: 3; /* Higher than the indicator */ + padding: 10px; + font-weight: 500; + width: min-content; + transition: color 100ms ease; + color: var(--mantine-color-gray-7); + + &[data-active] { + color: var(--mantine-color-black); + } + + @mixin dark { + color: var(--mantine-color-dark-1); + + &[data-active] { + color: var(--mantine-color-white); + } + } +} diff --git a/src/components/shared/Tabs/index.tsx b/src/components/shared/Tabs/index.tsx new file mode 100755 index 0000000..6f22406 --- /dev/null +++ b/src/components/shared/Tabs/index.tsx @@ -0,0 +1,107 @@ +import { + Burger, + FloatingIndicator, + Tabs as MantineTabs, + Transition, +} from '@mantine/core'; +import { useState } from 'react'; + +import classes from './Tabs.module.css'; + +export interface Tab { + value: string; + label: string; + icon?: React.ReactNode; + content: React.ReactNode; +} + +interface TabsProps { + tabs: Tab[]; + burger?: boolean; + orientation?: 'vertical' | 'horizontal'; +} + +export const Tabs = ({ + tabs, + burger = false, + orientation = 'vertical', +}: TabsProps): React.JSX.Element => { + const [rootRef, setRootRef] = useState(null); + + const [controlsRefs, setControlsRefs] = useState< + Record + >({}); + + const [value, setValue] = useState( + tabs.length > 0 ? tabs[0].value : null, + ); + + const [isTabListVisible, setIsTabListVisible] = useState(true); + + const setControlRef = + (val: string) => + (node: HTMLButtonElement): void => { + controlsRefs[val] = node; + setControlsRefs(controlsRefs); + }; + + return ( +

+ {burger && ( + setIsTabListVisible(prev => !prev)} + /> + )} + + + + {styles => ( + + {tabs.map(({ value, label, icon }) => ( + + {label} + + ))} + + + + )} + + + {tabs.map(({ value, content }) => ( + + {content} + + ))} + +
+ ); +}; diff --git a/src/components/shared/ToggleActionIcon/ToggleActionIcon.module.css b/src/components/shared/ToggleActionIcon/ToggleActionIcon.module.css new file mode 100755 index 0000000..5156c9e --- /dev/null +++ b/src/components/shared/ToggleActionIcon/ToggleActionIcon.module.css @@ -0,0 +1,11 @@ +.icon { + border: 1px solid; + + @mixin light { + border-color: black; + } + + @mixin dark { + border-color: grey; + } +} diff --git a/src/components/shared/ToggleActionIcon/index.tsx b/src/components/shared/ToggleActionIcon/index.tsx new file mode 100755 index 0000000..9a6f49a --- /dev/null +++ b/src/components/shared/ToggleActionIcon/index.tsx @@ -0,0 +1,29 @@ +import { ActionIcon } from '@mantine/core'; + +import styles from './ToggleActionIcon.module.css'; + +interface ToggleActionIconProps { + isActive?: boolean; + onClick?: () => void; + children: React.ReactElement; +} + +/** + * Mantine ActionIcon + * + * @see https://mantine.dev/core/action-icon/ + */ +export const ToggleActionIcon = ({ + onClick, + isActive, + children, +}: ToggleActionIconProps): React.JSX.Element => ( + + {children} + +); diff --git a/src/components/shared/UploadFrame/index.tsx b/src/components/shared/UploadFrame/index.tsx new file mode 100755 index 0000000..6e7234d --- /dev/null +++ b/src/components/shared/UploadFrame/index.tsx @@ -0,0 +1,21 @@ +import { FileInput, Stack } from '@mantine/core'; +import { useState } from 'react'; + +interface UploadFrameProps { + placeholder: string; + children: (file: File | null) => React.ReactNode; +} + +export const UploadFrame = ({ + children, + placeholder, +}: UploadFrameProps): React.JSX.Element => { + const [file, setFile] = useState(null); + + return ( + + + {children(file)} + + ); +}; diff --git a/src/global.css b/src/global.css new file mode 100755 index 0000000..c1d76e0 --- /dev/null +++ b/src/global.css @@ -0,0 +1,54 @@ +html, +body, +#root { + height: 100% !important; + width: 100% !important; + margin: 0 !important; + padding: 0 !important; +} + +:root { + --grid-color-light: rgba(0, 0, 0, 0.1); + --grid-color-dark: rgba(255, 255, 255, 0.1); + + --hidden-track: transparent; + --track-bar: rgba(190, 190, 190, 0.4); + --track-bar-hover: rgba(190, 190, 190, 0.6); +} + +/* STYLED SCROLLBARS */ +/* Firefox */ +* { + scrollbar-width: thin; + scrollbar-color: var(--track-bar) var(--hidden-track); +} +/* Chrome, Edge, and Safari */ +*::-webkit-scrollbar { + width: 17px; +} +*::-webkit-scrollbar-track { + background: var(--hidden-track); +} +*::-webkit-scrollbar-thumb { + background-color: var(--track-bar); + border-radius: 14px; + border: 3px solid var(--hidden-track); +} +::-webkit-scrollbar-thumb:hover { + background-color: var(--track-bar-hover); +} +/* EOF STYLED SCROLLBARS */ + +.header { + gap: 12px; + width: 100%; + display: flex; + z-index: 1000; + flex-wrap: wrap; + position: fixed; + align-items: center; + justify-content: center; + padding: var(--mantine-padding-lg); + margin-top: 10px; + border-radius: var(--mantine-radius-md); +} diff --git a/src/index.tsx b/src/index.tsx new file mode 100755 index 0000000..226f3f4 --- /dev/null +++ b/src/index.tsx @@ -0,0 +1,5 @@ +import { createRoot } from 'react-dom/client'; + +import { App } from './App'; + +createRoot(document.getElementById('root') as HTMLElement).render(); diff --git a/src/lib/hooks/index.ts b/src/lib/hooks/index.ts new file mode 100755 index 0000000..dd86f41 --- /dev/null +++ b/src/lib/hooks/index.ts @@ -0,0 +1 @@ +export * from './useStrictColorScheme'; diff --git a/src/lib/hooks/useStrictColorScheme/index.ts b/src/lib/hooks/useStrictColorScheme/index.ts new file mode 100755 index 0000000..eff6154 --- /dev/null +++ b/src/lib/hooks/useStrictColorScheme/index.ts @@ -0,0 +1,19 @@ +import { useComputedColorScheme, useMantineColorScheme } from '@mantine/core'; + +interface StrictColorSchemeResponse { + colorScheme: 'light' | 'dark'; + toggleColorScheme: () => void; +} + +export const useStrictColorScheme = (): StrictColorSchemeResponse => { + const { setColorScheme } = useMantineColorScheme(); + const computedColorScheme = useComputedColorScheme('light', { + getInitialValueInEffect: true, + }); + + const toggleColorScheme = (): void => { + setColorScheme(computedColorScheme === 'light' ? 'dark' : 'light'); + }; + + return { toggleColorScheme, colorScheme: computedColorScheme }; +}; diff --git a/src/lib/providers/index.tsx b/src/lib/providers/index.tsx new file mode 100755 index 0000000..c928a1b --- /dev/null +++ b/src/lib/providers/index.tsx @@ -0,0 +1,19 @@ +import { MantineProvider } from '@mantine/core'; +import { DatesProvider } from '@mantine/dates'; + +import { theme } from '@/lib/theme'; +import { BrowserRouter } from 'react-router-dom'; + +interface ProvidersProps { + children: React.ReactNode; +} + +export const Providers = ({ children }: ProvidersProps): React.JSX.Element => ( + + + + {children} + + + +); diff --git a/src/lib/store/defaultState.ts b/src/lib/store/defaultState.ts new file mode 100755 index 0000000..ac9ad20 --- /dev/null +++ b/src/lib/store/defaultState.ts @@ -0,0 +1,5 @@ +import { AppState, defaultAppState } from './slices/appSlice'; + +export type StoreState = AppState; + +export const defaultState: AppState = { ...defaultAppState }; diff --git a/src/lib/store/index.ts b/src/lib/store/index.ts new file mode 100755 index 0000000..05ff040 --- /dev/null +++ b/src/lib/store/index.ts @@ -0,0 +1,9 @@ +import { create } from 'zustand'; + +import { AppSlice, createAppSlice } from './slices/appSlice'; + +export type Store = AppSlice; + +export const useStore = create((set, get, store) => ({ + ...createAppSlice(set, get, store), +})); diff --git a/src/lib/store/slices/appSlice.ts b/src/lib/store/slices/appSlice.ts new file mode 100755 index 0000000..68771c9 --- /dev/null +++ b/src/lib/store/slices/appSlice.ts @@ -0,0 +1,24 @@ +import { StateCreator } from 'zustand'; + +import { Store } from '..'; + +export interface AppState { + isDarkMode: boolean; +} + +export type AppActions = { + setIsDarkMode(isDarkMode: AppState['isDarkMode']): void; +}; + +export type AppSlice = AppState & AppActions; + +/** This object enables us to reset state on the fly */ +export const defaultAppState: AppState = { + isDarkMode: true, +}; + +export const createAppSlice: StateCreator = set => ({ + ...defaultAppState, + + setIsDarkMode: isDarkMode => set({ isDarkMode }), +}); diff --git a/src/lib/theme/index.ts b/src/lib/theme/index.ts new file mode 100755 index 0000000..95a13bc --- /dev/null +++ b/src/lib/theme/index.ts @@ -0,0 +1,94 @@ +import { createTheme } from '@mantine/core'; + +export const theme = createTheme({ + fontFamily: '"Inter", sans-serif', + colors: { + brandOrange: [ + '#ffede3', + '#ffdbcc', + '#ffb59a', + '#ff8d63', + '#ff6a36', + '#ff5418', + '#ff4807', + '#e43900', + '#cc3100', + '#b22500', + ], + brandBlue: [ + '#f2f8f8', + '#e7eced', + '#c8d9da', + '#a7c4c6', + '#8bb3b5', + '#79a8ab', + '#6ea3a6', + '#5d8e91', + '#4f7f82', + '#3c6e71', + ], + brandYellow: [ + '#fff9e1', + '#fff1cc', + '#ffe19b', + '#ffd164', + '#ffc238', + '#ffba1c', + '#ffb509', + '#e39f00', + '#ca8d00', + '#af7800', + ], + brandBrown: [ + '#f8f3f2', + '#e8e5e4', + '#d3c6c4', + '#bea6a1', + '#ad8a84', + '#a37870', + '#9f6f67', + '#8b5e56', + '#7d534c', + '#6f463f', + ], + brandGrey: [ + '#f5f5f5', + '#e7e7e7', + '#cdcdcd', + '#b2b2b2', + '#9a9a9a', + '#8b8b8b', + '#848484', + '#717171', + '#656565', + '#575757', + ], + }, + primaryShade: { light: 4, dark: 7 }, + primaryColor: 'brandOrange', + headings: { + fontFamily: '"Bricolage Grotesque", sans-serif', + }, + other: { + brand: { + dark: { + primary: '#FF6F3C', + secondary: '#3C6E71', + accent: '#FFD166', + background: '#2D2D2D', + text: '#FFF8E1', + border: '#4A4A4A', + hover: '#464646', + }, + light: { + primary: '#FF6F3C', + secondary: '#3C6E71', + accent: '#FFD166', + background: '#FFF8E1', + text: '#3E2723', + border: '#DADADA', + hover: '#e9e6df', + }, + }, + }, +}); diff --git a/src/lib/utils/auth/hooks/useAuthorize.ts b/src/lib/utils/auth/hooks/useAuthorize.ts new file mode 100644 index 0000000..eea294f --- /dev/null +++ b/src/lib/utils/auth/hooks/useAuthorize.ts @@ -0,0 +1,54 @@ +// useLogin.ts +import { useState, useCallback } from 'react'; +import { + ApiError, + APIResponse, + apiClient, + isApiResponse, + isApiError, +} from '..'; + +export interface AuthorizeRequest { + redirect_uri: string; + client_id: string; +} + +export interface AuthorizeResponse { + token: string; + expires_in: string; +} + +interface UseAuthorize { + isLoading: boolean; + error: ApiError | null; + data: APIResponse | null; + authorize: (payload: AuthorizeRequest) => Promise; +} + +export const useAuthorize = (): UseAuthorize => { + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const [data, setData] = useState | null>(null); + + const authorize = useCallback((payload: AuthorizeRequest): Promise => { + setIsLoading(true); + setError(null); + setData(null); + + return apiClient() + .post('v1/auth/authorize', payload) + .then(res => { + if (isApiResponse(res)) { + setData(res); + } else if (isApiError(res)) { + setError(res); + } else { + setError({ message: 'Received unknown response structure.' }); + } + }) + .catch(() => setError({ message: 'Network or unexpected error' })) + .finally(() => setIsLoading(false)); + }, []); + + return { isLoading, error, data, authorize }; +}; diff --git a/src/lib/utils/auth/hooks/useCreateClient.ts b/src/lib/utils/auth/hooks/useCreateClient.ts new file mode 100644 index 0000000..32a341f --- /dev/null +++ b/src/lib/utils/auth/hooks/useCreateClient.ts @@ -0,0 +1,62 @@ +import { useState, useCallback } from 'react'; +import { + ApiError, + APIResponse, + apiClient, + isApiResponse, + isApiError, +} from '..'; + +export interface CreateClientRequest { + client_name: string; + redirect_uri: string; +} + +export interface CreateClientResponse { + client_id: string; + client_name: string; + redirect_uri: string; + client_secret: string; +} + +interface UseCreateClient { + isLoading: boolean; + error: ApiError | null; + data: APIResponse | null; + createClient: (payload: CreateClientRequest) => Promise; +} + +export const useCreateClient = (): UseCreateClient => { + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const [data, setData] = useState | null>( + null, + ); + + const createClient = useCallback( + (payload: CreateClientRequest): Promise => { + setIsLoading(true); + setError(null); + setData(null); + + const url = 'v1/clients'; + + return apiClient() + .post(url, payload) + .then(res => { + if (isApiResponse(res)) { + setData(res); + } else if (isApiError(res)) { + setError(res); + } else { + setError({ message: 'Received unknown response structure.' }); + } + }) + .catch(() => setError({ message: 'Network or unexpected error' })) + .finally(() => setIsLoading(false)); + }, + [], + ); + + return { isLoading, error, data, createClient }; +}; diff --git a/src/lib/utils/auth/hooks/useDeleteAdminClient.ts b/src/lib/utils/auth/hooks/useDeleteAdminClient.ts new file mode 100644 index 0000000..aae1c0a --- /dev/null +++ b/src/lib/utils/auth/hooks/useDeleteAdminClient.ts @@ -0,0 +1,50 @@ +import { useState, useCallback } from 'react'; +import { + ApiError, + APIResponse, + apiClient, + isApiResponse, + isApiError, +} from '..'; + +interface UseDeleteAdminClient { + isLoading: boolean; + error: ApiError | null; + data: APIResponse | null; + deleteClient: (clientId: string) => Promise; +} + +export const useDeleteAdminClient = (): UseDeleteAdminClient => { + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const [data, setData] = useState(null); + + const deleteClient = useCallback((clientId: string): Promise => { + if (!clientId) { + setError({ message: 'Client ID is required.' }); + return Promise.resolve(); + } + + setIsLoading(true); + setError(null); + setData(null); + + const url = `v1/admin/clients/${clientId}`; + + return apiClient() + .delete(url) + .then(res => { + if (isApiResponse(res)) { + setData(res); + } else if (isApiError(res)) { + setError(res); + } else { + setError({ message: 'Received unknown response structure.' }); + } + }) + .catch(() => setError({ message: 'Network or unexpected error' })) + .finally(() => setIsLoading(false)); + }, []); + + return { isLoading, error, data, deleteClient }; +}; diff --git a/src/lib/utils/auth/hooks/useDeleteAdminUser.ts b/src/lib/utils/auth/hooks/useDeleteAdminUser.ts new file mode 100644 index 0000000..69f16dc --- /dev/null +++ b/src/lib/utils/auth/hooks/useDeleteAdminUser.ts @@ -0,0 +1,50 @@ +import { useState, useCallback } from 'react'; +import { + ApiError, + APIResponse, + apiClient, + isApiResponse, + isApiError, +} from '..'; + +interface UseDeleteAdminUser { + isLoading: boolean; + error: ApiError | null; + data: APIResponse | null; + deleteUser: (userId: string) => Promise; +} + +export const useDeleteAdminUser = (): UseDeleteAdminUser => { + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const [data, setData] = useState(null); + + const deleteUser = useCallback((userId: string): Promise => { + if (!userId) { + setError({ message: 'User ID is required.' }); + return Promise.resolve(); + } + + setIsLoading(true); + setError(null); + setData(null); + + const url = `v1/admin/users/${userId}`; + + return apiClient() + .delete(url) + .then(res => { + if (isApiResponse(res)) { + setData(res); + } else if (isApiError(res)) { + setError(res); + } else { + setError({ message: 'Received unknown response structure.' }); + } + }) + .catch(() => setError({ message: 'Network or unexpected error' })) + .finally(() => setIsLoading(false)); + }, []); + + return { isLoading, error, data, deleteUser }; +}; diff --git a/src/lib/utils/auth/hooks/useDeleteUserData.ts b/src/lib/utils/auth/hooks/useDeleteUserData.ts new file mode 100644 index 0000000..f79e42a --- /dev/null +++ b/src/lib/utils/auth/hooks/useDeleteUserData.ts @@ -0,0 +1,57 @@ +import { useState, useCallback } from 'react'; +import { + ApiError, + APIResponse, + apiClient, + isApiResponse, + isApiError, +} from '..'; + +export interface UserDeleteRequest { + code: string; +} + +interface UseDeleteUserData { + isLoading: boolean; + error: ApiError | null; + data: APIResponse | null; + deleteUserData: (payload: UserDeleteRequest) => Promise; +} + +export const useDeleteUserData = (): UseDeleteUserData => { + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const [data, setData] = useState(null); + + const deleteUserData = useCallback( + (payload: UserDeleteRequest): Promise => { + if (!payload?.code) { + setError({ message: 'Verification code is required.' }); + return Promise.resolve(); + } + + setIsLoading(true); + setError(null); + setData(null); + + const url = 'v1/user/me/data'; + + return apiClient() + .delete(url, payload) + .then(res => { + if (isApiResponse(res)) { + setData(res); + } else if (isApiError(res)) { + setError(res); + } else { + setError({ message: 'Received unknown response structure.' }); + } + }) + .catch(() => setError({ message: 'Network or unexpected error' })) + .finally(() => setIsLoading(false)); + }, + [], + ); + + return { isLoading, error, data, deleteUserData }; +}; diff --git a/src/lib/utils/auth/hooks/useFetchAdminClients.ts b/src/lib/utils/auth/hooks/useFetchAdminClients.ts new file mode 100644 index 0000000..3d27b47 --- /dev/null +++ b/src/lib/utils/auth/hooks/useFetchAdminClients.ts @@ -0,0 +1,66 @@ +import { useState, useCallback } from 'react'; +import { + ApiError, + APIResponse, + apiClient, + isApiResponse, + isApiError, +} from '..'; + +export interface OauthClient { + client_id: string; + owner_id: string; + client_name: string; + redirect_uri: string; + created_at: number; + updated_at: number; +} + +export interface FetchClientsResponse { + clients: OauthClient[]; + page: number; + limit: number; + total_items: number; + total_pages: number; + has_next_page: boolean; + has_prev_page: boolean; +} + +interface UseFetchAdminClients { + isLoading: boolean; + error: ApiError | null; + data: APIResponse | null; + fetchClients: (limit?: number, offset?: number) => Promise; +} + +export const useFetchAdminClients = (): UseFetchAdminClients => { + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const [data, setData] = useState | null>( + null, + ); + + const fetchClients = useCallback((limit = 10, offset = 0): Promise => { + setIsLoading(true); + setError(null); + setData(null); + + const url = `v1/admin/clients?limit=${limit}&offset=${offset}`; + + return apiClient() + .get(url) + .then(res => { + if (isApiResponse(res)) { + setData(res); + } else if (isApiError(res)) { + setError(res); + } else { + setError({ message: 'Received unknown response structure.' }); + } + }) + .catch(() => setError({ message: 'Network or unexpected error' })) + .finally(() => setIsLoading(false)); + }, []); + + return { isLoading, error, data, fetchClients }; +}; diff --git a/src/lib/utils/auth/hooks/useFetchAdminUsers.ts b/src/lib/utils/auth/hooks/useFetchAdminUsers.ts new file mode 100644 index 0000000..c86cc7b --- /dev/null +++ b/src/lib/utils/auth/hooks/useFetchAdminUsers.ts @@ -0,0 +1,71 @@ +import { useState, useCallback } from 'react'; +import { + ApiError, + APIResponse, + apiClient, + isApiResponse, + isApiError, +} from '..'; + +export interface User { + user_id: string; + email: string; + nickname: string; + last_logged_in?: number; + last_password_change?: number; + created_at: number; + updated_at: number; + is_active: boolean; + role: string; + last_data_request?: number; + deleted_at?: number; +} + +export interface FetchUsersResponse { + users: User[]; + page: number; + limit: number; + total_items: number; + total_pages: number; + has_next_page: boolean; + has_prev_page: boolean; +} + +interface UseFetchAdminUsers { + isLoading: boolean; + error: ApiError | null; + data: APIResponse | null; + fetchUsers: (limit?: number, offset?: number) => Promise; +} + +export const useFetchAdminUsers = (): UseFetchAdminUsers => { + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const [data, setData] = useState | null>( + null, + ); + + const fetchUsers = useCallback((limit = 10, offset = 0): Promise => { + setIsLoading(true); + setError(null); + setData(null); + + const url = `v1/admin/users?limit=${limit}&offset=${offset}`; + + return apiClient() + .get(url) + .then(res => { + if (isApiResponse(res)) { + setData(res); + } else if (isApiError(res)) { + setError(res); + } else { + setError({ message: 'Received unknown response structure.' }); + } + }) + .catch(() => setError({ message: 'Network or unexpected error' })) + .finally(() => setIsLoading(false)); + }, []); + + return { isLoading, error, data, fetchUsers }; +}; diff --git a/src/lib/utils/auth/hooks/useFetchClient.ts b/src/lib/utils/auth/hooks/useFetchClient.ts new file mode 100644 index 0000000..210b2ac --- /dev/null +++ b/src/lib/utils/auth/hooks/useFetchClient.ts @@ -0,0 +1,53 @@ +import { useState, useCallback } from 'react'; +import { + ApiError, + APIResponse, + apiClient, + isApiResponse, + isApiError, +} from '..'; + +export interface FetchClientResponse { + client_id: string; + client_name: string; + redirect_uri: string; +} + +interface UseFetchClientById { + isLoading: boolean; + error: ApiError | null; + data: APIResponse | null; + fetchClientById: (clientId: string) => Promise; +} + +export const useFetchClientById = (): UseFetchClientById => { + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const [data, setData] = useState | null>( + null, + ); + + const fetchClientById = useCallback((clientId: string): Promise => { + setIsLoading(true); + setError(null); + setData(null); + + const url = `v1/client/${clientId}`; + + return apiClient() + .get(url) + .then(res => { + if (isApiResponse(res)) { + setData(res); + } else if (isApiError(res)) { + setError(res); + } else { + setError({ message: 'Received unknown response structure.' }); + } + }) + .catch(() => setError({ message: 'Network or unexpected error' })) + .finally(() => setIsLoading(false)); + }, []); + + return { isLoading, error, data, fetchClientById }; +}; diff --git a/src/lib/utils/auth/hooks/useFetchClients.ts b/src/lib/utils/auth/hooks/useFetchClients.ts new file mode 100644 index 0000000..45c0994 --- /dev/null +++ b/src/lib/utils/auth/hooks/useFetchClients.ts @@ -0,0 +1,55 @@ +import { useState, useCallback } from 'react'; +import { + ApiError, + APIResponse, + apiClient, + isApiResponse, + isApiError, +} from '..'; + +export interface Client { + client_id: string; + client_name: string; + redirect_uri: string; +} + +export type FetchClientsResponse = Client[]; + +interface UseFetchClients { + isLoading: boolean; + error: ApiError | null; + data: APIResponse | null; + fetchClients: () => Promise; +} + +export const useFetchClients = (): UseFetchClients => { + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const [data, setData] = useState | null>( + null, + ); + + const fetchClients = useCallback((): Promise => { + setIsLoading(true); + setError(null); + setData(null); + + const url = 'v1/clients'; + + return apiClient() + .get(url) + .then(res => { + if (isApiResponse(res)) { + setData(res); + } else if (isApiError(res)) { + setError(res); + } else { + setError({ message: 'Received unknown response structure.' }); + } + }) + .catch(() => setError({ message: 'Network or unexpected error' })) + .finally(() => setIsLoading(false)); + }, []); + + return { isLoading, error, data, fetchClients }; +}; diff --git a/src/lib/utils/auth/hooks/useFetchCurrentUser.ts b/src/lib/utils/auth/hooks/useFetchCurrentUser.ts new file mode 100644 index 0000000..932acac --- /dev/null +++ b/src/lib/utils/auth/hooks/useFetchCurrentUser.ts @@ -0,0 +1,54 @@ +import { useState, useCallback } from 'react'; +import { + ApiError, + APIResponse, + apiClient, + isApiResponse, + isApiError, +} from '..'; + +export interface FetchUserResponse { + user_id: string; + email: string; + nickname: string; + role: string; + created_at: number; + last_data_request: number; +} + +interface UseFetchCurrentUser { + isLoading: boolean; + error: ApiError | null; + data: APIResponse | null; + fetchCurrentUser: () => Promise; +} + +export const useFetchCurrentUser = (): UseFetchCurrentUser => { + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const [data, setData] = useState | null>(null); + + const fetchCurrentUser = useCallback((): Promise => { + setIsLoading(true); + setError(null); + setData(null); + + const url = 'v1/user/me'; + + return apiClient() + .get(url) + .then(res => { + if (isApiResponse(res)) { + setData(res); + } else if (isApiError(res)) { + setError(res); + } else { + setError({ message: 'Received unknown response structure.' }); + } + }) + .catch(() => setError({ message: 'Network or unexpected error' })) + .finally(() => setIsLoading(false)); + }, []); + + return { isLoading, error, data, fetchCurrentUser }; +}; diff --git a/src/lib/utils/auth/hooks/useLogin.ts b/src/lib/utils/auth/hooks/useLogin.ts new file mode 100644 index 0000000..202cc71 --- /dev/null +++ b/src/lib/utils/auth/hooks/useLogin.ts @@ -0,0 +1,49 @@ +// useLogin.ts +import { useState, useCallback } from 'react'; +import { + ApiError, + APIResponse, + apiClient, + isApiResponse, + isApiError, +} from '..'; + +export interface LoginRequest { + email: string; + password: string; +} + +interface UseLoginReturn { + isLoading: boolean; + error: ApiError | null; + data: APIResponse | null; + login: (payload: LoginRequest) => Promise; +} + +export const useLogin = (): UseLoginReturn => { + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const [data, setData] = useState(null); + + const login = useCallback((payload: LoginRequest): Promise => { + setIsLoading(true); + setError(null); + setData(null); + + return apiClient() + .post('v1/auth/login', payload) + .then(res => { + if (isApiResponse(res)) { + setData(res); + } else if (isApiError(res)) { + setError(res); + } else { + setError({ message: 'Received unknown response structure.' }); + } + }) + .catch(() => setError({ message: 'Network or unexpected error' })) + .finally(() => setIsLoading(false)); + }, []); + + return { isLoading, error, data, login }; +}; diff --git a/src/lib/utils/auth/hooks/useLogout.ts b/src/lib/utils/auth/hooks/useLogout.ts new file mode 100644 index 0000000..ddcff56 --- /dev/null +++ b/src/lib/utils/auth/hooks/useLogout.ts @@ -0,0 +1,44 @@ +// useLogin.ts +import { useState, useCallback } from 'react'; +import { + ApiError, + APIResponse, + apiClient, + isApiResponse, + isApiError, +} from '..'; + +interface UseLogout { + isLoading: boolean; + error: ApiError | null; + data: APIResponse | null; + logout: () => Promise; +} + +export const useLogout = (): UseLogout => { + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const [data, setData] = useState(null); + + const logout = useCallback((): Promise => { + setIsLoading(true); + setError(null); + setData(null); + + return apiClient() + .get('v1/auth/logout') + .then(res => { + if (isApiResponse(res)) { + setData(res); + } else if (isApiError(res)) { + setError(res); + } else { + setError({ message: 'Received unknown response structure.' }); + } + }) + .catch(() => setError({ message: 'Network or unexpected error' })) + .finally(() => setIsLoading(false)); + }, []); + + return { isLoading, error, data, logout }; +}; diff --git a/src/lib/utils/auth/hooks/usePostUserData.ts b/src/lib/utils/auth/hooks/usePostUserData.ts new file mode 100644 index 0000000..d6f3871 --- /dev/null +++ b/src/lib/utils/auth/hooks/usePostUserData.ts @@ -0,0 +1,45 @@ +import { useState, useCallback } from 'react'; +import { + ApiError, + APIResponse, + apiClient, + isApiResponse, + isApiError, +} from '..'; + +interface UsePostUserData { + isLoading: boolean; + error: ApiError | null; + data: APIResponse | null; + postUserData: () => Promise; +} + +export const usePostUserData = (): UsePostUserData => { + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const [data, setData] = useState(null); + + const postUserData = useCallback((): Promise => { + setIsLoading(true); + setError(null); + setData(null); + + const url = 'v1/user/me/data'; + + return apiClient() + .post(url) + .then(res => { + if (isApiResponse(res)) { + setData(res); + } else if (isApiError(res)) { + setError(res); + } else { + setError({ message: 'Received unknown response structure.' }); + } + }) + .catch(() => setError({ message: 'Network or unexpected error' })) + .finally(() => setIsLoading(false)); + }, []); + + return { isLoading, error, data, postUserData }; +}; diff --git a/src/lib/utils/auth/hooks/useRefresh.ts b/src/lib/utils/auth/hooks/useRefresh.ts new file mode 100644 index 0000000..00e1b20 --- /dev/null +++ b/src/lib/utils/auth/hooks/useRefresh.ts @@ -0,0 +1,44 @@ +// useLogin.ts +import { useState, useCallback } from 'react'; +import { + ApiError, + APIResponse, + apiClient, + isApiResponse, + isApiError, +} from '..'; + +interface UseRefresh { + isLoading: boolean; + error: ApiError | null; + data: APIResponse | null; + refresh: () => Promise; +} + +export const useRefresh = (): UseRefresh => { + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const [data, setData] = useState(null); + + const refresh = useCallback((): Promise => { + setIsLoading(true); + setError(null); + setData(null); + + return apiClient() + .post('v1/auth/token/refresh') + .then(res => { + if (isApiResponse(res)) { + setData(res); + } else if (isApiError(res)) { + setError(res); + } else { + setError({ message: 'Received unknown response structure.' }); + } + }) + .catch(() => setError({ message: 'Network or unexpected error' })) + .finally(() => setIsLoading(false)); + }, []); + + return { isLoading, error, data, refresh }; +}; diff --git a/src/lib/utils/auth/hooks/useRegister.ts b/src/lib/utils/auth/hooks/useRegister.ts new file mode 100644 index 0000000..bfe6ac0 --- /dev/null +++ b/src/lib/utils/auth/hooks/useRegister.ts @@ -0,0 +1,50 @@ +// useLogin.ts +import { useState, useCallback } from 'react'; +import { + ApiError, + APIResponse, + apiClient, + isApiResponse, + isApiError, +} from '..'; + +export interface RegisterRequest { + email: string; + code: string; + password: string; +} + +interface UseRegister { + isLoading: boolean; + error: ApiError | null; + data: APIResponse | null; + register: (payload: RegisterRequest) => Promise; +} + +export const useRegister = (): UseRegister => { + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const [data, setData] = useState(null); + + const register = useCallback((payload: RegisterRequest): Promise => { + setIsLoading(true); + setError(null); + setData(null); + + return apiClient() + .post('v1/auth/register', payload) + .then(res => { + if (isApiResponse(res)) { + setData(res); + } else if (isApiError(res)) { + setError(res); + } else { + setError({ message: 'Received unknown response structure.' }); + } + }) + .catch(() => setError({ message: 'Network or unexpected error' })) + .finally(() => setIsLoading(false)); + }, []); + + return { isLoading, error, data, register }; +}; diff --git a/src/lib/utils/auth/hooks/useReset.ts b/src/lib/utils/auth/hooks/useReset.ts new file mode 100644 index 0000000..75902b6 --- /dev/null +++ b/src/lib/utils/auth/hooks/useReset.ts @@ -0,0 +1,50 @@ +// useLogin.ts +import { useState, useCallback } from 'react'; +import { + ApiError, + APIResponse, + apiClient, + isApiResponse, + isApiError, +} from '..'; + +export interface ResetRequest { + email: string; + password: string; + code: string; +} + +interface UseResetReturn { + isLoading: boolean; + error: ApiError | null; + data: APIResponse | null; + reset: (payload: ResetRequest) => Promise; +} + +export const useReset = (): UseResetReturn => { + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const [data, setData] = useState(null); + + const reset = useCallback((payload: ResetRequest): Promise => { + setIsLoading(true); + setError(null); + setData(null); + + return apiClient() + .patch('v1/auth/reset', payload) + .then(res => { + if (isApiResponse(res)) { + setData(res); + } else if (isApiError(res)) { + setError(res); + } else { + setError({ message: 'Received unknown response structure.' }); + } + }) + .catch(() => setError({ message: 'Network or unexpected error' })) + .finally(() => setIsLoading(false)); + }, []); + + return { isLoading, error, data, reset }; +}; diff --git a/src/lib/utils/auth/hooks/useSendEmailCode.ts b/src/lib/utils/auth/hooks/useSendEmailCode.ts new file mode 100644 index 0000000..9063bd2 --- /dev/null +++ b/src/lib/utils/auth/hooks/useSendEmailCode.ts @@ -0,0 +1,55 @@ +// useLogin.ts +import { useState, useCallback } from 'react'; +import { + ApiError, + APIResponse, + apiClient, + isApiResponse, + isApiError, + OTPTypes, +} from '..'; + +export interface SendEmailCodeRequest { + email: string; + kind: number; +} + +interface UseSendEmailCode { + isLoading: boolean; + error: ApiError | null; + data: APIResponse | null; + sendEmailCode: (email: string, kind: number) => Promise; +} + +export const useSendEmailCode = (): UseSendEmailCode => { + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const [data, setData] = useState(null); + + const sendEmailCode = useCallback( + (email: string, kind: OTPTypes): Promise => { + const payload: SendEmailCodeRequest = { email, kind }; + + setIsLoading(true); + setError(null); + setData(null); + + return apiClient() + .post('v1/auth/send-email-code', payload) + .then(res => { + if (isApiResponse(res)) { + setData(res); + } else if (isApiError(res)) { + setError(res); + } else { + setError({ message: 'Received unknown response structure.' }); + } + }) + .catch(() => setError({ message: 'Network or unexpected error' })) + .finally(() => setIsLoading(false)); + }, + [], + ); + + return { isLoading, error, data, sendEmailCode }; +}; diff --git a/src/lib/utils/auth/hooks/useSession.ts b/src/lib/utils/auth/hooks/useSession.ts new file mode 100644 index 0000000..07400f7 --- /dev/null +++ b/src/lib/utils/auth/hooks/useSession.ts @@ -0,0 +1,65 @@ +import { useState, useEffect } from 'react'; +import { + ApiError, + APIResponse, + apiClient, + isApiResponse, + isApiError, +} from '..'; + +interface UseSession { + isLoading: boolean; + error: ApiError | null; + data: APIResponse | null; + isAuthenticated: boolean; +} + +/** + * useSession + * ---------- + * Automatically checks the user's session on mount. + * Returns only state — no internal navigation or manual triggers. + */ +export const useSession = (): UseSession => { + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(null); + const [data, setData] = useState(null); + + useEffect(() => { + let isMounted = true; + + apiClient() + .get('v1/auth/session') + .then(res => { + if (!isMounted) return; + + if (isApiResponse(res)) { + setData(res); + setError(null); + } else if (isApiError(res)) { + setError(res); + setData(null); + } else { + setError({ message: 'Received unknown response structure.' }); + setData(null); + } + }) + .catch(() => { + if (isMounted) { + setError({ message: 'Network or unexpected error' }); + setData(null); + } + }) + .finally(() => { + if (isMounted) setIsLoading(false); + }); + + return () => { + isMounted = false; + }; + }, []); + + const isAuthenticated = !!data && !error; + + return { isLoading, error, data, isAuthenticated }; +}; diff --git a/src/lib/utils/auth/hooks/useUpdateClient.ts b/src/lib/utils/auth/hooks/useUpdateClient.ts new file mode 100644 index 0000000..7682925 --- /dev/null +++ b/src/lib/utils/auth/hooks/useUpdateClient.ts @@ -0,0 +1,63 @@ +import { useState, useCallback } from 'react'; +import { + ApiError, + APIResponse, + apiClient, + isApiResponse, + isApiError, +} from '..'; + +export interface UpdateClientRequest { + client_name: string; + redirect_uri: string; + regenerate_secret: boolean; +} + +export interface UpdateClientResponse { + client_secret?: string; +} + +interface UseUpdateClient { + isLoading: boolean; + error: ApiError | null; + data: APIResponse | null; + updateClient: ( + clientId: string, + payload: UpdateClientRequest, + ) => Promise; +} + +export const useUpdateClient = (): UseUpdateClient => { + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const [data, setData] = useState | null>( + null, + ); + + const updateClient = useCallback( + (clientId: string, payload: UpdateClientRequest): Promise => { + setIsLoading(true); + setError(null); + setData(null); + + const url = `v1/client/${clientId}`; + + return apiClient() + .patch(url, payload) + .then(res => { + if (isApiResponse(res)) { + setData(res); + } else if (isApiError(res)) { + setError(res); + } else { + setError({ message: 'Received unknown response structure.' }); + } + }) + .catch(() => setError({ message: 'Network or unexpected error' })) + .finally(() => setIsLoading(false)); + }, + [], + ); + + return { isLoading, error, data, updateClient }; +}; diff --git a/src/lib/utils/auth/hooks/useUpdateCurrentUser.ts b/src/lib/utils/auth/hooks/useUpdateCurrentUser.ts new file mode 100644 index 0000000..549dc4d --- /dev/null +++ b/src/lib/utils/auth/hooks/useUpdateCurrentUser.ts @@ -0,0 +1,69 @@ +import { useState, useCallback } from 'react'; +import { + ApiError, + APIResponse, + apiClient, + isApiResponse, + isApiError, +} from '..'; + +export interface UpdateUserRequest { + nickname: string; + code?: string; + email?: string; + old_password?: string; + password?: string; +} + +interface UseUpdateCurrentUser { + isLoading: boolean; + error: ApiError | null; + data: APIResponse | null; + updateCurrentUser: (payload: UpdateUserRequest) => Promise; +} + +export const useUpdateCurrentUser = (): UseUpdateCurrentUser => { + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const [data, setData] = useState(null); + + const updateCurrentUser = useCallback( + (payload: UpdateUserRequest): Promise => { + if (payload.email && !payload.code) { + setError({ + message: 'Verification code is required when updating email.', + }); + return Promise.resolve(); + } + if (payload.password && !payload.old_password) { + setError({ + message: 'Old password is required when updating password.', + }); + return Promise.resolve(); + } + + setIsLoading(true); + setError(null); + setData(null); + + const url = 'v1/user/me'; + + return apiClient() + .patch(url, payload) + .then(res => { + if (isApiResponse(res)) { + setData(res); + } else if (isApiError(res)) { + setError(res); + } else { + setError({ message: 'Received unknown response structure.' }); + } + }) + .catch(() => setError({ message: 'Network or unexpected error' })) + .finally(() => setIsLoading(false)); + }, + [], + ); + + return { isLoading, error, data, updateCurrentUser }; +}; diff --git a/src/lib/utils/auth/hooks/useUpdateUserRole.ts b/src/lib/utils/auth/hooks/useUpdateUserRole.ts new file mode 100644 index 0000000..40f6012 --- /dev/null +++ b/src/lib/utils/auth/hooks/useUpdateUserRole.ts @@ -0,0 +1,65 @@ +import { useState, useCallback } from 'react'; +import { + ApiError, + APIResponse, + apiClient, + isApiResponse, + isApiError, +} from '..'; + +export interface HandleUpdateRoleRequest { + role: string; +} + +interface UseUpdateUserRole { + isLoading: boolean; + error: ApiError | null; + data: APIResponse | null; + updateUserRole: ( + userId: string, + payload: HandleUpdateRoleRequest, + ) => Promise; +} + +export const useUpdateUserRole = (): UseUpdateUserRole => { + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const [data, setData] = useState(null); + + const updateUserRole = useCallback( + (userId: string, payload: HandleUpdateRoleRequest): Promise => { + if (!userId) { + setError({ message: 'User ID is required.' }); + return Promise.resolve(); + } + + if (!payload?.role) { + setError({ message: 'Role field is required.' }); + return Promise.resolve(); + } + + setIsLoading(true); + setError(null); + setData(null); + + const url = `v1/admin/users/${userId}/role`; + + return apiClient() + .patch(url, payload) + .then(res => { + if (isApiResponse(res)) { + setData(res); + } else if (isApiError(res)) { + setError(res); + } else { + setError({ message: 'Received unknown response structure.' }); + } + }) + .catch(() => setError({ message: 'Network or unexpected error' })) + .finally(() => setIsLoading(false)); + }, + [], + ); + + return { isLoading, error, data, updateUserRole }; +}; diff --git a/src/lib/utils/auth/index.ts b/src/lib/utils/auth/index.ts new file mode 100644 index 0000000..d500d74 --- /dev/null +++ b/src/lib/utils/auth/index.ts @@ -0,0 +1,193 @@ +// apiClient.ts +export type APIResponseType = 'A' | 'B' | 'C' | 'S' | 'V'; + +export enum APIStatusCode { + // Generic + OK = 0, + Default = 1000, + InvalidRequest = 1001, + NotFound = 1002, + Conflict = 1003, + RateLimited = 1004, + ValidationFailed = 1005, + + // Authentication / Authorization + Unauthorized = 2000, + Forbidden = 2001, + TokenExpired = 2002, + TokenInvalid = 2003, + SessionExpired = 2004, + + // Server Errors + InternalError = 3000, + DBError = 3001, + CacheError = 3002, + ServiceDown = 3003, +} + +export enum OTPTypes { + OTPRegister = 3, + OTPResetPassword = 7, + OTPNewEmail = 9, + OTPDataRequest = 15, + OTPDeleteRequest = 19, +} + +export interface APIResponse { + data?: T; + msg: string; + status: APIStatusCode; + type: APIResponseType; +} + +export interface ApiError { + message: string; + status?: number; + code?: APIStatusCode; + type?: APIResponseType; +} + +export interface ApiClientOptions { + baseUrl?: string; + headers?: Record; + token?: string; +} + +// ---------- Type Guards ---------- + +/** + * Runtime type guard for checking if a value is a valid APIResponse. + */ +export function isApiResponse(obj: any): obj is APIResponse { + return ( + typeof obj === 'object' && + obj !== null && + typeof obj.msg === 'string' && + typeof obj.status === 'number' && + typeof obj.type === 'string' && + ['A', 'B', 'C', 'S', 'V'].includes(obj.type) + ); +} + +/** + * Runtime type guard for checking if a value is an ApiError. + */ +export function isApiError(obj: any): obj is ApiError { + return ( + typeof obj === 'object' && obj !== null && typeof obj.message === 'string' + ); +} + +// ---------- API Client ---------- + +export class ApiClient { + private baseUrl: string; + private headers: Record; + + constructor(options: ApiClientOptions = {}) { + this.baseUrl = options.baseUrl || 'https://auth.etwo.dev/api/'; + this.headers = { + 'Content-Type': 'application/json', + ...(options.headers || {}), + }; + + if (options.token) { + this.headers['Authorization'] = `Bearer ${options.token}`; + } + } + + private async handleResponse( + res: Response, + ): Promise | ApiError> { + return res + .json() + .then((json: any) => { + if (isApiResponse(json)) { + if (!res.ok || json.status !== APIStatusCode.OK) { + return { + message: json.msg || res.statusText, + status: res.status, + code: json.status, + type: json.type, + } as ApiError; + } + return json; + } + + // Response was not a valid APIResponse + return { + message: 'Unexpected response structure from server.', + status: res.status, + } as ApiError; + }) + .catch(() => ({ + message: 'Invalid JSON response from server.', + status: res.status, + })); + } + + get( + path: string, + config?: RequestInit, + ): Promise | ApiError> { + return fetch(`${this.baseUrl}${path}`, { + ...config, + method: 'GET', + headers: this.headers, + }).then(res => this.handleResponse(res)); + } + + post( + path: string, + body?: any, + config?: RequestInit, + ): Promise | ApiError> { + return fetch(`${this.baseUrl}${path}`, { + ...config, + method: 'POST', + headers: this.headers, + body: body ? JSON.stringify(body) : undefined, + }).then(res => this.handleResponse(res)); + } + + patch( + path: string, + body?: any, + config?: RequestInit, + ): Promise | ApiError> { + return fetch(`${this.baseUrl}${path}`, { + ...config, + method: 'PATCH', + headers: this.headers, + body: body ? JSON.stringify(body) : undefined, + }).then(res => this.handleResponse(res)); + } + + put( + path: string, + body?: any, + config?: RequestInit, + ): Promise | ApiError> { + return fetch(`${this.baseUrl}${path}`, { + ...config, + method: 'PUT', + headers: this.headers, + body: body ? JSON.stringify(body) : undefined, + }).then(res => this.handleResponse(res)); + } + + delete( + path: string, + body?: any, + config?: RequestInit, + ): Promise | ApiError> { + return fetch(`${this.baseUrl}${path}`, { + ...config, + method: 'DELETE', + headers: this.headers, + body: body ? JSON.stringify(body) : undefined, + }).then(res => this.handleResponse(res)); + } +} + +export const apiClient = (options?: ApiClientOptions) => new ApiClient(options); diff --git a/src/lib/utils/copyToClipboard/index.ts b/src/lib/utils/copyToClipboard/index.ts new file mode 100755 index 0000000..ad2b134 --- /dev/null +++ b/src/lib/utils/copyToClipboard/index.ts @@ -0,0 +1,39 @@ +/** + * Copies a given string to the system clipboard. + * + * This function first attempts to use the modern Clipboard API (`navigator.clipboard.writeText`) + * if it is available and the context is secure (i.e., HTTPS). If that is not possible, + * it falls back to creating a temporary `