From d0940e0509f7ebd55edefa72bce1f3e3087e1ca4 Mon Sep 17 00:00:00 2001 From: Christian Landgren Date: Mon, 5 Jun 2023 15:56:11 +0200 Subject: [PATCH 1/6] feat: add socket api --- api/server.js | 52 ++++++++++ package-lock.json | 258 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 3 +- 3 files changed, 311 insertions(+), 2 deletions(-) create mode 100644 api/server.js diff --git a/api/server.js b/api/server.js new file mode 100644 index 0000000..b6ca7c8 --- /dev/null +++ b/api/server.js @@ -0,0 +1,52 @@ +const port = process.env.PORT || 3000 +const io = require('socket.io')(port) +const state = {} + +const reset = () => { + state.buyers = require('../src/data/buyers') + state.suppliers = require('../src/data/suppliers') + state.deals = require('../src/data/deals') + state.tenderRequests = require('../src/data/tenderRequests') + state.categories = require('../src/data/categories') + return state +} + +// either provide socket or io - if you provide io then it will send to all sockets +const sync = (socket) => { + socket.emit('deals', state.deals) + socket.emit('tenderRequests', state.tenderRequests) + socket.emit('suppliers', state.suppliers) + socket.emit('buyers', state.buyers) +} + +io.on('connection', (socket) => { + console.log('a user connected') + sync(socket) // send initial state + socket.on('reset', () => reset() && sync(io)) + + // DEALS + socket.on('addDeal', (deal) => { + state.deals.push(deal) + io.emit('deals', state.deals) + }) + + socket.on('editDeal', (deal) => { + const index = state.deals.findIndex((d) => d.id === deal.id) + state.deals[index] = deal + io.emit('deals', state.deals) + }) + + // TENDER REQUESTS + socket.on('addTenderRequest', (tenderRequest) => { + state.tenderRequests.push(tenderRequest) + io.emit('tenderRequests', state.tenderRequests) + }) + + socket.on('editTenderRequest', (tenderRequest) => { + const index = state.tenderRequests.findIndex( + (d) => d.id === tenderRequest.id + ) + state.tenderRequests[index] = tenderRequest + io.emit('tenderRequests', state.tenderRequests) + }) +}) diff --git a/package-lock.json b/package-lock.json index 0b5e017..9b2c175 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,8 @@ "react-native-reanimated": "~2.14.4", "react-native-safe-area-context": "^4.5.3", "react-native-web": "~0.18.10", - "react-navigation-header-buttons": "^10.0.0" + "react-navigation-header-buttons": "^10.0.0", + "socket.io": "^4.6.2" }, "devDependencies": { "@babel/core": "^7.20.0", @@ -5179,6 +5180,11 @@ "@sinonjs/commons": "^2.0.0" } }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + }, "node_modules/@trysound/sax": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", @@ -5221,6 +5227,19 @@ "@types/node": "*" } }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "node_modules/@types/cors": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/eslint": { "version": "8.37.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz", @@ -6275,6 +6294,14 @@ } ] }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -7474,6 +7501,18 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/cosmiconfig": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", @@ -8236,6 +8275,62 @@ "once": "^1.4.0" } }, + "node_modules/engine.io": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", + "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.11.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.7.tgz", + "integrity": "sha512-P+jDFbvK6lE3n1OL+q9KuzdOFWkkZ/cMV9gol/SbVfpyqfvrfrFTOFJ6fQm2VC3PZHlU3QPhVwmbsCnauHF2MQ==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/enhanced-resolve": { "version": "5.14.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", @@ -16142,6 +16237,62 @@ "node": ">=0.10.0" } }, + "node_modules/socket.io": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.2.tgz", + "integrity": "sha512-Vp+lSks5k0dewYTfwgPT9UeGGd+ht7sCpB7p0e83VgO4X/AHYWhXITMrNk/pg8syY2bpx23ptClCQuHhqi2BgQ==", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.4.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "dependencies": { + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -22152,6 +22303,11 @@ "@sinonjs/commons": "^2.0.0" } }, + "@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + }, "@trysound/sax": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", @@ -22191,6 +22347,19 @@ "@types/node": "*" } }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "@types/cors": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "requires": { + "@types/node": "*" + } + }, "@types/eslint": { "version": "8.37.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz", @@ -23067,6 +23236,11 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -23968,6 +24142,15 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "cosmiconfig": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", @@ -24509,6 +24692,41 @@ "once": "^1.4.0" } }, + "engine.io": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", + "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", + "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.11.0" + }, + "dependencies": { + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + }, + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "requires": {} + } + } + }, + "engine.io-parser": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.7.tgz", + "integrity": "sha512-P+jDFbvK6lE3n1OL+q9KuzdOFWkkZ/cMV9gol/SbVfpyqfvrfrFTOFJ6fQm2VC3PZHlU3QPhVwmbsCnauHF2MQ==" + }, "enhanced-resolve": { "version": "5.14.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", @@ -30464,6 +30682,44 @@ } } }, + "socket.io": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.2.tgz", + "integrity": "sha512-Vp+lSks5k0dewYTfwgPT9UeGGd+ht7sCpB7p0e83VgO4X/AHYWhXITMrNk/pg8syY2bpx23ptClCQuHhqi2BgQ==", + "requires": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.4.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + } + }, + "socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "requires": { + "ws": "~8.11.0" + }, + "dependencies": { + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "requires": {} + } + } + }, + "socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + } + }, "sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", diff --git a/package.json b/package.json index a5e2cd3..c1c4495 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,8 @@ "react-native-reanimated": "~2.14.4", "react-native-safe-area-context": "^4.5.3", "react-native-web": "~0.18.10", - "react-navigation-header-buttons": "^10.0.0" + "react-navigation-header-buttons": "^10.0.0", + "socket.io": "^4.6.2" }, "devDependencies": { "@babel/core": "^7.20.0", From aceb5d27c2fab23cad9c592cf8fe86e0c0c267ce Mon Sep 17 00:00:00 2001 From: Christian Landgren Date: Mon, 5 Jun 2023 17:23:21 +0200 Subject: [PATCH 2/6] feat: add socket-io as hooks --- api/{server.js => server.ts} | 37 ++- package-lock.json | 592 ++++++++++++++++++++++++++++++++++- package.json | 5 +- src/App.tsx | 16 +- src/SupplierNavigation.tsx | 1 - src/components/Deals.tsx | 19 +- src/context/socketContext.js | 14 + src/data/buyers.ts | 10 +- src/data/deals.ts | 45 ++- src/hooks/useDeal.ts | 24 ++ 10 files changed, 735 insertions(+), 28 deletions(-) rename api/{server.js => server.ts} (62%) create mode 100644 src/context/socketContext.js create mode 100644 src/hooks/useDeal.ts diff --git a/api/server.js b/api/server.ts similarity index 62% rename from api/server.js rename to api/server.ts index b6ca7c8..75a6075 100644 --- a/api/server.js +++ b/api/server.ts @@ -1,18 +1,39 @@ +import { Server } from 'socket.io' +import express from 'express' +import { createServer } from 'http' + +import buyers from '../src/data/buyers' +import deals from '../src/data/deals' +import tenderRequests from '../src/data/tenderRequests' const port = process.env.PORT || 3000 -const io = require('socket.io')(port) -const state = {} +const app = express() +const server = createServer(app) +const io = new Server(server) + +server.listen(port, () => { + console.log(`listening on *:${port}`) +}) + +const state = { + buyers: buyers, + deals: deals, + tenderRequests: tenderRequests, + suppliers: [], + categories: [], +} const reset = () => { - state.buyers = require('../src/data/buyers') - state.suppliers = require('../src/data/suppliers') - state.deals = require('../src/data/deals') + state.buyers = buyers + state.deals = deals + /* state.suppliers = require('../src/data/suppliers') state.tenderRequests = require('../src/data/tenderRequests') - state.categories = require('../src/data/categories') + state.categories = require('../src/data/categories')*/ return state } // either provide socket or io - if you provide io then it will send to all sockets -const sync = (socket) => { +const sync = (socket: any) => { + console.log('syncing', state.deals.length, 'deals') socket.emit('deals', state.deals) socket.emit('tenderRequests', state.tenderRequests) socket.emit('suppliers', state.suppliers) @@ -50,3 +71,5 @@ io.on('connection', (socket) => { io.emit('tenderRequests', state.tenderRequests) }) }) + +reset() diff --git a/package-lock.json b/package-lock.json index 9b2c175..f0ff9be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,13 +30,16 @@ "react-native-safe-area-context": "^4.5.3", "react-native-web": "~0.18.10", "react-navigation-header-buttons": "^10.0.0", - "socket.io": "^4.6.2" + "socket.io": "^4.6.2", + "socket.io-react-hook": "^2.4.1" }, "devDependencies": { "@babel/core": "^7.20.0", "@types/react": "~18.0.14", "@types/react-native": "^0.72.0", "gh-pages": "^5.0.0", + "nodemon": "^2.0.22", + "ts-node": "^10.9.1", "typescript": "^4.9.4" } }, @@ -1822,6 +1825,28 @@ "react": ">=16.3.0" } }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@egjs/hammerjs": { "version": "2.0.17", "resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz", @@ -5193,6 +5218,30 @@ "node": ">=10.13.0" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, "node_modules/@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -5639,6 +5688,12 @@ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -5686,6 +5741,15 @@ "acorn": "^8" } }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -7536,6 +7600,12 @@ "object-assign": "^4.1.1" } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "node_modules/cross-fetch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", @@ -8135,6 +8205,15 @@ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -8295,6 +8374,38 @@ "node": ">=10.0.0" } }, + "node_modules/engine.io-client": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.4.0.tgz", + "integrity": "sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.11.0", + "xmlhttprequest-ssl": "~2.0.0" + } + }, + "node_modules/engine.io-client/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/engine.io-parser": { "version": "5.0.7", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.7.tgz", @@ -10512,6 +10623,12 @@ "node": ">= 4" } }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, "node_modules/image-size": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.6.3.tgz", @@ -12140,6 +12257,12 @@ "semver": "bin/semver" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -13468,6 +13591,67 @@ "url": "https://github.com/sponsors/antelle" } }, + "node_modules/nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, "node_modules/normalize-css-color": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/normalize-css-color/-/normalize-css-color-1.0.2.tgz", @@ -13884,6 +14068,11 @@ "node": ">=10" } }, + "node_modules/parseuri": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -14781,6 +14970,12 @@ "node": ">= 0.10" } }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -16023,6 +16218,27 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -16281,6 +16497,28 @@ } } }, + "node_modules/socket.io-client": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.6.2.tgz", + "integrity": "sha512-OwWrMbbA8wSqhBAR0yoPK6EdQLERQAYjXb3A0zLpgxfM1ZGLKoxHx8gVmCHA6pcclRX5oA/zvQf7bghAS11jRA==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.4.0", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-mock": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/socket.io-mock/-/socket.io-mock-1.3.2.tgz", + "integrity": "sha512-p4MQBue3NAR8bXIHynRJxK/C+J3I3NpnnpgjptgLFSWv4u9Bdkubf2t0GCmyLmUTi03up0Cx/hQwzQfOpD187g==", + "dependencies": { + "component-emitter": "^1.3.0" + } + }, "node_modules/socket.io-parser": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", @@ -16293,6 +16531,19 @@ "node": ">=10.0.0" } }, + "node_modules/socket.io-react-hook": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/socket.io-react-hook/-/socket.io-react-hook-2.4.1.tgz", + "integrity": "sha512-ufiFxpA3CsiSkQek3qpcSnV/13Po2k2nnJeodewUfgHZUENKe+/qVk9xkVSlcwxxSjMz8TRkVG9oANRGsvGR7w==", + "dependencies": { + "parseuri": "0.0.6", + "socket.io-client": "^4.5.3", + "socket.io-mock": "^1.3.2" + }, + "peerDependencies": { + "react": "*" + } + }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -17256,6 +17507,18 @@ "node": ">=0.6" } }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -17286,6 +17549,49 @@ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, "node_modules/tslib": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", @@ -17382,6 +17688,12 @@ "node": ">=0.10.0" } }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -17656,6 +17968,12 @@ "uuid": "bin/uuid" } }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "node_modules/valid-url": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", @@ -18401,6 +18719,14 @@ "node": ">=8.0" } }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -18524,6 +18850,15 @@ "node": ">=8" } }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -19721,6 +20056,27 @@ "hoist-non-react-statics": "^3.3.0" } }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, "@egjs/hammerjs": { "version": "2.0.17", "resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz", @@ -22313,6 +22669,30 @@ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, "@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -22750,6 +23130,12 @@ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, "abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -22783,6 +23169,12 @@ "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "requires": {} }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -24171,6 +24563,12 @@ "object-assign": "^4.1.1" } }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "cross-fetch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", @@ -24582,6 +24980,12 @@ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -24722,6 +25126,26 @@ } } }, + "engine.io-client": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.4.0.tgz", + "integrity": "sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==", + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.11.0", + "xmlhttprequest-ssl": "~2.0.0" + }, + "dependencies": { + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "requires": {} + } + } + }, "engine.io-parser": { "version": "5.0.7", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.7.tgz", @@ -26369,6 +26793,12 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, "image-size": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.6.3.tgz", @@ -27594,6 +28024,12 @@ } } }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -28635,6 +29071,50 @@ "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==" }, + "nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, "normalize-css-color": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/normalize-css-color/-/normalize-css-color-1.0.2.tgz", @@ -28940,6 +29420,11 @@ "pngjs": "^3.3.0" } }, + "parseuri": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -29539,6 +30024,12 @@ "ipaddr.js": "1.9.1" } }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -30512,6 +31003,23 @@ } } }, + "simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "requires": { + "semver": "~7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -30711,6 +31219,25 @@ } } }, + "socket.io-client": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.6.2.tgz", + "integrity": "sha512-OwWrMbbA8wSqhBAR0yoPK6EdQLERQAYjXb3A0zLpgxfM1ZGLKoxHx8gVmCHA6pcclRX5oA/zvQf7bghAS11jRA==", + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.4.0", + "socket.io-parser": "~4.2.4" + } + }, + "socket.io-mock": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/socket.io-mock/-/socket.io-mock-1.3.2.tgz", + "integrity": "sha512-p4MQBue3NAR8bXIHynRJxK/C+J3I3NpnnpgjptgLFSWv4u9Bdkubf2t0GCmyLmUTi03up0Cx/hQwzQfOpD187g==", + "requires": { + "component-emitter": "^1.3.0" + } + }, "socket.io-parser": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", @@ -30720,6 +31247,16 @@ "debug": "~4.3.1" } }, + "socket.io-react-hook": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/socket.io-react-hook/-/socket.io-react-hook-2.4.1.tgz", + "integrity": "sha512-ufiFxpA3CsiSkQek3qpcSnV/13Po2k2nnJeodewUfgHZUENKe+/qVk9xkVSlcwxxSjMz8TRkVG9oANRGsvGR7w==", + "requires": { + "parseuri": "0.0.6", + "socket.io-client": "^4.5.3", + "socket.io-mock": "^1.3.2" + } + }, "sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -31438,6 +31975,15 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + } + }, "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -31462,6 +32008,27 @@ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + } + }, "tslib": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", @@ -31518,6 +32085,12 @@ } } }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -31724,6 +32297,12 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "valid-url": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", @@ -32259,6 +32838,11 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-14.0.0.tgz", "integrity": "sha512-ts+B2rSe4fIckR6iquDjsKbQFK2NlUk6iG5nf14mDEyldgoc2nEKZ3jZWMPTxGQwVgToSjt6VGIho1H8/fNFTg==" }, + "xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==" + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -32353,6 +32937,12 @@ } } }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index c1c4495..c7e296e 100644 --- a/package.json +++ b/package.json @@ -34,13 +34,16 @@ "react-native-safe-area-context": "^4.5.3", "react-native-web": "~0.18.10", "react-navigation-header-buttons": "^10.0.0", - "socket.io": "^4.6.2" + "socket.io": "^4.6.2", + "socket.io-react-hook": "^2.4.1" }, "devDependencies": { "@babel/core": "^7.20.0", "@types/react": "~18.0.14", "@types/react-native": "^0.72.0", "gh-pages": "^5.0.0", + "nodemon": "^2.0.22", + "ts-node": "^10.9.1", "typescript": "^4.9.4" }, "private": true diff --git a/src/App.tsx b/src/App.tsx index 7da8a0a..e0c3415 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -4,14 +4,18 @@ import { SafeAreaProvider } from 'react-native-safe-area-context' import Navigation from './RootNavigation' import { NavigationContainer } from '@react-navigation/native' import { useTheme } from 'react-native-paper' +import { SocketProvider } from './context/socketContext' + export default function App() { const theme = useTheme() return ( - - - - - - + + + + + + + + ) } diff --git a/src/SupplierNavigation.tsx b/src/SupplierNavigation.tsx index 4271a14..2af459e 100644 --- a/src/SupplierNavigation.tsx +++ b/src/SupplierNavigation.tsx @@ -89,7 +89,6 @@ const SupplierProfileNavigation = () => { const SupplierNavigation = () => { const theme = useTheme() const Tab = createMaterialBottomTabNavigator() - const theme = useTheme() return ( { const [expanded, setExpanded] = React.useState({}) const [searchQuery, setSearchQuery] = React.useState('') - const filteredDeals = deals.filter((deal) => - deal.product.name.toLowerCase().includes(searchQuery.toLowerCase()) - ) + + const [deals] = useDeals() + + if (!deals) return Loading... + + const filteredDeals = + (!searchQuery && deals) || + deals.filter((deal: Deal) => + deal.product.name.toLowerCase().includes(searchQuery.toLowerCase()) + ) const activeAreas: { [key: string]: Area } = Object.entries(areas).reduce( (result, [key, area]) => diff --git a/src/context/socketContext.js b/src/context/socketContext.js new file mode 100644 index 0000000..5179d71 --- /dev/null +++ b/src/context/socketContext.js @@ -0,0 +1,14 @@ +// SocketContext.js +import React, { createContext } from 'react' +import io from 'socket.io-client' + +export const SocketContext = createContext() + +export const SocketProvider = ({ children }) => { + const socket = io('http://localhost:3000') + socket.emit('reset') + + return ( + {children} + ) +} diff --git a/src/data/buyers.ts b/src/data/buyers.ts index db013f8..e729556 100644 --- a/src/data/buyers.ts +++ b/src/data/buyers.ts @@ -1,8 +1,8 @@ -import image3 from '../../assets/avatars/Image003.png' -import image4 from '../../assets/avatars/Image004.png' -import image5 from '../../assets/avatars/Image005.png' -import image6 from '../../assets/avatars/Image006.png' -import image7 from '../../assets/avatars/Image007.png' +const image3 = '/assets/avatars/Image003.png' +const image4 = '/assets/avatars/Image004.png' +const image5 = '/assets/avatars/Image005.png' +const image6 = '/assets/avatars/Image006.png' +const image7 = '/assets/avatars/Image007.png' export default [ { diff --git a/src/data/deals.ts b/src/data/deals.ts index 34dd427..af47ac1 100644 --- a/src/data/deals.ts +++ b/src/data/deals.ts @@ -1,3 +1,46 @@ +export type Deal = { + id: number + procurement: string + positionNo: string + commodity: { + area: string + mainGroup: string + group: string + } + supplier: { + name: string + artNo: string + } + product: { + name: string + manufacturer: string + brand: string + content: { + quantity: number + unit: string + } + } + price: { + SEK: number + kilos: number + SEK_per_Kg: number + finalAmountSEK_per_Kg: number + percentageOutsideContract: number + } + certifications: { + organic: boolean + MSC: boolean + kravMarked: boolean + ethical: boolean + fairtrade: boolean + locallyProduced: boolean + } + origin: { + productManufacturingCountry: string + rawMaterialOriginCountry: string + } +} + export default [ { id: 4, @@ -5165,4 +5208,4 @@ export default [ rawMaterialOriginCountry: 'Uppgift saknas', }, }, -] +] as Deal[] diff --git a/src/hooks/useDeal.ts b/src/hooks/useDeal.ts new file mode 100644 index 0000000..4ab01b9 --- /dev/null +++ b/src/hooks/useDeal.ts @@ -0,0 +1,24 @@ +import { useContext, useEffect, useState } from 'react' +import { SocketContext } from '../context/socketContext' +import { Deal } from '../data/deals' + +const useDeals = () => { + const socket = useContext(SocketContext) + const [deals, setDeals] = useState([] as Deal[]) + + useEffect(() => { + socket.on('deals', setDeals) + + return () => { + socket.off('deals') + } + }, [socket]) + + const updateDeal = (deal: Deal) => { + socket.emit('editDeal', deal) + } + + return [deals, updateDeal] +} + +export default useDeals From 2327a92337962ee3869f6111b7d46088980e14dd Mon Sep 17 00:00:00 2001 From: Christian Landgren Date: Mon, 5 Jun 2023 17:37:13 +0200 Subject: [PATCH 3/6] feat: add tenderRequests --- api/server.ts | 8 +++++- src/components/Deals.tsx | 4 +-- src/components/TenderRequests.tsx | 11 ++++++-- .../{tenderRequests.js => tenderRequests.ts} | 9 +++++- src/hooks/{useDeal.ts => useDeals.ts} | 0 src/hooks/useTenderRequests.ts | 28 +++++++++++++++++++ 6 files changed, 53 insertions(+), 7 deletions(-) rename src/data/{tenderRequests.js => tenderRequests.ts} (80%) rename src/hooks/{useDeal.ts => useDeals.ts} (100%) create mode 100644 src/hooks/useTenderRequests.ts diff --git a/api/server.ts b/api/server.ts index 75a6075..deca911 100644 --- a/api/server.ts +++ b/api/server.ts @@ -33,7 +33,13 @@ const reset = () => { // either provide socket or io - if you provide io then it will send to all sockets const sync = (socket: any) => { - console.log('syncing', state.deals.length, 'deals') + console.log( + 'syncing', + state.deals.length, + 'deals', + state.tenderRequests.length, + 'tenderRequests' + ) socket.emit('deals', state.deals) socket.emit('tenderRequests', state.tenderRequests) socket.emit('suppliers', state.suppliers) diff --git a/src/components/Deals.tsx b/src/components/Deals.tsx index 6102be9..1491432 100644 --- a/src/components/Deals.tsx +++ b/src/components/Deals.tsx @@ -19,7 +19,7 @@ import { } from 'react-native-paper/lib/typescript/src/components/List/List' import { TouchableOpacity } from 'react-native-gesture-handler' import Chat from './Chat' -import useDeals from '../hooks/useDeal' +import useDeals from '../hooks/useDeals.ts' interface Area { image: string @@ -31,7 +31,7 @@ const Deals = ({ navigation }: { navigation: any }) => { const [expanded, setExpanded] = React.useState({}) const [searchQuery, setSearchQuery] = React.useState('') - const [deals] = useDeals() + const [deals, addDeal] = useDeals() if (!deals) return Loading... diff --git a/src/components/TenderRequests.tsx b/src/components/TenderRequests.tsx index d24416c..145a274 100644 --- a/src/components/TenderRequests.tsx +++ b/src/components/TenderRequests.tsx @@ -15,6 +15,7 @@ import { Alert, ScrollView, StyleSheet, View } from 'react-native' import { StatusBar } from 'expo-status-bar' import tenderRequests from '../data/tenderRequests' import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons' +import useTenderRequests from '../hooks/useTenderRequests' const ChevronRight = () => ( { const [searchQuery, setSearchQuery] = React.useState('') const [open, setOpen] = React.useState(true) - const filteredRequests = tenderRequests.filter((request) => - request.title.toLowerCase().includes(searchQuery.toLowerCase()) - ) + const [tenderRequests] = useTenderRequests() + + const filteredRequests = + (!searchQuery && tenderRequests) || + tenderRequests.filter((request) => + request.title.toLowerCase().includes(searchQuery.toLowerCase()) + ) // const handleCheckboxChange = (key) => { // setCheckboxStatus((prevState: any) => ({ diff --git a/src/data/tenderRequests.js b/src/data/tenderRequests.ts similarity index 80% rename from src/data/tenderRequests.js rename to src/data/tenderRequests.ts index cebc6df..a234f61 100644 --- a/src/data/tenderRequests.js +++ b/src/data/tenderRequests.ts @@ -3,6 +3,13 @@ // subtitle: vilken är organisationen, t ex skolmatsalen // image: bild på vad som ska upphandlas +export type TenderRequest = { + id: number + title: string + buyer: string + image?: string +} + export default [ { id: 1, @@ -21,4 +28,4 @@ export default [ buyer: 'Abrahamsbergsskolan', image: 'https://picsum.photos/700', }, -] +] as TenderRequest[] diff --git a/src/hooks/useDeal.ts b/src/hooks/useDeals.ts similarity index 100% rename from src/hooks/useDeal.ts rename to src/hooks/useDeals.ts diff --git a/src/hooks/useTenderRequests.ts b/src/hooks/useTenderRequests.ts new file mode 100644 index 0000000..0469307 --- /dev/null +++ b/src/hooks/useTenderRequests.ts @@ -0,0 +1,28 @@ +import { useContext, useEffect, useState } from 'react' +import { SocketContext } from '../context/socketContext' +import { TenderRequest } from '../data/tenderRequests' + +const useTenderRequests = () => { + const socket = useContext(SocketContext) + const [tenderRequests, setTenderRequests] = useState([] as TenderRequest[]) + + useEffect(() => { + socket.on('tenderRequests', setTenderRequests) + + return () => { + socket.off('tenderRequests') + } + }, [socket]) + + const updateTenderRequest = (tenderRequest: TenderRequest) => { + socket.emit('editTenderRequest', tenderRequest) + } + + const addTenderRequest = (tenderRequest: TenderRequest) => { + socket.emit('addTenderRequest', tenderRequest) + } + + return [tenderRequests, updateTenderRequest, addTenderRequest] +} + +export default useTenderRequests From f27d092319fee528ca04315685bf6c113f09e27d Mon Sep 17 00:00:00 2001 From: Christian Landgren Date: Fri, 9 Jun 2023 10:40:28 +0200 Subject: [PATCH 4/6] chore: working connection between client and server --- api/server.ts | 26 +++++++++++++++----------- src/components/Chat.tsx | 8 ++++++-- src/components/Deals.tsx | 17 +++++++++++------ src/components/TenderRequests.tsx | 6 +++++- src/hooks/useDeals.ts | 14 +++++++++++--- src/hooks/useTenderRequests.ts | 16 +++++++++++----- 6 files changed, 59 insertions(+), 28 deletions(-) diff --git a/api/server.ts b/api/server.ts index deca911..9105c7d 100644 --- a/api/server.ts +++ b/api/server.ts @@ -15,21 +15,21 @@ server.listen(port, () => { }) const state = { - buyers: buyers, + buyers: [], deals: deals, tenderRequests: tenderRequests, suppliers: [], categories: [], } -const reset = () => { - state.buyers = buyers - state.deals = deals - /* state.suppliers = require('../src/data/suppliers') - state.tenderRequests = require('../src/data/tenderRequests') - state.categories = require('../src/data/categories')*/ - return state -} +const reset = () => + Object.assign(state, { + buyers: buyers, + deals: deals, + tenderRequests: tenderRequests, + suppliers: [], + categories: [], + }) // either provide socket or io - if you provide io then it will send to all sockets const sync = (socket: any) => { @@ -40,7 +40,6 @@ const sync = (socket: any) => { state.tenderRequests.length, 'tenderRequests' ) - socket.emit('deals', state.deals) socket.emit('tenderRequests', state.tenderRequests) socket.emit('suppliers', state.suppliers) socket.emit('buyers', state.buyers) @@ -48,9 +47,14 @@ const sync = (socket: any) => { io.on('connection', (socket) => { console.log('a user connected') - sync(socket) // send initial state socket.on('reset', () => reset() && sync(io)) + socket.on('deals', () => socket.emit('deals', state.deals)) + socket.on('buyers', () => socket.emit('buyers', state.buyers)) + socket.on('tenderRequests', () => + socket.emit('tenderRequests', state.tenderRequests) + ) + // DEALS socket.on('addDeal', (deal) => { state.deals.push(deal) diff --git a/src/components/Chat.tsx b/src/components/Chat.tsx index a45359a..d616f01 100644 --- a/src/components/Chat.tsx +++ b/src/components/Chat.tsx @@ -55,10 +55,14 @@ const Chat = () => { message.type === 'question' ? styles.question : styles.answer, ]} > - {message.text} + + {message.text} + {i === messages.length - 1 && ( - {message.date} + + {message.date} + )} ))} diff --git a/src/components/Deals.tsx b/src/components/Deals.tsx index 1491432..79fdb00 100644 --- a/src/components/Deals.tsx +++ b/src/components/Deals.tsx @@ -30,16 +30,21 @@ interface Area { const Deals = ({ navigation }: { navigation: any }) => { const [expanded, setExpanded] = React.useState({}) const [searchQuery, setSearchQuery] = React.useState('') + const [filteredDeals, setFilteredDeals] = React.useState([]) - const [deals, addDeal] = useDeals() + const [deals, update, add, refresh] = useDeals() - if (!deals) return Loading... + React.useEffect(() => { + refresh() + }, []) - const filteredDeals = - (!searchQuery && deals) || - deals.filter((deal: Deal) => - deal.product.name.toLowerCase().includes(searchQuery.toLowerCase()) + React.useEffect(() => { + setFilteredDeals( + deals.filter((deal: Deal) => + deal.product.name.toLowerCase().includes(searchQuery.toLowerCase()) + ) ) + }, [searchQuery, deals]) const activeAreas: { [key: string]: Area } = Object.entries(areas).reduce( (result, [key, area]) => diff --git a/src/components/TenderRequests.tsx b/src/components/TenderRequests.tsx index 145a274..659fb4f 100644 --- a/src/components/TenderRequests.tsx +++ b/src/components/TenderRequests.tsx @@ -29,7 +29,11 @@ const TenderRequests = ({ navigation }: { navigation: any }) => { const [searchQuery, setSearchQuery] = React.useState('') const [open, setOpen] = React.useState(true) - const [tenderRequests] = useTenderRequests() + const [tenderRequests, update, add, refresh] = useTenderRequests() + + React.useEffect(() => { + refresh() + }, []) const filteredRequests = (!searchQuery && tenderRequests) || diff --git a/src/hooks/useDeals.ts b/src/hooks/useDeals.ts index 4ab01b9..ac3351e 100644 --- a/src/hooks/useDeals.ts +++ b/src/hooks/useDeals.ts @@ -7,18 +7,26 @@ const useDeals = () => { const [deals, setDeals] = useState([] as Deal[]) useEffect(() => { - socket.on('deals', setDeals) + socket.on('deals', (deals: Deal[]) => { + setDeals(deals) + }) return () => { socket.off('deals') } }, [socket]) - const updateDeal = (deal: Deal) => { + const editDeal = (deal: Deal) => { socket.emit('editDeal', deal) } - return [deals, updateDeal] + const addDeal = (deal: Deal) => { + socket.emit('addDeal', deal) + } + + const refresh = () => socket.emit('deals') + + return [deals, editDeal, addDeal, refresh] } export default useDeals diff --git a/src/hooks/useTenderRequests.ts b/src/hooks/useTenderRequests.ts index 0469307..3bc1137 100644 --- a/src/hooks/useTenderRequests.ts +++ b/src/hooks/useTenderRequests.ts @@ -2,19 +2,23 @@ import { useContext, useEffect, useState } from 'react' import { SocketContext } from '../context/socketContext' import { TenderRequest } from '../data/tenderRequests' -const useTenderRequests = () => { +const useTenderRequests = (): [Array, any, any, any] => { const socket = useContext(SocketContext) - const [tenderRequests, setTenderRequests] = useState([] as TenderRequest[]) + const [tenderRequests, setTenderRequests] = useState( + new Array() + ) useEffect(() => { - socket.on('tenderRequests', setTenderRequests) + socket.on('tenderRequests', (arr: Array) => + setTenderRequests(arr) + ) return () => { socket.off('tenderRequests') } }, [socket]) - const updateTenderRequest = (tenderRequest: TenderRequest) => { + const editTenderRequest = (tenderRequest: TenderRequest) => { socket.emit('editTenderRequest', tenderRequest) } @@ -22,7 +26,9 @@ const useTenderRequests = () => { socket.emit('addTenderRequest', tenderRequest) } - return [tenderRequests, updateTenderRequest, addTenderRequest] + const refresh = () => socket.emit('tenderRequests') + + return [tenderRequests, editTenderRequest, addTenderRequest, refresh] } export default useTenderRequests From 6d6598ef3265c02d1ae74d8da76e711d8f535b1f Mon Sep 17 00:00:00 2001 From: Christian Landgren Date: Fri, 9 Jun 2023 11:04:16 +0200 Subject: [PATCH 5/6] fix: add types --- src/components/Deals.tsx | 8 ++++++-- src/context/socketContext.js | 1 - src/hooks/useDeals.ts | 6 +++--- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/components/Deals.tsx b/src/components/Deals.tsx index 79fdb00..eb13eed 100644 --- a/src/components/Deals.tsx +++ b/src/components/Deals.tsx @@ -20,6 +20,7 @@ import { import { TouchableOpacity } from 'react-native-gesture-handler' import Chat from './Chat' import useDeals from '../hooks/useDeals.ts' +import { Deal } from '../data/deals' interface Area { image: string @@ -30,17 +31,20 @@ interface Area { const Deals = ({ navigation }: { navigation: any }) => { const [expanded, setExpanded] = React.useState({}) const [searchQuery, setSearchQuery] = React.useState('') - const [filteredDeals, setFilteredDeals] = React.useState([]) + const [filteredDeals, setFilteredDeals] = React.useState(new Array()) const [deals, update, add, refresh] = useDeals() React.useEffect(() => { + console.log('refresh') refresh() }, []) React.useEffect(() => { + console.log('filter') + setFilteredDeals( - deals.filter((deal: Deal) => + deals.filter((deal) => deal.product.name.toLowerCase().includes(searchQuery.toLowerCase()) ) ) diff --git a/src/context/socketContext.js b/src/context/socketContext.js index 5179d71..29ffc72 100644 --- a/src/context/socketContext.js +++ b/src/context/socketContext.js @@ -6,7 +6,6 @@ export const SocketContext = createContext() export const SocketProvider = ({ children }) => { const socket = io('http://localhost:3000') - socket.emit('reset') return ( {children} diff --git a/src/hooks/useDeals.ts b/src/hooks/useDeals.ts index ac3351e..d4a9186 100644 --- a/src/hooks/useDeals.ts +++ b/src/hooks/useDeals.ts @@ -2,12 +2,12 @@ import { useContext, useEffect, useState } from 'react' import { SocketContext } from '../context/socketContext' import { Deal } from '../data/deals' -const useDeals = () => { +const useDeals = (): [Array, any, any, any] => { const socket = useContext(SocketContext) - const [deals, setDeals] = useState([] as Deal[]) + const [deals, setDeals] = useState([] as Array) useEffect(() => { - socket.on('deals', (deals: Deal[]) => { + socket.on('deals', (deals: Array) => { setDeals(deals) }) From 90e6c3a55466d56c44de9d64420e2297b10fa20f Mon Sep 17 00:00:00 2001 From: Christian Landgren Date: Fri, 9 Jun 2023 14:18:58 +0200 Subject: [PATCH 6/6] feat: mono repo --- .github/workflows/docker-publish.yml | 2 +- .github/workflows/gh-pages.yml | 3 +++ README.md | 6 +++--- Dockerfile => packages/api/Dockerfile | 0 {api => packages/api}/server.ts | 6 +++--- App.tsx => packages/app/App.tsx | 0 packages/app/Dockerfile | 9 +++++++++ app.json => packages/app/app.json | 0 {assets => packages/app/assets}/adaptive-icon.png | Bin .../app/assets}/area_fresh_or_cooled.png | Bin .../app/assets}/area_frozen_food.png | Bin .../app/assets}/area_frozen_fruit.png | Bin .../app/assets}/area_frozen_unprepared_meat.png | Bin {assets => packages/app/assets}/area_groceries.png | Bin .../app/assets}/avatars/Image003.png | Bin .../app/assets}/avatars/Image004.png | Bin .../app/assets}/avatars/Image005.png | Bin .../app/assets}/avatars/Image006.png | Bin .../app/assets}/avatars/Image007.png | Bin .../app/assets}/avatars/Image008.png | Bin .../app/assets}/avatars/Image009.png | Bin .../app/assets}/avatars/Image010.png | Bin {assets => packages/app/assets}/blueberries.png | Bin {assets => packages/app/assets}/chark.png | Bin {assets => packages/app/assets}/chicken.png | Bin {assets => packages/app/assets}/desserts.png | Bin {assets => packages/app/assets}/favicon.png | Bin {assets => packages/app/assets}/icon.png | Bin .../Hantera livs - Rapportfilter-Table 1.csv | 0 .../app/assets}/karlstad.csv/convert.js | 0 .../app/assets}/karlstad.csv/karlstad.csv | 0 .../app/assets}/karlstad.csv/output.json | 0 {assets => packages/app/assets}/legumes.png | Bin {assets => packages/app/assets}/meat.png | Bin {assets => packages/app/assets}/onions.png | Bin {assets => packages/app/assets}/ostkaka.png | Bin {assets => packages/app/assets}/splash.png | Bin babel.config.js => packages/app/babel.config.js | 0 eas.json => packages/app/eas.json | 0 {lib => packages/app/lib}/authStorage.ts | 0 package-lock.json => packages/app/package-lock.json | 1 + package.json => packages/app/package.json | 1 + {src => packages/app/src}/App.tsx | 0 {src => packages/app/src}/BuyerNavigation.tsx | 0 {src => packages/app/src}/ExploreNavigation.tsx | 0 {src => packages/app/src}/RootNavigation.tsx | 0 {src => packages/app/src}/SupplierNavigation.tsx | 0 {src => packages/app/src}/components/AccountMenu.js | 0 .../app/src}/components/BottomNavigationIcon.tsx | 0 {src => packages/app/src}/components/Buyer.tsx | 0 .../app/src}/components/BuyerProfile.tsx | 0 {src => packages/app/src}/components/Chat.tsx | 0 {src => packages/app/src}/components/CreateDeal.tsx | 0 .../app/src}/components/CreateTenderRequest.tsx | 0 {src => packages/app/src}/components/Deal.tsx | 0 {src => packages/app/src}/components/Deals.tsx | 0 .../app/src}/components/EditTenderRequest.js | 0 {src => packages/app/src}/components/Explore.tsx | 0 {src => packages/app/src}/components/Header.js | 0 .../app/src}/components/IphoneDummy.tsx | 0 {src => packages/app/src}/components/Login.tsx | 0 .../app/src}/components/Notifications.tsx | 0 {src => packages/app/src}/components/Supplier.tsx | 0 .../app/src}/components/SupplierProfile.tsx | 0 .../app/src}/components/TenderRequest.tsx | 0 .../app/src}/components/TenderRequests.tsx | 0 .../app/src}/components/TendersAndContracts.tsx | 0 .../app/src}/components/form/DateTimeInput.tsx | 0 .../app/src}/components/form/DropDownList.tsx | 0 .../app/src}/components/form/TextInput.tsx | 0 {src => packages/app/src}/context/socketContext.js | 0 {src => packages/app/src}/data/buyers.ts | 0 {src => packages/app/src}/data/categories.js | 0 {src => packages/app/src}/data/deals.ts | 0 {src => packages/app/src}/data/downloadImages.js | 0 {src => packages/app/src}/data/suppliers.ts | 0 {src => packages/app/src}/data/tenderRequests.ts | 0 {src => packages/app/src}/data/types.ts | 0 {src => packages/app/src}/hooks/useDeals.ts | 0 .../app/src}/hooks/useTenderRequests.ts | 0 80 files changed, 21 insertions(+), 7 deletions(-) rename Dockerfile => packages/api/Dockerfile (100%) rename {api => packages/api}/server.ts (93%) rename App.tsx => packages/app/App.tsx (100%) create mode 100644 packages/app/Dockerfile rename app.json => packages/app/app.json (100%) rename {assets => packages/app/assets}/adaptive-icon.png (100%) rename {assets => packages/app/assets}/area_fresh_or_cooled.png (100%) rename {assets => packages/app/assets}/area_frozen_food.png (100%) rename {assets => packages/app/assets}/area_frozen_fruit.png (100%) rename {assets => packages/app/assets}/area_frozen_unprepared_meat.png (100%) rename {assets => packages/app/assets}/area_groceries.png (100%) rename {assets => packages/app/assets}/avatars/Image003.png (100%) rename {assets => packages/app/assets}/avatars/Image004.png (100%) rename {assets => packages/app/assets}/avatars/Image005.png (100%) rename {assets => packages/app/assets}/avatars/Image006.png (100%) rename {assets => packages/app/assets}/avatars/Image007.png (100%) rename {assets => packages/app/assets}/avatars/Image008.png (100%) rename {assets => packages/app/assets}/avatars/Image009.png (100%) rename {assets => packages/app/assets}/avatars/Image010.png (100%) rename {assets => packages/app/assets}/blueberries.png (100%) rename {assets => packages/app/assets}/chark.png (100%) rename {assets => packages/app/assets}/chicken.png (100%) rename {assets => packages/app/assets}/desserts.png (100%) rename {assets => packages/app/assets}/favicon.png (100%) rename {assets => packages/app/assets}/icon.png (100%) rename {assets => packages/app/assets}/karlstad.csv/Hantera livs - Rapportfilter-Table 1.csv (100%) rename {assets => packages/app/assets}/karlstad.csv/convert.js (100%) rename {assets => packages/app/assets}/karlstad.csv/karlstad.csv (100%) rename {assets => packages/app/assets}/karlstad.csv/output.json (100%) rename {assets => packages/app/assets}/legumes.png (100%) rename {assets => packages/app/assets}/meat.png (100%) rename {assets => packages/app/assets}/onions.png (100%) rename {assets => packages/app/assets}/ostkaka.png (100%) rename {assets => packages/app/assets}/splash.png (100%) rename babel.config.js => packages/app/babel.config.js (100%) rename eas.json => packages/app/eas.json (100%) rename {lib => packages/app/lib}/authStorage.ts (100%) rename package-lock.json => packages/app/package-lock.json (99%) rename package.json => packages/app/package.json (97%) rename {src => packages/app/src}/App.tsx (100%) rename {src => packages/app/src}/BuyerNavigation.tsx (100%) rename {src => packages/app/src}/ExploreNavigation.tsx (100%) rename {src => packages/app/src}/RootNavigation.tsx (100%) rename {src => packages/app/src}/SupplierNavigation.tsx (100%) rename {src => packages/app/src}/components/AccountMenu.js (100%) rename {src => packages/app/src}/components/BottomNavigationIcon.tsx (100%) rename {src => packages/app/src}/components/Buyer.tsx (100%) rename {src => packages/app/src}/components/BuyerProfile.tsx (100%) rename {src => packages/app/src}/components/Chat.tsx (100%) rename {src => packages/app/src}/components/CreateDeal.tsx (100%) rename {src => packages/app/src}/components/CreateTenderRequest.tsx (100%) rename {src => packages/app/src}/components/Deal.tsx (100%) rename {src => packages/app/src}/components/Deals.tsx (100%) rename {src => packages/app/src}/components/EditTenderRequest.js (100%) rename {src => packages/app/src}/components/Explore.tsx (100%) rename {src => packages/app/src}/components/Header.js (100%) rename {src => packages/app/src}/components/IphoneDummy.tsx (100%) rename {src => packages/app/src}/components/Login.tsx (100%) rename {src => packages/app/src}/components/Notifications.tsx (100%) rename {src => packages/app/src}/components/Supplier.tsx (100%) rename {src => packages/app/src}/components/SupplierProfile.tsx (100%) rename {src => packages/app/src}/components/TenderRequest.tsx (100%) rename {src => packages/app/src}/components/TenderRequests.tsx (100%) rename {src => packages/app/src}/components/TendersAndContracts.tsx (100%) rename {src => packages/app/src}/components/form/DateTimeInput.tsx (100%) rename {src => packages/app/src}/components/form/DropDownList.tsx (100%) rename {src => packages/app/src}/components/form/TextInput.tsx (100%) rename {src => packages/app/src}/context/socketContext.js (100%) rename {src => packages/app/src}/data/buyers.ts (100%) rename {src => packages/app/src}/data/categories.js (100%) rename {src => packages/app/src}/data/deals.ts (100%) rename {src => packages/app/src}/data/downloadImages.js (100%) rename {src => packages/app/src}/data/suppliers.ts (100%) rename {src => packages/app/src}/data/tenderRequests.ts (100%) rename {src => packages/app/src}/data/types.ts (100%) rename {src => packages/app/src}/hooks/useDeals.ts (100%) rename {src => packages/app/src}/hooks/useTenderRequests.ts (100%) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index ba08c22..ffb4d6f 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -69,7 +69,7 @@ jobs: id: build-and-push uses: docker/build-push-action@ac9327eae2b366085ac7f6a2d02df8aa8ead720a with: - context: . + context: ./packages/app push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index 750ad07..2ff3e1b 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -18,5 +18,8 @@ jobs: - name: Checkout repository uses: actions/checkout@v3 + - name: Go to app folder + run: cd packages/app + - name: Publish to Github Pages run: npm deploy diff --git a/README.md b/README.md index 094bbbb..f4e1e17 100644 --- a/README.md +++ b/README.md @@ -2,14 +2,14 @@ ## Bakground -Detta är den blivande prototypen av matmarknaden byggd på dynamiskt inköpssystem DIS. +Detta är en prototyp av matmarknaden SKAFF för att visa på hur enkelt ett dynamiskt inköpssystem (DIS) kan bli med hjälp av en app. ## Kom igång Så här kommer du igång: git clone https://github.com/iteam1337/foodMarket - cd foodMarket + cd foodMarket/packages/app npm install npm run ios @@ -17,8 +17,8 @@ Så här kommer du igång: Nu startas automatiskt din iOS Simulator och du kan testa applikationen live där. ## Screenshots (ej färdig layout) -![image](https://user-images.githubusercontent.com/395843/232560646-26c641a6-429d-46cc-8b9d-1ed460c9e119.png) +![image](https://user-images.githubusercontent.com/395843/232560646-26c641a6-429d-46cc-8b9d-1ed460c9e119.png) ## LICENS diff --git a/Dockerfile b/packages/api/Dockerfile similarity index 100% rename from Dockerfile rename to packages/api/Dockerfile diff --git a/api/server.ts b/packages/api/server.ts similarity index 93% rename from api/server.ts rename to packages/api/server.ts index 9105c7d..2c19bea 100644 --- a/api/server.ts +++ b/packages/api/server.ts @@ -2,9 +2,9 @@ import { Server } from 'socket.io' import express from 'express' import { createServer } from 'http' -import buyers from '../src/data/buyers' -import deals from '../src/data/deals' -import tenderRequests from '../src/data/tenderRequests' +import buyers from '../app/src/data/buyers' +import deals from '../app/src/data/deals' +import tenderRequests from '../app/src/data/tenderRequests' const port = process.env.PORT || 3000 const app = express() const server = createServer(app) diff --git a/App.tsx b/packages/app/App.tsx similarity index 100% rename from App.tsx rename to packages/app/App.tsx diff --git a/packages/app/Dockerfile b/packages/app/Dockerfile new file mode 100644 index 0000000..4ea44ad --- /dev/null +++ b/packages/app/Dockerfile @@ -0,0 +1,9 @@ +FROM node:14 +WORKDIR /app +COPY package*.json ./ +RUN npm install +RUN npm install -g expo-cli +RUN npm install @types/react@17.0.21 +COPY . . +EXPOSE 19000 +CMD ["expo", "start"] diff --git a/app.json b/packages/app/app.json similarity index 100% rename from app.json rename to packages/app/app.json diff --git a/assets/adaptive-icon.png b/packages/app/assets/adaptive-icon.png similarity index 100% rename from assets/adaptive-icon.png rename to packages/app/assets/adaptive-icon.png diff --git a/assets/area_fresh_or_cooled.png b/packages/app/assets/area_fresh_or_cooled.png similarity index 100% rename from assets/area_fresh_or_cooled.png rename to packages/app/assets/area_fresh_or_cooled.png diff --git a/assets/area_frozen_food.png b/packages/app/assets/area_frozen_food.png similarity index 100% rename from assets/area_frozen_food.png rename to packages/app/assets/area_frozen_food.png diff --git a/assets/area_frozen_fruit.png b/packages/app/assets/area_frozen_fruit.png similarity index 100% rename from assets/area_frozen_fruit.png rename to packages/app/assets/area_frozen_fruit.png diff --git a/assets/area_frozen_unprepared_meat.png b/packages/app/assets/area_frozen_unprepared_meat.png similarity index 100% rename from assets/area_frozen_unprepared_meat.png rename to packages/app/assets/area_frozen_unprepared_meat.png diff --git a/assets/area_groceries.png b/packages/app/assets/area_groceries.png similarity index 100% rename from assets/area_groceries.png rename to packages/app/assets/area_groceries.png diff --git a/assets/avatars/Image003.png b/packages/app/assets/avatars/Image003.png similarity index 100% rename from assets/avatars/Image003.png rename to packages/app/assets/avatars/Image003.png diff --git a/assets/avatars/Image004.png b/packages/app/assets/avatars/Image004.png similarity index 100% rename from assets/avatars/Image004.png rename to packages/app/assets/avatars/Image004.png diff --git a/assets/avatars/Image005.png b/packages/app/assets/avatars/Image005.png similarity index 100% rename from assets/avatars/Image005.png rename to packages/app/assets/avatars/Image005.png diff --git a/assets/avatars/Image006.png b/packages/app/assets/avatars/Image006.png similarity index 100% rename from assets/avatars/Image006.png rename to packages/app/assets/avatars/Image006.png diff --git a/assets/avatars/Image007.png b/packages/app/assets/avatars/Image007.png similarity index 100% rename from assets/avatars/Image007.png rename to packages/app/assets/avatars/Image007.png diff --git a/assets/avatars/Image008.png b/packages/app/assets/avatars/Image008.png similarity index 100% rename from assets/avatars/Image008.png rename to packages/app/assets/avatars/Image008.png diff --git a/assets/avatars/Image009.png b/packages/app/assets/avatars/Image009.png similarity index 100% rename from assets/avatars/Image009.png rename to packages/app/assets/avatars/Image009.png diff --git a/assets/avatars/Image010.png b/packages/app/assets/avatars/Image010.png similarity index 100% rename from assets/avatars/Image010.png rename to packages/app/assets/avatars/Image010.png diff --git a/assets/blueberries.png b/packages/app/assets/blueberries.png similarity index 100% rename from assets/blueberries.png rename to packages/app/assets/blueberries.png diff --git a/assets/chark.png b/packages/app/assets/chark.png similarity index 100% rename from assets/chark.png rename to packages/app/assets/chark.png diff --git a/assets/chicken.png b/packages/app/assets/chicken.png similarity index 100% rename from assets/chicken.png rename to packages/app/assets/chicken.png diff --git a/assets/desserts.png b/packages/app/assets/desserts.png similarity index 100% rename from assets/desserts.png rename to packages/app/assets/desserts.png diff --git a/assets/favicon.png b/packages/app/assets/favicon.png similarity index 100% rename from assets/favicon.png rename to packages/app/assets/favicon.png diff --git a/assets/icon.png b/packages/app/assets/icon.png similarity index 100% rename from assets/icon.png rename to packages/app/assets/icon.png diff --git a/assets/karlstad.csv/Hantera livs - Rapportfilter-Table 1.csv b/packages/app/assets/karlstad.csv/Hantera livs - Rapportfilter-Table 1.csv similarity index 100% rename from assets/karlstad.csv/Hantera livs - Rapportfilter-Table 1.csv rename to packages/app/assets/karlstad.csv/Hantera livs - Rapportfilter-Table 1.csv diff --git a/assets/karlstad.csv/convert.js b/packages/app/assets/karlstad.csv/convert.js similarity index 100% rename from assets/karlstad.csv/convert.js rename to packages/app/assets/karlstad.csv/convert.js diff --git a/assets/karlstad.csv/karlstad.csv b/packages/app/assets/karlstad.csv/karlstad.csv similarity index 100% rename from assets/karlstad.csv/karlstad.csv rename to packages/app/assets/karlstad.csv/karlstad.csv diff --git a/assets/karlstad.csv/output.json b/packages/app/assets/karlstad.csv/output.json similarity index 100% rename from assets/karlstad.csv/output.json rename to packages/app/assets/karlstad.csv/output.json diff --git a/assets/legumes.png b/packages/app/assets/legumes.png similarity index 100% rename from assets/legumes.png rename to packages/app/assets/legumes.png diff --git a/assets/meat.png b/packages/app/assets/meat.png similarity index 100% rename from assets/meat.png rename to packages/app/assets/meat.png diff --git a/assets/onions.png b/packages/app/assets/onions.png similarity index 100% rename from assets/onions.png rename to packages/app/assets/onions.png diff --git a/assets/ostkaka.png b/packages/app/assets/ostkaka.png similarity index 100% rename from assets/ostkaka.png rename to packages/app/assets/ostkaka.png diff --git a/assets/splash.png b/packages/app/assets/splash.png similarity index 100% rename from assets/splash.png rename to packages/app/assets/splash.png diff --git a/babel.config.js b/packages/app/babel.config.js similarity index 100% rename from babel.config.js rename to packages/app/babel.config.js diff --git a/eas.json b/packages/app/eas.json similarity index 100% rename from eas.json rename to packages/app/eas.json diff --git a/lib/authStorage.ts b/packages/app/lib/authStorage.ts similarity index 100% rename from lib/authStorage.ts rename to packages/app/lib/authStorage.ts diff --git a/package-lock.json b/packages/app/package-lock.json similarity index 99% rename from package-lock.json rename to packages/app/package-lock.json index 1915b68..26753f4 100644 --- a/package-lock.json +++ b/packages/app/package-lock.json @@ -33,6 +33,7 @@ "react-native-web": "~0.18.10", "react-navigation-header-buttons": "^10.0.0", "socket.io": "^4.6.2", + "socket.io-client": "^4.6.2", "socket.io-react-hook": "^2.4.1" }, "devDependencies": { diff --git a/package.json b/packages/app/package.json similarity index 97% rename from package.json rename to packages/app/package.json index e98e638..c7f8ab2 100644 --- a/package.json +++ b/packages/app/package.json @@ -37,6 +37,7 @@ "react-native-web": "~0.18.10", "react-navigation-header-buttons": "^10.0.0", "socket.io": "^4.6.2", + "socket.io-client": "^4.6.2", "socket.io-react-hook": "^2.4.1" }, "devDependencies": { diff --git a/src/App.tsx b/packages/app/src/App.tsx similarity index 100% rename from src/App.tsx rename to packages/app/src/App.tsx diff --git a/src/BuyerNavigation.tsx b/packages/app/src/BuyerNavigation.tsx similarity index 100% rename from src/BuyerNavigation.tsx rename to packages/app/src/BuyerNavigation.tsx diff --git a/src/ExploreNavigation.tsx b/packages/app/src/ExploreNavigation.tsx similarity index 100% rename from src/ExploreNavigation.tsx rename to packages/app/src/ExploreNavigation.tsx diff --git a/src/RootNavigation.tsx b/packages/app/src/RootNavigation.tsx similarity index 100% rename from src/RootNavigation.tsx rename to packages/app/src/RootNavigation.tsx diff --git a/src/SupplierNavigation.tsx b/packages/app/src/SupplierNavigation.tsx similarity index 100% rename from src/SupplierNavigation.tsx rename to packages/app/src/SupplierNavigation.tsx diff --git a/src/components/AccountMenu.js b/packages/app/src/components/AccountMenu.js similarity index 100% rename from src/components/AccountMenu.js rename to packages/app/src/components/AccountMenu.js diff --git a/src/components/BottomNavigationIcon.tsx b/packages/app/src/components/BottomNavigationIcon.tsx similarity index 100% rename from src/components/BottomNavigationIcon.tsx rename to packages/app/src/components/BottomNavigationIcon.tsx diff --git a/src/components/Buyer.tsx b/packages/app/src/components/Buyer.tsx similarity index 100% rename from src/components/Buyer.tsx rename to packages/app/src/components/Buyer.tsx diff --git a/src/components/BuyerProfile.tsx b/packages/app/src/components/BuyerProfile.tsx similarity index 100% rename from src/components/BuyerProfile.tsx rename to packages/app/src/components/BuyerProfile.tsx diff --git a/src/components/Chat.tsx b/packages/app/src/components/Chat.tsx similarity index 100% rename from src/components/Chat.tsx rename to packages/app/src/components/Chat.tsx diff --git a/src/components/CreateDeal.tsx b/packages/app/src/components/CreateDeal.tsx similarity index 100% rename from src/components/CreateDeal.tsx rename to packages/app/src/components/CreateDeal.tsx diff --git a/src/components/CreateTenderRequest.tsx b/packages/app/src/components/CreateTenderRequest.tsx similarity index 100% rename from src/components/CreateTenderRequest.tsx rename to packages/app/src/components/CreateTenderRequest.tsx diff --git a/src/components/Deal.tsx b/packages/app/src/components/Deal.tsx similarity index 100% rename from src/components/Deal.tsx rename to packages/app/src/components/Deal.tsx diff --git a/src/components/Deals.tsx b/packages/app/src/components/Deals.tsx similarity index 100% rename from src/components/Deals.tsx rename to packages/app/src/components/Deals.tsx diff --git a/src/components/EditTenderRequest.js b/packages/app/src/components/EditTenderRequest.js similarity index 100% rename from src/components/EditTenderRequest.js rename to packages/app/src/components/EditTenderRequest.js diff --git a/src/components/Explore.tsx b/packages/app/src/components/Explore.tsx similarity index 100% rename from src/components/Explore.tsx rename to packages/app/src/components/Explore.tsx diff --git a/src/components/Header.js b/packages/app/src/components/Header.js similarity index 100% rename from src/components/Header.js rename to packages/app/src/components/Header.js diff --git a/src/components/IphoneDummy.tsx b/packages/app/src/components/IphoneDummy.tsx similarity index 100% rename from src/components/IphoneDummy.tsx rename to packages/app/src/components/IphoneDummy.tsx diff --git a/src/components/Login.tsx b/packages/app/src/components/Login.tsx similarity index 100% rename from src/components/Login.tsx rename to packages/app/src/components/Login.tsx diff --git a/src/components/Notifications.tsx b/packages/app/src/components/Notifications.tsx similarity index 100% rename from src/components/Notifications.tsx rename to packages/app/src/components/Notifications.tsx diff --git a/src/components/Supplier.tsx b/packages/app/src/components/Supplier.tsx similarity index 100% rename from src/components/Supplier.tsx rename to packages/app/src/components/Supplier.tsx diff --git a/src/components/SupplierProfile.tsx b/packages/app/src/components/SupplierProfile.tsx similarity index 100% rename from src/components/SupplierProfile.tsx rename to packages/app/src/components/SupplierProfile.tsx diff --git a/src/components/TenderRequest.tsx b/packages/app/src/components/TenderRequest.tsx similarity index 100% rename from src/components/TenderRequest.tsx rename to packages/app/src/components/TenderRequest.tsx diff --git a/src/components/TenderRequests.tsx b/packages/app/src/components/TenderRequests.tsx similarity index 100% rename from src/components/TenderRequests.tsx rename to packages/app/src/components/TenderRequests.tsx diff --git a/src/components/TendersAndContracts.tsx b/packages/app/src/components/TendersAndContracts.tsx similarity index 100% rename from src/components/TendersAndContracts.tsx rename to packages/app/src/components/TendersAndContracts.tsx diff --git a/src/components/form/DateTimeInput.tsx b/packages/app/src/components/form/DateTimeInput.tsx similarity index 100% rename from src/components/form/DateTimeInput.tsx rename to packages/app/src/components/form/DateTimeInput.tsx diff --git a/src/components/form/DropDownList.tsx b/packages/app/src/components/form/DropDownList.tsx similarity index 100% rename from src/components/form/DropDownList.tsx rename to packages/app/src/components/form/DropDownList.tsx diff --git a/src/components/form/TextInput.tsx b/packages/app/src/components/form/TextInput.tsx similarity index 100% rename from src/components/form/TextInput.tsx rename to packages/app/src/components/form/TextInput.tsx diff --git a/src/context/socketContext.js b/packages/app/src/context/socketContext.js similarity index 100% rename from src/context/socketContext.js rename to packages/app/src/context/socketContext.js diff --git a/src/data/buyers.ts b/packages/app/src/data/buyers.ts similarity index 100% rename from src/data/buyers.ts rename to packages/app/src/data/buyers.ts diff --git a/src/data/categories.js b/packages/app/src/data/categories.js similarity index 100% rename from src/data/categories.js rename to packages/app/src/data/categories.js diff --git a/src/data/deals.ts b/packages/app/src/data/deals.ts similarity index 100% rename from src/data/deals.ts rename to packages/app/src/data/deals.ts diff --git a/src/data/downloadImages.js b/packages/app/src/data/downloadImages.js similarity index 100% rename from src/data/downloadImages.js rename to packages/app/src/data/downloadImages.js diff --git a/src/data/suppliers.ts b/packages/app/src/data/suppliers.ts similarity index 100% rename from src/data/suppliers.ts rename to packages/app/src/data/suppliers.ts diff --git a/src/data/tenderRequests.ts b/packages/app/src/data/tenderRequests.ts similarity index 100% rename from src/data/tenderRequests.ts rename to packages/app/src/data/tenderRequests.ts diff --git a/src/data/types.ts b/packages/app/src/data/types.ts similarity index 100% rename from src/data/types.ts rename to packages/app/src/data/types.ts diff --git a/src/hooks/useDeals.ts b/packages/app/src/hooks/useDeals.ts similarity index 100% rename from src/hooks/useDeals.ts rename to packages/app/src/hooks/useDeals.ts diff --git a/src/hooks/useTenderRequests.ts b/packages/app/src/hooks/useTenderRequests.ts similarity index 100% rename from src/hooks/useTenderRequests.ts rename to packages/app/src/hooks/useTenderRequests.ts