diff --git a/package-lock.json b/package-lock.json index 15586c0..76d4040 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,16 +11,24 @@ "@emotion/react": "^11.11.3", "@emotion/styled": "^11.11.0", "@reduxjs/toolkit": "^2.0.1", + "@tanstack/react-query": "^5.17.9", "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", + "axios": "^1.6.5", + "global": "^4.4.0", + "query-string": "^8.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-query": "^3.39.3", "react-redux": "^9.0.4", "react-router": "^6.21.1", "react-router-dom": "^6.21.1", "react-scripts": "5.0.1", "web-vitals": "^2.1.4" + }, + "devDependencies": { + "@tanstack/react-query-devtools": "^5.17.9" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -3874,6 +3882,57 @@ "url": "https://github.com/sponsors/gregberge" } }, + "node_modules/@tanstack/query-core": { + "version": "5.17.9", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.17.9.tgz", + "integrity": "sha512-8xcvpWIPaRMDNLMvG9ugcUJMgFK316ZsqkPPbsI+TMZsb10N9jk0B6XgPk4/kgWC2ziHyWR7n7wUhxmD0pChQw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/query-devtools": { + "version": "5.17.7", + "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.17.7.tgz", + "integrity": "sha512-TfgvOqza5K7Sk6slxqkRIvXlEJoUoPSsGGwpuYSrpqgSwLSSvPPpZhq7hv7hcY5IvRoTNGoq6+MT01C/jILqoQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.17.9", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.17.9.tgz", + "integrity": "sha512-M5E9gwUq1Stby/pdlYjBlL24euIVuGbWKIFCbtnQxSdXI4PgzjTSdXdV3QE6fc+itF+TUvX/JPTKIwq8yuBXcg==", + "dependencies": { + "@tanstack/query-core": "5.17.9" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/@tanstack/react-query-devtools": { + "version": "5.17.9", + "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.17.9.tgz", + "integrity": "sha512-1viWP/jlO0LaeCdtTFqtF1k2RfM3KVpvwVffWv+PMNkS2u4s8YGUM17r3p82udbF9BY1mE7aHqQ3MM1errF5lQ==", + "dev": true, + "dependencies": { + "@tanstack/query-devtools": "5.17.7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "@tanstack/react-query": "^5.17.9", + "react": "^18.0.0" + } + }, "node_modules/@testing-library/dom": { "version": "9.3.3", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.3.tgz", @@ -5622,6 +5681,29 @@ "node": ">=4" } }, + "node_modules/axios": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", + "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", + "dependencies": { + "follow-redirects": "^1.15.4", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/axobject-query": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", @@ -5935,6 +6017,14 @@ "node": ">= 8.0.0" } }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "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", @@ -6045,6 +6135,21 @@ "node": ">=8" } }, + "node_modules/broadcast-channel": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz", + "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "detect-node": "^2.1.0", + "js-sha3": "0.8.0", + "microseconds": "0.2.0", + "nano-time": "1.0.0", + "oblivious-set": "1.0.0", + "rimraf": "3.0.2", + "unload": "2.2.0" + } + }, "node_modules/browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", @@ -7014,6 +7119,14 @@ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" }, + "node_modules/decode-uri-component": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.4.1.tgz", + "integrity": "sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==", + "engines": { + "node": ">=14.16" + } + }, "node_modules/dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", @@ -7263,6 +7376,11 @@ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, "node_modules/domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", @@ -8556,6 +8674,17 @@ "node": ">=8" } }, + "node_modules/filter-obj": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-5.1.0.tgz", + "integrity": "sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/finalhandler": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", @@ -9063,6 +9192,15 @@ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, "node_modules/global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", @@ -12213,6 +12351,11 @@ "jiti": "bin/jiti.js" } }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -12605,6 +12748,15 @@ "tmpl": "1.0.5" } }, + "node_modules/match-sorter": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.1.tgz", + "integrity": "sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "remove-accents": "0.4.2" + } + }, "node_modules/mdn-data": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", @@ -12667,6 +12819,11 @@ "node": ">=8.6" } }, + "node_modules/microseconds": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", + "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==" + }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -12705,6 +12862,14 @@ "node": ">=6" } }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -12850,6 +13015,14 @@ "thenify-all": "^1.0.0" } }, + "node_modules/nano-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", + "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==", + "dependencies": { + "big-integer": "^1.6.16" + } + }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -13121,6 +13294,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/oblivious-set": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz", + "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==" + }, "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -14779,6 +14957,14 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "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", @@ -14839,6 +15025,11 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -14875,6 +15066,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/query-string": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-8.1.0.tgz", + "integrity": "sha512-BFQeWxJOZxZGix7y+SByG3F36dA0AbTy9o6pSmKFcFz7DAj0re9Frkty3saBn3nHo3D0oZJ/+rx3r8H8r8Jbpw==", + "dependencies": { + "decode-uri-component": "^0.4.1", + "filter-obj": "^5.1.0", + "split-on-first": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -15127,6 +15334,31 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, + "node_modules/react-query": { + "version": "3.39.3", + "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz", + "integrity": "sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "broadcast-channel": "^3.4.1", + "match-sorter": "^6.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/react-redux": { "version": "9.0.4", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.0.4.tgz", @@ -15443,6 +15675,11 @@ "node": ">= 0.10" } }, + "node_modules/remove-accents": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz", + "integrity": "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==" + }, "node_modules/renderkid": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", @@ -16216,6 +16453,17 @@ "wbuf": "^1.7.3" } }, + "node_modules/split-on-first": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-3.0.0.tgz", + "integrity": "sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -17347,6 +17595,15 @@ "node": ">= 10.0.0" } }, + "node_modules/unload": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz", + "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==", + "dependencies": { + "@babel/runtime": "^7.6.2", + "detect-node": "^2.0.4" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", diff --git a/package.json b/package.json index b9f6017..62b9758 100644 --- a/package.json +++ b/package.json @@ -6,11 +6,16 @@ "@emotion/react": "^11.11.3", "@emotion/styled": "^11.11.0", "@reduxjs/toolkit": "^2.0.1", + "@tanstack/react-query": "^5.17.9", "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", + "axios": "^1.6.5", + "global": "^4.4.0", + "query-string": "^8.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-query": "^3.39.3", "react-redux": "^9.0.4", "react-router": "^6.21.1", "react-router-dom": "^6.21.1", @@ -40,5 +45,8 @@ "last 1 firefox version", "last 1 safari version" ] + }, + "devDependencies": { + "@tanstack/react-query-devtools": "^5.17.9" } } diff --git a/public/example1.png b/public/example1.png new file mode 100644 index 0000000..9f60007 Binary files /dev/null and b/public/example1.png differ diff --git a/public/example2.jpg b/public/example2.jpg new file mode 100644 index 0000000..f359b62 Binary files /dev/null and b/public/example2.jpg differ diff --git a/public/example3.jpg b/public/example3.jpg new file mode 100644 index 0000000..c2b969f Binary files /dev/null and b/public/example3.jpg differ diff --git a/public/example4.jpg b/public/example4.jpg new file mode 100644 index 0000000..3bcd914 Binary files /dev/null and b/public/example4.jpg differ diff --git a/public/example5.jpg b/public/example5.jpg new file mode 100644 index 0000000..d2cd5f6 Binary files /dev/null and b/public/example5.jpg differ diff --git a/src/App.js b/src/App.js index 0ccd338..ecf4910 100644 --- a/src/App.js +++ b/src/App.js @@ -1,15 +1,15 @@ -import React from 'react' -import { Global } from '@emotion/react' -import { BrowserRouter } from 'react-router-dom' -import PageRoute from './PageRoute' - -const App = () =>{ +import PageRoute from "./PageRoute"; +import { BrowserRouter as Router } from "react-router-dom"; +import React from "react"; +import { Global } from "@emotion/react"; +import { BrowserRouter } from "react-router-dom"; +const App = () => { return ( - + ); }; -export default App; \ No newline at end of file +export default App; diff --git a/src/PageRoute.js b/src/PageRoute.js index ad6ba6a..7452614 100644 --- a/src/PageRoute.js +++ b/src/PageRoute.js @@ -1,48 +1,60 @@ -import React from 'react' -import { Routes, Route, useParams} from 'react-router-dom' -import Dongui from './pages/donate/donategui.js' -import Mydonation from './pages/donate/mydonation.js' -import Mypage from './pages/donate/mypage.js' -import Nickname from './pages/donate/nickname.js' -import Userlogin from './pages/donate/userlogin.js' -import Process1 from './pages/donate/process1.js' -import Process2 from './pages/donate/process2.js' -import Process3 from './pages/donate/process3.js' -import Process4 from './pages/donate/process4.js' -import Process5 from './pages/donate/process5.js' -import Process6 from './pages/donate/process6.js' -import Done from './pages/donate/done.js' +import React from "react"; +import { Routes, Route, useParams } from "react-router-dom"; +import Dongui from "./pages/donate/donategui.js"; +import Mydonation from "./pages/donate/mydonation.js"; +import Mypage from "./pages/donate/mypage.js"; +// import Nickname from "./pages/donate/nickname.js"; +import Process1 from "./pages/donate/process1.js"; +import Process3 from "./pages/donate/process3.js"; +import Process4 from "./pages/donate/process4.js"; +import Process5 from "./pages/donate/process5.js"; +import Process6 from "./pages/donate/process6.js"; +import Done from "./pages/donate/done.js"; +import AgencyLogin from "./pages/reciever/agencylogin.js"; +import AgencySignUp from "./pages/reciever/agencysignup.js"; +import BookList from "./pages/reciever/booklist.js"; +import Finish from "./pages/reciever/finish.js"; +import SearchBooks from "./pages/reciever/searchbooks.js"; +import Choose from "./pages/main/choose.js"; +import Gui from "./pages/main/gui.js"; +import Check from "./pages/main/check.js"; +import Login from "./pages/main/userlogin.js"; +import Usersingup from "./pages/main/usersignup.js"; +import SearchBookList from "./pages/reciever/searchbooklist.js"; +import BookInfo from "./pages/reciever/bookinfo.js"; +import Process2 from "./pages/donate/process2.js"; -import Choose from './pages/main/choose.js' -import Gui from './pages/main/gui.js' -import Check from './pages/main/check.js' -import Login from './pages/main/login.js' - - - -const PageRoute = () =>{ -const { id } = useParams(); -return ( +const PageRoute = () => { + return ( - }> - }> - }> - }> - }> - }> - }> - }> - }> - }> - }> - }> - }> - }> - }> - }> + }> + }> + }> + }> + }> + }> + {/* }> */} + }> + }> + }> + }> + }> + }> + }> + }> + }> + }> + }> + }> + }> + }> + }> + } + > -) -} - + ); +}; -export default PageRoute; \ No newline at end of file +export default PageRoute; diff --git a/src/assets/background.png b/src/assets/background.png new file mode 100644 index 0000000..95439b8 Binary files /dev/null and b/src/assets/background.png differ diff --git a/src/assets/giftbox_blue.png b/src/assets/giftbox_blue.png new file mode 100644 index 0000000..548ac85 Binary files /dev/null and b/src/assets/giftbox_blue.png differ diff --git a/src/components/BookStatus.jsx b/src/components/BookStatus.jsx new file mode 100644 index 0000000..18b4e26 --- /dev/null +++ b/src/components/BookStatus.jsx @@ -0,0 +1,74 @@ +import { Link, useNavigate } from "react-router-dom"; +import { Navigate } from "react-router-dom"; +const BookStatus = ({ + id, + title, + curriculum, + subject, + publisher, + outsideImageUrl, +}) => { + const handleClick = () => { + navigate("/reciever/bookinfo", { + state: { + title: title, + curriculum: curriculum, + subject: subject, + publisher: publisher, + outsideImageUrl: outsideImageUrl, + }, + }); + }; + const navigate = useNavigate(); + return ( +
+
+
+ Book +
+ + {/* Text container */} +
+
+ 책 제목 : {title} +
+
+ 학년 : {curriculum} +
+
+ 과목 : {subject} +
+
출판사 : {publisher}
+
+
+
+ ); +}; + +export default BookStatus; diff --git a/src/components/Form1.js b/src/components/Form1.js new file mode 100644 index 0000000..e69de29 diff --git a/src/components/InputField.jsx b/src/components/InputField.jsx new file mode 100644 index 0000000..006f85c --- /dev/null +++ b/src/components/InputField.jsx @@ -0,0 +1,16 @@ +import "../styles/inputfield.css"; + +const InputField = ({ label, type, placeholder, value, onChange }) => ( +
+
{label}
+ +
+); + +export default InputField; diff --git a/src/components/InputField2.jsx b/src/components/InputField2.jsx new file mode 100644 index 0000000..8bacd3f --- /dev/null +++ b/src/components/InputField2.jsx @@ -0,0 +1,15 @@ +import "../styles/inputfield.css"; + +const InputField2 = ({ type, placeholder, value, onChange }) => ( +
+ +
+); + +export default InputField2; diff --git a/src/components/Layout/Header.js b/src/components/Layout/Header.js index 54fee7f..721ad65 100644 --- a/src/components/Layout/Header.js +++ b/src/components/Layout/Header.js @@ -1,115 +1,113 @@ -import styled from '@emotion/styled' -import { useLocation, useNavigate } from 'react-router-dom' -import { common } from '../../styles/common' -import Preview from '../../assets/icon/Preview.png' -import bar0 from '../../assets/icon/bar0.png' -import bar20 from '../../assets/icon/bar20.png' -import bar40 from '../../assets/icon/bar40.png' -import bar60 from '../../assets/icon/bar60.png' -import bar80 from '../../assets/icon/bar80.png' -import bar99 from '../../assets/icon/bar99.png' - -const Header = () =>{ -const location = useLocation() -const navigate = useNavigate() -const currentPath = location.pathname -let headerContents = ''; -let cloudSrc = ''; // Default cloud image - -switch (currentPath) { - - case '/choose': - headerContents = '나의 끝이, 누군가의 시작이 되길'; - break; - - case '/check': - headerContents = '나의 끝이, 누군가의 시작이 되길'; - break; - - case '/donate/gui': - headerContents = '나의 끝이, 누군가의 시작이 되길'; - break; - - case '/donate/process1': - headerContents = '나의 끝이, 누군가의 시작이 되길'; - cloudSrc =bar0 - break; - - case '/donate/process2': - headerContents = '나의 끝이, 누군가의 시작이 되길'; - cloudSrc =bar20 - break; - - case '/donate/process3': - headerContents = '나의 끝이, 누군가의 시작이 되길'; - cloudSrc =bar40 - break; - - case '/donate/process4': - headerContents = '나의 끝이, 누군가의 시작이 되길'; - cloudSrc =bar60 - break; - - case '/donate/process5': - headerContents = '나의 끝이, 누군가의 시작이 되길'; - cloudSrc =bar80 - break; - - case '/donate/process6': - headerContents = '나의 끝이, 누군가의 시작이 되길'; - cloudSrc =bar99 - break; - +import styled from "@emotion/styled"; +import { useLocation, useNavigate } from "react-router-dom"; +import { common } from "../../styles/common"; +import Preview from "../../assets/icon/Preview.png"; +import bar0 from "../../assets/icon/bar0.png"; +import bar20 from "../../assets/icon/bar20.png"; +import bar40 from "../../assets/icon/bar40.png"; +import bar60 from "../../assets/icon/bar60.png"; +import bar80 from "../../assets/icon/bar80.png"; +import bar99 from "../../assets/icon/bar99.png"; + +const Header = () => { + const location = useLocation(); + const navigate = useNavigate(); + const currentPath = location.pathname; + let headerContents = ""; + let cloudSrc = ""; // Default cloud image + + switch (currentPath) { + case "/choose": + headerContents = "나의 끝이, 누군가의 시작이 되길"; + break; + + case "/check": + headerContents = "나의 끝이, 누군가의 시작이 되길"; + break; + + case "/donate/gui": + headerContents = "나의 끝이, 누군가의 시작이 되길"; + break; + + case "/donate/process1": + headerContents = "나의 끝이, 누군가의 시작이 되길"; + cloudSrc = bar0; + break; + + case "/donate/process2": + headerContents = "나의 끝이, 누군가의 시작이 되길"; + cloudSrc = bar20; + break; + + case "/donate/process3": + headerContents = "나의 끝이, 누군가의 시작이 되길"; + cloudSrc = bar40; + break; + + case "/donate/process4": + headerContents = "나의 끝이, 누군가의 시작이 되길"; + cloudSrc = bar60; + break; + + case "/donate/process5": + headerContents = "나의 끝이, 누군가의 시작이 되길"; + cloudSrc = bar80; + break; + + case "/donate/process6": + headerContents = "나의 끝이, 누군가의 시작이 되길"; + cloudSrc = bar99; + break; default: - headerContents = '나의 끝이, 누군가의 시작이 되길'; -} + headerContents = "나의 끝이, 누군가의 시작이 되길"; + } -const BackLocation = () => { - navigate(-1) -} + const BackLocation = () => { + navigate(-1); + }; -return ( + return ( - - - - {headerContents} - {cloudSrc && } + + + + {headerContents} + {cloudSrc && } -) -} + ); +}; const HeaderWarp = styled.header` -z-index:1; -height: 30px; -font-weight: 700; -line-height: 50px; -background:; -text-align:center; -position:sticky; -top:0; -width:100%; -background:${common.colors.white}; -display:flex; -align-items:center; -justify-content:center; -font-size:${common.fontSize.fz16}; -` + z-index: 1; + height: 30px; + font-weight: 700; + line-height: 50px; + background: ; + text-align: center; + position: sticky; + top: 0; + width: 100%; + background: ${common.colors.white}; + display: flex; + align-items: center; + justify-content: center; + font-size: ${common.fontSize.fz16}; +`; const BackButton = styled.button` -position: absolute; -top: 50%; -left: 24px; -transform: translateY(-50%); -border: none; -background : none; -` + position: absolute; + top: 50%; + left: 24px; + transform: translateY(-50%); + border: none; + background: none; +`; const Cloud = styled.img` -position:absolute; -bottom:0; -bottom: -100%; -width: 100%; -z-index:-1; -` - -export default Header \ No newline at end of file + position: absolute; + bottom: 0; + bottom: -100%; + width: 100%; + z-index: -1; +`; + +export default Header; diff --git a/src/components/postbtngo.js b/src/components/postbtngo.js index 667560b..95d271d 100644 --- a/src/components/postbtngo.js +++ b/src/components/postbtngo.js @@ -19,7 +19,7 @@ const StyledLink = styled(Link)` width: 90%; right: 0; padding: 0 ${common.padding}; - bottom: 15%; + bottom: 5%; text-decoration: none; /* 텍스트에 밑줄 제거 */ z-index:2; `; diff --git a/src/index.js b/src/index.js index 6e18f1d..cada659 100644 --- a/src/index.js +++ b/src/index.js @@ -1,9 +1,9 @@ -import React from 'react'; -import ReactDOM from 'react-dom/client'; -import App from './App'; -import reportWebVitals from './reportWebVitals'; +import React from "react"; +import ReactDOM from "react-dom/client"; +import App from "./App"; +import reportWebVitals from "./reportWebVitals"; -const root = ReactDOM.createRoot(document.getElementById('root')); +const root = ReactDOM.createRoot(document.getElementById("root")); root.render( @@ -14,5 +14,3 @@ root.render( // to log results (for example: reportWebVitals(console.log)) // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals reportWebVitals(); - - diff --git a/src/pages/donate/done.js b/src/pages/donate/done.js index 475c4f4..a7d7f0c 100644 --- a/src/pages/donate/done.js +++ b/src/pages/donate/done.js @@ -1,45 +1,42 @@ -import React from 'react' -import styled from '@emotion/styled' -import { common } from '../../styles/common' -import backgroundImage from '../../assets/background/background.png' -import redbox from '../../assets/icon/redbox.png' -import { css } from '@emotion/react'; -import { Link } from 'react-router-dom' -import Header from '../../components/Layout/Header' -import PostBtnMydonate from '../../components/postbtnMydonate' -import PostBtnMypage from '../../components/postbtnMypage' - - +import React from "react"; +import styled from "@emotion/styled"; +import { common } from "../../styles/common"; +import backgroundImage from "../../assets/background/background.png"; +import redbox from "../../assets/icon/redbox.png"; +import { css } from "@emotion/react"; +import { Link } from "react-router-dom"; +import Header from "../../components/Layout/Header"; +import PostBtnMydonate from "../../components/postbtnMydonate"; +import PostBtnMypage from "../../components/postbtnMypage"; const randomRange = (min, max) => { -const rand = Math.random(); -return min + Math.floor(rand * (max - min + 1)); + const rand = Math.random(); + return min + Math.floor(rand * (max - min + 1)); }; const PostBg = styled.div` - background: url(${backgroundImage}) no-repeat center center fixed; - background-size: cover; /* 배경 이미지를 화면에 꽉 채우도록 설정 */ - height: 876px; /* 화면 높이를 860px로 설정 */ - width: 390px; - flex-direction: column; - justify-content: center; - align-items: center; - cursor: pointer; - position: relative; - z-index: 1; - + background: url(${backgroundImage}) no-repeat center center fixed; + background-size: cover; /* 배경 이미지를 화면에 꽉 채우도록 설정 */ + height: 876px; /* 화면 높이를 860px로 설정 */ + width: 390px; + flex-direction: column; + justify-content: center; + align-items: center; + cursor: pointer; + position: relative; + z-index: 1; `; const generateRandomStyles = () => { -const randomX = Math.random() * 100; -const randomOffset = randomRange(-100, 100); -const randomXEnd = randomX + randomOffset; -const randomXEndYoyo = randomX + randomOffset / 2; -const randomYoyoTime = randomRange(30000, 80000) / 100000; -const randomYoyoY = randomYoyoTime * 100; -const randomScale = Math.random(); -const fallDuration = randomRange(10, 30); -return { + const randomX = Math.random() * 100; + const randomOffset = randomRange(-100, 100); + const randomXEnd = randomX + randomOffset; + const randomXEndYoyo = randomX + randomOffset / 2; + const randomYoyoTime = randomRange(30000, 80000) / 100000; + const randomYoyoY = randomYoyoTime * 100; + const randomScale = Math.random(); + const fallDuration = randomRange(10, 30); + return { randomX, randomXEnd, randomXEndYoyo, @@ -47,200 +44,211 @@ return { randomYoyoY, randomScale, fallDuration, -}; + }; }; const StyledParagraph1 = styled.p` - font-weight: 900; - font-size: 48px; - position:fixed; - color: white; - z-index:1; - left:50%; - transform:translateX(-50%); - bottom:75%; - text-align: center; - + font-weight: 900; + font-size: 48px; + position: fixed; + color: white; + z-index: 1; + left: 50%; + transform: translateX(-50%); + bottom: 75%; + text-align: center; `; const StyledParagraph2 = styled.p` - white-space: nowrap; + white-space: nowrap; + font-weight: 700; + font-size: 16px; + position: fixed; + color: white; + bottom: ; + z-index: 1; + + @font-face { + font-family: "Noto Sans KR"; + font-style: normal; + font-weight: 100; + src: url(./font/NotoSansKR-Thin.woff) format("woff"), + url(./font/NotoSansKR-Thin.otf) format("opentype"); + } + @font-face { + font-family: "Noto Sans KR"; + font-style: normal; + font-weight: 300; + src: url(./font/NotoSansKR-Light.woff) format("woff"), + url(./font/NotoSansKR-Light.otf) format("opentype"); + } + @font-face { + font-family: "Noto Sans KR"; + font-style: normal; + font-weight: 400; + src: url(./font/NotoSansKR-Regular.woff) format("woff"), + url(./font/NotoSansKR-Regular.otf) format("opentype"); + } + @font-face { + font-family: "Noto Sans KR"; + font-style: normal; + font-weight: 500; + src: url(../font/NotoSansKR-Medium.woff2) format("woff2"), + url(../font/NotoSansKR-Medium.woff) format("woff"), + url(../font/NotoSansKR-Medium.otf) format("opentype"); + } + @font-face { + font-family: "Noto Sans KR"; + font-style: normal; font-weight: 700; - font-size: 16px; - position:fixed; - color: white; - bottom: ; - z-index:1; - - @font-face { - font-family: 'Noto Sans KR'; - font-style: normal; - font-weight: 100; - src: url(./font/NotoSansKR-Thin.woff) format('woff'), - url(./font/NotoSansKR-Thin.otf) format('opentype'); - } - @font-face { - font-family: 'Noto Sans KR'; - font-style: normal; - font-weight: 300; - src: url(./font/NotoSansKR-Light.woff) format('woff'), - url(./font/NotoSansKR-Light.otf) format('opentype'); - } - @font-face { - font-family: 'Noto Sans KR'; - font-style: normal; - font-weight: 400; - src: url(./font/NotoSansKR-Regular.woff) format('woff'), - url(./font/NotoSansKR-Regular.otf) format('opentype'); - } - @font-face { - font-family: 'Noto Sans KR'; - font-style: normal; - font-weight: 500; - src: url(../font/NotoSansKR-Medium.woff2) format('woff2'), - url(../font/NotoSansKR-Medium.woff) format('woff'), - url(../font/NotoSansKR-Medium.otf) format('opentype'); - } - @font-face { - font-family: 'Noto Sans KR'; - font-style: normal; - font-weight: 700; - src: url(./font/NotoSansKR-Bold.woff) format('woff'), - url(./font/NotoSansKR-Bold.otf) format('opentype'); - } - @font-face { - font-family: 'Noto Sans KR'; - font-style: normal; - font-weight: 900; - src: url(./font/NotoSansKR-Black.woff) format('woff'), - url(./font/NotoSansKR-Black.otf) format('opentype'); - } - left:50%; - transform:translateX(-50%); - bottom:70%; - text-align: center; + src: url(./font/NotoSansKR-Bold.woff) format("woff"), + url(./font/NotoSansKR-Bold.otf) format("opentype"); + } + @font-face { + font-family: "Noto Sans KR"; + font-style: normal; + font-weight: 900; + src: url(./font/NotoSansKR-Black.woff) format("woff"), + url(./font/NotoSansKR-Black.otf) format("opentype"); + } + left: 50%; + transform: translateX(-50%); + bottom: 70%; + text-align: center; `; const StyledParagraph3 = styled.p` - font-weight: 700; - font-size: 16px; - position:fixed; - color: white; - bottom:0; - z-index:1; - left:50%; - transform:translateX(-50%); - bottom:66%; - text-align: center; + font-weight: 700; + font-size: 16px; + position: fixed; + color: white; + bottom: 0; + z-index: 1; + left: 50%; + transform: translateX(-50%); + bottom: 66%; + text-align: center; `; const StyledParagraph4 = styled.p` - font-weight: 900; - font-size: 12px; - position:fixed; - color: white; - z-index:1; - - left:50%; - transform:translateX(-50%); - bottom:5%; - text-align: center; + font-weight: 900; + font-size: 12px; + position: fixed; + color: white; + z-index: 1; + + left: 50%; + transform: translateX(-50%); + bottom: 5%; + text-align: center; `; const generateSnowflakes = () => { -const snowflakes = []; + const snowflakes = []; -for (let i = 1; i <= 200; i++) { + for (let i = 1; i <= 200; i++) { const styles = generateRandomStyles(); snowflakes.push({ - id: i, - styles, + id: i, + styles, }); -} + } -return snowflakes; + return snowflakes; }; const Snow = styled.div` -position: fixed; -width: 10px; -height: 10px; -background: white; // Change the background color to black -pointer-events: none; -border-radius: 50%; - -${({ id, styles }) => ` + position: fixed; + width: 10px; + height: 10px; + background: white; // Change the background color to black + pointer-events: none; + border-radius: 50%; + + ${({ id, styles }) => ` &:nth-child(${id}) { opacity: ${Math.random()}; - transform: translate(${styles.randomX}vw, -10px) scale(${styles.randomScale}); - animation: fall-${id} ${styles.fallDuration}s -${Math.random() * 30}s linear infinite; + transform: translate(${styles.randomX}vw, -10px) scale(${ + styles.randomScale + }); + animation: fall-${id} ${styles.fallDuration}s -${ + Math.random() * 30 + }s linear infinite; } @keyframes fall-${id} { ${styles.randomYoyoTime * 100}% { - transform: translate(${styles.randomXEnd}vw, ${styles.randomYoyoY}vh) scale(${styles.randomScale}); + transform: translate(${styles.randomXEnd}vw, ${ + styles.randomYoyoY + }vh) scale(${styles.randomScale}); } to { - transform: translate(${styles.randomXEndYoyo}vw, 100vh) scale(${styles.randomScale}); + transform: translate(${styles.randomXEndYoyo}vw, 100vh) scale(${ + styles.randomScale + }); } } `} `; const StyledLink = styled(Link)` -position: absolute; -top: 0; -left: 0; -width: 100%; -height: 100%; -text-decoration: none; -color: inherit; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + text-decoration: none; + color: inherit; `; const BoxImg = styled.div` - position:fixed; - bottom:0; - text-decoration:underline; - z-index:1; - p{ - position:absolute; - left:50%; - transform:translateX(-50%); - bottom:10%; - } - img{ - width:100%; - } + position: fixed; + bottom: 0; + text-decoration: underline; + z-index: 1; + p { + position: absolute; + left: 50%; + transform: translateX(-50%); + bottom: 10%; + } + img { + width: 100%; + } `; - const Hello = () => { - const snowflakes = generateSnowflakes(); + const snowflakes = generateSnowflakes(); - - - return ( + return ( <> - + {snowflakes.map((snowflake) => ( - + ))} -
+
등록 완료! - 복지관과 매칭이 완료되면 -
- 등록하신 이메일로 -
- 관련 정보가 발송됩니다. + 복지관과 매칭이 완료되면 +
+ 등록하신 전화번호로 +
+ 관련 정보가 발송됩니다.
- - + + - + - - + - ); + ); }; -export default Hello; \ No newline at end of file +export default Hello; diff --git a/src/pages/donate/mydonation.js b/src/pages/donate/mydonation.js index 8b2345c..c590b79 100644 --- a/src/pages/donate/mydonation.js +++ b/src/pages/donate/mydonation.js @@ -1,48 +1,46 @@ -import React from 'react' -import styled from '@emotion/styled' -import { common } from '../../styles/common' -import backgroundImage from '../../assets/background/bgplusemoji.png' -import redbox from '../../assets/icon/redbox.png' -import { css } from '@emotion/react'; -import { Link } from 'react-router-dom' -import Header from '../../components/Layout/Header' -import PostBtnMydonate from '../../components/postbtnMydonate' -import PostBtnMypage from '../../components/postbtnMypage' - -import ListItem from '../../components/mydonatelist' -import Book1 from '../../assets/bg/example.png' -import Book2 from '../../assets/bg/example2.png' +import React from "react"; +import styled from "@emotion/styled"; +import { common } from "../../styles/common"; +import backgroundImage from "../../assets/background/bgplusemoji.png"; +import redbox from "../../assets/icon/redbox.png"; +import { css } from "@emotion/react"; +import { Link } from "react-router-dom"; +import Header from "../../components/Layout/Header"; +import PostBtnMydonate from "../../components/postbtnMydonate"; +import PostBtnMypage from "../../components/postbtnMypage"; +import ListItem from "../../components/mydonatelist"; +import Book1 from "../../assets/bg/example.png"; +import Book2 from "../../assets/bg/example2.png"; const randomRange = (min, max) => { -const rand = Math.random(); -return min + Math.floor(rand * (max - min + 1)); + const rand = Math.random(); + return min + Math.floor(rand * (max - min + 1)); }; const PostBg = styled.div` - background: url(${backgroundImage}) no-repeat center center fixed; - background-size: cover; /* 배경 이미지를 화면에 꽉 채우도록 설정 */ - height: 860px; /* 화면 높이를 860px로 설정 */ - width: 380px; - flex-direction: column; - justify-content: center; - align-items: center; - cursor: pointer; - position: relative; - z-index: 1; - + background: url(${backgroundImage}) no-repeat center center fixed; + background-size: cover; /* 배경 이미지를 화면에 꽉 채우도록 설정 */ + height: 860px; /* 화면 높이를 860px로 설정 */ + width: 380px; + flex-direction: column; + justify-content: center; + align-items: center; + cursor: pointer; + position: relative; + z-index: 1; `; const generateRandomStyles = () => { -const randomX = Math.random() * 100; -const randomOffset = randomRange(-100, 100); -const randomXEnd = randomX + randomOffset; -const randomXEndYoyo = randomX + randomOffset / 2; -const randomYoyoTime = randomRange(30000, 80000) / 100000; -const randomYoyoY = randomYoyoTime * 100; -const randomScale = Math.random(); -const fallDuration = randomRange(10, 30); -return { + const randomX = Math.random() * 100; + const randomOffset = randomRange(-100, 100); + const randomXEnd = randomX + randomOffset; + const randomXEndYoyo = randomX + randomOffset / 2; + const randomYoyoTime = randomRange(30000, 80000) / 100000; + const randomYoyoY = randomYoyoTime * 100; + const randomScale = Math.random(); + const fallDuration = randomRange(10, 30); + return { randomX, randomXEnd, randomXEndYoyo, @@ -50,216 +48,230 @@ return { randomYoyoY, randomScale, fallDuration, -}; + }; }; const StyledParagraph1 = styled.p` - font-weight: 900; - font-size: 30px; - position:fixed; - color: white; - z-index:1; - left:50%; - transform:translateX(-50%); - bottom:80%; - text-align: center; - + font-weight: 900; + font-size: 30px; + position: fixed; + color: white; + z-index: 1; + left: 50%; + transform: translateX(-50%); + bottom: 80%; + text-align: center; `; const StyledParagraph2 = styled.p` - white-space: nowrap; + white-space: nowrap; + font-weight: 700; + font-size: 16px; + position: fixed; + color: white; + z-index: 1; + + @font-face { + font-family: "Noto Sans KR"; + font-style: normal; + font-weight: 100; + src: url(./font/NotoSansKR-Thin.woff) format("woff"), + url(./font/NotoSansKR-Thin.otf) format("opentype"); + } + @font-face { + font-family: "Noto Sans KR"; + font-style: normal; + font-weight: 300; + src: url(./font/NotoSansKR-Light.woff) format("woff"), + url(./font/NotoSansKR-Light.otf) format("opentype"); + } + @font-face { + font-family: "Noto Sans KR"; + font-style: normal; + font-weight: 400; + src: url(./font/NotoSansKR-Regular.woff) format("woff"), + url(./font/NotoSansKR-Regular.otf) format("opentype"); + } + @font-face { + font-family: "Noto Sans KR"; + font-style: normal; + font-weight: 500; + src: url(../font/NotoSansKR-Medium.woff2) format("woff2"), + url(../font/NotoSansKR-Medium.woff) format("woff"), + url(../font/NotoSansKR-Medium.otf) format("opentype"); + } + @font-face { + font-family: "Noto Sans KR"; + font-style: normal; font-weight: 700; - font-size: 16px; - position:fixed; - color: white; - bottom: ; - z-index:1; - - @font-face { - font-family: 'Noto Sans KR'; - font-style: normal; - font-weight: 100; - src: url(./font/NotoSansKR-Thin.woff) format('woff'), - url(./font/NotoSansKR-Thin.otf) format('opentype'); - } - @font-face { - font-family: 'Noto Sans KR'; - font-style: normal; - font-weight: 300; - src: url(./font/NotoSansKR-Light.woff) format('woff'), - url(./font/NotoSansKR-Light.otf) format('opentype'); - } - @font-face { - font-family: 'Noto Sans KR'; - font-style: normal; - font-weight: 400; - src: url(./font/NotoSansKR-Regular.woff) format('woff'), - url(./font/NotoSansKR-Regular.otf) format('opentype'); - } - @font-face { - font-family: 'Noto Sans KR'; - font-style: normal; - font-weight: 500; - src: url(../font/NotoSansKR-Medium.woff2) format('woff2'), - url(../font/NotoSansKR-Medium.woff) format('woff'), - url(../font/NotoSansKR-Medium.otf) format('opentype'); - } - @font-face { - font-family: 'Noto Sans KR'; - font-style: normal; - font-weight: 700; - src: url(./font/NotoSansKR-Bold.woff) format('woff'), - url(./font/NotoSansKR-Bold.otf) format('opentype'); - } - @font-face { - font-family: 'Noto Sans KR'; - font-style: normal; - font-weight: 900; - src: url(./font/NotoSansKR-Black.woff) format('woff'), - url(./font/NotoSansKR-Black.otf) format('opentype'); - } - left:50%; - transform:translateX(-50%); - bottom:70%; - text-align: center; + src: url(./font/NotoSansKR-Bold.woff) format("woff"), + url(./font/NotoSansKR-Bold.otf) format("opentype"); + } + @font-face { + font-family: "Noto Sans KR"; + font-style: normal; + font-weight: 900; + src: url(./font/NotoSansKR-Black.woff) format("woff"), + url(./font/NotoSansKR-Black.otf) format("opentype"); + } + left: 50%; + transform: translateX(-50%); + bottom: 70%; + text-align: center; `; const StyledParagraph3 = styled.p` - font-weight: 700; - font-size: 16px; - position:fixed; - color: white; - bottom:0; - z-index:1; - left:50%; - transform:translateX(-50%); - bottom:66%; - text-align: center; + font-weight: 700; + font-size: 16px; + position: fixed; + color: white; + bottom: 0; + z-index: 1; + left: 50%; + transform: translateX(-50%); + bottom: 66%; + text-align: center; `; const StyledParagraph4 = styled.p` - font-weight: 900; - font-size: 12px; - position:fixed; - color: white; - z-index:1; - - left:50%; - transform:translateX(-50%); - bottom:5%; - text-align: center; + font-weight: 900; + font-size: 12px; + position: fixed; + color: white; + z-index: 1; + + left: 50%; + transform: translateX(-50%); + bottom: 5%; + text-align: center; `; const generateSnowflakes = () => { -const snowflakes = []; + const snowflakes = []; -for (let i = 1; i <= 200; i++) { + for (let i = 1; i <= 200; i++) { const styles = generateRandomStyles(); snowflakes.push({ - id: i, - styles, + id: i, + styles, }); -} + } -return snowflakes; + return snowflakes; }; const Snow = styled.div` -position: fixed; -width: 10px; -height: 10px; -background: white; // Change the background color to black -pointer-events: none; -border-radius: 50%; + position: fixed; + width: 10px; + height: 10px; + background: white; // Change the background color to black + pointer-events: none; + border-radius: 50%; -${({ id, styles }) => ` + ${({ id, styles }) => ` &:nth-child(${id}) { opacity: ${Math.random()}; - transform: translate(${styles.randomX}vw, -10px) scale(${styles.randomScale}); - animation: fall-${id} ${styles.fallDuration}s -${Math.random() * 30}s linear infinite; + transform: translate(${styles.randomX}vw, -10px) scale(${ + styles.randomScale + }); + animation: fall-${id} ${styles.fallDuration}s -${ + Math.random() * 30 + }s linear infinite; } @keyframes fall-${id} { ${styles.randomYoyoTime * 100}% { - transform: translate(${styles.randomXEnd}vw, ${styles.randomYoyoY}vh) scale(${styles.randomScale}); + transform: translate(${styles.randomXEnd}vw, ${ + styles.randomYoyoY + }vh) scale(${styles.randomScale}); } to { - transform: translate(${styles.randomXEndYoyo}vw, 100vh) scale(${styles.randomScale}); + transform: translate(${styles.randomXEndYoyo}vw, 100vh) scale(${ + styles.randomScale + }); } } `} `; const StyledLink = styled(Link)` -position: absolute; -top: 0; -left: 0; -width: 100%; -height: 100%; -text-decoration: none; -color: inherit; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + text-decoration: none; + color: inherit; `; const BoxImg = styled.div` - position:fixed; - bottom:0; - text-decoration:underline; - z-index:1; - p{ - position:absolute; - left:50%; - transform:translateX(-50%); - bottom:10%; - } - img{ - width:100%; - } + position: fixed; + bottom: 0; + text-decoration: underline; + z-index: 1; + p { + position: absolute; + left: 50%; + transform: translateX(-50%); + bottom: 10%; + } + img { + width: 100%; + } `; //const ListItem = ({pageTypeNormal, pageTypeDetail, name, school,subject,date,matching, imgSrc}) =>{ const Hello = () => { - const arrs = [ - { - name:'쎈 연산 5', - school:'교과과정 : 초등 ', - subject:'과목 : 수학', - date:'등록일자 : 2024. 1. 7 ', - matching: '매칭상태 : 매칭중' , - imgSrc:Book1 - }, - { - name:'수학의 정석', - school:'교과과정 : 고등 ', - subject:'과목 : 수학', - date:'등록일자 : 2024. 1. 2 ', - matching: '매칭상태 : 매칭완료' , - imgSrc:Book2 - } - - ] - const snowflakes = generateSnowflakes(); + const arrs = [ + { + name: "쎈 연산 5", + school: "교과과정 : 초등 ", + subject: "과목 : 수학", + date: "등록일자 : 2024. 1. 7 ", + matching: "매칭상태 : 매칭중", + imgSrc: Book1, + }, + { + name: "수학의 정석", + school: "교과과정 : 고등 ", + subject: "과목 : 수학", + date: "등록일자 : 2024. 1. 2 ", + matching: "매칭상태 : 매칭완료", + imgSrc: Book2, + }, + ]; + const snowflakes = generateSnowflakes(); - - - return ( + return ( <> - + {snowflakes.map((snowflake) => ( - + ))} -
+
나의 기부 현황
    - { - arrs.map((arr, index) => ( - - )) - } + {arrs.map((arr, index) => ( + + ))}
- - + - ); + ); }; -export default Hello; \ No newline at end of file +export default Hello; diff --git a/src/pages/donate/process1.js b/src/pages/donate/process1.js index 12cbae6..79af077 100644 --- a/src/pages/donate/process1.js +++ b/src/pages/donate/process1.js @@ -1,80 +1,71 @@ -import React from 'react' -import styled from '@emotion/styled' -import backgroundImage from '../../assets/background/background.png' -import hello from '../../assets/icon/hello.png' -import PostBtngo from '../../components/postbtngo' -import Header from '../../components/Layout/Header' +import React from "react"; +import styled from "@emotion/styled"; +import backgroundImage from "../../assets/background/background.png"; +import hello from "../../assets/icon/hello.png"; +import PostBtngo from "../../components/postbtngo"; +import Header from "../../components/Layout/Header"; const StyledParagraph1 = styled.p` - font-weight: 900; - font-size: 30px; - position:fixed; - color: black; - z-index:1; - left:50%; - white-space: nowrap; - transform:translateX(-50%); - bottom:75%; - text-align: center; - + font-weight: 900; + font-size: 30px; + position: fixed; + color: black; + z-index: 1; + left: 50%; + white-space: nowrap; + transform: translateX(-50%); + bottom: 75%; + text-align: center; `; const StyledParagraph2 = styled.p` - white-space: nowrap; - font-weight: 900; - font-size: 30px; - position:fixed; - color: black; - z-index:1; - left:50%; - transform:translateX(-50%); - bottom:30%; - text-align: center; - + white-space: nowrap; + font-weight: 900; + font-size: 30px; + position: fixed; + color: black; + z-index: 1; + left: 50%; + transform: translateX(-50%); + bottom: 30%; + text-align: center; `; const PostBg = styled.div` - background: url(${backgroundImage}) no-repeat center center fixed; - background-size: cover; /* 배경 이미지를 화면에 꽉 채우도록 설정 */ - height: 876px; /* 화면 높이를 860px로 설정 */ - width: 390px; - flex-direction: column; - justify-content: center; - align-items: center; - cursor: pointer; - position: relative; - z-index: 0; - + background: url(${backgroundImage}) no-repeat center center fixed; + background-size: cover; /* 배경 이미지를 화면에 꽉 채우도록 설정 */ + height: 876px; /* 화면 높이를 860px로 설정 */ + width: 390px; + flex-direction: column; + justify-content: center; + align-items: center; + cursor: pointer; + position: relative; + z-index: 0; `; - - const BoxImg = styled.div` - position:fixed; - z-index:2; - position:absolute; - left:40%; - transform:translateX(-50%); - bottom:45%; - + position: fixed; + z-index: 2; + position: absolute; + left: 40%; + transform: translateX(-50%); + bottom: 45%; `; -const Hello = () => { - - -return ( - <> -
- 안녕하세요. - - - - - 남경현님 -
- 만나서 반갑습니다! -
- +const Process1 = () => { + return ( + <> +
+ 안녕하세요. + + + + + 남경현님 +
+ 만나서 반갑습니다! +
+ - -); + ); }; -export default Hello; +export default Process1; diff --git a/src/pages/donate/process2.js b/src/pages/donate/process2.js index c3b74c9..c4006c5 100644 --- a/src/pages/donate/process2.js +++ b/src/pages/donate/process2.js @@ -1,84 +1,98 @@ -import React, { useState } from 'react'; -import styled from '@emotion/styled'; -import PostBtngo from '../../components/postbtngo'; -import Header from '../../components/Layout/Header'; -import { common } from '../../styles/common'; +import React, { useState } from "react"; +import styled from "@emotion/styled"; +import PostBtngo from "../../components/postbtngo"; +import Header from "../../components/Layout/Header"; +import { QueryClient, QueryClientProvider } from "react-query"; const StyledParagraph1 = styled.p` -font-weight: 900; -font-size: 30px; -position: fixed; -color: black; -z-index: 1; -left: 50%; -transform: translateX(-50%); -bottom: 65%; -text-align: center; + font-weight: 900; + font-size: 30px; + position: fixed; + color: black; + z-index: 1; + left: 50%; + transform: translateX(-50%); + bottom: 65%; + text-align: center; `; -const EditableButton = styled.button` -display: block; -width: 320px; -color: ${common.colors.black}; -font-weight: 700; -font-size: ${common.fontSize.fz20}; -border-radius: 10px; -border: 2px solid ${common.colors.black}; -cursor: pointer; -text-decoration: none; -background: none; -position: absolute; -overflow: hidden; /* Hide overflowing content */ +const Textboxdesign = styled.input` + position: fixed; + color: black; + z-index: 1; + left: 50%; + transform: translateX(-50%); + bottom: 30%; + text-align: center; + font-size: 16px; + padding: 10px; + width: 80%; `; -const EditableContent = styled.div` -outline: none; -width: 100%; -height: 100%; -padding: 10px; -white-space: nowrap; -overflow: hidden; -text-overflow: ellipsis; /* Show ellipsis (...) for overflow */ +const Textboxdesign1 = styled.input` + position: fixed; + color: black; + z-index: 1; + left: 50%; + transform: translateX(-50%); + bottom: 20%; + text-align: center; + font-size: 16px; + padding: 10px; + width: 80%; `; const StyledParagraph3 = styled.p` -font-weight: 900; -font-size: 28px; -position: fixed; -color: white; -bottom: 0; -z-index: 1; -left: 10%; -transform: translateX(-50%); -bottom: 55%; -text-align: center; + font-weight: 900; + font-size: 28px; + position: fixed; + color: white; + bottom: 0; + z-index: 1; + left: 10%; + transform: translateX(-50%); + bottom: 55%; + text-align: center; `; -const Hello = () => { -const [editableText, setEditableText] = useState('오. 텍스트박스 안되네'); +const queryClient = new QueryClient(); -const handleTextChange = (event) => { - setEditableText(event.target.textContent); -}; - -return ( +const Process2 = () => { + const [publisher, setPublisher] = useState(""); + const [bookName, setBookName] = useState(""); + return ( <> -
- - 출판사의 이름과 -
- 참고서의 이름을 -
- 등록해주세요. -
- - - {editableText} - - - +
+
+ + 출판사의 이름과 +
+ 참고서의 이름을 +
+ 등록해주세요. +
+
+ + setPublisher(e.target.value)} + /> + setBookName(e.target.value)} + /> + + + {/* */} + -); + ); }; -export default Hello; +export default Process2; diff --git a/src/pages/donate/process3.js b/src/pages/donate/process3.js index 8e16caf..a7a8f95 100644 --- a/src/pages/donate/process3.js +++ b/src/pages/donate/process3.js @@ -1,107 +1,117 @@ -import React, { useState } from 'react'; -import styled from '@emotion/styled'; -import PostBtngo from '../../components/postbtngo'; -import Header from '../../components/Layout/Header'; -import { common } from '../../styles/common'; +import React, { useState } from "react"; +import styled from "@emotion/styled"; +import PostBtngo from "../../components/postbtngo"; +import Header from "../../components/Layout/Header"; +import { common } from "../../styles/common"; const StyledParagraph1 = styled.p` -font-weight: 900; -font-size: 30px; -position: fixed; -white-space: nowrap; -color: black; -z-index: 1; -left: 50%; -transform: translateX(-50%); -bottom: 75%; -text-align: center; + font-weight: 900; + font-size: 30px; + position: fixed; + white-space: nowrap; + color: black; + z-index: 1; + left: 50%; + transform: translateX(-50%); + bottom: 75%; + text-align: center; `; const StyledParagraph3 = styled.p` -font-weight: 900; -font-size: 28px; -position: fixed; -color: white; -bottom: 0; -z-index: 1; -left: 10%; -transform: translateX(-50%); -bottom: 60%; -text-align: center; + font-weight: 900; + font-size: 28px; + position: fixed; + color: white; + bottom: 0; + z-index: 1; + left: 10%; + transform: translateX(-50%); + bottom: 60%; + text-align: center; `; const StyledParagraph4 = styled.p` -font-weight: 900; -font-size: 28px; -position: fixed; -color: white; -bottom: 0; -z-index: 1; -left: 10%; -transform: translateX(-50%); -bottom: 50%; -text-align: center; + font-weight: 900; + font-size: 28px; + position: fixed; + color: white; + bottom: 0; + z-index: 1; + left: 10%; + transform: translateX(-50%); + bottom: 50%; + text-align: center; `; const StyledParagraph5 = styled.p` -font-weight: 900; -font-size: 28px; -position: fixed; -color: white; -bottom: 0; -z-index: 1; -left: 10%; -transform: translateX(-50%); -bottom: 40%; -text-align: center; + font-weight: 900; + font-size: 28px; + position: fixed; + color: white; + bottom: 0; + z-index: 1; + left: 10%; + transform: translateX(-50%); + bottom: 40%; + text-align: center; `; const EditableButton = styled.button` -display: block; -width: 320px; -color: ${common.colors.black}; -font-weight: 700; -font-size: ${common.fontSize.fz20}; -border-radius: 20px; -border: 2px solid ${common.colors.black}; -cursor: pointer; -background: ${(props) => (props.isSelected ? common.colors.blue : 'none')}; /* Dynamic background based on isSelected */ -position: absolute; -bottom: 5%; -height: 60px; + display: block; + width: 320px; + color: ${common.colors.black}; + font-weight: 700; + font-size: ${common.fontSize.fz20}; + border-radius: 20px; + border: 2px solid ${common.colors.black}; + cursor: pointer; + background: ${(props) => + props.isSelected + ? common.colors.blue + : "none"}; /* Dynamic background based on isSelected */ + position: absolute; + bottom: 5%; + height: 60px; `; - -const Hello = () => { - - const [selectedButton, setSelectedButton] = useState(null); - - const handleButtonClick = (buttonName) => { - setSelectedButton(buttonName); - }; -return ( +const Process3 = () => { + const [selectedButton, setSelectedButton] = useState(null); + // onChange={(e) => setInfo({ ...info, category: e.target.value })} + const handleButtonClick = (buttonName) => { + setSelectedButton(buttonName); + }; + return ( <> -
- - 책이 어느 교과과정에 +
+ + 책이 어느 교과과정에
해당하나요? -
- - handleButtonClick('초등교육')}> - 초등교육 - - - - handleButtonClick('중등교육')}> - 중등교육 - - - - handleButtonClick('고등교육')}> - 고등교육 - - + + + handleButtonClick("초등교육")} + > + 초등교육 + + + + handleButtonClick("중등교육")} + > + 중등교육 + + + + handleButtonClick("고등교육")} + > + 고등교육 + + - + -); + ); }; -export default Hello; +export default Process3; diff --git a/src/pages/donate/process4.js b/src/pages/donate/process4.js index 6778f67..1f91c6b 100644 --- a/src/pages/donate/process4.js +++ b/src/pages/donate/process4.js @@ -37,7 +37,7 @@ bottom: 0; z-index: 1; left: 10%; transform: translateX(-50%); -bottom: 64%; +bottom: 63%; text-align: center; `; const StyledParagraph5 = styled.p` @@ -49,7 +49,7 @@ bottom: 0; z-index: 1; left: 10%; transform: translateX(-50%); -bottom: 57%; +bottom: 55%; text-align: center; `; const StyledParagraph6 = styled.p` @@ -61,7 +61,7 @@ bottom: 0; z-index: 1; left: 10%; transform: translateX(-50%); -bottom: 50%; +bottom: 47%; text-align: center; `; const StyledParagraph7 = styled.p` @@ -73,7 +73,7 @@ bottom: 0; z-index: 1; left: 10%; transform: translateX(-50%); -bottom: 43%; +bottom: 39%; text-align: center; `; const StyledParagraph8 = styled.p` @@ -85,7 +85,7 @@ bottom: 0; z-index: 1; left: 10%; transform: translateX(-50%); -bottom: 36%; +bottom: 31%; text-align: center; `; @@ -98,7 +98,7 @@ bottom: 0; z-index: 1; left: 10%; transform: translateX(-50%); -bottom: 29%; +bottom: 23%; text-align: center; `; const EditableButton = styled.button` diff --git a/src/pages/donate/process5.js b/src/pages/donate/process5.js index 7de4225..08f89b0 100644 --- a/src/pages/donate/process5.js +++ b/src/pages/donate/process5.js @@ -3,16 +3,31 @@ import styled from '@emotion/styled'; import PostBtngo from '../../components/postbtngo'; import Header from '../../components/Layout/Header'; -const checkBoxList = ['밑줄 (연필/샤프)', '밑줄 (볼펜/형광펜)', '필기 (연필/샤프)', '필기 (볼펜/형광펜)', '겉표지 깨끗함', '이름(서명) 없음', '페이지 변색 없음', '페이지 훼손 없음']; +const checkBoxList = [ +'매우 깨끗함', +'깨끗함', +'보통', +'필기 있음', +'필기량 많음', +'연필/샤프', +'볼펜/형광펜/색연필', +'겉표지 깨끗함', +'이름(서명) 없음', +'페이지 변색 없음', +'페이지 훼손 없음' +]; const CheckboxContainer = styled.div` -margin: 160px auto 20px; -text-align: center; +margin: 120px auto 20px; +text-align: center; +margin-bottom: 55px; /* Adjusted margin */ +bottom: 45%; `; const CheckboxItem = styled.div` -margin-bottom: 30px; -text-align: auto; +margin-bottom: 20px; +text-align: auto; +bottom: 85%; `; const CheckboxLabel = styled.label` @@ -20,6 +35,7 @@ display: block; font-size: 18px; /* Example font size */ color: #333; /* Example color */ margin-bottom: 10px; /* Example margin-bottom */ +bottom: 85%; `; const StyledParagraph0 = styled.p` @@ -31,9 +47,10 @@ color: black; z-index: 1; left: 50%; transform: translateX(-50%); -bottom: 77%; +bottom: 80%; text-align: center; `; + const StyledParagraph1 = styled.p` font-weight: 900; font-size: 25px; @@ -43,54 +60,98 @@ color: black; z-index: 1; left: 50%; transform: translateX(-50%); -bottom: 47%; +bottom: 49%; text-align: center; `; + +const StyledParagraph2 = styled.p` +font-weight: 900; +font-size: 25px; +position: fixed; +white-space: nowrap; +color: black; +z-index: 1; +left: 50%; +transform: translateX(-50%); +bottom: 32%; +text-align: center; +`; + const Hello = () => { const [checkedItems, setCheckedItems] = useState({}); -const handleCheckboxChange = (itemName) => { - setCheckedItems((prevItems) => ({ - ...prevItems, - [itemName]: !prevItems[itemName], - })); +const handleCheckboxChange = (itemName, section) => { + const newCheckedItems = { ...checkedItems }; + + if (section === '어느정도') { + // For the first section, allow only one checkbox to be checked + newCheckedItems['어느정도'] = itemName; + } else { + // For other sections, allow multiple checkboxes to be checked + newCheckedItems[section] = newCheckedItems[section] || []; + const index = newCheckedItems[section].indexOf(itemName); + + if (index === -1) { + // If not checked, add to the array + newCheckedItems[section].push(itemName); + } else { + // If checked, remove from the array + newCheckedItems[section].splice(index, 1); + } + } + + setCheckedItems(newCheckedItems); }; return ( <>
- - 필기한 흔적이 있나요? - + 어느정도 필기하셨나요?
- {checkBoxList.slice(0, 4).map((item) => ( + {checkBoxList.slice(0, 5).map((item) => ( handleCheckboxChange(item)} + checked={checkedItems['어느정도'] === item} + onChange={() => handleCheckboxChange(item, '어느정도')} /> {item} ))}
- - 보존 상태는 어떤가요? - -
-
- + 무엇으로 필기하셨나요? +
+
+
+
+ {checkBoxList.slice(5, 7).map((item) => ( + + + handleCheckboxChange(item, '무엇으로')} + /> + {item} + + + ))} +
+ 책의 상태는 어떤가요? +
+
+
- {checkBoxList.slice(4).map((item) => ( + {checkBoxList.slice(7).map((item) => ( handleCheckboxChange(item)} + checked={checkedItems['책의 상태'] && checkedItems['책의 상태'].includes(item)} + onChange={() => handleCheckboxChange(item, '책의 상태')} /> {item} diff --git a/src/pages/main/check.js b/src/pages/main/check.js index f659983..e7fa76e 100644 --- a/src/pages/main/check.js +++ b/src/pages/main/check.js @@ -252,7 +252,7 @@ return ( 기부할 참고서는 훼손의 정도가 심하지 않아야 합니다.
- ex : 찢어짐, 파손됨 + ex : 찢어짐, 파손됨 !
diff --git a/src/pages/main/choose.js b/src/pages/main/choose.js index fbd580e..b0559d9 100644 --- a/src/pages/main/choose.js +++ b/src/pages/main/choose.js @@ -1,39 +1,38 @@ -import React from 'react' -import styled from '@emotion/styled' -import backgroundImage from '../../assets/background/background.png' -import donate3d from '../../assets/icon/donate3d.png' -import PostBtn from '../../components/postbtn' -import PostBtn1 from '../../components/postbtn1' -import Header from '../../components/Layout/Header' +import React from "react"; +import styled from "@emotion/styled"; +import backgroundImage from "../../assets/background/background.png"; +import donate3d from "../../assets/icon/donate3d.png"; +import PostBtn from "../../components/postbtn"; +import PostBtn1 from "../../components/postbtn1"; +import Header from "../../components/Layout/Header"; const randomRange = (min, max) => { -const rand = Math.random(); -return min + Math.floor(rand * (max - min + 1)); + const rand = Math.random(); + return min + Math.floor(rand * (max - min + 1)); }; const PostBg = styled.div` - background: url(${backgroundImage}) no-repeat center center fixed; - background-size: cover; /* 배경 이미지를 화면에 꽉 채우도록 설정 */ - height: 876px; /* 화면 높이를 860px로 설정 */ - width: 390px; - flex-direction: column; - justify-content: center; - align-items: center; - cursor: pointer; - position: relative; - z-index: 0; - + background: url(${backgroundImage}) no-repeat center center fixed; + background-size: cover; /* 배경 이미지를 화면에 꽉 채우도록 설정 */ + height: 876px; /* 화면 높이를 860px로 설정 */ + width: 390px; + flex-direction: column; + justify-content: center; + align-items: center; + cursor: pointer; + position: relative; + z-index: 0; `; const generateRandomStyles = () => { -const randomX = Math.random() * 100; -const randomOffset = randomRange(-100, 100); -const randomXEnd = randomX + randomOffset; -const randomXEndYoyo = randomX + randomOffset / 2; -const randomYoyoTime = randomRange(30000, 80000) / 100000; -const randomYoyoY = randomYoyoTime * 100; -const randomScale = Math.random(); -const fallDuration = randomRange(10, 30); -return { + const randomX = Math.random() * 100; + const randomOffset = randomRange(-100, 100); + const randomXEnd = randomX + randomOffset; + const randomXEndYoyo = randomX + randomOffset / 2; + const randomYoyoTime = randomRange(30000, 80000) / 100000; + const randomYoyoY = randomYoyoTime * 100; + const randomScale = Math.random(); + const fallDuration = randomRange(10, 30); + return { randomX, randomXEnd, randomXEndYoyo, @@ -41,84 +40,93 @@ return { randomYoyoY, randomScale, fallDuration, + }; }; -}; - const generateSnowflakes = () => { -const snowflakes = []; + const snowflakes = []; -for (let i = 1; i <= 200; i++) { + for (let i = 1; i <= 200; i++) { const styles = generateRandomStyles(); snowflakes.push({ - id: i, - styles, + id: i, + styles, }); -} + } -return snowflakes; + return snowflakes; }; const Snow = styled.div` -position: fixed; -width: 10px; -height: 10px; -background: white; // Change the background color to black -pointer-events: none; -border-radius: 50%; - -${({ id, styles }) => ` + position: fixed; + width: 10px; + height: 10px; + background: white; // Change the background color to black + pointer-events: none; + border-radius: 50%; + + ${({ id, styles }) => ` &:nth-child(${id}) { opacity: ${Math.random()}; - transform: translate(${styles.randomX}vw, -10px) scale(${styles.randomScale}); - animation: fall-${id} ${styles.fallDuration}s -${Math.random() * 30}s linear infinite; + transform: translate(${styles.randomX}vw, -10px) scale(${ + styles.randomScale + }); + animation: fall-${id} ${styles.fallDuration}s -${ + Math.random() * 30 + }s linear infinite; } @keyframes fall-${id} { ${styles.randomYoyoTime * 100}% { - transform: translate(${styles.randomXEnd}vw, ${styles.randomYoyoY}vh) scale(${styles.randomScale}); + transform: translate(${styles.randomXEnd}vw, ${ + styles.randomYoyoY + }vh) scale(${styles.randomScale}); } to { - transform: translate(${styles.randomXEndYoyo}vw, 100vh) scale(${styles.randomScale}); + transform: translate(${styles.randomXEndYoyo}vw, 100vh) scale(${ + styles.randomScale + }); } } `} `; - - const BoxImg = styled.div` - position:fixed; - z-index:2; - position:absolute; - left:50%; - transform:translateX(-50%); - bottom:30%; - + position: fixed; + z-index: 2; + position: absolute; + left: 50%; + transform: translateX(-50%); + bottom: 30%; `; const Hello = () => { -const snowflakes = generateSnowflakes(); - - -return ( - <> - - {snowflakes.map((snowflake) => ( - - ))} + const snowflakes = generateSnowflakes(); + + return ( + <> + + {snowflakes.map((snowflake) => ( + + ))}
- + - - + - - + + - -); + ); }; export default Hello; diff --git a/src/pages/main/userlogin.js b/src/pages/main/userlogin.js new file mode 100644 index 0000000..f9b3960 --- /dev/null +++ b/src/pages/main/userlogin.js @@ -0,0 +1,63 @@ +import React, { useState } from "react"; +import { Route } from "react-router-dom"; +import { Link } from "react-router-dom"; +import { useNavigate } from "react-router-dom"; +import axios from "axios"; +import "../../styles/agencylogin.css"; +import Header from '../../components/Layout/Header' + +const AgencyLogin = () => { +const navigate = useNavigate(); +const [id, setId] = useState(""); +const [password, setPassword] = useState(""); + +const handleSignIn = async () => { + try { + const response = await axios.post("/login", { + id, + password, + }); + navigate("/reciever/booklist"); + } catch (error) { + console.log(error); + } +}; + +return ( +
+
+ +
+

BookBridge

+

나의 시작이 될 수 있게

+
+
+ setId(e.target.value)} + placeholder="id" + className="input-field" + /> + setPassword(e.target.value)} + placeholder="Password" + className="input-field" + /> + + + + + + + +
+
+); +}; + +export default AgencyLogin; diff --git a/src/pages/main/usersignup.js b/src/pages/main/usersignup.js new file mode 100644 index 0000000..335932c --- /dev/null +++ b/src/pages/main/usersignup.js @@ -0,0 +1,98 @@ +import React, { useState } from "react"; +import axios from "axios"; +import Header from "../../components/Layout/Header"; +import InputField from "../../components/InputField"; +import backgroundImage from "../../assets/background/background.png"; +import { useNavigate } from "react-router-dom"; +import "../../styles/agencysignup.css"; + +const AgencySignUp = () => { + const [email, setEmail] = useState(""); + const [id, setId] = useState(""); + const [password, setPassword] = useState(""); + const [checkPassword, setCheckPassword] = useState(""); + const [name, setName] = useState(""); + const navigate = useNavigate(); + + const handleSubmit = async (e) => { + e.preventDefault(); + + if (!email || !id || !password || !checkPassword || !name) { + alert("모든 필드를 채워주세요."); + return; + } + + if (password !== checkPassword) { + alert("비밀번호가 일치하지 않습니다."); + return; + } + + const formData = { + email: email, + id: id, + password: password, + check_password: checkPassword, + name: name, + }; + + try { + const response = await axios.post("/signup", formData); + console.log(response.data); + navigate("/reciever/agencylogin"); + } catch (error) { + console.error("회원가입 오류:", error); + } + }; + + return ( +
+
+
+
회원가입
+
회원이 되어 기부를 경험해보세요.
+
+
+ setEmail(e.target.value)} + /> + setId(e.target.value)} + /> + setPassword(e.target.value)} + /> + setCheckPassword(e.target.value)} + /> + setName(e.target.value)} + /> + + +
+ ); +}; + +export default AgencySignUp; diff --git a/src/pages/reciever/agencylogin.js b/src/pages/reciever/agencylogin.js new file mode 100644 index 0000000..75471d4 --- /dev/null +++ b/src/pages/reciever/agencylogin.js @@ -0,0 +1,60 @@ +import React, { useState } from "react"; +import { Route } from "react-router-dom"; +import { Link } from "react-router-dom"; +import { useNavigate } from "react-router-dom"; +import axios from "axios"; +import Header from "../../components/Layout/Header"; +import "../../styles/agencylogin.css"; + +const AgencyLogin = () => { + const navigate = useNavigate(); + const [id, setId] = useState(""); + const [password, setPassword] = useState(""); + + // const handleSignIn = async () => { + // try { + // const response = await axios.post("/login", { + // login_id: id, + // password: password, + // }); + // navigate("/reciever/booklist"); + // } catch (error) { + // console.error(error); + // } + // }; + + return ( +
+
+
+

BookBridge

+

나의 시작이 될 수 있게

+
+
+ setId(e.target.value)} + placeholder="id" + className="input-field" + /> + setPassword(e.target.value)} + placeholder="Password" + className="input-field" + /> + {/* + + + + +
+
+ ); +}; + +export default AgencyLogin; diff --git a/src/pages/reciever/agencysignup.js b/src/pages/reciever/agencysignup.js new file mode 100644 index 0000000..eb8b2f9 --- /dev/null +++ b/src/pages/reciever/agencysignup.js @@ -0,0 +1,109 @@ +import React, { useState } from "react"; +import axios from "axios"; +import Header from "../../components/Layout/Header"; +import InputField from "../../components/InputField"; +import backgroundImage from "../../assets/background/background.png"; +import { useNavigate } from "react-router-dom"; + +import "../../styles/agencysignup.css"; + +const AgencySignUp = () => { + const [regNum, setRegNum] = useState(""); + const [email, setEmail] = useState(""); + const [id, setId] = useState(""); + const [password, setPassword] = useState(""); + const [checkPassword, setCheckPassword] = useState(""); + const [name, setName] = useState(""); + const navigate = useNavigate(); + + const handleSubmit = async (e) => { + e.preventDefault(); + + if (!email || !id || !password || !checkPassword || !name || !regNum) { + alert("모든 필드를 채워주세요."); + return; + } + + if (password !== checkPassword) { + alert("비밀번호가 일치하지 않습니다."); + return; + } + + // const formData = { + // email: email, + // login_id: id, + // password: password, + // check_password: checkPassword, + // name: name, + // registration_number: regNum, + // }; + + // try { + // const response = await axios.post("/signup", formData); + // console.log(response.data); + // navigate("/reciever/agencylogin"); + // } catch (error) { + // console.error("회원가입 오류:", error); + // } + navigate("/reciever/agencylogin"); + }; + + return ( +
+
+
+
복지관 회원가입
+
인증을 통해 참고서를 지원받으세요
+
+
+ setRegNum(e.target.value)} + /> + setEmail(e.target.value)} + /> + setId(e.target.value)} + /> + setPassword(e.target.value)} + /> + setCheckPassword(e.target.value)} + /> + setName(e.target.value)} + /> + + +
+ ); +}; + +export default AgencySignUp; diff --git a/src/pages/reciever/bookinfo.js b/src/pages/reciever/bookinfo.js new file mode 100644 index 0000000..8de379e --- /dev/null +++ b/src/pages/reciever/bookinfo.js @@ -0,0 +1,58 @@ +import React, { useState, useEffect } from "react"; +import { useLocation } from "react-router-dom"; +import axios from "axios"; +import queryString from "query-string"; +import { Link } from "react-router-dom"; +import Header from "../../components/Layout/Header"; +import "../../styles/bookinfo.css"; + +const BookInfo = () => { + const location = useLocation(); + const { title, curriculum, subject, publisher, outsideImageUrl } = + location.state || {}; + return ( +
+
+
정보 세부보기
+ bookImg +
+
+ {title} / {subject} +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
교과 과정{curriculum}
출판사{publisher}
필기 도구연필/샤프
필기 상태깨끗함
보존 상태겉표지 깨끗함
+
+
+
+ + + +
+
+ ); +}; + +export default BookInfo; diff --git a/src/pages/reciever/booklist.js b/src/pages/reciever/booklist.js new file mode 100644 index 0000000..7a2ccc2 --- /dev/null +++ b/src/pages/reciever/booklist.js @@ -0,0 +1,122 @@ +import React, { useState, useEffect } from "react"; +import BookStatus from "../../components/BookStatus"; +import axios from "axios"; +import Header from "../../components/Layout/Header"; +import "../../styles/booklist.css"; + +const BookList = () => { + const [allBooks, setAllBooks] = useState([ + { + outsideImageUrl: "/example1.png", + title: "쎈", + subject: "수학", + curriculum: "초등", + publisher: "한빛출판사", + }, + { + bookId: 9, + outsideImageUrl: "/example2.jpg", + title: "하이탑", + subject: "과학", + curriculum: "중등", + publisher: "하이탑출판사", + }, + { + bookId: 8, + outsideImageUrl: "/example3.jpg", + title: "국치독", + subject: "국어", + curriculum: "고등", + publisher: "유대종출판사", + }, + { + bookId: 7, + outsideImageUrl: "/example4.jpg", + title: "경선식영단어", + subject: "영어", + curriculum: "고등", + publisher: "한빛출판사", + }, + { + bookId: 6, + outsideImageUrl: "/example5.jpg", + title: "삼국지", + subject: "한국사", + curriculum: "초등", + publisher: "중국출판사", + }, + ]); + const [books, setBooks] = useState([]); + const [curriculum, setCurriculum] = useState("모든 교육 과정"); + const [subject, setSubject] = useState("모든 과목"); + + useEffect(() => { + // 전체 책 목록에서 필터링 + let filteredBooks = allBooks; + if (curriculum !== "모든 교육 과정") { + filteredBooks = filteredBooks.filter( + (book) => book.curriculum === curriculum + ); + } + if (subject !== "모든 과목") { + filteredBooks = filteredBooks.filter((book) => book.subject === subject); + } + + setBooks(filteredBooks); + }, [curriculum, subject]); // curriculum과 subject가 바뀔 때마다 실행 + + const handleCurriculumChange = (event) => { + setCurriculum(event.target.value); + }; + + const handleSubjectChange = (event) => { + setSubject(event.target.value); + }; + + return ( +
+
+
목록
+
+ + +
+
+ {books.map((book) => ( + + ))} +
+
+ ); +}; + +export default BookList; diff --git a/src/pages/reciever/finish.js b/src/pages/reciever/finish.js new file mode 100644 index 0000000..63b3199 --- /dev/null +++ b/src/pages/reciever/finish.js @@ -0,0 +1,20 @@ +import { Link } from "react-router-dom"; +import "../../styles/finish.css"; +import giftBoxImg from "../../assets/giftbox_blue.png"; + +const Finish = () => { + return ( +
+

신청 완료!

+
+ 사용자에게 메일로 정보가 발송됩니다. +
+ + + + Gift Box +
+ ); +}; + +export default Finish; diff --git a/src/pages/reciever/searchbooklist.js b/src/pages/reciever/searchbooklist.js new file mode 100644 index 0000000..0c487bf --- /dev/null +++ b/src/pages/reciever/searchbooklist.js @@ -0,0 +1,32 @@ +import React from "react"; +import { useLocation } from "react-router-dom"; +import Header from "../../components/Layout/Header"; +import BookStatus from "../../components/BookStatus"; + +const SearchBookList = () => { + const location = useLocation(); + const books = location.state?.books; + return ( +
+
+
목록
+ {books.map((book) => ( + + ))} + + + + + +
+ ); +}; + +export default SearchBookList; diff --git a/src/pages/reciever/searchbooks.js b/src/pages/reciever/searchbooks.js new file mode 100644 index 0000000..113b686 --- /dev/null +++ b/src/pages/reciever/searchbooks.js @@ -0,0 +1,48 @@ +import { useState } from "react"; +import "../../components/InputField2"; +import InputField2 from "../../components/InputField2"; +import "../../components/Layout/Header"; +import Header from "../../components/Layout/Header"; +import { Navigate, useNavigate } from "react-router"; +import axios from "axios"; + +const SearchBooks = () => { + const navigate = useNavigate; + const [publisher, setPublisher] = useState(""); + const [title, setTitle] = useState(""); + const handleSubmit = async (e) => { + e.preventDefault(); + + try { + const response = await axios.get( + `/book?title=${title}&publisher=${publisher}` + ); + const books = response.data; + navigate("/reciever/searchbooklist", { state: { books } }); + } catch (error) { + console.error("불러올 수 없음 :", error); + } + }; + return ( +
+
+
+ setPublisher(e.target.value)} + > + setTitle(e.target.value)} + > + +
+
+ ); +}; + +export default SearchBooks; diff --git a/src/styles/agencylogin.css b/src/styles/agencylogin.css new file mode 100644 index 0000000..d5489bf --- /dev/null +++ b/src/styles/agencylogin.css @@ -0,0 +1,60 @@ +.login-container { + display: flex; + flex-direction: column; + align-items: center; + + height: 100vh; + background-color: #fff; +} + +.header-login { + margin-top: 100px; + text-align: center; + padding-bottom: 40px; +} + +.title { + color: #000; + text-align: center; + font-family: Noto Sans KR; + font-size: 48px; + font-style: normal; + font-weight: 900; +} + +.subtitle { + color: #000; + font-family: Noto Sans KR; + font-size: 16px; + font-style: normal; + font-weight: 700; +} + +.form { + width: 100%; + max-width: 400px; + margin: 20px; +} + +.input-field { + width: 95%; + height: 50px; + padding: 10px; + margin-bottom: 10px; + border: 1px solid #ccc; + border-radius: 5px; +} + +.sign-in-button, +.sign-up-button { + width: 100%; + height: 60px; + padding: 10px; + margin-top: 20px; + border: none; + border-radius: 5px; + color: #fff; + background-color: #367aff; + cursor: pointer; + font-size: 20px; +} diff --git a/src/styles/agencysignup.css b/src/styles/agencysignup.css new file mode 100644 index 0000000..50f4c21 --- /dev/null +++ b/src/styles/agencysignup.css @@ -0,0 +1,33 @@ +.agencysignup-container { + height: 100vh; + background-image: url("../assets/background.png"); + background-size: cover; +} +.agencysignup-header { + padding: 40px; + color: white; +} +.agencysignup-header :first-child { + color: #fff; + font-family: Inter; + font-size: 25px; + font-style: normal; + font-weight: 800; + line-height: normal; + padding-bottom: 10px; +} + +.signup-submit { + color: white; + border-radius: 20px; + border: none; + background: #5297ff; + height: 70px; + width: 250px; + font-weight: bold; + font-size: x-large; + display: block; + margin-left: auto; + margin-right: auto; + margin-top: 30px; +} diff --git a/src/styles/bookinfo.css b/src/styles/bookinfo.css new file mode 100644 index 0000000..68b36a0 --- /dev/null +++ b/src/styles/bookinfo.css @@ -0,0 +1,65 @@ +.bookinfo-container { + display: flex; + flex-direction: column; + align-items: center; + text-align: center; +} + +.header-info { + width: 100%; + height: 100%; + text-align: center; + color: black; + font-size: 25px; + font-family: "Noto Sans KR"; + font-weight: 700; + word-wrap: break-word; + padding: 20px; +} + +.bookImg { + margin: auto; + width: 200px; + height: 280px; +} + +.bookTitle { + width: 100%; + height: 100%; + text-align: left; + color: black; + font-size: 24px; + font-family: "Noto Sans KR"; + font-weight: 900; + padding: 15px; + border-bottom: solid 1px; +} + +.bookTable { + width: 400px; + font-size: 20px; +} + +.bookTable td { + text-align: left; + font-weight: 800; + padding: 10px; +} + +.bookTable td:nth-of-type(2) { + font-weight: 400; +} + +.applyButton { + width: 300px; + height: 56px; + background: #5297ff; + border-radius: 20px; + border: none; + justify-content: center; + align-items: center; + color: white; + font-weight: 700; + font-size: 24px; + margin-top: 30px; +} diff --git a/src/styles/booklist.css b/src/styles/booklist.css new file mode 100644 index 0000000..8da6be2 --- /dev/null +++ b/src/styles/booklist.css @@ -0,0 +1,29 @@ +.header-list { + width: 100%; + height: 100%; + text-align: center; + color: black; + font-size: 30px; + font-family: "Noto Sans KR"; + font-weight: 700; + padding-top: 20px; + padding-bottom: 20px; +} +.select { + display: flex; + justify-content: center; +} +.select-curriculum, +.select-subject { + padding: 5px; + font-weight: 900; + font-size: large; +} + +.select-subject { + margin-left: 40px; +} + +.booklist { + padding-top: 20px; +} diff --git a/src/styles/finish.css b/src/styles/finish.css new file mode 100644 index 0000000..8bc1e2e --- /dev/null +++ b/src/styles/finish.css @@ -0,0 +1,52 @@ +.finish-container { + background-image: url("../assets/background.png"); + width: 100%; + height: 100vh; + background-size: cover; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + text-align: center; + color: white; +} + +.header-finish { + width: 100%; + height: 100%; + text-align: center; + color: white; + font-size: 30px; + font-family: "Noto Sans KR"; + font-weight: 900; + word-wrap: break-word; + margin-top: 100px; +} + +.finish-subHeader { + width: 100%; + height: 100%; + text-align: center; + color: white; + font-size: 20px; + font-family: "Noto Sans KR"; + font-weight: 500; + word-wrap: break-word; +} + +.toListBtn { + color: black; + font-size: 16px; + font-family: "Noto Sans KR"; + font-weight: 700; + width: 200px; + height: 50px; + border-radius: 5%; + border: none; + word-wrap: break-word; +} + +.giftboxImg { + width: 400px; + height: auto; +} diff --git a/src/styles/inputfield.css b/src/styles/inputfield.css new file mode 100644 index 0000000..1c53c37 --- /dev/null +++ b/src/styles/inputfield.css @@ -0,0 +1,32 @@ +.inputfield-container { + margin-left: 20px; + margin-top: 30px; +} + +.textinputfield-container { + margin-left: 20px; + margin-top: 30px; +} + + +.input-label { + color: white; + font-family: Inter; + font-size: 15px; + font-style: normal; + font-weight: 600; + line-height: normal; + margin: 10px; +} + +.signup-input { + width: 90%; + height: 30px; + border-radius: 20px; + border: none; + padding-left: 20px; +} + +.signup-input::placeholder { + color: transparent; +}