From 8826ca77359d67b6e4930c41d2d69c30b59b0909 Mon Sep 17 00:00:00 2001 From: Ayushya Amitabh Date: Mon, 17 Aug 2020 20:23:06 -0400 Subject: [PATCH] v1.6.2/api fix, admin dashboard deploy, scroller --- .firebaserc | 14 ++++- admin/src/Api.js | 4 +- admin/src/Dashboard.jsx | 8 ++- app/package-lock.json | 39 ++++++++---- app/package.json | 5 +- app/public/android-icon-144x144.png | Bin 0 -> 6275 bytes app/public/android-icon-192x192.png | Bin 0 -> 1379 bytes app/src/Scroller.js | 94 ++++++++++++++++++++++++++++ firebase.json | 30 +++++---- functions/app.js | 2 +- 10 files changed, 169 insertions(+), 27 deletions(-) create mode 100644 app/public/android-icon-144x144.png create mode 100644 app/public/android-icon-192x192.png create mode 100644 app/src/Scroller.js diff --git a/.firebaserc b/.firebaserc index 6df3ec8..2d23c94 100644 --- a/.firebaserc +++ b/.firebaserc @@ -1,5 +1,17 @@ { "projects": { "default": "watch-party-crx" + }, + "targets": { + "watch-party-crx": { + "hosting": { + "website": [ + "watch-party-crx" + ], + "admin": [ + "watch-party-admin" + ] + } + } } -} +} \ No newline at end of file diff --git a/admin/src/Api.js b/admin/src/Api.js index 4e23b01..4528661 100644 --- a/admin/src/Api.js +++ b/admin/src/Api.js @@ -1,7 +1,9 @@ import firebase from "firebase/app"; import "firebase/auth"; -const API = "http://localhost:5000/watch-party-crx/us-central1/admin"; +const API = window.location.href.includes("localhost") + ? "http://localhost:5000/watch-party-crx/us-central1/admin" + : "https://us-central1-watch-party-crx.cloudfunctions.net/admin"; const fetcher = async ({ endpoint, method, bodyData }) => { const idToken = await firebase.auth().currentUser.getIdToken(); diff --git a/admin/src/Dashboard.jsx b/admin/src/Dashboard.jsx index 76fa77d..9c2fccc 100644 --- a/admin/src/Dashboard.jsx +++ b/admin/src/Dashboard.jsx @@ -336,7 +336,13 @@ export default class Dashboard extends Component { }); this.setState({ refreshing: false, - newMessage: emptyMessage, + newMessage: { + type: "", + text: "", + uid: "", + name: "", + endpoint: "", + }, messageModel: false, }); }; diff --git a/app/package-lock.json b/app/package-lock.json index 6c2f81a..0720c08 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -1190,7 +1190,6 @@ "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.0.tgz", "integrity": "sha512-cTIudHnzuWLS56ik4DnRnqqNf8MkdUzV4iFFI1h7Jo9xvrpQROYaAnaSd2mHLQAzzZAPfATynX5ord6YlNYNMA==", - "dev": true, "requires": { "regenerator-runtime": "^0.13.4" }, @@ -1198,8 +1197,7 @@ "regenerator-runtime": { "version": "0.13.5", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", - "dev": true + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" } } }, @@ -4393,12 +4391,12 @@ } }, "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.4.tgz", + "integrity": "sha512-0zrqA+vOj4tKAFjho2DjcPby8YNYvU0g2fJLusolvRxpeC3qzfLTrTdPK1/lreiOd2J6prloAR6dcXhcr7mJEw==", "dev": true, "requires": { - "dot-prop": "^4.1.0", + "dot-prop-legacy": "^4.2.1", "graceful-fs": "^4.1.2", "make-dir": "^1.0.0", "unique-string": "^1.0.0", @@ -5378,10 +5376,10 @@ "tslib": "^1.10.0" } }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dot-prop-legacy": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop-legacy/-/dot-prop-legacy-4.2.1.tgz", + "integrity": "sha512-OpVdloKY3b038o/XJ8zV0b6Uh2VZ/WJhdG2L94YOy+OeFjTZBWxeYfQVx5doIezkWCg7UVTjP2hGQBeSeljTag==", "dev": true, "requires": { "is-obj": "^1.0.0" @@ -10866,6 +10864,11 @@ "p-is-promise": "^2.0.0" } }, + "memoize-one": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.1.1.tgz", + "integrity": "sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA==" + }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -14259,6 +14262,20 @@ "prop-types": "^15.6.2" } }, + "react-virtualized-auto-sizer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.2.tgz", + "integrity": "sha512-MYXhTY1BZpdJFjUovvYHVBmkq79szK/k7V3MO+36gJkWGkrXKtyr4vCPtpphaTLRAdDNoYEYFZWE8LjN+PIHNg==" + }, + "react-window": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.5.tgz", + "integrity": "sha512-HeTwlNa37AFa8MDZFZOKcNEkuF2YflA0hpGPiTT9vR7OawEt+GZbfM6wqkBahD3D3pUjIabQYzsnY/BSJbgq6Q==", + "requires": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + } + }, "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", diff --git a/app/package.json b/app/package.json index bbfe520..afd5192 100644 --- a/app/package.json +++ b/app/package.json @@ -2,7 +2,10 @@ "name": "watch-party-crx", "version": "1.6.2", "private": true, - "dependencies": {}, + "dependencies": { + "react-virtualized-auto-sizer": "^1.0.2", + "react-window": "^1.8.5" + }, "scripts": { "start": "node scripts/start.js", "build": "node scripts/build.js", diff --git a/app/public/android-icon-144x144.png b/app/public/android-icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..430c56bbf39d7d21063f66cb64e6c9e80c8db43a GIT binary patch literal 6275 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 literal 0 HcmV?d00001 diff --git a/app/public/android-icon-192x192.png b/app/public/android-icon-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..7d04301c2e197a96a8e74431bf1c159bef07e8b2 GIT binary patch literal 1379 zcmZuvX*kpg9De6Nj&X(%Ig(bC968!*h#c!G#H?dm%|y}V>e$GdCLJPI5t6c6$1pXH z&A7*qBB3IRO-)K+SLGThJ-hne`#kUUdww6^1W$J-IqBun0OVYp9lRD@@QoDmqV6Sf zEdfH>a~sWZv64twp%3Ssa1X*(Zz!vSAfRUg*In4`0vUNMRl`;l~VAP(6zE zTi_7{!3^%qA)W&XNsz_RB0}&f$SLA_I~v}@jt0gFWH&=v4vAdID}oV?E6tEyg34jU z6@Zxs<{z+hz#S2|&k@ALfq3vIaj^!MYEd?X1Lsit4>meMf`Z?#p>`b6SJ3zoQQ0W! zLGvuC-+}6el73|JAufS{-$0RuPberdP}hN)HsT6V`V^dJNZ`W2497CiGK=_9WYnYJ zA)2OexdDZbkzR+AJ{*ik$Z7054Zm<`u0lowuD2n%5@*?P4M5&~Wbu*4L(M2^#=v_E zV=7FoVPXaQpHU%%z8Tb4fHMFCbMW5b_G|oL1XT^N`*8jyE>W%Mh7@ybkzBKtmVBPmnEuJq;uRzTr5WhNbFI z)r6u7l$S$Z33@BXeF3tvi^Eo0)ZoP6oOdrnvu#qfRE2a)XUFVMtH8|)ot7VgPEYH43FZuyFHTl0PziD`W1-~IU;7$5j)JxM;lkk^Vr z>W1F)N^F=tg#2ivsFgG!N>RIJc~rbWOE#l*SQFTjcO@YzDKh~>dT()>?DZZl=PN%=UNy4J^z~M)|ZW-XX~(3xy`Ei6$dD|HxC1Ac6J#VJ9iVOCcgp#FAVx@*q`P#zMT@sx8tg z+RKp6J+%6jy54^Y1GXQ8LSb*nLzSmgYZE(j*B3I8*YkM_zMXMK7Li_4VMlW%>0_U) zOcTD?t&x2+Gdg+3V zU!#{MaN0lE)8_VL>Y3f4Wkshw@?z&tl`mX08Ml$3Ycx6Xh?gf9GS0oAuNuz!%nT`9 zCwQ{?vwmRbhVIPivYJ_sNmPVx(@YtUc&YiFkuIKW!~Y}k<(zH&yIBXneYiNfJ8 { + const { + itemHeight, + amount, + tolerance, + minIndex, + maxIndex, + startIndex, + } = settings; + const viewportHeight = amount * itemHeight; + const totalHeight = (maxIndex - minIndex + 1) * itemHeight; + const toleranceHeight = tolerance * itemHeight; + const bufferHeight = viewportHeight + 2 * toleranceHeight; + const bufferedItems = amount + 2 * tolerance; + const itemsAbove = startIndex - tolerance - minIndex; + const topPaddingHeight = itemsAbove * itemHeight; + const bottomPaddingHeight = totalHeight - topPaddingHeight; + const initialPosition = topPaddingHeight + toleranceHeight; + return { + settings, + viewportHeight, + totalHeight, + toleranceHeight, + bufferHeight, + bufferedItems, + topPaddingHeight, + bottomPaddingHeight, + initialPosition, + data: [], + }; +}; + +class Scroller extends Component { + constructor(props) { + super(props); + this.state = setInitialState(props.settings); + this.viewportElement = React.createRef(); + } + + componentDidMount() { + this.viewportElement.current.scrollTop = this.state.initialPosition; + if (!this.state.initialPosition) { + this.runScroller({ target: { scrollTop: 0 } }); + } + } + + runScroller = ({ target: { scrollTop } }) => { + const { + totalHeight, + toleranceHeight, + bufferedItems, + settings: { itemHeight, minIndex }, + } = this.state; + const index = + minIndex + Math.floor((scrollTop - toleranceHeight) / itemHeight); + const data = this.props.get(index, bufferedItems); + const topPaddingHeight = Math.max((index - minIndex) * itemHeight, 0); + const bottomPaddingHeight = Math.max( + totalHeight - topPaddingHeight - data.length * itemHeight, + 0 + ); + + this.setState({ + topPaddingHeight, + bottomPaddingHeight, + data, + }); + }; + + render() { + const { + viewportHeight, + topPaddingHeight, + bottomPaddingHeight, + data, + } = this.state; + return ( +
+
+ {data.map(this.props.row)} +
+
+ ); + } +} + +export default Scroller; diff --git a/firebase.json b/firebase.json index b5a7300..4587b98 100644 --- a/firebase.json +++ b/firebase.json @@ -1,18 +1,26 @@ { "functions": { - "predeploy": [ - "npm --prefix \"$RESOURCE_DIR\" run lint" - ], + "predeploy": ["npm --prefix \"$RESOURCE_DIR\" run lint"], "source": "functions" }, - "hosting": { - "public": "website", - "ignore": [ - "firebase.json", - "**/.*", - "**/node_modules/**" - ] - }, + "hosting": [ + { + "target": "website", + "public": "website", + "ignore": ["firebase.json", "**/.*", "**/node_modules/**"] + }, + { + "target": "admin", + "public": "admin/build", + "ignore": ["firebase.json", "**/.*", "**/node_modules/**"], + "rewrites": [ + { + "source": "**", + "destination": "/index.html" + } + ] + } + ], "emulators": { "functions": { "port": 5001 diff --git a/functions/app.js b/functions/app.js index 2b5c682..fa83090 100644 --- a/functions/app.js +++ b/functions/app.js @@ -31,7 +31,7 @@ app.put("/updateAdminOnly/:rid/:adminOnly", FunctionModules.updateAdminOnly); const admin = express(); admin.use( cors({ - origin: ["http://localhost:3000", "https://admin.chromewatchparty.com/*"], + origin: true, }) ); admin.use(AdminModules.superAuth);