From 45978603fb96f56a47968c2536c49ca36f32f6b7 Mon Sep 17 00:00:00 2001 From: Moritz Stueckler <moritz.stueckler@gmail.com> Date: Fri, 30 Apr 2021 17:57:35 +0200 Subject: [PATCH] Revert "Merge branch 'feat/add-poi-form' into 'main'" This reverts commit e52c58075b310168abe3b56e0cf0f64832a627fc, reversing changes made to 804bcc17e679b6cf5064ff4da93b1cdd84bccac6. --- .gitlab-ci.yml | 2 +- package-lock.json | 482 +----------------- package.json | 7 +- snowpack.config.js | 3 +- src/App.tsx | 97 ++++ src/{components => }/Map/Map.tsx | 59 +-- .../Map/MapViewController.tsx | 0 src/{components => }/Modal.tsx | 0 src/Sidebar/SidebarContainer.tsx | 21 + .../SidebarListElement.tsx} | 9 +- src/Sidebar/SidebarListView.tsx | 44 ++ src/Sidebar/SidebarSingleView.tsx | 54 ++ src/components/App.tsx | 29 -- src/components/ErrorModal.tsx | 16 - src/components/Sidebar/AddPoiForm.tsx | 127 ----- src/components/Sidebar/SidebarContainer.tsx | 19 - src/components/Sidebar/SidebarCreateView.tsx | 24 - src/components/Sidebar/SidebarListView.tsx | 31 -- src/components/Sidebar/SidebarSingleView.tsx | 62 --- src/components/Sidebar/Tag.tsx | 19 - src/components/SwrWrapper.tsx | 29 -- src/hooks/index.ts | 2 - src/hooks/usePoiData.ts | 34 -- src/hooks/useStore.ts | 46 -- src/index.css | 8 - src/index.tsx | 14 +- src/testData.json | 55 ++ src/types/Error.ts | 5 - src/types/PointOfInterest.ts | 13 +- tailwind.config.js | 2 +- 30 files changed, 325 insertions(+), 988 deletions(-) create mode 100644 src/App.tsx rename src/{components => }/Map/Map.tsx (52%) rename src/{components => }/Map/MapViewController.tsx (100%) rename src/{components => }/Modal.tsx (100%) create mode 100644 src/Sidebar/SidebarContainer.tsx rename src/{components/Sidebar/ListElement.tsx => Sidebar/SidebarListElement.tsx} (70%) create mode 100644 src/Sidebar/SidebarListView.tsx create mode 100644 src/Sidebar/SidebarSingleView.tsx delete mode 100644 src/components/App.tsx delete mode 100644 src/components/ErrorModal.tsx delete mode 100644 src/components/Sidebar/AddPoiForm.tsx delete mode 100644 src/components/Sidebar/SidebarContainer.tsx delete mode 100644 src/components/Sidebar/SidebarCreateView.tsx delete mode 100644 src/components/Sidebar/SidebarListView.tsx delete mode 100644 src/components/Sidebar/SidebarSingleView.tsx delete mode 100644 src/components/Sidebar/Tag.tsx delete mode 100644 src/components/SwrWrapper.tsx delete mode 100644 src/hooks/index.ts delete mode 100644 src/hooks/usePoiData.ts delete mode 100644 src/hooks/useStore.ts create mode 100644 src/testData.json delete mode 100644 src/types/Error.ts diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2e644af..6a3dd2c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -9,7 +9,7 @@ before_script: - apk add --no-cache lftp openssh - mkdir -p ~/.ssh - echo "$SSH_KNOWN_HOSTS" >> ~/.ssh/known_hosts - - echo "$FRONTEND_ENV" > .env + - echo "$FRONTEND_ENV" >> .env npm build: stage: build diff --git a/package-lock.json b/package-lock.json index 2ad7b7e..4fa0eba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,7 +5,6 @@ "packages": { "": { "dependencies": { - "@tailwindcss/forms": "^0.3.2", "graphql": "^15.5.0", "graphql-request": "^3.4.0", "heroicons-react": "1.3.0", @@ -13,13 +12,10 @@ "react": "^17.0.0", "react-dom": "^17.0.0", "react-leaflet": "^3.1.0", - "react-router-dom": "^5.2.0", "swr": "^0.5.5", - "tailwindcss": "^2.0.3", - "zustand": "^3.4.1" + "tailwindcss": "^2.0.3" }, "devDependencies": { - "@jadex/snowpack-plugin-tailwindcss-jit": "^0.2.0", "@snowpack/plugin-dotenv": "^2.1.0", "@snowpack/plugin-postcss": "^1.1.0", "@snowpack/plugin-react-refresh": "^2.4.0", @@ -27,7 +23,6 @@ "@types/leaflet": "^1.7.0", "@types/react": "^17.0.0", "@types/react-dom": "^17.0.0", - "@types/react-router-dom": "^5.1.7", "@types/snowpack-env": "^2.3.2", "autoprefixer": "^10.2.4", "postcss": "^8.2.6", @@ -265,14 +260,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/runtime": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", - "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", - "dependencies": { - "regenerator-runtime": "^0.13.4" - } - }, "node_modules/@babel/template": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", @@ -318,21 +305,6 @@ "purgecss": "^3.1.3" } }, - "node_modules/@jadex/snowpack-plugin-tailwindcss-jit": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@jadex/snowpack-plugin-tailwindcss-jit/-/snowpack-plugin-tailwindcss-jit-0.2.0.tgz", - "integrity": "sha512-iZfHqtLZzsFKAgMBVCGFJdQWWnXoLhWr7m98DJalu772SSMGXrWryW4nC/Hyk/1RDiL861BAVzXO6aZT3KLtgw==", - "dev": true, - "dependencies": { - "fs": "^0.0.1-security", - "micromatch": "^4.0.2", - "path": "^0.12.7" - }, - "peerDependencies": { - "snowpack": "^3.2.2", - "tailwindcss": "^2.1.0" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", @@ -478,7 +450,6 @@ "resolved": "https://registry.npmjs.org/@snowpack/plugin-postcss/-/plugin-postcss-1.2.2.tgz", "integrity": "sha512-XL4EyfDLcxCeo9bOm8ScNAFq9pU4bFkFq4GY6/Zokq/rxMh9lugOHTLWeT/p4IxLh4CX1o7pX8b61Eplcqlfqg==", "dev": true, - "license": "MIT", "dependencies": { "postcss-load-config": "^3.0.1", "workerpool": "^6.1.2" @@ -515,17 +486,6 @@ "typescript": "*" } }, - "node_modules/@tailwindcss/forms": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.3.2.tgz", - "integrity": "sha512-aj2/rJsGb2whAZ/BQWHWWQRSbhH0r/l1ozOByiv+ZNjBD84GMvb5dhAyfpeasFky+EJrAwX5eaqft8NQMZFWvA==", - "dependencies": { - "mini-svg-data-uri": "^1.2.3" - }, - "peerDependencies": { - "tailwindcss": ">=2.0.0" - } - }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -541,12 +501,6 @@ "integrity": "sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ==", "dev": true }, - "node_modules/@types/history": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.8.tgz", - "integrity": "sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA==", - "dev": true - }, "node_modules/@types/leaflet": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.7.0.tgz", @@ -588,27 +542,6 @@ "@types/react": "*" } }, - "node_modules/@types/react-router": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.13.tgz", - "integrity": "sha512-ZIuaO9Yrln54X6elg8q2Ivp6iK6p4syPsefEYAhRDAoqNh48C8VYUmB9RkXjKSQAJSJV0mbIFCX7I4vZDcHrjg==", - "dev": true, - "dependencies": { - "@types/history": "*", - "@types/react": "*" - } - }, - "node_modules/@types/react-router-dom": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.1.7.tgz", - "integrity": "sha512-D5mHD6TbdV/DNHYsnwBTv+y73ei+mMjrkGrla86HthE4/PVvL1J94Bu3qABU+COXzpL23T1EZapVVpwHuBXiUg==", - "dev": true, - "dependencies": { - "@types/history": "*", - "@types/react": "*", - "@types/react-router": "*" - } - }, "node_modules/@types/scheduler": { "version": "0.16.1", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", @@ -1614,12 +1547,6 @@ "node": "*" } }, - "node_modules/fs": { - "version": "0.0.1-security", - "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", - "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=", - "dev": true - }, "node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -1917,27 +1844,6 @@ "react": ">=16.13" } }, - "node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "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/hosted-git-info": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", @@ -2272,9 +2178,10 @@ } }, "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "node_modules/isexe": { "version": "2.0.0", @@ -2544,24 +2451,6 @@ "node": ">=6" } }, - "node_modules/mini-create-react-context": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", - "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", - "dependencies": { - "@babel/runtime": "^7.12.1", - "tiny-warning": "^1.0.3" - }, - "peerDependencies": { - "prop-types": "^15.0.0", - "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/mini-svg-data-uri": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.2.3.tgz", - "integrity": "sha512-zd6KCAyXgmq6FV1mR10oKXYtvmA9vRoB6xPSTUJTbFApCtkefDnYueVR1gkof3KcdLZo1Y8mjF2DFmQMIxsHNQ==" - }, "node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -3160,16 +3049,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", - "dev": true, - "dependencies": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -3192,14 +3071,6 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, - "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dependencies": { - "isarray": "0.0.1" - } - }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -3508,15 +3379,6 @@ "node": ">= 0.8" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -3542,16 +3404,6 @@ "node": ">=10" } }, - "node_modules/prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, "node_modules/psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -3645,11 +3497,6 @@ "react": "17.0.2" } }, - "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/react-leaflet": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-3.1.0.tgz", @@ -3672,43 +3519,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-router": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", - "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==", - "dependencies": { - "@babel/runtime": "^7.1.2", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "mini-create-react-context": "^0.4.0", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router-dom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz", - "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==", - "dependencies": { - "@babel/runtime": "^7.1.2", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.2.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -3746,12 +3556,6 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/readable-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, "node_modules/readdirp": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", @@ -3777,11 +3581,6 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" }, - "node_modules/regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -3858,11 +3657,6 @@ "node": ">=4" } }, - "node_modules/resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" - }, "node_modules/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -4336,16 +4130,6 @@ "node": ">= 10" } }, - "node_modules/tiny-invariant": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", - "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -4457,26 +4241,11 @@ "punycode": "^2.1.0" } }, - "node_modules/util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dev": true, - "dependencies": { - "inherits": "2.0.3" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "node_modules/util/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, "node_modules/uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -4495,11 +4264,6 @@ "builtins": "^1.0.3" } }, - "node_modules/value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" - }, "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -4745,14 +4509,6 @@ "engines": { "node": ">=8" } - }, - "node_modules/zustand": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.4.1.tgz", - "integrity": "sha512-Kb91vSjy5vwBQ/PQ1a5GE6naS3gCxCgpkujT9zqZSO85+gnvmzgqraMW3ao1I0jR4PwHBXtLTf26r9j7EXoUiQ==", - "peerDependencies": { - "react": ">=16.8" - } } }, "dependencies": { @@ -4965,14 +4721,6 @@ "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/runtime": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", - "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, "@babel/template": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", @@ -5018,17 +4766,6 @@ "purgecss": "^3.1.3" } }, - "@jadex/snowpack-plugin-tailwindcss-jit": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@jadex/snowpack-plugin-tailwindcss-jit/-/snowpack-plugin-tailwindcss-jit-0.2.0.tgz", - "integrity": "sha512-iZfHqtLZzsFKAgMBVCGFJdQWWnXoLhWr7m98DJalu772SSMGXrWryW4nC/Hyk/1RDiL861BAVzXO6aZT3KLtgw==", - "dev": true, - "requires": { - "fs": "^0.0.1-security", - "micromatch": "^4.0.2", - "path": "^0.12.7" - } - }, "@nodelib/fs.scandir": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", @@ -5174,14 +4911,6 @@ "npm-run-path": "^4.0.1" } }, - "@tailwindcss/forms": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.3.2.tgz", - "integrity": "sha512-aj2/rJsGb2whAZ/BQWHWWQRSbhH0r/l1ozOByiv+ZNjBD84GMvb5dhAyfpeasFky+EJrAwX5eaqft8NQMZFWvA==", - "requires": { - "mini-svg-data-uri": "^1.2.3" - } - }, "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -5194,12 +4923,6 @@ "integrity": "sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ==", "dev": true }, - "@types/history": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.8.tgz", - "integrity": "sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA==", - "dev": true - }, "@types/leaflet": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.7.0.tgz", @@ -5241,27 +4964,6 @@ "@types/react": "*" } }, - "@types/react-router": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.13.tgz", - "integrity": "sha512-ZIuaO9Yrln54X6elg8q2Ivp6iK6p4syPsefEYAhRDAoqNh48C8VYUmB9RkXjKSQAJSJV0mbIFCX7I4vZDcHrjg==", - "dev": true, - "requires": { - "@types/history": "*", - "@types/react": "*" - } - }, - "@types/react-router-dom": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.1.7.tgz", - "integrity": "sha512-D5mHD6TbdV/DNHYsnwBTv+y73ei+mMjrkGrla86HthE4/PVvL1J94Bu3qABU+COXzpL23T1EZapVVpwHuBXiUg==", - "dev": true, - "requires": { - "@types/history": "*", - "@types/react": "*", - "@types/react-router": "*" - } - }, "@types/scheduler": { "version": "0.16.1", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", @@ -6048,12 +5750,6 @@ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.0.13.tgz", "integrity": "sha512-E1fz2Xs9ltlUp+qbiyx9wmt2n9dRzPsS11Jtdb8D2o+cC7wr9xkkKsVKJuBX0ST+LVS+LhLO+SbLJNtfWcJvXA==" }, - "fs": { - "version": "0.0.1-security", - "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", - "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=", - "dev": true - }, "fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -6273,27 +5969,6 @@ "integrity": "sha512-gz1XE6/BsuVfyBM/RiDMgapPmrf2ZrDcF8GxJ26PJTPQnEbDFs9TPzpJ5IDPQLpUor/qshPbVDv20yWIwhMwyA==", "requires": {} }, - "history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "requires": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "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==", - "requires": { - "react-is": "^16.7.0" - } - }, "hosted-git-info": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", @@ -6548,9 +6223,10 @@ } }, "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "isexe": { "version": "2.0.0", @@ -6776,20 +6452,6 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, - "mini-create-react-context": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", - "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", - "requires": { - "@babel/runtime": "^7.12.1", - "tiny-warning": "^1.0.3" - } - }, - "mini-svg-data-uri": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.2.3.tgz", - "integrity": "sha512-zd6KCAyXgmq6FV1mR10oKXYtvmA9vRoB6xPSTUJTbFApCtkefDnYueVR1gkof3KcdLZo1Y8mjF2DFmQMIxsHNQ==" - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -7234,16 +6896,6 @@ "lines-and-columns": "^1.1.6" } }, - "path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", - "dev": true, - "requires": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -7260,14 +6912,6 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "requires": { - "isarray": "0.0.1" - } - }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -7478,12 +7122,6 @@ "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -7506,16 +7144,6 @@ "retry": "^0.12.0" } }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -7574,11 +7202,6 @@ "scheduler": "^0.20.2" } }, - "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==" - }, "react-leaflet": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-3.1.0.tgz", @@ -7593,37 +7216,6 @@ "integrity": "sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==", "dev": true }, - "react-router": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", - "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==", - "requires": { - "@babel/runtime": "^7.1.2", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "mini-create-react-context": "^0.4.0", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - } - }, - "react-router-dom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz", - "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==", - "requires": { - "@babel/runtime": "^7.1.2", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.2.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - } - }, "read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -7656,14 +7248,6 @@ "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } } }, "readdirp": { @@ -7690,11 +7274,6 @@ } } }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -7757,11 +7336,6 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" - }, "retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -8104,16 +7678,6 @@ "yallist": "^4.0.0" } }, - "tiny-invariant": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", - "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" - }, - "tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -8200,23 +7764,6 @@ "punycode": "^2.1.0" } }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dev": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -8237,11 +7784,6 @@ "builtins": "^1.0.3" } }, - "value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" - }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -8428,12 +7970,6 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", "dev": true - }, - "zustand": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.4.1.tgz", - "integrity": "sha512-Kb91vSjy5vwBQ/PQ1a5GE6naS3gCxCgpkujT9zqZSO85+gnvmzgqraMW3ao1I0jR4PwHBXtLTf26r9j7EXoUiQ==", - "requires": {} } } } diff --git a/package.json b/package.json index d4e0b16..f829d35 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,6 @@ "lint": "prettier --check \"src/**/*.{js,jsx,ts,tsx}\"" }, "dependencies": { - "@tailwindcss/forms": "^0.3.2", "graphql": "^15.5.0", "graphql-request": "^3.4.0", "heroicons-react": "1.3.0", @@ -14,13 +13,10 @@ "react": "^17.0.0", "react-dom": "^17.0.0", "react-leaflet": "^3.1.0", - "react-router-dom": "^5.2.0", "swr": "^0.5.5", - "tailwindcss": "^2.0.3", - "zustand": "^3.4.1" + "tailwindcss": "^2.0.3" }, "devDependencies": { - "@jadex/snowpack-plugin-tailwindcss-jit": "^0.2.0", "@snowpack/plugin-dotenv": "^2.1.0", "@snowpack/plugin-postcss": "^1.1.0", "@snowpack/plugin-react-refresh": "^2.4.0", @@ -28,7 +24,6 @@ "@types/leaflet": "^1.7.0", "@types/react": "^17.0.0", "@types/react-dom": "^17.0.0", - "@types/react-router-dom": "^5.1.7", "@types/snowpack-env": "^2.3.2", "autoprefixer": "^10.2.4", "postcss": "^8.2.6", diff --git a/snowpack.config.js b/snowpack.config.js index 09245c9..829a854 100644 --- a/snowpack.config.js +++ b/snowpack.config.js @@ -10,11 +10,10 @@ module.exports = { '@snowpack/plugin-typescript', '@snowpack/plugin-postcss', '@snowpack/plugin-dotenv', - '@jadex/snowpack-plugin-tailwindcss-jit', ], routes: [ /* Enable an SPA Fallback in development: */ - { match: 'routes', src: '.*', dest: '/index.html' }, + // {"match": "routes", "src": ".*", "dest": "/index.html"}, ], optimize: { /* Example: Bundle your final build: */ diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..938975d --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,97 @@ +import React, { useEffect, useState } from 'react'; +import useSWR from 'swr'; +import SidebarListView from './Sidebar/SidebarListView'; +import type { PointOfInterest } from './types/PointOfInterest'; +import SidebarSingleView from './Sidebar/SidebarSingleView'; +import Map from './Map/Map'; +import Modal from './Modal'; +import { ExclamationOutline as AlertIcon } from 'heroicons-react'; + +function App() { + const [poiData, setPoiData] = useState<PointOfInterest[]>([]); + const [selectedPoi, setSelectedPoi] = useState<null | PointOfInterest>(null); + const [hoveredPoiId, setHoveredPoiId] = useState<null | number>(null); + const [showErrorModal, setShowErrorModal] = useState<boolean>(false); + + const handlePoiClick = (id: number) => { + const newPoi = poiData.find((poi) => poi.id === id); + newPoi && setSelectedPoi(newPoi); + }; + + const handlePoiClose = () => { + setSelectedPoi(null); + }; + + const handlePoiHoverOn = (poiId: number) => { + setHoveredPoiId(poiId); + }; + + const handlePoiHoverOff = () => { + setHoveredPoiId(null); + }; + + const { data, error } = useSWR( + `{ + pois { + id + name + description + website + address + lat + lng + image + category + } + } + `, + ); + + useEffect(() => { + data && console.log('Fetched new data', data); + data?.pois && setPoiData(data.pois); + }, [data]); + + useEffect(() => { + if (error) { + console.error('Error while fetching', error); + setShowErrorModal(true); + } + }, [error]); + + return ( + <> + {showErrorModal && ( + <Modal + title="API nicht erreichbar" + text="Kann die API nicht erreichen. Bitte später erneut probieren." + icon={<AlertIcon className="h-6 w-6 text-red-600" />} + /> + )} + <div className={'flex md:flex-row-reverse flex-col h-full'}> + <Map + onMouseEnter={handlePoiHoverOn} + onMouseLeave={handlePoiHoverOff} + hoveredPoiId={hoveredPoiId} + values={poiData} + onSelect={handlePoiClick} + selectedEntry={selectedPoi} + /> + {selectedPoi ? ( + <SidebarSingleView className="sidebar" value={selectedPoi} onClose={handlePoiClose} /> + ) : ( + <SidebarListView + hoveredPoiId={hoveredPoiId} + onMouseEnter={handlePoiHoverOn} + onMouseLeave={handlePoiHoverOff} + className="sidebar" + values={poiData} + onClick={handlePoiClick} + /> + )} + </div> + </> + ); +} + +export default App; diff --git a/src/components/Map/Map.tsx b/src/Map/Map.tsx similarity index 52% rename from src/components/Map/Map.tsx rename to src/Map/Map.tsx index 635bd42..5f571c8 100644 --- a/src/components/Map/Map.tsx +++ b/src/Map/Map.tsx @@ -1,33 +1,34 @@ -import type { LatLngExpression } from 'leaflet'; -import { divIcon, DivIconOptions } from 'leaflet'; -import React, { useMemo } from 'react'; import { MapContainer, Marker, TileLayer } from 'react-leaflet'; -import { usePoiData, useStore } from '../../hooks'; +import React, { useMemo } from 'react'; +import { divIcon, DivIconOptions } from 'leaflet'; +import type { PointOfInterest } from '../types/PointOfInterest'; +import type { LatLngExpression } from 'leaflet'; import MapViewController from './MapViewController'; interface Props { - hideAllPois?: boolean; + values: PointOfInterest[]; + onSelect: (id: number) => void; + selectedEntry?: PointOfInterest | null; + hoveredPoiId?: number | null; + onMouseEnter?: (id: number) => void; + onMouseLeave?: () => void; } const DEFAULT_CENTER: LatLngExpression = [53.550359, 9.986701]; -const iconProps: DivIconOptions = { - className: 'marker', - // Source: https://fontawesome.com/icons/map-marker-alt - html: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><path fill="currentColor" d="M172.268 501.67C26.97 291.031 0 269.413 0 192 0 85.961 85.961 0 192 0s192 85.961 192 192c0 77.413-26.97 99.031-172.268 309.67-9.535 13.774-29.93 13.773-39.464 0zM192 272c44.183 0 80-35.817 80-80s-35.817-80-80-80-80 35.817-80 80 35.817 80 80 80z"/></svg>`, - iconSize: [24, 32], - iconAnchor: [12, 32], -}; -export const Map: React.FC<Props> = ({ hideAllPois = false }) => { +export const Map: React.FC<Props> = (props) => { + const iconProps: DivIconOptions = { + className: 'marker', + // Source: https://fontawesome.com/icons/map-marker-alt + html: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><path fill="currentColor" d="M172.268 501.67C26.97 291.031 0 269.413 0 192 0 85.961 85.961 0 192 0s192 85.961 192 192c0 77.413-26.97 99.031-172.268 309.67-9.535 13.774-29.93 13.773-39.464 0zM192 272c44.183 0 80-35.817 80-80s-35.817-80-80-80-80 35.817-80 80 35.817 80 80 80z"/></svg>`, + iconSize: [24, 32], + iconAnchor: [12, 32], + }; const icon = useMemo(() => divIcon(iconProps), [iconProps]); const largeIcon = useMemo(() => divIcon({ ...iconProps, iconSize: [30, 40], iconAnchor: [15, 40] }), [iconProps]); - - const { data } = usePoiData(); - const hoveredPoi = useStore((state) => state.hoveredPoi); - const setHoveredPoi = useStore((state) => state.setHoveredPoi); - const selectedPoi = useStore((state) => state.selectedPoi); - const setSelectedPoi = useStore((state) => state.setSelectedPoi); - const selectedLatlng: LatLngExpression | undefined = selectedPoi ? [selectedPoi?.lat, selectedPoi?.lng] : undefined; + const selectedLatlng: LatLngExpression | undefined = props.selectedEntry + ? [props.selectedEntry?.lat, props.selectedEntry?.lng] + : undefined; return ( <MapContainer @@ -49,25 +50,25 @@ export const Map: React.FC<Props> = ({ hideAllPois = false }) => { /> <MapViewController center={selectedLatlng ?? DEFAULT_CENTER} zoom={13} /> {/* Single marker when POI is selected */} - {!!(selectedPoi && selectedLatlng && !hideAllPois) && <Marker icon={largeIcon} position={selectedLatlng} />} + {!!(props.selectedEntry && selectedLatlng) && <Marker icon={largeIcon} position={selectedLatlng} />} {/* Multiple markers, when no POI is selected */} - {!selectedPoi && - !hideAllPois && - data?.map((poi) => { + {!props.selectedEntry && + props.values && + props.values.map((poi) => { const poiLatLng: LatLngExpression = [poi.lat, poi.lng]; return ( <Marker - icon={hoveredPoi?.id === poi.id ? largeIcon : icon} - opacity={hoveredPoi?.id === poi.id ? 1 : 0.7} + icon={props.hoveredPoiId === poi.id ? largeIcon : icon} + opacity={props.hoveredPoiId === poi.id ? 1 : 0.7} key={poi.id} position={poiLatLng} eventHandlers={{ - click: () => setSelectedPoi(poi), + click: () => props.onSelect(poi.id), mouseover: () => { - setHoveredPoi(poi); + props.onMouseEnter && props.onMouseEnter(poi.id); }, mouseout: () => { - setHoveredPoi(null); + props.onMouseLeave && props.onMouseLeave(); }, }} /> diff --git a/src/components/Map/MapViewController.tsx b/src/Map/MapViewController.tsx similarity index 100% rename from src/components/Map/MapViewController.tsx rename to src/Map/MapViewController.tsx diff --git a/src/components/Modal.tsx b/src/Modal.tsx similarity index 100% rename from src/components/Modal.tsx rename to src/Modal.tsx diff --git a/src/Sidebar/SidebarContainer.tsx b/src/Sidebar/SidebarContainer.tsx new file mode 100644 index 0000000..de02c07 --- /dev/null +++ b/src/Sidebar/SidebarContainer.tsx @@ -0,0 +1,21 @@ +import React, { CSSProperties } from 'react'; + +interface Props { + style?: CSSProperties; + className?: string; +} + +const SidebarContainer: React.FC<Props> = ({ style, className, children }) => { + return ( + <div + style={style} + className={`flex flex-col shadow-2xl border-t-2 md:border-r-2 md:border-t-0 border-black border-opacity-20 ${ + className ?? '' + }`} + > + {children} + </div> + ); +}; + +export default SidebarContainer; diff --git a/src/components/Sidebar/ListElement.tsx b/src/Sidebar/SidebarListElement.tsx similarity index 70% rename from src/components/Sidebar/ListElement.tsx rename to src/Sidebar/SidebarListElement.tsx index a088ece..ac5e6bd 100644 --- a/src/components/Sidebar/ListElement.tsx +++ b/src/Sidebar/SidebarListElement.tsx @@ -1,15 +1,12 @@ -import React, { SyntheticEvent } from 'react'; +import React from 'react'; import type { PointOfInterest } from 'src/types/PointOfInterest'; interface Props { value: PointOfInterest; hovered?: boolean; - onMouseEnter: (event: SyntheticEvent) => void; - onMouseLeave: (event: SyntheticEvent) => void; - onClick: (event: SyntheticEvent) => void; } -const ListElement: React.FC<Props> = ({ value, hovered, ...restProps }) => { +const SidebarListElement: React.FC<Props> = ({ value, hovered, ...restProps }) => { return ( value && ( <div @@ -29,4 +26,4 @@ const ListElement: React.FC<Props> = ({ value, hovered, ...restProps }) => { ); }; -export default ListElement; +export default SidebarListElement; diff --git a/src/Sidebar/SidebarListView.tsx b/src/Sidebar/SidebarListView.tsx new file mode 100644 index 0000000..2503578 --- /dev/null +++ b/src/Sidebar/SidebarListView.tsx @@ -0,0 +1,44 @@ +import React, { CSSProperties } from 'react'; +import SidebarContainer from './SidebarContainer'; +import SidebarListElement from './SidebarListElement'; +import type { PointOfInterest } from '../types/PointOfInterest'; + +interface Props { + style?: CSSProperties; + values: PointOfInterest[]; + onClick?: (id: number) => void; + onMouseEnter?: (id: number) => void; + onMouseLeave?: () => void; + className?: string; + hoveredPoiId?: number | null; +} + +const SidebarListView: React.FC<Props> = ({ + values, + onMouseEnter, + onMouseLeave, + onClick, + hoveredPoiId, + ...restProps +}) => { + return ( + values && ( + <SidebarContainer {...restProps}> + <h1 className="text-xl font-medium title-font m-4 text-gray-900 mb-2">{values.length} Orte:</h1> + {values && + values.map((poi) => ( + <SidebarListElement + key={poi.id} + {...(onMouseLeave ? { onMouseLeave: () => onMouseLeave() } : {})} + {...(onMouseEnter ? { onMouseEnter: () => onMouseEnter(poi.id) } : {})} + {...(onClick ? { onClick: () => onClick(poi.id) } : {})} + value={poi} + hovered={hoveredPoiId === poi.id} + /> + ))} + </SidebarContainer> + ) + ); +}; + +export default SidebarListView; diff --git a/src/Sidebar/SidebarSingleView.tsx b/src/Sidebar/SidebarSingleView.tsx new file mode 100644 index 0000000..b5db3fe --- /dev/null +++ b/src/Sidebar/SidebarSingleView.tsx @@ -0,0 +1,54 @@ +import React, { CSSProperties } from 'react'; +import SidebarContainer from './SidebarContainer'; +import type { PointOfInterest } from '../types/PointOfInterest'; +import { X as CloseIcon, HomeOutline as HomeIcon, LocationMarkerOutline as AddressIcon } from 'heroicons-react'; + +interface Props { + style?: CSSProperties; + value: PointOfInterest; + onClose?: () => void; + className?: string; +} + +const SidebarSingleView: React.FC<Props> = ({ value, onClose, className, ...restProps }) => { + const strippedUrl = value?.website?.replace(/(^\w+:|^)\/\//, ''); + return ( + <SidebarContainer className={`relative p-0 ${className || ''}`} {...restProps}> + <div className={`${value.image ? '' : 'pl-5 pt-5'}`}> + <CloseIcon + size={32} + className={`${ + value.image ? 'absolute left-5 top-5 ' : '' + }p-1 text-gray-500 inline-block cursor-pointer hover:bg-gray-300 hover:bg-opacity-50 rounded-full`} + onClick={onClose} + /> + </div> + {value.image && ( + <img className="lg:h-48 md:h-36 w-full object-cover object-center" src={value.image} alt="blog" /> + )} + <div className="p-6"> + <h2 className="tracking-widest uppercase text-xs title-font font-medium text-gray-400 mb-1"> + {value.category} + </h2> + <h1 className="title-font text-lg font-medium text-gray-900 mb-3">{value.name}</h1> + <p className="leading-relaxed mb-6">{value.description}</p> + {value.website && ( + <div className={'flex items-center'}> + <HomeIcon size={18} className={'text-gray-500 mr-2'} /> + <a className={'text-sm text-gray-500 hover:underline'} href={value.website}> + {strippedUrl} + </a> + </div> + )} + {value.address && ( + <div className={'flex items-center mt-3'}> + <AddressIcon size={18} className={'text-gray-500 mr-2'} /> + <div className="text-sm text-gray-500">{value.address}</div> + </div> + )} + </div> + </SidebarContainer> + ); +}; + +export default SidebarSingleView; diff --git a/src/components/App.tsx b/src/components/App.tsx deleted file mode 100644 index f5aba53..0000000 --- a/src/components/App.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import React from 'react'; -import { Route, Switch } from 'react-router-dom'; -import { useStore } from '../hooks'; -import ErrorModal from './ErrorModal'; -import Map from './Map/Map'; -import SidebarCreateView from './Sidebar/SidebarCreateView'; -import SidebarListView from './Sidebar/SidebarListView'; -import SidebarSingleView from './Sidebar/SidebarSingleView'; - -const App = () => { - const selectedPoi = useStore((state) => state.selectedPoi); - - return ( - <> - <ErrorModal /> - <div className={'flex md:flex-row-reverse flex-col h-full'}> - <Route path="/add" children={({ match }) => <Map hideAllPois={!!match} />} /> - <Switch> - <Route exact path="/add"> - <SidebarCreateView /> - </Route> - <Route>{selectedPoi ? <SidebarSingleView /> : <SidebarListView />}</Route> - </Switch> - </div> - </> - ); -}; - -export default App; diff --git a/src/components/ErrorModal.tsx b/src/components/ErrorModal.tsx deleted file mode 100644 index 7386e08..0000000 --- a/src/components/ErrorModal.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { ExclamationOutline as AlertIcon } from 'heroicons-react'; -import React from 'react'; -import { useStore } from '../hooks'; -import Modal from './Modal'; - -interface Props {} - -const ErrorModal: React.FC<Props> = () => { - const error = useStore((state) => state.error); - const icons: { [index: string]: JSX.Element } = { - alert: <AlertIcon className="h-6 w-6 text-red-600" />, - }; - return error && <Modal title={error.title} text={error.message} icon={icons[error.icon]} />; -}; - -export default ErrorModal; diff --git a/src/components/Sidebar/AddPoiForm.tsx b/src/components/Sidebar/AddPoiForm.tsx deleted file mode 100644 index a91d286..0000000 --- a/src/components/Sidebar/AddPoiForm.tsx +++ /dev/null @@ -1,127 +0,0 @@ -import { GraphQLClient, request, gql } from 'graphql-request'; -import React, { useEffect, useState } from 'react'; - -interface Props {} - -const AddPoiForm: React.FC<Props> = () => { - const [formData, setFormData] = useState({ - lat: 123, - lng: 123, - name: '', - address: '', - description: '', - website: '', - category: '', - image: '', - tags: '', - }); - - useEffect(() => { - console.log('Form data', formData); - }, [formData]); - - const handleInputChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => { - setFormData({ ...formData, [e.target.name]: e.target.value }); - }; - - // const mutation = gql` - // mutation createPoiMutation( - // $name: String! - // $email: String! - // $lat: Float! - // $lng: Float! - // $website: String - // $description: String - // $address: String! - // $category: String! - // ) { - // createPoi( - // poi: { - // name: $name - // email: $email - // lat: $lat - // lng: $lng - // website: $website - // description: $description - // address: $address - // category: $category - // image: "ababababa" - // } - // ) - // } - // `; - - // const variables = { - // name: 'Inception', - // email: 2010, - // file: document.querySelector('input#avatar').files[0] - // }; - // const data = await request(import.meta.env.SNOWPACK_PUBLIC_API_URL, mutation, formData); - - return ( - <form className="flex flex-col"> - <p className="leading-relaxed mb-5 text-gray-600">Bitte auf der Karte einen Pin setzen.</p> - <label className="block mb-4"> - <span className="form-label">Name</span> - <input - type="text" - name="name" - value={formData.name} - className="form-input" - placeholder="Musterspace" - onChange={handleInputChange} - /> - </label> - <label className="block mb-4"> - <span className="form-label">Adresse</span> - <input - type="text" - name="address" - value={formData.address} - className="form-input" - placeholder="" - onChange={handleInputChange} - /> - </label> - <label className="block mb-4"> - <span className="form-label">Webseite</span> - <input - type="text" - name="website" - value={formData.website} - className="form-input" - placeholder="" - onChange={handleInputChange} - /> - </label> - <label className="block mb-4"> - <span className="form-label">Beschreibung</span> - <textarea - name="description" - value={formData.description} - className="form-input" - rows={3} - onChange={handleInputChange} - ></textarea> - </label> - <label className="block mb-6"> - <span className="form-label">Bild</span> - <input - className="block w-full focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50" - type="file" - id="avatar" - name="avatar" - accept="image/png, image/jpeg" - ></input> - </label> - <button - type="submit" - className="text-white bg-indigo-500 border-0 py-2 px-6 focus:outline-none hover:bg-indigo-600 rounded-lg text-lg" - > - Hinzufügen - </button> - </form> - ); -}; - -export default AddPoiForm; diff --git a/src/components/Sidebar/SidebarContainer.tsx b/src/components/Sidebar/SidebarContainer.tsx deleted file mode 100644 index f00e3b1..0000000 --- a/src/components/Sidebar/SidebarContainer.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react'; - -interface Props { - className?: string; -} - -const SidebarContainer: React.FC<Props> = ({ className, children }) => { - return ( - <aside - className={`sidebar box-border flex flex-col shadow-2xl border-t-2 md:border-r-2 md:border-t-0 border-black border-opacity-20 ${ - className ?? '' - }`} - > - {children} - </aside> - ); -}; - -export default SidebarContainer; diff --git a/src/components/Sidebar/SidebarCreateView.tsx b/src/components/Sidebar/SidebarCreateView.tsx deleted file mode 100644 index 85eeb5f..0000000 --- a/src/components/Sidebar/SidebarCreateView.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { X as CloseIcon } from 'heroicons-react'; -import React from 'react'; -import { useHistory } from 'react-router-dom'; -import AddPoiForm from './AddPoiForm'; -import SidebarContainer from './SidebarContainer'; - -interface Props {} - -const SidebarCreateView: React.FC<Props> = () => { - const history = useHistory(); - return ( - <SidebarContainer className="p-5"> - <CloseIcon - size={32} - className={`left-5 top-5 p-1 text-gray-500 inline-block cursor-pointer hover:bg-gray-300 hover:bg-opacity-50 rounded-full`} - onClick={() => history.push('/')} - /> - <h1 className="text-xl font-medium title-font text-gray-900 my-2">Ort anlegen:</h1> - <AddPoiForm /> - </SidebarContainer> - ); -}; - -export default SidebarCreateView; diff --git a/src/components/Sidebar/SidebarListView.tsx b/src/components/Sidebar/SidebarListView.tsx deleted file mode 100644 index 5d2460d..0000000 --- a/src/components/Sidebar/SidebarListView.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import React from 'react'; -import { usePoiData, useStore } from '../../hooks'; -import ListElement from './ListElement'; -import SidebarContainer from './SidebarContainer'; - -interface Props {} - -const SidebarListView: React.FC<Props> = () => { - const { data } = usePoiData(); - const hoveredPoi = useStore((state) => state.hoveredPoi); - const setHoveredPoi = useStore((state) => state.setHoveredPoi); - const setSelectedPoi = useStore((state) => state.setSelectedPoi); - - return ( - <SidebarContainer> - <h1 className="text-xl font-medium title-font m-4 text-gray-900 mb-2">{data?.length} Orte:</h1> - {data?.map((poi) => ( - <ListElement - key={poi.id} - onMouseEnter={() => setHoveredPoi(poi)} - onMouseLeave={() => setHoveredPoi(null)} - onClick={() => setSelectedPoi(poi)} - value={poi} - hovered={hoveredPoi?.id === poi.id} - /> - ))} - </SidebarContainer> - ); -}; - -export default SidebarListView; diff --git a/src/components/Sidebar/SidebarSingleView.tsx b/src/components/Sidebar/SidebarSingleView.tsx deleted file mode 100644 index 12c3070..0000000 --- a/src/components/Sidebar/SidebarSingleView.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import { HomeOutline as HomeIcon, LocationMarkerOutline as AddressIcon, X as CloseIcon } from 'heroicons-react'; -import React from 'react'; -import { useStore } from '../../hooks'; -import SidebarContainer from './SidebarContainer'; -import Tag from './Tag'; - -interface Props {} - -const SidebarSingleView: React.FC<Props> = () => { - const selectedPoi = useStore((state) => state.selectedPoi); - const setSelectedPoi = useStore((state) => state.setSelectedPoi); - const strippedUrl = selectedPoi?.website?.replace(/(^\w+:|^)\/\//, ''); - - return ( - <SidebarContainer className={`relative p-0`}> - <div className={`${selectedPoi?.image ? '' : 'pl-5 pt-5 '}`}> - <CloseIcon - size={32} - className={`${ - selectedPoi?.image ? 'absolute left-5 top-5 ' : '' - }p-1 text-gray-500 inline-block cursor-pointer hover:bg-gray-300 hover:bg-opacity-50 rounded-full`} - onClick={() => setSelectedPoi(null)} - /> - </div> - {selectedPoi?.image && ( - <img className="lg:h-48 md:h-36 w-full object-cover object-center" src={selectedPoi?.image} alt="blog" /> - )} - <div className="p-6"> - <h2 className="tracking-widest uppercase text-xs title-font font-medium text-gray-400 mb-1"> - {selectedPoi?.category} - </h2> - <h1 className="title-font text-lg font-medium text-gray-900 mb-3">{selectedPoi?.name}</h1> - <p className="leading-relaxed mb-6">{selectedPoi?.description}</p> - {selectedPoi?.website && ( - <div className={'flex items-center'}> - <HomeIcon size={18} className={'text-gray-500 mr-2'} /> - <a className={'text-sm text-gray-500 hover:underline'} href={selectedPoi?.website}> - {strippedUrl} - </a> - </div> - )} - {selectedPoi?.address && ( - <div className={'flex items-center mt-3'}> - <AddressIcon size={18} className={'text-gray-500 mr-2'} /> - <div className="text-sm text-gray-500">{selectedPoi?.address}</div> - </div> - )} - {!!selectedPoi?.tags?.length && ( - <div className={'flex items-center mt-3'}> - {selectedPoi?.tags.map((tag) => ( - <Tag key={tag.id} color={tag.color}> - {tag.displayName} - </Tag> - ))} - </div> - )} - </div> - </SidebarContainer> - ); -}; - -export default SidebarSingleView; diff --git a/src/components/Sidebar/Tag.tsx b/src/components/Sidebar/Tag.tsx deleted file mode 100644 index 7b730b4..0000000 --- a/src/components/Sidebar/Tag.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react'; - -interface Props { - children: string | JSX.Element; - color?: string; -} - -const Tag: React.FC<Props> = ({ children, color }) => { - return ( - <span - className="inline-flex items-center px-3 py-0.5 rounded-full text-sm font-medium bg-indigo-100 text-indigo-800 mr-2" - style={color ? { backgroundColor: color } : {}} - > - {children} - </span> - ); -}; - -export default Tag; diff --git a/src/components/SwrWrapper.tsx b/src/components/SwrWrapper.tsx deleted file mode 100644 index 96b19de..0000000 --- a/src/components/SwrWrapper.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { request } from 'graphql-request'; -import React from 'react'; -import { SWRConfig } from 'swr'; -import { useStore } from '../hooks'; - -interface Props {} - -const SwrWrapper: React.FC<Props> = ({ children }) => { - const setError = useStore((state) => state.setError); - return ( - <SWRConfig - value={{ - fetcher: (query: string) => request(import.meta.env.SNOWPACK_PUBLIC_API_URL, query), - onError: (error) => { - setError({ - title: 'API nicht erreichbar', - message: 'Kann die API nicht erreichen. Bitte später erneut probieren.', - icon: 'alert', - }); - console.error('Error while fetching', error); - }, - }} - > - {children} - </SWRConfig> - ); -}; - -export default SwrWrapper; diff --git a/src/hooks/index.ts b/src/hooks/index.ts deleted file mode 100644 index df87068..0000000 --- a/src/hooks/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './usePoiData'; -export * from './useStore'; diff --git a/src/hooks/usePoiData.ts b/src/hooks/usePoiData.ts deleted file mode 100644 index d23d3c7..0000000 --- a/src/hooks/usePoiData.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { useEffect } from 'react'; -import type { PointsOfInterestDTO } from 'src/types/PointOfInterest'; -import useSWR from 'swr'; - -export const usePoiData = () => { - const { data } = useSWR<PointsOfInterestDTO>( - `{ - pois { - id - name - description - website - address - lat - lng - image - category - tags { - id - displayName - displayName - color - } - } - } - `, - ); - - useEffect(() => { - console.log('Got data', data); - }, [data]); - - return { data: data?.pois }; -}; diff --git a/src/hooks/useStore.ts b/src/hooks/useStore.ts deleted file mode 100644 index 4c01525..0000000 --- a/src/hooks/useStore.ts +++ /dev/null @@ -1,46 +0,0 @@ -import type { Error } from 'src/types/Error'; -import type { PointOfInterest } from 'src/types/PointOfInterest'; -import create, { GetState, SetState, State, StateCreator, StoreApi } from 'zustand'; - -interface Store extends State { - selectedPoi: PointOfInterest | null; - setSelectedPoi: (poi: PointOfInterest | null) => void; - hoveredPoi: PointOfInterest | null; - setHoveredPoi: (poi: PointOfInterest | null) => void; - error: Error | null; - setError: (error: Error | null) => void; -} - -const log = (config: StateCreator<Store>) => (set: SetState<Store>, get: GetState<Store>, api: StoreApi<Store>) => - config( - (args) => { - console.group('Global state changed'); - console.log('%cAction:', 'color: #00A7F7; font-weight: 700;', args); - set(args); - console.log('%cNext State:', 'color: #47B04B; font-weight: 700;', get()); - console.groupEnd(); - }, - get, - api, - ); - -export const useStore = create<Store>( - log((set) => ({ - selectedPoi: null, - setSelectedPoi: (poi) => { - set({ - selectedPoi: poi, - }); - }, - hoveredPoi: null, - setHoveredPoi: (poi) => { - set({ - hoveredPoi: poi, - }); - }, - error: null, - setError: (error) => { - set({ error }); - }, - })), -); diff --git a/src/index.css b/src/index.css index 18a8368..e8d6792 100644 --- a/src/index.css +++ b/src/index.css @@ -45,11 +45,3 @@ code { display: initial; } } - -.form-input { - @apply mt-1 block w-full rounded-lg border-2 border-black border-opacity-20 hover:border-opacity-40 focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50; -} - -.form-label { - @apply leading-7 text-sm text-gray-600; -} diff --git a/src/index.tsx b/src/index.tsx index 96a7b15..85d91b1 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,17 +1,15 @@ import React from 'react'; import ReactDOM from 'react-dom'; -import { BrowserRouter as Router } from 'react-router-dom'; -import App from './components/App'; -import SwrWrapper from './components/SwrWrapper'; +import App from './App'; +import { SWRConfig } from 'swr'; +import { request } from 'graphql-request'; import './index.css'; ReactDOM.render( <React.StrictMode> - <SwrWrapper> - <Router> - <App /> - </Router> - </SwrWrapper> + <SWRConfig value={{ fetcher: (query: string) => request(import.meta.env.SNOWPACK_PUBLIC_API_URL, query) }}> + <App /> + </SWRConfig> </React.StrictMode>, document.getElementById('root'), ); diff --git a/src/testData.json b/src/testData.json new file mode 100644 index 0000000..d93ab54 --- /dev/null +++ b/src/testData.json @@ -0,0 +1,55 @@ +[ + { + "id": 1, + "lat": 53.550359, + "lng": 9.986701, + "name": "Welcome Werkstatt e. V.", + "description": "Eine offene Stadtteilwerkstatt in Barmbek-Süd. Hier kann mit Holz, Metall und Elektronik gearbeitet werden.", + "address": "Bachstr. 98, 22083 Hamburg", + "category": "OFFENE WERKSTATT", + "website": "https://www.welcome-werkstatt.de/", + "image": "https://picsum.photos/720/400?random=1" + }, + { + "id": 2, + "lat": 53.560359, + "lng": 9.976701, + "name": "Fabulous St. Pauli", + "description": "Photo booth fam kinfolk cold-pressed sriracha leggings jianbing microdosing tousled waistcoat.", + "address": "Mozartstr. 8, 22081 Hamburg", + "category": "OFFENE WERKSTATT", + "website": "http://www.fablab-hamburg.org/", + "image": "https://picsum.photos/720/400?random=2" + }, + { + "id": 3, + "lat": 53.540359, + "lng": 9.996701, + "name": "HoFaLab Wilhelmsburg", + "description": "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text.", + "address": "Langer-Straßen-Name. 128, 22089 Hamburg", + "category": "OFFENE WERKSTATT", + "website": "https://hofalab.de/de/home-de/", + "image": "https://picsum.photos/720/400?random=3" + }, + { + "id": 4, + "lat": 53.570359, + "lng": 9.986701, + "name": "Fab City Haus", + "description": "Eine offene Stadtteilwerkstatt in Barmbek-Süd. Hier kann mit Holz, Metall und Elektronik gearbeitet werden.", + "address": "Jungfernstieg 1, 22083 Hamburg", + "category": "OFFENE WERKSTATT", + "image": "https://picsum.photos/720/400?random=4" + }, + { + "id": 5, + "lat": 53.565359, + "lng": 9.966701, + "name": "Haus Drei e. V.", + "description": "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text.", + "address": "Hein-Hoyer-Allee 36, 22083 Hamburg", + "category": "OFFENE WERKSTATT", + "image": "https://picsum.photos/720/400?random=5" + } +] diff --git a/src/types/Error.ts b/src/types/Error.ts deleted file mode 100644 index 0979889..0000000 --- a/src/types/Error.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface Error { - title: string; - message: string; - icon: string; -} diff --git a/src/types/PointOfInterest.ts b/src/types/PointOfInterest.ts index c612f81..81cd084 100644 --- a/src/types/PointOfInterest.ts +++ b/src/types/PointOfInterest.ts @@ -1,3 +1,5 @@ +import type { LatLngExpression } from 'leaflet'; + export interface PointOfInterest { id: number; lat: number; @@ -8,15 +10,4 @@ export interface PointOfInterest { website: string; category?: string; image?: string; - tags: Tag[]; -} - -export interface Tag { - id: string; - displayName: string; - color: string; -} - -export interface PointsOfInterestDTO { - pois: PointOfInterest[]; } diff --git a/tailwind.config.js b/tailwind.config.js index d6669e9..e6c84f1 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -8,5 +8,5 @@ module.exports = { variants: { extend: {}, }, - plugins: [require('@tailwindcss/forms')], + plugins: [], }; -- GitLab