diff --git a/com.twin.app.shoptime/.env b/com.twin.app.shoptime/.env new file mode 100644 index 00000000..2106b680 --- /dev/null +++ b/com.twin.app.shoptime/.env @@ -0,0 +1,2 @@ +ES5='true' +DISABLE_NEW_JSX_TRANSFORM='true' diff --git a/com.twin.app.shoptime/package-lock.json b/com.twin.app.shoptime/package-lock.json index 218c3c61..c08979d0 100644 --- a/com.twin.app.shoptime/package-lock.json +++ b/com.twin.app.shoptime/package-lock.json @@ -1,7 +1,7 @@ { "name": "shopping-app-2.0", "version": "2.0.0", - "lockfileVersion": 3, + "lockfileVersion": 2, "requires": true, "packages": { "": { @@ -15,21 +15,30 @@ "@enact/spotlight": "^3.3.0", "@enact/ui": "^3.3.0", "@enact/webos": "^3.3.0", - "@reduxjs/toolkit": "^2.0.1", - "axios": "^1.6.5", + "axios": "^0.21.1", "ilib": "^14.3.0", - "prop-types": "^15.8.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-redux": "^9.1.0" - }, - "devDependencies": { - "eslint-config-enact-proxy": "^1.0.7" + "prop-types": "^15.6.2", + "react": "^16.7.0", + "react-dom": "^16.7.0", + "react-redux": "^7.2.3", + "redux": "^3.7.2", + "redux-thunk": "^2.3.0" }, "engines": { "npm": ">=6.9.0" } }, + "node_modules/@babel/runtime": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@enact/core": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/@enact/core/-/core-3.5.0.tgz", @@ -45,42 +54,6 @@ "warning": "^4.0.3" } }, - "node_modules/@enact/core/node_modules/react": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", - "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@enact/core/node_modules/react-dom": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", - "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" - }, - "peerDependencies": { - "react": "^16.14.0" - } - }, - "node_modules/@enact/core/node_modules/scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, "node_modules/@enact/i18n": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/@enact/i18n/-/i18n-3.5.0.tgz", @@ -97,42 +70,6 @@ "ilib": "^14.4.0 || ^14.6.0-webos" } }, - "node_modules/@enact/i18n/node_modules/react": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", - "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@enact/i18n/node_modules/react-dom": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", - "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" - }, - "peerDependencies": { - "react": "^16.14.0" - } - }, - "node_modules/@enact/i18n/node_modules/scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, "node_modules/@enact/sandstone": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/@enact/sandstone/-/sandstone-1.5.1.tgz", @@ -156,56 +93,6 @@ "ilib": "^14.4.0 || ^14.6.0-webos" } }, - "node_modules/@enact/sandstone/node_modules/react": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", - "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@enact/sandstone/node_modules/react-dom": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", - "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" - }, - "peerDependencies": { - "react": "^16.14.0" - } - }, - "node_modules/@enact/sandstone/node_modules/recompose": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.26.0.tgz", - "integrity": "sha512-KwOu6ztO0mN5vy3+zDcc45lgnaUoaQse/a5yLVqtzTK13czSWnFGmXbQVmnoMgDkI5POd1EwIKSbjU1V7xdZog==", - "dependencies": { - "change-emitter": "^0.1.2", - "fbjs": "^0.8.1", - "hoist-non-react-statics": "^2.3.1", - "symbol-observable": "^1.0.4" - }, - "peerDependencies": { - "react": "^0.14.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@enact/sandstone/node_modules/scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, "node_modules/@enact/sandstone/node_modules/warning": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", @@ -227,42 +114,6 @@ "warning": "^3.0.0" } }, - "node_modules/@enact/spotlight/node_modules/react": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", - "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@enact/spotlight/node_modules/react-dom": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", - "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" - }, - "peerDependencies": { - "react": "^16.14.0" - } - }, - "node_modules/@enact/spotlight/node_modules/scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, "node_modules/@enact/spotlight/node_modules/warning": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", @@ -288,56 +139,6 @@ "warning": "^3.0.0" } }, - "node_modules/@enact/ui/node_modules/react": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", - "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@enact/ui/node_modules/react-dom": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", - "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" - }, - "peerDependencies": { - "react": "^16.14.0" - } - }, - "node_modules/@enact/ui/node_modules/recompose": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.26.0.tgz", - "integrity": "sha512-KwOu6ztO0mN5vy3+zDcc45lgnaUoaQse/a5yLVqtzTK13czSWnFGmXbQVmnoMgDkI5POd1EwIKSbjU1V7xdZog==", - "dependencies": { - "change-emitter": "^0.1.2", - "fbjs": "^0.8.1", - "hoist-non-react-statics": "^2.3.1", - "symbol-observable": "^1.0.4" - }, - "peerDependencies": { - "react": "^0.14.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@enact/ui/node_modules/scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, "node_modules/@enact/ui/node_modules/warning": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", @@ -357,88 +158,65 @@ "react-dom": "^16.8.0" } }, - "node_modules/@enact/webos/node_modules/react": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", - "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", + "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - }, - "engines": { - "node": ">=0.10.0" + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" } }, - "node_modules/@enact/webos/node_modules/react-dom": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", - "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", + "node_modules/@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" + }, + "node_modules/@types/react": { + "version": "18.2.48", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.48.tgz", + "integrity": "sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" - }, - "peerDependencies": { - "react": "^16.14.0" + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" } }, - "node_modules/@enact/webos/node_modules/scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "node_modules/@types/react-redux": { + "version": "7.1.33", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.33.tgz", + "integrity": "sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" } }, - "node_modules/@reduxjs/toolkit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.0.1.tgz", - "integrity": "sha512-fxIjrR9934cmS8YXIGd9e7s1XRsEU++aFc9DVNMFMRTM5Vtsg2DCRMj21eslGtDt43IUf9bJL3h5bwUlZleibA==", + "node_modules/@types/react-redux/node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", "dependencies": { - "immer": "^10.0.3", - "redux": "^5.0.0", - "redux-thunk": "^3.1.0", - "reselect": "^5.0.1" - }, - "peerDependencies": { - "react": "^16.9.0 || ^17.0.0 || ^18", - "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-redux": { - "optional": true - } + "@babel/runtime": "^7.9.2" } }, - "node_modules/@types/use-sync-external-store": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", - "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" + "node_modules/@types/scheduler": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, "node_modules/axios": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", - "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", "dependencies": { - "follow-redirects": "^1.15.4", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "follow-redirects": "^1.14.0" } }, "node_modules/change-emitter": { @@ -451,30 +229,16 @@ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/core-js": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", "integrity": "sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA==", "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js." }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/direction": { "version": "1.0.4", @@ -501,49 +265,6 @@ "iconv-lite": "^0.6.2" } }, - "node_modules/eslint-config-enact-proxy": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eslint-config-enact-proxy/-/eslint-config-enact-proxy-1.0.7.tgz", - "integrity": "sha512-24sqg6lrHsbQTEfox+3HM2Zvd0FKBynCmslQu+6cTHDZLvz1OZMogWvLq7kj9a2Gfu0tvza+BQ090ZivtRhlVQ==", - "dev": true, - "hasShrinkwrap": true, - "dependencies": { - "semver": "^7.5.4" - } - }, - "node_modules/eslint-config-enact-proxy/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-config-enact-proxy/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-config-enact-proxy/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/fbjs": { "version": "0.8.18", "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.18.tgz", @@ -577,19 +298,6 @@ } } }, - "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/global": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", @@ -600,9 +308,12 @@ } }, "node_modules/hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } }, "node_modules/iconv-lite": { "version": "0.6.3", @@ -620,15 +331,6 @@ "resolved": "https://registry.npmjs.org/ilib/-/ilib-14.19.0.tgz", "integrity": "sha512-JixO6ehc/mHNyywjhy3/A31Qo81fcvX/tt6w7dQF4awJuXVl32yIhHWHLVp0H4CxknTrC/7mo4kbSZaeu1qTHA==" }, - "node_modules/immer": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.3.tgz", - "integrity": "sha512-pwupu3eWfouuaowscykeckFmVTpqbzW+rXFCX8rQLkZzM9ftBmU/++Ra+o+L27mz03zJTlyV4UUr+fdKNffo4A==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -664,6 +366,16 @@ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -675,25 +387,6 @@ "loose-envify": "cli.js" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/min-document": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", @@ -750,37 +443,36 @@ "react-is": "^16.13.1" } }, - "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/ramda": { "version": "0.24.1", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.24.1.tgz", "integrity": "sha512-HEm619G8PaZMfkqCa23qiOe7r3R0brPu7ZgOsgKUsnvLhd0qhc/vTjkUovomgPWa5ECBa08fJZixth9LaoBo5w==" }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", "dependencies": { - "loose-envify": "^1.1.0" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", + "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.19.1" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^16.14.0" } }, "node_modules/react-is": { @@ -789,48 +481,76 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-redux": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.0.tgz", - "integrity": "sha512-6qoDzIO+gbrza8h3hjMA9aq4nwVFCKFtY2iLxCtVT38Swyy2C/dJCGBXHeHLtx6qlg/8qzc2MrhOeduf5K32wQ==", + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", "dependencies": { - "@types/use-sync-external-store": "^0.0.3", - "use-sync-external-store": "^1.0.0" + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" }, "peerDependencies": { - "@types/react": "^18.2.25", - "react": "^18.0", - "react-native": ">=0.69", - "redux": "^5.0.0" + "react": "^16.8.3 || ^17 || ^18" }, "peerDependenciesMeta": { - "@types/react": { + "react-dom": { "optional": true }, "react-native": { "optional": true - }, - "redux": { - "optional": true } } }, - "node_modules/redux": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", - "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==" + "node_modules/react-redux/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, - "node_modules/redux-thunk": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", - "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "node_modules/recompose": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.26.0.tgz", + "integrity": "sha512-KwOu6ztO0mN5vy3+zDcc45lgnaUoaQse/a5yLVqtzTK13czSWnFGmXbQVmnoMgDkI5POd1EwIKSbjU1V7xdZog==", + "dependencies": { + "change-emitter": "^0.1.2", + "fbjs": "^0.8.1", + "hoist-non-react-statics": "^2.3.1", + "symbol-observable": "^1.0.4" + }, "peerDependencies": { - "redux": "^5.0.0" + "react": "^0.14.0 || ^15.0.0 || ^16.0.0" } }, - "node_modules/reselect": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.0.tgz", - "integrity": "sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg==" + "node_modules/recompose/node_modules/hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + }, + "node_modules/redux": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", + "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "dependencies": { + "lodash": "^4.2.1", + "lodash-es": "^4.2.1", + "loose-envify": "^1.1.0", + "symbol-observable": "^1.0.3" + } + }, + "node_modules/redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "peerDependencies": { + "redux": "^4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/safer-buffer": { "version": "2.1.2", @@ -838,11 +558,12 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", "dependencies": { - "loose-envify": "^1.1.0" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" } }, "node_modules/setimmediate": { @@ -880,14 +601,6 @@ "node": "*" } }, - "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/warning": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", @@ -920,5 +633,533 @@ "node": ">=0.4" } } + }, + "dependencies": { + "@babel/runtime": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", + "requires": { + "regenerator-runtime": "^0.14.0" + } + }, + "@enact/core": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@enact/core/-/core-3.5.0.tgz", + "integrity": "sha512-k4CJ3KUdXEljgl/y/cj8uT0j//eKfsh1S6CnINjF2C4y/jchxzCSM2QEkwCTqIz86dGkx/N3JYr6cl09wgChFA==", + "requires": { + "classnames": "^2.2.5", + "invariant": "^2.2.2", + "prop-types": "^15.7.2", + "ramda": "^0.24.1", + "react": "^16.8.0", + "react-dom": "^16.8.0", + "react-is": "^16.8.3", + "warning": "^4.0.3" + } + }, + "@enact/i18n": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@enact/i18n/-/i18n-3.5.0.tgz", + "integrity": "sha512-SNtMLqQQKUaXk9ZUMDqjhZsV/TL9IdR07nbYIjZ7mS6CFE8Qekf4jzUtC0bkV9uYjaoVP0bS4mj1VnyWm/uxvA==", + "requires": { + "@enact/core": "^3.5.0", + "prop-types": "^15.7.2", + "ramda": "^0.24.1", + "react": "^16.8.0", + "react-dom": "^16.8.0", + "xhr": "^2.4.1" + } + }, + "@enact/sandstone": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@enact/sandstone/-/sandstone-1.5.1.tgz", + "integrity": "sha512-ujuA2k99fSm2X5ZqhT4HDGnnNMGqkjn37QD2U6+jJPwL9E/68K1Bpyrq4CtmlxGE+Tc7QBkoQmPZVXEURYJOyw==", + "requires": { + "@enact/core": "^3.5.0", + "@enact/i18n": "^3.5.0", + "@enact/spotlight": "^3.5.0", + "@enact/ui": "^3.5.0", + "classnames": "^2.2.5", + "ilib": "^14.2.0", + "invariant": "^2.2.2", + "prop-types": "^15.7.2", + "ramda": "^0.24.1", + "react": "^16.8.0", + "react-dom": "^16.8.0", + "recompose": "^0.26.0", + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ==", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "@enact/spotlight": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@enact/spotlight/-/spotlight-3.5.0.tgz", + "integrity": "sha512-XqvAEOz0emHAQIQ5XL5nec0L9Poex4bfsp1YxoUa0zzNGybcERQg1ggxrTseQLzr+cUilN8weMRunOyDh7mQUQ==", + "requires": { + "@enact/core": "^3.5.0", + "prop-types": "^15.7.2", + "ramda": "^0.24.1", + "react": "^16.7.0", + "react-dom": "^16.7.0", + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ==", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "@enact/ui": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@enact/ui/-/ui-3.5.0.tgz", + "integrity": "sha512-Ln5SBvLKPTvuGarPnBra87lrfdi9wXVw8MMaQQOPmljx1a9tZmZRBHgI2bYZlObz5ltGEfXrpI3nerfqiAN0ww==", + "requires": { + "@enact/core": "^3.5.0", + "classnames": "^2.2.5", + "direction": "^1.0.1", + "invariant": "^2.2.2", + "prop-types": "^15.7.2", + "ramda": "^0.24.1", + "react": "^16.8.0", + "react-dom": "^16.8.0", + "recompose": "^0.26.0", + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ==", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "@enact/webos": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@enact/webos/-/webos-3.5.0.tgz", + "integrity": "sha512-E/XXyMOnjSsDvvk7r0VRNXUO1gkyPwWOCo5TUWDTZ8fYImJHfBO5okTwHw9rVK2v32sc8wSMEr8VcIf9BCwHTQ==", + "requires": { + "@enact/core": "^3.5.0", + "prop-types": "^15.7.2", + "react": "^16.8.0", + "react-dom": "^16.8.0" + } + }, + "@types/hoist-non-react-statics": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", + "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", + "requires": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" + }, + "@types/react": { + "version": "18.2.48", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.48.tgz", + "integrity": "sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==", + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-redux": { + "version": "7.1.33", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.33.tgz", + "integrity": "sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==", + "requires": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + }, + "dependencies": { + "redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "requires": { + "@babel/runtime": "^7.9.2" + } + } + } + }, + "@types/scheduler": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "requires": { + "follow-redirects": "^1.14.0" + } + }, + "change-emitter": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/change-emitter/-/change-emitter-0.1.6.tgz", + "integrity": "sha512-YXzt1cQ4a2jqazhcuSWEOc1K2q8g9H6eWNsyZgi640LDzRWVQ2eDe+Y/kVdftH+vYdPF2rgDb3dLdpxE1jvAxw==" + }, + "classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA==" + }, + "csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "direction": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/direction/-/direction-1.0.4.tgz", + "integrity": "sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==" + }, + "dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "requires": { + "iconv-lite": "^0.6.2" + } + }, + "fbjs": { + "version": "0.8.18", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.18.tgz", + "integrity": "sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA==", + "requires": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.30" + } + }, + "follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==" + }, + "global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "requires": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + } + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ilib": { + "version": "14.19.0", + "resolved": "https://registry.npmjs.org/ilib/-/ilib-14.19.0.tgz", + "integrity": "sha512-JixO6ehc/mHNyywjhy3/A31Qo81fcvX/tt6w7dQF4awJuXVl32yIhHWHLVp0H4CxknTrC/7mo4kbSZaeu1qTHA==" + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA==", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "requires": { + "dom-walk": "^0.1.0" + } + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "parse-headers": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "ramda": { + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.24.1.tgz", + "integrity": "sha512-HEm619G8PaZMfkqCa23qiOe7r3R0brPu7ZgOsgKUsnvLhd0qhc/vTjkUovomgPWa5ECBa08fJZixth9LaoBo5w==" + }, + "react": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-dom": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", + "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.19.1" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "react-redux": { + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "requires": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "dependencies": { + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + } + } + }, + "recompose": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.26.0.tgz", + "integrity": "sha512-KwOu6ztO0mN5vy3+zDcc45lgnaUoaQse/a5yLVqtzTK13czSWnFGmXbQVmnoMgDkI5POd1EwIKSbjU1V7xdZog==", + "requires": { + "change-emitter": "^0.1.2", + "fbjs": "^0.8.1", + "hoist-non-react-statics": "^2.3.1", + "symbol-observable": "^1.0.4" + }, + "dependencies": { + "hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + } + } + }, + "redux": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", + "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "requires": { + "lodash": "^4.2.1", + "lodash-es": "^4.2.1", + "loose-envify": "^1.1.0", + "symbol-observable": "^1.0.3" + } + }, + "redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "requires": {} + }, + "regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" + }, + "ua-parser-js": { + "version": "0.7.37", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz", + "integrity": "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==" + }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" + }, + "xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "requires": { + "global": "~4.4.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + } } } diff --git a/com.twin.app.shoptime/package.json b/com.twin.app.shoptime/package.json index 25f600a0..f9221211 100644 --- a/com.twin.app.shoptime/package.json +++ b/com.twin.app.shoptime/package.json @@ -6,8 +6,8 @@ "main": "src/index.js", "scripts": { "serve": "enact serve", - "pack": "enact pack", - "pack-p": "enact pack -p", + "pack": "enact clean && enact pack", + "build": "enact pack --production --locales=tv --verbose", "watch": "enact pack --watch", "clean": "enact clean", "lint": "enact lint .", @@ -27,9 +27,6 @@ "baseSize": 24 } }, - "eslintConfig": { - "extends": "enact-proxy" - }, "eslintIgnore": [ "node_modules/*", "build/*", @@ -42,15 +39,16 @@ "@enact/spotlight": "^3.3.0", "@enact/ui": "^3.3.0", "@enact/webos": "^3.3.0", - "@reduxjs/toolkit": "^2.0.1", - "axios": "^1.6.5", + "axios": "^0.21.1", "ilib": "^14.3.0", - "prop-types": "^15.8.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-redux": "^9.1.0" + "prop-types": "^15.6.2", + "react": "^16.7.0", + "react-dom": "^16.7.0", + "react-redux": "^7.2.3", + "redux": "^3.7.2", + "redux-thunk": "^2.3.0" }, - "devDependencies": { - "eslint-config-enact-proxy": "^1.0.7" - } -} + "browserslist": [ + "chrome 38" + ] +} \ No newline at end of file diff --git a/com.twin.app.shoptime/src/.DS_Store b/com.twin.app.shoptime/src/.DS_Store index 97c3212f..d297a54d 100644 Binary files a/com.twin.app.shoptime/src/.DS_Store and b/com.twin.app.shoptime/src/.DS_Store differ diff --git a/com.twin.app.shoptime/src/App/App.js b/com.twin.app.shoptime/src/App/App.js index 530e483b..cde8318d 100644 --- a/com.twin.app.shoptime/src/App/App.js +++ b/com.twin.app.shoptime/src/App/App.js @@ -4,18 +4,18 @@ import { useDispatch } from "react-redux"; import ThemeDecorator from "@enact/sandstone/ThemeDecorator"; -import { getBrandList } from "../features/brand/brandsSlice"; -import { getAuthenticationCode } from "../features/device/deviceSlice"; +import { getBrandList } from "../actions/brandActions"; +import { getAuthenticationCode } from "../actions/deviceActions"; import { - getHomeMenu, getHomeLayout, getHomeMainContents, + getHomeMenu, getThemeCurationInfo, -} from "../features/home/homeSlice"; -import { getMyRecommandedKeyword } from "../features/mypage/myPageSlice"; -import { getOnSaleInfo } from "../features/onSale/onSaleSlice"; -import { getSubCategory, getTop20Show } from "../features/main/mainSlice"; -import { getBestSeller } from "../features/product/productSlice"; +} from "../actions/homeActions"; +import { getSubCategory, getTop20Show } from "../actions/mainActions"; +import { getMyRecommandedKeyword } from "../actions/myPageActions"; +import { getOnSaleInfo } from "../actions/onSaleActions"; +import { getBestSeller } from "../actions/productActions"; import MainView from "../views/MainView/MainView"; import css from "./App.module.less"; diff --git a/com.twin.app.shoptime/src/actions/actionTypes.js b/com.twin.app.shoptime/src/actions/actionTypes.js new file mode 100644 index 00000000..11de27a2 --- /dev/null +++ b/com.twin.app.shoptime/src/actions/actionTypes.js @@ -0,0 +1,49 @@ +export const types = { + // panel actions + PUSH_PANEL: "PUSH_PANEL", + POP_PANEL: "POP_PANEL", + UPDATE_PANEL: "UPDATE_PANEL", + UPDATE_MODAL_STATUS: "UPDATE_MODAL_STATUS", + RESET_PANELS: "RESET_PANELS", + + // device actions + GET_AUTHENTICATION_CODE: "GET_AUTHENTICATION_CODE", + + // common actions + CHANGE_APP_STATUS: "CHANGE_APP_STATUS", + + // appData actions + ADD_MAIN_INDEX: "ADD_MAIN_INDEX", + + // home actions + GET_HOME_TERMS: "GET_HOME_TERMS", + GET_HOME_MENU: "GET_HOME_MENU", + GET_HOME_LAYOUT: "GET_HOME_LAYOUT", + GET_HOME_MAIN_CONTENTS: "GET_HOME_MAIN_CONTENTS", + GET_THEME_CURATION_INFO: "GET_THEME_CURATION_INFO", + + // brand actions + GET_BRAND_LIST: "GET_BRAND_LIST", + GET_BRAND_LAYOUT_INFO: "GET_BRAND_LAYOUT_INFO", + GET_BRAND_LIVE_CHANNEL_INFO: "GET_BRAND_LIVE_CHANNEL_INFO", + + // main actions + GET_SUB_CATEGORY: "GET_SUB_CATEGORY", + GET_TOP_20_SHOW: "GET_TOP_20_SHOW", + + // myPage actions + GET_MY_RECOMMANDED_KEYWORD: "GET_MY_RECOMMANDED_KEYWORD", + + // onSale actions + GET_ON_SALE_INFO: "GET_ON_SALE_INFO", + + // product actions + GET_BEST_SELLER: "GET_BEST_SELLER", + + // search actions + GET_SEARCH: "GET_SEARCH", + RESET_SEARCH: "RESET_SEARCH", + + // event actions + GET_WELCOME_EVENT_INFO: "GET_WELCOME_EVENT_INFO", +}; diff --git a/com.twin.app.shoptime/src/actions/appDataActions.js b/com.twin.app.shoptime/src/actions/appDataActions.js new file mode 100644 index 00000000..4b8f5752 --- /dev/null +++ b/com.twin.app.shoptime/src/actions/appDataActions.js @@ -0,0 +1,6 @@ +import { types } from "./actionTypes"; + +export const addMainIndex = (index) => ({ + type: types.ADD_MAIN_INDEX, + payload: index, +}); diff --git a/com.twin.app.shoptime/src/actions/brandActions.js b/com.twin.app.shoptime/src/actions/brandActions.js new file mode 100644 index 00000000..f8aca17b --- /dev/null +++ b/com.twin.app.shoptime/src/actions/brandActions.js @@ -0,0 +1,89 @@ +import { URLS } from "../api/apiConfig"; +import { TAxios } from "../api/TAxios"; +import { types } from "./actionTypes"; + +// Featured Brands 정보 조회 IF-LGSP-304 +// @@pyh Todo, 기존의 key가 brandList에서 brandInfo로 변경 됨에 따라 함수명 또한 바뀔 수 있음 (문서 확인 후 변경 처리) +export const getBrandList = () => (dispatch, getState) => { + const onSuccess = (response) => { + console.log("@@ getBrandList onSuccess ", response.data); + + dispatch({ + type: types.GET_BRAND_LIST, + payload: response.data.data, + }); + }; + + const onFail = (error) => { + console.error("@@ getBrandList onFail", error); + }; + + TAxios( + dispatch, + getState, + "get", + URLS.GET_BRAND_LIST, + {}, + {}, + onSuccess, + onFail + ); +}; + +// Featured Brands LAYOUT (shelf) 정보 조회 IF-LGSP-305 +export const getBrandLayoutInfo = (props) => (dispatch, getState) => { + const { patnrId } = props; + + const onSuccess = (response) => { + console.log("@@ getBrandLayoutInfo onSuccess ", response.data); + + dispatch({ + type: types.GET_BRAND_LAYOUT_INFO, + payload: response.data.data, + }); + }; + + const onFail = (error) => { + console.error("@@ getBrandLayoutInfo onFail ", error); + }; + + TAxios( + dispatch, + getState, + "get", + URLS.GET_BRAND_LAYOUT_INFO, + { patnrId }, + {}, + onSuccess, + onFail + ); +}; + +// Featured Brands Live 채널 정보 조회 IF-LGSP-306 +export const getBrandLiveChannelInfo = (props) => (dispatch, getState) => { + const { patnrId } = props; + + const onSuccess = (response) => { + console.log("@@ getBrandLiveChannelInfo onSuccess ", response.data); + + dispatch({ + type: types.GET_BRAND_LIVE_CHANNEL_INFO, + payload: response.data.data, + }); + }; + + const onFail = (error) => { + console.error("@@ getBrandLiveChannelInfo onFail ", error); + }; + + TAxios( + dispatch, + getState, + "get", + URLS.GET_BRAND_LIVE_CHANNEL_INFO, + { patnrId }, + {}, + onSuccess, + onFail + ); +}; diff --git a/com.twin.app.shoptime/src/actions/commonActions.js b/com.twin.app.shoptime/src/actions/commonActions.js new file mode 100644 index 00000000..14265f84 --- /dev/null +++ b/com.twin.app.shoptime/src/actions/commonActions.js @@ -0,0 +1,6 @@ +import { types } from "./actionTypes"; + +export const changeAppStatus = (status) => ({ + type: types.CHANGE_APP_STATUS, + payload: status, +}); diff --git a/com.twin.app.shoptime/src/actions/deviceActions.js b/com.twin.app.shoptime/src/actions/deviceActions.js new file mode 100644 index 00000000..fc9eaf83 --- /dev/null +++ b/com.twin.app.shoptime/src/actions/deviceActions.js @@ -0,0 +1,29 @@ +import { URLS } from "../api/apiConfig"; +import { TAxios } from "../api/TAxios"; +import { types } from "./actionTypes"; + +export const getAuthenticationCode = () => (dispatch, getState) => { + const onSuccess = (response) => { + console.log("getAuthenticationCode onSuccess: ", response.data); + + dispatch({ + type: types.GET_AUTHENTICATION_CODE, + payload: response.data.data.accessToken, + }); + }; + + const onFail = (error) => { + console.error("getAuthenticationCode onFail: ", error); + }; + + TAxios( + dispatch, + getState, + "get", + URLS.GET_AUTHENTICATION_CODE, + {}, + {}, + onSuccess, + onFail + ); +}; diff --git a/com.twin.app.shoptime/src/actions/eventActions.js b/com.twin.app.shoptime/src/actions/eventActions.js new file mode 100644 index 00000000..4c7a58bf --- /dev/null +++ b/com.twin.app.shoptime/src/actions/eventActions.js @@ -0,0 +1,29 @@ +import { URLS } from "../api/apiConfig"; +import { TAxios } from "../api/TAxios"; +import { types } from "./actionTypes"; + +// 이벤트 정보 조회 IF-LGSP-070 +export const getWelcomeEventInfo = () => (dispatch, getState) => { + const onSuccess = (response) => { + console.log("getWelcomeEventInfo onSuccess ", response.data); + + dispatch({ + type: types.GET_WELCOME_EVENT_INFO, + payload: response.data.data, + }); + }; + + const onFail = (error) => { + console.error("getWelcomeEventInfo onFail ", error); + }; + + TAxios( + dispatch, + getState, + URLS.GET_WELCOME_EVENT_INFO, + {}, + {}, + onSuccess, + onFail + ); +}; diff --git a/com.twin.app.shoptime/src/actions/homeActions.js b/com.twin.app.shoptime/src/actions/homeActions.js new file mode 100644 index 00000000..cf07464c --- /dev/null +++ b/com.twin.app.shoptime/src/actions/homeActions.js @@ -0,0 +1,140 @@ +import { URLS } from "../api/apiConfig"; +import { TAxios } from "../api/TAxios"; +import { types } from "./actionTypes"; + +// 약관 정보 조회 IF-LGSP-005 +export const getHomeTerms = (props) => (dispatch, getState) => { + const { trmsTpCdList, mbrNo } = props; + + const onSuccess = (response) => { + console.log("getHomeTerms onSuccess ", response.data); + + dispatch({ + type: types.GET_HOME_TERMS, + payload: response.data, + }); + }; + + const onFail = (error) => { + console.error("getHomeTerms onFail ", error); + }; + + TAxios( + dispatch, + getState, + "get", + URLS.GET_HOME_TERMS, + { trmsTpCdList, mbrNo }, + {}, + onSuccess, + onFail + ); +}; + +// 메뉴 목록 조회 IF-LGSP-044 +export const getHomeMenu = () => (dispatch, getState) => { + const onSuccess = (response) => { + console.log("getHomeMenu onSuccess ", response.data); + + dispatch({ + type: types.GET_HOME_MENU, + payload: response.data, + }); + }; + + const onFail = (error) => { + console.error("getHomeMenu onFail ", error); + }; + + TAxios( + dispatch, + getState, + "get", + URLS.GET_HOME_MENU, + {}, + {}, + onSuccess, + onFail + ); +}; + +// HOME LAYOUT 정보 조회 IF-LGSP-300 +export const getHomeLayout = () => (dispatch, getState) => { + const onSuccess = (response) => { + console.log("getHomeLayout onSuccess", response.data); + + dispatch({ + type: types.GET_HOME_LAYOUT, + payload: response.data.data, + }); + }; + + const onFail = (error) => { + console.error("getHomeLayout onFail", error); + }; + + TAxios( + dispatch, + getState, + "get", + URLS.GET_HOME_LAYOUT, + {}, + {}, + onSuccess, + onFail + ); +}; + +// HOME Main Contents Banner 정보 조회 IF-LGSP-301 +export const getHomeMainContents = () => (dispatch, getState) => { + const onSuccess = (response) => { + console.log("getHomeMainContents onSuccess", response.data); + + dispatch({ + type: types.GET_HOME_MAIN_CONTENTS, + payload: response.data.data, + }); + }; + + const onFail = (error) => { + console.error("getHomeMainContents onFail", error); + }; + + TAxios( + dispatch, + getState, + "get", + URLS.GET_HOME_MAIN_CONTENTS, + {}, + {}, + onSuccess, + onFail + ); +}; + +// Theme 전시 정보 조회 : IF-LGSP-045 +export const getThemeCurationInfo = () => (dispatch, getState) => { + const onSuccess = (response) => { + console.log("getThemeCurationInfo onSuccess", response.data); + + dispatch({ + type: types.GET_THEME_CURATION_INFO, + payload: response.data.data, + }); + }; + + const onFail = (error) => { + console.error("getThemeCurationInfo onFail", error); + }; + + TAxios( + dispatch, + getState, + "get", + URLS.GET_THEME_CURATION_INFO, + {}, + {}, + onSuccess, + onFail + ); +}; diff --git a/com.twin.app.shoptime/src/actions/mainActions.js b/com.twin.app.shoptime/src/actions/mainActions.js new file mode 100644 index 00000000..bd376982 --- /dev/null +++ b/com.twin.app.shoptime/src/actions/mainActions.js @@ -0,0 +1,59 @@ +import { URLS } from "../api/apiConfig"; +import { TAxios } from "../api/TAxios"; +import { types } from "./actionTypes"; + +// 서브카테고리 조회 IF-LGSP-051 +export const getSubCategory = (props) => (dispatch, getState) => { + const { lgCatCd, patnrIdList, pageSize, tabType, filterType } = props; + + const onSuccess = (response) => { + console.log("getSubCategory onSuccess ", response.data); + + dispatch({ + type: types.GET_SUB_CATEGORY, + payload: response.data.data, + }); + }; + + const onFail = (error) => { + console.error("getSubCategory onFail", error); + }; + + TAxios( + dispatch, + getState, + "get", + URLS.GET_SUB_CATEGORY, + { lgCatCd, patnrIdList, pageSize, tabType, filterType }, + {}, + onSuccess, + onFail + ); +}; + +// TOP20 영상 목록 조회 IF-LGSP-069 +export const getTop20Show = () => (dispatch, getState) => { + const onSuccess = (response) => { + console.log("getTop20Show onSuccess ", response.data); + + dispatch({ + type: types.GET_TOP_20_SHOW, + payload: response.data.data, + }); + }; + + const onFail = (error) => { + console.error("getTop20Show onFail", error); + }; + + TAxios( + dispatch, + getState, + "get", + URLS.GET_TOP20_SHOW, + {}, + {}, + onSuccess, + onFail + ); +}; diff --git a/com.twin.app.shoptime/src/actions/myPageActions.js b/com.twin.app.shoptime/src/actions/myPageActions.js new file mode 100644 index 00000000..4b7d8565 --- /dev/null +++ b/com.twin.app.shoptime/src/actions/myPageActions.js @@ -0,0 +1,30 @@ +import { URLS } from "../api/apiConfig"; +import { TAxios } from "../api/TAxios"; +import { types } from "./actionTypes"; + +// 추천 Keyword 목록 조회 IF-LGSP-055 +export const getMyRecommandedKeyword = () => (dispatch, getState) => { + const onSuccess = (response) => { + console.log("getMyRecommandedKeyword onSuccess ", response.data); + + dispatch({ + type: types.GET_MY_RECOMMANDED_KEYWORD, + payload: response.data, + }); + }; + + const onFail = (error) => { + console.error("getMyRecommandedKeyword onFail ", error); + }; + + TAxios( + dispatch, + getState, + "get", + URLS.GET_MY_RECOMMANDED_KEYWORD, + {}, + {}, + onSuccess, + onFail + ); +}; diff --git a/com.twin.app.shoptime/src/actions/onSaleActions.js b/com.twin.app.shoptime/src/actions/onSaleActions.js new file mode 100644 index 00000000..0373b89d --- /dev/null +++ b/com.twin.app.shoptime/src/actions/onSaleActions.js @@ -0,0 +1,32 @@ +import { URLS } from "../api/apiConfig"; +import { TAxios } from "../api/TAxios"; +import { types } from "./actionTypes"; + +// On Sale 조회 IF-LGSP-086 +export const getOnSaleInfo = (props) => (dispatch, getState) => { + const { categoryIncFlag, lgCatCd } = props; + + const onSuccess = (response) => { + console.log("getOnSaleInfo onSuccess ", response.data); + + dispatch({ + type: types.GET_ON_SALE_INFO, + payload: response.data.data, + }); + }; + + const onFail = (error) => { + console.error("getOnSaleInfo onFail", error); + }; + + TAxios( + dispatch, + getState, + "get", + URLS.GET_ON_SALE_INFO, + { categoryIncFlag, lgCatCd }, + {}, + onSuccess, + onFail + ); +}; diff --git a/com.twin.app.shoptime/src/actions/panelActions.js b/com.twin.app.shoptime/src/actions/panelActions.js new file mode 100644 index 00000000..8b56709a --- /dev/null +++ b/com.twin.app.shoptime/src/actions/panelActions.js @@ -0,0 +1,26 @@ +import { types } from "./actionTypes"; + +export const pushPanel = (panel) => ({ + type: types.PUSH_PANEL, + payload: panel, +}); + +export const popPanel = (panelName) => ({ + type: types.POP_PANEL, + payload: panelName, +}); + +export const updatePanel = (panelInfo) => ({ + type: types.UPDATE_PANEL, + payload: panelInfo, +}); + +export const updateModalStatus = (status) => ({ + type: types.UPDATE_MODAL_STATUS, + payload: status, +}); + +export const resetPanels = (panels) => ({ + type: types.RESET_PANELS, + payload: panels, +}); diff --git a/com.twin.app.shoptime/src/actions/productActions.js b/com.twin.app.shoptime/src/actions/productActions.js new file mode 100644 index 00000000..26c31c4a --- /dev/null +++ b/com.twin.app.shoptime/src/actions/productActions.js @@ -0,0 +1,30 @@ +import { URLS } from "../api/apiConfig"; +import { TAxios } from "../api/TAxios"; +import { types } from "./actionTypes"; + +// Best Seller 상품 목록 조회 IF-LGSP-303 +export const getBestSeller = () => (dispatch, getState) => { + const onSuccess = (response) => { + console.log("getBestSeller onSuccess", response.data); + + dispatch({ + type: types.GET_BEST_SELLER, + payload: response.data.data, + }); + }; + + const onFail = (error) => { + console.error("getBestSeller onFail", error); + }; + + TAxios( + dispatch, + getState, + "get", + URLS.GET_PRODUCT_BESTSELLER, + {}, + {}, + onSuccess, + onFail + ); +}; diff --git a/com.twin.app.shoptime/src/actions/searchActions.js b/com.twin.app.shoptime/src/actions/searchActions.js new file mode 100644 index 00000000..97fa7f47 --- /dev/null +++ b/com.twin.app.shoptime/src/actions/searchActions.js @@ -0,0 +1,37 @@ +import { URLS } from "../api/apiConfig"; +import { TAxios } from "../api/TAxios"; +import { types } from "./actionTypes"; + +// Search 통합검색 (IBS) 데이터 조회 IF-LGSP-090 +export const getSearch = (params) => (dispatch, getState) => { + const { service, query, startIndex, maxResults, domain } = params; + + const onSuccess = (response) => { + console.log("getSearch onSuccess: ", response.data); + + dispatch({ + type: types.GET_SEARCH, + payload: response.data, + }); + }; + + const onFail = (error) => { + console.error("getSearch onFail: ", error); + }; + + TAxios( + dispatch, + getState, + "post", + URLS.GET_SEARCH, + {}, + { service, query, startIndex, maxResults, domain }, + onSuccess, + onFail + ); +}; + +export const resetSearch = (status) => ({ + type: types.RESET_SEARCH, + payload: status, +}); diff --git a/com.twin.app.shoptime/src/api/TAxios.js b/com.twin.app.shoptime/src/api/TAxios.js index f179f1e8..1dddc188 100644 --- a/com.twin.app.shoptime/src/api/TAxios.js +++ b/com.twin.app.shoptime/src/api/TAxios.js @@ -1,79 +1,81 @@ -import { getUrl, URLS } from "./apiConfig"; -import { addPanels, resetPanels } from "../features/panels/panelsSlice"; -import * as HelperMethods from "../utils/helperMethods"; -import * as Config from "../utils/Config"; import axios from "axios"; +import * as HelperMethods from "../utils/helperMethods"; +import { getUrl, URLS } from "./apiConfig"; + // refresh-token 구현 필요 let tokenRefreshing = false; -export const tokenRefresh = async (dispatch, getState, autoLogin, callback) => { - // console.log('getState ', getState()); - // const {serverType} = getState().common.localSettings; - // const url = getUrl(URLS.TOKEN_REFRESH, serverType); - // const webOSVersionReal = getState().common.appStatus.webOSVersionReal; - // const {authenticationResult, tokenRequiredTime, userId} = getState().common.localSettings; - // const deviceId = getState().common.appStatus.deviceId; +export const tokenRefresh = (dispatch, getState, autoLogin, callback) => { + return new Promise((resolve, reject) => { + // console.log('getState ', getState()); + // const {serverType} = getState().common.localSettings; + // const url = getUrl(URLS.TOKEN_REFRESH, serverType); + // const webOSVersionReal = getState().common.appStatus.webOSVersionReal; + // const {authenticationResult, tokenRequiredTime, userId} = getState().common.localSettings; + // const deviceId = getState().common.appStatus.deviceId; - // if(!userId){ - // console.warn('tokenRefresh : not logged'); - // if(callback){ - // callback(false); - // } - // return; - // } - // const currentTime = new Date(); - // const gap = (currentTime - tokenRequiredTime)/1000; - // const ExpiredIn = Number(authenticationResult.ExpiresIn); - // const limitTime = ExpiredIn - (ExpiredIn * THRESHOLD_AUTH_REFRESH); - // if(!autoLogin && (gap < limitTime || tokenRefreshing)){ - // if(callback){ - // callback(false); - // } - // return; - // } - // const tokenInfo = - // { - // "authenticationResult": authenticationResult, - // deviceInfo: { - // "deviceId": deviceId, - // "deviceName": "deviceName01", - // "os": "webos", - // "model": webOSVersionReal, - // "serialNumber": "xxxx-xxxx-xxxx-xxxx" - // } - // , "userId" : userId - // }; - // if(useQAServerURL !== 'prd'){ - // console.log('tokenInfo...', tokenInfo, gap, ExpiredIn); - // } - // try{ - // tokenRefreshing = true; - // const response = await axios.put(url, tokenInfo, AUTHORIZATION); - // console.log(' tokenRefresh response....', response); - // Actions.AUTHORIZATION.headers.authorization = response.data.authenticationResult.AccessToken; - // dispatch(CommonActions.changeLocalSettings({authenticationResult:response.data.authenticationResult, tokenRequiredTime: new Date()})); - // console.log('토큰 갱신 완료...'); - // if(callback){ - // callback(true); - // } - // }catch(res) { - // const error = res && res.toJSON ? res.toJSON() : {}; - // console.error('tokenRefresh', error, res); - // if(error.message ){ - // if(error.message.indexOf('code 400') - // || error.message.indexOf('code 401') - // || error.message.indexOf('code 403')){ - // dispatch(Actions.logout()); - // } - // } - // if(callback){ - // callback(false); - // } - // }; - tokenRefreshing = false; + // if(!userId){ + // console.warn('tokenRefresh : not logged'); + // if(callback){ + // callback(false); + // } + // return; + // } + // const currentTime = new Date(); + // const gap = (currentTime - tokenRequiredTime)/1000; + // const ExpiredIn = Number(authenticationResult.ExpiresIn); + // const limitTime = ExpiredIn - (ExpiredIn * THRESHOLD_AUTH_REFRESH); + // if(!autoLogin && (gap < limitTime || tokenRefreshing)){ + // if(callback){ + // callback(false); + // } + // return; + // } + // const tokenInfo = + // { + // "authenticationResult": authenticationResult, + // deviceInfo: { + // "deviceId": deviceId, + // "deviceName": "deviceName01", + // "os": "webos", + // "model": webOSVersionReal, + // "serialNumber": "xxxx-xxxx-xxxx-xxxx" + // } + // , "userId" : userId + // }; + // if(useQAServerURL !== 'prd'){ + // console.log('tokenInfo...', tokenInfo, gap, ExpiredIn); + // } + // try{ + // tokenRefreshing = true; + // const response = await axios.put(url, tokenInfo, AUTHORIZATION); + // console.log(' tokenRefresh response....', response); + // Actions.AUTHORIZATION.headers.authorization = response.data.authenticationResult.AccessToken; + // dispatch(CommonActions.changeLocalSettings({authenticationResult:response.data.authenticationResult, tokenRequiredTime: new Date()})); + // console.log('토큰 갱신 완료...'); + // if(callback){ + // callback(true); + // } + // }catch(res) { + // const error = res && res.toJSON ? res.toJSON() : {}; + // console.error('tokenRefresh', error, res); + // if(error.message ){ + // if(error.message.indexOf('code 400') + // || error.message.indexOf('code 401') + // || error.message.indexOf('code 403')){ + // dispatch(Actions.logout()); + // } + // } + // if(callback){ + // callback(false); + // } + // }; + tokenRefreshing = false; + resolve(); + }); }; -export const TAxios = async ( +export const TAxios = ( dispatch, getState, type, @@ -84,134 +86,100 @@ export const TAxios = async ( onFail, noTokenRefresh = false ) => { - let accessToken = getState().device.accessToken; + const checkAccessToken = () => { + return new Promise((resolve) => { + const accessToken = getState().device.accessToken; + if ( + accessToken || + baseUrl === URLS.GET_AUTHENTICATION_CODE || + noTokenRefresh + ) { + resolve(accessToken); + } else { + HelperMethods.wait(100).then(() => { + resolve(checkAccessToken()); + }); + } + }); + }; - const AUTHORIZATION = { headers: {} }; + const executeRequest = (accessToken) => { + const AUTHORIZATION = { headers: {} }; - AUTHORIZATION.headers["app_id"] = "com.lgshop.app"; - AUTHORIZATION.headers["app_ver"] = "1.0.0"; - AUTHORIZATION.headers["dvc_id"] = "testdeviceid"; - AUTHORIZATION.headers["cntry_cd"] = "US"; - AUTHORIZATION.headers["prod_cd"] = "webOSTV 5.0"; - AUTHORIZATION.headers["plat_cd"] = "W20H"; - AUTHORIZATION.headers["lang_cd"] = "en-US"; - AUTHORIZATION.headers["os_ver"] = "3.0"; - AUTHORIZATION.headers["sdk_ver"] = "1.0.0"; - AUTHORIZATION.headers["publish_flag"] = "Y"; + AUTHORIZATION.headers["app_id"] = "com.lgshop.app"; + AUTHORIZATION.headers["app_ver"] = "1.0.0"; + AUTHORIZATION.headers["dvc_id"] = "testdeviceid"; + AUTHORIZATION.headers["cntry_cd"] = "US"; + AUTHORIZATION.headers["prod_cd"] = "webOSTV 5.0"; + AUTHORIZATION.headers["plat_cd"] = "W20H"; + AUTHORIZATION.headers["lang_cd"] = "en-US"; + AUTHORIZATION.headers["os_ver"] = "3.0"; + AUTHORIZATION.headers["sdk_ver"] = "1.0.0"; + AUTHORIZATION.headers["publish_flag"] = "Y"; - // Device Header 임시 - AUTHORIZATION.headers["X-Authentication"] = "MkOLvUocrJ69RH/iV1ZABJhjR2g="; - AUTHORIZATION.headers["X-Device-ID"] = - "OemUY5qbPITZv96QKlxrtcqT6ypeX6us2qANLng3/0QCUhv2mecK1UDTMYb/hjpjey9dC/kFycc/5R8u+oK56JIWyYC4V278z64YDPKbDXIsd+eECvyf+Rdm8BneIUPM"; - AUTHORIZATION.headers["X-Device-Product"] = "webOSTV 5.0"; - AUTHORIZATION.headers["X-Device-Platform"] = "W20P"; - AUTHORIZATION.headers["X-Device-Model"] = "HE_DTV_W20P_AFADATAA"; - AUTHORIZATION.headers["X-Device-Eco-Info"] = "1"; - AUTHORIZATION.headers["X-Device-Country"] = "US"; - AUTHORIZATION.headers["X-Device-Language"] = "en-US"; - AUTHORIZATION.headers["X-Device-Netcast-Platform-Version"] = "5.0.0"; - AUTHORIZATION.headers["X-Device-Publish-Flag"] = "N"; - AUTHORIZATION.headers["X-Device-Fck"] = "253"; - AUTHORIZATION.headers["X-Device-Eula"] = - "additionalDataAllowed,takeOnAllowed,networkAllowed,generalTermsAllowed,chpAllowed,customAdAllowed,acrOnAllowed,voice2Allowed,voiceAllowed,acrAdAllowed"; - AUTHORIZATION.headers["X-Device-Personalization"] = "Y"; + // Device Header 임시 + AUTHORIZATION.headers["X-Authentication"] = "MkOLvUocrJ69RH/iV1ZABJhjR2g="; + AUTHORIZATION.headers["X-Device-ID"] = + "OemUY5qbPITZv96QKlxrtcqT6ypeX6us2qANLng3/0QCUhv2mecK1UDTMYb/hjpjey9dC/kFycc/5R8u+oK56JIWyYC4V278z64YDPKbDXIsd+eECvyf+Rdm8BneIUPM"; + AUTHORIZATION.headers["X-Device-Product"] = "webOSTV 5.0"; + AUTHORIZATION.headers["X-Device-Platform"] = "W20P"; + AUTHORIZATION.headers["X-Device-Model"] = "HE_DTV_W20P_AFADATAA"; + AUTHORIZATION.headers["X-Device-Eco-Info"] = "1"; + AUTHORIZATION.headers["X-Device-Country"] = "US"; + AUTHORIZATION.headers["X-Device-Language"] = "en-US"; + AUTHORIZATION.headers["X-Device-Netcast-Platform-Version"] = "5.0.0"; + AUTHORIZATION.headers["X-Device-Publish-Flag"] = "N"; + AUTHORIZATION.headers["X-Device-Fck"] = "253"; + AUTHORIZATION.headers["X-Device-Eula"] = + "additionalDataAllowed,takeOnAllowed,networkAllowed,generalTermsAllowed,chpAllowed,customAdAllowed,acrOnAllowed,voice2Allowed,voiceAllowed,acrAdAllowed"; + AUTHORIZATION.headers["X-Device-Personalization"] = "Y"; - if ( - baseUrl !== URLS.GET_AUTHENTICATION_CODE && - !accessToken && - !noTokenRefresh - ) { - console.log("Waiting for access token..."); - while (!accessToken) { - await HelperMethods.wait(100); - - accessToken = getState().device.accessToken; - } - } - - if (accessToken) { - AUTHORIZATION.headers["lgsp_auth"] = accessToken; - } - - if (typeof window === "object") { - let url = ""; - - if (Array.isArray(baseUrl)) { - url = getUrl(baseUrl[0]); - } else { - url = getUrl(baseUrl); + if (accessToken) { + AUTHORIZATION.headers["lgsp_auth"] = accessToken; } - switch (type) { - case "get": { + if (typeof window === "object") { + let url = Array.isArray(baseUrl) ? getUrl(baseUrl[0]) : getUrl(baseUrl); + + if (type === "get") { const _urlparams = HelperMethods.createQueryString(urlParams); - url += url ? `?${_urlparams}` : ""; - break; + } + + let axiosInstance; + switch (type) { + case "get": + axiosInstance = axios.get(url, AUTHORIZATION); + break; + case "post": + axiosInstance = axios.post(url, params, AUTHORIZATION); + break; + // TODO: 다른 HTTP 메소드 있다면 처리 (chw) + } + + if (axiosInstance) { + axiosInstance + .then((res) => { + console.log("TAxios response", url, res); + if (onSuccess) onSuccess(res); + }) + .catch((error) => { + console.error("TAxios ", url, error); + if (onFail) onFail(error); + }); } } + }; - console.log("TAxios ", type + ": " + url, params); - + checkAccessToken().then((accessToken) => { if (!noTokenRefresh) { - await tokenRefresh(dispatch, getState); - } - - while (tokenRefreshing) { - await HelperMethods.wait(100); - } - - let axiosInstance = null; - - switch (type) { - case "get": - AUTHORIZATION.headers = { ...AUTHORIZATION.headers, ...params }; - axiosInstance = axios[type](url, AUTHORIZATION); - break; - - case "put": - // put이 있다면 구현 필요 - - case "post": - axiosInstance = axios[type](url, params, AUTHORIZATION); - break; - - case "delete": - // delete가 있다면 구현 필요 - } - - if (axiosInstance) { - axiosInstance - .then((res) => { - console.log("TAxios response", url, res); - - if (onSuccess) { - onSuccess(res); - } - }) - .catch((res) => { - const error = res && res.toJSON ? res.toJSON() : {}; - - console.error("TAxios ", url, error); - - if (error.message === "Network Error") { - dispatch(resetPanels()); - dispatch( - addPanels({ - name: Config.panel_names.ERROR_PANEL, - panelInfo: { reason: "server Error" }, - }) - ); - } else { - // todo - } - - if (onFail) { - onFail(res); - } + tokenRefresh(dispatch, getState) + .then(() => executeRequest(accessToken)) + .catch(() => { + /* 토큰 갱신 실패 처리 */ }); } else { - console.warn("TAxios invalid case type ", type); + executeRequest(accessToken); } - } + }); }; diff --git a/com.twin.app.shoptime/src/api/axiosConfig.js b/com.twin.app.shoptime/src/api/axiosConfig.js deleted file mode 100644 index 0a19c0ce..00000000 --- a/com.twin.app.shoptime/src/api/axiosConfig.js +++ /dev/null @@ -1,41 +0,0 @@ -/* ---------------------- - - 삭제 예정 - ----------------------- */ - -import axios from "axios"; -import { store } from "../store/store"; -import { SHOPTIME_BASE_URL } from "./apiConfig"; - -const api = axios.create({ - baseURL: SHOPTIME_BASE_URL, -}); - -api.defaults.headers.common["app_id"] = "com.lgshop.app"; -api.defaults.headers.common["app_ver"] = "1.0.0"; -api.defaults.headers.common["dvc_id"] = "testdeviceid"; -api.defaults.headers.common["cntry_cd"] = "US"; -api.defaults.headers.common["prod_cd"] = "webOSTV 5.0"; -api.defaults.headers.common["plat_cd"] = "W20H"; -api.defaults.headers.common["lang_cd"] = "en-US"; -api.defaults.headers.common["os_ver"] = "3.0"; -api.defaults.headers.common["sdk_ver"] = "1.0.0"; -api.defaults.headers.common["publish_flag"] = "Y"; - -api.interceptors.request.use( - (config) => { - const accessToken = store.getState().auth.accessToken; - - if (accessToken) { - config.headers["lgsp_auth"] = accessToken; - } - - return config; - }, - (error) => { - return Promise.reject(error); - } -); - -export default api; diff --git a/com.twin.app.shoptime/src/api/homeApi.js b/com.twin.app.shoptime/src/api/homeApi.js deleted file mode 100644 index f15609b5..00000000 --- a/com.twin.app.shoptime/src/api/homeApi.js +++ /dev/null @@ -1,43 +0,0 @@ -/* ---------------------- - - 삭제 예정 - ----------------------- */ - -import { URLS } from "./apiConfig"; -import api from "./axiosConfig"; - -// 광고주 AD 정보 상세 조회 - Multiple 전시 IF-LGSP-082 -export async function getAdDetailAMD() {} - -// 광고주 AD 정보 상세 조회 - Single 전시 IF-LGSP-083 -export async function getAdDetailAPD() {} - -// 광고주 AD 정보 상세 조회 - Theme 전시 IF-LGSP-081 -export async function getAdDetailATD() {} - -// HOME Main Contents Banner 정보 조회 IF-LGSP-301 -export async function getHomeMainContents() {} - -// HOME LAYOUT 정보 조회 IF-LGSP-300 -export async function getHomeLayout() {} - -// 메뉴 목록 조회 IF-LGSP-044 -export async function getHomeMenu() {} - -// 약관 정보 조회 IF-LGSP-005 -export async function getHomeTerms() {} - -// Theme 전시 정보 상세 조회 IF-LGSP-060 -export async function getThemeCurationDetailInfo() {} - -export default { - getAdDetailAMD, - getAdDetailAPD, - getAdDetailATD, - getHomeMainContents, - getHomeLayout, - getHomeMenu, - getHomeTerms, - getThemeCurationDetailInfo, -}; diff --git a/com.twin.app.shoptime/src/api/onSaleApi.js b/com.twin.app.shoptime/src/api/onSaleApi.js deleted file mode 100644 index 0bc0f07a..00000000 --- a/com.twin.app.shoptime/src/api/onSaleApi.js +++ /dev/null @@ -1,33 +0,0 @@ -/* ---------------------- - - 삭제 예정 - ----------------------- */ - -import { URLS } from "./apiConfig"; -import api from "./axiosConfig"; - -// Onsale 조회 IF-LGSP-086 -export async function getOnSaleInfo(props) { - const { lgCatCd, categoryIncFlag } = props; - - try { - const response = await api.get(URLS.GET_ON_SALE_INFO, { - params: { - categoryIncFlag, - lgCatCd, - }, - }); - - return response.data.data; - } catch (error) { - const { response } = error; - - if (response) { - const statusCode = response.status; - const statusText = response.statusText; - - console.error(`Error: ${statusCode} ${statusText}`); - } - } -} diff --git a/com.twin.app.shoptime/src/components/SmoodShowingAnimation/SmoodShowingAnimation.jsx b/com.twin.app.shoptime/src/components/SmoodShowingAnimation/SmoodShowingAnimation.jsx index 3b280f9f..86827d05 100644 --- a/com.twin.app.shoptime/src/components/SmoodShowingAnimation/SmoodShowingAnimation.jsx +++ b/com.twin.app.shoptime/src/components/SmoodShowingAnimation/SmoodShowingAnimation.jsx @@ -1,4 +1,4 @@ -import React, { useMemo, useEffect, useState } from "react"; +import React, { useEffect, useMemo, useState } from "react"; /* eslint-disable */ export default function SmoodShowingAnimation(WrappedComponent) { diff --git a/com.twin.app.shoptime/src/components/TIconButton/TIconButton.jsx b/com.twin.app.shoptime/src/components/TIconButton/TIconButton.jsx index 078ef871..e278209c 100644 --- a/com.twin.app.shoptime/src/components/TIconButton/TIconButton.jsx +++ b/com.twin.app.shoptime/src/components/TIconButton/TIconButton.jsx @@ -1,11 +1,14 @@ import React, { useCallback, useRef, useState } from "react"; -import css from "./TIconButton.module.less"; -import Spottable from "@enact/spotlight/Spottable"; + import classNames from "classnames"; import { useDispatch } from "react-redux"; + import { Job } from "@enact/core/util"; +import Spottable from "@enact/spotlight/Spottable"; + +import { popPanel, resetPanels } from "../../actions/panelActions"; import * as Config from "../../utils/Config"; -import { popPanel, resetPanels } from "../../features/panels/panelsSlice"; +import css from "./TIconButton.module.less"; const SpottableComponent = Spottable("div"); diff --git a/com.twin.app.shoptime/src/components/TIconButton/TIconButton.module.less b/com.twin.app.shoptime/src/components/TIconButton/TIconButton.module.less index 333191f3..05f41661 100644 --- a/com.twin.app.shoptime/src/components/TIconButton/TIconButton.module.less +++ b/com.twin.app.shoptime/src/components/TIconButton/TIconButton.module.less @@ -12,6 +12,7 @@ .leftArrow { background-image: url("../../../assets/searchpanel/sch-arr-l.png"); background-position: center top; + background-size: cover; width: 47px; height: 92px; @@ -24,6 +25,7 @@ .rightArrow { background-image: url("../../../assets/searchpanel/sch-arr-r.png"); background-position: center top; + background-size: cover; width: 47px; height: 92px; diff --git a/com.twin.app.shoptime/src/components/TInput/TInput.jsx b/com.twin.app.shoptime/src/components/TInput/TInput.jsx index de66c7d1..375ace57 100644 --- a/com.twin.app.shoptime/src/components/TInput/TInput.jsx +++ b/com.twin.app.shoptime/src/components/TInput/TInput.jsx @@ -1,10 +1,12 @@ -import React, { forwardRef, useCallback, useRef, useEffect } from "react"; -import css from "./TInput.module.less"; -import { InputField } from "@enact/sandstone/Input"; -import Spottable from "@enact/spotlight/Spottable"; +import React from "react"; + import classNames from "classnames"; + +import { InputField } from "@enact/sandstone/Input"; import { SpotlightContainerDecorator } from "@enact/spotlight/SpotlightContainerDecorator"; + import TIconButton from "../TIconButton/TIconButton"; +import css from "./TInput.module.less"; const Container = SpotlightContainerDecorator("div"); @@ -43,4 +45,4 @@ export default function TInput({ ); } -export { KINDS, ICONS, BORDER, COLOR }; +export { BORDER, COLOR, ICONS, KINDS }; diff --git a/com.twin.app.shoptime/src/components/TInput/TInput.module.less b/com.twin.app.shoptime/src/components/TInput/TInput.module.less index 9d32e8c0..57593c67 100644 --- a/com.twin.app.shoptime/src/components/TInput/TInput.module.less +++ b/com.twin.app.shoptime/src/components/TInput/TInput.module.less @@ -44,6 +44,7 @@ position: absolute; background-repeat: no-repeat; background-position: center top; + background-size: cover; width: 41px; height: 41px; top: 50%; diff --git a/com.twin.app.shoptime/src/components/TPanel/TPanel.jsx b/com.twin.app.shoptime/src/components/TPanel/TPanel.jsx index 818d8c33..ec714559 100644 --- a/com.twin.app.shoptime/src/components/TPanel/TPanel.jsx +++ b/com.twin.app.shoptime/src/components/TPanel/TPanel.jsx @@ -1,11 +1,14 @@ +import React, { useCallback } from "react"; + import classNames from "classnames"; -import React, { useCallback, useEffect } from "react"; -import { useDispatch, useSelector } from "react-redux"; +import { useDispatch } from "react-redux"; + import { Panel } from "@enact/sandstone/Panels"; import { Cancelable } from "@enact/ui/Cancelable"; -import css from "./TPanel.module.less"; + +import { popPanel } from "../../actions/panelActions"; import SmoodShowingAnimation from "../SmoodShowingAnimation/SmoodShowingAnimation"; -import { popPanel } from "../../features/panels/panelsSlice"; +import css from "./TPanel.module.less"; const CancelablePanel = Cancelable( { modal: true, onCancel: "handleCancel" }, @@ -37,8 +40,6 @@ const TPanel = ({ [dispatch, handleCancel, isTabActivated] ); - console.log(isTabActivated); - return ( { diff --git a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/CategoryIcon.jsx b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/CategoryIcon.jsx index 7bdff0cd..69313b92 100644 --- a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/CategoryIcon.jsx +++ b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/CategoryIcon.jsx @@ -1,3 +1,5 @@ +import React from "react"; + import { convertThemeColor } from "./convertThemeColor"; const CategoryIcon = ({ iconType = "normal" }) => { diff --git a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/FeaturedBrandIcon.jsx b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/FeaturedBrandIcon.jsx index d2258bea..2ffd8e8a 100644 --- a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/FeaturedBrandIcon.jsx +++ b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/FeaturedBrandIcon.jsx @@ -1,4 +1,7 @@ +import React from "react"; + import { convertThemeColor } from "./convertThemeColor"; + const FeaturedBrandIcon = ({ iconType = "normal" }) => { return ( diff --git a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/HomeIcon.jsx b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/HomeIcon.jsx index 4e75d923..ae747884 100644 --- a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/HomeIcon.jsx +++ b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/HomeIcon.jsx @@ -1,3 +1,5 @@ +import React from "react"; + import { convertThemeColor } from "./convertThemeColor"; const HomeIcon = ({ iconType = "normal" }) => { diff --git a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/HotPicksIcon.jsx b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/HotPicksIcon.jsx index f5374edf..b772129b 100644 --- a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/HotPicksIcon.jsx +++ b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/HotPicksIcon.jsx @@ -1,3 +1,5 @@ +import React from "react"; + import { convertThemeColor } from "./convertThemeColor"; const HotPicksIcon = ({ iconType = "normal" }) => { diff --git a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/MyPageIcon.jsx b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/MyPageIcon.jsx index dfe7c621..85c4a170 100644 --- a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/MyPageIcon.jsx +++ b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/MyPageIcon.jsx @@ -1,3 +1,5 @@ +import React from "react"; + import { convertThemeColor } from "./convertThemeColor"; const MyPageIcon = ({ iconType = "normal" }) => { diff --git a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/OnSaleIcon.jsx b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/OnSaleIcon.jsx index fe2597b6..0c36eda5 100644 --- a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/OnSaleIcon.jsx +++ b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/OnSaleIcon.jsx @@ -1,3 +1,5 @@ +import React from "react"; + import { convertThemeColor } from "./convertThemeColor"; const OnSaleIcon = ({ iconType = "normal" }) => { diff --git a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/SearchIcon.jsx b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/SearchIcon.jsx index 54b5480c..6135a586 100644 --- a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/SearchIcon.jsx +++ b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/SearchIcon.jsx @@ -1,3 +1,5 @@ +import React from "react"; + import { convertThemeColor } from "./convertThemeColor"; const SearchIcon = ({ iconType = "normal" }) => { diff --git a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/TrendingNowIcon.jsx b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/TrendingNowIcon.jsx index b367a375..b6cd691b 100644 --- a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/TrendingNowIcon.jsx +++ b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/TrendingNowIcon.jsx @@ -1,4 +1,7 @@ +import React from "react"; + import { convertThemeColor } from "./convertThemeColor"; + const TrendingNowIcon = ({ iconType = "normal" }) => { return ( diff --git a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/convertThemeColor.js b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/convertThemeColor.js index 17959f30..ee9d51c1 100644 --- a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/convertThemeColor.js +++ b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/convertThemeColor.js @@ -3,9 +3,7 @@ export const convertThemeColor = (iconType) => { const theme = { light: { normal: "#353535", - expanded: "#353535", - selected: "#FEFEFE", - focused: "#FEFEFE", + expanded: "#FEFEFE", }, }; diff --git a/com.twin.app.shoptime/src/features/.DS_Store b/com.twin.app.shoptime/src/features/.DS_Store deleted file mode 100644 index 5546bd01..00000000 Binary files a/com.twin.app.shoptime/src/features/.DS_Store and /dev/null differ diff --git a/com.twin.app.shoptime/src/features/appData/appDataSlice.js b/com.twin.app.shoptime/src/features/appData/appDataSlice.js deleted file mode 100644 index ecacacde..00000000 --- a/com.twin.app.shoptime/src/features/appData/appDataSlice.js +++ /dev/null @@ -1,19 +0,0 @@ -import { createSlice } from "@reduxjs/toolkit"; - -export const appDataSlice = createSlice({ - name: "appData", - initialState: { - mainIndex: null, - }, - reducers: { - addMainIndex: (state, action) => { - state.mainIndex = action.payload; - }, - }, -}); - -// Action creators are generated for each case reducer function -export const { addMainIndex, decrement, incrementByAmount } = - appDataSlice.actions; - -export default appDataSlice.reducer; diff --git a/com.twin.app.shoptime/src/features/brand/brandsSlice.js b/com.twin.app.shoptime/src/features/brand/brandsSlice.js deleted file mode 100644 index 63a8fbdd..00000000 --- a/com.twin.app.shoptime/src/features/brand/brandsSlice.js +++ /dev/null @@ -1,122 +0,0 @@ -import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; - -import { URLS } from "../../api/apiConfig"; -import { TAxios } from "../../api/TAxios"; - -// Featured Brands 정보 조회 IF-LGSP-304 -// @@pyh Todo, 기존의 key가 brandList에서 brandInfo로 변경 됨에 따라 함수명 또한 바뀔 수 있음 (문서 확인 후 변경 처리) -export const getBrandList = createAsyncThunk( - "brand/getBrandList", - - async (_, thunkAPI) => { - const onSuccess = (response) => { - console.log("@@ getBrandList onSuccess ", response.data); - - thunkAPI.dispatch(brandSlice.actions.updateBrandInfo(response.data.data)); - }; - - const onFail = (error) => { - console.log("@@ getBrandList onFail", error); - }; - - TAxios( - thunkAPI.dispatch, - thunkAPI.getState, - "get", - URLS.GET_BRAND_LIST, - {}, - {}, - onSuccess, - onFail - ); - } -); - -// Featured Brands LAYOUT (shelf) 정보 조회 IF-LGSP-305 -export const getBrandLayoutInfo = createAsyncThunk( - "brand/getBrandLayoutInfo", - - async (props, thunkAPI) => { - const { patnrId } = props; - - const onSuccess = (response) => { - console.log("@@ getBrandLayoutInfo onSuccess ", response.data); - - thunkAPI.dispatch(brandSlice.actions.updateLayoutBrandInfo(response.data.data)); - }; - - const onFail = (error) => { - console.log("@@ getBrandLayoutInfo onFail ", error); - }; - - TAxios( - thunkAPI.dispatch, - thunkAPI.getState, - "get", - URLS.GET_BRAND_LAYOUT_INFO, - { patnrId }, - {}, - onSuccess, - onFail - ); - } -); - -// Featured Brands Live 채널 정보 조회 IF-LGSP-306 -export const getBrandLiveChannelInfo = createAsyncThunk( - "brand/getBrandLiveChannelInfo", - - async (props, thunkAPI) => { - const { patnrId } = props; - - const onSuccess = (response) => { - console.log("@@ getBrandLiveChannelInfo onSuccess ", response.data); - - thunkAPI.dispatch(brandSlice.actions.updateBrandLiveChannelInfo(response.data.data)); - }; - - const onFail = (error) => { - console.log("@@ getBrandLiveChannelInfo onFail ", error); - }; - - TAxios( - thunkAPI.dispatch, - thunkAPI.getState, - "get", - URLS.GET_BRAND_LIVE_CHANNEL_INFO, - { patnrId }, - {}, - onSuccess, - onFail - ); - } -); - -const initialState = { - brandInfoData: {}, - brandLayoutInfoData: {}, - brandLiveChannelInfoData: {}, -}; - -export const brandSlice = createSlice({ - name: "brand", - initialState, - reducers: { - updateBrandInfo: (state, action) => { - state.brandInfoData = action.payload; - }, - - updateLayoutBrandInfo: (state, action) => { - state.brandLayoutInfoData = action.payload; - }, - - updateBrandLiveChannelInfo: (state, action) => { - state.brandLiveChannelInfoData = action.payload; - }, - }, -}); - -export const { updateBrandInfo, updateLayoutBrandInfo, updateBrandLiveChannelInfo } = - brandSlice.actions; - -export default brandSlice.reducer; diff --git a/com.twin.app.shoptime/src/features/device/deviceSlice.js b/com.twin.app.shoptime/src/features/device/deviceSlice.js deleted file mode 100644 index 11e0a786..00000000 --- a/com.twin.app.shoptime/src/features/device/deviceSlice.js +++ /dev/null @@ -1,51 +0,0 @@ -import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; -import { URLS } from "../../api/apiConfig"; -import { TAxios } from "../../api/TAxios"; - -// 인증코드 요청 IF-LGSP-000 -export const getAuthenticationCode = createAsyncThunk( - "auth/getAuthenticationCode", - - async (_, thunkAPI) => { - const onSuccess = (response) => { - console.log("getAuthenticationCode onSuccess ", response.data); - - thunkAPI.dispatch( - deviceSlice.actions.updateAccessToken(response.data.data.accessToken) - ); - }; - - const onFail = (error) => { - console.error("getAuthenticationCode onFail ", error); - }; - - TAxios( - thunkAPI.dispatch, - thunkAPI.getState, - "get", - URLS.GET_AUTHENTICATION_CODE, - {}, - {}, - onSuccess, - onFail - ); - } -); - -const initialState = { - accessToken: null, -}; - -export const deviceSlice = createSlice({ - name: "device", - initialState, - reducers: { - updateAccessToken: (state, action) => { - state.accessToken = action.payload; - }, - }, -}); - -export const { updateAccessToken } = deviceSlice.actions; - -export default deviceSlice.reducer; diff --git a/com.twin.app.shoptime/src/features/event/eventSlice.js b/com.twin.app.shoptime/src/features/event/eventSlice.js deleted file mode 100644 index f2f9e61c..00000000 --- a/com.twin.app.shoptime/src/features/event/eventSlice.js +++ /dev/null @@ -1,51 +0,0 @@ -import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; - -import { URLS } from "../../api/apiConfig"; -import { TAxios } from "../../api/TAxios"; - -// 이벤트 정보 조회 IF-LGSP-070 : -export const getWelcomeEventInfo = createAsyncThunk( - "event/getWelcomeEventInfo", - - async (_, thunkAPI) => { - const onSuccess = (response) => { - console.log("getWelcomeEventInfo onSuccess ", response.data); - - thunkAPI.dispatch(eventSlice.actions.updateEventData(response.data.data)); - }; - - const onFail = (error) => { - console.error("getWelcomeEventInfo onFail ", error); - }; - - TAxios( - thunkAPI.dispatch, - thunkAPI.getState, - "get", - URLS.GET_WELCOME_EVENT_INFO, - {}, - {}, - onSuccess, - onFail - ); - } -); - -const initialState = { - eventData: {}, -}; - -export const eventSlice = createSlice({ - name: "event", - initialState, - reducers: { - updateEventData: (state, action) => { - // console.log("#action", action); - state.eventData = action.payload; - // console.log("#state", state.eventData); - }, - }, -}); - -export const { updateEventData } = eventSlice.actions; -export default eventSlice.reducer; diff --git a/com.twin.app.shoptime/src/features/home/homeSlice.js b/com.twin.app.shoptime/src/features/home/homeSlice.js deleted file mode 100644 index d9343829..00000000 --- a/com.twin.app.shoptime/src/features/home/homeSlice.js +++ /dev/null @@ -1,186 +0,0 @@ -import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; -import { URLS } from "../../api/apiConfig"; -import { TAxios } from "../../api/TAxios"; - -// 약관 정보 조회 IF-LGSP-005 -export const getHomeTerms = createAsyncThunk( - "home/getHomeTerms", - - async (props, thunkAPI) => { - const { trmsTpCdList, mbrNo } = props; - - const onSuccess = (response) => { - console.log("getHomeTerms onSuccess ", response.data); - - thunkAPI.dispatch(homeSlice.actions.updateTermsData(response.data)); - }; - - const onFail = (error) => { - console.error("getHomeTerms onFail ", error); - }; - - TAxios( - thunkAPI.dispatch, - thunkAPI.getState, - "get", - URLS.GET_HOME_TERMS, - { trmsTpCdList, mbrNo }, - {}, - onSuccess, - onFail - ); - } -); - -// 메뉴 목록 조회 IF-LGSP-044 -export const getHomeMenu = createAsyncThunk( - "home/getHomeMenu", - - async (_, thunkAPI) => { - const onSuccess = (response) => { - console.log("getHomeMenu onSuccess ", response.data); - - thunkAPI.dispatch(homeSlice.actions.updateMenuData(response.data)); - }; - - const onFail = (error) => { - console.error("getHomeMenu onFail ", error); - }; - - TAxios( - thunkAPI.dispatch, - thunkAPI.getState, - "get", - URLS.GET_HOME_MENU, - {}, - {}, - onSuccess, - onFail - ); - } -); - -// HOME LAYOUT 정보 조회 IF-LGSP-300 -export const getHomeLayout = createAsyncThunk( - "home/getHomeLayout", - - async (_, thunkAPI) => { - const onSuccess = (response) => { - console.log("getHomeLayout onSuccess", response.data); - - thunkAPI.dispatch(homeSlice.actions.updateLayoutData(response.data.data)); - }; - - const onFail = (error) => { - console.error("getHomeLayout onFail", error); - }; - - TAxios( - thunkAPI.dispatch, - thunkAPI.getState, - "get", - URLS.GET_HOME_LAYOUT, - {}, - {}, - onSuccess, - onFail - ); - } -); - -// HOME Main Contents Banner 정보 조회 IF-LGSP-301 -export const getHomeMainContents = createAsyncThunk( - "home/getHomeMainContents", - - async (_, thunkAPI) => { - const onSuccess = (response) => { - console.log("getHomeMainContents onSuccess", response.data); - - thunkAPI.dispatch(homeSlice.actions.updateMainContentsData(response.data.data)); - }; - - const onFail = (error) => { - console.error("getHomeMainContents onFail", error); - }; - - TAxios( - thunkAPI.dispatch, - thunkAPI.getState, - "get", - URLS.GET_HOME_MAIN_CONTENTS, - {}, - {}, - onSuccess, - onFail - ); - } -); - -// Theme 전시 정보 조회 : IF-LGSP-045 -export const getThemeCurationInfo = createAsyncThunk( - "home/getThemeCurationInfo", - - async (_, thunkAPI) => { - const onSuccess = (response) => { - console.log("getThemeCurationInfo onSuccess", response.data); - - thunkAPI.dispatch(homeSlice.actions.updateThemeCurationInfoDataData(response.data.data)); - }; - - const onFail = (error) => { - console.error("getThemeCurationInfo onFail", error); - }; - - TAxios( - thunkAPI.dispatch, - thunkAPI.getState, - "get", - URLS.GET_THEME_CURATION_INFO, - {}, - {}, - onSuccess, - onFail - ); - } -); - -const initialState = { - termsData: {}, - menuData: {}, - layoutData: {}, - mainContentsData: {}, - themeCurationInfoData: {}, -}; - -export const homeSlice = createSlice({ - name: "home", - initialState, - reducers: { - updateTermsData: (state, action) => { - state.termsData = action.payload; - }, - updateMenuData: (state, action) => { - //임시코드 - state.menuData = action.payload; - }, - updateLayoutData: (state, action) => { - state.layoutData = action.payload; - }, - updateMainContentsData: (state, action) => { - state.mainContentsData = action.payload; - }, - updateThemeCurationInfoDataData: (state, action) => { - state.themeCurationInfoData = action.payload; - }, - }, -}); - -export const { - updateTermsData, - updateMenuData, - updateLayoutData, - updateMainContentsData, - updateThemeCurationInfoDataData, -} = homeSlice.actions; - -export default homeSlice.reducer; diff --git a/com.twin.app.shoptime/src/features/main/mainSlice.js b/com.twin.app.shoptime/src/features/main/mainSlice.js deleted file mode 100644 index 2b80fb0a..00000000 --- a/com.twin.app.shoptime/src/features/main/mainSlice.js +++ /dev/null @@ -1,87 +0,0 @@ -import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; - -import { URLS } from "../../api/apiConfig"; -import { TAxios } from "../../api/TAxios"; - -//서브카테고리 조회 IF-LGSP-051 -export const getSubCategory = createAsyncThunk( - "main/getSubCategory", - - async (props, thunkAPI) => { - const { lgCatCd, patnrIdList, pageSize, tabType, filterType } = props; - - const onSuccess = (response) => { - console.log("getSubCategory onSuccess ", response.data); - - thunkAPI.dispatch( - mainSlice.actions.updateSubCategoryData(response.data.data) - ); - }; - - const onFail = (error) => { - console.log("getSubCategory onFail", error); - }; - - TAxios( - thunkAPI.dispatch, - thunkAPI.getState, - "get", - URLS.GET_SUB_CATEGORY, - { lgCatCd, patnrIdList, pageSize, tabType, filterType }, - {}, - onSuccess, - onFail - ); - } -); - -//TOP20 영상 목록 조회 IF-LGSP-069 -export const getTop20Show = createAsyncThunk( - "main/getTop20Show", - - async (_, thunkAPI) => { - const onSuccess = (response) => { - console.log("getTop20Show onSuccess ", response.data); - - thunkAPI.dispatch( - mainSlice.actions.updateTop20ShowData(response.data.data) - ); - }; - const onFail = (error) => { - console.log("getTop20Show onFail", error); - }; - - TAxios( - thunkAPI.dispatch, - thunkAPI.getState, - "get", - URLS.GET_TOP20_SHOW, - {}, - {}, - onSuccess, - onFail - ); - } -); - -const initialState = { - subCategoryData: {}, - top20ShowData: {}, -}; - -export const mainSlice = createSlice({ - name: "mainSlice", - initialState, - reducers: { - updateSubCategoryData: (state, action) => { - state.subCategoryData = action.payload; - }, - updateTop20ShowData: (state, action) => { - state.top20ShowData = action.payload; - }, - }, -}); - -export const { updateSubCategoryData, updateTop20Show } = mainSlice.actions; - -export default mainSlice.reducer; diff --git a/com.twin.app.shoptime/src/features/mypage/myPageSlice.js b/com.twin.app.shoptime/src/features/mypage/myPageSlice.js deleted file mode 100644 index 154d82d1..00000000 --- a/com.twin.app.shoptime/src/features/mypage/myPageSlice.js +++ /dev/null @@ -1,52 +0,0 @@ -import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; - -import { URLS } from "../../api/apiConfig"; -import { TAxios } from "../../api/TAxios"; - -// 추천 Keyword 목록 조회 IF-LGSP-055 -export const getMyRecommandedKeyword = createAsyncThunk( - "myPage/getMyRecommandedKeyword", - - async (_, thunkAPI) => { - const onSuccess = (response) => { - console.log("getMyRecommandedKeyword onSuccess ", response.data); - - thunkAPI.dispatch( - myPageSlice.actions.updateRecommandedKeywordData(response.data) - ); - }; - - const onFail = (error) => { - console.error("getMyRecommandedKeyword onFail ", error); - }; - - TAxios( - thunkAPI.dispatch, - thunkAPI.getState, - "get", - URLS.GET_MY_RECOMMANDED_KEYWORD, - {}, - {}, - onSuccess, - onFail - ); - } -); - -const initialState = { - recommandedKeywordData: {}, -}; - -export const myPageSlice = createSlice({ - name: "myPage", - initialState, - reducers: { - updateRecommandedKeywordData: (state, action) => { - state.recommandedKeywordData = action.payload; - }, - }, -}); - -export const { updateRecommandedKeywordData } = myPageSlice.actions; - -export default myPageSlice.reducer; diff --git a/com.twin.app.shoptime/src/features/onSale/onSaleSlice.js b/com.twin.app.shoptime/src/features/onSale/onSaleSlice.js deleted file mode 100644 index 060b88ed..00000000 --- a/com.twin.app.shoptime/src/features/onSale/onSaleSlice.js +++ /dev/null @@ -1,51 +0,0 @@ -import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; - -import { URLS } from "../../api/apiConfig"; -import { TAxios } from "../../api/TAxios"; - -// On Sale 조회 IF-LGSP-086 -export const getOnSaleInfo = createAsyncThunk( - "onSale/getOnSaleInfo", - - async (props, thunkAPI) => { - const { categoryIncFlag, lgCatCd } = props; - const onSuccess = (response) => { - console.log("getOnSaleInfo onSuccess ", response.data); - - thunkAPI.dispatch(onSaleSlice.actions.updateOnSaleData(response.data.data)); - }; - - const onFail = (error) => { - console.log("getOnSaleInfo onFail", error); - }; - - TAxios( - thunkAPI.dispatch, - thunkAPI.getState, - "get", - URLS.GET_ON_SALE_INFO, - { categoryIncFlag, lgCatCd }, - {}, - onSuccess, - onFail - ); - } -); - -const initialState = { - onSaleData: {}, -}; - -export const onSaleSlice = createSlice({ - name: "onSale", - initialState, - reducers: { - updateOnSaleData: (state, action) => { - state.onSaleData = action.payload; - }, - }, -}); - -export const { updateOnSaleData } = onSaleSlice.actions; - -export default onSaleSlice.reducer; diff --git a/com.twin.app.shoptime/src/features/panels/panelsSlice.js b/com.twin.app.shoptime/src/features/panels/panelsSlice.js deleted file mode 100644 index 51461b2a..00000000 --- a/com.twin.app.shoptime/src/features/panels/panelsSlice.js +++ /dev/null @@ -1,118 +0,0 @@ -import { createSlice } from "@reduxjs/toolkit"; - -import { panel_names } from "../../utils/Config"; - -const initialState = { - panels: [], - isModalOpen: false, -}; - -const forceTopPanels = [ - panel_names.ERROR_PANEL, - panel_names.DEBUG_PANEL, - panel_names.INTRO_PANEL, -]; - -export const panels = createSlice({ - name: "panels", - initialState, - reducers: { - addPanels: (state, action) => { - if (!action.payload.panelInfo) { - action.payload.panelInfo = {}; - } - - const forceTopPanelsInfo = []; - const newState = []; - let forceTopIndex; - - for (let index in state.panels) { - forceTopIndex = forceTopPanels.indexOf(state.panels[index].name); - if (forceTopIndex >= 0) { - forceTopPanelsInfo[forceTopIndex] = state.panels[index]; - } else if (state.panels[index].name !== action.payload.name) { - newState.push(state.panels[index]); - } - } - - forceTopIndex = forceTopPanels.indexOf(action.payload.name); - - if (forceTopIndex >= 0) { - forceTopPanelsInfo[forceTopIndex] = action.payload; - } else { - newState.push(action.payload); - } - for (let i = 0; i < forceTopPanels.length; i++) { - if (forceTopPanelsInfo[i]) { - newState.push(forceTopPanelsInfo[i]); - } - } - state.panels = newState; - }, - popPanel: (state, action) => { - let existIndex = -1; - - if (action?.payload) { - for (let index in state.panels) { - if (state.panels[index].name === action.payload) { - existIndex = index; - break; - } - } - } - if (existIndex >= 0) { - // exist - state.panels = [ - ...state.panels.filter((value) => value.name !== action.payload), - ]; - } - - if (!action.payload) { - state.panels = [...state.panels.slice(0, state.panels.length - 1)]; - } - }, - updatePanel: (state, action) => { - let existIndex = -1; - - for (let index in state.panels) { - if (state.panels[index].name === action.payload.name) { - existIndex = index; - break; - } - } - - if (existIndex >= 0 && action.payload.panelInfo) { - state.panels[existIndex].panelInfo = Object.assign( - {}, - state.panels[existIndex].panelInfo, - action.payload.panelInfo - ); - } - }, - updateModalStatus: (state, action) => { - state.isModalOpen = action.payload; - }, - resetPanels: (state, action) => { - state.isModalOpen = false; - - if (action.payload) { - action.payload.forEach(function (panel) { - if (!panel.panelInfo) { - panel.panelInfo = {}; - } - }); - } - state.panels = action.payload ? action.payload : []; - }, - }, -}); - -export const { - addPanels, - popPanel, - updatePanel, - updateModalStatus, - resetPanels, -} = panels.actions; - -export default panels.reducer; diff --git a/com.twin.app.shoptime/src/features/product/productSlice.js b/com.twin.app.shoptime/src/features/product/productSlice.js deleted file mode 100644 index 12919e28..00000000 --- a/com.twin.app.shoptime/src/features/product/productSlice.js +++ /dev/null @@ -1,49 +0,0 @@ -import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; -import { URLS } from "../../api/apiConfig"; -import { TAxios } from "../../api/TAxios"; - -// Best Seller 상품 목록 조회 IF-LGSP-303 -export const getBestSeller = createAsyncThunk( - "bestSeller/getBestSeller", - async (_, thunkAPI) => { - const onSuccess = (response) => { - console.log("getBestSeller onSuccess", response.data); - - thunkAPI.dispatch( - productSlice.actions.updateBestSellerData(response.data.data) - ); - }; - - const onFail = (error) => { - console.log("getBestSeller onFail", error); - }; - - TAxios( - thunkAPI.dispatch, - thunkAPI.getState, - "get", - URLS.GET_PRODUCT_BESTSELLER, - {}, - {}, - onSuccess, - onFail - ); - } -); - -const initialState = { - bestSellerData: {}, -}; - -export const productSlice = createSlice({ - name: "product", - initialState, - reducers: { - updateBestSellerData: (state, action) => { - state.bestSellerData = action.payload; - }, - }, -}); - -export const { updateBestSellerData } = productSlice.actions; -export default productSlice.reducer; diff --git a/com.twin.app.shoptime/src/features/search/searchSlice.js b/com.twin.app.shoptime/src/features/search/searchSlice.js deleted file mode 100644 index f5663ef8..00000000 --- a/com.twin.app.shoptime/src/features/search/searchSlice.js +++ /dev/null @@ -1,51 +0,0 @@ -import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; -import { URLS } from "../../api/apiConfig"; -import { TAxios } from "../../api/TAxios"; - -// Search 통합검색 (IBS) 데이터 조회 IF-LGSP-090 -export const getSearch = createAsyncThunk( - "search/getSearch", - - async (params, thunkAPI) => { - const { service, query, startIndex, maxResults, domain } = params; - - const onSuccess = (response) => { - console.log("getSearch onSuccess: ", response.data); - - thunkAPI.dispatch(updateSearchData(response.data)); - }; - - const onFail = (error) => { - console.error("getSearch onFail: ", error); - }; - - TAxios( - thunkAPI.dispatch, - thunkAPI.getState, - "post", - URLS.GET_SEARCH, - {}, - { service, query, startIndex, maxResults, domain }, - onSuccess, - onFail - ); - } -); - -const initialState = { - searchDatas: {}, -}; - -export const searchSlice = createSlice({ - name: "search", - initialState, - reducers: { - updateSearchData: (state, action) => { - state.searchDatas = action.payload; - }, - }, -}); - -export const { updateSearchData } = searchSlice.actions; - -export default searchSlice.reducer; diff --git a/com.twin.app.shoptime/src/index.js b/com.twin.app.shoptime/src/index.js index 7fa734a0..631ff3e1 100644 --- a/com.twin.app.shoptime/src/index.js +++ b/com.twin.app.shoptime/src/index.js @@ -1,8 +1,10 @@ -import { createRoot } from "react-dom/client"; -import { store } from "./store/store"; +import React from "react"; +import { render } from "react-dom"; + import { Provider } from "react-redux"; import App from "./App"; +import { store } from "./store/store"; let appElement = ( @@ -10,11 +12,12 @@ let appElement = ( ); -// In a browser environment, render instead of exporting if (typeof window === "object") { - createRoot(document.getElementById("root")).render(appElement); - appElement = null; window.store = store; + + render(appElement, document.getElementById("root")); + + appElement = null; } export default appElement; diff --git a/com.twin.app.shoptime/src/reducers/appDataReducer.js b/com.twin.app.shoptime/src/reducers/appDataReducer.js new file mode 100644 index 00000000..5d8364f0 --- /dev/null +++ b/com.twin.app.shoptime/src/reducers/appDataReducer.js @@ -0,0 +1,18 @@ +import { types } from "../actions/actionTypes"; + +const initialState = { + mainIndex: null, +}; + +export const appDataReducer = (state = initialState, action) => { + switch (action.type) { + case types.ADD_MAIN_INDEX: + return { + ...state, + mainIndex: action.payload, + }; + + default: + return state; + } +}; diff --git a/com.twin.app.shoptime/src/reducers/brandReducer.js b/com.twin.app.shoptime/src/reducers/brandReducer.js new file mode 100644 index 00000000..c5fecc14 --- /dev/null +++ b/com.twin.app.shoptime/src/reducers/brandReducer.js @@ -0,0 +1,32 @@ +import { types } from "../actions/actionTypes"; + +const initialState = { + brandInfoData: {}, + brandLayoutInfoData: {}, + brandLiveChannelInfoData: {}, +}; + +export const brandReducer = (state = initialState, action) => { + switch (action.type) { + case types.GET_BRAND_LIST: + return { + ...state, + brandInfoData: action.payload, + }; + + case types.GET_BRAND_LAYOUT_INFO: + return { + ...state, + brandLayoutInfoData: action.payload, + }; + + case types.GET_BRAND_LIVE_CHANNEL_INFO: + return { + ...state, + brandLiveChannelInfoData: action.payload, + }; + + default: + return state; + } +}; diff --git a/com.twin.app.shoptime/src/features/common/commonSlice.js b/com.twin.app.shoptime/src/reducers/commonReducer.js similarity index 61% rename from com.twin.app.shoptime/src/features/common/commonSlice.js rename to com.twin.app.shoptime/src/reducers/commonReducer.js index 9e884bab..4862c8ea 100644 --- a/com.twin.app.shoptime/src/features/common/commonSlice.js +++ b/com.twin.app.shoptime/src/reducers/commonReducer.js @@ -1,7 +1,6 @@ -import { createSlice } from "@reduxjs/toolkit"; +import { types } from "../actions/actionTypes"; const initialState = { - // TODO: 각종 Status 추가 appStatus: { showLoadingPanel: { show: true, type: "launching" }, isLoading: true, @@ -9,12 +8,11 @@ const initialState = { }, }; -export const commonSlice = createSlice({ - name: "common", - initialState, - reducers: { - changeAppStatus: (state, action) => { +export const commonReducer = (state = initialState, action) => { + switch (action.type) { + case types.CHANGE_APP_STATUS: { let isUpdated = false; + for (let i in action.payload) { if (typeof action.payload[i] === "object") { if ( @@ -22,20 +20,28 @@ export const commonSlice = createSlice({ JSON.stringify(state.appStatus[i]) ) { isUpdated = true; + break; } } else if (state.appStatus[i] !== action.payload[i]) { isUpdated = true; + break; } } + if (isUpdated) { - state.appStatus = { ...state.appStatus, ...action.payload }; + return { + ...state, + appStatus: { ...state.appStatus, ...action.payload }, + }; } - }, - }, -}); + return state; + } -export const { changeAppStatus } = commonSlice.actions; + default: + return state; + } +}; -export default commonSlice.reducer; +export default commonReducer; diff --git a/com.twin.app.shoptime/src/reducers/deviceReducer.js b/com.twin.app.shoptime/src/reducers/deviceReducer.js new file mode 100644 index 00000000..9b123c94 --- /dev/null +++ b/com.twin.app.shoptime/src/reducers/deviceReducer.js @@ -0,0 +1,18 @@ +import { types } from "../actions/actionTypes"; + +const initialState = { + accessToken: null, +}; + +export const deviceReducer = (state = initialState, action) => { + switch (action.type) { + case types.GET_AUTHENTICATION_CODE: + return { + ...state, + accessToken: action.payload, + }; + + default: + return state; + } +}; diff --git a/com.twin.app.shoptime/src/reducers/eventReducer.js b/com.twin.app.shoptime/src/reducers/eventReducer.js new file mode 100644 index 00000000..369d9b4f --- /dev/null +++ b/com.twin.app.shoptime/src/reducers/eventReducer.js @@ -0,0 +1,18 @@ +import { types } from "../actions/actionTypes"; + +const initialState = { + eventData: {}, +}; + +export const eventReducer = (state = initialState, action) => { + switch (action.type) { + case types.GET_WELCOME_EVENT_INFO: + return { + ...state, + eventData: action.payload, + }; + + default: + return state; + } +}; diff --git a/com.twin.app.shoptime/src/reducers/homeReducer.js b/com.twin.app.shoptime/src/reducers/homeReducer.js new file mode 100644 index 00000000..6f6f9ea3 --- /dev/null +++ b/com.twin.app.shoptime/src/reducers/homeReducer.js @@ -0,0 +1,46 @@ +import { types } from "../actions/actionTypes"; + +const initialState = { + termsData: {}, + menuData: {}, + layoutData: {}, + mainContentsData: {}, + themeCurationInfoData: {}, +}; + +export const homeReducer = (state = initialState, action) => { + switch (action.type) { + case types.GET_HOME_TERMS: + return { + ...state, + termsData: action.payload, + }; + + case types.GET_HOME_MENU: + return { + ...state, + menuData: action.payload, + }; + + case types.GET_HOME_LAYOUT: + return { + ...state, + layoutData: action.payload, + }; + + case types.GET_HOME_MAIN_CONTENTS: + return { + ...state, + mainContentsData: action.payload, + }; + + case types.GET_THEME_CURATION_INFO: + return { + ...state, + themeCurationInfoData: action.payload, + }; + + default: + return state; + } +}; diff --git a/com.twin.app.shoptime/src/reducers/mainReducer.js b/com.twin.app.shoptime/src/reducers/mainReducer.js new file mode 100644 index 00000000..edce89e2 --- /dev/null +++ b/com.twin.app.shoptime/src/reducers/mainReducer.js @@ -0,0 +1,25 @@ +import { types } from "../actions/actionTypes"; + +const initialState = { + subCategoryData: {}, + top20ShowData: {}, +}; + +export const mainReducer = (state = initialState, action) => { + switch (action.type) { + case types.GET_SUB_CATEGORY: + return { + ...state, + subCategoryData: action.payload, + }; + + case types.GET_TOP_20_SHOW: + return { + ...state, + top20ShowData: action.payload, + }; + + default: + return state; + } +}; diff --git a/com.twin.app.shoptime/src/reducers/myPageReducer.js b/com.twin.app.shoptime/src/reducers/myPageReducer.js new file mode 100644 index 00000000..0cc663e3 --- /dev/null +++ b/com.twin.app.shoptime/src/reducers/myPageReducer.js @@ -0,0 +1,18 @@ +import { types } from "../actions/actionTypes"; + +const initialState = { + recommandedKeywordData: {}, +}; + +export const myPageReducer = (state = initialState, action) => { + switch (action.type) { + case types.GET_MY_RECOMMANDED_KEYWORD: + return { + ...state, + recommandedKeywordData: action.payload, + }; + + default: + return state; + } +}; diff --git a/com.twin.app.shoptime/src/reducers/onSaleReducer.js b/com.twin.app.shoptime/src/reducers/onSaleReducer.js new file mode 100644 index 00000000..2a7f97a0 --- /dev/null +++ b/com.twin.app.shoptime/src/reducers/onSaleReducer.js @@ -0,0 +1,18 @@ +import { types } from "../actions/actionTypes"; + +const initialState = { + onSaleData: {}, +}; + +export const onSaleReducer = (state = initialState, action) => { + switch (action.type) { + case types.GET_ON_SALE_INFO: + return { + ...state, + onSaleData: action.payload, + }; + + default: + return state; + } +}; diff --git a/com.twin.app.shoptime/src/reducers/panelReducer.js b/com.twin.app.shoptime/src/reducers/panelReducer.js new file mode 100644 index 00000000..fde68ea3 --- /dev/null +++ b/com.twin.app.shoptime/src/reducers/panelReducer.js @@ -0,0 +1,105 @@ +import { types } from "../actions/actionTypes"; +import { panel_names } from "../utils/Config"; + +const initialState = { + panels: [], + isModalOpen: false, +}; + +const forceTopPanels = [ + panel_names.ERROR_PANEL, + panel_names.DEBUG_PANEL, + panel_names.INTRO_PANEL, +]; + +export const panelsReducer = (state = initialState, action) => { + switch (action.type) { + case types.PUSH_PANEL: { + const panelInfo = action.payload.panelInfo || {}; + const forceTopPanelsInfo = []; + const newState = []; + + state.panels.forEach((panel) => { + const forceTopIndex = forceTopPanels.indexOf(panel.name); + + if (forceTopIndex >= 0) { + forceTopPanelsInfo[forceTopIndex] = panel; + } else if (panel.name !== action.payload.name) { + newState.push(panel); + } + }); + + const newPanelForceTopIndex = forceTopPanels.indexOf(action.payload.name); + + if (newPanelForceTopIndex >= 0) { + forceTopPanelsInfo[newPanelForceTopIndex] = { + ...action.payload, + panelInfo, + }; + } else { + newState.push({ ...action.payload, panelInfo }); + } + + forceTopPanels.forEach((_, index) => { + if (forceTopPanelsInfo[index]) { + newState.push(forceTopPanelsInfo[index]); + } + }); + + return { + ...state, + panels: newState, + }; + } + + case types.POP_PANEL: + if (action.payload) { + return { + ...state, + panels: state.panels.filter((panel) => panel.name !== action.payload), + }; + } else { + return { + ...state, + panels: state.panels.slice(0, state.panels.length - 1), + }; + } + + case types.UPDATE_PANEL: + return { + ...state, + panels: state.panels.map((panel) => + panel.name === action.payload.name + ? { + ...panel, + panelInfo: { ...panel.panelInfo, ...action.payload.panelInfo }, + } + : panel + ), + }; + + case types.UPDATE_MODAL_STATUS: + return { + ...state, + isModalOpen: action.payload, + }; + + case types.RESET_PANELS: { + const updatedPanels = action.payload + ? action.payload.map((panel) => ({ + ...panel, + panelInfo: panel.panelInfo || {}, + })) + : []; + + return { + ...state, + panels: updatedPanels, + isModalOpen: false, + }; + } + + default: + return state; + } +}; diff --git a/com.twin.app.shoptime/src/reducers/productReducer.js b/com.twin.app.shoptime/src/reducers/productReducer.js new file mode 100644 index 00000000..9b6407a4 --- /dev/null +++ b/com.twin.app.shoptime/src/reducers/productReducer.js @@ -0,0 +1,18 @@ +import { types } from "../actions/actionTypes"; + +const initialState = { + bestSellerData: {}, +}; + +export const productReducer = (state = initialState, action) => { + switch (action.type) { + case types.GET_BEST_SELLER: + return { + ...state, + bestSellerData: action.payload, + }; + + default: + return state; + } +}; diff --git a/com.twin.app.shoptime/src/reducers/searchReducer.js b/com.twin.app.shoptime/src/reducers/searchReducer.js new file mode 100644 index 00000000..0651bd8f --- /dev/null +++ b/com.twin.app.shoptime/src/reducers/searchReducer.js @@ -0,0 +1,25 @@ +import { types } from "../actions/actionTypes"; + +const initialState = { + searchDatas: {}, + searchPerformed: false, +}; + +export const searchReducer = (state = initialState, action) => { + switch (action.type) { + case types.GET_SEARCH: + return { + ...state, + searchDatas: action.payload, + searchPerformed: true, + }; + + case types.RESET_SEARCH: + return { + ...initialState, + }; + + default: + return state; + } +}; diff --git a/com.twin.app.shoptime/src/store/store.js b/com.twin.app.shoptime/src/store/store.js index 61ae538d..30f84d36 100644 --- a/com.twin.app.shoptime/src/store/store.js +++ b/com.twin.app.shoptime/src/store/store.js @@ -1,31 +1,32 @@ -import { configureStore } from "@reduxjs/toolkit"; +import { applyMiddleware, combineReducers, createStore } from "redux"; +import thunk from "redux-thunk"; -import appDataReducer from "../features/appData/appDataSlice"; -import brandReducer from "../features/brand/brandsSlice"; -import commonReducer from "../features/common/commonSlice"; -import deviceReducer from "../features/device/deviceSlice"; -import eventReducer from "../features/event/eventSlice"; -import homeReducer from "../features/home/homeSlice"; -import mainReducer from "../features/main/mainSlice"; -import myPageReducer from "../features/mypage/myPageSlice"; -import onSaleReducer from "../features/onSale/onSaleSlice"; -import panelsReducer from "../features/panels/panelsSlice"; -import productReducer from "../features/product/productSlice"; -import searchReducer from "../features/search/searchSlice"; +import { appDataReducer } from "../reducers/appDataReducer"; +import { brandReducer } from "../reducers/brandReducer"; +import { commonReducer } from "../reducers/commonReducer"; +import { deviceReducer } from "../reducers/deviceReducer"; +import { eventReducer } from "../reducers/eventReducer"; +import { homeReducer } from "../reducers/homeReducer"; +import { mainReducer } from "../reducers/mainReducer"; +import { myPageReducer } from "../reducers/myPageReducer"; +import { onSaleReducer } from "../reducers/onSaleReducer"; +import { panelsReducer } from "../reducers/panelReducer"; +import { productReducer } from "../reducers/productReducer"; +import { searchReducer } from "../reducers/searchReducer"; -export const store = configureStore({ - reducer: { - panels: panelsReducer, - device: deviceReducer, - appData: appDataReducer, - common: commonReducer, - home: homeReducer, - onSale: onSaleReducer, - brand: brandReducer, - myPage: myPageReducer, - search: searchReducer, - product: productReducer, - main: mainReducer, - event: eventReducer, - }, +const rootReducer = combineReducers({ + panels: panelsReducer, + device: deviceReducer, + common: commonReducer, + appData: appDataReducer, + home: homeReducer, + brand: brandReducer, + main: mainReducer, + myPage: myPageReducer, + onSale: onSaleReducer, + product: productReducer, + search: searchReducer, + evemt: eventReducer, }); + +export const store = createStore(rootReducer, applyMiddleware(thunk)); diff --git a/com.twin.app.shoptime/src/style/CommonStyle.module.less b/com.twin.app.shoptime/src/style/CommonStyle.module.less index 3697a947..2aaf1de4 100644 --- a/com.twin.app.shoptime/src/style/CommonStyle.module.less +++ b/com.twin.app.shoptime/src/style/CommonStyle.module.less @@ -39,6 +39,7 @@ @BG_COLOR_01: #f8f8f8; @BG_COLOR_02: #f2f2f2; @BG_COLOR_03: #f2f6fb; +@BG_COLOR_04: #f5f5f5; /* MAIN COLOR */ @PRIMARY_COLOR_RED: #c70850; @@ -54,6 +55,7 @@ @COLOR_GRAY06: #333333; @COLOR_GRAY07: #222222; @COLOR_GRAY08: #1a1a1a; +@COLOR_GRAY09: #999999; @COLOR_BLACK: #000000; @COLOR_NAVY: #2c343f; diff --git a/com.twin.app.shoptime/src/utils/helperMethods.js b/com.twin.app.shoptime/src/utils/helperMethods.js index 4c4bd6fb..35f34a6d 100644 --- a/com.twin.app.shoptime/src/utils/helperMethods.js +++ b/com.twin.app.shoptime/src/utils/helperMethods.js @@ -1,4 +1,5 @@ import Enact_$L from "@enact/i18n/$L"; + import stringReSource from "../../resources/de/strings.json"; export const $L = (str) => { @@ -70,3 +71,17 @@ export const wait = (time) => { }, time); }); }; + +export const scaleW = (value) => { + if (typeof window === "object") { + return value * (window.innerWidth / 1920); + } + return value; +}; + +export const scaleH = (value) => { + if (typeof window === "object") { + return value * (window.innerHeight / 1080); + } + return value; +}; diff --git a/com.twin.app.shoptime/src/views/CartPanel/CartPanel.jsx b/com.twin.app.shoptime/src/views/CartPanel/CartPanel.jsx index 4a799916..8224556c 100644 --- a/com.twin.app.shoptime/src/views/CartPanel/CartPanel.jsx +++ b/com.twin.app.shoptime/src/views/CartPanel/CartPanel.jsx @@ -1,3 +1,5 @@ +import React from "react"; + import TPanel from "../../components/TPanel/TPanel"; export default function CartPanel() { diff --git a/com.twin.app.shoptime/src/views/FeaturedBrandsPanel/FeaturedBrandsPanel.jsx b/com.twin.app.shoptime/src/views/FeaturedBrandsPanel/FeaturedBrandsPanel.jsx index 072a9725..bc69cc93 100644 --- a/com.twin.app.shoptime/src/views/FeaturedBrandsPanel/FeaturedBrandsPanel.jsx +++ b/com.twin.app.shoptime/src/views/FeaturedBrandsPanel/FeaturedBrandsPanel.jsx @@ -2,11 +2,11 @@ import React, { useEffect, useState } from "react"; import { useDispatch, useSelector } from "react-redux"; -import TPanel from "../../components/TPanel/TPanel"; import { getBrandLayoutInfo, getBrandLiveChannelInfo, -} from "../../features/brand/brandsSlice"; +} from "../../actions/brandActions"; +import TPanel from "../../components/TPanel/TPanel"; import Banner from "./Banner/Banner"; import css from "./FeaturedBrandsPanel.module.less"; import LiveChannels from "./LiveChannels/LiveChannels"; diff --git a/com.twin.app.shoptime/src/views/HomePanel/OnSale/OnSale.jsx b/com.twin.app.shoptime/src/views/HomePanel/OnSale/OnSale.jsx index 35dc37e6..e1134a0c 100644 --- a/com.twin.app.shoptime/src/views/HomePanel/OnSale/OnSale.jsx +++ b/com.twin.app.shoptime/src/views/HomePanel/OnSale/OnSale.jsx @@ -1,20 +1,12 @@ -import React, { - useCallback, - useEffect, - useState, - useMemo, - useRef, -} from "react"; +import React, { useEffect } from "react"; + import { useDispatch, useSelector } from "react-redux"; -import classNames from "classnames"; -import { $L } from "../../../utils/helperMethods"; -import { Job } from "@enact/core/util"; + import { SpotlightContainerDecorator } from "@enact/spotlight/SpotlightContainerDecorator"; -import Spotlight from "@enact/spotlight"; import Spottable from "@enact/spotlight/Spottable"; -import { getOnSaleInfo } from "../../../features/onSale/onSaleSlice"; - +import { getOnSaleInfo } from "../../../actions/onSaleActions"; +import { $L } from "../../../utils/helperMethods"; import css from "./OnSale.module.less"; const Container = SpotlightContainerDecorator( diff --git a/com.twin.app.shoptime/src/views/HomePanel/PopularShow/PopularShow.jsx b/com.twin.app.shoptime/src/views/HomePanel/PopularShow/PopularShow.jsx index 6201c95c..af840ab2 100644 --- a/com.twin.app.shoptime/src/views/HomePanel/PopularShow/PopularShow.jsx +++ b/com.twin.app.shoptime/src/views/HomePanel/PopularShow/PopularShow.jsx @@ -1,13 +1,13 @@ -import React, { useEffect, useState } from "react"; -import { useDispatch, useSelector } from "react-redux"; -import { $L } from "../../../utils/helperMethods"; -import { Job } from "@enact/core/util"; -import { SpotlightContainerDecorator } from "@enact/spotlight/SpotlightContainerDecorator"; +import React, { useEffect } from "react"; -import Spottable from "@enact/spotlight/Spottable"; -import Scroller from "@enact/sandstone/Scroller"; -import { getTop20Show } from "../../../features/main/mainSlice"; import classNames from "classnames"; +import { useDispatch, useSelector } from "react-redux"; + +import { SpotlightContainerDecorator } from "@enact/spotlight/SpotlightContainerDecorator"; +import Spottable from "@enact/spotlight/Spottable"; + +import { getTop20Show } from "../../../actions/mainActions"; +import { $L } from "../../../utils/helperMethods"; import css from "../PopularShow/PopularShow.module.less"; const Container = SpotlightContainerDecorator( diff --git a/com.twin.app.shoptime/src/views/HomePanel/SubCategory/SubCategory.jsx b/com.twin.app.shoptime/src/views/HomePanel/SubCategory/SubCategory.jsx index 0dd22f37..2ac8cef3 100644 --- a/com.twin.app.shoptime/src/views/HomePanel/SubCategory/SubCategory.jsx +++ b/com.twin.app.shoptime/src/views/HomePanel/SubCategory/SubCategory.jsx @@ -2,19 +2,14 @@ import React, { useEffect, useState } from "react"; import { useDispatch, useSelector } from "react-redux"; -import { Job } from "@enact/core/util"; -import Spotlight from "@enact/spotlight"; import { SpotlightContainerDecorator } from "@enact/spotlight/SpotlightContainerDecorator"; import Spottable from "@enact/spotlight/Spottable"; +import { getSubCategory } from "../../../actions/mainActions"; +import { getOnSaleInfo } from "../../../actions/onSaleActions"; import TGrid from "../../../components/TGrid/TGrid"; import TItemCard from "../../../components/TItemCard/TItemCard"; -import TScroller from "../../../components/TScroller/TScroller"; -import { getSubCategory } from "../../../features/main/mainSlice"; -import { getOnSaleInfo } from "../../../features/onSale/onSaleSlice"; -import { $L } from "../../../utils/helperMethods"; import CategoryNav from "../../OnSalePanel/CategoryNav/CategoryNav"; -import css from "./SubCategory.module.less"; const Container = SpotlightContainerDecorator( { diff --git a/com.twin.app.shoptime/src/views/HotPicksPanel/HotPicksPanel.jsx b/com.twin.app.shoptime/src/views/HotPicksPanel/HotPicksPanel.jsx index b7cc2f77..1711f75d 100644 --- a/com.twin.app.shoptime/src/views/HotPicksPanel/HotPicksPanel.jsx +++ b/com.twin.app.shoptime/src/views/HotPicksPanel/HotPicksPanel.jsx @@ -1,3 +1,5 @@ +import React from "react"; + import TPanel from "../../components/TPanel/TPanel"; export default function HotPicksPanel() { diff --git a/com.twin.app.shoptime/src/views/IntroPanel/IntroPanel.jsx b/com.twin.app.shoptime/src/views/IntroPanel/IntroPanel.jsx index 3e18d82e..ab8cca15 100644 --- a/com.twin.app.shoptime/src/views/IntroPanel/IntroPanel.jsx +++ b/com.twin.app.shoptime/src/views/IntroPanel/IntroPanel.jsx @@ -1,19 +1,18 @@ -import React, { useState, useEffect, useCallback } from "react"; +import React, { useCallback, useEffect, useState } from "react"; + import { useDispatch, useSelector } from "react-redux"; -import * as Config from "../../utils/Config"; -import TButton, { TYPES, SIZES } from "../../components/TButton/TButton"; -import SpotlightContainerDecorator from "@enact/spotlight/SpotlightContainerDecorator"; import Spotlight from "@enact/spotlight"; +import SpotlightContainerDecorator from "@enact/spotlight/SpotlightContainerDecorator"; +import { getHomeTerms } from "../../actions/homeActions"; +import { popPanel } from "../../actions/panelActions"; +import TButton, { TYPES } from "../../components/TButton/TButton"; import TPanel from "../../components/TPanel/TPanel"; import TPopUp from "../../components/TPopUp/TPopUp"; - -import css from "./IntroPanel.module.less"; -import classNames from "classnames"; +import * as Config from "../../utils/Config"; import { $L } from "../../utils/helperMethods"; -import { addPanels, popPanel } from "../../features/panels/panelsSlice"; -import { getHomeTerms } from "../../features/home/homeSlice"; +import css from "./IntroPanel.module.less"; const Container = SpotlightContainerDecorator( { enterTo: "last-focused" }, diff --git a/com.twin.app.shoptime/src/views/LoadingPanel/LoadingPanel.jsx b/com.twin.app.shoptime/src/views/LoadingPanel/LoadingPanel.jsx index 82212a1f..c029de93 100644 --- a/com.twin.app.shoptime/src/views/LoadingPanel/LoadingPanel.jsx +++ b/com.twin.app.shoptime/src/views/LoadingPanel/LoadingPanel.jsx @@ -1,17 +1,17 @@ -import { useState, useEffect, useCallback } from "react"; +import React, { useCallback, useEffect, useState } from "react"; + import { useDispatch } from "react-redux"; + import { Job } from "@enact/core/util"; +import { Panel } from "@enact/sandstone/Panels"; +import Cancelable from "@enact/ui/Cancelable"; import LoadingAnimation from "../../../assets/intro/splash_03_end.webp"; -import css from "./LoadingPanel.module.less"; -import classNames from "classnames"; -import Cancelable from "@enact/ui/Cancelable"; -import { Panel } from "@enact/sandstone/Panels"; - -import { changeAppStatus } from "../../features/common/commonSlice"; -import { $L } from "../../utils/helperMethods"; -import PreloadImage from "../../components/PreloadImage/PreloadImage"; +import { changeAppStatus } from "../../actions/commonActions"; import CustomImage from "../../components/CustomImage/CustomImage"; +import PreloadImage from "../../components/PreloadImage/PreloadImage"; +import { $L } from "../../utils/helperMethods"; +import css from "./LoadingPanel.module.less"; const MIN_SHOWING_TIME = { launching: 2000, wait: 1000, default: 1000 }; const MAX_SHOWING_TIME = 20000; diff --git a/com.twin.app.shoptime/src/views/MainView/MainView.jsx b/com.twin.app.shoptime/src/views/MainView/MainView.jsx index 744e6210..6b11822c 100644 --- a/com.twin.app.shoptime/src/views/MainView/MainView.jsx +++ b/com.twin.app.shoptime/src/views/MainView/MainView.jsx @@ -1,35 +1,32 @@ -import Panels from "@enact/sandstone/Panels"; -import platform from "@enact/core/platform"; - import React, { useCallback, useEffect, useMemo, useState } from "react"; -import { useDispatch, useSelector } from "react-redux"; -import { addPanels, popPanel } from "../../features/panels/panelsSlice"; -import css from "./MainView.module.less"; import classNames from "classnames"; +import { useDispatch, useSelector } from "react-redux"; -import * as Config from "../../utils/Config"; - -import LoadingPanel from "../LoadingPanel/LoadingPanel"; -import IntroPanel from "../IntroPanel/IntroPanel"; -import HomePanel from "../HomePanel/HomePanel"; -import MyPagePanel from "../MyPagePanel/MyPagePanel"; -import CategoryPanel from "../CategoryPanel/CategoryPanel"; -import SearchPanel from "../SearchPanel/SearchPanel"; -import OnSalePanel from "../OnSalePanel/OnSalePanel"; -import TrendingNowPanel from "../TrendingNowPanel/TrendingNowPanel"; -import HotPicksPanel from "../HotPicksPanel/HotPicksPanel"; -import FeaturedBrandsPanel from "../FeaturedBrandsPanel/FeaturedBrandsPanel"; -import ErrorPanel from "../ErrorPanel/ErrorPanel"; -import DebugPanel from "../DebugPanel/DebugPanel"; -import TabLayout from "../../components/TabLayout/TabLayout"; +import platform from "@enact/core/platform"; import Spotlight from "@enact/spotlight"; -import { changeAppStatus } from "../../features/common/commonSlice"; - // 테스트용 - TODO: 메인 홈 화면에 나와야 하는 이미지들 추가 후 preloadImages에 추가 import testImage from "../../../assets/img-banner-myinfo-login@3x.png"; +import { changeAppStatus } from "../../actions/commonActions"; +import { pushPanel } from "../../actions/panelActions"; import PreloadImage from "../../components/PreloadImage/PreloadImage"; +import TabLayout from "../../components/TabLayout/TabLayout"; +import * as Config from "../../utils/Config"; +import CartPanel from "../CartPanel/CartPanel"; +import CategoryPanel from "../CategoryPanel/CategoryPanel"; +import DebugPanel from "../DebugPanel/DebugPanel"; +import ErrorPanel from "../ErrorPanel/ErrorPanel"; +import FeaturedBrandsPanel from "../FeaturedBrandsPanel/FeaturedBrandsPanel"; +import HomePanel from "../HomePanel/HomePanel"; +import HotPicksPanel from "../HotPicksPanel/HotPicksPanel"; +import IntroPanel from "../IntroPanel/IntroPanel"; +import LoadingPanel from "../LoadingPanel/LoadingPanel"; +import MyPagePanel from "../MyPagePanel/MyPagePanel"; +import OnSalePanel from "../OnSalePanel/OnSalePanel"; +import SearchPanel from "../SearchPanel/SearchPanel"; +import TrendingNowPanel from "../TrendingNowPanel/TrendingNowPanel"; +import css from "./MainView.module.less"; const preloadImages = [testImage]; @@ -43,6 +40,7 @@ const panelMap = { [Config.panel_names.TRENDING_NOW_PANEL]: TrendingNowPanel, [Config.panel_names.HOT_PICKS_PANEL]: HotPicksPanel, [Config.panel_names.FEATURED_BRANDS_PANEL]: FeaturedBrandsPanel, + [Config.panel_names.CART_PANEL]: CartPanel, [Config.panel_names.ERROR_PANEL]: ErrorPanel, [Config.panel_names.DEBUG_PANEL]: DebugPanel, }; @@ -106,7 +104,7 @@ export default function MainView() { if (isTermAgreed) { } else { dispatch( - addPanels({ name: Config.panel_names.INTRO_PANEL, panelInfo: {} }) + pushPanel({ name: Config.panel_names.INTRO_PANEL, panelInfo: {} }) ); } } diff --git a/com.twin.app.shoptime/src/views/OnSalePanel/OnSalePanel.jsx b/com.twin.app.shoptime/src/views/OnSalePanel/OnSalePanel.jsx index f97c754c..7d774d74 100644 --- a/com.twin.app.shoptime/src/views/OnSalePanel/OnSalePanel.jsx +++ b/com.twin.app.shoptime/src/views/OnSalePanel/OnSalePanel.jsx @@ -2,10 +2,10 @@ import React, { useEffect, useState } from "react"; import { useDispatch, useSelector } from "react-redux"; +import { getOnSaleInfo } from "../../actions/onSaleActions"; import TBody from "../../components/TBody/TBody"; import TItemCard from "../../components/TItemCard/TItemCard"; import TPanel from "../../components/TPanel/TPanel"; -import { getOnSaleInfo } from "../../features/onSale/onSaleSlice"; import CategoryNav from "../OnSalePanel/CategoryNav/CategoryNav"; import OnSaleProductsGrid from "../OnSalePanel/OnSaleProductsGrid/OnSaleProductsGrid"; import css from "./OnSalePanel.module.less"; diff --git a/com.twin.app.shoptime/src/views/OnSalePanel/OnSaleProductsGrid/OnSaleProductsGrid.jsx b/com.twin.app.shoptime/src/views/OnSalePanel/OnSaleProductsGrid/OnSaleProductsGrid.jsx index 3993076d..547b67d1 100644 --- a/com.twin.app.shoptime/src/views/OnSalePanel/OnSaleProductsGrid/OnSaleProductsGrid.jsx +++ b/com.twin.app.shoptime/src/views/OnSalePanel/OnSaleProductsGrid/OnSaleProductsGrid.jsx @@ -1,3 +1,5 @@ +import React from "react"; + import Scroller from "@enact/sandstone/Scroller"; import SpotlightContainerDecorator from "@enact/spotlight/SpotlightContainerDecorator"; diff --git a/com.twin.app.shoptime/src/views/SearchPanel/NoSearchResults/NoSearchResults.jsx b/com.twin.app.shoptime/src/views/SearchPanel/NoSearchResults/NoSearchResults.jsx new file mode 100644 index 00000000..7771a5a9 --- /dev/null +++ b/com.twin.app.shoptime/src/views/SearchPanel/NoSearchResults/NoSearchResults.jsx @@ -0,0 +1,44 @@ +import React from "react"; + +import { useSelector } from "react-redux"; + +import NoSearchResultsImage from "../../../../assets/searchpanel/img-search-nodata.png"; +import SectionTitle from "../../../components/SectionTitle/SectionTitle"; +import TGrid from "../../../components/TGrid/TGrid"; +import TItemCard from "../../../components/TItemCard/TItemCard"; +import { $L } from "../../../utils/helperMethods"; +import css from "./NoSearchResults.module.less"; + +export default function NoSearchResults() { + const bestSellerDatas = useSelector( + (state) => state.product.bestSellerData.bestSeller + ); + + return ( +
+
+ No Datas +

{$L("SORRY, NO RESULTS MATCHING YOUR SEARCH")}

+
+
+ + + {bestSellerDatas && + bestSellerDatas + .slice(0, 5) + .map((bestSeller) => ( + + ))} + +
+
+ ); +} diff --git a/com.twin.app.shoptime/src/views/SearchPanel/NoSearchResults/NoSearchResults.module.less b/com.twin.app.shoptime/src/views/SearchPanel/NoSearchResults/NoSearchResults.module.less new file mode 100644 index 00000000..f1fe0dbc --- /dev/null +++ b/com.twin.app.shoptime/src/views/SearchPanel/NoSearchResults/NoSearchResults.module.less @@ -0,0 +1,24 @@ +@import "../../../style/CommonStyle.module.less"; +@import "../../../style/utils.module.less"; + +.container { + margin-top: 30px; + + .info { + text-align: center; + + > p { + .font (@fontFamily: @baseFontBold, @fontSize: 36px); + color: #a3a3a3; + margin-top: 6px; + } + } + + .bestSellerWrap { + padding: 60px 60px 78px; + + > h2 { + margin: 134px 0 34px; + } + } +} diff --git a/com.twin.app.shoptime/src/views/SearchPanel/RecommendedKeywords/RecommendedKeywords.jsx b/com.twin.app.shoptime/src/views/SearchPanel/RecommendedKeywords/RecommendedKeywords.jsx new file mode 100644 index 00000000..14f46561 --- /dev/null +++ b/com.twin.app.shoptime/src/views/SearchPanel/RecommendedKeywords/RecommendedKeywords.jsx @@ -0,0 +1,56 @@ +import React from "react"; + +import classNames from "classnames"; + +import SpotlightContainerDecorator from "@enact/spotlight/SpotlightContainerDecorator"; + +import TButton from "../../../components/TButton/TButton"; +import TIconButton, { + ICON_TYPES, +} from "../../../components/TIconButton/TIconButton"; +import css from "./RecommendedKeywords.module.less"; + +const Container = SpotlightContainerDecorator( + { enterTo: "last-focused" }, + "div" +); + +export default function RecommendedKeywords({ + keywords, + onPrev, + onNext, + hasPrevPage, + hasNextPage, + handleSearchSubmit, +}) { + return ( +
+ {hasPrevPage && ( + + )} + + {keywords.map((keyword, index) => ( + handleSearchSubmit(keyword.keywd)} + > + {keyword.keywd} + + ))} + + {hasNextPage && ( + + )} +
+ ); +} diff --git a/com.twin.app.shoptime/src/views/SearchPanel/RecommendedKeywords/RecommendedKeywords.module.less b/com.twin.app.shoptime/src/views/SearchPanel/RecommendedKeywords/RecommendedKeywords.module.less new file mode 100644 index 00000000..d1470ec6 --- /dev/null +++ b/com.twin.app.shoptime/src/views/SearchPanel/RecommendedKeywords/RecommendedKeywords.module.less @@ -0,0 +1,53 @@ +@import "../../../style/CommonStyle.module.less"; +@import "../../../style/utils.module.less"; + +.container { + margin-top: 180px; + position: relative; + + .arrow { + position: absolute; + top: 140px; + } + + .arrowLeft { + left: 60px; + } + + .arrowRight { + right: 60px; + } + + .keywordsGrid { + display: grid; + grid-template-columns: repeat(3, 1fr); + grid-gap: 40px 80px; + width: 100%; + place-items: center; + padding: 0 233px; + + .keywordBox { + width: 390px; + height: 97px; + line-height: 97px; + letter-spacing: -1px; + border-radius: 10px; + box-shadow: 0 4px 8px 0 rgba(2, 3, 3, 0.2); + border: 1px solid @COLOR_GRAY09; + background-color: @BG_COLOR_04; + color: #333; + .font(@fontFamily: @baseFontBold, @fontSize: 40px); + + > div { + overflow: unset; + } + + &:focus-within { + box-shadow: inset 0 0 0 4px @PRIMARY_COLOR_RED, + 0 0 50px 0 rgba(11, 8, 8, 0.5); + color: @PRIMARY_COLOR_RED; + background-color: @BG_COLOR_04; + } + } + } +} diff --git a/com.twin.app.shoptime/src/views/SearchPanel/SearchPanel.jsx b/com.twin.app.shoptime/src/views/SearchPanel/SearchPanel.jsx index 13cbbf71..31f14a81 100644 --- a/com.twin.app.shoptime/src/views/SearchPanel/SearchPanel.jsx +++ b/com.twin.app.shoptime/src/views/SearchPanel/SearchPanel.jsx @@ -1,43 +1,40 @@ -import React, { useCallback, useEffect, useState, useRef } from "react"; -import { useDispatch, useSelector } from "react-redux"; -import TInput, { KINDS, ICONS } from "../../components/TInput/TInput"; -import TPanel from "../../components/TPanel/TPanel"; -import TButton from "../../components/TButton/TButton"; -import { $L } from "../../utils/helperMethods"; -import css from "./SearchPanel.module.less"; -import TIconButton, { ICON_TYPES, SIZES } from "../../components/TIconButton/TIconButton"; -import classNames from "classnames"; +import React, { useCallback, useEffect, useState } from "react"; + +import { useDispatch, useSelector } from "react-redux"; -import SpotlightContainerDecorator from "@enact/spotlight/SpotlightContainerDecorator"; import Spotlight from "@enact/spotlight"; -import { changeAppStatus } from "../../features/common/commonSlice"; -import { getSearch } from "../../features/search/searchSlice"; - -import SearchNoDataImage from "../../../assets/searchpanel/img-search-nodata.png"; -import TGrid from "../../components/TGrid/TGrid"; -import TItemCard from "../../components/TItemCard/TItemCard"; -import SectionTitle from "../../components/SectionTitle/SectionTitle"; - -const Container = SpotlightContainerDecorator({ enterTo: "last-focused" }, "div"); +import { getSearch, resetSearch } from "../../actions/searchActions"; +import TBody from "../../components/TBody/TBody"; +import TInput, { ICONS, KINDS } from "../../components/TInput/TInput"; +import TPanel from "../../components/TPanel/TPanel"; +import NoSearchResults from "./NoSearchResults/NoSearchResults"; +import RecommendedKeywords from "./RecommendedKeywords/RecommendedKeywords"; +import css from "./SearchPanel.module.less"; +import SearchResults from "./SearchResults/SearchResults"; const ITEMS_PER_PAGE = 9; export default function SearchPanel() { const dispatch = useDispatch(); - const { showLoadingPanel } = useSelector((state) => state.common.appStatus); const recommandedKeywords = useSelector( (state) => state.myPage.recommandedKeywordData.data?.keywords ); - const searchDatas = useSelector((state) => state.search.searchDatas.data?.result.results); - const bestSellerDatas = useSelector((state) => state.product.bestSellerData.bestSeller); + const searchDatas = useSelector( + (state) => state.search.searchDatas.data?.result.results + ); + const searchPerformed = useSelector((state) => state.search.searchPerformed); + const [currentPage, setCurrentPage] = useState(1); const [paginatedKeywords, setPaginatedKeywords] = useState([]); const [pageChanged, setPageChanged] = useState(false); const [searchQuery, setSearchQuery] = useState(""); - const [searchPerformed, setSearchPerformed] = useState(false); + + useEffect(() => { + dispatch(resetSearch()); + }, [dispatch]); useEffect(() => { if (recommandedKeywords) { @@ -66,17 +63,10 @@ export default function SearchPanel() { } }, []); - const performSearch = useCallback( - async (query) => { - if (!query || query.trim() === "") { - setSearchPerformed(false); - return; - } - - setSearchPerformed(true); - - try { - await dispatch( + const handleSearchSubmit = useCallback( + (query) => { + if (query.trim()) { + dispatch( getSearch({ service: "com.lgshop.app", query: query, @@ -84,23 +74,12 @@ export default function SearchPanel() { maxResults: 10, domain: "theme,show,item", }) - ).unwrap(); - } catch (error) { - console.error("Search request failed: ", error); + ); + } else { + dispatch(resetSearch()); } }, - [dispatch] - ); - - const handleSearchSubmit = useCallback(() => { - performSearch(searchQuery); - }, [searchQuery, dispatch]); - - const handleKeywordSearch = useCallback( - (keyword) => { - performSearch(keyword); - }, - [performSearch] + [dispatch, searchQuery] ); const handleNext = useCallback(() => { @@ -114,86 +93,38 @@ export default function SearchPanel() { }, [currentPage]); const hasPrevPage = currentPage > 1; - const hasNextPage = currentPage * ITEMS_PER_PAGE < recommandedKeywords?.length; + const hasNextPage = + currentPage * ITEMS_PER_PAGE < recommandedKeywords?.length; - const renderContents = () => { - if (searchPerformed) { - if (searchDatas && searchDatas.length > 0) { - return
data!!
; - } else { - return ( - -
- No Datas -

{$L("SORRY, NO RESULTS MATCHING YOUR SEARCH")}

-
-
- - - {bestSellerDatas && - bestSellerDatas - .slice(0, 5) - .map((bestSeller) => ( - - ))} - -
-
- ); - } - } else { - return ( -
- {hasPrevPage && ( - - )} - - {paginatedKeywords.map((keyword, index) => ( - handleKeywordSearch(keyword.keywd)} - > - {keyword.keywd} - - ))} - - {hasNextPage && ( - - )} -
- ); - } - }; return ( - - - {renderContents()} + + + handleSearchSubmit(searchQuery)} + /> + {searchPerformed ? ( + searchDatas && searchDatas.length > 0 ? ( + + ) : ( + + ) + ) : ( + + )} + ); } diff --git a/com.twin.app.shoptime/src/views/SearchPanel/SearchPanel.module.less b/com.twin.app.shoptime/src/views/SearchPanel/SearchPanel.module.less index 345d0cd1..74f028ac 100644 --- a/com.twin.app.shoptime/src/views/SearchPanel/SearchPanel.module.less +++ b/com.twin.app.shoptime/src/views/SearchPanel/SearchPanel.module.less @@ -1,82 +1,15 @@ @import "../../style/CommonStyle.module.less"; @import "../../style/utils.module.less"; -.panel { +.container { background-color: @BG_COLOR_01; - width: 100%; - height: 100%; + + .tBody { + height: 100%; + } .input { - width: 880px; margin: 180px auto 0; - } - - .keywordWrap { - position: relative; - margin: 180px 0 0 0; - display: flex; - justify-content: space-between; - .arrow { - position: absolute; - top: 140px; - } - - .arrowLeft { - left: 60px; - } - - .arrowRight { - right: 60px; - } - .keywordsGrid { - display: grid; - grid-template-columns: repeat(3, 1fr); - grid-gap: 40px 80px; - width: 100%; - place-items: center; - padding: 0 233px; - - .keywordBox { - width: 390px; - height: 97px; - line-height: 97px; - letter-spacing: -1px; - border-radius: 10px; - box-shadow: 0 4px 8px 0 rgba(2, 3, 3, 0.2); - border: 1px solid #999; - background-color: #f5f5f5; - color: #333; - .font (@fontFamily: @baseFontBold, @fontSize: 40px); - - > div { - overflow: unset; - } - - &:focus-within { - box-shadow: inset 0 0 0 4px @PRIMARY_COLOR_RED, - 0 0 50px 0 rgba(11, 8, 8, 0.5); - color: #c70850; - background-color: #f5f5f5; - } - } - } - } - - .noDataWrap { - margin-top: 30px; - > .noDataResult { - text-align: center; - > p { - .font (@fontFamily:@baseFontBold, @fontSize:36px); - color: #a3a3a3; - margin-top: 6px; - } - } - .bestSellerWrap { - padding: 60px 60px 78px; - > h2 { - margin: 134px 0 34px; - } - } + width: 880px; } } diff --git a/com.twin.app.shoptime/src/views/SearchPanel/SearchResults/SearchResults.jsx b/com.twin.app.shoptime/src/views/SearchPanel/SearchResults/SearchResults.jsx new file mode 100644 index 00000000..568f59ac --- /dev/null +++ b/com.twin.app.shoptime/src/views/SearchPanel/SearchResults/SearchResults.jsx @@ -0,0 +1,5 @@ +import React from "react"; + +export default function SearchResults({ datas }) { + return

data

; +} diff --git a/com.twin.app.shoptime/src/views/SearchPanel/SearchResults/SearchResults.module.less b/com.twin.app.shoptime/src/views/SearchPanel/SearchResults/SearchResults.module.less new file mode 100644 index 00000000..f408bed0 --- /dev/null +++ b/com.twin.app.shoptime/src/views/SearchPanel/SearchResults/SearchResults.module.less @@ -0,0 +1,19 @@ +@import "../../../style/CommonStyle.module.less"; +@import "../../../style/utils.module.less"; + +.container { + background-color: yellowgreen; + + &:focus-within { + border: 1px solid red; + } +} + +.container2 { + height: 240px; +} + +.itemList { + width: 100%; + height: 100%; +} diff --git a/com.twin.app.shoptime/src/views/TrendingNowPanel/TrendingNowPanel.jsx b/com.twin.app.shoptime/src/views/TrendingNowPanel/TrendingNowPanel.jsx index 2be1361b..cb0a27c8 100644 --- a/com.twin.app.shoptime/src/views/TrendingNowPanel/TrendingNowPanel.jsx +++ b/com.twin.app.shoptime/src/views/TrendingNowPanel/TrendingNowPanel.jsx @@ -1,3 +1,5 @@ +import React from "react"; + import { useSelector } from "react-redux"; import SpotlightContainerDecorator from "@enact/spotlight/SpotlightContainerDecorator"; @@ -9,10 +11,15 @@ import TPanel from "../../components/TPanel/TPanel"; import { $L } from "../../utils/helperMethods"; import css from "./TrendingNowPanel.module.less"; -const Container = SpotlightContainerDecorator({ enterTo: "last-focused" }, "div"); +const Container = SpotlightContainerDecorator( + { enterTo: "last-focused" }, + "div" +); export default function TrendingNowPanel() { - const bestSellerDatas = useSelector((state) => state.product.bestSellerData.bestSeller); + const bestSellerDatas = useSelector( + (state) => state.product.bestSellerData.bestSeller + ); return ( diff --git a/com.twin.app.shoptime/src/views/WelcomeEventPanel/WelcomeEventPanel.jsx b/com.twin.app.shoptime/src/views/WelcomeEventPanel/WelcomeEventPanel.jsx index 84b08636..fbb04d4c 100644 --- a/com.twin.app.shoptime/src/views/WelcomeEventPanel/WelcomeEventPanel.jsx +++ b/com.twin.app.shoptime/src/views/WelcomeEventPanel/WelcomeEventPanel.jsx @@ -5,9 +5,9 @@ import { useDispatch, useSelector } from "react-redux"; import Spotlight from "@enact/spotlight"; import SpotlightContainerDecorator from "@enact/spotlight/SpotlightContainerDecorator"; +import { getWelcomeEventInfo } from "../../actions/eventActions"; import TButton, { TYPES } from "../../components/TButton/TButton"; import TPanel from "../../components/TPanel/TPanel"; -import { getWelcomeEventInfo } from "../../features/event/eventSlice"; import { $L } from "../../utils/helperMethods"; import css from "../WelcomeEventPanel/WelcomeEventPanel.module.less";