+
@@ -49,6 +50,14 @@ const room = (state = initialState, action) =>
return { ...state, advancedMode };
}
+ case 'TOGGLE_FULLSCREEN_CONSUMER':
+ {
+ const { consumerId } = action.payload;
+ const currentConsumer = state.fullScreenConsumer;
+
+ return { ...state, fullScreenConsumer: currentConsumer ? null : consumerId };
+ }
+
default:
return state;
}
diff --git a/app/lib/redux/stateActions.js b/app/lib/redux/stateActions.js
index 4db655b..86adba5 100644
--- a/app/lib/redux/stateActions.js
+++ b/app/lib/redux/stateActions.js
@@ -361,6 +361,14 @@ export const toggleChat = () =>
};
};
+export const toggleConsumerFullscreen = (consumerId) =>
+{
+ return {
+ type : 'TOGGLE_FULLSCREEN_CONSUMER',
+ payload : { consumerId }
+ };
+};
+
export const increaseBadge = () =>
{
return {
diff --git a/app/stylus/components/Chat.styl b/app/stylus/components/Chat.styl
index 6399832..6cfe785 100644
--- a/app/stylus/components/Chat.styl
+++ b/app/stylus/components/Chat.styl
@@ -7,7 +7,7 @@
max-width: 300px;
right: 0;
width: 90vw;
- z-index: 9999;
+ z-index: 100;
> .launcher {
align-self: flex-end;
diff --git a/app/stylus/components/FullScreenView.styl b/app/stylus/components/FullScreenView.styl
new file mode 100644
index 0000000..1338c5d
--- /dev/null
+++ b/app/stylus/components/FullScreenView.styl
@@ -0,0 +1,75 @@
+[data-component='FullScreenView'] {
+ position: absolute;
+ top: 0;
+ left: 0;
+ height: 100%;
+ width: 100%;
+ z-index: 200;
+
+ > .controls {
+ position: absolute;
+ z-index: 201;
+ right: 0;
+ top: 0;
+ display: flex;
+ flex-direction:; row;
+ justify-content: flex-start;
+ align-items: center;
+ padding: 0.4vmin;
+
+ > .button {
+ flex: 0 0 auto;
+ margin: 0.2vmin;
+ border-radius: 2px;
+ background-position: center;
+ background-size: 75%;
+ background-repeat: no-repeat;
+ background-color: rgba(#000, 0.5);
+ cursor: pointer;
+ transition-property: opacity, background-color;
+ transition-duration: 0.15s;
+
+ +desktop() {
+ width: 5vmin;
+ height: 5vmin;
+ opacity: 0.85;
+
+ &:hover {
+ opacity: 1;
+ }
+ }
+
+ +mobile() {
+ width: 5vmin;
+ height: 5vmin;
+ }
+
+ &.fullscreen {
+ background-image: url('/resources/images/icon_fullscreen_exit_black.svg');
+ background-color: rgba(#fff, 0.7);
+ }
+ }
+ }
+
+ .incompatible-video {
+ position: absolute;
+ z-index: 2
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+
+ > p {
+ padding: 6px 12px;
+ border-radius: 6px;
+ user-select: none;
+ pointer-events: none;
+ font-size: 15px;
+ color: rgba(#fff, 0.55);
+ }
+ }
+}
diff --git a/app/stylus/components/FullView.styl b/app/stylus/components/FullView.styl
new file mode 100644
index 0000000..ff3f3e2
--- /dev/null
+++ b/app/stylus/components/FullView.styl
@@ -0,0 +1,105 @@
+[data-component='FullView'] {
+ position: relative;
+ flex: 100 100 auto;
+ height: 100%;
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ background-color: rgba(#2a4b58, 0.9);
+ background-image: url('/resources/images/buddy.svg');
+ background-position: bottom;
+ background-size: auto 85%;
+ background-repeat: no-repeat;
+
+ > .info {
+ $backgroundTint = #000;
+
+ position: absolute;
+ z-index: 5
+ top: 0.6vmin;
+ left: 0.6vmin;
+ bottom: 0;
+ right: 0;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+
+ > .media {
+ flex: 0 0 auto;
+ display: flex;
+ flex-direction: row;
+
+ > .box {
+ padding: 0.4vmin;
+ border-radius: 2px;
+ background-color: rgba(#000, 0.25);
+
+ > p {
+ user-select: none;
+ pointer-events: none;
+ margin-bottom: 2px;
+ color: rgba(#fff, 0.7);
+ font-size: 10px;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+ }
+ }
+ }
+
+ > video {
+ flex: 100 100 auto;
+ height: 100%;
+ width: 100%;
+ object-fit: contain;
+ user-select: none;
+ transition-property: opacity;
+ transition-duration: .15s;
+ background-color: rgba(#000, 0.75);
+
+ &.hidden {
+ opacity: 0;
+ transition-duration: 0s;
+ }
+
+ &.loading {
+ filter: blur(5px);
+ }
+ }
+
+ > .spinner-container {
+ position: absolute;
+ top: 0
+ bottom: 0;
+ left: 0;
+ right: 0;
+ background-color: rgba(#000, 0.75);
+
+ .react-spinner {
+ position: relative;
+ width: 48px;
+ height: 48px;
+ top: 50%;
+ left: 50%;
+
+ .react-spinner_bar {
+ position: absolute;
+ width: 20%;
+ height: 7.8%;
+ top: -3.9%;
+ left: -10%;
+ animation: PeerView-spinner 1.2s linear infinite;
+ border-radius: 5px;
+ background-color: rgba(#fff, 0.5);
+ }
+ }
+ }
+}
+
+@keyframes FullView-spinner {
+ 0% { opacity: 1; }
+ 100% { opacity: 0.15; }
+}
diff --git a/app/stylus/components/Me.styl b/app/stylus/components/Me.styl
index 91d9b8b..f1095a9 100644
--- a/app/stylus/components/Me.styl
+++ b/app/stylus/components/Me.styl
@@ -1,15 +1,13 @@
[data-component='Me'] {
flex: 100 100 auto;
position: relative;
- height: 15vmin;
- width: 20vmin;
flex-direction: row;
display: flex;
> .view-container {
position: relative;
- height: 100%;
- width: 100%;
+ width: 20vmin;
+ height: 15vmin;
&.webcam {
order: 2;
diff --git a/app/stylus/index.styl b/app/stylus/index.styl
index b70a957..84f4e42 100644
--- a/app/stylus/index.styl
+++ b/app/stylus/index.styl
@@ -46,6 +46,8 @@ body {
@import './components/Settings';
@import './components/ToolArea';
@import './components/ParticipantList';
+ @import './components/FullScreenView';
+ @import './components/FullView';
}
// Hack to detect in JS the current media query