Add an animation to the register/cancel button

Hopefully this will stop people mashing the button and DoS'ing shittyserver
This commit is contained in:
Marks Polakovs 2020-04-24 17:30:36 +02:00
parent 2ae1cbae84
commit 5f373571af
5 changed files with 41 additions and 4 deletions

View file

@ -95,6 +95,7 @@
"strict-event-emitter-types": "^2.0.0", "strict-event-emitter-types": "^2.0.0",
"style-loader": "1.0.0", "style-loader": "1.0.0",
"terser-webpack-plugin": "1.4.1", "terser-webpack-plugin": "1.4.1",
"three-dots": "^0.2.0",
"ts-pnp": "1.1.4", "ts-pnp": "1.1.4",
"typescript": "3.7.2", "typescript": "3.7.2",
"url-loader": "2.1.0", "url-loader": "2.1.0",

View file

@ -110,6 +110,7 @@ export class WebRTCStreamer extends Streamer {
const data = JSON.parse(evt.data); const data = JSON.parse(evt.data);
switch (data.kind) { switch (data.kind) {
case "HELLO": case "HELLO":
this.onStateChange("CONNECTING");
console.log("WS HELLO, our client ID is " + data.connectionId); console.log("WS HELLO, our client ID is " + data.connectionId);
this.dispatch(BroadcastState.setWsID(data.connectionId)); this.dispatch(BroadcastState.setWsID(data.connectionId));
if (this.state !== "HELLO") { if (this.state !== "HELLO") {
@ -258,6 +259,11 @@ export class WebRTCStreamer extends Streamer {
return "NOT_CONNECTED"; return "NOT_CONNECTED";
} }
} }
console.log(
"Relevant values: ",
this.pc?.iceConnectionState,
this.ws?.readyState
);
switch (this.pc.iceConnectionState) { switch (this.pc.iceConnectionState) {
case "connected": case "connected":
case "completed": case "completed":

View file

@ -1,4 +1,4 @@
import React, { useRef, useEffect } from "react"; import React, { useRef, useEffect, useState } from "react";
import { useDispatch, useSelector } from "react-redux"; import { useDispatch, useSelector } from "react-redux";
import Clock from "react-live-clock"; import Clock from "react-live-clock";
@ -40,6 +40,17 @@ export function NavBar() {
const broadcastState = useSelector((state: RootState) => state.broadcast); const broadcastState = useSelector((state: RootState) => state.broadcast);
const settings = useSelector((state: RootState) => state.settings); const settings = useSelector((state: RootState) => state.settings);
const redirect_url = encodeURIComponent(window.location.toString()); const redirect_url = encodeURIComponent(window.location.toString());
const [connectButtonAnimating, setConnectButtonAnimating] = useState(false);
const prevRegistrationStage = useRef(broadcastState.stage);
useEffect(() => {
if (broadcastState.stage !== prevRegistrationStage.current) {
setConnectButtonAnimating(false);
}
prevRegistrationStage.current = broadcastState.stage;
}, [broadcastState.stage]);
return ( return (
<> <>
<div className="navbar-nav navbar-left"> <div className="navbar-nav navbar-left">
@ -77,8 +88,9 @@ export function NavBar() {
</div> </div>
</li> </li>
<li <li
className="btn btn-outline-light rounded-0 pt-2 pb-1 nav-item nav-link" className="btn btn-outline-light rounded-0 pt-2 pb-1 nav-item nav-link connect"
onClick={() => { onClick={() => {
setConnectButtonAnimating(true);
switch (broadcastState.stage) { switch (broadcastState.stage) {
case "NOT_REGISTERED": case "NOT_REGISTERED":
dispatch(BroadcastState.goOnAir()); dispatch(BroadcastState.goOnAir());
@ -89,8 +101,14 @@ export function NavBar() {
} }
}} }}
> >
{connectButtonAnimating ? (
<span className="dot-pulse" />
) : (
<>
{broadcastState.stage === "NOT_REGISTERED" && "Register for show"} {broadcastState.stage === "NOT_REGISTERED" && "Register for show"}
{broadcastState.stage === "REGISTERED" && "Cancel registration"} {broadcastState.stage === "REGISTERED" && "Cancel registration"}
</>
)}
</li> </li>
{settings.enableRecording && ( {settings.enableRecording && (
<li className="nav-item nav-link"> <li className="nav-item nav-link">

View file

@ -1,6 +1,9 @@
/* Stuff to get the nav to collapse at 991px (when the menu collapses) /* Stuff to get the nav to collapse at 991px (when the menu collapses)
* Taken from http://stackoverflow.com/a/36289507/995325 */ * Taken from http://stackoverflow.com/a/36289507/995325 */
$dot-color: #fff;
@import "~three-dots/sass/three-dots";
@media (max-width: 991px) { @media (max-width: 991px) {
.navbar-header { .navbar-header {
float: none; float: none;
@ -251,3 +254,7 @@
font-weight: bold; font-weight: bold;
font-size: 1.1em; font-size: 1.1em;
} }
.nav-link.connect {
min-width: 80px;
}

View file

@ -10427,6 +10427,11 @@ text-table@0.2.0, text-table@^0.2.0:
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
three-dots@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/three-dots/-/three-dots-0.2.0.tgz#a854461cfdcaae829587a72d7693b0a774da05cb"
integrity sha512-UIbDvl8F1qjoBigeEjcl2h101Frx+CaWCJSr7xabRh6BjFUkkJU1GW2jzmt0IQP7yVAOKW9q5bMj7Tafz0pP1g==
throat@^4.0.0: throat@^4.0.0:
version "4.1.0" version "4.1.0"
resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a"