From cb387c69b9ce7ecab029c343d08ef49ac421a3fe Mon Sep 17 00:00:00 2001 From: shreeyash07 Date: Tue, 5 Nov 2024 16:03:42 +0545 Subject: [PATCH 1/3] Update githib ci.yml --- .github/workflows/ci.yml | 11 +++++------ env.ts | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 51938e5b..c191a424 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,6 +9,7 @@ on: env: APP_TITLE: ${{ vars.APP_TITLE }} APP_GRAPHQL_CODEGEN_ENDPOINT: ${{ vars.APP_GRAPHQL_CODEGEN_ENDPOINT }} + APP_GRAPHQL_ENDPOINT: ${{ vars.APP_GRAPHQL_ENDPOINT }} GITHUB_WORKFLOW: true jobs: @@ -17,8 +18,6 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - with: - submodules: true - uses: pnpm/action-setup@v4 name: Install pnpm @@ -56,7 +55,7 @@ jobs: run: pnpm install - name: Run knip - run: pnpm lint:unused + run: pnpm generate:type && pnpm lint:unused lint-js: name: Lint JS environment: 'test' @@ -79,7 +78,7 @@ jobs: run: pnpm install - name: Lint Javascript - run: pnpm lint:js + run: pnpm generate:type && pnpm lint:js css-lint: name: Lint CSS environment: 'test' @@ -123,7 +122,7 @@ jobs: run: pnpm install - name: Lint Javascript - run: pnpm typecheck + run: pnpm generate:type && pnpm typecheck build: name: Build environment: 'test' @@ -147,4 +146,4 @@ jobs: run: pnpm install - name: Build - run: pnpm build + run: pnpm generate:type && pnpm build diff --git a/env.ts b/env.ts index e55c80e6..3a233f53 100644 --- a/env.ts +++ b/env.ts @@ -5,5 +5,5 @@ import { export default defineConfig({ COMPOSE_FILE: Schema.string.optional(), - APP_TITLE: Schema.string(), + APP_TITLE: Schema.string.optional(), }); From 209f71117d64857e8fc104a7cf2ce352e8a72259 Mon Sep 17 00:00:00 2001 From: shreeyash07 Date: Wed, 6 Nov 2024 17:04:32 +0545 Subject: [PATCH 2/3] - Add login and logout page and mutation - Add toggle-ui and toggle-form - Add Auth wrapper - Update routes functions --- backend | 2 +- package.json | 4 +- pnpm-lock.yaml | 221 +++++++++++++++++++++++ src/App/index.tsx | 19 +- src/App/routes.tsx | 61 ------- src/App/routes/Auth.tsx | 45 +++++ src/App/{ => routes}/PageError/index.tsx | 0 src/App/routes/common.tsx | 52 ++++++ src/App/routes/index.tsx | 47 +++++ src/components/Navbar/index.tsx | 97 ++++++++++ src/components/Navbar/styles.module.css | 9 + src/contexts/route.tsx | 10 + src/hooks/useAuth.ts | 20 ++ src/index.css | 1 + src/utils/routes.tsx | 214 +++++++++++++++++----- src/views/Home/index.tsx | 10 +- src/views/Login/index.tsx | 159 +++++++++++++++- src/views/Registration/index.tsx | 0 src/views/Root/index.tsx | 11 -- src/views/Root/styles.module.css | 25 --- src/views/RootLayout/index.tsx | 17 ++ src/views/RootLayout/styles.module.css | 14 ++ tsconfig.json | 5 +- 23 files changed, 876 insertions(+), 167 deletions(-) delete mode 100644 src/App/routes.tsx create mode 100644 src/App/routes/Auth.tsx rename src/App/{ => routes}/PageError/index.tsx (100%) create mode 100644 src/App/routes/common.tsx create mode 100644 src/App/routes/index.tsx create mode 100644 src/components/Navbar/index.tsx create mode 100644 src/components/Navbar/styles.module.css create mode 100644 src/contexts/route.tsx create mode 100644 src/hooks/useAuth.ts create mode 100644 src/views/Registration/index.tsx delete mode 100644 src/views/Root/index.tsx delete mode 100644 src/views/Root/styles.module.css create mode 100644 src/views/RootLayout/index.tsx create mode 100644 src/views/RootLayout/styles.module.css diff --git a/backend b/backend index 46978245..873bd72f 160000 --- a/backend +++ b/backend @@ -1 +1 @@ -Subproject commit 46978245a0edd70b59493b0ee329bdd7509ffef2 +Subproject commit 873bd72f6c479747dc7e40f611ddf7b438e8a9fb diff --git a/package.json b/package.json index bbdbde42..2b3fec0d 100644 --- a/package.json +++ b/package.json @@ -23,8 +23,10 @@ }, "dependencies": { "@apollo/client": "^3.11.8", - "@togglecorp/fujs": "^2.0.0", "@julr/vite-plugin-validate-env": "^1.1.1", + "@togglecorp/fujs": "^2.0.0", + "@togglecorp/toggle-form": "^2.0.4", + "@togglecorp/toggle-ui": "^0.18.3", "graphql": "^16.9.0", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 135726bc..fed87ce4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,12 @@ importers: '@togglecorp/fujs': specifier: ^2.0.0 version: 2.0.0 + '@togglecorp/toggle-form': + specifier: ^2.0.4 + version: 2.0.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@togglecorp/toggle-ui': + specifier: ^0.18.3 + version: 0.18.3(@types/react@18.0.28)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) graphql: specifier: ^16.9.0 version: 16.9.0 @@ -498,6 +504,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/runtime-corejs3@7.26.0': + resolution: {integrity: sha512-YXHu5lN8kJCb1LOb9PgV6pvak43X2h4HvRApcN5SdWeaItQOzfn1hgP6jasD6KWQyJDBxrVmA9o9OivlnNJK/w==} + engines: {node: '>=6.9.0'} + '@babel/runtime@7.25.7': resolution: {integrity: sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==} engines: {node: '>=6.9.0'} @@ -1476,9 +1486,30 @@ packages: '@swc/types@0.1.13': resolution: {integrity: sha512-JL7eeCk6zWCbiYQg2xQSdLXQJl8Qoc9rXmG2cEKvHe3CKwMHwHGpfOb8frzNLmbycOo6I51qxnLnn9ESf4I20Q==} + '@tanem/svg-injector@10.1.68': + resolution: {integrity: sha512-UkJajeR44u73ujtr5GVSbIlELDWD/mzjqWe54YMK61ljKxFcJoPd9RBSaO7xj02ISCWUqJW99GjrS+sVF0UnrA==} + + '@togglecorp/fujs@1.9.3': + resolution: {integrity: sha512-gPoQwZ5+CbDxXrLyHhGIAHq2HNba1ifZQizpspyWO8cOuhYyCihOAlBS3fH+WewlCvPiQiOD/FkxCnNQAG3lOg==} + '@togglecorp/fujs@2.0.0': resolution: {integrity: sha512-Fx5SF9kusbf35uT2WYlI6gdqqSL/e3JN4urAyB2O+jPz1VkG2I85VRqFxGjrg4m/ZZH+HRyGgLhSDn2V8LNdjA==} + '@togglecorp/fujs@2.2.0': + resolution: {integrity: sha512-OuoQ9Bj7SiI2sTLpaM/HivU6HpSbZ3ANBIn7f9KUz5eFcfwBBEDvjI+4ah6WktJEYTUKY4RxX37z64qOrTJSwA==} + + '@togglecorp/toggle-form@2.0.4': + resolution: {integrity: sha512-+EzRzXK/PKlisu44yARpxOkoeowz+0oKk2Rl3CdhxtBfTVfzG28aHAklDTubTBssS8hneGBTav2aInCqmwChfg==} + peerDependencies: + react: ^18.2.0 + react-dom: ^18.2.0 + + '@togglecorp/toggle-ui@0.18.3': + resolution: {integrity: sha512-fRnKVmuoUhG10Z0a2op/CB7Mnoo4c5mGTD2nFBURm3FzwTWNrg2qZ0JYeKQdng6VOLxL1zTR5QSBsoGzQ0YPHA==} + peerDependencies: + react: ^17.0.2 + react-dom: ^17.0.2 + '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -1503,6 +1534,9 @@ packages: '@types/react@18.0.28': resolution: {integrity: sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==} + '@types/requestidlecallback@0.3.7': + resolution: {integrity: sha512-5/EwNH3H/+M2zxATq9UidyD7rCq3WhK5Te/XhdhqP270QoGInVkoNBj6kK2Ah5slkZewkX8XJb7WDaYhmJu+eg==} + '@types/scheduler@0.23.0': resolution: {integrity: sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw==} @@ -2051,9 +2085,16 @@ packages: constant-case@3.0.4: resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + core-js-pure@3.39.0: + resolution: {integrity: sha512-7fEcWwKI4rJinnK+wLTezeg2smbFFdSBP6E2kQZNbnzM2s1rpKQ6aaRteZSSg7FLU3P0HGGVo/gbpfanU36urg==} + core-util-is@1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} @@ -2136,6 +2177,30 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-axis@2.1.0: + resolution: {integrity: sha512-z/G2TQMyuf0X3qP+Mh+2PimoJD41VOCjViJzT0BHeL/+JQAofkiWZbWxlwFGb1N8EN+Cl/CW+MUKbVzr1689Cw==} + + d3-color@2.0.0: + resolution: {integrity: sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==} + + d3-format@2.0.0: + resolution: {integrity: sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA==} + + d3-interpolate@2.0.1: + resolution: {integrity: sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==} + + d3-scale@3.3.0: + resolution: {integrity: sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==} + + d3-time-format@3.0.0: + resolution: {integrity: sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==} + + d3-time@2.1.1: + resolution: {integrity: sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==} + damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -2557,6 +2622,9 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} + file-saver@2.0.5: + resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -2897,6 +2965,9 @@ packages: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} @@ -3917,6 +3988,11 @@ packages: peerDependencies: react: ^18.2.0 + react-icons@4.12.0: + resolution: {integrity: sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==} + peerDependencies: + react: '*' + react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -3936,6 +4012,12 @@ packages: peerDependencies: react: '>=16.8' + react-textarea-autosize@8.5.4: + resolution: {integrity: sha512-eSSjVtRLcLfFwFcariT77t9hcbVJHQV76b51QjQGarQIHml2+gM2lms0n3XrhnDmgK5B+/Z7TmQk5OHNzqYm/A==} + engines: {node: '>=10'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react@18.2.0: resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} @@ -4010,6 +4092,9 @@ packages: require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -4573,6 +4658,29 @@ packages: urlpattern-polyfill@10.0.0: resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} + use-composed-ref@1.3.0: + resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + use-isomorphic-layout-effect@1.1.2: + resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-latest@1.2.1: + resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -5342,6 +5450,11 @@ snapshots: '@babel/core': 7.25.8 '@babel/helper-plugin-utils': 7.25.9 + '@babel/runtime-corejs3@7.26.0': + dependencies: + core-js-pure: 3.39.0 + regenerator-runtime: 0.14.1 + '@babel/runtime@7.25.7': dependencies: regenerator-runtime: 0.14.1 @@ -6432,10 +6545,46 @@ snapshots: dependencies: '@swc/counter': 0.1.3 + '@tanem/svg-injector@10.1.68': + dependencies: + '@babel/runtime': 7.25.7 + content-type: 1.0.5 + tslib: 2.8.0 + + '@togglecorp/fujs@1.9.3': {} + '@togglecorp/fujs@2.0.0': dependencies: '@babel/runtime': 7.25.7 + '@togglecorp/fujs@2.2.0': + dependencies: + '@babel/runtime-corejs3': 7.26.0 + + '@togglecorp/toggle-form@2.0.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@babel/runtime-corejs3': 7.26.0 + '@togglecorp/fujs': 2.2.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + '@togglecorp/toggle-ui@0.18.3(@types/react@18.0.28)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@babel/runtime-corejs3': 7.26.0 + '@tanem/svg-injector': 10.1.68 + '@togglecorp/fujs': 1.9.3 + '@types/requestidlecallback': 0.3.7 + d3-axis: 2.1.0 + d3-scale: 3.3.0 + file-saver: 2.0.5 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-icons: 4.12.0(react@18.2.0) + react-textarea-autosize: 8.5.4(@types/react@18.0.28)(react@18.2.0) + resize-observer-polyfill: 1.5.1 + transitivePeerDependencies: + - '@types/react' + '@types/estree@1.0.6': {} '@types/js-yaml@4.0.9': {} @@ -6458,6 +6607,8 @@ snapshots: '@types/scheduler': 0.23.0 csstype: 3.1.3 + '@types/requestidlecallback@0.3.7': {} + '@types/scheduler@0.23.0': {} '@types/semver@7.5.8': {} @@ -7121,8 +7272,12 @@ snapshots: tslib: 2.8.0 upper-case: 2.0.2 + content-type@1.0.5: {} + convert-source-map@2.0.0: {} + core-js-pure@3.39.0: {} + core-util-is@1.0.2: {} core-util-is@1.0.3: {} @@ -7198,6 +7353,36 @@ snapshots: csstype@3.1.3: {} + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + + d3-axis@2.1.0: {} + + d3-color@2.0.0: {} + + d3-format@2.0.0: {} + + d3-interpolate@2.0.1: + dependencies: + d3-color: 2.0.0 + + d3-scale@3.3.0: + dependencies: + d3-array: 2.12.1 + d3-format: 2.0.0 + d3-interpolate: 2.0.1 + d3-time: 2.1.1 + d3-time-format: 3.0.0 + + d3-time-format@3.0.0: + dependencies: + d3-time: 2.1.1 + + d3-time@2.1.1: + dependencies: + d3-array: 2.12.1 + damerau-levenshtein@1.0.8: {} dashdash@1.14.1: @@ -7763,6 +7948,8 @@ snapshots: dependencies: flat-cache: 4.0.1 + file-saver@2.0.5: {} + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -8139,6 +8326,8 @@ snapshots: hasown: 2.0.2 side-channel: 1.0.6 + internmap@1.0.1: {} + invariant@2.2.4: dependencies: loose-envify: 1.4.0 @@ -9216,6 +9405,10 @@ snapshots: react: 18.2.0 scheduler: 0.23.2 + react-icons@4.12.0(react@18.2.0): + dependencies: + react: 18.2.0 + react-is@16.13.1: {} react-is@18.3.1: {} @@ -9232,6 +9425,15 @@ snapshots: '@remix-run/router': 1.6.1 react: 18.2.0 + react-textarea-autosize@8.5.4(@types/react@18.0.28)(react@18.2.0): + dependencies: + '@babel/runtime': 7.25.7 + react: 18.2.0 + use-composed-ref: 1.3.0(react@18.2.0) + use-latest: 1.2.1(@types/react@18.0.28)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + react@18.2.0: dependencies: loose-envify: 1.4.0 @@ -9325,6 +9527,8 @@ snapshots: require-main-filename@2.0.0: {} + resize-observer-polyfill@1.5.1: {} + resolve-from@4.0.0: {} resolve-from@5.0.0: {} @@ -9959,6 +10163,23 @@ snapshots: urlpattern-polyfill@10.0.0: {} + use-composed-ref@1.3.0(react@18.2.0): + dependencies: + react: 18.2.0 + + use-isomorphic-layout-effect@1.1.2(@types/react@18.0.28)(react@18.2.0): + dependencies: + react: 18.2.0 + optionalDependencies: + '@types/react': 18.0.28 + + use-latest@1.2.1(@types/react@18.0.28)(react@18.2.0): + dependencies: + react: 18.2.0 + use-isomorphic-layout-effect: 1.1.2(@types/react@18.0.28)(react@18.2.0) + optionalDependencies: + '@types/react': 18.0.28 + util-deprecate@1.0.2: {} uuid@3.4.0: {} diff --git a/src/App/index.tsx b/src/App/index.tsx index ccf2f820..454fd90b 100644 --- a/src/App/index.tsx +++ b/src/App/index.tsx @@ -13,16 +13,17 @@ import { useQuery, } from '@apollo/client'; +import RouteContext from '#contexts/route'; +import UserContext, { + UserAuth, + UserContextProps, +} from '#contexts/user'; import { MeQuery, MeQueryVariables, } from '#generated/types/graphql'; -import UserContext, { - UserAuth, - UserContextProps, -} from '../contexts/user'; -import { unwrappedRoutes } from './routes'; +import wrappedRoutes, { unwrappedRoutes } from './routes'; const ME_QUERY = gql` query Me { @@ -75,9 +76,11 @@ function App() { ); return ( - - - + + + + + ); } diff --git a/src/App/routes.tsx b/src/App/routes.tsx deleted file mode 100644 index d9c52c59..00000000 --- a/src/App/routes.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import type { - MyInputIndexRouteObject, - MyInputNonIndexRouteObject, - MyInputRouteObject, - MyOutputIndexRouteObject, - MyOutputNonIndexRouteObject, - MyOutputRouteObject, -} from '#utils/routes'; -import { - unwrapRoute, - wrapRoute, -} from '#utils/routes'; - -import PageError from './PageError'; - -// NOTE: setting default ExtendedProps -type ExtendedProps = { name?: string }; -interface MyWrapRoute { - ( - myRouteOptions: MyInputIndexRouteObject - ): MyOutputIndexRouteObject - ( - myRouteOptions: MyInputNonIndexRouteObject - ): MyOutputNonIndexRouteObject - ( - myRouteOptions: MyInputRouteObject, - ): MyOutputRouteObject -} -const myWrapRoute: MyWrapRoute = wrapRoute; - -const root = myWrapRoute({ - title: '', - path: '/', - component: () => import('#views/Root'), - componentProps: {}, - errorElement: , -}); - -const home = myWrapRoute({ - title: 'Home', - index: true, - component: () => import('#views/Home'), - componentProps: {}, - parent: root, -}); - -const login = myWrapRoute({ - title: 'Login', - path: 'login', - component: () => import('#views/Login'), - componentProps: {}, - parent: root, -}); - -export const wrappedRoutes = { - root, - home, - login, -}; - -export const unwrappedRoutes = unwrapRoute(Object.values(wrappedRoutes)); diff --git a/src/App/routes/Auth.tsx b/src/App/routes/Auth.tsx new file mode 100644 index 00000000..22d4f0be --- /dev/null +++ b/src/App/routes/Auth.tsx @@ -0,0 +1,45 @@ +import { + Fragment, + type ReactElement, +} from 'react'; +import { Navigate } from 'react-router-dom'; + +import useAuth from '#hooks/useAuth'; + +import { type ExtendedProps } from './common'; + +interface Props { + children: ReactElement, + context: ExtendedProps, + absolutePath: string, +} +function Auth(props: Props) { + const { + context, + children, + absolutePath, + } = props; + + const { isAuthenticated } = useAuth(); + + if (context.visibility === 'is-authenticated' && !isAuthenticated) { + return ( + + ); + } + if (context.visibility === 'is-not-authenticated' && isAuthenticated) { + return ( + + ); + } + + return ( + + {children} + + ); +} + +export default Auth; diff --git a/src/App/PageError/index.tsx b/src/App/routes/PageError/index.tsx similarity index 100% rename from src/App/PageError/index.tsx rename to src/App/routes/PageError/index.tsx diff --git a/src/App/routes/common.tsx b/src/App/routes/common.tsx new file mode 100644 index 00000000..59a57f5b --- /dev/null +++ b/src/App/routes/common.tsx @@ -0,0 +1,52 @@ +import { + type MyInputIndexRouteObject, + type MyInputNonIndexRouteObject, + type MyOutputIndexRouteObject, + type MyOutputNonIndexRouteObject, + wrapRoute, +} from '#utils/routes'; +import { Component as RootLayout } from '#views/RootLayout'; + +import Auth from './Auth'; +import PageError from './PageError'; + +interface Perms { + isSuperUser: boolean, +} + +export type ExtendedProps = { + title: string, + visibility: 'is-authenticated' | 'is-not-authenticated' | 'anything', + permissions?: ( + permissions: Perms, + params: Record | undefined | null, + ) => boolean; +}; + +interface CustomWrapRoute { + ( + myRouteOptions: MyInputIndexRouteObject + ): MyOutputIndexRouteObject + ( + myRouteOptions: MyInputNonIndexRouteObject + ): MyOutputNonIndexRouteObject +} + +export const customWrapRoute: CustomWrapRoute = wrapRoute; + +// NOTE: We should not use layout or index routes in links + +export const rootLayout = customWrapRoute({ + path: '/', + errorElement: , + component: { + eagerLoad: true, + render: RootLayout, + props: {}, + }, + wrapperComponent: Auth, + context: { + title: 'CMS', + visibility: 'anything', + }, +}); diff --git a/src/App/routes/index.tsx b/src/App/routes/index.tsx new file mode 100644 index 00000000..9ec2a9df --- /dev/null +++ b/src/App/routes/index.tsx @@ -0,0 +1,47 @@ +import { unwrapRoute } from '#utils/routes'; + +import Auth from './Auth'; +import { + customWrapRoute, + rootLayout, +} from './common'; + +const home = customWrapRoute({ + parent: rootLayout, + index: true, + component: { + render: () => import('#views/Home'), + props: {}, + }, + wrapperComponent: Auth, + context: { + title: 'Home', + visibility: 'is-authenticated', + }, +}); + +const login = customWrapRoute({ + parent: rootLayout, + path: 'login', + component: { + render: () => import('#views/Login'), + props: {}, + }, + wrapperComponent: Auth, + context: { + title: 'Login', + visibility: 'is-not-authenticated', + }, +}); + +const wrappedRoutes = { + rootLayout, + home, + login, +}; + +export const unwrappedRoutes = unwrapRoute(Object.values(wrappedRoutes)); + +export default wrappedRoutes; + +export type WrappedRoutes = typeof wrappedRoutes; diff --git a/src/components/Navbar/index.tsx b/src/components/Navbar/index.tsx new file mode 100644 index 00000000..b754b9e5 --- /dev/null +++ b/src/components/Navbar/index.tsx @@ -0,0 +1,97 @@ +import { + useCallback, + useContext, +} from 'react'; +import { Link } from 'react-router-dom'; +import { + gql, + useMutation, +} from '@apollo/client'; +import { _cs, isDefined, isNotDefined } from '@togglecorp/fujs'; +import { Button } from '@togglecorp/toggle-ui'; + +import UserContext from '#contexts/user'; +import { + LogoutMutation, + LogoutMutationVariables, +} from '#generated/types/graphql'; + +import styles from './styles.module.css'; + +interface Props { + className?: string; +} + +const LOGOUT_MUTATION = gql` + mutation logout { + public { + logout { + ok + errors + } + } + } +`; + +function Navbar(props: Props) { + const { className } = props; + const { userAuth, removeUserAuth } = useContext(UserContext); + console.log('user', userAuth); + const [ + logout, + { loading }, + ] = useMutation( + LOGOUT_MUTATION, + { + onCompleted: (response) => { + const { logout: logoutRes } = response.public; + if (!logoutRes) { + return; + } + + const { + ok, + errors, + } = logoutRes; + + if (ok) { + removeUserAuth(); + } + }, + }, + ); + const handleLogoutClick = useCallback(() => { + logout(); + }, [logout]); + return ( + + ); +} + +export default Navbar; diff --git a/src/components/Navbar/styles.module.css b/src/components/Navbar/styles.module.css new file mode 100644 index 00000000..50e20eb8 --- /dev/null +++ b/src/components/Navbar/styles.module.css @@ -0,0 +1,9 @@ +.navbar { + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0px 4px 4px 0px rgba(227, 227, 227, 0.25); + background-color: var(--cms-ui-color-white-card); + padding: var(--cms-ui-spacing-sm) var(--cms-ui-spacing-md); + gap: var(--cms-ui-spacing-md); +} diff --git a/src/contexts/route.tsx b/src/contexts/route.tsx new file mode 100644 index 00000000..4f8c9081 --- /dev/null +++ b/src/contexts/route.tsx @@ -0,0 +1,10 @@ +import { createContext } from 'react'; + +import type { WrappedRoutes } from '../App/routes'; + +const RouteContext = createContext( + // NOTE: we will make sure the route information is passed + {} as WrappedRoutes, +); + +export default RouteContext; diff --git a/src/hooks/useAuth.ts b/src/hooks/useAuth.ts new file mode 100644 index 00000000..0def19b9 --- /dev/null +++ b/src/hooks/useAuth.ts @@ -0,0 +1,20 @@ +import { + useContext, + useMemo, +} from 'react'; +import { isDefined } from '@togglecorp/fujs'; + +import UserContext from '#contexts/user'; + +function useAuth() { + const { userAuth } = useContext(UserContext); + + const isAuthenticated = isDefined(userAuth); + + return useMemo( + () => ({ isAuthenticated }), + [isAuthenticated], + ); +} + +export default useAuth; diff --git a/src/index.css b/src/index.css index 0b6db108..62794618 100644 --- a/src/index.css +++ b/src/index.css @@ -73,6 +73,7 @@ --cms-ui-color-red-600: #FF0000; + --cms-ui-color-white-card: #FFFFFF; --cms-ui-color-white: #FDFDFD; --cms-ui-color-faded-white: #E8E9EA; diff --git a/src/utils/routes.tsx b/src/utils/routes.tsx index b15da793..df04be5a 100644 --- a/src/utils/routes.tsx +++ b/src/utils/routes.tsx @@ -4,6 +4,8 @@ import { RouteObject, } from 'react-router-dom'; import { + isDefined, + isNotDefined, listToMap, mapToList, randomString, @@ -27,35 +29,62 @@ export function joinUrlPart(parts: string[]) { .filter((part) => part !== '') .join('/'); - return url === '' - ? '/' - : `/${url}/`; + return `/${url}`; } type ImmutableRouteKey = 'lazy' | 'caseSensitive' | 'path' | 'id' | 'index' | 'children'; -type OmitInputRouteObjectKeys = 'Component' | 'element' | 'lazy'; +type OmitInputRouteObjectKeys = 'Component' | 'element' | 'lazy' | 'children'; export type MyInputIndexRouteObject = { - title: string; - componentProps: T & JSX.IntrinsicAttributes; - component: () => Promise<{ + wrapperComponent?: (props: { + children: React.ReactElement, + context: K, + absolutePath: string, + }) => React.ReactElement; + component: { + eagerLoad?: false, + render: () => Promise<{ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + Component: (props: T) => React.ReactElement | null; + } & Omit> + props: T & JSX.IntrinsicAttributes; + } | { + eagerLoad: true; // eslint-disable-next-line @typescript-eslint/no-explicit-any - Component: (props: T) => React.ReactElement | null; - } & Omit>; + render: (prop: T) => React.ReactElement | null + props: T & JSX.IntrinsicAttributes; + }; + forwardPath?: string; parent?: MyOutputRouteObject; -} & Omit & K; + context: K; +} & Omit; export type MyInputNonIndexRouteObject = { - title: string; - componentProps: T & JSX.IntrinsicAttributes; - component: () => Promise<{ + wrapperComponent?: (props: { + children: React.ReactElement, + context: K, + absolutePath: string, + }) => React.ReactElement; + component: { + eagerLoad?: false, + render: () => Promise<{ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + Component: (props: T) => React.ReactElement | null; + } & Omit> + props: T & JSX.IntrinsicAttributes; + } | { + eagerLoad: true; // eslint-disable-next-line @typescript-eslint/no-explicit-any - Component: (props: T) => React.ReactElement | null; - } & Omit>; + render: (prop: T) => React.ReactElement | null + props: T & JSX.IntrinsicAttributes; + }; + + forwardPath?: string; parent?: MyOutputRouteObject; -} & Omit & K; + context: K; +} & Omit; -export type MyInputRouteObject = ( +type MyInputRouteObject = ( MyInputIndexRouteObject | MyInputNonIndexRouteObject ); @@ -64,16 +93,18 @@ type OmitOutputRouteObjectKeys = 'Component' | 'element'; export type MyOutputIndexRouteObject = { id: string; absolutePath: string; + absoluteForwardPath: string; parent?: MyOutputRouteObject; } & Omit & K; export type MyOutputNonIndexRouteObject = { id: string; absolutePath: string; + absoluteForwardPath: string; parent?: MyOutputRouteObject; } & Omit & K; -export type MyOutputRouteObject = ( +type MyOutputRouteObject = ( MyOutputIndexRouteObject | MyOutputNonIndexRouteObject ); @@ -88,60 +119,144 @@ export function wrapRoute( ): MyOutputRouteObject { if (myRouteOptions.index) { const { - componentProps, + wrapperComponent: Wrapper, component, parent, + context, + forwardPath, ...remainingRouteOptions } = myRouteOptions; - const lazy = async () => { - const { - Component, - ...otherProps - } = await component(); - return { - ...otherProps, - // eslint-disable-next-line react/jsx-props-no-spreading - element: , + + const absolutePath = parent?.absolutePath ?? '/'; + const absoluteForwardPath = isDefined(forwardPath) + ? joinUrlPart([absolutePath, forwardPath]) + : absolutePath; + + let dynamicProps; + if (component.eagerLoad) { + const Component = component.render; + // eslint-disable-next-line react/jsx-props-no-spreading + const element = ; + // NOTE: Wrapper will only be mounted after waiting for the Component + dynamicProps = { + element: Wrapper + ? ( + + {element} + + ) + : element, }; - }; + } else { + dynamicProps = { + lazy: async () => { + const { + Component, + ...otherProps + } = await component.render(); + + // eslint-disable-next-line react/jsx-props-no-spreading + const element = ; + // NOTE: Wrapper will only be mounted after waiting for the Component + return { + ...otherProps, + element: Wrapper + ? ( + + {element} + + ) + : element, + }; + }, + }; + } return { ...remainingRouteOptions, - lazy, - + ...dynamicProps, + ...context, parent, - absolutePath: parent?.absolutePath ?? '/', + absolutePath, + absoluteForwardPath, id: randomString(), }; } const { - componentProps, + wrapperComponent: Wrapper, component, parent, + context, + forwardPath, ...remainingRouteOptions } = myRouteOptions; - const lazy = async () => { - const { - Component, - ...otherProps - } = await component(); - return { - ...otherProps, - // eslint-disable-next-line react/jsx-props-no-spreading - element: , - }; - }; const absolutePath = parent ? joinUrlPart([parent.absolutePath ?? '/', remainingRouteOptions.path ?? '/']) : remainingRouteOptions.path ?? '/'; + const absoluteForwardPath = isDefined(forwardPath) + ? joinUrlPart([absolutePath, forwardPath]) + : absolutePath; + + let dynamicProps; + if (component.eagerLoad) { + const Component = component.render; + // eslint-disable-next-line react/jsx-props-no-spreading + const element = ; + // NOTE: Wrapper will only be mounted after waiting for the Component + dynamicProps = { + element: Wrapper + ? ( + + {element} + + ) + : element, + }; + } else { + dynamicProps = { + lazy: async () => { + const { + Component, + ...otherProps + } = await component.render(); + + // eslint-disable-next-line react/jsx-props-no-spreading + const element = ; + // NOTE: Wrapper will only be mounted after waiting for the Component + return { + ...otherProps, + element: Wrapper + ? ( + + {element} + + ) + : element, + }; + }, + }; + } return { ...remainingRouteOptions, - lazy, - + ...dynamicProps, + ...context, parent, absolutePath, + absoluteForwardPath, id: randomString(), }; } @@ -152,11 +267,10 @@ export function unwrapRoute( const mapping = listToMap( wrappedRoutes.filter((item) => !item.index), (item) => item.id, - (item) => ({ - ...item, - }), + (item) => item, ); + wrappedRoutes.forEach((route) => { if (route.parent) { const parentId = route.parent.id; @@ -173,7 +287,7 @@ export function unwrapRoute( const results = mapToList( mapping, (item) => item, - ).filter((item) => !item.parent); + ).filter((item) => isNotDefined(item.parent)); return results; } diff --git a/src/views/Home/index.tsx b/src/views/Home/index.tsx index f6c1d56d..0442b657 100644 --- a/src/views/Home/index.tsx +++ b/src/views/Home/index.tsx @@ -1,18 +1,14 @@ -import { Link } from 'react-router-dom'; - -import { wrappedRoutes } from '../../App/routes'; +import Navbar from '#components/Navbar'; /** @knipignore */ // eslint-disable-next-line import/prefer-default-export export function Component() { return ( <> +

- AI CHATBOT CMS + Dashboard

- - Login - ); } diff --git a/src/views/Login/index.tsx b/src/views/Login/index.tsx index 74e6d3e1..aa8180b3 100644 --- a/src/views/Login/index.tsx +++ b/src/views/Login/index.tsx @@ -1,16 +1,171 @@ +import { + useCallback, + useContext, +} from 'react'; import { Link } from 'react-router-dom'; +import { + gql, + useMutation, +} from '@apollo/client'; +import { + createSubmitHandler, + emailCondition, + getErrorObject, + lengthGreaterThanCondition, + lengthSmallerThanCondition, + nonFieldError, + ObjectSchema, + PartialForm, + removeNull, + requiredStringCondition, + useForm, +} from '@togglecorp/toggle-form'; +import { + Button, + PasswordInput, + TextInput, +} from '@togglecorp/toggle-ui'; -import { wrappedRoutes } from '../../App/routes'; +import UserContext from '#contexts/user'; +import { + LoginMutation, + LoginMutationVariables, +} from '#generated/types/graphql'; + +const LOGIN = gql` + mutation Login($input: LoginInput!){ + public { + login(data: $input) { + ok + errors + result { + displayName + email + firstName + id + lastName + } + } + } + } +`; + +type PartialFormType = PartialForm +type FormSchema = ObjectSchema; +type FormSchemaFields = ReturnType; + +const LoginSchema: FormSchema = ({ + fields: (): FormSchemaFields => ({ + email: { + required: true, + requiredValidation: requiredStringCondition, + validations: [emailCondition], + }, + password: { + required: true, + requiredValidation: requiredStringCondition, + validations: [ + // FIXME: Update to 4 + lengthGreaterThanCondition(1), + lengthSmallerThanCondition(129), + ], + }, + }), +}); + +const defaultFormValues: PartialFormType = {}; /** @knipignore */ // eslint-disable-next-line import/prefer-default-export export function Component() { + const { + pristine, + value, + error: riskyError, + setFieldValue, + validate, + setError, + } = useForm(LoginSchema, { value: defaultFormValues }); + + const error = getErrorObject(riskyError); + + const { setUserAuth } = useContext(UserContext); + + const [ + login, + { loading }, + ] = useMutation( + LOGIN, + { + onCompleted: (response) => { + const { login: loginRes } = response.public; + if (!loginRes) { + return; + } + + const { + errors, + result, + ok, + } = loginRes; + + if (errors) { + // const formError = transformToFormError(removeNull(errors) as ObjectError[]); + setError(error); + } else if (ok) { + const safeUser = removeNull(result); + setUserAuth(safeUser); + } + }, + onError: (errors) => { + setError({ + [nonFieldError]: errors.message, + }); + }, + }, + ); + + const handleSubmit = useCallback((finalValue: PartialFormType) => { + login({ + variables: { + input: finalValue as LoginMutationVariables['input'], + }, + }); + }, [login]); + return ( <>

Login

- +
+ + + + + Go to home diff --git a/src/views/Registration/index.tsx b/src/views/Registration/index.tsx new file mode 100644 index 00000000..e69de29b diff --git a/src/views/Root/index.tsx b/src/views/Root/index.tsx deleted file mode 100644 index 0f400433..00000000 --- a/src/views/Root/index.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { Outlet } from 'react-router-dom'; - -/** @knipignore */ -// eslint-disable-next-line import/prefer-default-export -export function Component() { - return ( - - ); -} - -Component.displayName = 'App'; diff --git a/src/views/Root/styles.module.css b/src/views/Root/styles.module.css deleted file mode 100644 index ad7f0efa..00000000 --- a/src/views/Root/styles.module.css +++ /dev/null @@ -1,25 +0,0 @@ -.logo { - transition: filter 300ms; - padding: var(--cms-ui-spacing-sm); - height: 6em; - will-change: filter; - - &:hover { - filter: drop-shadow(0 0 2em var(--cms-ui-color-gray-200)); - } -} - -@keyframes logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 3s linear; - } -} diff --git a/src/views/RootLayout/index.tsx b/src/views/RootLayout/index.tsx new file mode 100644 index 00000000..dfa2426a --- /dev/null +++ b/src/views/RootLayout/index.tsx @@ -0,0 +1,17 @@ +import { Outlet } from 'react-router-dom'; + +import styles from './styles.module.css'; +/** @knipignore */ +// eslint-disable-next-line import/prefer-default-export +export function Component() { + console.log('here'); + return ( +
+
+ +
+
+ ); +} + +Component.displayName = 'Root'; diff --git a/src/views/RootLayout/styles.module.css b/src/views/RootLayout/styles.module.css new file mode 100644 index 00000000..8752fbed --- /dev/null +++ b/src/views/RootLayout/styles.module.css @@ -0,0 +1,14 @@ +.root { + display: flex; + position: relative; + flex-direction: column; + height: 100vh; + overflow: auto; + + .page-content { + display: flex; + flex-direction: column; + flex-grow: 1; + overflow: auto; + } +} diff --git a/tsconfig.json b/tsconfig.json index 7e4a9976..1d22db62 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,7 +4,10 @@ "#generated/*": ["./generated/*"], "#views/*": ["./src/views/*"], "#utils/*": ["./src/utils/*"], - "#configs/*": ["./src/configs/*"] + "#configs/*": ["./src/configs/*"], + "#contexts/*": ["./src/contexts/*"], + "#components/*": ["./src/components/*"], + "#hooks/*": ["./src/hooks/*"] }, "target": "ESNext", From 0e71f6f3671feba4a59e8074718ebbcb713fb445 Mon Sep 17 00:00:00 2001 From: shreeyash07 Date: Mon, 11 Nov 2024 13:37:27 +0545 Subject: [PATCH 3/3] WIP --- backend | 2 +- src/App/index.tsx | 2 + src/assets/loginCover.png | Bin 0 -> 115527 bytes src/components/Container/index.tsx | 90 +++++++++++++ src/components/Container/styles.module.css | 4 + src/components/Header/index.tsx | 123 ++++++++++++++++++ src/components/Header/styles.module.css | 4 + src/components/Heading/index.tsx | 55 ++++++++ src/components/Heading/styles.module.css | 31 +++++ src/components/Navbar/index.tsx | 46 ++++--- src/components/Navbar/styles.module.css | 4 +- src/components/Page/index.tsx | 37 ++++++ src/components/Page/styles.module.css | 13 ++ src/hooks/useBasicLayout/index.tsx | 76 +++++++++++ src/hooks/useBasicLayout/styles.module.css | 20 +++ src/index.css | 14 +- src/views/ContentManagement/index.tsx | 27 ++++ src/views/ContentManagement/styles.module.css | 3 + src/views/Home/index.tsx | 16 ++- src/views/Login/index.tsx | 88 ++++++++----- src/views/Login/styles.module.css | 33 +++++ src/views/RootLayout/index.tsx | 1 - tsconfig.json | 3 +- 23 files changed, 623 insertions(+), 69 deletions(-) create mode 100644 src/assets/loginCover.png create mode 100644 src/components/Container/index.tsx create mode 100644 src/components/Container/styles.module.css create mode 100644 src/components/Header/index.tsx create mode 100644 src/components/Header/styles.module.css create mode 100644 src/components/Heading/index.tsx create mode 100644 src/components/Heading/styles.module.css create mode 100644 src/components/Page/index.tsx create mode 100644 src/components/Page/styles.module.css create mode 100644 src/hooks/useBasicLayout/index.tsx create mode 100644 src/hooks/useBasicLayout/styles.module.css create mode 100644 src/views/ContentManagement/index.tsx create mode 100644 src/views/ContentManagement/styles.module.css create mode 100644 src/views/Login/styles.module.css diff --git a/backend b/backend index 873bd72f..6691acfe 160000 --- a/backend +++ b/backend @@ -1 +1 @@ -Subproject commit 873bd72f6c479747dc7e40f611ddf7b438e8a9fb +Subproject commit 6691acfe8246a8a446eaa69911ce50268ef3ec01 diff --git a/src/App/index.tsx b/src/App/index.tsx index 454fd90b..f63d64e4 100644 --- a/src/App/index.tsx +++ b/src/App/index.tsx @@ -1,3 +1,5 @@ +import '@togglecorp/toggle-ui/build/index.css'; + import { useCallback, useEffect, diff --git a/src/assets/loginCover.png b/src/assets/loginCover.png new file mode 100644 index 0000000000000000000000000000000000000000..e769dc34ec045d012b10594d0f461b8525660fbe GIT binary patch literal 115527 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/mwN3jW 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

US7V%`)mOqFG5Q{Un)syYqJsF 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 z�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 + children?: React.ReactNode; + withHeaderBorder?: boolean, + showHeader?: boolean, + headerDescription?: string; + heading?: React.ReactNode; + headingClassName?: string; + headingContainerClassName?: string; + headingLevel?: HeadingProps['level'], + headingSectionClassName?: string; + icons?: React.ReactNode; + iconsContainerClassName?: string; + headingDescription?: React.ReactNode; + headingDescriptionContainerClassName?: string; + headerDescriptionContainerClassName?: string; + childrenContainerClassName?: string; +} + +function Container(props: Props) { + const { + actions, + actionsContainerClassName, + className, + containerRef, + children, + withHeaderBorder = false, + showHeader, + headerDescription, + heading, + headingLevel, + headingSectionClassName, + headingClassName, + headingContainerClassName, + headingDescription, + headerDescriptionContainerClassName, + headingDescriptionContainerClassName, + icons, + childrenContainerClassName, + iconsContainerClassName, + } = props; + + if (!children) { + return null; + } + + return ( +

+ {showHeader && ( +
+ {headerDescription} +
+ )} + {withHeaderBorder &&
} +
+ {children} +
+
+ ); +} + +export default Container; diff --git a/src/components/Container/styles.module.css b/src/components/Container/styles.module.css new file mode 100644 index 00000000..01f9304e --- /dev/null +++ b/src/components/Container/styles.module.css @@ -0,0 +1,4 @@ +.container { + display: flex; + flex-direction: column; +} diff --git a/src/components/Header/index.tsx b/src/components/Header/index.tsx new file mode 100644 index 00000000..900ad5ba --- /dev/null +++ b/src/components/Header/index.tsx @@ -0,0 +1,123 @@ +import { useMemo } from 'react'; +import { + _cs, + isNotDefined, +} from '@togglecorp/fujs'; + +import Heading, { Props as HeadingProps } from '#components/Heading'; +import useBasicLayout from '#hooks/useBasicLayout'; + +import styles from './styles.module.css'; + +interface Props { + className?: string; + elementRef?: React.Ref; + + children?: React.ReactNode; + childrenContainerClassName?: string; + + actions?: React.ReactNode; + actionsContainerClassName?: string; + + icons?: React.ReactNode; + iconsContainerClassName?: string; + + heading: React.ReactNode; + headingLevel?: HeadingProps['level']; + headingSectionClassName?: string; + headingContainerClassName?: string; + headingClassName?: string; + headingDescription?: React.ReactNode; + headingDescriptionContainerClassName?: string; +} + +function Header(props: Props) { + const { + className, + elementRef, + actions, + actionsContainerClassName, + children, + childrenContainerClassName, + headingLevel, + heading, + headingClassName, + headingSectionClassName, + headingContainerClassName, + headingDescription, + headingDescriptionContainerClassName, + icons, + iconsContainerClassName, + } = props; + + const headingChildren = useMemo( + () => { + if (isNotDefined(heading) && isNotDefined(headingDescription)) { + return null; + } + + return ( + <> + + {heading} + + {headingDescription && ( +
+ {headingDescription} +
+ )} + + ); + }, + [ + heading, + headingDescription, + headingClassName, + headingDescriptionContainerClassName, + headingLevel, + ], + ); + + const { + content, + containerClassName, + } = useBasicLayout({ + actions, + actionsContainerClassName, + children: headingChildren, + childrenContainerClassName: headingContainerClassName, + className: headingSectionClassName, + icons, + iconsContainerClassName, + }); + + if (!content && !children) { + return null; + } + + return ( +
+ {content && ( +
+ {content} +
+ )} + {children && ( +
+ {children} +
+ )} +
+ ); +} + +export default Header; diff --git a/src/components/Header/styles.module.css b/src/components/Header/styles.module.css new file mode 100644 index 00000000..a8b25dca --- /dev/null +++ b/src/components/Header/styles.module.css @@ -0,0 +1,4 @@ +.header { + display: flex; + flex-direction: column; +} diff --git a/src/components/Heading/index.tsx b/src/components/Heading/index.tsx new file mode 100644 index 00000000..ed0e654d --- /dev/null +++ b/src/components/Heading/index.tsx @@ -0,0 +1,55 @@ +import { + ElementType, + ReactNode, + useRef, +} from 'react'; +import { _cs } from '@togglecorp/fujs'; + +import styles from './styles.module.css'; + +export type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6; + +const levelToClassName: Record = { + 1: styles.levelOne, + 2: styles.levelTwo, + 3: styles.levelThree, + 4: styles.levelFour, + 5: styles.levelFive, + 6: styles.levelSix, +}; + +export interface Props { + className?: string; + level?: HeadingLevel; + children: ReactNode; +} + +function Heading(props: Props) { + const { + className, + level = 3, + children, + } = props; + + const HeadingTag = `h${level}` as ElementType; + const headingElementRef = useRef(null); + + if (!children) { + return null; + } + + return ( + + {children} + + ); +} + +export default Heading; diff --git a/src/components/Heading/styles.module.css b/src/components/Heading/styles.module.css new file mode 100644 index 00000000..c2b4a1ce --- /dev/null +++ b/src/components/Heading/styles.module.css @@ -0,0 +1,31 @@ +.heading { + --font-size: var(--cms-ui-font-size-3xl); + --line-height: var(--cms-ui-line-height-sm); + margin: 0; + line-height: var(--line-height); + font-size: var(--font-size); + + &.level-one { + --font-size: var(--cms-ui-font-size-5xl); + } + + &.level-two { + --font-size: var(--cms-ui-font-size-4xl); + } + + &.level-three { + --font-size: var(--cms-ui-font-size-3xl); + } + + &.level-four { + --font-size: var(--cms-ui-font-size-2xl); + } + + &.level-five { + --font-size: var(--cms-ui-font-size-xl); + } + + &.level-six { + --font-size: var(--cms-ui-font-size-lg); + } +} diff --git a/src/components/Navbar/index.tsx b/src/components/Navbar/index.tsx index b754b9e5..fc0addc3 100644 --- a/src/components/Navbar/index.tsx +++ b/src/components/Navbar/index.tsx @@ -7,9 +7,14 @@ import { gql, useMutation, } from '@apollo/client'; -import { _cs, isDefined, isNotDefined } from '@togglecorp/fujs'; +import { + _cs, + isDefined, + isNotDefined, +} from '@togglecorp/fujs'; import { Button } from '@togglecorp/toggle-ui'; +import Heading from '#components/Heading'; import UserContext from '#contexts/user'; import { LogoutMutation, @@ -35,8 +40,9 @@ const LOGOUT_MUTATION = gql` function Navbar(props: Props) { const { className } = props; + const { userAuth, removeUserAuth } = useContext(UserContext); - console.log('user', userAuth); + const [ logout, { loading }, @@ -60,36 +66,34 @@ function Navbar(props: Props) { }, }, ); + const handleLogoutClick = useCallback(() => { logout(); }, [logout]); + return (
); } diff --git a/src/components/Navbar/styles.module.css b/src/components/Navbar/styles.module.css index 50e20eb8..947bb8c3 100644 --- a/src/components/Navbar/styles.module.css +++ b/src/components/Navbar/styles.module.css @@ -1,9 +1,9 @@ .navbar { display: flex; align-items: center; - justify-content: center; + justify-content: space-between; + z-index: 1; box-shadow: 0px 4px 4px 0px rgba(227, 227, 227, 0.25); background-color: var(--cms-ui-color-white-card); padding: var(--cms-ui-spacing-sm) var(--cms-ui-spacing-md); - gap: var(--cms-ui-spacing-md); } diff --git a/src/components/Page/index.tsx b/src/components/Page/index.tsx new file mode 100644 index 00000000..1a4896a2 --- /dev/null +++ b/src/components/Page/index.tsx @@ -0,0 +1,37 @@ +import { + ElementRef, + RefObject, +} from 'react'; +import { _cs } from '@togglecorp/fujs'; + +import styles from './styles.module.css'; + +interface Props { + className?: string; + children?: React.ReactNode; + elementRef?: RefObject>; + leftPaneContent?: React.ReactNode; + leftPaneContainerClassName?: string; +} +function Page(props: Props) { + const { + className, + children, + elementRef, + leftPaneContent, + leftPaneContainerClassName, + } = props; + + return ( +
+ {leftPaneContent && ( +
+ {leftPaneContent} +
+ )} + {children} +
+ ); +} + +export default Page; diff --git a/src/components/Page/styles.module.css b/src/components/Page/styles.module.css new file mode 100644 index 00000000..18364d61 --- /dev/null +++ b/src/components/Page/styles.module.css @@ -0,0 +1,13 @@ +.page { + display: flex; + flex-grow: 1; + + .leftPane { + display: flex; + flex-direction: column; + box-shadow: 0px 4px 4px 0px rgba(227, 227, 227, 0.25); + background-color: var(--cms-ui-color-white-card); + padding: var(--cms-ui-spacing-lg) var(--cms-ui-spacing-md); + gap: var(--cms-ui-spacing-md); + } +} diff --git a/src/hooks/useBasicLayout/index.tsx b/src/hooks/useBasicLayout/index.tsx new file mode 100644 index 00000000..5701663f --- /dev/null +++ b/src/hooks/useBasicLayout/index.tsx @@ -0,0 +1,76 @@ +import { + _cs, + isNotDefined, +} from '@togglecorp/fujs'; + +import styles from './styles.module.css'; + +export interface Props { + className?: string; + icons?: React.ReactNode; + children: React.ReactNode; + actions?: React.ReactNode; + description?: React.ReactNode; + iconsContainerClassName?: string; + childrenContainerClassName?: string; + actionsContainerClassName?: string; +} +function useBasicLayout(props: Props) { + const { + className, + icons, + children, + actions, + iconsContainerClassName, + childrenContainerClassName, + actionsContainerClassName, + } = props; + + const emptyContent = isNotDefined(icons) + && isNotDefined(children) + && isNotDefined(actions); + + const containerClassName = _cs( + styles.basicLayout, + className, + ); + const content = emptyContent ? null : ( + <> + {icons && ( +
+ {icons} +
+ )} +
+ {children} +
+ {actions && ( +
+ {actions} +
+ )} + + ); + + return { + containerClassName, + content, + }; +} + +export default useBasicLayout; diff --git a/src/hooks/useBasicLayout/styles.module.css b/src/hooks/useBasicLayout/styles.module.css new file mode 100644 index 00000000..a198cc3f --- /dev/null +++ b/src/hooks/useBasicLayout/styles.module.css @@ -0,0 +1,20 @@ +.basic-layout { + display: flex; + + .icons-container { + display: flex; + align-items: flex-start; + } + + .children-container { + display: flex; + flex-direction: column; + flex-grow: 1; + gap: var(--cms-ui-spacing-sm); + } + + .actions-container { + display: flex; + align-items: flex-start; + } +} diff --git a/src/index.css b/src/index.css index 62794618..ec6388df 100644 --- a/src/index.css +++ b/src/index.css @@ -24,13 +24,13 @@ --cms-ui-font-weight-medium: 400; --cms-ui-font-weight-bold: 600; - --cms-ui-line-height-2xl: 76; - --cms-ui-line-height-xl: 62; - --cms-ui-line-height-lg: 48; - --cms-ui-line-height-md: 41; - --cms-ui-line-height-sm: 32; - --cms-ui-line-height-xs: 28; - --cms-ui-line-height-2xs: 24; + --cms-ui-line-height-2xl: 76px; + --cms-ui-line-height-xl: 62px; + --cms-ui-line-height-lg: 48px; + --cms-ui-line-height-md: 41px; + --cms-ui-line-height-sm: 32px; + --cms-ui-line-height-xs: 28px; + --cms-ui-line-height-2xs: 24px; --cms-ui-spacing-2xs: calc(var(--base-spacing) * 0.125); --cms-ui-spacing-xs: calc(var(--base-spacing) * 0.25); diff --git a/src/views/ContentManagement/index.tsx b/src/views/ContentManagement/index.tsx new file mode 100644 index 00000000..8f74de0f --- /dev/null +++ b/src/views/ContentManagement/index.tsx @@ -0,0 +1,27 @@ +import { Button } from '@togglecorp/toggle-ui'; + +import Container from '#components/Container'; + +import styles from './styles.module.css'; + +/** @knipignore */ +// eslint-disable-next-line import/prefer-default-export +export default function ContentManagement() { + return ( + + Add + + )} + > + Content Management + + ); +} diff --git a/src/views/ContentManagement/styles.module.css b/src/views/ContentManagement/styles.module.css new file mode 100644 index 00000000..c5558af8 --- /dev/null +++ b/src/views/ContentManagement/styles.module.css @@ -0,0 +1,3 @@ +.container { + padding: var(--cms-ui-spacing-lg) var(--cms-ui-spacing-md); +} diff --git a/src/views/Home/index.tsx b/src/views/Home/index.tsx index 0442b657..2c94ca90 100644 --- a/src/views/Home/index.tsx +++ b/src/views/Home/index.tsx @@ -1,4 +1,6 @@ import Navbar from '#components/Navbar'; +import Page from '#components/Page'; +import ContentManagement from '#views/ContentManagement'; /** @knipignore */ // eslint-disable-next-line import/prefer-default-export @@ -6,9 +8,17 @@ export function Component() { return ( <> -

- Dashboard -

+ +
Dashboard
+
Content Management
+
User Management
+ + )} + > + +
); } diff --git a/src/views/Login/index.tsx b/src/views/Login/index.tsx index aa8180b3..b6b07af0 100644 --- a/src/views/Login/index.tsx +++ b/src/views/Login/index.tsx @@ -2,7 +2,6 @@ import { useCallback, useContext, } from 'react'; -import { Link } from 'react-router-dom'; import { gql, useMutation, @@ -26,12 +25,17 @@ import { TextInput, } from '@togglecorp/toggle-ui'; +import loginCover from '#assets/loginCover.png'; +import Container from '#components/Container'; +import Page from '#components/Page'; import UserContext from '#contexts/user'; import { LoginMutation, LoginMutationVariables, } from '#generated/types/graphql'; +import styles from './styles.module.css'; + const LOGIN = gql` mutation Login($input: LoginInput!){ public { @@ -134,41 +138,59 @@ export function Component() { }, [login]); return ( - <> -

- Login -

-
+ - - - - - - Go to home - - + + + + +
+ ); } diff --git a/src/views/Login/styles.module.css b/src/views/Login/styles.module.css new file mode 100644 index 00000000..3d041d65 --- /dev/null +++ b/src/views/Login/styles.module.css @@ -0,0 +1,33 @@ +.banner { + justify-content: space-between; + background-color: var(--cms-ui-color-blue-700); + padding: var(--cms-ui-spacing-2xl) 0 0 var(--cms-ui-spacing-2xl); + color: var(--cms-ui-color-faded-white); + + .cover-image { + display: flex; + align-self: flex-end; + height: 35rem; + } +} + +.form-container { + justify-content: center; + background-color: var(--cms-ui-color-white-card); + padding: var(--cms-ui-spacing-2xl); + gap: var(--cms-ui-spacing-lg); + + .form-content { + width: 35rem; + } + + .form { + display: flex; + flex-direction: column; + gap: var(--cms-ui-spacing-md); + } + + .login-button { + width: 100%; + } +} diff --git a/src/views/RootLayout/index.tsx b/src/views/RootLayout/index.tsx index dfa2426a..3404b568 100644 --- a/src/views/RootLayout/index.tsx +++ b/src/views/RootLayout/index.tsx @@ -4,7 +4,6 @@ import styles from './styles.module.css'; /** @knipignore */ // eslint-disable-next-line import/prefer-default-export export function Component() { - console.log('here'); return (
diff --git a/tsconfig.json b/tsconfig.json index 1d22db62..d2bd99fa 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,7 +7,8 @@ "#configs/*": ["./src/configs/*"], "#contexts/*": ["./src/contexts/*"], "#components/*": ["./src/components/*"], - "#hooks/*": ["./src/hooks/*"] + "#hooks/*": ["./src/hooks/*"], + "#assets/*": ["./src/assets/*"] }, "target": "ESNext",