From 8959c33095f2c63a02f00cdd0c329dcf1bec4433 Mon Sep 17 00:00:00 2001 From: Ayushya Amitabh Date: Wed, 19 Aug 2020 15:09:45 -0400 Subject: [PATCH] v1.6.3/release - virtual chat scroll - website update - version bump --- admin/package.json | 2 +- app/package-lock.json | 39 +++--- app/package.json | 8 +- app/public/background.js | 2 +- app/public/manifest.json | 2 +- app/src/App.js | 2 +- app/src/Chat.js | 48 +++---- app/src/Thread.css | 24 ++-- app/src/Thread.js | 178 ++++++++++++++---------- app/src/index.css | 9 -- assets/VersionPNG.psd | Bin 52080 -> 52469 bytes functions/package.json | 2 +- package-lock.json | 218 +++++++++--------------------- package.json | 5 +- website/changes/index.html | 145 ++++++-------------- website/changes/v1.6.1/index.html | 121 +++++++++++++++++ website/changes/v1.6.2/index.html | 126 +++++++++++++++++ website/changes/v1.6.3/index.html | 121 +++++++++++++++++ website/media/versions/161.png | Bin 0 -> 2285 bytes website/media/versions/162.png | Bin 0 -> 1570 bytes website/media/versions/163.png | Bin 0 -> 1633 bytes 21 files changed, 653 insertions(+), 399 deletions(-) create mode 100644 website/changes/v1.6.1/index.html create mode 100644 website/changes/v1.6.2/index.html create mode 100644 website/changes/v1.6.3/index.html create mode 100644 website/media/versions/161.png create mode 100644 website/media/versions/162.png create mode 100644 website/media/versions/163.png diff --git a/admin/package.json b/admin/package.json index 65235fa..fff6359 100644 --- a/admin/package.json +++ b/admin/package.json @@ -1,6 +1,6 @@ { "name": "watch-party-admin", - "version": "1.6.2", + "version": "1.6.3", "private": true, "dependencies": { "@ant-design/icons": "^4.2.2", diff --git a/app/package-lock.json b/app/package-lock.json index 0720c08..d001afa 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -1,6 +1,6 @@ { "name": "watch-party-crx", - "version": "1.6.2", + "version": "1.6.3", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1190,6 +1190,7 @@ "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" }, @@ -1197,7 +1198,8 @@ "regenerator-runtime": { "version": "0.13.5", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", + "dev": true } } }, @@ -10864,11 +10866,6 @@ "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", @@ -14250,6 +14247,12 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", + "dev": true + }, "react-transition-group": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.3.0.tgz", @@ -14262,18 +14265,18 @@ "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==", + "react-virtualized": { + "version": "9.22.2", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.2.tgz", + "integrity": "sha512-5j4h4FhxTdOpBKtePSs1yk6LDNT4oGtUwjT7Nkh61Z8vv3fTG/XeOf8J4li1AYaexOwTXnw0HFVxsV0GBUqwRw==", + "dev": true, "requires": { - "@babel/runtime": "^7.0.0", - "memoize-one": ">=3.1.1 <6" + "@babel/runtime": "^7.7.2", + "clsx": "^1.0.4", + "dom-helpers": "^5.1.3", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.4" } }, "read-pkg": { diff --git a/app/package.json b/app/package.json index afd5192..82c31d1 100644 --- a/app/package.json +++ b/app/package.json @@ -1,11 +1,8 @@ { "name": "watch-party-crx", - "version": "1.6.2", + "version": "1.6.3", "private": true, - "dependencies": { - "react-virtualized-auto-sizer": "^1.0.2", - "react-window": "^1.8.5" - }, + "dependencies": {}, "scripts": { "start": "node scripts/start.js", "build": "node scripts/build.js", @@ -82,6 +79,7 @@ "react-dom": "^16.4.1", "react-frame-component": "^4.0.0", "react-giphy-searchbox": "^1.4.0", + "react-virtualized": "^9.22.2", "resolve": "1.6.0", "route-lite": "^0.3.0", "style-loader": "0.19.0", diff --git a/app/public/background.js b/app/public/background.js index 671bf69..80611e8 100644 --- a/app/public/background.js +++ b/app/public/background.js @@ -12,7 +12,7 @@ COPIED, EDITED, OR REPRODUCED WITHOUT PERMISSION. /* global chrome */ /* global firebase */ -const APP_VERSION = '1.6.2'; +const APP_VERSION = '1.6.3'; const APP_VERSION_STRING = APP_VERSION.replace(/\./g, ''); const firebaseConfig = { diff --git a/app/public/manifest.json b/app/public/manifest.json index 06bd786..ee1ea1e 100644 --- a/app/public/manifest.json +++ b/app/public/manifest.json @@ -1,7 +1,7 @@ { "name": "Watch Party", "short_name": "WP", - "version": "1.6.2", + "version": "1.6.3", "description": "Watch streamed content together.", "background": { "page": "background.html" diff --git a/app/src/App.js b/app/src/App.js index 7df63ee..cc3f0cf 100644 --- a/app/src/App.js +++ b/app/src/App.js @@ -19,7 +19,7 @@ import 'firebase/firestore'; import Inactive from './Inactive'; import { getUserUid, getPlayerSource, PLAYER_SOURCE } from './Api'; -const APP_VERSION = '1.6.2'; +const APP_VERSION = '1.6.3'; const APP_VERSION_STRING = APP_VERSION.replace(/\./g, ''); const darkTheme = createMuiTheme({ diff --git a/app/src/Chat.js b/app/src/Chat.js index c85c24d..b489daf 100644 --- a/app/src/Chat.js +++ b/app/src/Chat.js @@ -742,9 +742,13 @@ export default class Chat extends Component { ) : ( - - Nothing playing right now, pause or play once after starting a show to start - sync. + + Nothing playing right now +
+ Pause or play once after starting a show to start sync. +
+ Watch Party will not automatically change the show for you as this is a security + exploit.
)} @@ -756,27 +760,25 @@ export default class Chat extends Component { ) : null} -
-
- {alerts.map((a) => { - if (a.condition() === true) { - return ( - - - - {a.message} - - - ); - } else return null; - })} -
- +
+ {alerts.map((a) => { + if (a.condition() === true) { + return ( + + + + {a.message} + + + ); + } else return null; + })}
+ div { + padding-bottom: 30px; } .thread-item { color: white; @@ -56,11 +62,15 @@ COPIED, EDITED, OR REPRODUCED WITHOUT PERMISSION. justify-content: center; align-items: center; flex-direction: row-reverse; + z-index: 9999 !important; } .thread-message .thread-overline span { flex: 1; text-align: center; } +.thread-message .thread-overline > span { + display: none; +} .thread-message .thread-overline .thread-reply-icon { position: absolute; display: flex; @@ -81,8 +91,6 @@ COPIED, EDITED, OR REPRODUCED WITHOUT PERMISSION. padding-bottom: 7px; } .thread-item:hover .thread-message .thread-overline { - height: 24px; - margin-bottom: 7px; opacity: 1; } .thread-message p { diff --git a/app/src/Thread.js b/app/src/Thread.js index 0460153..a6ca93e 100644 --- a/app/src/Thread.js +++ b/app/src/Thread.js @@ -9,7 +9,7 @@ ALL CONTENT ON WATCH PARTY'S WEBSITE OR IN WATCH PARTY'S CHROME EXTENSION APP, U CITED ARE THE SOLE INTELECTUAL PROPERTY OF AYUSHYA AMITABH, AND MAY NOT BE COPIED, EDITED, OR REPRODUCED WITHOUT PERMISSION. ************************************************************************/ -import React, { Component } from 'react'; +import React, { Component, createRef } from 'react'; import { Typography, IconButton, @@ -21,23 +21,32 @@ import { import { Reply, Send } from '@material-ui/icons'; import './Thread.css'; import { LocalData, webhookFetcher } from './Api'; +import { CellMeasurer, CellMeasurerCache, AutoSizer, List } from 'react-virtualized'; + +var cache = new CellMeasurerCache({ + fixedWidth: true, +}); export default class Thread extends Component { constructor(props) { super(props); + this.state = { + autoSizeWidth: 0, + }; + this.listRef = createRef(); + this.getMessage = this.getMessage.bind(this); this.getTimeString = this.getTimeString.bind(this); this.getReplyMessage = this.getReplyMessage.bind(this); this.getMessageTextOrImage = this.getMessageTextOrImage.bind(this); } - scrollToMessage(id) { - const pcc = document.querySelector('.thread-wrapper'); - const msg = document.getElementById(id); - const alc = document.querySelector( - '#party-routes-wrapper > div.party-chat-container > div.thread-wrapper > div.alerts-container' - ); - pcc.scrollTop = msg.offsetTop - pcc.offsetTop - alc.clientHeight - 10; - msg.classList.add('highlight'); - setTimeout(() => msg.classList.remove('highlight'), 2000); + scrollToMessage(msgIdx, messages) { + this.listRef.current.scrollToRow(msgIdx); + setTimeout(() => { + const id = messages[msgIdx].id || `sending-${msgIdx}`; + const msg = document.getElementById(id); + msg.classList.add('highlight'); + setTimeout(() => msg.classList.remove('highlight'), 2000); + }, 500); } handleInteractiveMessageCall(msg) { const thanksElement = document.createElement('div'); @@ -64,17 +73,17 @@ export default class Thread extends Component { } getItemClassNames(uid, userUid, msgIdx, messages, isSending = false) { const lastUid = msgIdx >= 1 ? messages[msgIdx - 1].uid : ''; - return `thread-item ${uid === userUid ? 'my-message' : ''} ${ - isSending ? 'sending-message' : '' - } ${uid === '' ? 'system-message' : ''} ${lastUid === uid ? 'continued-message' : ''}`; + return `thread-item ${uid === userUid ? 'my-message ' : ''}${ + isSending ? 'sending-message ' : '' + }${uid === '' ? 'system-message ' : ''}${lastUid === uid ? 'continued-message' : ''}`; } - getMessageTextOrImage(msg) { + getMessageTextOrImage(msg, measure) { if (msg.type === 'giphy') { - return gif; + return gif; } if (msg.type === 'interactive/text') { return ( - + {msg.text} @@ -101,7 +110,7 @@ export default class Thread extends Component { } if (msg.type === 'interactive/link') { return ( - + {msg.text} @@ -117,75 +126,94 @@ export default class Thread extends Component { ); } - return

{msg.text}

; + return

{msg.text}

; } getTimeString(time) { return new Date(time.seconds * 1000).toLocaleTimeString(); } - getReplyMessage(rT, messages) { - if (rT !== undefined && rT !== null) { - const replyMessage = messages.filter((m) => m.id === rT)[0]; - return ( -
this.scrollToMessage(replyMessage.id)}> -

Reply to {replyMessage.name}:

- {this.getMessageTextOrImage(replyMessage)} -
- ); + getReplyMessage(replyTo, messages) { + if (replyTo !== undefined && replyTo !== null) { + const replyMessage = messages.filter((v) => v.id === replyTo)[0]; + if (replyMessage) { + const msgIdx = messages.indexOf(replyMessage); + return ( +
this.scrollToMessage(msgIdx, messages)}> +

Reply to {replyMessage.name}:

+ {this.getMessageTextOrImage(replyMessage)} +
+ ); + } } return null; } - render() { - const { sendingMessages, setReplyTo, sentMessages } = this.props; + getMessage(params) { + const { autoSizeWidth } = this.state; + const { sendingMessages, sentMessages, setReplyTo } = this.props; const { userUid } = LocalData(); + const messages = [...sentMessages, ...sendingMessages]; + const msg = messages[params.index]; + const msgIdx = params.index; return ( -
- {sentMessages.length > 0 - ? sentMessages.map((msg, msgIdx) => ( -
-
{msg.name}
- {this.getReplyMessage(msg.replyTo, sentMessages)} -
-
- {this.getTimeString(msg.time)} -
- setReplyTo(msg)}> - - -
-
- {this.getMessageTextOrImage(msg)} + + {({ measure, registerChild }) => ( +
+
{msg.name}
+ {this.getReplyMessage(msg.replyTo, messages)} +
+
+ {this.getTimeString(msg.time)} +
+ setReplyTo(msg)}> + +
- )) - : null} - {sendingMessages.length > 0 - ? sendingMessages.map((msg, msgIdx) => ( -
-
{msg.name}
- {this.getReplyMessage(msg.replyTo, sentMessages)} -
-
- {this.getTimeString(msg.time)} -
- setReplyTo(msg)}> - - -
-
- {this.getMessageTextOrImage(msg)} -
-
- )) - : null} -
+ {this.getMessageTextOrImage(msg, measure)} +
+
+ )} + + ); + } + render() { + const { autoSizeWidth } = this.state; + const { sendingMessages, sentMessages } = this.props; + return ( + + {({ height, width }) => { + if (autoSizeWidth && autoSizeWidth !== width) { + cache.clearAll(); + this.listRef.current.recomputeRowHeights(); + this.setState({ autoSizeWidth: width }); + } + + return ( + cache.rowHeight({ index }) + 10} + rowRenderer={this.getMessage} + /> + ); + }} + ); } } diff --git a/app/src/index.css b/app/src/index.css index d7b312c..0d34b6c 100644 --- a/app/src/index.css +++ b/app/src/index.css @@ -378,14 +378,6 @@ body.disney #party_wrapper * { .create-bottom-card a:hover { color: #c0f300; } -.thread-wrapper { - max-height: 100%; - flex: 1; - overflow-y: auto; - margin-bottom: 1rem; - padding: 0; - margin-top: 1rem; -} .room-title { text-overflow: ellipsis !important; word-break: break-word !important; @@ -585,7 +577,6 @@ body.amazon-prime .notification-switch .MuiSwitch-thumb { .alerts-container { margin: 5px 0; - position: sticky; top: 0; padding: 5px 0; z-index: 999 !important; diff --git a/assets/VersionPNG.psd b/assets/VersionPNG.psd index 126b3ab65eb4197698de89fb5458994d0954d38c..2d59efb8e9e525b759123a7375ec073f1145dc66 100644 GIT binary patch delta 11168 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 delta 10841 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 - - - - - - - - - - - - - + + + + + + + + + + + + + - + Watch Party | Changelog - +
-

- WATCH PARTY | CHANGELOG -

-

- WATCH PARTY | CHANGELOG -

+

WATCH PARTY | CHANGELOG

+

WATCH PARTY | CHANGELOG

WATCH YOUR FAVORITES,
WITH YOUR FAVORITE PEOPLE
@@ -135,34 +69,45 @@ COPIED, EDITED, OR REPRODUCED WITHOUT PERMISSION. data-upcoming-support="See Changes" >
+ + + + + + + + +