diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..00b0c9dd --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @devhatt/hatts @devhatt/petdex-frontend-administrators diff --git a/.github/workflows/autoAssigned.yml b/.github/workflows/autoAssigned.yml deleted file mode 100644 index f388bcb2..00000000 --- a/.github/workflows/autoAssigned.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: Auto-assign on comment - -on: - issue_comment: - types: [created] - -jobs: - auto-assign: - runs-on: ubuntu-latest - steps: - - name: Check for "EU QUERO!!!" comment - if: contains(github.event.comment.body, 'EU QUERO!!!') - run: | - # Extract the commenter's username - commenter=$(jq -r .comment.user.login $GITHUB_EVENT_PATH) - - # Add the commenter as an assignee to the issue using a Personal Access Token - echo "Assigning $commenter to the issue..." - curl -X POST -H "Authorization: token ${{ secrets.PERSONAL_ACCESS_TOKEN }}" \ - -d "{\"assignees\": [\"$commenter\"]}" \ - "https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.issue.number }}/assignees" diff --git a/.github/workflows/base-workflows.yml b/.github/workflows/base-workflows.yml new file mode 100644 index 00000000..df126b4a --- /dev/null +++ b/.github/workflows/base-workflows.yml @@ -0,0 +1,11 @@ +name: Base workflows + +on: + issue_comment: + types: [created] + pull_request: + +jobs: + assignes: + uses: devhatt/workflows/.github/workflows/auto-assign.yml@main + secrets: inherit diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0752a3b0..4be2186a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,7 +21,7 @@ jobs: uses: actions/checkout@v3 - name: Setup deps - uses: ./.github/actions/install-deps + uses: devhatt/workflows/.github/actions/pnpm-setup@main - name: Build run: pnpm build diff --git a/.github/workflows/code-style.yml b/.github/workflows/code-style.yml index 2b731759..d462ec8d 100644 --- a/.github/workflows/code-style.yml +++ b/.github/workflows/code-style.yml @@ -17,45 +17,13 @@ jobs: uses: actions/checkout@v3 - name: Setup deps - uses: ./.github/actions/install-deps - - - name: Get all changed files - id: all-changed-files - uses: tj-actions/changed-files@v41 - with: - files: | - !pnpm-lock.yaml + uses: devhatt/workflows/.github/actions/pnpm-setup@main - name: Run prettier in all files - if: steps.all-changed-files.outputs.any_changed == 'true' - env: - files: ${{ steps.all-changed-files.outputs.all_changed_files }} - run: pnpm exec prettier $files --check --ignore-unknown - - - name: Get specific changed files - id: changed-files - uses: tj-actions/changed-files@v41 - with: - files_yaml: | - code: - - '**.js' - - '**.ts' - - '**.tsx' - - '**.jsx' - - '**.mjs' - - '**.cjs' - style: - - '**.scss' + run: pnpm exec prettier . --check --ignore-unknown - name: Run stylelint in scss files - if: steps.changed-files.outputs.style_any_changed == 'true' - env: - files: ${{ steps.changed-files.outputs.style_all_changed_files }} - run: pnpm exec stylelint $files --allow-empty-input + run: pnpm exec stylelint . --allow-empty-input - name: Run eslint in code files - if: steps.changed-files.outputs.code_any_changed == 'true' - env: - files: ${{ steps.changed-files.outputs.code_all_changed_files }} - run: pnpm exec eslint $files --report-unused-disable-directives --max-warnings 0 --output-file eslint_report.json --format json - continue-on-error: true + run: pnpm exec eslint . --report-unused-disable-directives --max-warnings 0 diff --git a/db.json b/db.json index 3ab9e061..603432c8 100644 --- a/db.json +++ b/db.json @@ -17,6 +17,78 @@ "id": "1", "breed": "Spitz", "name": "Mel", + "title": "Bolinha", + "imgSrc": "https://images.unsplash.com/photo-1598628599796-2a454fa7d9c5?q=80&w=1674&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D", + "imgAlt": "Bolinha", + "size": { + "small": "X", + "medium": "", + "large": "" + }, + "weight": 10, + "birthday": "20-05-2022", + "castrated": true, + "specialNeeds": false + }, + { + "id": "2", + "breed": "Spitz", + "name": "Mel", + "title": "Jake", + "imgSrc": "https://images.unsplash.com/photo-1530281700549-e82e7bf110d6?q=80&w=1888&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D", + "imgAlt": "Jake", + "size": { + "small": "X", + "medium": "", + "large": "" + }, + "weight": 10, + "birthday": "20-05-2022", + "castrated": true, + "specialNeeds": false + }, + { + "id": "3", + "breed": "Spitz", + "name": "Mel", + "title": "Tobias", + "imgSrc": "https://images.unsplash.com/photo-1632165258904-21ca36a01ee0?q=80&w=1635&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D", + "imgAlt": "Tobias", + "size": { + "small": "X", + "medium": "", + "large": "" + }, + "weight": 10, + "birthday": "20-05-2022", + "castrated": true, + "specialNeeds": false + }, + + { + "id": "4", + "breed": "Spitz", + "name": "Mel", + "title": "Francis", + "imgSrc": "https://images.unsplash.com/photo-1596921825946-d738194fac80?q=80&w=1886&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D", + "imgAlt": "Francis", + "size": { + "small": "X", + "medium": "", + "large": "" + }, + "weight": 10, + "birthday": "20-05-2022", + "castrated": true, + "specialNeeds": false + }, + { + "id": "5", + "breed": "Spitz", + "name": "Mel", + "title": "Toyota", + "imgSrc": "https://images.unsplash.com/photo-1694185643879-536f8d785fa6?q=80&w=1664&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D", + "imgAlt": "Toyota", "size": { "small": "X", "medium": "", diff --git a/jsconfig.json b/jsconfig.json index 8d03554a..0b580cd3 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -3,7 +3,11 @@ "types": ["vitest/globals"], "baseUrl": ".", "paths": { - "@testing-library/vanilla": ["src/__tests__/index.js"] + "@testing-library/vanilla": ["src/__tests__/index.js"], + "~src/*": ["src/*"], + "~styles/*": ["src/styles/*"], + "~stories/*": ["src/stories/*"], + "~layouts/*": ["src/layouts/*"] } } } diff --git a/package.json b/package.json index 820f95bf..9e05dc5a 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "preview": "vite preview", "storybook": "storybook dev -p 6006", "stylelint": "stylelint \"**/*.scss\"", - "mock-api": "json-server db.json" + "mock-api": "json-server db.json --routes routes.json" }, "dependencies": { "concurrently": "8.2.2", @@ -57,6 +57,7 @@ "eslint": "^8.57.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-prettier": "^9.1.0", + "eslint-import-resolver-alias": "1.1.2", "eslint-import-resolver-jsconfig": "1.1.0", "eslint-import-resolver-node": "0.3.9", "eslint-plugin-import": "^2.29.1", @@ -71,7 +72,7 @@ "eslint-plugin-vitest-globals": "1.5.0", "husky": "^8.0.3", "jsdom": "^23.2.0", - "json-server": "1.0.0-beta.1", + "json-server": "0.17.4", "lint-staged": "^15.2.2", "prettier": "^3.2.5", "reset-css": "^5.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1ae0ac54..5593918a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -94,6 +94,9 @@ devDependencies: eslint-config-prettier: specifier: ^9.1.0 version: 9.1.0(eslint@8.57.0) + eslint-import-resolver-alias: + specifier: 1.1.2 + version: 1.1.2(eslint-plugin-import@2.29.1) eslint-import-resolver-jsconfig: specifier: 1.1.0 version: 1.1.0 @@ -137,8 +140,8 @@ devDependencies: specifier: ^23.2.0 version: 23.2.0 json-server: - specifier: 1.0.0-beta.1 - version: 1.0.0-beta.1 + specifier: 0.17.4 + version: 0.17.4 lint-staged: specifier: ^15.2.2 version: 15.2.2 @@ -3220,134 +3223,6 @@ packages: '@testing-library/dom': 9.3.4 dev: true - /@tinyhttp/accepts@2.2.2: - resolution: {integrity: sha512-DmngnwOaPgNUGgTpX1UdlNrXaGG6k5rHFzslcYlvSQIg7s0PI6bF86U0fYq3q+yhJhKbnwzFez0wU1lAP+bKvA==} - engines: {node: '>=12.20.0'} - dependencies: - mime: 4.0.1 - negotiator: 0.6.3 - dev: true - - /@tinyhttp/app@2.2.4: - resolution: {integrity: sha512-vFCgE+RncK9+AHpSXHiOxpbaEbpOxYcYHz4K/15Ckh8Sb7WvjA+vveN7bwMqfifyW2uvV3xTKTitUVohf+kDnA==} - engines: {node: '>=14.21.3'} - dependencies: - '@tinyhttp/cookie': 2.1.1 - '@tinyhttp/proxy-addr': 2.1.4 - '@tinyhttp/req': 2.2.3 - '@tinyhttp/res': 2.2.3 - '@tinyhttp/router': 2.2.2 - header-range-parser: 1.1.3 - regexparam: 2.0.2 - dev: true - - /@tinyhttp/content-disposition@2.2.1: - resolution: {integrity: sha512-PQ5IWdOn7arScqTV+usIDJvwbanoAXtaopzgxjMS9y7TFwLSIelCblihRBEVIPIkIpsdhSJFH3RF+Daosyj+Aw==} - engines: {node: '>=12.20.0'} - dev: true - - /@tinyhttp/content-type@0.1.4: - resolution: {integrity: sha512-dl6f3SHIJPYbhsW1oXdrqOmLSQF/Ctlv3JnNfXAE22kIP7FosqJHxkz/qj2gv465prG8ODKH5KEyhBkvwrueKQ==} - engines: {node: '>=12.4'} - dev: true - - /@tinyhttp/cookie-signature@2.1.1: - resolution: {integrity: sha512-VDsSMY5OJfQJIAtUgeQYhqMPSZptehFSfvEEtxr+4nldPA8IImlp3QVcOVuK985g4AFR4Hl1sCbWCXoqBnVWnw==} - engines: {node: '>=12.20.0'} - dev: true - - /@tinyhttp/cookie@2.1.1: - resolution: {integrity: sha512-h/kL9jY0e0Dvad+/QU3efKZww0aTvZJslaHj3JTPmIPC9Oan9+kYqmh3M6L5JUQRuTJYFK2nzgL2iJtH2S+6dA==} - engines: {node: '>=12.20.0'} - dev: true - - /@tinyhttp/cors@2.0.1: - resolution: {integrity: sha512-qrmo6WJuaiCzKWagv2yA/kw6hIISfF/hOqPWwmI6w0o8apeTMmRN3DoCFvQ/wNVuWVdU5J4KU7OX8aaSOEq51A==} - engines: {node: '>=12.20 || 14.x || >=16'} - dependencies: - '@tinyhttp/vary': 0.1.3 - dev: true - - /@tinyhttp/encode-url@2.1.1: - resolution: {integrity: sha512-AhY+JqdZ56qV77tzrBm0qThXORbsVjs/IOPgGCS7x/wWnsa/Bx30zDUU/jPAUcSzNOzt860x9fhdGpzdqbUeUw==} - engines: {node: '>=12.20.0'} - dev: true - - /@tinyhttp/etag@2.1.2: - resolution: {integrity: sha512-j80fPKimGqdmMh6962y+BtQsnYPVCzZfJw0HXjyH70VaJBHLKGF+iYhcKqzI3yef6QBNa8DKIPsbEYpuwApXTw==} - engines: {node: '>=12.20.0'} - dev: true - - /@tinyhttp/forwarded@2.1.1: - resolution: {integrity: sha512-nO3kq0R1LRl2+CAMlnggm22zE6sT8gfvGbNvSitV6F9eaUSurHP0A8YZFMihSkugHxK+uIegh1TKrqgD8+lyGQ==} - engines: {node: '>=12.20.0'} - dev: true - - /@tinyhttp/proxy-addr@2.1.4: - resolution: {integrity: sha512-Xb57jBQW3UcwKST1XSkJpyZPyjOVQJjUfXiHULVXf7FZCgnl273+aj0oP15BzpYLuGhO9IjydY5gvYeg2Cny+A==} - engines: {node: '>=12.20.0'} - dependencies: - '@tinyhttp/forwarded': 2.1.1 - ipaddr.js: 2.2.0 - dev: true - - /@tinyhttp/req@2.2.3: - resolution: {integrity: sha512-HtIa4Gaa8QFTlmsvoif/B7yMK5H0WBUegH2kKW6scNwOpFXyxEk+VsctrIVgORrP5lybXAIRXlRhGuBBAMlVhw==} - engines: {node: '>=12.20.0'} - dependencies: - '@tinyhttp/accepts': 2.2.2 - '@tinyhttp/type-is': 2.2.3 - '@tinyhttp/url': 2.1.1 - header-range-parser: 1.1.3 - dev: true - - /@tinyhttp/res@2.2.3: - resolution: {integrity: sha512-PGl88OOdmMcOuKZaTbhGKAWPoJJf3+EfKIad8ydzjdenVjrTZZjIYJtmwYiUBeEice+YkOCO67qCIekVO5mHlw==} - engines: {node: '>=12.20.0'} - dependencies: - '@tinyhttp/content-disposition': 2.2.1 - '@tinyhttp/cookie': 2.1.1 - '@tinyhttp/cookie-signature': 2.1.1 - '@tinyhttp/encode-url': 2.1.1 - '@tinyhttp/req': 2.2.3 - '@tinyhttp/send': 2.2.2 - '@tinyhttp/vary': 0.1.3 - es-escape-html: 0.1.1 - mime: 4.0.0-beta.1 - dev: true - - /@tinyhttp/router@2.2.2: - resolution: {integrity: sha512-i+1ouhPyTqcuJuOsKqmo7i+YD++0RF2lQLhBpcTnsaegD2gTEa3xW2Pcz7spYQGo7K8PQYtOrL7m9b14+BEXqg==} - engines: {node: '>=12.20.0'} - dev: true - - /@tinyhttp/send@2.2.2: - resolution: {integrity: sha512-TZkGy9EdGk+vwYWQnjArQftaXAUIgp/fFlgaxlpamsCZKy7o+CNJ75xty4H3SaY3ZPgN47wv8rnJ50rDRQdFFQ==} - engines: {node: '>=12.20.0'} - dependencies: - '@tinyhttp/content-type': 0.1.4 - '@tinyhttp/etag': 2.1.2 - mime: 4.0.0-beta.1 - dev: true - - /@tinyhttp/type-is@2.2.3: - resolution: {integrity: sha512-RsZ4+or5xI+wrTlrd+/cLZELoJDMd1HSp+1P23VOZSu1xPAsO1XLf1FgluO8GbEW9Ll/l2yC7mO6diKzjc06HA==} - engines: {node: '>=12.20.0'} - dependencies: - '@tinyhttp/content-type': 0.1.4 - mime: 4.0.1 - dev: true - - /@tinyhttp/url@2.1.1: - resolution: {integrity: sha512-POJeq2GQ5jI7Zrdmj22JqOijB5/GeX+LEX7DUdml1hUnGbJOTWDx7zf2b5cCERj7RoXL67zTgyzVblBJC+NJWg==} - engines: {node: '>=12.20.0'} - dev: true - - /@tinyhttp/vary@0.1.3: - resolution: {integrity: sha512-SoL83sQXAGiHN1jm2VwLUWQSQeDAAl1ywOm6T0b0Cg1CZhVsjoiZadmjhxF6FHCCY7OHHVaLnTgSMxTPIDLxMg==} - engines: {node: '>=12.20'} - dev: true - /@types/aria-query@5.0.4: resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} dev: true @@ -4191,6 +4066,13 @@ packages: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} dev: true + /basic-auth@2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} + dependencies: + safe-buffer: 5.1.2 + dev: true + /better-opn@3.0.2: resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} engines: {node: '>=12.0.0'} @@ -4645,6 +4527,10 @@ packages: resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} dev: true + /connect-pause@0.1.1: + resolution: {integrity: sha512-a1gSWQBQD73krFXdUEYJom2RTFrWUL3YvXDCRkyv//GVXc79cdW9MngtRuN9ih4FDKBtfJAJId+BbDuX+1rh2w==} + dev: true + /consola@3.2.3: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} engines: {node: ^14.18.0 || >=16.10.0} @@ -4712,6 +4598,14 @@ packages: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true + /cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + dev: true + /cosmiconfig-typescript-loader@5.0.0(@types/node@20.12.10)(cosmiconfig@9.0.0)(typescript@5.4.5): resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} engines: {node: '>=v16'} @@ -4876,6 +4770,17 @@ packages: ms: 2.0.0 dev: true + /debug@3.1.0: + resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -5087,20 +4992,6 @@ packages: is-obj: 2.0.0 dev: true - /dot-prop@8.0.2: - resolution: {integrity: sha512-xaBe6ZT4DHPkg0k4Ytbvn5xoxgpG0jOS1dYxSOwAHPuNLjP3/OzN0gH55SrLqpx8cBfSaVt91lXYkApjb+nYdQ==} - engines: {node: '>=16'} - dependencies: - type-fest: 3.13.1 - dev: true - - /dot-prop@9.0.0: - resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} - engines: {node: '>=18'} - dependencies: - type-fest: 4.21.0 - dev: true - /dotenv-expand@10.0.0: resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} engines: {node: '>=12'} @@ -5180,6 +5071,14 @@ packages: is-arrayish: 0.2.1 dev: true + /errorhandler@1.5.1: + resolution: {integrity: sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==} + engines: {node: '>= 0.8'} + dependencies: + accepts: 1.3.8 + escape-html: 1.0.3 + dev: true + /es-abstract@1.23.3: resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} engines: {node: '>= 0.4'} @@ -5241,11 +5140,6 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - /es-escape-html@0.1.1: - resolution: {integrity: sha512-yUx1o+8RsG7UlszmYPtks+dm6Lho2m8lgHMOsLJQsFI0R8XwUJwiMhM1M4E/S8QLeGyf6MkDV/pWgjQ0tdTSyQ==} - engines: {node: '>=12.x'} - dev: true - /es-get-iterator@1.1.3: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} dependencies: @@ -5448,6 +5342,15 @@ packages: eslint: 8.57.0 dev: true + /eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.29.1): + resolution: {integrity: sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==} + engines: {node: '>= 4'} + peerDependencies: + eslint-plugin-import: '>=1.4.0' + dependencies: + eslint-plugin-import: 2.29.1(eslint@8.57.0) + dev: true + /eslint-import-resolver-jsconfig@1.1.0: resolution: {integrity: sha512-MEiD/zyEkVVwnblRI058/0liYrKXMUwgAtM4EKrTldrThb1AvgPIQeR4emDKC2IotTuWF7KzekvGP+KLhtM3rw==} dependencies: @@ -5794,11 +5697,6 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - /eta@3.4.0: - resolution: {integrity: sha512-tCsc7WXTjrTx4ZjYLplcqrI3o4mYJ+Z6YspeuGL8tbt/hHoMchwBwtKfwM09svEY86iRapY93vUqQttcNuIO5Q==} - engines: {node: '>=6.0.0'} - dev: true - /etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} @@ -5845,6 +5743,15 @@ packages: homedir-polyfill: 1.0.3 dev: true + /express-urlrewrite@1.4.0: + resolution: {integrity: sha512-PI5h8JuzoweS26vFizwQl6UTF25CAHSggNv0J25Dn/IKZscJHWZzPrI5z2Y2jgOzIaw2qh8l6+/jUcig23Z2SA==} + dependencies: + debug: 4.3.4 + path-to-regexp: 1.8.0 + transitivePeerDependencies: + - supports-color + dev: true + /express@4.19.2: resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} engines: {node: '>= 0.10.0'} @@ -6476,11 +6383,6 @@ packages: '@types/hast': 3.0.4 dev: true - /header-range-parser@1.1.3: - resolution: {integrity: sha512-B9zCFt3jH8g09LR1vHL4pcAn8yMEtlSlOUdQemzHMRKMImNIhhszdeosYFfNW0WXKQtXIlWB+O4owHJKvEJYaA==} - engines: {node: '>=12.22.0'} - dev: true - /homedir-polyfill@1.0.3: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} @@ -6607,11 +6509,6 @@ packages: engines: {node: '>=8'} dev: true - /inflection@3.0.0: - resolution: {integrity: sha512-1zEJU1l19SgJlmwqsEyFTbScw/tkMHFenUo//Y0i+XEP83gDFdMvPizAD/WGcE+l1ku12PcTVHQhO6g5E0UCMw==} - engines: {node: '>=18.0.0'} - dev: true - /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: @@ -6689,11 +6586,6 @@ packages: engines: {node: '>= 0.10'} dev: true - /ipaddr.js@2.2.0: - resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} - engines: {node: '>= 10'} - dev: true - /is-absolute-url@4.0.1: resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -6901,6 +6793,10 @@ packages: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: true + /is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + dev: true + /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -6997,6 +6893,10 @@ packages: is-docker: 2.2.1 dev: true + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: true + /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true @@ -7086,6 +6986,10 @@ packages: hasBin: true dev: true + /jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + dev: true + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -7187,6 +7091,12 @@ packages: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true + /json-parse-helpfulerror@1.0.3: + resolution: {integrity: sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==} + dependencies: + jju: 1.4.0 + dev: true + /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true @@ -7198,23 +7108,32 @@ packages: resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} dev: false - /json-server@1.0.0-beta.1: - resolution: {integrity: sha512-xOKYyxkVai66OTFZq5ulAaXYkqiKMbzVED9tRZ+CMg6v6iaSdIVYas5tIjSMw/mYwDL/nJFTCca308gaL0coyA==} - engines: {node: '>=18.3'} + /json-server@0.17.4: + resolution: {integrity: sha512-bGBb0WtFuAKbgI7JV3A864irWnMZSvBYRJbohaOuatHwKSRFUfqtQlrYMrB6WbalXy/cJabyjlb7JkHli6dYjQ==} + engines: {node: '>=12'} hasBin: true dependencies: - '@tinyhttp/app': 2.2.4 - '@tinyhttp/cors': 2.0.1 - chalk: 5.3.0 - chokidar: 3.6.0 - dot-prop: 9.0.0 - eta: 3.4.0 - inflection: 3.0.0 - json5: 2.2.3 - lowdb: 7.0.1 - milliparsec: 2.3.0 - sirv: 2.0.4 - sort-on: 6.0.0 + body-parser: 1.20.2 + chalk: 4.1.2 + compression: 1.7.4 + connect-pause: 0.1.1 + cors: 2.8.5 + errorhandler: 1.5.1 + express: 4.19.2 + express-urlrewrite: 1.4.0 + json-parse-helpfulerror: 1.0.3 + lodash: 4.17.21 + lodash-id: 0.14.1 + lowdb: 1.0.0 + method-override: 3.0.0 + morgan: 1.10.0 + nanoid: 3.3.7 + please-upgrade-node: 3.2.0 + pluralize: 8.0.0 + server-destroy: 1.0.1 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color dev: true /json-stable-stringify-without-jsonify@1.0.1: @@ -7387,6 +7306,11 @@ packages: p-locate: 6.0.0 dev: true + /lodash-id@0.14.1: + resolution: {integrity: sha512-ikQPBTiq/d5m6dfKQlFdIXFzvThPi2Be9/AHxktOnDSfSxE1j9ICbBT5Elk1ke7HSTgM38LHTpmJovo9/klnLg==} + engines: {node: '>= 4'} + dev: true + /lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: true @@ -7478,11 +7402,15 @@ packages: get-func-name: 2.0.2 dev: true - /lowdb@7.0.1: - resolution: {integrity: sha512-neJAj8GwF0e8EpycYIDFqEPcx9Qz4GUho20jWFR7YiFeXzF1YMLdxB36PypcTSPMA+4+LvgyMacYhlr18Zlymw==} - engines: {node: '>=18'} + /lowdb@1.0.0: + resolution: {integrity: sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ==} + engines: {node: '>=4'} dependencies: - steno: 4.0.2 + graceful-fs: 4.2.11 + is-promise: 2.2.2 + lodash: 4.17.21 + pify: 3.0.0 + steno: 0.4.4 dev: true /lru-cache@10.2.2: @@ -7599,6 +7527,18 @@ packages: resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} dev: true + /method-override@3.0.0: + resolution: {integrity: sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==} + engines: {node: '>= 0.10'} + dependencies: + debug: 3.1.0 + methods: 1.1.2 + parseurl: 1.3.3 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + /methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} @@ -7611,11 +7551,6 @@ packages: braces: 3.0.2 picomatch: 2.3.1 - /milliparsec@2.3.0: - resolution: {integrity: sha512-b+6KYJw+DwQjk24qCUuq+lZvRXDpXJ02qsllKgKaDurHpQ0v7D5op9VAkdYM/pXRhFeh7uLYHmnwFnYvdXGa3A==} - engines: {node: '>=12.4'} - dev: true - /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -7634,18 +7569,6 @@ packages: hasBin: true dev: true - /mime@4.0.0-beta.1: - resolution: {integrity: sha512-8/p99P1RV17prytee/A6D+8shNqdDzyvGJ/CVfiuXwh4cTsv3P3qGyaYSx2hdqnqbKKqYUfTC5zAjCtcd1BShw==} - engines: {node: '>=16'} - hasBin: true - dev: true - - /mime@4.0.1: - resolution: {integrity: sha512-5lZ5tyrIfliMXzFtkYyekWbtRXObT9OWa8IwQ5uxTBDHucNNwniRqo0yInflj+iYi5CBa6qxadGzGarDfuEOxA==} - engines: {node: '>=16'} - hasBin: true - dev: true - /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -7728,6 +7651,19 @@ packages: ufo: 1.5.3 dev: true + /morgan@1.10.0: + resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} + engines: {node: '>= 0.8.0'} + dependencies: + basic-auth: 2.0.1 + debug: 2.6.9 + depd: 2.0.0 + on-finished: 2.3.0 + on-headers: 1.0.2 + transitivePeerDependencies: + - supports-color + dev: true + /mrmime@2.0.0: resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} engines: {node: '>=10'} @@ -7922,6 +7858,13 @@ packages: resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} dev: true + /on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: true + /on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -8141,6 +8084,12 @@ packages: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: true + /path-to-regexp@1.8.0: + resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} + dependencies: + isarray: 0.0.1 + dev: true + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -8179,6 +8128,11 @@ packages: hasBin: true dev: true + /pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + dev: true + /pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} @@ -8217,6 +8171,17 @@ packages: pathe: 1.1.2 dev: true + /please-upgrade-node@3.2.0: + resolution: {integrity: sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==} + dependencies: + semver-compare: 1.0.0 + dev: true + + /pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + dev: true + /polished@4.3.1: resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} engines: {node: '>=10'} @@ -8595,11 +8560,6 @@ packages: es-errors: 1.3.0 set-function-name: 2.0.2 - /regexparam@2.0.2: - resolution: {integrity: sha512-A1PeDEYMrkLrfyOwv2jwihXbo9qxdGD3atBYQA9JJgreAx8/7rC6IUkWOw2NQlOxLp2wL0ifQbh1HuidDfYA6w==} - engines: {node: '>=8'} - dev: true - /regexpu-core@5.3.2: resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} engines: {node: '>=4'} @@ -8839,6 +8799,10 @@ packages: loose-envify: 1.4.0 dev: true + /semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + dev: true + /semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -8893,6 +8857,10 @@ packages: - supports-color dev: true + /server-destroy@1.0.1: + resolution: {integrity: sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==} + dev: true + /set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -9011,13 +8979,6 @@ packages: resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} dev: false - /sort-on@6.0.0: - resolution: {integrity: sha512-d51VlJWoFQjp+cIZRyNusCyJdP5pLAw+H+sC4C2q6RhPBv+RAb/QXXck5q3Kdm7h/ot/kD2AlpGPDee8v+0qiA==} - engines: {node: '>=18'} - dependencies: - dot-prop: 8.0.2 - dev: true - /source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} @@ -9092,9 +9053,10 @@ packages: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} dev: true - /steno@4.0.2: - resolution: {integrity: sha512-yhPIQXjrlt1xv7dyPQg2P17URmXbuM5pdGkpiMB3RenprfiBlvK415Lctfe0eshk90oA7/tNq7WEiMK8RSP39A==} - engines: {node: '>=18'} + /steno@0.4.4: + resolution: {integrity: sha512-EEHMVYHNXFHfGtgjNITnka0aHhiAlo93F7z2/Pwd+g0teG9CnM3JIINM7hVVB5/rhw9voufD7Wukwgtw2uqh6w==} + dependencies: + graceful-fs: 4.2.11 dev: true /stop-iteration-iterator@1.0.0: @@ -9745,16 +9707,6 @@ packages: engines: {node: '>=12.20'} dev: true - /type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} - dev: true - - /type-fest@4.21.0: - resolution: {integrity: sha512-ADn2w7hVPcK6w1I0uWnM//y1rLXZhzB9mr0a3OirzclKF1Wp6VzevUmzz/NRAWunOT6E8HrnpGY7xOfc6K57fA==} - engines: {node: '>=16'} - dev: true - /type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} diff --git a/routes.json b/routes.json new file mode 100644 index 00000000..c039687a --- /dev/null +++ b/routes.json @@ -0,0 +1,3 @@ +{ + "/api/:resource/:id/my-pets": "/:resource/:id" +} diff --git a/setup.mjs b/setup.mjs new file mode 100644 index 00000000..5398d1e4 --- /dev/null +++ b/setup.mjs @@ -0,0 +1,30 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const envFilePath = path.join(__dirname, '.env'); + +async function setupDotEnv() { + if (fs.existsSync(envFilePath)) { + console.log( + 'O .env já existe, se você deseja recriá-lo, exclua o arquivo e execute este script novamente.', + ); + return; + } + + try { + console.log('Baixando o .env do repositório...'); + const envData = await fetch( + 'https://raw.githubusercontent.com/devhatt/envs/main/petdex-front.env', + ).then((response) => response.text()); + fs.writeFileSync(envFilePath, envData); + console.log('O arquivo .env foi criado com sucesso!'); + } catch (error) { + console.error('Erro ao criar o arquivo .env:', error); + } +} + +setupDotEnv(); diff --git a/src/components/AddPet/index.js b/src/components/AddPet/index.js index 74730448..e7d59525 100644 --- a/src/components/AddPet/index.js +++ b/src/components/AddPet/index.js @@ -1,11 +1,10 @@ import { Component } from 'pet-dex-utilities'; -import Sliding from '../Sliding'; +import PetRegister from '~layouts/pages/PetRegister'; +import PetVetPage from '~layouts/pages/PetVet'; +import PetWeight from '~layouts/pages/PetWeight'; import ProgressBar from '../ProgressBar'; - -import PetVetPage from '../../layouts/app/pages/PetVet'; -import PetWeight from '../../layouts/app/pages/PetWeight'; -import PetRegister from '../../layouts/app/pages/PetRegister'; +import Sliding from '../Sliding'; import arrowLeft from './assets/arrow-left.svg'; diff --git a/src/components/ChangePassword/index.js b/src/components/ChangePassword/index.js index 05c309f6..e50f65fa 100644 --- a/src/components/ChangePassword/index.js +++ b/src/components/ChangePassword/index.js @@ -1,4 +1,5 @@ import { Component } from 'pet-dex-utilities'; +import { isPasswordValid } from '../../utils/validations'; import TextInput from '../TextInput'; import Button from '../Button'; import './index.scss'; @@ -28,22 +29,13 @@ const html = ` As senhas não coincidem `; -const validatePassword = (password) => { - const hasMinLength = password.length >= 10; - const hasUppercase = /[A-Z]/g.test(password); - const hasNumber = /[0-9]/g.test(password); - const hasSpecialCharacter = /[!@#$%^&*(),.?":{}|<>]/g.test(password); - - return hasMinLength && hasUppercase && hasNumber && hasSpecialCharacter; -}; - export default function ChangePassword() { Component.call(this, { html, events }); const $changePasswordForm = this.selected.get('change-password'); @@ -123,8 +115,8 @@ export default function ChangePassword() { confirmPasswordInput.selected.get('input-text').value; const showErrorMessage = (field, error) => { - const fieldValue = field.selected.get('input-text').value; - if (!validatePassword(fieldValue)) { + const password = field.selected.get('input-text').value; + if (!isPasswordValid(password)) { validPasswords = false; error.classList.add('show-error'); field.inputError(); diff --git a/src/components/Drawer/index.js b/src/components/Drawer/index.js index 1736ae86..002b2a78 100644 --- a/src/components/Drawer/index.js +++ b/src/components/Drawer/index.js @@ -14,7 +14,7 @@ const html = `
-
diff --git a/src/components/Drawer/index.spec.js b/src/components/Drawer/index.spec.js index 5cad0db8..bc3646e5 100644 --- a/src/components/Drawer/index.spec.js +++ b/src/components/Drawer/index.spec.js @@ -1,8 +1,6 @@ -/* eslint-disable testing-library/prefer-user-event */ -/* eslint-disable no-restricted-syntax */ -import { fireEvent } from '@testing-library/dom'; -import { render } from '@testing-library/vanilla'; import { describe, expect, it } from 'vitest'; +import { render, screen } from '@testing-library/vanilla'; +import { userEvent } from '@testing-library/user-event'; import Drawer from '.'; import Button from '../Button'; @@ -25,8 +23,11 @@ describe('Drawer', () => { drawer.open(); - expect(drawer.selected.get('title').textContent).toBe('Add dates'); - expect(drawer.selected.get('content').textContent).toBe('Cadastrar pet'); + const firstText = screen.getByText('Add dates'); + const secondText = screen.getByText('Cadastrar pet'); + + expect(firstText).toBeInTheDocument(); + expect(secondText).toBeInTheDocument(); }); }); @@ -46,25 +47,23 @@ describe('Drawer', () => { }); }); - it('closes when Esc is pressed', () => { + it('closes when Esc is pressed', async () => { const drawer = makeSut(); + const closeSpy = vi.spyOn(drawer, 'close'); - drawer.open(); - - fireEvent.keyDown(document, { key: 'Escape' }); + await userEvent.keyboard('{Escape}'); - expect(drawer.selected.get('drawer').classList).not.toContain( - 'drawer--open', - ); + expect(closeSpy).toHaveBeenCalled(); }); - it('closes when the close button is clicked', () => { + it('closes when the close button is clicked', async () => { const drawer = makeSut(); const closeSpy = vi.spyOn(drawer, 'close'); drawer.open(); - fireEvent.click(drawer.selected.get('close')); + const button = screen.getByLabelText('close-drawer'); + await userEvent.click(button); expect(closeSpy).toHaveBeenCalled(); }); diff --git a/src/components/LoginForm/index.js b/src/components/LoginForm/index.js index 1b50037d..327c28d8 100644 --- a/src/components/LoginForm/index.js +++ b/src/components/LoginForm/index.js @@ -1,4 +1,5 @@ import { Component } from 'pet-dex-utilities'; +import { isPasswordValid } from '../../utils/validations'; import TextInput from '../TextInput'; import Button from '../Button'; import Toggle from '../Toggle'; @@ -112,7 +113,7 @@ export default function LoginForm() { emailInput.inputError(); } - if (!this.validatePassword(password)) { + if (!this.isPasswordValid(password)) { validPassword = false; $passwordErrorMessage.classList.add('show-error'); $passwordErrorMessage.innerText = @@ -138,12 +139,5 @@ LoginForm.prototype = Object.assign(LoginForm.prototype, Component.prototype, { return emailRegex.test(email); }, - validatePassword(password) { - const hasMinLength = password.length >= 10; - const hasUppercase = /[A-Z]/g.test(password); - const hasNumber = /[0-9]/g.test(password); - const hasSpecialCharacter = /[!@#$%^&*(),.?":{}|<>]/g.test(password); - - return hasMinLength && hasUppercase && hasNumber && hasSpecialCharacter; - }, + isPasswordValid, }); diff --git a/src/components/RegisterForm/index.js b/src/components/RegisterForm/index.js index 3cad6787..c37e0747 100644 --- a/src/components/RegisterForm/index.js +++ b/src/components/RegisterForm/index.js @@ -14,6 +14,7 @@ import { import googleIcon from './images/google-icon.svg'; import facebookIcon from './images/facebook-icon.svg'; import './index.scss'; +import { UserService } from '../../services/userService'; const events = ['register']; @@ -151,7 +152,7 @@ export default function RegisterForm() { repeatPassword.mount($fields); registerButton.mount($formButton); - registerButton.listen('click', () => { + registerButton.listen('click', async () => { const nameValue = name.getContent().getValue(); const surnameValue = surname.getContent().getValue(); const birthValue = birth.getContent().getValue(); @@ -270,6 +271,16 @@ export default function RegisterForm() { passwordValid && repeatPasswordValid ) { + await UserService.registerUser({ + name: nameValue, + surname: surnameValue, + birth: birthValue, + local: localValue, + email: emailValue, + phone: phoneValue, + password: passwordValue, + }); + this.register(); } }); diff --git a/src/layouts/app/components/SideMenu/index.js b/src/layouts/app/components/SideMenu/index.js deleted file mode 100644 index 8cca34fd..00000000 --- a/src/layouts/app/components/SideMenu/index.js +++ /dev/null @@ -1,97 +0,0 @@ -import { Component } from 'pet-dex-utilities'; -import petUrl from '../../../../images/pet-dex.svg'; -import configuracoes from './images/configuracoes.svg'; -import conta from './images/conta.svg'; -import doacoes from './images/doacoes.svg'; -import exit from './images/exit.svg'; -import exitMenu from './images/exitmenu.svg'; -import meusPets from './images/meuspets.svg'; -import notificacoes from './images/notifications.svg'; -import perfil from './images/perfil.svg'; -import petdex from './images/petdex.svg'; -import PetAvatar from '../../../../components/PetAvatar'; -import './index.scss'; - -const html = ` - -
-
-
-

Seu Pet

-
-
-
-
- -
-
- -`; - -export default function SideMenu() { - Component.call(this, { html }); - - const $container = this.selected.get('avatar-container'); - - const pets = [ - { - id: '1', - title: 'Bolinha', - imgSrc: - 'https://images.unsplash.com/photo-1598628599796-2a454fa7d9c5?q=80&w=1674&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D', - imgAlt: 'Bolinha', - }, - { - id: '2', - title: 'Jake', - imgSrc: - 'https://images.unsplash.com/photo-1530281700549-e82e7bf110d6?q=80&w=1888&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D', - imgAlt: 'Jake', - }, - { - id: '3', - title: 'Tobias', - imgSrc: - 'https://images.unsplash.com/photo-1632165258904-21ca36a01ee0?q=80&w=1635&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D', - imgAlt: 'Tobias', - }, - { - id: '4', - title: 'Francis', - imgSrc: - 'https://images.unsplash.com/photo-1596921825946-d738194fac80?q=80&w=1886&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D', - imgAlt: 'Francis', - }, - { - id: '5', - title: 'Toyota', - imgSrc: - 'https://images.unsplash.com/photo-1694185643879-536f8d785fa6?q=80&w=1664&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D', - imgAlt: 'Toyota', - }, - ]; - - pets.forEach((pet) => { - const avatar = new PetAvatar(pet); - avatar.mount($container); - }); -} - -SideMenu.prototype = Object.assign(SideMenu.prototype, Component.prototype); diff --git a/src/layouts/app/index.html b/src/layouts/app/index.html deleted file mode 100644 index 1ddfd058..00000000 --- a/src/layouts/app/index.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - Pet Hat - - - - - - - - - - - - - - - - - -
- - -
-
- - diff --git a/src/layouts/app/pages/PetWeight/petWeightPage.spec.js b/src/layouts/app/pages/PetWeight/petWeightPage.spec.js deleted file mode 100644 index ea9bc17e..00000000 --- a/src/layouts/app/pages/PetWeight/petWeightPage.spec.js +++ /dev/null @@ -1,16 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import PetWeightPage from './index'; - -const propsMock = { - petPhoto: 'https://via.placeholder.com/150', -}; - -describe('PetWeightPage', () => { - it('is a Function', () => { - expect(PetWeightPage).toBeInstanceOf(Function); - }); - - it.skip('returns an object', () => { - expect(new PetWeightPage(propsMock)).toBeInstanceOf(Object); - }); -}); diff --git a/src/layouts/app/components/Navigation/images/avatar.svg b/src/layouts/components/Navigation/images/avatar.svg similarity index 100% rename from src/layouts/app/components/Navigation/images/avatar.svg rename to src/layouts/components/Navigation/images/avatar.svg diff --git a/src/layouts/app/components/Navigation/images/bell.svg b/src/layouts/components/Navigation/images/bell.svg similarity index 100% rename from src/layouts/app/components/Navigation/images/bell.svg rename to src/layouts/components/Navigation/images/bell.svg diff --git a/src/layouts/app/components/Navigation/images/exit.svg b/src/layouts/components/Navigation/images/exit.svg similarity index 100% rename from src/layouts/app/components/Navigation/images/exit.svg rename to src/layouts/components/Navigation/images/exit.svg diff --git a/src/layouts/app/components/Navigation/images/menu.svg b/src/layouts/components/Navigation/images/menu.svg similarity index 100% rename from src/layouts/app/components/Navigation/images/menu.svg rename to src/layouts/components/Navigation/images/menu.svg diff --git a/src/layouts/app/components/Navigation/index.js b/src/layouts/components/Navigation/index.js similarity index 96% rename from src/layouts/app/components/Navigation/index.js rename to src/layouts/components/Navigation/index.js index 1f529662..a8059669 100644 --- a/src/layouts/app/components/Navigation/index.js +++ b/src/layouts/components/Navigation/index.js @@ -1,7 +1,7 @@ import { Component } from 'pet-dex-utilities'; import './index.scss'; -import petUrl from '../../../../images/pet-dex.svg'; +import petUrl from '../../../images/pet-dex.svg'; import avatarUrl from './images/avatar.svg'; import bellUrl from './images/bell.svg'; import exitUrl from './images/exit.svg'; diff --git a/src/layouts/app/components/Navigation/index.scss b/src/layouts/components/Navigation/index.scss similarity index 100% rename from src/layouts/app/components/Navigation/index.scss rename to src/layouts/components/Navigation/index.scss diff --git a/src/layouts/app/components/SideMenu/images/configuracoes.svg b/src/layouts/components/SideMenu/images/configuracoes.svg similarity index 100% rename from src/layouts/app/components/SideMenu/images/configuracoes.svg rename to src/layouts/components/SideMenu/images/configuracoes.svg diff --git a/src/layouts/app/components/SideMenu/images/conta.svg b/src/layouts/components/SideMenu/images/conta.svg similarity index 100% rename from src/layouts/app/components/SideMenu/images/conta.svg rename to src/layouts/components/SideMenu/images/conta.svg diff --git a/src/layouts/app/components/SideMenu/images/doacoes.svg b/src/layouts/components/SideMenu/images/doacoes.svg similarity index 100% rename from src/layouts/app/components/SideMenu/images/doacoes.svg rename to src/layouts/components/SideMenu/images/doacoes.svg diff --git a/src/layouts/app/components/SideMenu/images/exit.svg b/src/layouts/components/SideMenu/images/exit.svg similarity index 100% rename from src/layouts/app/components/SideMenu/images/exit.svg rename to src/layouts/components/SideMenu/images/exit.svg diff --git a/src/layouts/app/components/SideMenu/images/exitmenu.svg b/src/layouts/components/SideMenu/images/exitmenu.svg similarity index 100% rename from src/layouts/app/components/SideMenu/images/exitmenu.svg rename to src/layouts/components/SideMenu/images/exitmenu.svg diff --git a/src/layouts/app/components/SideMenu/images/meuspets.svg b/src/layouts/components/SideMenu/images/meuspets.svg similarity index 100% rename from src/layouts/app/components/SideMenu/images/meuspets.svg rename to src/layouts/components/SideMenu/images/meuspets.svg diff --git a/src/layouts/app/components/SideMenu/images/notifications.svg b/src/layouts/components/SideMenu/images/notifications.svg similarity index 100% rename from src/layouts/app/components/SideMenu/images/notifications.svg rename to src/layouts/components/SideMenu/images/notifications.svg diff --git a/src/layouts/app/components/SideMenu/images/perfil.svg b/src/layouts/components/SideMenu/images/perfil.svg similarity index 100% rename from src/layouts/app/components/SideMenu/images/perfil.svg rename to src/layouts/components/SideMenu/images/perfil.svg diff --git a/src/layouts/app/components/SideMenu/images/petdex.svg b/src/layouts/components/SideMenu/images/petdex.svg similarity index 100% rename from src/layouts/app/components/SideMenu/images/petdex.svg rename to src/layouts/components/SideMenu/images/petdex.svg diff --git a/src/layouts/components/SideMenu/index.js b/src/layouts/components/SideMenu/index.js new file mode 100644 index 00000000..e38cfc95 --- /dev/null +++ b/src/layouts/components/SideMenu/index.js @@ -0,0 +1,84 @@ +import { Component } from 'pet-dex-utilities'; +import PetAvatar from '../../../components/PetAvatar'; +import petUrl from '../../../images/pet-dex.svg'; +import { UserService } from '../../../services/userService'; +import configuracoes from './images/configuracoes.svg'; +import conta from './images/conta.svg'; +import doacoes from './images/doacoes.svg'; +import exit from './images/exit.svg'; +import exitMenu from './images/exitmenu.svg'; +import meusPets from './images/meuspets.svg'; +import notificacoes from './images/notifications.svg'; +import perfil from './images/perfil.svg'; +import petdex from './images/petdex.svg'; +import './index.scss'; + +const html = ` + +
+
+
+

Seu Pet

+
+
+
+
+ +
+
+ +`; + +export default function SideMenu() { + Component.call(this, { html }); + + const $container = this.selected.get('avatar-container'); + + const inputIdUser = 1; // ID simulando input usuário em componente futuro + // Para renderização do componente pets avatar, json-server deve está em execução. + UserService.getPets(inputIdUser).then((response) => { + response.forEach((pet) => { + const avatar = new PetAvatar(pet); + avatar.mount($container); + }); + }); +} + +SideMenu.prototype = Object.assign(SideMenu.prototype, Component.prototype); diff --git a/src/layouts/app/components/SideMenu/index.scss b/src/layouts/components/SideMenu/index.scss similarity index 80% rename from src/layouts/app/components/SideMenu/index.scss rename to src/layouts/components/SideMenu/index.scss index 99d8b35a..3ea4b4d3 100644 --- a/src/layouts/app/components/SideMenu/index.scss +++ b/src/layouts/components/SideMenu/index.scss @@ -85,11 +85,28 @@ } &__avatars-yourpet { + max-height: calc(8.5rem * 2 + 2rem); + overflow-y: auto; + display: grid; grid-template-columns: repeat(3, 6rem); - grid-gap: 2rem; + gap: 2rem; margin-top: 2rem; + padding: 0.4rem 0.2rem; + + &::-webkit-scrollbar { + width: 0.4rem; + } + + &::-webkit-scrollbar-track { + background: colors.$primary600; + } + + &::-webkit-scrollbar-thumb { + background-color: colors.$primary700; + border-radius: 1rem; + } } &__itens { @@ -142,7 +159,7 @@ } .side-menu-content { - width: 70%; + width: 80%; &__menuitens { transition: 0.3s; diff --git a/src/layouts/index.html b/src/layouts/index.html index 9c2cfa1d..1ddfd058 100644 --- a/src/layouts/index.html +++ b/src/layouts/index.html @@ -7,16 +7,90 @@ Pet Hat - + + + + + + + + + + + + + + -
+
+ + +
+
diff --git a/src/layouts/app/index.js b/src/layouts/index.js similarity index 89% rename from src/layouts/app/index.js rename to src/layouts/index.js index 193daa99..eaee2455 100644 --- a/src/layouts/app/index.js +++ b/src/layouts/index.js @@ -1,10 +1,10 @@ import { extractElements } from 'pet-dex-utilities'; -import mainRouter from '../../router/main-router'; -import { initializeSwiper } from '../../utils/swiper'; +import mainRouter from '../router/main-router'; +import { initializeSwiper } from '../utils/swiper'; import Navigation from './components/Navigation'; import SideMenu from './components/SideMenu'; -import initializeScrollable from './utils/scrollable-sidemenu'; import './index.scss'; +import initializeScrollable from './utils/scrollable-sidemenu'; document.addEventListener('DOMContentLoaded', () => { const selected = extractElements([document.body]); diff --git a/src/layouts/app/index.scss b/src/layouts/index.scss similarity index 100% rename from src/layouts/app/index.scss rename to src/layouts/index.scss diff --git a/src/layouts/app/pages/NoPetRegirested/images/no-pet-regirested-page.png b/src/layouts/pages/NoPetRegirested/images/no-pet-regirested-page.png similarity index 100% rename from src/layouts/app/pages/NoPetRegirested/images/no-pet-regirested-page.png rename to src/layouts/pages/NoPetRegirested/images/no-pet-regirested-page.png diff --git a/src/layouts/app/pages/NoPetRegirested/index.js b/src/layouts/pages/NoPetRegirested/index.js similarity index 87% rename from src/layouts/app/pages/NoPetRegirested/index.js rename to src/layouts/pages/NoPetRegirested/index.js index 032a20c6..f2b8f7f5 100644 --- a/src/layouts/app/pages/NoPetRegirested/index.js +++ b/src/layouts/pages/NoPetRegirested/index.js @@ -1,5 +1,6 @@ import { Component } from 'pet-dex-utilities'; -import Button from '../../../../components/Button'; +import { Router } from 'vanilla-routing'; +import Button from '~src/components/Button'; import petUrl from './images/no-pet-regirested-page.png'; import './index.scss'; @@ -30,6 +31,10 @@ export default function NoPetRegirested() { .get('button') .classList.add('no-pet-regirested-page__button'); this.button.mount($container); + + this.button.listen('click', () => { + Router.go('/add/addpets'); + }); } NoPetRegirested.prototype = Object.assign( diff --git a/src/layouts/app/pages/NoPetRegirested/index.scss b/src/layouts/pages/NoPetRegirested/index.scss similarity index 100% rename from src/layouts/app/pages/NoPetRegirested/index.scss rename to src/layouts/pages/NoPetRegirested/index.scss diff --git a/src/layouts/app/pages/PetRegister/index.js b/src/layouts/pages/PetRegister/index.js similarity index 93% rename from src/layouts/app/pages/PetRegister/index.js rename to src/layouts/pages/PetRegister/index.js index 34741b40..2c31018c 100644 --- a/src/layouts/app/pages/PetRegister/index.js +++ b/src/layouts/pages/PetRegister/index.js @@ -1,6 +1,6 @@ import { Component } from 'pet-dex-utilities'; -import Button from '../../../../components/Button'; -import PetCard from '../../../../components/PetCard'; +import Button from '~src/components/Button'; +import PetCard from '~src/components/PetCard'; import './index.scss'; const events = ['select:card', 'submit']; diff --git a/src/layouts/app/pages/PetRegister/index.scss b/src/layouts/pages/PetRegister/index.scss similarity index 100% rename from src/layouts/app/pages/PetRegister/index.scss rename to src/layouts/pages/PetRegister/index.scss diff --git a/src/layouts/app/pages/PetRegister/index.spec.js b/src/layouts/pages/PetRegister/index.spec.js similarity index 91% rename from src/layouts/app/pages/PetRegister/index.spec.js rename to src/layouts/pages/PetRegister/index.spec.js index 82984c7d..e7821de0 100644 --- a/src/layouts/app/pages/PetRegister/index.spec.js +++ b/src/layouts/pages/PetRegister/index.spec.js @@ -1,11 +1,11 @@ -import { describe, expect, it } from 'vitest'; -import { render, screen } from '@testing-library/vanilla'; import { userEvent } from '@testing-library/user-event'; +import { render, screen } from '@testing-library/vanilla'; +import { describe, expect, it } from 'vitest'; -import afghanHound from '../../../../stories/assets/petRegisterPage/afghanHound.svg'; -import akita from '../../../../stories/assets/petRegisterPage/akita.svg'; -import beagle from '../../../../stories/assets/petRegisterPage/beagle.svg'; -import mixedBreed from '../../../../stories/assets/petRegisterPage/mixedBreed.svg'; +import afghanHound from '~stories/assets/petRegisterPage/afghanHound.svg'; +import akita from '~stories/assets/petRegisterPage/akita.svg'; +import beagle from '~stories/assets/petRegisterPage/beagle.svg'; +import mixedBreed from '~stories/assets/petRegisterPage/mixedBreed.svg'; import PetRegisterPage from './index'; diff --git a/src/layouts/app/pages/PetVet/images/cuidadosEspeciais.svg b/src/layouts/pages/PetVet/images/cuidadosEspeciais.svg similarity index 100% rename from src/layouts/app/pages/PetVet/images/cuidadosEspeciais.svg rename to src/layouts/pages/PetVet/images/cuidadosEspeciais.svg diff --git a/src/layouts/app/pages/PetVet/images/estetoscopio.svg b/src/layouts/pages/PetVet/images/estetoscopio.svg similarity index 100% rename from src/layouts/app/pages/PetVet/images/estetoscopio.svg rename to src/layouts/pages/PetVet/images/estetoscopio.svg diff --git a/src/layouts/app/pages/PetVet/index.js b/src/layouts/pages/PetVet/index.js similarity index 95% rename from src/layouts/app/pages/PetVet/index.js rename to src/layouts/pages/PetVet/index.js index 31e32e0c..e9b2d28f 100644 --- a/src/layouts/app/pages/PetVet/index.js +++ b/src/layouts/pages/PetVet/index.js @@ -1,11 +1,11 @@ import { Component } from 'pet-dex-utilities'; -import TextArea from '../../../../components/TextArea'; -import Button from '../../../../components/Button'; -import Radio from '../../../../components/RadioButton'; -import Vaccine from '../../../../components/Vaccine'; +import Button from '~src/components/Button'; +import Radio from '~src/components/RadioButton'; +import TextArea from '~src/components/TextArea'; +import Vaccine from '~src/components/Vaccine'; -import estetoscopio from './images/estetoscopio.svg'; import cuidadosEspeciais from './images/cuidadosEspeciais.svg'; +import estetoscopio from './images/estetoscopio.svg'; import './index.scss'; diff --git a/src/layouts/app/pages/PetVet/index.scss b/src/layouts/pages/PetVet/index.scss similarity index 100% rename from src/layouts/app/pages/PetVet/index.scss rename to src/layouts/pages/PetVet/index.scss diff --git a/src/layouts/app/pages/PetVet/index.spec.js b/src/layouts/pages/PetVet/index.spec.js similarity index 100% rename from src/layouts/app/pages/PetVet/index.spec.js rename to src/layouts/pages/PetVet/index.spec.js diff --git a/src/layouts/app/pages/PetWeight/index.js b/src/layouts/pages/PetWeight/index.js similarity index 93% rename from src/layouts/app/pages/PetWeight/index.js rename to src/layouts/pages/PetWeight/index.js index e1676039..117473bb 100644 --- a/src/layouts/app/pages/PetWeight/index.js +++ b/src/layouts/pages/PetWeight/index.js @@ -1,9 +1,9 @@ import { Component } from 'pet-dex-utilities'; -import Button from '../../../../components/Button'; -import RadioButton from '../../../../components/RadioButton'; -import RangeSlider from '../../../../components/RangeSlider'; -import TextInput from '../../../../components/TextInput'; -import UploadImage from '../../../../components/UploadImage'; +import Button from '~src/components/Button'; +import RadioButton from '~src/components/RadioButton'; +import RangeSlider from '~src/components/RangeSlider'; +import TextInput from '~src/components/TextInput'; +import UploadImage from '~src/components/UploadImage'; import './index.scss'; const events = ['submit']; diff --git a/src/layouts/app/pages/PetWeight/index.scss b/src/layouts/pages/PetWeight/index.scss similarity index 100% rename from src/layouts/app/pages/PetWeight/index.scss rename to src/layouts/pages/PetWeight/index.scss diff --git a/src/layouts/pages/PetWeight/petWeightPage.spec.js b/src/layouts/pages/PetWeight/petWeightPage.spec.js new file mode 100644 index 00000000..f06841b8 --- /dev/null +++ b/src/layouts/pages/PetWeight/petWeightPage.spec.js @@ -0,0 +1,93 @@ +import { describe, expect, it } from 'vitest'; +import { render, screen, userEvent, waitFor } from '@testing-library/vanilla'; +import PetWeightPage from '.'; + +const propsMock = { + petPhoto: 'https://via.placeholder.com/150', +}; + +const makeComponent = (params) => render(new PetWeightPage(params)); + +describe('Pet Weight page', () => { + it('renders image', async () => { + const page = makeComponent(propsMock.petPhoto); + + render(page); + const image = screen.getByAltText('Imagem carregada'); + + expect(image).toBeInTheDocument(); + }); + + it('KG radio is checked by default', () => { + const page = makeComponent(propsMock.petPhoto); + render(page); + + const radioKG = screen.getByLabelText('KG'); + + expect(radioKG.checked).toBe(true); + }); + + it('selects radio buttons when clicked and desselects the other', async () => { + const page = makeComponent(propsMock.petPhoto); + render(page); + + const radioButtonKG = screen.getByLabelText('KG'); + const radioButtonLB = screen.getByLabelText('LB'); + + await userEvent.click(radioButtonKG); + expect(radioButtonKG).toBeChecked(); + expect(radioButtonLB).not.toBeChecked(); + + await userEvent.click(radioButtonLB); + expect(radioButtonLB).toBeChecked(); + expect(radioButtonKG).not.toBeChecked(); + }); + + it('allows typing in the input field', async () => { + const page = makeComponent(propsMock.petPhoto); + render(page); + + const input = screen.getByPlaceholderText('Peso'); + + await userEvent.type(input, '5'); + + expect(input).toHaveValue('5'); + }); + + it('shows right value in slider when value changes in the input field', async () => { + const page = makeComponent(propsMock.petPhoto); + render(page); + + const input = screen.getByPlaceholderText('Peso'); + const slider = screen.getByText('10.0'); + + await userEvent.clear(input); + await userEvent.type(input, '5'); + + await waitFor(() => { + expect(slider).toHaveTextContent('5.0'); + }); + }); + + it('emits data when continue button is clicked', async () => { + const page = makeComponent(propsMock.petPhoto); + render(page); + + const input = screen.getByPlaceholderText('Peso'); + const radioKG = screen.getByLabelText('KG'); + const continueButton = screen.getByRole('button', { name: 'Continuar' }); + + await userEvent.clear(input); + await userEvent.type(input, '5'); + await userEvent.click(radioKG); + + const mockEmit = vi.spyOn(page, 'emit'); + + await userEvent.click(continueButton); + + expect(mockEmit).toHaveBeenCalledWith('submit', { + weight: 5.0, + weightUnit: 'kg', + }); + }); +}); diff --git a/src/layouts/sample-page/index.html b/src/layouts/sample-page/index.html new file mode 100644 index 00000000..3cc82f6b --- /dev/null +++ b/src/layouts/sample-page/index.html @@ -0,0 +1,11 @@ + + + + + + Document + + + Hello world + + diff --git a/src/layouts/app/utils/scrollable-sidemenu.js b/src/layouts/utils/scrollable-sidemenu.js similarity index 100% rename from src/layouts/app/utils/scrollable-sidemenu.js rename to src/layouts/utils/scrollable-sidemenu.js diff --git a/src/router/main-router.js b/src/router/main-router.js index a7ef79ae..751aee18 100644 --- a/src/router/main-router.js +++ b/src/router/main-router.js @@ -1,13 +1,15 @@ import { BrowserRoute } from 'vanilla-routing'; -import addPet from './routes/add-pet/add-pet'; -import mainRoutes from './routes/main-routes/main-routes'; -import myPets from './routes/my-pets/my-pets'; +import addPet from './routes/app/add-pet/add-pet'; +import mainRoutes from './routes/app/main-routes/main-routes'; +import myPets from './routes/app/my-pets/my-pets'; +import account from './routes/create-account/account'; // export default function mainRouter() { const routes = [ ...Object.values(mainRoutes), ...Object.values(myPets), ...Object.values(addPet), + ...Object.values(account), // ]; BrowserRoute(routes); diff --git a/src/router/routes/add-pet/add-pet.js b/src/router/routes/app/add-pet/add-pet.js similarity index 100% rename from src/router/routes/add-pet/add-pet.js rename to src/router/routes/app/add-pet/add-pet.js diff --git a/src/router/routes/add-pet/steps/birthday.js b/src/router/routes/app/add-pet/steps/birthday.js similarity index 73% rename from src/router/routes/add-pet/steps/birthday.js rename to src/router/routes/app/add-pet/steps/birthday.js index 04878488..7849b9c0 100644 --- a/src/router/routes/add-pet/steps/birthday.js +++ b/src/router/routes/app/add-pet/steps/birthday.js @@ -1,7 +1,7 @@ -import NoPetRegirestedPage from '../../../../layouts/app/pages/NoPetRegirested'; +import NoPetRegirestedPage from '~src/layouts/pages/NoPetRegirested'; export default { - pathname: '/app/pet-birthday', + pathname: '/pet-birthday', element: () => { const $content = document.createElement('div'); $content.classList.add('home__content-page'); diff --git a/src/router/routes/add-pet/steps/name.js b/src/router/routes/app/add-pet/steps/name.js similarity index 74% rename from src/router/routes/add-pet/steps/name.js rename to src/router/routes/app/add-pet/steps/name.js index ebe9097a..f4b5532c 100644 --- a/src/router/routes/add-pet/steps/name.js +++ b/src/router/routes/app/add-pet/steps/name.js @@ -1,7 +1,7 @@ -import NoPetRegirestedPage from '../../../../layouts/app/pages/NoPetRegirested'; +import NoPetRegirestedPage from '~src/layouts/pages/NoPetRegirested'; export default { - pathname: '/app/pet-name', + pathname: '/pet-name', element: () => { const $content = document.createElement('div'); $content.classList.add('home__content-page'); diff --git a/src/router/routes/add-pet/steps/petvet.js b/src/router/routes/app/add-pet/steps/petvet.js similarity index 74% rename from src/router/routes/add-pet/steps/petvet.js rename to src/router/routes/app/add-pet/steps/petvet.js index 3f39ef90..08104be3 100644 --- a/src/router/routes/add-pet/steps/petvet.js +++ b/src/router/routes/app/add-pet/steps/petvet.js @@ -1,7 +1,7 @@ -import NoPetRegirestedPage from '../../../../layouts/app/pages/NoPetRegirested'; +import NoPetRegirestedPage from '~src/layouts/pages/NoPetRegirested'; export default { - pathname: '/app/pet-vet', + pathname: '/pet-vet', element: () => { const $content = document.createElement('div'); $content.classList.add('home__content-page'); diff --git a/src/router/routes/add-pet/steps/race.js b/src/router/routes/app/add-pet/steps/race.js similarity index 74% rename from src/router/routes/add-pet/steps/race.js rename to src/router/routes/app/add-pet/steps/race.js index fc0975b7..099fe9c4 100644 --- a/src/router/routes/add-pet/steps/race.js +++ b/src/router/routes/app/add-pet/steps/race.js @@ -1,7 +1,7 @@ -import NoPetRegirestedPage from '../../../../layouts/app/pages/NoPetRegirested'; +import NoPetRegirestedPage from '~src/layouts/pages/NoPetRegirested'; export default { - pathname: '/app/pet-race', + pathname: '/pet-race', element: () => { const $content = document.createElement('div'); $content.classList.add('home__content-page'); diff --git a/src/router/routes/add-pet/steps/register.js b/src/router/routes/app/add-pet/steps/register.js similarity index 73% rename from src/router/routes/add-pet/steps/register.js rename to src/router/routes/app/add-pet/steps/register.js index 36efb960..94753a19 100644 --- a/src/router/routes/add-pet/steps/register.js +++ b/src/router/routes/app/add-pet/steps/register.js @@ -1,7 +1,7 @@ -import NoPetRegirestedPage from '../../../../layouts/app/pages/NoPetRegirested'; +import NoPetRegirestedPage from '~src/layouts/pages/NoPetRegirested'; export default { - pathname: '/app/pet-register', + pathname: '/pet-register', element: () => { const $content = document.createElement('div'); $content.classList.add('home__content-page'); diff --git a/src/router/routes/add-pet/steps/size.js b/src/router/routes/app/add-pet/steps/size.js similarity index 74% rename from src/router/routes/add-pet/steps/size.js rename to src/router/routes/app/add-pet/steps/size.js index 2975775c..f4fa7f54 100644 --- a/src/router/routes/add-pet/steps/size.js +++ b/src/router/routes/app/add-pet/steps/size.js @@ -1,7 +1,7 @@ -import NoPetRegirestedPage from '../../../../layouts/app/pages/NoPetRegirested'; +import NoPetRegirestedPage from '~src/layouts/pages/NoPetRegirested'; export default { - pathname: '/app/pet-size', + pathname: '/pet-size', element: () => { const $content = document.createElement('div'); $content.classList.add('home__content-page'); diff --git a/src/router/routes/add-pet/steps/weight.js b/src/router/routes/app/add-pet/steps/weight.js similarity index 73% rename from src/router/routes/add-pet/steps/weight.js rename to src/router/routes/app/add-pet/steps/weight.js index e5d74704..2dd6ac01 100644 --- a/src/router/routes/add-pet/steps/weight.js +++ b/src/router/routes/app/add-pet/steps/weight.js @@ -1,7 +1,7 @@ -import NoPetRegirestedPage from '../../../../layouts/app/pages/NoPetRegirested'; +import NoPetRegirestedPage from '~src/layouts/pages/NoPetRegirested'; export default { - pathname: '/app/pet-weight', + pathname: '/pet-weight', element: () => { const $content = document.createElement('div'); $content.classList.add('home__content-page'); diff --git a/src/router/routes/main-routes/main-routes.js b/src/router/routes/app/main-routes/main-routes.js similarity index 100% rename from src/router/routes/main-routes/main-routes.js rename to src/router/routes/app/main-routes/main-routes.js diff --git a/src/router/routes/main-routes/routes/account.js b/src/router/routes/app/main-routes/routes/account.js similarity index 74% rename from src/router/routes/main-routes/routes/account.js rename to src/router/routes/app/main-routes/routes/account.js index 7a4efb89..901ad359 100644 --- a/src/router/routes/main-routes/routes/account.js +++ b/src/router/routes/app/main-routes/routes/account.js @@ -1,7 +1,7 @@ -import NoPetRegirestedPage from '../../../../layouts/app/pages/NoPetRegirested'; +import NoPetRegirestedPage from '~src/layouts/pages/NoPetRegirested'; export default { - pathname: '/app/account', + pathname: '/account', element: () => { const $content = document.createElement('div'); $content.classList.add('home__content-page'); diff --git a/src/router/routes/main-routes/routes/donates.js b/src/router/routes/app/main-routes/routes/donates.js similarity index 74% rename from src/router/routes/main-routes/routes/donates.js rename to src/router/routes/app/main-routes/routes/donates.js index ae29d8c8..2d9b924a 100644 --- a/src/router/routes/main-routes/routes/donates.js +++ b/src/router/routes/app/main-routes/routes/donates.js @@ -1,7 +1,7 @@ -import NoPetRegirestedPage from '../../../../layouts/app/pages/NoPetRegirested'; +import NoPetRegirestedPage from '~src/layouts/pages/NoPetRegirested'; export default { - pathname: '/app/donates', + pathname: '/donates', element: () => { const $content = document.createElement('div'); $content.classList.add('home__content-page'); diff --git a/src/router/routes/main-routes/routes/error.js b/src/router/routes/app/main-routes/routes/error.js similarity index 81% rename from src/router/routes/main-routes/routes/error.js rename to src/router/routes/app/main-routes/routes/error.js index 12c14736..427d1d40 100644 --- a/src/router/routes/main-routes/routes/error.js +++ b/src/router/routes/app/main-routes/routes/error.js @@ -1,4 +1,4 @@ -import NoPetRegirestedPage from '../../../../layouts/app/pages/NoPetRegirested'; +import NoPetRegirestedPage from '~src/layouts/pages/NoPetRegirested'; export default { pathname: '*', diff --git a/src/router/routes/main-routes/routes/home.js b/src/router/routes/app/main-routes/routes/home.js similarity index 72% rename from src/router/routes/main-routes/routes/home.js rename to src/router/routes/app/main-routes/routes/home.js index 133bed06..09e72e9d 100644 --- a/src/router/routes/main-routes/routes/home.js +++ b/src/router/routes/app/main-routes/routes/home.js @@ -1,7 +1,7 @@ -import NoPetRegirestedPage from '../../../../layouts/app/pages/NoPetRegirested'; +import NoPetRegirestedPage from '~src/layouts/pages/NoPetRegirested'; export default { - pathname: '/app/', + pathname: '/', element: () => { const $content = document.createElement('div'); $content.classList.add('home__content-page'); diff --git a/src/router/routes/main-routes/routes/pet-dex.js b/src/router/routes/app/main-routes/routes/pet-dex.js similarity index 74% rename from src/router/routes/main-routes/routes/pet-dex.js rename to src/router/routes/app/main-routes/routes/pet-dex.js index c6f651af..37fa15e1 100644 --- a/src/router/routes/main-routes/routes/pet-dex.js +++ b/src/router/routes/app/main-routes/routes/pet-dex.js @@ -1,7 +1,7 @@ -import NoPetRegirestedPage from '../../../../layouts/app/pages/NoPetRegirested'; +import NoPetRegirestedPage from '~src/layouts/pages/NoPetRegirested'; export default { - pathname: '/app/pet-dex', + pathname: '/pet-dex', element: () => { const $content = document.createElement('div'); $content.classList.add('home__content-page'); diff --git a/src/router/routes/main-routes/routes/settings.js b/src/router/routes/app/main-routes/routes/settings.js similarity index 74% rename from src/router/routes/main-routes/routes/settings.js rename to src/router/routes/app/main-routes/routes/settings.js index 372dc5b3..04f4396d 100644 --- a/src/router/routes/main-routes/routes/settings.js +++ b/src/router/routes/app/main-routes/routes/settings.js @@ -1,7 +1,7 @@ -import NoPetRegirestedPage from '../../../../layouts/app/pages/NoPetRegirested'; +import NoPetRegirestedPage from '~src/layouts/pages/NoPetRegirested'; export default { - pathname: '/app/settings', + pathname: '/settings', element: () => { const $content = document.createElement('div'); $content.classList.add('home__content-page'); diff --git a/src/router/routes/my-pets/my-pets.js b/src/router/routes/app/my-pets/my-pets.js similarity index 100% rename from src/router/routes/my-pets/my-pets.js rename to src/router/routes/app/my-pets/my-pets.js diff --git a/src/router/routes/my-pets/steps/pet-profile.js b/src/router/routes/app/my-pets/steps/pet-profile.js similarity index 73% rename from src/router/routes/my-pets/steps/pet-profile.js rename to src/router/routes/app/my-pets/steps/pet-profile.js index 8cf6583e..80485795 100644 --- a/src/router/routes/my-pets/steps/pet-profile.js +++ b/src/router/routes/app/my-pets/steps/pet-profile.js @@ -1,7 +1,7 @@ -import NoPetRegirestedPage from '../../../../layouts/app/pages/NoPetRegirested'; +import NoPetRegirestedPage from '~src/layouts/pages/NoPetRegirested'; export default { - pathname: '/app/pet-profile', + pathname: '/pet-profile', element: () => { const $content = document.createElement('div'); $content.classList.add('home__content-page'); diff --git a/src/router/routes/my-pets/steps/pets.js b/src/router/routes/app/my-pets/steps/pets.js similarity index 74% rename from src/router/routes/my-pets/steps/pets.js rename to src/router/routes/app/my-pets/steps/pets.js index b67e3c9c..2311e331 100644 --- a/src/router/routes/my-pets/steps/pets.js +++ b/src/router/routes/app/my-pets/steps/pets.js @@ -1,7 +1,7 @@ -import NoPetRegirestedPage from '../../../../layouts/app/pages/NoPetRegirested'; +import NoPetRegirestedPage from '~src/layouts/pages/NoPetRegirested'; export default { - pathname: '/app/pets', + pathname: '/pets', element: () => { const $content = document.createElement('div'); $content.classList.add('home__content-page'); diff --git a/src/router/routes/create-account/account.js b/src/router/routes/create-account/account.js new file mode 100644 index 00000000..c0e4ae1b --- /dev/null +++ b/src/router/routes/create-account/account.js @@ -0,0 +1,5 @@ +import createAccount from './create-account'; + +export default { + createAccount, +}; diff --git a/src/router/routes/create-account/create-account.js b/src/router/routes/create-account/create-account.js new file mode 100644 index 00000000..89b2f4d2 --- /dev/null +++ b/src/router/routes/create-account/create-account.js @@ -0,0 +1,13 @@ +import NoPetRegirestedPage from '~src/layouts/pages/NoPetRegirested'; + +export default { + pathname: '/account/create-account', + element: () => { + const $content = document.createElement('div'); + $content.classList.add('home__content-page'); + $content.style.backgroundColor = 'orange'; + const noPetRegirestedPage = new NoPetRegirestedPage(); + noPetRegirestedPage.mount($content); + return $content; + }, +}; diff --git a/src/services/userService.js b/src/services/userService.js index 2e3368a9..3f2f2b75 100644 --- a/src/services/userService.js +++ b/src/services/userService.js @@ -3,21 +3,23 @@ import { url } from './api'; export const UserService = { getPets: async (userId) => { try { - const response = await fetch(`${url}/${userId}`); + const response = await fetch(`${url}/api/user/${userId}/my-pets`); if (!response.ok) { - throw new Error('Ocorreu um erro na requisição'); + throw new Error('Failed request'); } const { pets } = await response.json(); return pets; } catch (error) { - return `Ocorreu o seguinte erro: ${error}`; + console.error(`An error occurred: ${error}`); + return `An error occurred: ${error}`; } }, + login: async (email, password) => { try { - const response = await fetch(`${url}/login`, { + const response = await fetch(`${url}/api/user/login`, { method: 'POST', body: JSON.stringify({ email, password }), }); @@ -37,4 +39,32 @@ export const UserService = { }; } }, + + registerUser: async (userData) => { + try { + const response = await fetch(`${url}/naoSeiARota`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(userData), + }); + + if (!response.ok) { + throw new Error('Failed to register user'); + } + + const result = await response.json(); + return { + success: true, + data: result, + }; + } catch (error) { + console.error(`An error occurred: ${error}`); + return { + success: false, + message: error.message, + }; + } + }, }; diff --git a/src/stories/PetRegister.stories.js b/src/stories/PetRegister.stories.js index d909c332..1906ea04 100644 --- a/src/stories/PetRegister.stories.js +++ b/src/stories/PetRegister.stories.js @@ -1,4 +1,4 @@ -import PetRegister from '../layouts/app/pages/PetRegister'; +import PetRegister from '~layouts/pages/PetRegister'; export default { title: 'Pages/PetProfile', diff --git a/src/stories/PetRegisterPage.stories.js b/src/stories/PetRegisterPage.stories.js index 4182e93c..8178e611 100644 --- a/src/stories/PetRegisterPage.stories.js +++ b/src/stories/PetRegisterPage.stories.js @@ -1,4 +1,4 @@ -import PetRegisterPage from '../layouts/app/pages/PetRegister'; +import PetRegisterPage from '~layouts/pages/PetRegister'; import afghanHound from './assets/petRegisterPage/afghanHound.svg'; import akita from './assets/petRegisterPage/akita.svg'; diff --git a/src/stories/PetVetPage.stories.js b/src/stories/PetVetPage.stories.js index bb533915..4a0dc0a2 100644 --- a/src/stories/PetVetPage.stories.js +++ b/src/stories/PetVetPage.stories.js @@ -1,4 +1,4 @@ -import PetVetPage from '../layouts/app/pages/PetVet'; +import PetVetPage from '~layouts/pages/PetVet'; export default { title: 'Pages/PetVetPage', diff --git a/src/stories/PetWeightPage.stories.js b/src/stories/PetWeightPage.stories.js index 7f27364f..7b7f072d 100644 --- a/src/stories/PetWeightPage.stories.js +++ b/src/stories/PetWeightPage.stories.js @@ -1,4 +1,4 @@ -import PetWeightPage from '../layouts/app/pages/PetWeight'; +import PetWeightPage from '~layouts/pages/PetWeight'; export default { title: 'Pages/PetWeightPage', diff --git a/vite.config.js b/vite.config.js index be6ec5ff..a32dfaec 100644 --- a/vite.config.js +++ b/vite.config.js @@ -6,7 +6,7 @@ import jsconfigPaths from 'vite-jsconfig-paths'; import { VitePWA } from 'vite-plugin-pwa'; export default defineConfig({ - root: resolve(__dirname, 'src/layouts'), + root: resolve(__dirname, 'src/layouts/'), define: { __isBrowser__: true, }, @@ -34,13 +34,16 @@ export default defineConfig({ rollupOptions: { input: { index: resolve(__dirname, 'src/layouts/index.html'), - home: resolve(__dirname, 'src/layouts/app/index.html'), + teste: resolve(__dirname, 'src/layouts/sample-page/index.html'), }, }, }, resolve: { alias: { + '~src': resolve(__dirname, 'src'), '~styles': resolve(__dirname, 'src/styles'), + '~stories': resolve(__dirname, 'src/stories'), + '~layouts': resolve(__dirname, 'src/layouts'), }, }, plugins: [