From 955664587d9e087005501756ec9d3f3c982d6648 Mon Sep 17 00:00:00 2001 From: minjeong kim <6alswjd6@gmail.com> Date: Fri, 11 Aug 2023 00:52:39 +0900 Subject: [PATCH 01/48] chore: elinst prettier setting --- .eslintrc | 35 + .prettierrc | 8 + package-lock.json | 1025 ++++++++++++++++++++++++------ package.json | 7 + src/index.tsx | 4 +- src/service-worker.ts | 7 +- src/serviceWorkerRegistration.ts | 12 +- 7 files changed, 907 insertions(+), 191 deletions(-) create mode 100644 .eslintrc create mode 100644 .prettierrc diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..ba611e1 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,35 @@ +{ + // 전역변수 환경 설정 + "env": { + "browser": true, + "es2021": true + }, + + // npm을 통해 설치한 외부 ESLint 설정 등록 (eslint-config-{name}으로 설치) + "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"], + + // ESLint에 지원할 JavaScript 옵션 설정 + "parserOptions": { + "ecmaFeatures": { + "jsx": true + }, + "ecmaVersion": 12, + "sourceType": "module" + }, + + // parser 등록 + "parser": "@typescript-eslint/parser", + + // 사용자 규칙 추가할 플러그인 (eslint-plugin-{name}으로 설치) + "plugins": ["@typescript-eslint", "prettier"], + + // 플러그인을 통해 설치한 것 외에 규칙 설정 + "rules": { + "prettier/prettier": [ + "error", + { + "endOfLine": "auto" + } + ] + } +} diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..3795db1 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,8 @@ +{ + "singleQuote": true, + "semi": true, + "tabWidth": 2, + "trailingComma": "all", + "printWidth": 80, + "arrowParens": "always" +} diff --git a/package-lock.json b/package-lock.json index 0dd39d9..1afe068 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,6 +32,13 @@ "workbox-routing": "^6.6.0", "workbox-strategies": "^6.6.0", "workbox-streams": "^6.6.0" + }, + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^6.3.0", + "@typescript-eslint/parser": "^6.3.0", + "eslint": "^8.46.0", + "eslint-plugin-prettier": "^5.0.0", + "prettier": "^3.0.1" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -3185,6 +3192,56 @@ "node": ">= 8" } }, + "node_modules/@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@pkgr/utils/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@pkgr/utils/node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.10", "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz", @@ -3552,104 +3609,6 @@ "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@testing-library/dom": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.1.tgz", - "integrity": "sha512-0DGPd9AR3+iDTjGoMpxIkAsUihHZ3Ai6CneU6bRRrffXMgzCdlNk43jTrD2/5LT6CBb3MWTP8v510JzYtahD2w==", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@testing-library/dom/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@testing-library/dom/node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "peer": true, - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/@testing-library/dom/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@testing-library/dom/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@testing-library/dom/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, - "node_modules/@testing-library/dom/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/dom/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@testing-library/jest-dom": { "version": "5.17.0", "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", @@ -4213,31 +4172,34 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.3.0.tgz", + "integrity": "sha512-IZYjYZ0ifGSLZbwMqIip/nOamFiWJ9AH+T/GYNZBWkVcyNQOFGtSMoWV7RvY4poYCMZ/4lHzNl796WOSNxmk8A==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.3.0", + "@typescript-eslint/type-utils": "6.3.0", + "@typescript-eslint/utils": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0", "debug": "^4.3.4", "graphemer": "^1.4.0", - "ignore": "^5.2.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4245,6 +4207,105 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.3.0.tgz", + "integrity": "sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.3.0.tgz", + "integrity": "sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.3.0.tgz", + "integrity": "sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.3.0.tgz", + "integrity": "sha512-hLLg3BZE07XHnpzglNBG8P/IXq/ZVXraEbgY7FM0Cnc1ehM8RMdn9mat3LubJ3KBeYXXPxV1nugWbQPjGeJk6Q==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.3.0", + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/typescript-estree": "6.3.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.3.0.tgz", + "integrity": "sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.3.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/experimental-utils": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", @@ -4264,24 +4325,83 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.3.0.tgz", + "integrity": "sha512-ibP+y2Gr6p0qsUkhs7InMdXrwldjxZw66wpcQq9/PzAroM45wdwyu81T+7RibNCh8oc0AgrsyCwJByncY0Ongg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.3.0", + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/typescript-estree": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.3.0.tgz", + "integrity": "sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.3.0.tgz", + "integrity": "sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.3.0.tgz", + "integrity": "sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependenciesMeta": { "typescript": { @@ -4289,6 +4409,23 @@ } } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.3.0.tgz", + "integrity": "sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.3.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/scope-manager": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", @@ -4306,24 +4443,25 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.3.0.tgz", + "integrity": "sha512-7Oj+1ox1T2Yc8PKpBvOKWhoI/4rWFd1j7FA/rPE0lbBPXTKjdbtC+7Ev0SeBjEKkIhKWVeZSP+mR7y1Db1CdfQ==", + "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", + "@typescript-eslint/typescript-estree": "6.3.0", + "@typescript-eslint/utils": "6.3.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4331,6 +4469,105 @@ } } }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.3.0.tgz", + "integrity": "sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.3.0.tgz", + "integrity": "sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.3.0.tgz", + "integrity": "sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.3.0.tgz", + "integrity": "sha512-hLLg3BZE07XHnpzglNBG8P/IXq/ZVXraEbgY7FM0Cnc1ehM8RMdn9mat3LubJ3KBeYXXPxV1nugWbQPjGeJk6Q==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.3.0", + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/typescript-estree": "6.3.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.3.0.tgz", + "integrity": "sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.3.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/types": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", @@ -5350,6 +5587,15 @@ "node": ">= 8.0.0" } }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -5442,6 +5688,18 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -5522,6 +5780,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -6406,74 +6679,218 @@ "whatwg-url": "^8.0.0" }, "engines": { - "node": ">=10" + "node": ">=10" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" + }, + "node_modules/deep-equal": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz", + "integrity": "sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.1", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/default-browser/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/default-browser/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/default-browser/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, "dependencies": { - "ms": "2.1.2" + "path-key": "^4.0.0" }, "engines": { - "node": ">=6.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" - }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" - }, - "node_modules/deep-equal": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz", - "integrity": "sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==", + "node_modules/default-browser/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.1", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + "node_modules/default-browser/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "node_modules/default-browser/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/default-gateway": { @@ -7091,6 +7508,91 @@ "eslint": "^8.0.0" } }, + "node_modules/eslint-config-react-app/node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-react-app/node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-react-app/node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -7268,6 +7770,35 @@ "semver": "bin/semver.js" } }, + "node_modules/eslint-plugin-prettier": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, "node_modules/eslint-plugin-react": { "version": "7.33.1", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.1.tgz", @@ -7806,6 +8337,12 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, "node_modules/fast-glob": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", @@ -9163,6 +9700,39 @@ "node": ">=0.10.0" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-map": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", @@ -13916,6 +14486,33 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.1.tgz", + "integrity": "sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -14768,6 +15365,21 @@ "node": ">=8" } }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -15719,6 +16331,22 @@ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, + "node_modules/synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/tailwindcss": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", @@ -15916,6 +16544,18 @@ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -15986,6 +16626,18 @@ "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" }, + "node_modules/ts-api-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", + "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -16250,6 +16902,15 @@ "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==" }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", diff --git a/package.json b/package.json index cce923b..b15157a 100644 --- a/package.json +++ b/package.json @@ -51,5 +51,12 @@ "last 1 firefox version", "last 1 safari version" ] + }, + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^6.3.0", + "@typescript-eslint/parser": "^6.3.0", + "eslint": "^8.46.0", + "eslint-plugin-prettier": "^5.0.0", + "prettier": "^3.0.1" } } diff --git a/src/index.tsx b/src/index.tsx index 39219e2..e05f55c 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -6,12 +6,12 @@ import * as serviceWorkerRegistration from './serviceWorkerRegistration'; import reportWebVitals from './reportWebVitals'; const root = ReactDOM.createRoot( - document.getElementById('root') as HTMLElement + document.getElementById('root') as HTMLElement, ); root.render( - + , ); // If you want your app to work offline and load faster, you can change diff --git a/src/service-worker.ts b/src/service-worker.ts index 652a8a4..bb4319b 100644 --- a/src/service-worker.ts +++ b/src/service-worker.ts @@ -50,14 +50,15 @@ registerRoute( // Return true to signal that we want to use the handler. return true; }, - createHandlerBoundToURL(process.env.PUBLIC_URL + '/index.html') + createHandlerBoundToURL(process.env.PUBLIC_URL + '/index.html'), ); // An example runtime caching route for requests that aren't handled by the // precache, in this case same-origin .png requests like those from in public/ registerRoute( // Add in any other file extensions or routing criteria as needed. - ({ url }) => url.origin === self.location.origin && url.pathname.endsWith('.png'), + ({ url }) => + url.origin === self.location.origin && url.pathname.endsWith('.png'), // Customize this strategy as needed, e.g., by changing to CacheFirst. new StaleWhileRevalidate({ cacheName: 'images', @@ -66,7 +67,7 @@ registerRoute( // least-recently used images are removed. new ExpirationPlugin({ maxEntries: 50 }), ], - }) + }), ); // This allows the web app to trigger skipWaiting via diff --git a/src/serviceWorkerRegistration.ts b/src/serviceWorkerRegistration.ts index efbf2ac..c94ee86 100644 --- a/src/serviceWorkerRegistration.ts +++ b/src/serviceWorkerRegistration.ts @@ -15,7 +15,9 @@ const isLocalhost = Boolean( // [::1] is the IPv6 localhost address. window.location.hostname === '[::1]' || // 127.0.0.0/8 are considered localhost for IPv4. - window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/) + window.location.hostname.match( + /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/, + ), ); type Config = { @@ -46,7 +48,7 @@ export function register(config?: Config) { navigator.serviceWorker.ready.then(() => { console.log( 'This web app is being served cache-first by a service ' + - 'worker. To learn more, visit https://cra.link/PWA' + 'worker. To learn more, visit https://cra.link/PWA', ); }); } else { @@ -74,7 +76,7 @@ function registerValidSW(swUrl: string, config?: Config) { // content until all client tabs are closed. console.log( 'New content is available and will be used when all ' + - 'tabs for this page are closed. See https://cra.link/PWA.' + 'tabs for this page are closed. See https://cra.link/PWA.', ); // Execute callback @@ -125,7 +127,9 @@ function checkValidServiceWorker(swUrl: string, config?: Config) { } }) .catch(() => { - console.log('No internet connection found. App is running in offline mode.'); + console.log( + 'No internet connection found. App is running in offline mode.', + ); }); } From f034354131fbf3726adc95612ddfedc70bd9408c Mon Sep 17 00:00:00 2001 From: Minnnning <6alswjd6@gmail.com> Date: Fri, 11 Aug 2023 02:35:08 +0900 Subject: [PATCH 02/48] feat: add map and now location marker --- package-lock.json | 18 +++++++++++++ package.json | 1 + public/index.html | 11 ++++++-- src/App.tsx | 43 +++++++++++++++++------------- src/hooks/useGeolocation.tsx | 51 ++++++++++++++++++++++++++++++++++++ tsconfig.json | 13 +++------ 6 files changed, 108 insertions(+), 29 deletions(-) create mode 100644 src/hooks/useGeolocation.tsx diff --git a/package-lock.json b/package-lock.json index 1afe068..f5d8549 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "@types/react-dom": "^18.2.7", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-kakao-maps-sdk": "^1.1.11", "react-scripts": "5.0.1", "typescript": "^4.9.5", "web-vitals": "^2.1.4", @@ -12184,6 +12185,11 @@ "node": ">=4.0" } }, + "node_modules/kakao.maps.d.ts": { + "version": "0.1.38", + "resolved": "https://registry.npmjs.org/kakao.maps.d.ts/-/kakao.maps.d.ts-0.1.38.tgz", + "integrity": "sha512-ub3ITsp/XfM7OikRvnsQiK6oZgyqVKVvGm9bmChudfDRjFa6xrS2O/bLNs0EyFCQZufVBXLLJK9+T06LOYxNiw==" + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -14905,6 +14911,18 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, + "node_modules/react-kakao-maps-sdk": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/react-kakao-maps-sdk/-/react-kakao-maps-sdk-1.1.11.tgz", + "integrity": "sha512-L3hHa7tvVCxEvU3R4DODctLQMNMEqUUkWweSgVrD/9qndeB3+Fk5FUUFRW5muVghwr4PQ2fzR1jhk6vO35TDaA==", + "dependencies": { + "kakao.maps.d.ts": "^0.1.38" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/react-refresh": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", diff --git a/package.json b/package.json index b15157a..9ce45b5 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "@types/react-dom": "^18.2.7", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-kakao-maps-sdk": "^1.1.11", "react-scripts": "5.0.1", "typescript": "^4.9.5", "web-vitals": "^2.1.4", diff --git a/public/index.html b/public/index.html index 6a9f8c2..111d529 100644 --- a/public/index.html +++ b/public/index.html @@ -1,11 +1,14 @@ - + - + + React App diff --git a/src/App.tsx b/src/App.tsx index a53698a..7b3b728 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,25 +1,32 @@ -import React from 'react'; -import logo from './logo.svg'; import './App.css'; +import { Map, MapMarker, ZoomControl } from 'react-kakao-maps-sdk'; +import useGeoLocation from './hooks/useGeolocation'; function App() { + const location = useGeoLocation(); + let nowLocation = { lat: 36.626704, lng: 127.456214 }; + + if (location.loaded) { + nowLocation = { + lat: location.coordinates?.lat || 36.626704, + lng: location.coordinates?.lng || 127.456214, + }; + } + return ( -
-
- logo -

- Edit src/App.tsx and save to reload. -

- - Learn React - -
-
+ + {/* 현위치 표시 */} + + +
충북대 입니다!
+
+ +
); } diff --git a/src/hooks/useGeolocation.tsx b/src/hooks/useGeolocation.tsx new file mode 100644 index 0000000..bd00105 --- /dev/null +++ b/src/hooks/useGeolocation.tsx @@ -0,0 +1,51 @@ +import { useState, useEffect } from 'react'; + +interface locationType { + loaded: boolean; + coordinates?: { lat: number; lng: number }; + error?: { code: number; message: string }; +} + +const useGeolocation = () => { + const [location, setLocation] = useState({ + loaded: false, + coordinates: { lat: 0, lng: 0 }, + }); + + // 성공에 대한 로직 + const onSuccess = (location: { + coords: { latitude: number; longitude: number }; + }) => { + setLocation({ + loaded: true, + coordinates: { + lat: location.coords.latitude, + lng: location.coords.longitude, + }, + }); + }; + + // 에러에 대한 로직 + const onError = (error: { code: number; message: string }) => { + setLocation({ + loaded: true, + error, + }); + }; + + useEffect(() => { + // navigator 객체 안에 geolocation이 없다면 + // 위치 정보가 없는 것. + if (!('geolocation' in navigator)) { + onError({ + code: 0, + message: 'Geolocation not supported', + }); + } + navigator.geolocation.getCurrentPosition(onSuccess, onError); + }, []); + + return location; +}; + +export default useGeolocation; diff --git a/tsconfig.json b/tsconfig.json index a273b0c..a8b53c1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,11 +1,7 @@ { "compilerOptions": { "target": "es5", - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], + "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, "esModuleInterop": true, @@ -18,9 +14,8 @@ "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, - "jsx": "react-jsx" + "jsx": "react-jsx", + "types": ["kakao.maps.d.ts"] }, - "include": [ - "src" - ] + "include": ["src"] } From 9045c4152d6b0c91b781c0d70dcf4a42fea2a0bb Mon Sep 17 00:00:00 2001 From: Minnnning <6alswjd6@gmail.com> Date: Fri, 11 Aug 2023 10:21:46 +0900 Subject: [PATCH 03/48] git clone --- package-lock.json | 98 ----------------------------------------------- 1 file changed, 98 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0dd39d9..e336558 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3552,104 +3552,6 @@ "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@testing-library/dom": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.1.tgz", - "integrity": "sha512-0DGPd9AR3+iDTjGoMpxIkAsUihHZ3Ai6CneU6bRRrffXMgzCdlNk43jTrD2/5LT6CBb3MWTP8v510JzYtahD2w==", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@testing-library/dom/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@testing-library/dom/node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "peer": true, - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/@testing-library/dom/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@testing-library/dom/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@testing-library/dom/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, - "node_modules/@testing-library/dom/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/dom/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@testing-library/jest-dom": { "version": "5.17.0", "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", From 1e07f5cca5935b9afd9462517fbc915daa74fcdb Mon Sep 17 00:00:00 2001 From: Minnnning <6alswjd6@gmail.com> Date: Sat, 12 Aug 2023 01:45:04 +0900 Subject: [PATCH 04/48] =?UTF-8?q?feat:=20=ED=98=84=EC=9E=AC=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=ED=91=9C=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/public_assets/pngwing.com.png | Bin 0 -> 1560 bytes src/App.tsx | 32 ++++++++++++--------- src/components/currentLocation.tsx | 41 +++++++++++++++++++++++++++ src/components/markers.tsx | 7 +++++ src/hooks/useGeolocation.tsx | 2 +- 5 files changed, 67 insertions(+), 15 deletions(-) create mode 100644 public/public_assets/pngwing.com.png create mode 100644 src/components/currentLocation.tsx create mode 100644 src/components/markers.tsx diff --git a/public/public_assets/pngwing.com.png b/public/public_assets/pngwing.com.png new file mode 100644 index 0000000000000000000000000000000000000000..d0e0218a0bb04bd1a30abbe568aad4bc1b9ea02b GIT binary patch literal 1560 zcmV+z2Iu*SP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91DWC%Y1ONa40RR91JOBUy0B9hbtpET8f=NU{RA>dwS*^lhWq++&j*?aUw2T6_g}%IuP*b)*!B3+2++9CRYdp~s%tlG<{62F{wvToQ+? zwYjZ3d#?=7nSjQu6gzhx0Kwaxl=;x?@Y!krb8SzUW~)Y;Vx$K z?_i$3A7it6Vl7T}PnJGd9w0>W*Gz67?&=?w16$QsTJPU8IsRiXUIWSVyLN4QAiZfm z2w02ujq1YY7pA8dyx0vB2L%806l+<7$8<2hPqNst`(-G$2bC6W%KjNC^s89t2dJh# zu4YH&kvbojLfZXL|CIj5Z}S_MYR+PR@6^=45hi$Y3Nh5t(VkKpFQWNW1SVdz#AgEm z+SOdd@c)YQfC_GMILYD0whmNziFg0<}9c~aj8>SI2Nhv2|Ly$ZX zp6ueihBY29g4}M{7_CuEc2dhjMo^=22l11|j;=nT)Gv*?=$;n( zub#^I6VY0}bR?UbkwQMsvCxk0Q$nhf957)VC*9A*ns7FLq>?8=QqYSlr#QV+V>29J z5~l9QNy63j2Wa9j*GByt(U7OqXR@5oP(&@+SM{s+B@6Si-?n=o` zf=`NuLJP}Z>icsWNSL^ZYZliwT=(Ph{iAJFuuuA=P#JfBoIhOGt9RbC@)8CUp>|yK z0!?+(1Ys+Je0-AieePuftb=kncHdnSRpY@?tH>|s5gHOqAiA&U)OM}PO-vZNUHsw? zw=Z#={eF8b8jcg%DTFdfypYXXsAz_^y38Vrp-~KHl4!})-d3}7h2A7fX`Rwf3#_5oy&+ zQXC`6-r?c9INX14HCf{5=3O_AAxP}R3EE&1-9A=BBZ7U#vtD~8 zYp!1w$wKA#BFNFTVg>JYBXz%tK3OEmOSw|&OY~*|s8mYq(P5K3LZ5-9U~ff@eBsCS zX9V3-vL?>a-!|hp8KzwHz@cPDD)&`m-NPe3pNya_pKL(MSbJUJ2juz*7 z%H_d0JxA^i2M1`v;FH|EqjlTz;Z{=K!I!YjCR>i~e`V4OpsNd!2dr^&&yHKK2+8j0 z=^OZHb-W=c`mVe|xDGm4mM#=CIX#kb&mh+UqZkSxcr`}VwD>=;44PT-?gLo>0000< KMNUMnLSTYQV%ksu literal 0 HcmV?d00001 diff --git a/src/App.tsx b/src/App.tsx index 7b3b728..47c59fc 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,6 +1,8 @@ import './App.css'; -import { Map, MapMarker, ZoomControl } from 'react-kakao-maps-sdk'; +import { Map, ZoomControl } from 'react-kakao-maps-sdk'; import useGeoLocation from './hooks/useGeolocation'; +import CurrentLocation from './components/currentLocation'; +import Markers from './components/markers'; function App() { const location = useGeoLocation(); @@ -14,19 +16,21 @@ function App() { } return ( - - {/* 현위치 표시 */} - - -
충북대 입니다!
-
- -
+ <> + + + + + + ); } diff --git a/src/components/currentLocation.tsx b/src/components/currentLocation.tsx new file mode 100644 index 0000000..bb08688 --- /dev/null +++ b/src/components/currentLocation.tsx @@ -0,0 +1,41 @@ +import { MapMarker, Circle } from 'react-kakao-maps-sdk'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function CurrentLocation(props: any) { + console.log('현재위치', props.data); + + return ( +
+ + +
충북대 입니다!
+
+
+ ); +} + +export default CurrentLocation; +{ + /* */ +} diff --git a/src/components/markers.tsx b/src/components/markers.tsx new file mode 100644 index 0000000..8f5d9e3 --- /dev/null +++ b/src/components/markers.tsx @@ -0,0 +1,7 @@ +//import { MapMarker } from 'react-kakao-maps-sdk'; + +function Markers() { + return
; +} + +export default Markers; diff --git a/src/hooks/useGeolocation.tsx b/src/hooks/useGeolocation.tsx index bd00105..fa9c766 100644 --- a/src/hooks/useGeolocation.tsx +++ b/src/hooks/useGeolocation.tsx @@ -39,7 +39,7 @@ const useGeolocation = () => { if (!('geolocation' in navigator)) { onError({ code: 0, - message: 'Geolocation not supported', + message: '위치 정보를 활용할 수 없어요', }); } navigator.geolocation.getCurrentPosition(onSuccess, onError); From 30ba8608d6a344076642c813c3ad8935019fc8a7 Mon Sep 17 00:00:00 2001 From: Minnnning <6alswjd6@gmail.com> Date: Sat, 12 Aug 2023 02:54:35 +0900 Subject: [PATCH 05/48] =?UTF-8?q?feat:=20=EB=A7=88=EC=BB=A4=20=EC=98=A4?= =?UTF-8?q?=EB=B2=84=EB=A0=88=EC=9D=B4=20=EC=84=A4=EC=A0=95=20=EB=8B=AB?= =?UTF-8?q?=EA=B8=B0=20=EA=B0=80=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/markers.tsx | 65 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 62 insertions(+), 3 deletions(-) diff --git a/src/components/markers.tsx b/src/components/markers.tsx index 8f5d9e3..64332fb 100644 --- a/src/components/markers.tsx +++ b/src/components/markers.tsx @@ -1,7 +1,66 @@ -//import { MapMarker } from 'react-kakao-maps-sdk'; +import { useState } from 'react'; +import { MapMarker, CustomOverlayMap } from 'react-kakao-maps-sdk'; function Markers() { - return
; -} + const [isOpen, setIsOpen] = useState(false); + + const markerPosition = { + lat: 36.6282457054, + lng: 127.468385476, + }; + return ( + <> + setIsOpen(true)} /> + {isOpen && ( + +
+
+
+ 나우 휘트니스 +
setIsOpen(false)}> + 닫기 +
+
+
+
+
+ 카카오 스페이스닷원 +
+
+
제가 다니는 헬스장 입니다
+
+
+
+
+ ; +
+ )} + + ); +} export default Markers; From b71e14b4a560bae0ff890938d908f714c608357f Mon Sep 17 00:00:00 2001 From: Minnnning <6alswjd6@gmail.com> Date: Sat, 12 Aug 2023 18:28:18 +0900 Subject: [PATCH 06/48] =?UTF-8?q?chore:=20readme=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..3d4dac4 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# 층북대 여름방학 몰입교육 2023 +  +## mapping +지도에 간단한 메모를 남겨서 여러 사용자들과 정보를 공유할 수 있는 웹앱입니다 From 3e33eda0c009289d8ae75835a4e48b388a561a7d Mon Sep 17 00:00:00 2001 From: Minnnning <6alswjd6@gmail.com> Date: Sun, 13 Aug 2023 01:46:24 +0900 Subject: [PATCH 07/48] =?UTF-8?q?refactoring:=20=ED=98=84=EC=9E=AC?= =?UTF-8?q?=EC=9C=84=EC=B9=98=20=EB=A1=9C=EC=A7=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 12 +++++++----- src/components/currentLocation.tsx | 5 +---- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 47c59fc..853bdf2 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -6,19 +6,21 @@ import Markers from './components/markers'; function App() { const location = useGeoLocation(); - let nowLocation = { lat: 36.626704, lng: 127.456214 }; + let nowLocation = { lat: 0, lng: 0 }; - if (location.loaded) { + location.loaded; //위치데이터 가져오기 + + if (location.coordinates) { nowLocation = { - lat: location.coordinates?.lat || 36.626704, - lng: location.coordinates?.lng || 127.456214, + lat: location.coordinates.lat, + lng: location.coordinates.lng, }; } return ( <> - -
충북대 입니다!
-
); } From f1c06cc778345d710a736b310078f4078d3dc031 Mon Sep 17 00:00:00 2001 From: Minnnning <6alswjd6@gmail.com> Date: Tue, 15 Aug 2023 23:46:52 +0900 Subject: [PATCH 08/48] =?UTF-8?q?feat:=20loading=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/public_assets/loading.gif | Bin 0 -> 67944 bytes public/public_assets/pngwing.com.png | Bin 1560 -> 0 bytes src/App.tsx | 37 +++++++++++---------------- src/components/currentLocation.tsx | 5 +--- src/components/loading.tsx | 13 ++++++++++ src/components/mainPage.tsx | 27 +++++++++++++++++++ 6 files changed, 56 insertions(+), 26 deletions(-) create mode 100644 public/public_assets/loading.gif delete mode 100644 public/public_assets/pngwing.com.png create mode 100644 src/components/loading.tsx create mode 100644 src/components/mainPage.tsx diff --git a/public/public_assets/loading.gif b/public/public_assets/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..064197cc0364ba621b27667669e9623990c2d749 GIT binary patch literal 67944 zcmeF)XHb)U+xYo2y^uiY9YgOB>D`3h#89QF5fK3?p(C~=^eRmR1Pq9DkY20-5ou}^ z5KvG=P*g-zR7B<4T(|eX>^|4b?!MXk*%|UCGr!5qnaPXHXTCYkBQ|!{28M@IfD|AJ z0Lm)LCLd4UxOQXp-D*=y)7B?3OW8k6@d*^`}viv*}lg^U&Ob3d=mvlBB21zPa+i&J`!RS zu0EP;ATOiTQ5!pU*Hq|wu% z)9#*0*+x9V{1ASGfiUmsGf_u*gY*#j{K6GEKI$MoFb2#gBzRs`Sg5qqPpDNz7$#KT zi01aX;>5$xjS)E;0FPDShr5@YO-FO7Lg0r_i(t6<2ON1I=;2axaG)|5ntCy675!Z4 z5Qd!&h@i36FZ3aN8Q&HsXZ8K)AWJ03rH%Z-k}Dxn3+2qpdXWu*Gg>cJ*_!jEg1`!e z0rZq~1lRU<7k~Of(Oq$vQiyfc+fD0IVlrV!0QLA6(87MxU}7}TvCdgimNV35MVuzotkt3K>>qKZ7Y+EGz zWYVx!{$Ua5LRolwQ;+MeH|Hb!jlM(-Qs|j5e1VQXK}TBL42r*W48=rLArU&Qv({+0 z1;0eWEZKX<^lphf1w-6$tXvePm3TJW7w`vzJaI&rwM@wp80$tRLdb&O=fO7iUT8V{ zGjEoWyFJJxh)q}o5e6p^K`skby|XdUJAW>X!{B7LHyb5NtZeqUp&d{ zEcUx<%QX`byac*BcmO(^SELSfyZhYXsqTYdA+6qDhU~5G<`v&iU42<>o{6g)06uKV z`vUL4O&+#!Q(SZaUi+n)`UR9*awl;)wuF&p5_1P4R5&e~J{fuHF`&R>JejI1#}aaF z!sbh*mFq2V&~*wOREHq57MRAyBp7$u zwga>$%!~$U&nD5pv~IKTob$i?i9n#b(CPzA++b1oQLaX`ueceWSxm3`jWZv6Ux^gL0fd}N z>&PI`T0r7Cp^-;WsyMQQlLMpaKp$O)}q13NAPmqms^IUNNL)6ApTZ8V@6 zPn)WY)L5j-i1Nia9wEtqMc&&>N8!|R?@J#jdPe4Y!%~yNk01A^h%9R?00K{QG2lQN zH(}B86Kp6?Q|0N;)#SYrgVkA#{dJwm|#QBWkn|KP)`L&~b zR%~EswcFur{!zbO0{z=i{9~u1a0XSFw%}prp)1~d`0Pgp%jQEjO`#}J2yzW{z3@ky z@?a))BO@>snyV=&L9^fuNo98{lzNre1Gi;LDg~TVEJOv4O}i+$_TFk4v;8 zy@iH1F-U|z!hZo(RVAO6c*(iUz}rKwA;;Bpt<3sv(-Z*1>?Q`C_7|fU=`5On!)G@k zQNyM6xh@NgmMUVkM4y7WEXHVwI$Kz_++H6pv>>vYu3u zw$y^|!bgw>cyRall768M9c+mQc;n?YmZ!j6<00tHx&z97{?ipWyo;z6HpJSk!z>-Yc0fbNq}>$*Ee1+RF^DtHntIrP6_;s2BiEfxsLd$9iJW;&AAAQ zl-w)JYXbjbfqcPx!xz^!5bNsCy95m?`jnM*>6PDcYY5ZKylAA%5gJ@AUws9gb11C& zT3>4ZCXfA*k9%s=Qb1o3X3eEeZ5~3m9+2f+Cnk9F?~QgHo|0*_%zVb`b-BE0B(o1A zfi_$9$=%KGeE(p8Imzmb3=~9`R)ApeL(xPsC4{pTCl@U zK3(l&yp9r5PFvpYDY;=>H@!!vdvzwvJ!AVE*ax>_&pmnXF*fD>waDn+NvJbZv;N}& z38S?P)qtORUo!OU0)1TErT;-L$xtvfiIK!%lBKmJ$3h$($;rrZK=rqp+B*e=1pNK{ z3yTVMv~*4-oWh_n94!3}t%fEJt~hGqxGN+$Br7LNLP~-oF%u&bC>)xUlEg8Xn~NI< zT^xqVDadie#UUAoVG?2z{sI1FrDZyLIv8#Yhh!Xv{b3u&W*n7;goXSg!~Uk$KRw{v ztYWIIn%KGFYCgk+1CBLg$2*(6ug)~Zo{Z)-xNmX%GDgrwxhLBKf|ihXx+^Ar?_gLai%uC|M+s8ABT(&Vin zpvtS7=^=oLsmoW!2zbi2sR|r#rU~pqXbQ>+YT}@scD&qu72H)00_wPtF|f+6n}gvR zsw#4PqN1>OFf~bD2N{LQ0tJ4DU6QEx@80sssd%IvebSf? z2iO^rpLV$Q!!s;3-h)lzCuGV8Fmf{SYL5rZEiDwh@w=@Ds_(}rTBB*-AMM{p;6xnY zl7>f@aZrhai!W(Rhk`u4%PkNP$a|l>I$yECHTMH{G0*|gJQ_(E!0-h)k&D}C9fI2`d=gw4#(g@&fgK+U~k@l`4)zrcS<)nh8(r^{LRzCzjp@N_mY* zkUpFCW$rSKO6bb1f)0^2_pXsw_A&%wB{R1iizX8m3_FsKEr!Kh$htT`jF>cN|<#6YHfQl9|YVif7Ti zKj3RU;1)5*dx7L$odwX{=G%_&xeJK#(mmuNt^7bLc`j`7FDv){B*USF0jSJ#H%V*U zuQy1T%CGnW3ZDeQD@T9`m}gcV#RD0|S$I}rtgiL>Lc<(Ff2`u+>H(yW-{JrgF`T*| zEYn)DgybdSL3W}c0v`Khad?27BfpS!$!>@U0;_fs=x7;790;77qZI_@Ph$>1p&?J} zYmujjM6O-AL4&HYSwuQvwqH!O*&~ao0@_7=XHzAan@a?%$&u-3lJ!$tl8PH~wN;MD zW;A-_LP%iM#jpD=jS9&Q7`o6G0^3`XHsrIn-`Nt5^-$;P2bkPjUj`W7O?V=x7ljyr zPPY5NV2H9t@f17~PZn~MiI%S1tYCo+wj&Q?ZfNi+2p|y~K2T7m>5nHzaHm8fB((iD z5ANafd&$V)I$NfRT*~paA|XGdUbKVNk!wRWeNXJ)52GnYsjHLkc?6o@qy}SD-Et@P z3yYOI4OvV_0&HEQ5)urtpO>`P*>1Vm$8G=3L8J;*|A0BFwZ{@FWMsEOeP7xPt?)}M zd4Lk^JstN@ci`TxJ^X6w+A#iBgQ_#+oA^j8+>&v(8*we9C!crlZDgDwiE@HBJU^}L zNY0^KP_T@lL64Ez+^eyh-kN5Qw<~KDNgz<>g|x#6F=5bmO7Oi}#>;@qR{q%9J;Qa?DVxd*bOyDZ3e`eNlUpO97~6 zZ*{4=T5y&0-iqyN>vD`zRi?Glky~s7K0#Z1%At{GZoaAaq#YL=Fejgilc*QFXXG7W zo>tPSRNkTFz4|bNp<~}_b}iUZvIU~)1K(tCmDMpdBE>z;b+kuB+!S;ZqeRj22XapIQtt-JmeODEZ zKA$>Q3;J+as_%gO*={ohbRiN+29;%0@6G8{AQ}uVSu3zDW4agc7NUN<=a{O_C?aqx zghY_q7Av=xWI`10xc>rJo3WyYz)% zOV>VJSD^IvzR;Oejrqc6hTACab7Z8PdKMFMR6X!ppnm_e4|#>}77hrtYn7V{F{1@6 z4|u&y(=vac7I~PfX8-)Vn~XB9c4ybrH$-S}(TJ<$ui%iyoVe+sm`S86v1*QGspmV2 z2@feh7-!4w>Uk>^=soB#FB5p93CkUy++{wIV<>R(R~H>P^8UD$>)iEO_u{C;b8MO7 zZS0hru&m-W2G@;FLKDdfT%9a+pYdkjRUkUMmUl^B{-T##z=yndbrqUmxFe#C*2ag) z{l$2@FXo2_65i)fy6)b~wTQ|)HaP6mjbkQ;(5a_o! z;&W%K_~;<7&AhU1A{2oGfdZVDHO>NHm!*5wO-kGc)Kz5F7Ct5NzN*2a6_2?|-YtKf z*7D?jpQ2lSgs-Mgfcm6hi5?`d@~av+zUzzJoC+-KYbGx$4QQ_3EUoaa&e@hy)CF&v zcpFtUstKMLH~vk_tF?#QRA)n(^ZAKK#lKwU4;f~!O~@aqNqfGh1Dsj!UQQWKO)^ej zfbjuzsFNCl*JBBC<9E1`i;(g{nrrwwk??4RT)^g{B^Z^~`~gX|?*Eo(HkHEP{5DfK zR9L#|ooe2-FjdI_1%0z=XOA;?GP};;i;=?5yVS2bK#x#dXOt$6=LU4{HSU{+-4DL-M3HHK?=(Ljs-34LG{zk86IJPs zNotz;j#88}ic3#%Vga(qYdv|{(XjcF2{Xrg#*rCi?Eu1b2(eJaeN z{a7B*@GXl=eQI%(VQ6vj>hjPwvQ*>rp2E1F5s18g)c(`b*@vwu?+WhU)Qn}>Ff_9y zO@Hj~omam3DLfVi`mf#W-}`k4m$rZG&(Z6Fu#xkN)A9B z?HxG=RZ~&>!%&VsIi}=blta%y9_2Wd<4X=neZ77EV3b2!jz>8R{o_#%Ksm1Ekd$N4 zKPrumjpi8F&BKjDQb#98j!M-u)c(Mf<53Q6IaSfb%;b+yPn|i%k?tR)!ncW+{)ayM zo}O@0d>GdCZ+%V*nhSH{AC0I{$;kPaKBp8QkeQFMwtw^~hCy@miPu&W7Mz?? z0G9n*pYkTSf{LRi^8eE3rAwmX9DN#z=?Lh!?HA*YsVg98WbT(&=2Pan*?d+^9%U@9 zCT`3J>$De8@4KWf;4Ywx)#L@s>;f6j+zmI<(NYsMHHCkG>&hwck7Pnu^QTAvB-bq0-q`6V0g2ad(0r|>GBYnU5*Gi=!`hb&~5j#FBzM7B+(Np!{X z4?QY8lE<*hxD&!FA)&E!ja@~|@970O654*+eq69}h3J!gOSuGH=YW*n=H=LOCC6FrNdi}HtyWN0G};acoHP&cpir3 z^P^jM2d9%SGR(J!36s7|os6x_au`#5u7zNXuOC)j$e)ANC>*@^Ug0!00{t5_K z?kh>TUTVdK^Uin@OzA7RA85|D1aTn-QxGWZDiKnquTF$;iwx(2;Q|=fX|w_HEr>^B z5)aWy4{9Z%U<+i%`2&Hi18A{8>TBCl7xDnOdZ<4L)F{?>7Y)l|fgzYl77MO5X}huu zG15wE>21e@xS0nda-f(~!(^CRHU9loufSY}QEmx~2EBF7#icM;*Ns#%Db~rrY)9wx z<(C^5QXBYmFblcYj(nwn;Uh(jNpKYHWPajWF@eRLs^ao1=Z+!Yp>28im|v602`WUP zmX2G3vUml3J-O`INAEZ^;pz5&rOZGe;u@8SsSS@5k60)~b4BtYlsh9vuz5eicn$J? z6&G*B=zqCoP&O2ixbcCY&Z`rWI~lu2cHHT%#m9@RQ`r3R2XN@IJ2MA!t>!^f?%L9j z*mpHUtc!MJ7Be>nZWA_Z(?snWbZMXHhlgml-RZZEa1?+$JZu8N5%=oa5{*wec0lDD zt*=^WP0WkJGOvf|1oN%>LW>E0zoT9iT|fGG>1(&^oxq6U#;zlOwR>!Cv)%93PG9>g zhtkFyHZ5)xtTle{Yu|}w35gfJlpBUK?nPl2?8ry%(V~1MbZ8$96)6p0>~F|eEV*(o zw2-(2TIn5dH~hKv2gmWpa+OP3EkIoH2k)w?4!RIQ*`*_HT@W~SAN&0CS=G$DensNjNp8|l8SY@^ck^#|NDv;slDXfHtz{lUq z>52gDZhxZ7yGKN6Fg|Na%0CVce)!!OHMbe}9_S0L-q=YAiS z=RHel3f>-h(p!8lHS0vVf~ITmJr%TJ64swPq)i*plB({BnQ8;WJeuCu z4?oqju-oMs5XIo~HMU3IdTIICDXwe*98%PM`Tpl%7ydlL2LXFzPUHy-uqW7_*+vNq z%Wv+iR_u@+OTpA-T5M%g9cg(UTX@)kUy=e?mhG-n4+AG93M6m79Tk4G`?x=!xzvc~ z&`CkpLZX)ZV@#`)$}PmnHf_@SjPkz3S&f8skxRG+nfuSWE`#mmR&YZ2L_%_oq>GNz znc(6Pz|=;;uYha8RyS#;v(k z{jJYb`^hS?DKz>b`umE$a&5JipBDYajuq zsRY0{yR*i-Wq&o^S5cI>+{!eOZf-mwILZ1dp|e+rd`=F7zMvIlcfA9oqbY9dCCJG4 zmo&7QjTqoc(cuq=1j*|2!71H` zg{+uCYQU*h59={&DyR;l9-O6hQ*EX>^P`+S7C*-N#d;X`tj#t0DlPY!;6v%8%L|Do z4Hf#rr1zj+R#S(pW-4J+rxi;(*wZVMiG<@hu^CVHVdK=#E{FIi9EDWNQC0myX+9ya zlI+wgs_<3{)OaZhONEzd6_T4=PN4lnmb6IkGCqO-eD6e%GiQ9uq4 zgRvT3+T-bpe9KO*YWL9g1YqMU6FwIl;pYJu-RP2yw~I}lFYUW9h1yco|Gayy&;xT* zOrN?Wp;Q^2%h-;-85{A~FS%==W)@wIf3$xqH2#patXpFicq?S>i9jQsC%d3x4WE~7 z4S%S-*N#cePn6;b?nDMvx_QqmOI;OtVbigADWAV7SirtRu$qDpB#>YMWenWoCTKtQ z!${!Gi_dlRi=TOEx)WHyzRcsDKN`@cZ9TbSGu1ZJZ3oU8)~v~pCm&{t3mgn4hHE`k}r*v(celdaZB| zcn~leV~`nPzaE?fE4z>tB>_62%I}%jsBp?#A-ONS*)X-t7iqEYO}LN?C_7UEa(isu zd3A3cbCT$pyDCEbT_YuQYxA30RV z$KT4_pP^~x&PM5juzRMmdt`lmwp;)8TwR>-)~CHt^IXckhXO9Vek6viLBjl{-e(n1A(707OCWr z_fuCrxPlVu*E?j8|JA1{f9mM}^eLx~a&XE~D#xdPK>A0ioKngmD#xlEpJrub{ZFED zGAYNW9H?@L$}uSiq<^5wsiqvIa=7|`@hK;ka&XE~D#xdPK>A0ioN&q^D#xlEpK@UP zKZ(i-ryQShp!%o2`X2QC1658(BdPEwBEdRyLcBC zQ{6j+*HPca8oxg-3%)xv0hWC*JyWJ=hMRbP#Y}Pb)lz!Lix(1-%d4e(cIgZ27hc$f z>ROo~D34uGRORkCw^Ae+RR6q0aQ0*z9MHo!wz&Y(w$dJe$tTLoYioOT)$djEg;nxuqz%Ja7$( z+~MP!AR-C%Q}Xd4TJjYH1q8D%1am1x!@y`Ye?mc|prtK1RFE%{aY6&6R7y)aKw(Pn zDa&PmMVK@YH@ccSke#f5A3<4XCd z^#QJ3r>O5dpB|(RK$Z?hk`TH&1Qz!~*yjO|Y$uxt`4mgAC?DMZdxiU5dN1HYg)>I&7k&iLm6R{luLk>&tqhsiqQZx(p(^fj0@GdHybxgrivqjwDJmdB-%xG@VoU6%T6tLEA z0IRWlw_FDiEFI(@uvWw&@Gb%b5kD?OAQLBaiqqn5;H3}-#16;v zEQ&7$p&iI-_E=ZXk64sMhP=eyvoe?5T2Ccns&J{cgEC@|B-i6<9XTuL2bzTc7SWZU%L!gaf9vZoeSW?X7AO5r+ffG+Fe2mi{0~apf4UG4NUHe|> z!&e3IhE%9>(Q*~rEUou7uoO}^A=ROwr&mfqVco}u%6@2_Cw1oh_OIwB+Nhc(_G~6$&Yf{1~rAvqCU5RO&e3tU0L;JJ~KUra~H^|(3Sor0{ zdHKLgwzCF_MALnz33*F+l>+w9u4-_?+*`bXNW<$k%iN@m3Dl_4_P9?d<(y!$hs(Ar z&EUZ&oQrQi22KDH))wHICNd_mtu)?TcQ0Y`k-oY@t1AI_Jy-1;4}2e;zP0uBDh;dl zX>|GVX+9wlg*gxOCC?e?tvjCc`G`KTXX(Nr_{!t;EGT<)5N4jCEWZK>DLWuR*FKvF z%c{>jZ(|ge9|Z<3A9~VV%l?J^1c5~7o6oizw-c0)w#@nBK5kTZEY(2XG+I)e-b?Im zv$+at#Hb$YtmN(FM^=2Q2@_15dTYu=)ZU+S5u=RRZ>;6$%R4@E<7&LjTrFjWj0|gh zIxsU5bOp9h!n3E9ekLqV`O)=3tT(~PE@*U!FHSiY`hjWs$9-eQ(^xO6wN+~xt zwstvjCzbv|A+k{57GA*YI+fRgIIUG$X)(}S6im&Cx~hwUG1XQ#QpXQ*^eFz z-xg!jQNQ9ZwZCIkiL)8J>@ne|_Aj{?uicHz;~IK^o31^u#o(%52Vx}0c%&%7Z7r0E zdX4n%oGu2eX#w~G=w5Ro(D(4Y_Hb5D6F^W%Cfi10{SW<~Z#k7(#Qq}oPY zhTGc7Ye|l=rL2#Sh033NwG*1iepIG~lfSI~x%`4#opSi9^2If5@4Nme)S*^}lp7N& z*!l&{^c>(9nHe!mtFGOWW!ug7D4)4L2KO%>=gRLncHUX}R*Wm;`o>#xv}Vv3zc3`X zka3CX`<5(Or=LXv4?&&^QWp6r#q)UngTW|9WjOwXd=IW8JZDj+ zG?8~w5~(QCUoqvv5c%+arpI=V=z6ck?GZ7&-xoJ{L@J;I z^p|w><;P*PPiNEa8EP*2?mF+JqUf2$b{_3KAOxqU0O8(mj3tQ%LQ2TBEUBFG4$qNnr zfP4VJPR?mK4}lG!MDPyYU{XPu|I&j7J4+i7AIfjv6&$Ak5Rrbt%1zgw zYD}R0Y4rJw7e3^$$-u5et9O?I`_J_fZFgURO0pLHB9a6yRJ`%K`1_f$M{auuh8Vvw z_VgS6;%(_O6dF1?gxkCIUlP}t|369GSq z0JiRLiC=MFtAXDOJ)9Hf`>?2G{I=FqMbc>pV`;E~OPR@dkbd6fYN9J~fA?#y0C&Gm zHzq<6*?h^rYlLtAs-N{Q7TTLSR)hCyk5qtmDlj$A=rSSv%m~~$EjqWzHITXp=;o=) zW`VT@@amv+UqYaw)N69Duwr`vSE> z@ymus@%GlQHXz^_L;N1AnN`oF=hVgugA1!L)fE!Vo=n%jN^6xj0iDe*ON2vv%zuA+ zQ~mT=A-`(?L<{;I*7K}mbY-u#+(CQn>f>52K?w_D+zDxe&EwRoS=V;WkQBvBD$(m@ zd(AW=+G6;Z-w{sCqCY72a=RQ_=vN-8@a9hMa2S6}R#*lHj6O(@&KJLzvxsGeb$4E1 z>(yTAN{MHsg|9uvWNoup4v`1LDyH*6{?|D_d4$sp{OblUBknoW)ACW$FWj&7C>wK7 zUWz#}fLQ?5F0SvHD(Zm5`rW*et>9HWo71wAXaE6tIwPLyCRjI{o&^H&_6<|L)lPrEF1Blz`&L&Me}Zm?WwEUnp1I zvZ^2d7s~Mok25{BBe-(D?C#qAHaqq#0=}-9_VJD6C)|FGZqUk-e=0qU#!E}B-E&Q! zlBSJUxUfHKo$^Bd07iixT6KuADCeIAGkAXwZ^? zJYc(m)!%=9H$;|o)*Z3q^8YZw|MBuWv3w_%@5J(*SpMH6mhZUyzrV}(O8qaF!>+lf z$TD9-HoXUgLx{D<+oqts36|W~X!*!o;ADcWNpG{$41qDVJLz-t-$kG?SIrI;Mk+qD*6YW!Celw{97pS&M#&66fx_uMy- zSn06Qa_+0Y{WHspZM~vbWrimfAe`|R!>&%iNBB%@R;T? z+f&Cn^=gV+k`-sv&k&EH?#yalxKI1rIUaSiqeHX=WJ;}}&xzJ#y?_|)&iv{N4$)}5q zpsUG&7l)l)n99uaZJXhUPb{-qY3)*ZFOQ49WzA}OOFi?nBOjAMSj(Y#87qfFzk-Pf z1z=J7`49wt88i^jYLz->?xQ@{51UE1h>ZCmw)k25&^`j~bQk_+*N=XP1{G**AwE2= zp7D18?~$TNo!uTIDd1Exu&kgXd5eJBijCeLL&Kb}54TDm-_p9ih|sjX68bxBg*N}T z=tYPfkJim}9?STt6=jg);jf8;+w5S|j0taUjiDT#Cj15T%>}gYe9i%P9Y^(`DD9l~ zTS*!9kT>*w5s5c-iTlAfNpqU*3c{h`YuxW%xL|yw&9ysn(Pz- z`KJBsM06n&EV$B-M*0l!+p6ea4M|B>P$J!z>eDr7Ym<&);mn@+1;b9^#*(k{hX4?m5Qt7|U*yJ#seep$A%FkOYT? zV{|ETA>KJ7+O<7k$5buBeO_P4PSpiabj0kX90$4+ z6m)@u$7J6xV{xgNwAw4Kjva_(Ib}_E zCy{*rmBr`6&tutoI4NN6CupB(*~h_5^wrUQal*>B4zUhQ^LFutfY7KHZ-M7Ivgm_9 zD=yW<+CA_j-5fimnL_UtciO#I3=<3BYdya;Fdt>Y` zNArpR8a(z@ev1BiVP9ihth#iBpaHqnBl_6Ozx_R9^M~JOEOz+)kNo{lAMWsbhu=H= z-r@HSzjw0u|HCZ4!|(qu_^sJXGeP>K^J6H7)NR8<&#cq9Bv=iq>@VJ#k(xotco?>r zHo=O`MI~kUL1vj|!>|JMbs_zjp%U%8Yg!=8-e5qe0 z{Q4`0tlo7`3T^+Uz&gFpEp`?qX12Wo?IsIcPU~vSNU4_(4I3&CZdQB|IpQ$NUGFe# znWKFrXm3USU8m&Z&y_^8JN6HpD>CW&x4D;j4*q-oq>jj`=_}Va7HsX_xt{%HsQg9m zZg|`*4O4QuAFfo&t32>9$t0#yR2z-y$YB4_#h5$B4rb#S?SGLc4Q-U*a;jBZO|A* z$&n=_P5R`lH2;;iTQA$hR@SrDtPj%Q35nPK#`U8=xUMf07(Nh5ta6x%n<+(kdad=0 z!u`dOJiyv-TCLR8-F`q@6B6UL5UR)N+hhN$Z@*I`HgvQL_FM+k+B8N*RSjZKl!q^6 z9Like+}p@2;Da+cOl)>$B?9C4uV??=xBu341(9m1aXF&LSyqosLz?mN9WGz{m#+0` zPGY+PU|GLY+rthG3eUQRzR@H?4qn<%x~{$%HK5(K zXAO>?ah~RT|NZ!Zu5j%*A3Dj!2ul0Mj z%L-3iToK5PQSFVMsG-zCOYC5|A{p+Db z0}y+OA5bac6q@OQzRP1!}yAQqI zr1stCD5M>m1Yx4~=(QS3<0Zy2SVY+KfC3<|d$ov|?0>tT=ZSKM;En$QYY`@R`2DGr zI=iIEc7A>W^NG>|2?)S#-F6EAK`6F}CyrOM$k08)BevKOCct}2PHwHas zR&I%3^|BkvM;um-V1QN|VQ-u7ll+PqfE*J#oe-(L2CIic|DCD>v=IW2g_HJvSBF;y+ce|qxUy}hdn7`MA0=2W8co$o(!#5-y(r) zvT{W57e&QgIjLF~kn-oR=^EnqN3JUG`n4s_-5RC&ps+^w#5*V-i-&s^tZR1&wa5Fj z8;?Q8C8`3wcHv3I%D!e5ErSOps{0O%ZJ8E${#Ofn63Mq#O*kBm2$ zCw}8TMew`2Nr@X(re`#a)d;bDbk%`rlnl{6oQVhH54j|X04%dm*3$+OAjNaIeBYZR zRz;s5#Hq?i?YqeWdRx-a5A@SugRvU@hJ)0M%Md%^YG`XfO+PP*I*g-PCHK;Yn{7Uu zm9ya1Eg5h<&eXF`YkvOQ!AZNO5?VG9VxbS`a^VuzdD(jpzFQHRbi|8Sq>j~ddLWbA z`wSP(7Qd|1hB{N_RMLFIbkc*nIPMe+5@}8Yz4o=-D^pldUQ7e^T7!7NghZ|B*KkuL z4Q{#43!7mcPWnbn(#X#fn<0Wa5$U%0HSKsHDW$(RHJFkM@NHXoJ=E|+AomD!Pnuj! znX!JXD$2bo3l{riapOBo8Y6aNo<6b?xnI1W{^5e3ut#m9qJkmXCyNoRFLhStAe#XY zWuWS~)Al=t{ttWkpDw>+=p94v7<$LhJBHpd^#8q~u|vJKMwSs>4wPr!{YVuy4Mu28 z-ST1j95n!onbEF#84^KqfRuy*1?~WovG*m~L2YTKY4U@YquE599L2~o$p&0>0wZae z%dgIMu)>gsgbvbF1b^&Ow8qo>l32mSq(kmu zDX}#6%n@svY$_9GSn-1NekA@``!hV#VB~tzQJKQT@yNBpJU%bYf!Ok99r8 zX8U>T3_6rJ+{Qc+q{X#{_;DL;U~}rUq2Kupd%h< zzNSM&sO}PZCeFRkq55x5-*m@vlO?z;{tKsB|IBI6zd4PcP5j?DJ-o_&3di9z@m31E zH@Ndvz0kUk?pVw|sO?*i@x(py6MQfQ-7!E*|v(IJ2k>03)6zm zBqpp4nEM|oI`?gC;lh)pC<7T0Zc%V+9Zp|~9vsM?k9$TO7JNjj<9aC)u@3^xf1C8g z>Tgc7h!FdGFs_4td-@*S;OYa;4(fw~A~VjWY|#C15EwNm!K<5&`#VK1Rh5o{zU1%> zgkX>aR$1n-$(etp=!I!-ZWbo?eu?-79uULz+Xzq+Q`{G!QfX`}Ef}*KZ4=?3r_#XVt}tkO)}|(Rarz z4-Ov6I1qihrJ{IADP%Xg;k4#9Z2}AeP||Gh%zo*ev5tSj?0@)d$I?5N-m&zKrT^2G z4iuhYp}FxlWrJ6Nv1|0tPHZ}KlLdvhlAys6_5;8+1T&1CHFY0$`V1buFb9 z!DgEa`owJ(jXP}_kO*Y%CgeiI#Xdm{SuR#Y7JdE)EB*(CBvu{|5+cIEX21ZKo0p(~ zKPx}Umc(vgK)f*dr?i0Acsc6$MH&;*Fu=p@XgJ6-j@7~=X?xcb8DCC(g5D|1M1|l- z!zrwbotRqfP#hyN;YjIdr@|Q`j=`-Hb$-N60oPkqdh8alpwymjM#no&QD}T~Gz?d4 z?KnSSp{NfER+In{2*{hh|Qu zf;hWFo^^gI#(K6I!7L^i>j`vdpl`v} zC?G8f5Ox=^A11{F_y8Vm2?C@Q%qy?KmIKSNq;7F9IvWMzk$i;m-sgDG_f8lx8b@;K zBx(xoW~uSVgBskH&X$SLp|APCx!bri?s=?VD#w6~*Hy5bR}y%O_gGvpr7J~=B`1BE zX0b(ul(b7FzdH=^M2A9?zs`o@$Yo0h2DErb=|>FXuFrjS{et9?XNG zjZOUQ2TUl0-P)Yf<82=LOwALO9sG(nSg@Ko?js|K$wdbJz_%%I#nJarUI!AuM`j%V z^h4}B!wn41WxyR-L6nXXh#wjd5MjbB!tPy9IEvxxr2v&FQ!tlS-*6)BX5g8-U<;xz zs;}WF&pPW|L}jAekyr5Fjkfbc*DvkbmRlHJNdvW=ZQE_NJHr#g{OC($n;E}EX)zPe z^Td9@B8K|}kJ(R@n#3?>8{i1Z*!jz_2>D-uBd(_LN@o(t*Cjq6A)E00T*tm4S^4^X z)9GYbLM&Z^3cw7kKnSgc<0K+-5C3O3loGCz&mb0I*1E2An)-aGkZ3h=)Rk+gS#05& zA{h7zN6WAyNOOoi7=Us~40ut@Hzk!d_`iOjE=Gs@ zWpN1=3TXrmoWpvzjDcoa+GPmj{xgzO5Xowj4}1henP9%kE3N^mRU4i8kk^vCd}l>) z6dDSC`$lMkf}-(m5Tq2f%$baS($z=e0W(3orz}Bwfu8bC3v}cGIa%FSI@p(oFHgsW zvJN1zi4i zno8@vM%eu$BAVuyW8R5pKK=fLr&lO&0xBH{`l2eZGs*EEX7WE=en-wba{m9BoJqz+ zh;CN&h_U94^?pQc&ewj3aM?Po_ku5*gyrnOPP|eU=uZdKIQy|7e4AvYHr6i!okwPA z4B!HLlJ7LGIWB-93$qL`kMedjnyShp$4X=ju~;-N{=)0SoMq+<@AaYato6IaODmv% zFUVG7S`0qNlXs7O9q73L(#~Cm+|zevi$84JAhLW#HVJA9lIzS;7`M#n5l|$l#)+U& z<}1kkm$&I>q^I9&dSwbl>@aL2!*m#;yjVLhnyQ93PvT{N=*9~V;wq7rURsRF&E$?a znP-;0Z{)R+xWmYVkEi>OY@%?T@4eFaqR6 z>5?VTU$z-tv6Rc(Q?J0r#Uw~r7lXeTEwT$a{Z67dZC8>*tOTYKX=6LUSGu00713~u%Z2xJ|k zP6dI%D@>YY(;z6A@_(>*=V3AbegE)3pV_CGW~OQ1r+wO|ja2G0ZPI46mt@*Vl4+5o z_{>b&gpo>7OdCZpNJ5wv6!D!1$?_f9LMTFfef$0<&ht9Y>pHGK?)yHE^S-Y8K05r@ zaa4ytbUb=`zMn4uA=`d;De6Wvf8wbWL7VT;m?+M^D;~Ls)r;B*n%}g;&V3N~vb2Y65#aDk!-!W`CQ*&8CHNGmU#8)GW?c~Dk0d@t z>5k@UVw2?*l1IrDSL_UVVRnvpgVaTX_xpC6aT&gU*Rc1IYl;lOcE3_S?a*3+2kB(K zTSP*rR-}W|sEuxR%@Z?gDL*l24+d@xB-C?B)W*1){1GNj+Dt}fpQfDMqp!h~ooFwI zYbod+&{v4G9z&GIS%j0~WqIbfuv$4nJk@v(HW-Dl7!DKBb*4x)nvFIe0f`=?RocKt z9nXNHLHn)`A9niOa-v^~4mX{>yJahZYp%weyWp}q@@}3kEJYYQ^5k6M%93XPzs1Sh z%sh(;h#~+ldUZ^#7W#e(J0Y3NT7X3*`;J?HsPFSaX&MrNwPJb3?i& zL+eNMIJCd$>SEFvmm96g7MqH@z4|#M7bc)|?Sbcr{D%I-2Wb7tv*N`3O-CP)ux*NU z=kE3*&u=G=q~197F#D7~&Qa5t>g;gu%Li2CfgK4pOcwv}R1&HDiscJMcmffN!3f`3 zQl#Ot)F(95>zi02+<`Bvw$POk81j%2m^h;OcLGaO;_y{1f22~7Iw(bqJ)pkjP8gCP z`wirK92e)pfYmp>$08@8?&&Ll4t-EuoZXFylEB$|rxmS>uAxJsDe(jGM=Kn=J2WIb zdDbFLY&C@ZTZX*q(p3Tp_(tf8j zRZVvE>127pI;!|f-%pAQ0i~;K1|v3L2&1TUv3f+5l#f@LNv)$u&%W;+~1 zr0F%4*Xldb__ioTft$f74YmbPgi|Ux%encHRHHaW{pvdw!|RV~-0|=CTzElU{V2SN zCb0^5SZxhk1bJtGh;3&*D2jA->8ogVzaaiCE*pxGRKuPhm>`qHL#RHhT?9z1VqNo>;9|nRJTR-CTpb_0)Z=p>dO}ZZ_ z_#0e3npzY70as~5{V%wp{sz}W)%3RrS>DJAi&Ch#KA#v1lOumK(j2+&( zWhq~0;c&-mDlcc8PhFbf7L3*HsD zF!)IMULho}dj8`rH)M$PH7SL<`wQB6Py)%ezCQI#%(lrc?0mgqG9rNGua!yLETr9Ba91{ zqfo?gD2ycL_NgP0ivZmpt^$6g*Dj>?C-Cv5Zr<%P9}x9+gt={K)d(A7dOx6m-h<%R zA+e|6*yjl%Z<-IZ%WF}Q;$<$l`HORq$imFu(Mr|E znqpJWtqHoc^|K9!Nm84D%;;w!bR>_|C5&bJGPNK2s1sQ{&Aiy|2g%t8lucqOk6mxD z9=w7+{s9}BAcqstak>ZvZTG<%oT~RyfaX!m&u0D-YyGY{v2r4;kX5HB=?|r&(41J= zl_RJ*vGNti^tYR%Rslc7DlSuw08WU$anXC`aRtNyT6f|9AP- zQeJ@`gg`rrmuN2p?>Cu(3yWGtTseG{Q~~AGUuzsCnN=xK6Yq$-AP%C}I|Y`C(`~wI zzB{Ta;&Wv`Cr1*k)YdFsyY-`*vG@&b+PnHvg*B(Vu6xUySia@fhV{NXs~)|%t$N|x z?R6cX=2R-Q;9*rja!5nz-J~V=E~UJq`kt1*le9_Jz-!%Evtu z8UFDQI{+bQ*XIT4~gl9Y{kCzq^MdSW3uLK}=>JZEz45UVgZ-8BFr8vQsmA zn?Jm-`N078roDG*L3G2VNBx1ia(g)DHm(7}{srdxcewi-Xcdca?rK%6?SX;;Vsep3 z=$o5^PPspW+Gn1!pjMdhW#sDOgpZ``o-U;BxQeQZhl!qlfVx!Bg6^0gtdLLR;e;P! z6a*WQ&Jr!mZ0m7f&FqZWh$P$-&L>Uem~vW5hL-L2mu+|G0ZC_*Rqkr>9F7k$OBI88 z#!GgsE|6rd!a+j!M?%!*$L7_6Y~=fw&#c@=cSLQdGybu;-of8yaQnI5iZ`P?bkNP! zhfL#?%8+@ z7#WY%zokUda&9Ob!E}7P7%9?4Xsn*9c~Ey7(3ntA_la~i7~w5hX%YUO=mhk7$L?6( zM~=G1-uIFgK;fwf7cH6ZH2lvh^uPV?|Cy$`Cgw;3f{E@wP8V7ejL_&si|Uo_tlesk z$xavU+bQ4Bc)HO@e(#C%7rLt4u&0`O8v4)<*rOM(-?*r1+1}Wsex}J%b#UZCjkR50 zue#()^XT&z#U|aipWZ&*`SQblw>h1fTrz+1d%LvPe4tY6?iL6ib3#)a(JY`r`Esfb zsUbNwv6WZW_So*)KUsf!rv^!7!7xR5&4GV>tHq=qfQI*3$1)f;aYKCYjoh^6mo_ns z-QgV}+x&m&r-aD0fCk!@q6CBC6?n! z-`Jia&9ozeaMYn?ozzSmR4ekUY5CySolKb`fMX{NmnD~{)X_OwiD-S(i~scxC_ z_w`Mc4Lz$ptuq z=l3iF&$hBx=~;&`X!uKM5kBPRoA-M+*IpF4W0lJ#@nlUG>EndO#C~_Ot;+1jN4bt8 zl>=CFt5ZnQr($+=882H}mPM**l##ZzkcW*>k&$+k%K&%X;50nsxEO{Vrs*0&P^N2y z&n={@=Mo6v5%&!ytl%By9h8Z-Cl%Kzk=F2|1pt0GS0>t&)t`FtdR=Q(@TS>#Q@w@L zQlQDZjtx7MJeKgl?Uy`x$i+0LH#F-S22}ey1h=w zjXEHUVwbn*i5UGg(UhL6Y29owaeuUw-*;iTgnyoaz1LgY8!K32tSxM*MPpGr2SAn9 zYfNlaE;OFwIP!K{cA*ez%ED#SQuRtmYGe0GT%=>UX1S&P2z{a&_hHf!jb2#aB5|M^ z`JI#a*!Rn#RWuTu)?fVEX_}-c6E5U5t=pe6>qkoxex5NI76NYoHoKQtk+JO& zkt9_I*g{yt=ddZ6(+8M|TeaEOx7A({lU7S$IigsnWgJ~@i|fwrqD5=}b21xiGCYGRB+b2oyc=D{3q{)cnn)H&xm!ftcU#aN8}a;`Xd z&bjA%>s5+`*+F_tRKk%f?pidIp&bE{IcYbYDcvY!b`OpE;A-&i1(+(g0E(>c^dLqL=DPaZzq1QCv{K08|OI(qAX?p zknXxL^z2hf^XbH%-57pfC;`Rrqvo?~+fY3u>5STeji)Jx55!IVbS_Y@P_YJ|IqB7q zpH`}RCzj~K2DI((xIxbh5(P;}Z8b3(-+WI$hQn2EWn&pcQ#~CK@(|Cj+2`-c>|JHe z{Fjz)*|Wd-_4g_mG|O75A};o*D9ennfOMr8kSZQBu2j{2wUd=|VGs1#Vk#oX7n`k} z%Opq^DJ$A{Y|PdQoN$l0@L9t45Q#veU;`&HZ!q)C(#LPC6wZOmNxZ5%T0V-gouJXJ zZB=)7J+taQ`)x*^XMz*MxHb6Bfp_hJ7a-K+;j_Nw>s^hCUf+wd7j|^_AkS$B-b;DN zxRY15Jg(O>?tVPDAbq#ZTl^|xISp;AjD?kS&I@PeLdi zHK_FM7e1H`ubPSj$cWX_;uIlT-Z9)ZBa=^v2ChtILwmc8?kf5m11(2@^3y{_czaRRP~q*94RX~8YPTP7ZAeMW->F_SzM*YFf&T$@UHNoOBCT= zL>=M*vc3GGll3#q@9V0uyz7?EUM86G_g8v!20b}rsk-zoipBH@OGH>2) z^4z}EIbP##nP~Oz#e&HC507_N(7YPJ$3^Q*e7Fb(l%h3Dr=d+E5|no4H!cdL?HXG2 za4cO6Dy1l)wfdo2UAXRB5-tcI#bRxe@}m!3!S-sS&aOf|v^^uP9R=I;0x8@L`WA@S z?;GKly}&@+TBL9nX%phEev%u;dwEbXk9kMO=OWGVt?8|Yv}4-HRzLwO=+2=D`71OV zQQN-MwiBi%K2vDk1)a>Z4WC9=$ezVfw)!WGOap5Uo1*^wWBb)YgZ)Ms{g#A}m}TvG z51WAaN{>Uy$g82K0;?1ETQ<#+S0W>CD#WgkPQuZgsH_JNn5zmdO;(P`8EHty<8p3N zS)oe?+30GkSZtN67HQ^>7Op|ta%eJIVi1Qayt8pMVA&CjL|jFqOPVXb^K>}k{S>Kq zTjZglRTD(idGONE`|E%B6=m%+#xV)D)(z17eZc<~pZ}vD{9hp7m`9zQXGkdfLTV=N z=ZS8!=;6-gudn1ssvW^UbWHBq;j5eFKR#6FRS4Rp>t%k9=aNA>&|i+{bBh&r=nz@q z!rw(3&={A9%vevx2IZ(hVQ2c?-8vY?V2zn#e!faM<+0k(-uSlT5)9*Artr%Bqy{sh zW18r7lftY9ja5s4dy85NbV{W@zVXZQ(B8y%nLQS)gUl1>u4MKg5a%-;nk}Yd!KlkF zHr6vq{lR3BrpGJ#)3m83Dv@>vy_|cxPFoq`-;6lgL-N+_icJVl4&gsMta_0_3;!Ig z{FU_j$G414q?1K4nYe`k4NkF}_~xTDvExbu^z%;e~y4DlkT(z~h6 zX!#GBD>|*FTXVDt{5VD#8CEU=q5UMtZ$S1sWxGpM^0d)~ymI+K4v$ zpcg|fTJiv0xcy7G+xtnMemoU0RV0aHKY}|eT-Z+&hwGGet6Xv@iUJb-@J_Em1*DXL z9%MJ^8B79(I7Q;XAX#;A?0!x9OZLs$aw7;RaZRbZiGA#|IiBS3gP){F?i3wPGjsg@ zGH`IpbN``zF)|V#og;DM>SqIp^sBzFF-b9UeRCo2n-IDhr+I}8y%63d(XqO%po`Ok za%iMLM59s;)b=5FQjB)C5Q*im(Ub1SCcA!yyb}I_9l4u(@v1JsdtbNQZ*9!Kw-bUbT?7F6z^#zI z1VzWlfnbet7gbOvgqZGPk}Wb%peITA*Gnvf{Hss&q*H^(qA9!^ncZx-wpvEw5K52) zdD&Ce4P=+K5jtId{b;i!)4e4d zUWIU<0L?TzeL@kCjpBdJ+eCzSh{P*at$Xc}USg2WBg3EIy+(GKN4_4dFp0C5A{Z+N zKsn%G@3lHbSx*5rr*+6OUzS!0qg0&nLbnvKFQJUE7wVxOVH*)EJ5u{Gn~_UB!0H+{ z0!QZw4}C1P=UmuCQ-i*(n2mH-;~g0x*gECwryO63w2&V07<+Nx1ahlIyU6#06YFvm zQFS6_7VCZI_h?86o=vM)aA1i)05GUI2ydM7=tHiS0?k97po61|$@8a0V2BW7Hv%5h z#}QI)3c=))OU!cgtpD0WQ8+krkFdt4S7UUtz;UpSv}r^RNQGBWp2r&NaA4&WA+6#+ zd$_=)kEzu14-eDQetK90&3Rb8b?o(AQvpW-<~-cfdq|~-y(L8E;j$xF=RCadfXu^; zGt3`CCU6w5Gi`LsF(a4N}T~g?CMv1bWS09^5IkT zDAq+6c#0N!D#+PN`k9Tu+N<5%%*p=6>cc@4sfoeu-KZ`r`S^+M}R7TL!XIJ zUIzPps1jqYPLnW=rhSAEyU+zV=7NlBe+{eP4M*R=jNlhHR{64P_DqNgv|`=5KdHF0 z!&Hpx7=PpK?da3TUf{Q)^l+V2TxI^N5c{Q9G-suIDbyDeq-vkL7G=4inWGDjxg&j} zPNEU83ErI|*@B40!XZ0vKVMp{P@1;oXN8v)v{%0!<-~awGUm9X!qf(%!+=RWi)cq3 zPT5AZ|GNHHb4*_~qFXMDGV6IDE*Tqik-NO@`rYF>pO3NSk44=1%u}8XijlvF!iF<= za`tRcQ>~5yR#__T66*w{U%`@C0N#RvC1umd8yHAchze5aV(@ly5!s)%ZI8cL{`$ZL zO+$7qO~M5oh7cs_HK4`fcQg@l`(u3^>S^z9Gb!1wKYXCP&$h7prksoFmxSoqMmd~6 zWz=11nO}c{-luj?J~ev)b9g%NJ>B{Alf@XH?sfDxA>nr=7p<}!0z6*r|u&E>wo z#v?FmWKD(f60?iRVCk7yYh-6B$_fs=YbD^71fdbf%49#HUoMktgl~*)hW9@@o0Ry7 zy_NY1+PHKY=~YL^9DBdLpXCXolFn-(i=ydk#3O&)WOoD)MfVuCHZ7Q~c!nTJsB$i_ zg~jWge*5XijI&tm>EddpE22iAGR0SHgg`aiLXwgI(b2dLfa96ulu#~IU$mhJreaw@ zuo8!cWNd}-z!LCT%ys7Hw)do5*7~CLkHOu0>k z)#>h4T0W>|IPA;2u7Xu>PzxMSrWtx1#TEto9hDoi&Q4`(Mju$hiTxH5A&Qi>+aKhd z=3ZUJ0Kzn|7&D&_O|BB8c0{gm*q)h>2U`}_nADFU9kP#j$&2jj&-7v4pR@!#k13L$ zT*u^#stME1~Sg*QXWJ z97wH-2rbd%m)LCh2p8J+$}RiEo^31E?5CkDajv^%ui*5)p>SB44lU+{STOeog+S%= z@;%)>`+E8e^$i>A8x!IZo{v3OqAHb_m4^g{4BsBMx3zCS)t;H2IsI{(C`T+UDfRdD zAG|(jVP?^Kv^6C;W#Y|*mWEc%{+j5h=trZET%26G&UfYJW@S!)nI@8mrMpV~1N{eY4O&=P zv>tCwNllq}KcS_gRdcW=IwtzjlSeMDE?t+pa<}IGnEmnBUw{3NYWH9L=JQ&f*Yf}W zv`pV322DCI-1z70c)GaN7QQ86o|Cti^q`zs>jub*vz=mqm{BM8kWyi0Q*5 zQwe!K1}a;<=&%u`Xel-av9=owTJsSRj_slQS5)Q-Wm;C#%DS!^Qd^yL@g{sqPqkUt z!)!e^ zZ8>ptv;Lu)Yb#o%nPNwMEM1UI(moW3+i?)9v;9~LE)(~{Ww|47eJKE(#FH{xM5hwLEw_At$QVB*-nU~Xnk9RT! zn`Mm&_z>wtuUkJsSXT2ze6^Td3Soa=5kL%ldD*j%5SIJx2B6ki;ynz3u6yyA6b66P zfs?FSCEjs(IjrM3xY=|IY=B{LH3r$(*6-537*5-kS}CRliZy=T2j#B8; zr>`+pOkCDHHf<=pmV*HD+J*yIZuaZHfC8 zDg(D2)%uy_Vp*sx1>9*;0L)`7`5+Q*^X-CXStxMM&?it-nW2|58{xzmnW3r0x|Dul z6(j)cE+To`YpCvy5lv(_5#5qY1B`vN)Mp8 zvIAR!L$Qa~YOQe(MojyMet__LLguHcs2=f>T=BAg5e(P5bnm7O`!UOHg&|8{sO_FX zhW7+j@;VcYLr)KU^-5biStEx_VqE|03y4x0NMnt>?oHD<}9gJ=(E}L)6meJ z{fMWsXK>xRNA!K%>n(Qtd-Rd&e{SRKJQnTtg%<(^$7tTnchR!>W$2=(R5!Q{Z7)O^h?eYi&4Lj=>|Kr=2wRcO zSMP*{H~|Eb1mWKP09STl9FZ!#c{NXp!6(sinbMAcb{IKh16cjJ2}DW@(U#J_@2uyp z`Y|*Vy$lE}Uk#MXI5_s{DIrQCIR}eTryWq!?e>fHQlSk{Jrm!Rz>mr)%x?Nz1?nOV zaU;UhClAy{F5AS{G7JR00{X_OYtEBr7o;IXdyPJpI}Q%Wp27KOkqcH7_Zp?9*>*uF zstIov9j(8i*t|Qm=?hQJFc3ZTXDzmWM}5ckuWSs_xP&6*-ae1q*ueh_q*%JVRNz;H%_k0$ENzLDkTZA zx&`IPBvouyrRPQw;PQatUR|?Sw{l+Vm zF6U*#&a&1K07?op@PgGfz~cU(dR3LOz}6}hlPgkN*Anoe6Gpb@Bgiy@-2pl@x#gWbreoM&0W?QTmOncM_hB&tN0n)Dn6ki7@Vx*>PXo}<+>1Ei1-6`) zrZn=tNlWSJ=l5dl*MkI1F6DP-wo95JWl?<;V>!*}{#+fHsmJHx+JEfR_R&J7Z)uU| zTo7*e59?d*i6}X-26S6MB70}HJhk6v)z9ohq!0{cQFNBAgo?@pURIO?_y5dv(yJsH zB0?Z@-QSK6T5m*Xsy%Ql)4Pj&`T8aW8ktg!wQiQ5zG=|unP+B^v|cYu^#0-l=_}w- zQyN={Kp4D5E|zrP3e8bYUQesp@+n8(m4$@MhJgr`D8F3j<+IVgkA*Y2WB$-*8HQ0r z_Tj4t_Sv&f&E_U0JYZD7s02eCdUt))EVic!AVOz)%|;j;LP!%3vVDnX*9_*n82>7W{|%o%Z|r$v&l`K**#E1HJzWOr z2ugfwgh>1(7f)pKal>rzLy5kgtmc{$08s5jOOClR09_7^4*(#T$>RS}JVhDPV9I9& z!zvb1%=*ntf+wx(oPdTHzF;70BfyK_>{9bNFi3WyEPf^wE-z^$-n=(EbuLJ%ua1>M zh>Lu#*0i9=Z3H;En%@v>58JuI4Vxk)Zbp}A+7BAMYvD(`}kJ!?&qkn|kN~7f&rjI9pAjLy@H$Z`mR=*^2IJ zj3btRA`K2@ezaD^bvsWr-1N^1=G4=JO_e(QKiGe&9!fE)whF$fYA^2vZ85g_R#a_@ zFQU5Ao0B6TvHz2F-BWc}thkixdAFO&V_o9RE^hvf(-lP7+uE3H_3aWp-C)7FKcclk zeIKwY#MltWTyhAXk4^cQ@g9HuB+P~us!&mmvj6cZ@SP2b*+n>V{D;By<7!B<8iZYd z>xOTec-!tz1CY(vf~K;6);US1wJec>gtY{4G26=F? zWx%o`O^K!;iG{F!098KGd$MxzYVkDyk66H3Ke1Z%{+-7(Y;iCUs%Ue*ulhazdO!^@ zkx=YnM9Q#jUpNCUDeg?bJ-SF;4Y-)W1X7A+LAD^mfx!T{ z@(=kH>V<$+v*{0wry$J(gVq@DF4lViXb8jO@lw&dxz~5&YJhBjg5dv1Zfm4$Y67Q5 z@RV}Fnwf0mB#Z-$89EU{j3=pI_WDkACb~xvIaOJq!=Pw=nM6HLS8Hp(BkOpGBk}ZZ z;$h_)b}<74eV9mNQP^%-$K!mx?};d3;`(SI5+kv}M+@xhWKZsFo8(YopI^z%nteU5 zzPI~`YhsI;Ms2RW|V5{vhC%F{x z2H6~!m23f^>a4%>(SkUv?QVS%{m&DHj!f_FLiUWT`O(< zbdq8Fj11e7c=R}g{fTXbBG7JM>K79qkc}{wT^A8-b)n90Qv4gZ{4ajVd2P>YdtTe~ z+Md_;yte=EYMYyV-|L^XJ)}tP>;~CIy|hzf$bZsyLaW5vR|0mbeA%Q3(Gq0&Kcrz3 zv)fM5+c-Ol_A}guEdRuc9YYJ1EQN1Yj1=mARj}DeSXubiJ`F_v$h4wR4v}q+XQJ9~Kn)Q#X1$*4@x*Nz-j_X%mwS6W4lHD6e z8^iW-gB!~)V;CQzDUvAtu*0ag<&RK__kO|KadPH)+VJDp^_EAr%W`gZ%uXX(Uq}3M zLdoGhWy?9rKjs=FlwS=J&eTJ|fxG>#Fj`x1Z|ju~u8Mt%<-W;2s4KClpXw=!JukjU z5}uIS$06i7VF+Iaf32*_tnUv2K@u3>dN+Qd8hpI@wmIp-3xqZU+Ot&3Ys9}pmQh-mmB2 zojvYvAkKJgxC^ut-NoG7`EF9G@SLvS-GBcyV5(V&H8?-asgzfLPKyIEk}@z1a8^&k zBb?w*zP_}SXQIPl5m+i{CRE;soG!*N&)&tSh~j?u6oil^M=C?mS5|duyW>RM9vQq( z$l#s2MgH>F)%?R`SveyVyh#4S)ftCghny@Kl0V5!d%yl&@eCwyIQb~%Gw}FDQZYH3 zm4F*bm@Z1n8}p}p`I&P^$Z~GhGtobCZVeYroXI3K7R|}qDyv-IR^?(45@hnjlG15W z;XW#R^La51e1COT?zUR0eikrIAA^SfDk)M-P|77--B!dvH1c)zfn0=-x;%uO`sr_c z(VV|;U_dQ6LE-QI)^5(gQnumgfA=?Q8*$#>|Du)u9iKk$?|FaE`+MHs^ZuUq_q@OV zzv6Fl?!fKEx!vgZ8-YCZ5e3C0__S6Bbo%^HRa<{YL>)+pDkP_w4oGYD!M6M_vb1~I;C1%1_lGS@)Lj-iy0Mf>;zUU?>=_2! z0yha9V3g+Y=nLo|U$<+IWaV|N*O$Np*TEy4Y`Uc)q*D3is!;$cOp#0{^X!SV*ZS9& z6r0!RZ{_fm=m3&(jf)5p+I>7o3q1D_H~Kz=yK-&IuLk#I$XtUPdv&6H+Y0*B=yj&< z;SZ!-so!0;80)UHtPn`TOTL?C zsqkKi=-i{6+c@=!FMIQ7esy<(&u1Vnd1)xCdu=q6d zmipH6MK&jt1Ybt5IYNG8@D(#J>pslYa|_QpPXcKRHB5(t(ss+r+%9xmR0?nJJ4uY6 zvD%PeCso*J(KLeV4h8IKyh6Gd<1o@jlZ`O`& z+vOxrht`5{Jh11J4B?J1QVo(W1f#Q>nl5=A8H#Ay9=ER+HyHTG+3nO5ZCcZ@-!&?l z>KCE&mJnH|H#T9MR~*D$0&Sm3aMkV2kXk~UDUFb!>{Ky z_q|`sJgaJ_weu)O)-$=arP*|+Lf0~<1Sdi*hO_=`Ic?->Y(QI zwpRM|2iru{T{2~$9u!(oznWBdZ|nHuz7O&CO^ei`8~v44IxVfYC@`M8J8(M@N5MNp zY~$j&v`%_Sxp7t5av)_dPc>UHeCEzYlqf)T8#)nfIMY_xn7YqV|b} zhrT@jcK@x1WDHdHs?FJXzh`FV>>E+^=U0#z(j`RsXY&trQY+w<6-$M!t7=du02AKSoKSF7O(azvP; zYUh1$T3KsZLJoRuzTOel_%_?)>=oGN*55U{TMsoSwtZmT6J-S>_jX4*TckJMOtRto z?Ryrw=7EoVl99d7tb%!9FI~%JWF~;RPk3MFk8U}UQ_05f3Fu|_w&$UX_Q*xZMc$gU zDay=P6V6;J4ti6VzsG?eZ?J-;eQqOY!d_tPaXYZ1Y?srq$G7DyMk$r|@~aHJjGqkr zp*^0>*n0D@omX}odNCA)<}5IH^`{hdO{+XZl66FTJj%Yk?h5J2XRb7Kk=?EuS#8n+a@*;_>?ha%Pf3Kv`S z(lvi7nR(eDRvUL^13>~jc&qbSua%CAN2p!!``udWYxob4Ni$lpF`W|{sy41- zR%ZYw>>*_u$T2&%ZBZtGS4i7zxTGp~dqvh);|R^F1y}~sfB_H$nL+bO_rHbD|JoOw z$M-zG=kYy{?|FRB8>J_1*I^{ba)Jh&QEX6%N0%$db?K;f2l=zw4f8O%8w*_xPNiv|w^ItWPUF6Q zetc1sqJCp(Br$7bnPU6}0pqC04rF6{nyw>|`!cLVK@duDPJ-4w4esd-`v5NPWbwA1 zy6DFmT-5j22Tvb?AO(VF>yPWG99+!l$97B5!V03Bh)ch+RBiEOs$MEvZ7QbCr2F%# zH|eA2W-qr34{zsqe~dc6CoNZ?`QX4E*D-_NJm`kL>JI{VPs6KgQmfR+$5oqOhSLvD zNYBL*@LnE+d!AH>=i}Wa%gn?ve}PAnH4YxK_hm2i2YNG@-a9sKZ&uYnq9OT_cO}qr zI(hl^b4M40f)jR^gQLSKs%mgydd(`eg}ajOJnu&(W+7BGg0*9;>P^g0L2IS{YitQm zmrEZZhV>N^EVHe>}-p(l~g@@bEyhnSSLZron zm8r(Q-N@ad4Xx_lv!o?l;H_4lV{^~!nOw(4c;I`R!r-ausC(Z@iSp|fIxrsWJJYMb zWcK!IVT;kVW4BK2(HLL2T0ou7B4Bqv)UVd|T<|Gws|eA$zffcA0&M?r`KmdGQ(bN9 ze23ywfH&UXJ8z}Q9R79dfg6kH@{3#<;OVwo)}G##nVkoaFR!;C5C`{n>@Zt+pnIRn zf=fzHt|-<{=>x9U8?ej_KCQm!1J=axrLczI;rvd#=gUP6%a~T&>;mz_GYWh9>djfX zga%CU^Pz!#D_#`7f?pId-t2HU5|WJd4a@2$S7l|k7@Uo`)+4snY55V5S6ZQ<_sZ~` zhhZXSvDji}C{Zk!jVLd$|f-v&)>w z`zlspM4bGZ+B&HPAX&vv-|?msvGUahlc}8wHM%J&UW8Kx+s7KOPycwQAG0MdAbRqk z!2A8E%;Bix$LaE;0Us$OP1jM|}MhmCgx=r&agmormvH z*Jc~GB9Eacbr~mcBlmlpCNYI{O%uvD?a%J|3ouyKh}?avo%4O=*X0aVjqj=F zd?dTKmS?}soYKIN^7d%X7^@q+QlWeg&(_T+wf2$zVkT*S3GXs=BdMCGT!jk-si!|H z9yj1F*#zvo&yHRKXDbtOU-@7Zz z_g^LiW#fUrRs>}eg1^QCWwU|5_5*({3jUf9{Iwq_TMqm+At>7q{Iwh?+YJ0Q9w^%q z{52kknS~Bh&rP6&>(dM@KWrFQV)%6Wajkvr$ zwHvb=+oGHZrc_g-t){gH_ii^W4l}n`ve&qHe2cv%Xsv_Lx3+Y!4>hM|Y&<8RnulsQ zQk^v|G?BKOucSKRT@ZBO-8+VyiGd#h+1z=k1xfHzGT_#li3AEaA8BYilcG7-MA|sA zMKi6=rhfnNr2iJX`#k7YiLZS&S;8j{Wmz&q?fmcHoyz(hpin>Qy7hzD{zhJrqkM>!?YZku4?UGZm%sI-E zU8N8G=6Y8=6gtYSh>g6|ys_~~aHrslUZhB`;mrOx46AJ&iVt^LDi|_M^EIP-S=U0u zqKG1rMl56O&J}l)X9gClq11u;);-qB_4ir@V*5K(*v>Cb@?}~`0DNTM8~5~8z)lHyZX(Xf{2Sq#!W(e|d-?Cg*p6ZS3@ z@VC(X9ZE<_(z1Id!~|SiB8dWPleLQLL6h?>J_ojfRubO!%@5ba{cWnrNX zPXN1%^v8AM{y5{?B%}3vAo4}`0!Vc4_>@=Dtn1C#9`7iYxYxZWK-AmzA~o1OA%u9l@Hl|;aqM+2pVmps6?aI$k z@ldV0yu^^!a}Drhwe@?o3U~vNp}jqVrA7U=WS}RvPc;p#y>v%-|K!NE<=<;i67mA= zr#F@;O#(M`ac}K58D9&%hM{ZLapkjPvAsCW-ctSjuCc43K0h_#{w-u$bLJ{%EqoPt zAaQvQp2o(yugh2%F0N2jtglirpwOdnj@ZDyoqCZ(onb$QuqSyj>;23D@0YT5r>?fT zZrtK&%P`_#s%u*COo(F0;hPn#-dW_+jts86ZA9C5iUtdQv{+Mw|D%uKXak`g`eA9w;5X+`&yj~A7rd4~B3WE# z)4I;oiLw1LDy`u2_6@ST$Sc$*1x3m=?y-Uq{|8r(Ac-NZt2604DXq_ol`UJ>y~wER zNv^cfl}(SmEZ&8+5is@HKykx4HFYxys$G7{L^ElOvVc>SFJF%e9N2&9u%pN1Yhcy# z{99^NSfo&3n4lib?3g9(t+0jk7H+igKxc01DOno0lgjZ$$I{Dew|*#16vvVWhR(Mu z=ANR z=K6uE+jjb0`g$YxJmqO?yy7{qI;Hyp!v9pEemC2&Pz0kM35Y%ZgGL(+km37dfyk)C z{wm`%8`uPF`9mEIIKb(~P>!+vst4t zY4b3n(v%e$RTpGV*Ew<<>-K5!hHW<*y5%rAuJ5%nN~n|qr#!5ebBc5;#u8C7QCDNz z2-mN+s2rV`Rl8-GZMdpX9iS{c0va?;AuVVTDs-0G`j+}t(hGZ1B-8x|zwwM4QA=G; zFVRuUQlQ&eB1mdLaDoOKdqn90;*GaYCj;J#Z7SHzNrEenlDvHU$5s)c4)c_|8Ohqn zHKz(4ju@A&3l}n%-L5>&vOi%O|K|?c0^uTk$NC+~mi$$l&H`GS)9gJ@_t@O7Ft9bG z)%GGrgY(XFul_lBct~L)DD;{mL!!mHZ}-r4-fb$hNcQ$vECOgV?0!g_%-e?Hmilw(*qb`*v5(OX@v>5Bf-b_q!h zZ3|5o<1hipCzRpv0P7DPj*Runrl+{ZNfn(pVCj%*?$U}}-T3Y2Y z>%Xnc|4d2o8CQ1f-q5UsmJ=Y<8`+y@%POaOc zVPSss%^vkob5mq_Sr5TwI82@aJiFunb$33z%qBU?k5%fZ=p>u;$a5;*+kp@rsr8W0 z?mpUkFpH8XZ>q{tN>ov}coh&{r|rGK~0o3PO^?DAn1a zL00AmlwSt;uXb*R@n$TpcB8P)M{4`@Y7(yDC>HCtHN)!Vd3&N3!Tj@!sceq0ZFb%G z@>GzQSs3CN^{ii7eb13E@;wkC&fVyDR=ZBgug#Rv%ptWiBNaoI_LF~n@gj`8^$m@M ziEhV%tO9ehm()YQJ%3pd-`P}_oO8usX%fS5=Udvy=hHiavK}s3jcQ!DMbXb{+~PY= zkXa>uee~tn-PHXB${+Lw$+%$m@3D^q{-UnjbLq_5>P68NC*1oyJCc}PEA3ZT-9gKB ziQJ%XAJ@8PcP$&Q}>KYahSws}h$Q!)J1-;Q>L)M4a5>Tb_1DHf!NWHa6+> zA|J-?F#$_>ck@hd3hkU1uJ6i~cU}l()|=3ty~ueo{bN!kbadyd&`u@vk4JqGPIjA> zozUa!92L%)w^=^=cKQ? zpf=sRPYaf_J=k!r`K$feb05b2;eclGKE-8ynG;)g-s1l1t5Y zwi@YTyXc~ecB|dbOy%)7Kb-&K`Tphg_6G_C1O)#3T#*L&1M-_KM}r15=stfgKI60r zY0!@b90d5Atw;m>0r}0wqk$lS|9~2S{{a4g{66=i0sDaYW}DIfFBlCJc<`$NqiGd5 zB%}Yt7X{WM#02c`uRV+#~$M_i26 z1q!qwFF?FW7>xokByTz*t1_=m(J0W!L9Y=guqumc(SXQctpXj1=Bi9d?h?ewkBVp% zhy-gCsKit0`8-IgK-#PVF+hRb2yAK`GP#{^Oz%+&8SwBUi zz-kG)3J(-`sr-uqm(MD26{=Mr4k)m;3nokx{Tc;YL`dQ*Gzv7R zzEO)R?bgzO0)sUQqyq)=!rML5iT|s>jL!;mTBA{*PK;HHnD7-M3 z0u;Faivl^W#Ho|5UCBW~K!GH!0>gj;S?o-cSq0L70#QHtZc`t7vMybtKpm|D4ba=V z?3{?N3gj!&GsBkw1q!|>FaxKTM=hH(-&3PN1Srr@qd=ib2^46rRiFSU(2ojh6-eT` zBUl|cN`fKcfCBL(Pd^w#^OvAFlF#qt!(6IRPE50Ok>iEgl7=HaO9vv4lme=thvV&Td%NT zb9q@)v9^$NhKGl#10iWTq9y$N``V#OL%R;@t*D`#(paTb!K_R@5qEMSjiCxVbiRSA zc;0a}^K}z~$=lj3dbeaB4Ku&wZ+uVn(I30cc{X;u z4FCE1inY2IV&15;PS|I@8~N_s0SIOW)ol6nq+y#GoOmuw`EY#Y(lpn@>GZ#% zpFMbG0oQj~sj|`s^v`D=?QpjJ_LaD|3q}*$(!#-7`LdnrEm!9(5y7;gPg{PH|~-nq4`Q)|!rXhEgqWU00KG z$C?{UVe(ngMwYq4$*3+N&N2^O`-xueF7{LBj$V#noxr$Zizecivv7p+Y^)$)&33{I zRabl+_czf?M!=#P+IF<&+U<>S+~5XXDRbT_nO__tf=Hy)E`ycyG^ zeKn@PqtFZbu!WkZPnlrC?2T_HiENQ*Y*x6+@w($L{2BlJi}|AW5J)1fe;tzE}JxWCeDBk|UH$2gC~< z)JKQw0z3{|D~pLWEB{F34fh?HT<@!&4@*#wx~bPWL1w1A9+&qX4}}TKNVVU7a2!SL zH~+F;e#?;U(qnpJER~eaMm$EUTj{<{Xn4i+28MslvivO`=JdhpMSBm$7Z`ik8xdZw z0RNg^PMOUcrC32rV?;o6Aml#M$Y=hkI~e+qRHal7_2s?br(NI{%556zF6Qgy?6rrY z>UY&-oBo+s8sdt_H+v?J-AE(nZZ2R8>F(xFb~+f`k1yVb;-iZ7)GmzJyZ5hrw?^U5 z3>w+#oc5_b==;h`%u%HQbPJ#I- z^fPYOjeAaaU#XB?|FvZ$PS$_b&!>80PElakz!d&~{AmO{J-RTbEX*?Gb!E_HuTRds z$pWtWe!rvQ*1QEs6JnA9<9tjP)-Vi{a;`-tP7jO161}V18Qe?4)16_X(Q;M)A;WVw zzBTXl-D&gGmwr~!YEV#OAhhen-9Bj?U^Ec%g!hms;CyT-$j+;pqBg#II>@f<3mo6b z32sx!dRU>*lPa96>Tr?Q)-yNlp@)+CXwJ;$A&S+r)nSho1=sylBS_t^FKs~;L-OR9 zq@R?<2nI%y@~^w61oq3JeSMZ4X=O$wS5z)~XT&Xcy3qk?0s6z;|EAoTz8F$;P_pKS z!QFIb(myuKCZueiL&n|D9vjvFNB8ZS+6;5?P=y3y{hhV_c<5g#J~DUiy!Q2v!Ng&b VIeSOKe_M~6JOgzbHzN?_{4Zp3EbssT literal 0 HcmV?d00001 diff --git a/public/public_assets/pngwing.com.png b/public/public_assets/pngwing.com.png deleted file mode 100644 index d0e0218a0bb04bd1a30abbe568aad4bc1b9ea02b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1560 zcmV+z2Iu*SP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91DWC%Y1ONa40RR91JOBUy0B9hbtpET8f=NU{RA>dwS*^lhWq++&j*?aUw2T6_g}%IuP*b)*!B3+2++9CRYdp~s%tlG<{62F{wvToQ+? zwYjZ3d#?=7nSjQu6gzhx0Kwaxl=;x?@Y!krb8SzUW~)Y;Vx$K z?_i$3A7it6Vl7T}PnJGd9w0>W*Gz67?&=?w16$QsTJPU8IsRiXUIWSVyLN4QAiZfm z2w02ujq1YY7pA8dyx0vB2L%806l+<7$8<2hPqNst`(-G$2bC6W%KjNC^s89t2dJh# zu4YH&kvbojLfZXL|CIj5Z}S_MYR+PR@6^=45hi$Y3Nh5t(VkKpFQWNW1SVdz#AgEm z+SOdd@c)YQfC_GMILYD0whmNziFg0<}9c~aj8>SI2Nhv2|Ly$ZX zp6ueihBY29g4}M{7_CuEc2dhjMo^=22l11|j;=nT)Gv*?=$;n( zub#^I6VY0}bR?UbkwQMsvCxk0Q$nhf957)VC*9A*ns7FLq>?8=QqYSlr#QV+V>29J z5~l9QNy63j2Wa9j*GByt(U7OqXR@5oP(&@+SM{s+B@6Si-?n=o` zf=`NuLJP}Z>icsWNSL^ZYZliwT=(Ph{iAJFuuuA=P#JfBoIhOGt9RbC@)8CUp>|yK z0!?+(1Ys+Je0-AieePuftb=kncHdnSRpY@?tH>|s5gHOqAiA&U)OM}PO-vZNUHsw? zw=Z#={eF8b8jcg%DTFdfypYXXsAz_^y38Vrp-~KHl4!})-d3}7h2A7fX`Rwf3#_5oy&+ zQXC`6-r?c9INX14HCf{5=3O_AAxP}R3EE&1-9A=BBZ7U#vtD~8 zYp!1w$wKA#BFNFTVg>JYBXz%tK3OEmOSw|&OY~*|s8mYq(P5K3LZ5-9U~ff@eBsCS zX9V3-vL?>a-!|hp8KzwHz@cPDD)&`m-NPe3pNya_pKL(MSbJUJ2juz*7 z%H_d0JxA^i2M1`v;FH|EqjlTz;Z{=K!I!YjCR>i~e`V4OpsNd!2dr^&&yHKK2+8j0 z=^OZHb-W=c`mVe|xDGm4mM#=CIX#kb&mh+UqZkSxcr`}VwD>=;44PT-?gLo>0000< KMNUMnLSTYQV%ksu diff --git a/src/App.tsx b/src/App.tsx index 853bdf2..fd09441 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,8 +1,7 @@ import './App.css'; -import { Map, ZoomControl } from 'react-kakao-maps-sdk'; import useGeoLocation from './hooks/useGeolocation'; -import CurrentLocation from './components/currentLocation'; -import Markers from './components/markers'; +import MainPage from './components/mainPage'; +import Loading from './components/loading'; function App() { const location = useGeoLocation(); @@ -10,30 +9,24 @@ function App() { location.loaded; //위치데이터 가져오기 - if (location.coordinates) { + if (location.coordinates?.lat) { nowLocation = { lat: location.coordinates.lat, lng: location.coordinates.lng, }; - } - return ( - <> - - - - - - - ); + return ( + <> + + + ); + } else { + return ( + <> + + + ); + } } export default App; diff --git a/src/components/currentLocation.tsx b/src/components/currentLocation.tsx index aa44cf5..b49cde3 100644 --- a/src/components/currentLocation.tsx +++ b/src/components/currentLocation.tsx @@ -7,10 +7,7 @@ function CurrentLocation(props: any) { return (
+

Loading

+ {'로딩'} +
+ ); +} +export default Loading; diff --git a/src/components/mainPage.tsx b/src/components/mainPage.tsx new file mode 100644 index 0000000..51db958 --- /dev/null +++ b/src/components/mainPage.tsx @@ -0,0 +1,27 @@ +import { Map, ZoomControl } from 'react-kakao-maps-sdk'; +import CurrentLocation from '../components/currentLocation'; +import Markers from '../components/markers'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function MainPage(props: any) { + console.log('main component', props.data); + return ( + <> + + + + + + + ); +} + +export default MainPage; From ee41e58498f74bff235542659acbb44953f05975 Mon Sep 17 00:00:00 2001 From: Minnnning <6alswjd6@gmail.com> Date: Wed, 16 Aug 2023 02:00:58 +0900 Subject: [PATCH 09/48] =?UTF-8?q?feat:=20test=20data=EC=B6=94=EA=B0=80=20m?= =?UTF-8?q?arker=20=EC=97=AC=EB=9F=AC=EA=B0=9C=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/marker.tsx | 70 +++++++++++++++++++++++++++++ src/components/markers.tsx | 75 +++++++------------------------ src/test.json | 90 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 177 insertions(+), 58 deletions(-) create mode 100644 src/components/marker.tsx create mode 100644 src/test.json diff --git a/src/components/marker.tsx b/src/components/marker.tsx new file mode 100644 index 0000000..981b581 --- /dev/null +++ b/src/components/marker.tsx @@ -0,0 +1,70 @@ +import { useState } from 'react'; +import { MapMarker, CustomOverlayMap } from 'react-kakao-maps-sdk'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function Marker(props: any) { + const [isOpen, setIsOpen] = useState(false); + const data = props.data; + + const markerPosition = { + lat: data.lat, + lng: data.lng, + }; + + return ( + <> + setIsOpen(true)} /> + {isOpen && ( + +
+
+
+ {data.tag ||
} +
setIsOpen(false)}> + 닫기 +
+
+
+
+ {data.img && ( // 여기서 data.img 값이 null이 아닌 경우에만 아래 div를 출력 +
+ 이미지 +
+ )} +
+
{data.content}
+
+
+
+
+ ; +
+ )} + + ); +} +export default Marker; diff --git a/src/components/markers.tsx b/src/components/markers.tsx index 64332fb..502bec1 100644 --- a/src/components/markers.tsx +++ b/src/components/markers.tsx @@ -1,66 +1,25 @@ -import { useState } from 'react'; -import { MapMarker, CustomOverlayMap } from 'react-kakao-maps-sdk'; +import React from 'react'; +import Marker from './marker'; // 파일명 대소문자를 확인하여 수정 +import markerData from '../test.json'; function Markers() { - const [isOpen, setIsOpen] = useState(false); - - const markerPosition = { - lat: 36.6282457054, - lng: 127.468385476, - }; - return ( <> - setIsOpen(true)} /> - {isOpen && ( - -
-
-
- 나우 휘트니스 -
setIsOpen(false)}> - 닫기 -
-
-
-
-
- 카카오 스페이스닷원 -
-
-
제가 다니는 헬스장 입니다
-
-
-
-
- ; -
- )} + {markerData.map((item, index) => ( + + ))} ); } + export default Markers; diff --git a/src/test.json b/src/test.json new file mode 100644 index 0000000..65115a6 --- /dev/null +++ b/src/test.json @@ -0,0 +1,90 @@ +[ + { + "tag": "쓰레기통", + "content": "안녕하세요 테스트 데이터입니다", + "writer": "anyone", + "lat": 36.628, + "lng": 127.46988, + "img": "//t1.daumcdn.net/thumb/C84x76/?fname=http://t1.daumcdn.net/cfile/2170353A51B82DE005" + }, + { + "tag": "쓰레기통", + "content": "안녕하세요 테스트 데이터입니다", + "writer": "anyone", + "lat": 36.63, + "lng": 127.4811, + "img": null + }, + { + "tag": "쓰레기통", + "content": "안녕하세요 테스트 데이터입니다", + "writer": "anyone", + "lat": 36.3, + "lng": 127.4702, + "img": "//t1.daumcdn.net/thumb/C84x76/?fname=http://t1.daumcdn.net/cfile/2170353A51B82DE005" + }, + { + "tag": "화장실", + "content": "안녕하세요 테스트 데이터입니다", + "writer": "anyone", + "lat": 36.628, + "lng": 127.475, + "img": null + }, + { + "tag": "공사중", + "content": "안녕하세요 테스트 데이터입니다", + "writer": "anyone", + "lat": 36.628, + "lng": 127.5, + "img": null + }, + { + "tag": null, + "content": "안녕하세요 테스트 데이터입니다", + "writer": "anyone", + "lat": 36.626, + "lng": 127.46988, + "img": "//t1.daumcdn.net/thumb/C84x76/?fname=http://t1.daumcdn.net/cfile/2170353A51B82DE005" + }, + { + "tag": null, + "content": "안녕하세요 테스트 데이터입니다", + "writer": "anyone", + "lat": 36.626, + "lng": 127.341, + "img": null + }, + { + "tag": null, + "content": "안녕하세요 테스트 데이터입니다", + "writer": "anyone", + "lat": 36.625, + "lng": 127.46988, + "img": null + }, + { + "tag": "화장실", + "content": "안녕하세요 테스트 데이터입니다", + "writer": "anyone", + "lat": 36.2323, + "lng": 127.341, + "img": "//t1.daumcdn.net/thumb/C84x76/?fname=http://t1.daumcdn.net/cfile/2170353A51B82DE005" + }, + { + "tag": null, + "content": "안녕하세요 테스트 데이터입니다", + "writer": "anyone", + "lat": 36.623, + "lng": 127.463, + "img": "//t1.daumcdn.net/thumb/C84x76/?fname=http://t1.daumcdn.net/cfile/2170353A51B82DE005" + }, + { + "tag": null, + "content": "안녕하세요 테스트 데이터입니다", + "writer": "anyone", + "lat": 36.6279, + "lng": 127.464, + "img": null + } +] From 80fb79899d213dabb2e66ce63ffa6653db701204 Mon Sep 17 00:00:00 2001 From: Minnnning <6alswjd6@gmail.com> Date: Wed, 16 Aug 2023 18:27:37 +0900 Subject: [PATCH 10/48] =?UTF-8?q?chore:=20=EB=A1=9C=EB=94=A9=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EC=A4=91=EC=95=99=EC=9C=BC=EB=A1=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/loading.tsx | 11 ++++++++++- src/components/mainPage.tsx | 5 +---- src/components/marker.tsx | 2 ++ src/test.json | 33 ++++++++++++++++++++++----------- 4 files changed, 35 insertions(+), 16 deletions(-) diff --git a/src/components/loading.tsx b/src/components/loading.tsx index 4bcc09b..edb0096 100644 --- a/src/components/loading.tsx +++ b/src/components/loading.tsx @@ -1,6 +1,14 @@ function Loading() { return ( -
+

Loading

); } + export default Loading; diff --git a/src/components/mainPage.tsx b/src/components/mainPage.tsx index 51db958..077e0a4 100644 --- a/src/components/mainPage.tsx +++ b/src/components/mainPage.tsx @@ -4,16 +4,13 @@ import Markers from '../components/markers'; // eslint-disable-next-line @typescript-eslint/no-explicit-any function MainPage(props: any) { - console.log('main component', props.data); return ( <> diff --git a/src/components/marker.tsx b/src/components/marker.tsx index 981b581..7f45d32 100644 --- a/src/components/marker.tsx +++ b/src/components/marker.tsx @@ -34,6 +34,7 @@ function Marker(props: any) { }} > {data.tag ||
} + {data.writer}
setIsOpen(false)}>
{data.content}
+ {data.date}
diff --git a/src/test.json b/src/test.json index 65115a6..09c58a8 100644 --- a/src/test.json +++ b/src/test.json @@ -5,7 +5,8 @@ "writer": "anyone", "lat": 36.628, "lng": 127.46988, - "img": "//t1.daumcdn.net/thumb/C84x76/?fname=http://t1.daumcdn.net/cfile/2170353A51B82DE005" + "img": "//t1.daumcdn.net/thumb/C84x76/?fname=http://t1.daumcdn.net/cfile/2170353A51B82DE005", + "date": "2023-08-15" }, { "tag": "쓰레기통", @@ -13,7 +14,8 @@ "writer": "anyone", "lat": 36.63, "lng": 127.4811, - "img": null + "img": null, + "date": "2023-08-15" }, { "tag": "쓰레기통", @@ -21,7 +23,8 @@ "writer": "anyone", "lat": 36.3, "lng": 127.4702, - "img": "//t1.daumcdn.net/thumb/C84x76/?fname=http://t1.daumcdn.net/cfile/2170353A51B82DE005" + "img": "//t1.daumcdn.net/thumb/C84x76/?fname=http://t1.daumcdn.net/cfile/2170353A51B82DE005", + "date": "2023-08-15" }, { "tag": "화장실", @@ -29,7 +32,8 @@ "writer": "anyone", "lat": 36.628, "lng": 127.475, - "img": null + "img": null, + "date": "2023-08-15" }, { "tag": "공사중", @@ -37,7 +41,8 @@ "writer": "anyone", "lat": 36.628, "lng": 127.5, - "img": null + "img": null, + "date": "2023-08-15" }, { "tag": null, @@ -45,7 +50,8 @@ "writer": "anyone", "lat": 36.626, "lng": 127.46988, - "img": "//t1.daumcdn.net/thumb/C84x76/?fname=http://t1.daumcdn.net/cfile/2170353A51B82DE005" + "img": "//t1.daumcdn.net/thumb/C84x76/?fname=http://t1.daumcdn.net/cfile/2170353A51B82DE005", + "date": "2023-08-15" }, { "tag": null, @@ -53,7 +59,8 @@ "writer": "anyone", "lat": 36.626, "lng": 127.341, - "img": null + "img": null, + "date": "2023-08-15" }, { "tag": null, @@ -61,7 +68,8 @@ "writer": "anyone", "lat": 36.625, "lng": 127.46988, - "img": null + "img": null, + "date": "2023-08-15" }, { "tag": "화장실", @@ -69,7 +77,8 @@ "writer": "anyone", "lat": 36.2323, "lng": 127.341, - "img": "//t1.daumcdn.net/thumb/C84x76/?fname=http://t1.daumcdn.net/cfile/2170353A51B82DE005" + "img": "//t1.daumcdn.net/thumb/C84x76/?fname=http://t1.daumcdn.net/cfile/2170353A51B82DE005", + "date": "2023-08-15" }, { "tag": null, @@ -77,7 +86,8 @@ "writer": "anyone", "lat": 36.623, "lng": 127.463, - "img": "//t1.daumcdn.net/thumb/C84x76/?fname=http://t1.daumcdn.net/cfile/2170353A51B82DE005" + "img": "//t1.daumcdn.net/thumb/C84x76/?fname=http://t1.daumcdn.net/cfile/2170353A51B82DE005", + "date": "2023-08-15" }, { "tag": null, @@ -85,6 +95,7 @@ "writer": "anyone", "lat": 36.6279, "lng": 127.464, - "img": null + "img": null, + "date": "2023-08-15" } ] From b4b3bb13975c6ed8985f36cb1b68d9fc3f7bf505 Mon Sep 17 00:00:00 2001 From: Minnnning <6alswjd6@gmail.com> Date: Wed, 16 Aug 2023 18:47:41 +0900 Subject: [PATCH 11/48] =?UTF-8?q?feat:=20=EB=A7=88=EC=BB=A4=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=EC=9E=90=20=EB=82=A0=EC=A7=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/marker.tsx | 15 +++++++++++++-- src/components/markers.tsx | 1 + 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/components/marker.tsx b/src/components/marker.tsx index 7f45d32..495ab02 100644 --- a/src/components/marker.tsx +++ b/src/components/marker.tsx @@ -5,6 +5,7 @@ import { MapMarker, CustomOverlayMap } from 'react-kakao-maps-sdk'; function Marker(props: any) { const [isOpen, setIsOpen] = useState(false); const data = props.data; + console.log(data); const markerPosition = { lat: data.lat, @@ -56,10 +57,20 @@ function Marker(props: any) { /> )} -
+
{data.content}
+
+ {data.date} +
- {data.date}
diff --git a/src/components/markers.tsx b/src/components/markers.tsx index 502bec1..c87053d 100644 --- a/src/components/markers.tsx +++ b/src/components/markers.tsx @@ -15,6 +15,7 @@ function Markers() { lat: item.lat, lng: item.lng, writer: item.writer, + date: item.date, }} /> ))} From 1190633bf5236fc18df785a9e73b586682efd4ff Mon Sep 17 00:00:00 2001 From: Minjeong Kim <80758613+Minnnning@users.noreply.github.com> Date: Thu, 17 Aug 2023 13:18:20 +0900 Subject: [PATCH 12/48] Chore/readme modify (#1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: 리드미 수정 * chore: 리드미 수정 --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3d4dac4..28c21f9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,8 @@ -# 층북대 여름방학 몰입교육 2023 +# 충북대 여름방학 몰입교육 2023 +   + ## mapping + 지도에 간단한 메모를 남겨서 여러 사용자들과 정보를 공유할 수 있는 웹앱입니다 +kakapmap을 이용 \ No newline at end of file From c10d56be5f517a8635f86fe2b48b9e6586cd7836 Mon Sep 17 00:00:00 2001 From: Minjeong Kim <80758613+Minnnning@users.noreply.github.com> Date: Fri, 18 Aug 2023 09:59:33 +0900 Subject: [PATCH 13/48] Feature/add memo btn (#2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: 리드미 수정 * chore: 리드미 수정 * add menu button * menu css modify * memo secoll feature * marker click event * readme modify --- README.md | 3 ++- src/components/buttons.tsx | 37 +++++++++++++++++++++++++++++++++++++ src/components/css/menu.css | 15 +++++++++++++++ src/components/mainPage.tsx | 14 ++++++++++++-- src/components/marker.tsx | 16 ++++++++++++---- src/test.json | 2 +- 6 files changed, 79 insertions(+), 8 deletions(-) create mode 100644 src/components/buttons.tsx create mode 100644 src/components/css/menu.css diff --git a/README.md b/README.md index 28c21f9..17508c2 100644 --- a/README.md +++ b/README.md @@ -5,4 +5,5 @@ ## mapping 지도에 간단한 메모를 남겨서 여러 사용자들과 정보를 공유할 수 있는 웹앱입니다 -kakapmap을 이용 \ No newline at end of file +kakapmap을 이용 +초기 설치시 `npm install --legacy-peer-deps` diff --git a/src/components/buttons.tsx b/src/components/buttons.tsx new file mode 100644 index 0000000..0d80dad --- /dev/null +++ b/src/components/buttons.tsx @@ -0,0 +1,37 @@ +import './css/menu.css'; +import { MapMarker } from 'react-kakao-maps-sdk'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function Buttons(props: any) { + const location = props.data; + return ( +
+ + + + {location && } +
+ ); +} +export default Buttons; diff --git a/src/components/css/menu.css b/src/components/css/menu.css new file mode 100644 index 0000000..6bf4b3c --- /dev/null +++ b/src/components/css/menu.css @@ -0,0 +1,15 @@ +.customButton { + position: absolute; + z-index: 3; + right: 0.5em; + float: left; + width: 32px; + height: 32px; + border-top: none; + border-right: none; + border-bottom: 1px solid rgb(226, 226, 226); + border-left: none; + border-image: initial; + border-radius: 3px 3px 3px 3px; + /* Add other properties as needed */ +} diff --git a/src/components/mainPage.tsx b/src/components/mainPage.tsx index 077e0a4..e9b42de 100644 --- a/src/components/mainPage.tsx +++ b/src/components/mainPage.tsx @@ -1,21 +1,31 @@ import { Map, ZoomControl } from 'react-kakao-maps-sdk'; import CurrentLocation from '../components/currentLocation'; import Markers from '../components/markers'; +import Buttons from '../components/buttons'; +import { useState } from 'react'; // eslint-disable-next-line @typescript-eslint/no-explicit-any function MainPage(props: any) { + const [position, setPosition] = useState({ lat: 36, lng: 237 }); + return ( <> + setPosition({ + lat: mouseEvent.latLng.getLat(), + lng: mouseEvent.latLng.getLng(), + }) + } > + ); diff --git a/src/components/marker.tsx b/src/components/marker.tsx index 495ab02..c974d30 100644 --- a/src/components/marker.tsx +++ b/src/components/marker.tsx @@ -23,15 +23,17 @@ function Marker(props: any) { style={{ backgroundColor: 'white', borderRadius: '10px', - border: '1px solid #ccc', + border: '2px solid #ccc', }} >
{data.tag ||
} @@ -45,7 +47,6 @@ function Marker(props: any) { />
-
{data.img && ( // 여기서 data.img 값이 null이 아닌 경우에만 아래 div를 출력
@@ -64,9 +65,16 @@ function Marker(props: any) { flexDirection: 'column', justifyContent: 'space-between', margin: '0.5em', + maxHeight: '6.3em', + width: '12em', }} > -
{data.content}
+
+ {data.content} +
{data.date}
diff --git a/src/test.json b/src/test.json index 09c58a8..838c15b 100644 --- a/src/test.json +++ b/src/test.json @@ -1,7 +1,7 @@ [ { "tag": "쓰레기통", - "content": "안녕하세요 테스트 데이터입니다", + "content": "곳이 이 낙원을 피다. 대중을 그것을 보는 하는 새가 위하여, 없으면 있음으로써 아니다. 하였으며, 꾸며 이상, 뜨고, 붙잡아 든 위하여서. 현저하게 쓸쓸한 피부가 얼마나 그리하였는가? 것은 용감하고 그들의 관현악이며, 행복스럽고 실로 보이는 철환하였는가? 같이, 열락의 길지 같이, 힘있다. 피에 이 그들의 않는 영락과 우리는 목숨을 찾아 그들에게 철환하였는가? 원질이 옷을 지혜는 몸이 이 없으면, 이는 너의 것이다. 목숨이 보이는 풀밭에 풀이 구하지 것이다.", "writer": "anyone", "lat": 36.628, "lng": 127.46988, From b7b30e861023ff05e494e1746e555515a862ae18 Mon Sep 17 00:00:00 2001 From: Doyoung01 <74997144+Doyoung01@users.noreply.github.com> Date: Mon, 21 Aug 2023 20:05:50 +0900 Subject: [PATCH 14/48] Make files for login (#3) --- src/components/user/Signin.tsx | 68 ++++++++++++++++++++ src/components/user/Signup.tsx | 110 +++++++++++++++++++++++++++++++++ src/components/user/user.css | 90 +++++++++++++++++++++++++++ 3 files changed, 268 insertions(+) create mode 100644 src/components/user/Signin.tsx create mode 100644 src/components/user/Signup.tsx create mode 100644 src/components/user/user.css diff --git a/src/components/user/Signin.tsx b/src/components/user/Signin.tsx new file mode 100644 index 0000000..b8eafd5 --- /dev/null +++ b/src/components/user/Signin.tsx @@ -0,0 +1,68 @@ +import './user.css'; + +// 로그인 +function Signin() { + return ( + <> +
+

로그인

+ +
+
+ +
+
+ +
+
+ +
+ +
+
+ + ); +} + +export default Signin; + +/* +
+
+
+

로그인

+
+
+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ + 아이디/비밀번호 찾기 +
+
+*/ diff --git a/src/components/user/Signup.tsx b/src/components/user/Signup.tsx new file mode 100644 index 0000000..dc2ab77 --- /dev/null +++ b/src/components/user/Signup.tsx @@ -0,0 +1,110 @@ +import './user.css'; + +// 회원가입 +function Signup() { + return ( +
+

회원가입

+ +
+
+ +
+
+ +
+
+ +
+ +
+
+ ); +} + +export default Signup; + +/* +
+

회원가입

+ + + +
+
+ +
+
+ +
+
+ +
+ +
+
+*/ + +/* +
+
+
+

회원가입

+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+*/ diff --git a/src/components/user/user.css b/src/components/user/user.css new file mode 100644 index 0000000..590b4cb --- /dev/null +++ b/src/components/user/user.css @@ -0,0 +1,90 @@ +body { + font-family: "Montserrat", sans-serif; + background: white; +} + +.container { + display: block; + max-width: 680px; + width: 80%; + margin: 120px auto; +} + +h1 { + color: #e91e63; + font-size: 48px; + letter-spacing: -3px; + text-align: center; + margin: 120px 0 80px 0; + transition: 0.2s linear; +} + +form { + width: 100%; + max-width: 680px; + margin: 40px auto 10px; +} +form .input__block { + margin: 20px auto; + display: block; + position: relative; +} +form .input__block input { + display: block; + width: 90%; + max-width: 680px; + height: 50px; + margin: 0 auto; + border-radius: 8px; + border: none; + background: rgba(15, 19, 42, 0.1); + color: rgba(15, 19, 42, 0.3); + padding: 0 0 0 15px; + font-size: 14px; + font-family: "Montserrat", sans-serif; +} + +form .input__block input.repeat__password { + opacity: 0; + display: none; + transition: 0.2s linear; +} +form .signin__btn { + background: #e91e63; + color: white; + display: block; + width: 92.5%; + max-width: 680px; + height: 50px; + border-radius: 8px; + margin: 0 auto; + border: none; + cursor: pointer; + font-size: 14px; + font-family: "Montserrat", sans-serif; + box-shadow: 0 15px 30px rgba(233, 30, 99, 0.36); + transition: 0.2s linear; +} +form .signin__btn:hover { + box-shadow: 0 0 0 rgba(233, 30, 99, 0); +} + +form .signup__btn { + background: #e91e63; + color: white; + display: block; + width: 92.5%; + max-width: 680px; + height: 50px; + border-radius: 8px; + margin: 0 auto; + border: none; + cursor: pointer; + font-size: 14px; + font-family: "Montserrat", sans-serif; + box-shadow: 0 15px 30px rgba(233, 30, 99, 0.36); + transition: 0.2s linear; + } + form .signup__btn:hover { + box-shadow: 0 0 0 rgba(233, 30, 99, 0); + } \ No newline at end of file From 0c89abcef077b206384e99f24bd1c72f23e7b344 Mon Sep 17 00:00:00 2001 From: Minjeong Kim <80758613+Minnnning@users.noreply.github.com> Date: Tue, 22 Aug 2023 02:42:18 +0900 Subject: [PATCH 15/48] Feature/memo btn feature (#4) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: 리드미 수정 * chore: 리드미 수정 * add menu button * menu css modify * memo secoll feature * marker click event * readme modify * location add button toggle * loation add marker img * react-modal 라이브러리 추가 * 모달창 추가 태그 이미지 추가 필요 * 모달창 추가 --- package-lock.json | 47 ++++++++++++ package.json | 2 + public/public_assets/addMarker.png | Bin 0 -> 114297 bytes src/components/buttons.tsx | 77 ++++++++++++++++--- src/components/css/modal.css | 45 +++++++++++ src/components/modalOpen.tsx | 118 +++++++++++++++++++++++++++++ 6 files changed, 280 insertions(+), 9 deletions(-) create mode 100644 public/public_assets/addMarker.png create mode 100644 src/components/css/modal.css create mode 100644 src/components/modalOpen.tsx diff --git a/package-lock.json b/package-lock.json index f5d8549..a6880c1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-kakao-maps-sdk": "^1.1.11", + "react-modal": "^3.16.1", "react-scripts": "5.0.1", "typescript": "^4.9.5", "web-vitals": "^2.1.4", @@ -35,6 +36,7 @@ "workbox-streams": "^6.6.0" }, "devDependencies": { + "@types/react-modal": "^3.16.0", "@typescript-eslint/eslint-plugin": "^6.3.0", "@typescript-eslint/parser": "^6.3.0", "eslint": "^8.46.0", @@ -4075,6 +4077,15 @@ "@types/react": "*" } }, + "node_modules/@types/react-modal": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/@types/react-modal/-/react-modal-3.16.0.tgz", + "integrity": "sha512-iphdqXAyUfByLbxJn5j6d+yh93dbMgshqGP0IuBeaKbZXx0aO+OXsvEkt6QctRdxjeM9/bR+Gp3h9F9djVWTQQ==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -8252,6 +8263,11 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/exenv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" + }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -14923,6 +14939,29 @@ "react-dom": ">=16.9.0" } }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "node_modules/react-modal": { + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.1.tgz", + "integrity": "sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg==", + "dependencies": { + "exenv": "^1.2.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.0", + "warning": "^4.0.3" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18", + "react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18" + } + }, "node_modules/react-refresh": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", @@ -17073,6 +17112,14 @@ "makeerror": "1.0.12" } }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", diff --git a/package.json b/package.json index 9ce45b5..fb2bcaa 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-kakao-maps-sdk": "^1.1.11", + "react-modal": "^3.16.1", "react-scripts": "5.0.1", "typescript": "^4.9.5", "web-vitals": "^2.1.4", @@ -54,6 +55,7 @@ ] }, "devDependencies": { + "@types/react-modal": "^3.16.0", "@typescript-eslint/eslint-plugin": "^6.3.0", "@typescript-eslint/parser": "^6.3.0", "eslint": "^8.46.0", diff --git a/public/public_assets/addMarker.png b/public/public_assets/addMarker.png new file mode 100644 index 0000000000000000000000000000000000000000..b6cbb91cd7bf11ae57582726f1cf839a9d789e1f GIT binary patch literal 114297 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 F{Xcy_VW { + setToggle((prev) => !prev); + }; + const modalClose = () => { + setModalIsOpen(false); + }; + + // console.log('toggle', toggle); + console.log('modal', modalIsOpen); + // console.log('위치', location); + return (
- + {toggle ? ( + // 추가 버튼 활성화 + + ) : ( + // 추가 버튼 비활성화 + + )} + + - {location && } + {toggle && ( + <> + { + setModalIsOpen(true); + }} + /> + + )} + {modalIsOpen && ( + + )}
); } diff --git a/src/components/css/modal.css b/src/components/css/modal.css new file mode 100644 index 0000000..3daa82e --- /dev/null +++ b/src/components/css/modal.css @@ -0,0 +1,45 @@ +.modal { + background-color: white; +} + +.modal h2 { + margin-bottom: 10px; +} + +.modal select, +.modal input { + width: auto; + padding: 8px; + margin-bottom: 10px; + border: 1px solid #ccc; + border-radius: 4px; +} + +.buttons { + display: flex; + justify-content: flex-end; +} + +.save-button, +.close-button { + padding: 8px 20px; + margin-left: 10px; + border: none; + border-radius: 4px; + cursor: pointer; +} + +.save-button { + background-color: skyblue; + color: white; + transition: background-color 0.3s; +} + +.save-button:hover { + background-color: deepskyblue; +} + +.close-button { + background-color: transparent; + color: #333; +} diff --git a/src/components/modalOpen.tsx b/src/components/modalOpen.tsx new file mode 100644 index 0000000..7265716 --- /dev/null +++ b/src/components/modalOpen.tsx @@ -0,0 +1,118 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import Modal from 'react-modal'; +import { useState } from 'react'; +import './css/modal.css'; + +function ModalOpen(props: any) { + const customModalStyles: ReactModal.Styles = { + overlay: { + backgroundColor: ' rgba(0, 0, 0, 0.4)', + width: '100%', + height: '100vh', + zIndex: '11', + position: 'fixed', + top: '0', + left: '0', + }, + content: { + width: '80%', + zIndex: '12', + minHeight: '47%', + position: 'absolute', + top: '50%', + left: '50%', + transform: 'translate(-50%, -50%)', + borderRadius: '10px', + boxShadow: '2px 2px 10px rgba(0, 0, 0, 0.25)', + backgroundColor: 'white', + justifyContent: 'center', + overflow: 'auto', + }, + }; + + const [values, setValues] = useState({ + tag: '', + content: '', + lat: props.data.lat, + lng: props.data.lng, + image: '', + user: 'anyone', //유저이 이름을 가져와서 여기 대입 + }); + + const handleChange = (e: any) => { + setValues({ + ...values, + [e.target.name]: e.target.value, + }); + }; + + const handleSubmit = (e: any) => { + e.preventDefault(); + alert(JSON.stringify(values, null, 2) + '\n메모가 추가되었습니다'); + props.close(); //입력 창 닫기 + props.markerSign(); //마커 추가 활성화 버튼 끄기 + }; + + return ( + <> + +
+

메모 작성

+
+

+ 태그: + +

+

+ 내용: + +

+

+ 이미지: + +

+
+ + +
+
+
+
+ + ); +} +export default ModalOpen; From 0b6088565ded0eb7f9c828323868dfc4c27d2c38 Mon Sep 17 00:00:00 2001 From: Minjeong Kim <80758613+Minnnning@users.noreply.github.com> Date: Tue, 22 Aug 2023 02:55:37 +0900 Subject: [PATCH 16/48] Feature/seleted error (#5) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: 리드미 수정 * chore: 리드미 수정 * add menu button * menu css modify * memo secoll feature * marker click event * readme modify * location add button toggle * loation add marker img * react-modal 라이브러리 추가 * 모달창 추가 태그 이미지 추가 필요 * 모달창 추가 * seleted 삭제 --- src/components/modalOpen.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/components/modalOpen.tsx b/src/components/modalOpen.tsx index 7265716..672cb93 100644 --- a/src/components/modalOpen.tsx +++ b/src/components/modalOpen.tsx @@ -72,9 +72,7 @@ function ModalOpen(props: any) {

태그: +

이미지:

diff --git a/src/components/marker.tsx b/src/components/marker.tsx index 0f6ab3c..0163f5d 100644 --- a/src/components/marker.tsx +++ b/src/components/marker.tsx @@ -47,7 +47,7 @@ function Marker(props: any) {
- {data.img && ( // 여기서 data.img 값이 null이 아닌 경우에만 아래 div를 출력 + {data.img !== 'null' && ( // 여기서 data.img 값이 null이 아닌 경우에만 아래 div를 출력
- {markerData.map((item, index) => ( + {props.data.map((item: any, index: any) => ( { - setValues({ - ...values, - [e.target.name]: e.target.value, - }); + setValues(e.target.value); }; - const handleSubmit = (e: any) => { + const handleSubmit = async (e: any) => { e.preventDefault(); - alert(JSON.stringify(values, null, 2) + '을 검색했습니다'); + try { + const response = await axios.get( + 'http://mapping.kro.kr:8080/memo/content_search?content=' + values, + ); + console.log(values, '검색'); + setData(response.data); + } catch (error) { + console.error('검색에 실패했습니다.', error); + } setModal(false); //입력 창 닫기 }; @@ -62,7 +68,7 @@ function SearchModal(props: any) {

검색어 입력

@@ -70,7 +76,7 @@ function SearchModal(props: any) {

@@ -85,6 +91,7 @@ function SearchModal(props: any) {
+ {data && } ); } diff --git a/src/components/tags.tsx b/src/components/tags.tsx index d74e04d..f08d759 100644 --- a/src/components/tags.tsx +++ b/src/components/tags.tsx @@ -1,80 +1,64 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { useState, useEffect } from 'react'; -import { MapMarker } from 'react-kakao-maps-sdk'; import './css/category.css'; +import Markers from './markers'; function Tags() { - // 쓰레기통 마커가 표시될 좌표 배열입니다 - const trashPositions = [ - { lat: 37.499590490909185, lng: 127.0263723554437 }, - { lat: 37.499427948430814, lng: 127.02794423197847 }, - { lat: 37.498553760499505, lng: 127.02882598822454 }, - { lat: 37.497625593121384, lng: 127.02935713582038 }, - { lat: 37.49646391248451, lng: 127.02675574250912 }, - { lat: 37.49629291770947, lng: 127.02587362608637 }, - { lat: 37.49754540521486, lng: 127.02546694890695 }, - ]; + const [allPositions, setAllPositions] = useState([]); + useEffect(() => { + fetch('http://mapping.kro.kr:8080/memo', { + method: 'GET', + headers: { + Accept: 'application/json', + }, + }) + .then((response) => response.json()) + .then((data) => setAllPositions(data)) + .catch((error) => console.error(error)); + }, []); + + const [trashPositions, setTrashPositions] = useState([]); - // 화장실 마커가 표시될 좌표 배열입니다 - const toiletPositions = [ - { lat: 37.497535461505684, lng: 127.02948149502778 }, - { lat: 37.49671536281186, lng: 127.03020491448352 }, - { lat: 37.496201943633714, lng: 127.02959405469642 }, - { lat: 37.49640072567703, lng: 127.02726459882308 }, - { lat: 37.49640098874988, lng: 127.02609983175294 }, - { lat: 37.49932849491523, lng: 127.02935780247945 }, - { lat: 37.49996818951873, lng: 127.02943721562295 }, - ]; + useEffect(() => { + fetch('http://mapping.kro.kr:8080/memo/tagsearch?tag=쓰레기통', { + method: 'GET', + headers: { + Accept: 'application/json', + }, + }) + .then((response) => response.json()) + .then((data) => setTrashPositions(data)) + .catch((error) => console.error(error)); + }, []); - // 공사중 마커가 표시될 좌표 배열입니다 - const constructionPositions = [ - { lat: 37.49966168796031, lng: 127.03007039430118 }, - { lat: 37.499463762912974, lng: 127.0288828824399 }, - { lat: 37.49896834100913, lng: 127.02833986892401 }, - { lat: 37.49893267508434, lng: 127.02673400572665 }, - { lat: 37.49872543597439, lng: 127.02676785815386 }, - { lat: 37.49813096097184, lng: 127.02591949495914 }, - { lat: 37.497680616783086, lng: 127.02518427952202 }, - ]; + const [toiletPositions, setToiletPositions] = useState([]); + + useEffect(() => { + fetch('http://mapping.kro.kr:8080/memo/tagsearch?tag=화장실', { + method: 'GET', + headers: { + Accept: 'application/json', + }, + }) + .then((response) => response.json()) + .then((data) => setToiletPositions(data)) + .catch((error) => console.error(error)); + }, []); + + const [constructionPositions, setConstructionPositions] = useState([]); + + useEffect(() => { + fetch('http://mapping.kro.kr:8080/memo/tagsearch?tag=공사중', { + method: 'GET', + headers: { + Accept: 'application/json', + }, + }) + .then((response) => response.json()) + .then((data) => setConstructionPositions(data)) + .catch((error) => console.error(error)); + }, []); - // 전체 마커가 표시될 좌표 배열입니다 - const allPositions = [ - { lat: 37.49966168796031, lng: 127.03007039430118 }, - { lat: 37.499463762912974, lng: 127.0288828824399 }, - { lat: 37.49896834100913, lng: 127.02833986892401 }, - { lat: 37.49893267508434, lng: 127.02673400572665 }, - { lat: 37.49872543597439, lng: 127.02676785815386 }, - { lat: 37.49813096097184, lng: 127.02591949495914 }, - { lat: 37.497680616783086, lng: 127.02518427952202 }, - { lat: 37.499590490909185, lng: 127.0263723554437 }, - { lat: 37.499427948430814, lng: 127.02794423197847 }, - { lat: 37.498553760499505, lng: 127.02882598822454 }, - { lat: 37.497625593121384, lng: 127.02935713582038 }, - { lat: 37.49646391248451, lng: 127.02675574250912 }, - { lat: 37.49629291770947, lng: 127.02587362608637 }, - { lat: 37.49754540521486, lng: 127.02546694890695 }, - { lat: 37.499590490909185, lng: 127.0263723554437 }, - { lat: 37.499427948430814, lng: 127.02794423197847 }, - { lat: 37.498553760499505, lng: 127.02882598822454 }, - { lat: 37.497625593121384, lng: 127.02935713582038 }, - { lat: 37.49646391248451, lng: 127.02675574250912 }, - { lat: 37.49629291770947, lng: 127.02587362608637 }, - { lat: 37.49754540521486, lng: 127.02546694890695 }, - { lat: 37.499590490909185, lng: 127.0263723554437 }, - { lat: 37.499427948430814, lng: 127.02794423197847 }, - { lat: 37.498553760499505, lng: 127.02882598822454 }, - { lat: 37.497625593121384, lng: 127.02935713582038 }, - { lat: 37.49646391248451, lng: 127.02675574250912 }, - { lat: 37.49629291770947, lng: 127.02587362608637 }, - { lat: 37.49754540521486, lng: 127.02546694890695 }, - { lat: 37.497535461505684, lng: 127.02948149502778 }, - { lat: 37.49671536281186, lng: 127.03020491448352 }, - { lat: 37.496201943633714, lng: 127.02959405469642 }, - { lat: 37.49640072567703, lng: 127.02726459882308 }, - { lat: 37.49640098874988, lng: 127.02609983175294 }, - { lat: 37.49932849491523, lng: 127.02935780247945 }, - { lat: 37.49996818951873, lng: 127.02943721562295 }, - ]; const [selectedCategory, setSelectedCategory] = useState('all'); useEffect(() => { @@ -105,24 +89,15 @@ function Tags() { constructionMenu.className = 'menu_selected'; } }, [selectedCategory]); + return ( <> - {selectedCategory === 'all' && - allPositions.map((position, index) => ( - - ))} - {selectedCategory === 'trash' && - trashPositions.map((position, index) => ( - - ))} - {selectedCategory === 'toilet' && - toiletPositions.map((position, index) => ( - - ))} - {selectedCategory === 'construction' && - constructionPositions.map((position, index) => ( - - ))} + {selectedCategory === 'all' && } + {selectedCategory === 'trash' && } + {selectedCategory === 'toilet' && } + {selectedCategory === 'construction' && ( + + )}
  • Date: Fri, 25 Aug 2023 11:26:25 +0900 Subject: [PATCH 27/48] =?UTF-8?q?Feature/Chore:date=ED=91=9C=EA=B8=B0,=20?= =?UTF-8?q?=EB=A6=AC=EB=8B=A4=EC=9D=B4=EB=A0=89=ED=8A=B8=EB=93=B1=20(#13)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: 리드미 수정 * chore: 리드미 수정 * add menu button * menu css modify * memo secoll feature * marker click event * readme modify * location add button toggle * loation add marker img * react-modal 라이브러리 추가 * 모달창 추가 태그 이미지 추가 필요 * 모달창 추가 * seleted 삭제 * css층돌 해결 * tag 선택 기능 * serarch 버튼 추가 * search modal 추가 * key값 오류 해결->index * 현위치로 이동 버튼 추가완료 * tags 연결 성공 * 검색 기능 연결 * 메모 추가 기능 완료 * 모달 닫기 중복 이벤트 수정 date 표기 수정 * 메모 작성완료시 화면 리다이렉트 --- src/components/addModal.tsx | 2 ++ src/components/css/category.css | 4 ++-- src/components/loading.tsx | 7 ++++++- src/components/mainPage.tsx | 12 ++++++------ src/components/marker.tsx | 2 +- 5 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/components/addModal.tsx b/src/components/addModal.tsx index d24b341..4643f1a 100644 --- a/src/components/addModal.tsx +++ b/src/components/addModal.tsx @@ -66,11 +66,13 @@ function AddModal(props: any) { headers: { 'Content-Type': 'multipart/form-data' }, }); console.log('메모가 성공적으로 생성되었습니다.'); + window.location.reload(); } catch (error) { console.error('메모 생성에 실패했습니다.', error); } props.close(); //입력 창 닫기 props.markerSign(); //마커 추가 활성화 버튼 끄기 + //window.location.reload(); }; return ( diff --git a/src/components/css/category.css b/src/components/css/category.css index d518f62..8d18daa 100644 --- a/src/components/css/category.css +++ b/src/components/css/category.css @@ -4,8 +4,8 @@ left: 20px; /* 조절하여 원하는 위치로 조정 */ z-index: 15; /* 다른 요소보다 위에 나타나도록 설정 */ background-color: white; - border-radius: 5px; padding: 3px; + border-radius: 5px; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); } @@ -19,7 +19,7 @@ padding: 3px; cursor: pointer; display: flex; - align-items: center; + margin-bottom: 0px; } .category li:hover { diff --git a/src/components/loading.tsx b/src/components/loading.tsx index edb0096..81045f3 100644 --- a/src/components/loading.tsx +++ b/src/components/loading.tsx @@ -13,7 +13,12 @@ function Loading() { {'로딩'}
); diff --git a/src/components/mainPage.tsx b/src/components/mainPage.tsx index 9e6e644..7ca0e4e 100644 --- a/src/components/mainPage.tsx +++ b/src/components/mainPage.tsx @@ -24,12 +24,12 @@ function MainPage(props: any) { style={{ height: '100vh', }} - onClick={(_t, mouseEvent) => - setPosition({ - lat: mouseEvent.latLng.getLat(), - lng: mouseEvent.latLng.getLng(), - }) - } + // onClick={(_t, mouseEvent) => + // setPosition({ + // lat: mouseEvent.latLng.getLat(), + // lng: mouseEvent.latLng.getLng(), + // }) + // } level={3} onIdle={(_t) => setPosition({ diff --git a/src/components/marker.tsx b/src/components/marker.tsx index 0163f5d..ab19139 100644 --- a/src/components/marker.tsx +++ b/src/components/marker.tsx @@ -75,7 +75,7 @@ function Marker(props: any) { {data.content}
- {data.date} + {data.date}
From 92a40e0a8120f1b4389fd24caa4e2939cb37f2b4 Mon Sep 17 00:00:00 2001 From: Doyoung01 Date: Fri, 25 Aug 2023 13:17:21 +0900 Subject: [PATCH 28/48] change main color pink to blue --- src/components/user/Signin.tsx | 11 +++++++++-- src/components/user/css/user.css | 29 ++++++++++++++--------------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/components/user/Signin.tsx b/src/components/user/Signin.tsx index 5c07f42..3579816 100644 --- a/src/components/user/Signin.tsx +++ b/src/components/user/Signin.tsx @@ -56,8 +56,15 @@ function Signin() { 로그인 - diff --git a/src/components/user/css/user.css b/src/components/user/css/user.css index d5512a3..ff3edd8 100644 --- a/src/components/user/css/user.css +++ b/src/components/user/css/user.css @@ -11,7 +11,7 @@ body { } h1 { - color: #e91e63; + color: #238CFA; font-size: 48px; letter-spacing: -3px; text-align: center; @@ -21,9 +21,9 @@ h1 { h2 { font-family: Impact, Charcoal, 'Montserrat', sans-serif; - color: #e91e63; + color: #238CFA; margin: 10px 0 20px 3px; - text-shadow: 2px 2px 4px #d97e9d; + text-shadow: 2px 2px 4px #67b0ff; } form { @@ -57,7 +57,7 @@ form .input__block input.repeat__password { transition: 0.2s linear; } form .signin__btn { - background: #e91e63; + background: #238CFA; color: white; display: block; width: 92.5%; @@ -69,7 +69,7 @@ form .signin__btn { cursor: pointer; font-size: 14px; font-family: "Montserrat", sans-serif; - box-shadow: 0 15px 30px rgba(233, 30, 99, 0.36); + box-shadow: 0 15px 30px rgba(35, 140, 250, 0.36); transition: 0.2s linear; } form .signin__btn:hover { @@ -77,7 +77,7 @@ form .signin__btn:hover { } form .signup__btn { - background: #e91e63; + background: #238CFA; color: white; display: block; width: 92.5%; @@ -89,34 +89,33 @@ form .signup__btn { cursor: pointer; font-size: 14px; font-family: "Montserrat", sans-serif; - box-shadow: 0 15px 30px rgba(233, 30, 99, 0.36); + box-shadow: 0 15px 30px rgba(35, 140, 250, 0.36); transition: 0.2s linear; } form .signup__btn:hover { box-shadow: 0 0 0 rgba(233, 30, 99, 0); } -.test { - text-decoration: none; +.signup__link { color: #9B9B9B; font-size: 15px; text-align: right; - margin: 30px 30px 0 0; + margin: 50px 30px 0 0; } -.test:hover { - text-shadow: 0 15px 30px rgba(233, 30, 99, 0.36); +.signup__link:hover { + text-shadow: 0 15px 20px rgba(35, 140, 250, 0.36); } .message-active { margin: 0 0 20px 25px; - color: #e91e63; + color: #238CFA; } .my-page { font-family: Impact, Charcoal, 'Montserrat', sans-serif; font-size: 20px; display: inline; - color: #e91e63; + color: #238CFA; margin-right: 50px; margin-left: 30px } @@ -170,7 +169,7 @@ form .signup__btn:hover { hr.rounded { - border-top: 3px solid #e91e63; + border-top: 3px solid #238CFA; border-radius: 5px; } hr.rounded.memo { From af72aa95fe7e345afc9026337a7169be8d452c55 Mon Sep 17 00:00:00 2001 From: Doyoung01 Date: Fri, 25 Aug 2023 15:03:00 +0900 Subject: [PATCH 29/48] Link Login pages and add close button in the pages --- src/components/mainPage.tsx | 16 ++++- src/components/user/Signin.tsx | 19 +++--- src/components/user/Signup.tsx | 110 +++++++++++++++++++------------ src/components/user/css/user.css | 24 +++++-- 4 files changed, 109 insertions(+), 60 deletions(-) diff --git a/src/components/mainPage.tsx b/src/components/mainPage.tsx index 7ca0e4e..82d27a8 100644 --- a/src/components/mainPage.tsx +++ b/src/components/mainPage.tsx @@ -4,19 +4,27 @@ import CurrentLocation from '../components/currentLocation'; import Buttons from '../components/buttons'; import { useState } from 'react'; import Mypage from './user/Mypage'; +import Signin from './user/Signin'; +import Signup from './user/Signup'; // eslint-disable-next-line @typescript-eslint/no-explicit-any function MainPage(props: any) { const [position, setPosition] = useState(props.data); const [mypageisOpen, setMypageIsOpen] = useState(false); + const [isLogin, setisLogin] = useState(false); + const [isSignup, setIsSignup] = useState(false); const clickedMypage = () => { setMypageIsOpen((prev) => !prev); }; + const clickedSignupLink = () => { + setIsSignup((prev) => !prev); + }; const currentLocation = () => { setPosition(props.data); + setisLogin((prev) => !prev); }; - + console.log(mypageisOpen, isLogin, isSignup); return !mypageisOpen ? ( <> - ) : ( + ) : mypageisOpen && isLogin ? ( + ) : !isSignup ? ( + + ) : ( + ); } diff --git a/src/components/user/Signin.tsx b/src/components/user/Signin.tsx index 3579816..aeff2e4 100644 --- a/src/components/user/Signin.tsx +++ b/src/components/user/Signin.tsx @@ -2,7 +2,8 @@ import { SetStateAction, useState } from 'react'; import './css/user.css'; // 로그인 -function Signin() { +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function Signin(props: any) { const [Id, setId] = useState(''); const [password, setPassword] = useState(''); const [blankMessage, setBlankMessage] = useState(''); @@ -23,6 +24,11 @@ function Signin() { }; return ( <> + -
- - 회원가입 - +
+ 회원가입
diff --git a/src/components/user/Signup.tsx b/src/components/user/Signup.tsx index 5770d7e..a9715f0 100644 --- a/src/components/user/Signup.tsx +++ b/src/components/user/Signup.tsx @@ -2,7 +2,8 @@ import { SetStateAction, useState } from 'react'; import './css/user.css'; // 회원가입 -function Signup() { +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function Signup(props: any) { const [Id, setId] = useState(''); const [password, setPassword] = useState(''); // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -35,51 +36,74 @@ function Signup() { setBlankMessage('빈칸이 있습니다.'); } }; + const closeSignup = () => { + props.signup(); + props.close(); + }; return ( -
-

회원가입

+ <> + + +
+ 로그인
- - -
+ + ); } diff --git a/src/components/user/css/user.css b/src/components/user/css/user.css index ff3edd8..24f738d 100644 --- a/src/components/user/css/user.css +++ b/src/components/user/css/user.css @@ -7,7 +7,7 @@ body { display: block; max-width: 680px; width: 80%; - margin: 120px auto; + margin: 60px auto; } h1 { @@ -15,7 +15,7 @@ h1 { font-size: 48px; letter-spacing: -3px; text-align: center; - margin: 120px 0 80px 0; + margin: 60px 0 80px 0; transition: 0.2s linear; } @@ -76,6 +76,19 @@ form .signin__btn:hover { box-shadow: 0 0 0 rgba(233, 30, 99, 0); } +.signin-close-button { + background: url("https://cdn-icons-png.flaticon.com/512/75/75519.png") no-repeat; + width: 25px; + height: 25px; + background-size: contain; + border: none; + cursor: pointer; + display: block; + margin: auto; + margin-right: 50px; + margin-top: 30px; +} + form .signup__btn { background: #238CFA; color: white; @@ -96,13 +109,14 @@ form .signup__btn:hover { box-shadow: 0 0 0 rgba(233, 30, 99, 0); } -.signup__link { +.sign__link { color: #9B9B9B; font-size: 15px; text-align: right; margin: 50px 30px 0 0; + cursor: pointer; } -.signup__link:hover { +.sign__link:hover { text-shadow: 0 15px 20px rgba(35, 140, 250, 0.36); } @@ -132,7 +146,7 @@ form .signup__btn:hover { .memo-container { display: block; max-width: 800px; - width: 87%; + width: 80%; margin: auto; } .memo-title-container { From bf5c2d02a8dfc56207aea5a05ac5512d8733849c Mon Sep 17 00:00:00 2001 From: Doyoung01 Date: Fri, 25 Aug 2023 16:05:41 +0900 Subject: [PATCH 30/48] Delete shadow of text and change test img --- src/components/user/Memos.tsx | 2 +- src/components/user/css/user.css | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/components/user/Memos.tsx b/src/components/user/Memos.tsx index 51f620a..dd0c44b 100644 --- a/src/components/user/Memos.tsx +++ b/src/components/user/Memos.tsx @@ -12,7 +12,7 @@ function Memo() {
테스트 데이터입니다.
diff --git a/src/components/user/css/user.css b/src/components/user/css/user.css index 24f738d..33e0ad8 100644 --- a/src/components/user/css/user.css +++ b/src/components/user/css/user.css @@ -23,7 +23,6 @@ h2 { font-family: Impact, Charcoal, 'Montserrat', sans-serif; color: #238CFA; margin: 10px 0 20px 3px; - text-shadow: 2px 2px 4px #67b0ff; } form { @@ -85,7 +84,7 @@ form .signin__btn:hover { cursor: pointer; display: block; margin: auto; - margin-right: 50px; + margin-right: 30px; margin-top: 30px; } @@ -113,7 +112,7 @@ form .signup__btn:hover { color: #9B9B9B; font-size: 15px; text-align: right; - margin: 50px 30px 0 0; + margin: 50px 20px 0 0; cursor: pointer; } .sign__link:hover { @@ -131,7 +130,7 @@ form .signup__btn:hover { display: inline; color: #238CFA; margin-right: 50px; - margin-left: 30px + margin-left: 30px; } .memo-close-button { background: url("https://cdn-icons-png.flaticon.com/512/75/75519.png") no-repeat; @@ -155,7 +154,7 @@ form .signup__btn:hover { align-items: flex-end; } .memo-title { - font-size: xx-large; + font-size: x-large; } .memo-date { flex-shrink: 0; @@ -171,14 +170,16 @@ form .signup__btn:hover { margin-top: 15px; } .memo-content-container { - display: flex; + display: block; margin-top: 15px; position: relative; + justify-content: center; } .memo-img { - width: 30%; + width: 100%; height: 100%; - margin-right: 20px; + margin: auto; + display: block; } From 498cb6dbcb4c2444bf8d499f6b9b9c1a46de030e Mon Sep 17 00:00:00 2001 From: Minjeong Kim <80758613+Minnnning@users.noreply.github.com> Date: Fri, 25 Aug 2023 16:27:46 +0900 Subject: [PATCH 31/48] Feature/signup page (#15) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: 리드미 수정 * chore: 리드미 수정 * add menu button * menu css modify * memo secoll feature * marker click event * readme modify * location add button toggle * loation add marker img * react-modal 라이브러리 추가 * 모달창 추가 태그 이미지 추가 필요 * 모달창 추가 * seleted 삭제 * css층돌 해결 * tag 선택 기능 * serarch 버튼 추가 * search modal 추가 * key값 오류 해결->index * 현위치로 이동 버튼 추가완료 * tags 연결 성공 * 검색 기능 연결 * 메모 추가 기능 완료 * 모달 닫기 중복 이벤트 수정 date 표기 수정 * 메모 작성완료시 화면 리다이렉트 * 회원가입 페이지 수정 이메일 추가 * 회원가입 페이지 수정 --- src/components/marker.tsx | 2 +- src/components/user/Signup.tsx | 79 +++++++++++++++++++++++++--------- 2 files changed, 60 insertions(+), 21 deletions(-) diff --git a/src/components/marker.tsx b/src/components/marker.tsx index ab19139..711eb06 100644 --- a/src/components/marker.tsx +++ b/src/components/marker.tsx @@ -40,7 +40,7 @@ function Marker(props: any) {
setIsOpen(false)}> 닫기 diff --git a/src/components/user/Signup.tsx b/src/components/user/Signup.tsx index a9715f0..16c66ce 100644 --- a/src/components/user/Signup.tsx +++ b/src/components/user/Signup.tsx @@ -1,23 +1,28 @@ import { SetStateAction, useState } from 'react'; +import axios from 'axios'; import './css/user.css'; -// 회원가입 // eslint-disable-next-line @typescript-eslint/no-explicit-any function Signup(props: any) { - const [Id, setId] = useState(''); + const [email, setEmail] = useState(''); + const [name, setName] = useState(''); const [password, setPassword] = useState(''); - // eslint-disable-next-line @typescript-eslint/no-unused-vars const [checkingPassword, setCheckingPassword] = useState(''); const [message, setMessage] = useState(''); const [blankMessage, setBlankMessage] = useState(''); - const onChangeId = (e: { target: { value: SetStateAction } }) => { - setId(e.target.value); + + const onChangeEmail = (e: { target: { value: SetStateAction } }) => { + setEmail(e.target.value); + }; + const onChangeName = (e: { target: { value: SetStateAction } }) => { + setName(e.target.value); }; const onChangePassword = (e: { target: { value: SetStateAction }; }) => { setPassword(e.target.value); }; + // eslint-disable-next-line @typescript-eslint/no-explicit-any const onChangeCheckingPassword = (e: { target: { value: any } }) => { const currentPassword = e.target.value; @@ -30,16 +35,39 @@ function Signup(props: any) { if (currentPassword === '') setMessage(''); }; const checkingBlank = () => { - if (Id && password && checkingPassword) { + if (email && password && checkingPassword && name) { setBlankMessage(''); } else { setBlankMessage('빈칸이 있습니다.'); } }; + const closeSignup = () => { props.signup(); props.close(); }; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const handleSubmit = async (e: any) => { + e.preventDefault(); + + const formData = new FormData(); + formData.append('email', email); + formData.append('password', password); + formData.append('checkingPassword', checkingPassword); + formData.append('nickname', name); + + try { + await axios.post('', formData, { + headers: { Accept: 'application/json' }, + }); + console.log('회원이 성공적으로 생성되었습니다.'); + window.location.reload(); //메인이 아니라 로그인 페이지로 이동해야 한다 + } catch (error) { + console.error('회원 생성에 실패했습니다.', error); + } + }; + return ( <> + {blankMessage ? ( + + ) : ( + + )}
로그인 From 850138f44d3dfec055467cb2aec7a51ec09823fb Mon Sep 17 00:00:00 2001 From: Doyoung01 Date: Fri, 25 Aug 2023 16:28:15 +0900 Subject: [PATCH 32/48] change my-page design --- src/components/user/Mypage.tsx | 4 ++-- src/components/user/css/user.css | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/components/user/Mypage.tsx b/src/components/user/Mypage.tsx index b207598..ac23c8c 100644 --- a/src/components/user/Mypage.tsx +++ b/src/components/user/Mypage.tsx @@ -20,8 +20,8 @@ function Mypage(props: any) { onClick={props.close} />
-

ID

-

hi {props.Id}

+

닉네임

+

안녕홍길동입니다 {props.Id}


    diff --git a/src/components/user/css/user.css b/src/components/user/css/user.css index 33e0ad8..6093936 100644 --- a/src/components/user/css/user.css +++ b/src/components/user/css/user.css @@ -125,12 +125,11 @@ form .signup__btn:hover { } .my-page { - font-family: Impact, Charcoal, 'Montserrat', sans-serif; font-size: 20px; display: inline; color: #238CFA; - margin-right: 50px; - margin-left: 30px; + margin-right: 30px; + margin-left: 5%; } .memo-close-button { background: url("https://cdn-icons-png.flaticon.com/512/75/75519.png") no-repeat; @@ -160,7 +159,6 @@ form .signup__btn:hover { flex-shrink: 0; } .my-page-id { - font-family: Impact, Charcoal, 'Montserrat', sans-serif; font-size: 20px; display: inline; } From c5636b8221fdb5e98a4162023ec7006056e8392b Mon Sep 17 00:00:00 2001 From: Doyoung01 Date: Fri, 25 Aug 2023 16:28:57 +0900 Subject: [PATCH 33/48] Change id to email in sign-in page --- src/components/user/Signin.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/components/user/Signin.tsx b/src/components/user/Signin.tsx index aeff2e4..bdc3071 100644 --- a/src/components/user/Signin.tsx +++ b/src/components/user/Signin.tsx @@ -4,11 +4,11 @@ import './css/user.css'; // 로그인 // eslint-disable-next-line @typescript-eslint/no-explicit-any function Signin(props: any) { - const [Id, setId] = useState(''); + const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [blankMessage, setBlankMessage] = useState(''); - const onChangeId = (e: { target: { value: SetStateAction } }) => { - setId(e.target.value); + const onChangeEmail = (e: { target: { value: SetStateAction } }) => { + setEmail(e.target.value); }; const onChangePassword = (e: { target: { value: SetStateAction }; @@ -16,7 +16,7 @@ function Signin(props: any) { setPassword(e.target.value); }; const checkingBlank = () => { - if (Id && password) { + if (email && password) { setBlankMessage(''); } else { setBlankMessage('빈칸이 있습니다.'); @@ -35,11 +35,11 @@ function Signin(props: any) {
    From 015f29fe5de1dd1679848ddfd8203b2fd3ad191e Mon Sep 17 00:00:00 2001 From: Minjeong Kim <80758613+Minnnning@users.noreply.github.com> Date: Fri, 25 Aug 2023 16:55:31 +0900 Subject: [PATCH 34/48] Feature/signin (#16) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: 리드미 수정 * chore: 리드미 수정 * add menu button * menu css modify * memo secoll feature * marker click event * readme modify * location add button toggle * loation add marker img * react-modal 라이브러리 추가 * 모달창 추가 태그 이미지 추가 필요 * 모달창 추가 * seleted 삭제 * css층돌 해결 * tag 선택 기능 * serarch 버튼 추가 * search modal 추가 * key값 오류 해결->index * 현위치로 이동 버튼 추가완료 * tags 연결 성공 * 검색 기능 연결 * 메모 추가 기능 완료 * 모달 닫기 중복 이벤트 수정 date 표기 수정 * 메모 작성완료시 화면 리다이렉트 * 회원가입 페이지 수정 이메일 추가 * 회원가입 페이지 수정 * 로그인 페이지 비동기 함수 추가 --- src/components/css/category.css | 4 +++ src/components/tags.tsx | 1 + src/components/user/Signin.tsx | 44 +++++++++++++++++++++++++++----- src/components/user/css/user.css | 33 ++++++++++++------------ 4 files changed, 59 insertions(+), 23 deletions(-) diff --git a/src/components/css/category.css b/src/components/css/category.css index 8d18daa..5388a56 100644 --- a/src/components/css/category.css +++ b/src/components/css/category.css @@ -25,3 +25,7 @@ .category li:hover { background-color: #f1f1f1; } + +.menu_selected { + background-color: #f1f1f1; +} diff --git a/src/components/tags.tsx b/src/components/tags.tsx index f08d759..f3b49e0 100644 --- a/src/components/tags.tsx +++ b/src/components/tags.tsx @@ -101,6 +101,7 @@ function Tags() {
    • { setSelectedCategory('all'); diff --git a/src/components/user/Signin.tsx b/src/components/user/Signin.tsx index bdc3071..8816572 100644 --- a/src/components/user/Signin.tsx +++ b/src/components/user/Signin.tsx @@ -1,4 +1,5 @@ import { SetStateAction, useState } from 'react'; +import axios from 'axios'; import './css/user.css'; // 로그인 @@ -22,6 +23,25 @@ function Signin(props: any) { setBlankMessage('빈칸이 있습니다.'); } }; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const handleSubmit = async (e: any) => { + e.preventDefault(); + + const formData = new FormData(); + formData.append('email', email); + formData.append('password', password); + + try { + await axios.post('', formData, { + headers: { Accept: 'application/json' }, + }); + console.log('로그인되었습니다.'); + window.location.reload(); //메인이 아니라 로그인 페이지로 이동해야 한다 + } catch (error) { + console.error('로그인에에 실패했습니다.', error); + } + }; return ( <>
    - + {email && password ? ( + + ) : ( + + )}
    회원가입 diff --git a/src/components/user/css/user.css b/src/components/user/css/user.css index 6093936..6c09743 100644 --- a/src/components/user/css/user.css +++ b/src/components/user/css/user.css @@ -1,5 +1,5 @@ body { - font-family: "Montserrat", sans-serif; + font-family: 'Montserrat', sans-serif; background: white; } @@ -11,7 +11,7 @@ body { } h1 { - color: #238CFA; + color: #238cfa; font-size: 48px; letter-spacing: -3px; text-align: center; @@ -21,7 +21,7 @@ h1 { h2 { font-family: Impact, Charcoal, 'Montserrat', sans-serif; - color: #238CFA; + color: #238cfa; margin: 10px 0 20px 3px; } @@ -47,7 +47,7 @@ form .input__block input { color: rgba(15, 19, 42, 0.3); padding: 0 0 0 15px; font-size: 14px; - font-family: "Montserrat", sans-serif; + font-family: 'Montserrat', sans-serif; } form .input__block input.repeat__password { @@ -56,7 +56,7 @@ form .input__block input.repeat__password { transition: 0.2s linear; } form .signin__btn { - background: #238CFA; + background: #238cfa; color: white; display: block; width: 92.5%; @@ -67,7 +67,7 @@ form .signin__btn { border: none; cursor: pointer; font-size: 14px; - font-family: "Montserrat", sans-serif; + font-family: 'Montserrat', sans-serif; box-shadow: 0 15px 30px rgba(35, 140, 250, 0.36); transition: 0.2s linear; } @@ -76,7 +76,8 @@ form .signin__btn:hover { } .signin-close-button { - background: url("https://cdn-icons-png.flaticon.com/512/75/75519.png") no-repeat; + background: url('https://cdn-icons-png.flaticon.com/512/75/75519.png') + no-repeat; width: 25px; height: 25px; background-size: contain; @@ -89,7 +90,7 @@ form .signin__btn:hover { } form .signup__btn { - background: #238CFA; + background: #238cfa; color: white; display: block; width: 92.5%; @@ -100,7 +101,7 @@ form .signup__btn { border: none; cursor: pointer; font-size: 14px; - font-family: "Montserrat", sans-serif; + font-family: 'Montserrat', sans-serif; box-shadow: 0 15px 30px rgba(35, 140, 250, 0.36); transition: 0.2s linear; } @@ -109,7 +110,7 @@ form .signup__btn:hover { } .sign__link { - color: #9B9B9B; + color: #9b9b9b; font-size: 15px; text-align: right; margin: 50px 20px 0 0; @@ -121,18 +122,19 @@ form .signup__btn:hover { .message-active { margin: 0 0 20px 25px; - color: #238CFA; + color: red; } .my-page { font-size: 20px; display: inline; - color: #238CFA; + color: #238cfa; margin-right: 30px; margin-left: 5%; } .memo-close-button { - background: url("https://cdn-icons-png.flaticon.com/512/75/75519.png") no-repeat; + background: url('https://cdn-icons-png.flaticon.com/512/75/75519.png') + no-repeat; width: 25px; height: 25px; background-size: contain; @@ -180,9 +182,8 @@ form .signup__btn:hover { display: block; } - hr.rounded { - border-top: 3px solid #238CFA; + border-top: 3px solid #238cfa; border-radius: 5px; } hr.rounded.memo { @@ -192,4 +193,4 @@ hr.rounded.memo { li { margin-bottom: 20px; -} \ No newline at end of file +} From bfd3f0e573e3252de7128ebb5c06c046cde458d9 Mon Sep 17 00:00:00 2001 From: Doyoung01 Date: Fri, 25 Aug 2023 16:59:53 +0900 Subject: [PATCH 35/48] Change button logic and blank checking function --- src/components/user/Signin.tsx | 2 ++ src/components/user/Signup.tsx | 13 ++++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/components/user/Signin.tsx b/src/components/user/Signin.tsx index 8816572..6ed2fa5 100644 --- a/src/components/user/Signin.tsx +++ b/src/components/user/Signin.tsx @@ -10,11 +10,13 @@ function Signin(props: any) { const [blankMessage, setBlankMessage] = useState(''); const onChangeEmail = (e: { target: { value: SetStateAction } }) => { setEmail(e.target.value); + checkingBlank(); }; const onChangePassword = (e: { target: { value: SetStateAction }; }) => { setPassword(e.target.value); + checkingBlank(); }; const checkingBlank = () => { if (email && password) { diff --git a/src/components/user/Signup.tsx b/src/components/user/Signup.tsx index 16c66ce..0314eed 100644 --- a/src/components/user/Signup.tsx +++ b/src/components/user/Signup.tsx @@ -13,14 +13,17 @@ function Signup(props: any) { const onChangeEmail = (e: { target: { value: SetStateAction } }) => { setEmail(e.target.value); + checkingBlank(); }; const onChangeName = (e: { target: { value: SetStateAction } }) => { setName(e.target.value); + checkingBlank(); }; const onChangePassword = (e: { target: { value: SetStateAction }; }) => { setPassword(e.target.value); + checkingBlank(); }; // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -120,19 +123,19 @@ function Signup(props: any) {
    {blankMessage}
    - {blankMessage ? ( + {email && name && password && checkingPassword ? ( ) : ( From da42932e8e3343f79f43ec6f69a7180bebfe650c Mon Sep 17 00:00:00 2001 From: Minjeong Kim <80758613+Minnnning@users.noreply.github.com> Date: Fri, 25 Aug 2023 22:02:01 +0900 Subject: [PATCH 36/48] =?UTF-8?q?Feature/=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85=20=EC=97=B0=EB=8F=99=20(#1?= =?UTF-8?q?7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: 리드미 수정 * chore: 리드미 수정 * add menu button * menu css modify * memo secoll feature * marker click event * readme modify * location add button toggle * loation add marker img * react-modal 라이브러리 추가 * 모달창 추가 태그 이미지 추가 필요 * 모달창 추가 * seleted 삭제 * css층돌 해결 * tag 선택 기능 * serarch 버튼 추가 * search modal 추가 * key값 오류 해결->index * 현위치로 이동 버튼 추가완료 * tags 연결 성공 * 검색 기능 연결 * 메모 추가 기능 완료 * 모달 닫기 중복 이벤트 수정 date 표기 수정 * 메모 작성완료시 화면 리다이렉트 * 회원가입 페이지 수정 이메일 추가 * 회원가입 페이지 수정 * 로그인 페이지 비동기 함수 추가 * 로그인 회원가입 연동 --- package-lock.json | 50 ++++++++++++++++++++++++++++++++++ package.json | 1 + src/App.tsx | 5 ++-- src/components/addModal.tsx | 10 +++++-- src/components/mainPage.tsx | 2 +- src/components/tags.tsx | 8 +++--- src/components/user/Signin.tsx | 35 ++++++++++++++++-------- src/components/user/Signup.tsx | 16 +++++++---- src/hooks/useCookie.tsx | 12 ++++++++ 9 files changed, 113 insertions(+), 26 deletions(-) create mode 100644 src/hooks/useCookie.tsx diff --git a/package-lock.json b/package-lock.json index 998b760..e86f37b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "@types/react-dom": "^18.2.7", "axios": "^1.4.0", "react": "^18.2.0", + "react-cookie": "^6.1.0", "react-dom": "^18.2.0", "react-kakao-maps-sdk": "^1.1.11", "react-modal": "^3.16.1", @@ -3721,6 +3722,11 @@ "@types/node": "*" } }, + "node_modules/@types/cookie": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.1.tgz", + "integrity": "sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==" + }, "node_modules/@types/eslint": { "version": "8.44.2", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", @@ -3774,6 +3780,15 @@ "@types/node": "*" } }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -8986,6 +9001,19 @@ "he": "bin/he" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/hoopy": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", @@ -13767,6 +13795,19 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, + "node_modules/react-cookie": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-6.1.0.tgz", + "integrity": "sha512-j/q0kf4f8kK7zXyTdGEebtZ3IKhVCPZVL3pf6y9/KlfFThxRjb+xvgdKAvRB2VrdkXyu9Qbrb/VuiFUNK6/3+g==", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.1", + "hoist-non-react-statics": "^3.3.2", + "universal-cookie": "^6.0.0" + }, + "peerDependencies": { + "react": ">= 16.3.0" + } + }, "node_modules/react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", @@ -15958,6 +15999,15 @@ "node": ">=8" } }, + "node_modules/universal-cookie": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-6.1.0.tgz", + "integrity": "sha512-QBpQWkFJyH9D6nP1ZjPuLDdrgYr3y9ti8OTWf6uWcZwtY06de5f10GPYv3v68LIYWU0a9J2ZF5xFR5gOdD5ZaQ==", + "dependencies": { + "@types/cookie": "^0.5.1", + "cookie": "^0.5.0" + } + }, "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", diff --git a/package.json b/package.json index 1e72713..636d2cc 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "@types/react-dom": "^18.2.7", "axios": "^1.4.0", "react": "^18.2.0", + "react-cookie": "^6.1.0", "react-dom": "^18.2.0", "react-kakao-maps-sdk": "^1.1.11", "react-modal": "^3.16.1", diff --git a/src/App.tsx b/src/App.tsx index 60ac07a..7efc262 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2,6 +2,7 @@ import './App.css'; import useGeoLocation from './hooks/useGeolocation'; import MainPage from './components/mainPage'; import Loading from './components/loading'; +import { CookiesProvider } from 'react-cookie'; function App() { const location = useGeoLocation(); @@ -17,9 +18,9 @@ function App() { }; return ( - <> + - + ); } else { return ( diff --git a/src/components/addModal.tsx b/src/components/addModal.tsx index 4643f1a..305483a 100644 --- a/src/components/addModal.tsx +++ b/src/components/addModal.tsx @@ -1,6 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import Modal from 'react-modal'; import { useState } from 'react'; +import { useCookies } from 'react-cookie'; import './css/modal.css'; import axios from 'axios'; @@ -33,6 +34,7 @@ function AddModal(props: any) { const [tag, setTag] = useState('기타'); const [content, setContent] = useState(''); const [image, setImage] = useState(''); + const [cookies] = useCookies(['accessToken']); //const [writer, setWriter] = useState(''); //작성자는 따로 비동기 코드를 작성해서 저장한다 @@ -62,8 +64,12 @@ function AddModal(props: any) { } try { - await axios.post('http://mapping.kro.kr:8080/memo/upload', formData, { - headers: { 'Content-Type': 'multipart/form-data' }, + const token = cookies.accessToken; // 쿠키에서 id 를 꺼내기 + await axios.post('http://mapping.kro.kr:8080/api/memo/upload', formData, { + headers: { + 'Content-Type': 'multipart/form-data', + Authorization: `Bearer ${token}`, + }, }); console.log('메모가 성공적으로 생성되었습니다.'); window.location.reload(); diff --git a/src/components/mainPage.tsx b/src/components/mainPage.tsx index 82d27a8..35dab7c 100644 --- a/src/components/mainPage.tsx +++ b/src/components/mainPage.tsx @@ -24,7 +24,7 @@ function MainPage(props: any) { setPosition(props.data); setisLogin((prev) => !prev); }; - console.log(mypageisOpen, isLogin, isSignup); + return !mypageisOpen ? ( <> { - fetch('http://mapping.kro.kr:8080/memo', { + fetch('http://mapping.kro.kr:8080/api/memo', { method: 'GET', headers: { Accept: 'application/json', @@ -20,7 +20,7 @@ function Tags() { const [trashPositions, setTrashPositions] = useState([]); useEffect(() => { - fetch('http://mapping.kro.kr:8080/memo/tagsearch?tag=쓰레기통', { + fetch('http://mapping.kro.kr:8080/api/memo/tagsearch?tag=쓰레기통', { method: 'GET', headers: { Accept: 'application/json', @@ -34,7 +34,7 @@ function Tags() { const [toiletPositions, setToiletPositions] = useState([]); useEffect(() => { - fetch('http://mapping.kro.kr:8080/memo/tagsearch?tag=화장실', { + fetch('http://mapping.kro.kr:8080/api/memo/tagsearch?tag=화장실', { method: 'GET', headers: { Accept: 'application/json', @@ -48,7 +48,7 @@ function Tags() { const [constructionPositions, setConstructionPositions] = useState([]); useEffect(() => { - fetch('http://mapping.kro.kr:8080/memo/tagsearch?tag=공사중', { + fetch('http://mapping.kro.kr:8080/api/memo/tagsearch?tag=공사중', { method: 'GET', headers: { Accept: 'application/json', diff --git a/src/components/user/Signin.tsx b/src/components/user/Signin.tsx index 6ed2fa5..dc2ba6b 100644 --- a/src/components/user/Signin.tsx +++ b/src/components/user/Signin.tsx @@ -1,20 +1,21 @@ -import { SetStateAction, useState } from 'react'; +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { useState } from 'react'; +import { useCookies } from 'react-cookie'; import axios from 'axios'; import './css/user.css'; // 로그인 -// eslint-disable-next-line @typescript-eslint/no-explicit-any function Signin(props: any) { const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [blankMessage, setBlankMessage] = useState(''); - const onChangeEmail = (e: { target: { value: SetStateAction } }) => { + const [cookie, setCookie] = useCookies(['accessToken']); + + const onChangeEmail = (e: any) => { setEmail(e.target.value); checkingBlank(); }; - const onChangePassword = (e: { - target: { value: SetStateAction }; - }) => { + const onChangePassword = (e: any) => { setPassword(e.target.value); checkingBlank(); }; @@ -31,14 +32,26 @@ function Signin(props: any) { e.preventDefault(); const formData = new FormData(); - formData.append('email', email); - formData.append('password', password); + formData.append('userEmail', email); + formData.append('userPassword', password); try { - await axios.post('', formData, { - headers: { Accept: 'application/json' }, - }); + const response = await axios.post( + 'http://mapping.kro.kr:8080/api/auth/signIn', + formData, + { + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + }, + ); console.log('로그인되었습니다.'); + setCookie('accessToken', response.data.data.token, { + path: '/', + maxAge: 3600, + }); // 여기서 쿠키 설정 + console.log(cookie); window.location.reload(); //메인이 아니라 로그인 페이지로 이동해야 한다 } catch (error) { console.error('로그인에에 실패했습니다.', error); diff --git a/src/components/user/Signup.tsx b/src/components/user/Signup.tsx index 0314eed..b9703d2 100644 --- a/src/components/user/Signup.tsx +++ b/src/components/user/Signup.tsx @@ -55,14 +55,18 @@ function Signup(props: any) { e.preventDefault(); const formData = new FormData(); - formData.append('email', email); - formData.append('password', password); - formData.append('checkingPassword', checkingPassword); - formData.append('nickname', name); + formData.append('userEmail', email); + formData.append('userPassword', password); + formData.append('userPasswordcheck', checkingPassword); + formData.append('userNickname', name); + formData.append('userPhoneNumber', '213424'); try { - await axios.post('', formData, { - headers: { Accept: 'application/json' }, + await axios.post('http://mapping.kro.kr:8080/api/auth/signUp', formData, { + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, }); console.log('회원이 성공적으로 생성되었습니다.'); window.location.reload(); //메인이 아니라 로그인 페이지로 이동해야 한다 diff --git a/src/hooks/useCookie.tsx b/src/hooks/useCookie.tsx new file mode 100644 index 0000000..57bc973 --- /dev/null +++ b/src/hooks/useCookie.tsx @@ -0,0 +1,12 @@ +import { Cookies } from 'react-cookie'; + +const cookies = new Cookies(); + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const setCookie = (name: string, value: string, options?: any) => { + return cookies.set(name, value, { ...options }); +}; + +export const getCookie = (name: string) => { + return cookies.get(name); +}; From 0fc61cc86f06daba1172e9739c2f820eef177ad3 Mon Sep 17 00:00:00 2001 From: Doyoung01 Date: Fri, 25 Aug 2023 23:02:37 +0900 Subject: [PATCH 37/48] Make memo modifying form --- src/components/user/Memos.tsx | 7 ++++ src/components/user/Modify.tsx | 63 ++++++++++++++++++++++++++++++ src/components/user/css/button.css | 5 +++ src/components/user/css/modify.css | 28 +++++++++++++ 4 files changed, 103 insertions(+) create mode 100644 src/components/user/Modify.tsx create mode 100644 src/components/user/css/modify.css diff --git a/src/components/user/Memos.tsx b/src/components/user/Memos.tsx index dd0c44b..08b53ac 100644 --- a/src/components/user/Memos.tsx +++ b/src/components/user/Memos.tsx @@ -1,9 +1,16 @@ import './css/user.css'; import './css/button.css'; +import Modify from './Modify'; function Memo() { + const data = { + title: '안녕하세요.', + content: '반갑습니다.', + img: 'https://item.kakaocdn.net/do/b563e153db82fde06e1423472ccf192c9f17e489affba0627eb1eb39695f93dd', + }; return ( <> +
  • 메모제목
    diff --git a/src/components/user/Modify.tsx b/src/components/user/Modify.tsx new file mode 100644 index 0000000..c84d200 --- /dev/null +++ b/src/components/user/Modify.tsx @@ -0,0 +1,63 @@ +import { useState } from 'react'; +import './css/user.css'; +import './css/button.css'; +import './css/modify.css'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function Modify(props: any) { + const [title, setTitle] = useState(props.data.title); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [image, setImage] = useState(props.data.img); + const [content, setContent] = useState(props.data.content); + + console.log(title, image, content); + return ( + <> +
  • +
    +
    + { + setTitle(e.target.value); + }} + value={title} + /> + +
    +
    2023-08-23
    +
    +
    + { + setImage(e.target.files); + console.log('upload'); + console.log(image); + }} + /> +
    +