Skip to content
This repository was archived by the owner on Nov 5, 2023. It is now read-only.

Commit 51419d1

Browse files
committed
Add experiments page
1 parent 4a0ff15 commit 51419d1

File tree

9 files changed

+143
-11
lines changed

9 files changed

+143
-11
lines changed

app/src/App.vue

+3
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ export default {
6565
.bind(['ctrl+shift+,', 'command+shift+,'], function() {
6666
self.$store.commit('TEXT_SIZE_DECREASE');
6767
})
68+
.bind(['e x p e r i m e n t s !'], function() {
69+
self.$router.push('/captioner/settings/experiments');
70+
})
6871
6972
7073
// Larger layout mode

app/src/app.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ import RavenVue from 'raven-js/plugins/vue';
1212
import { library } from '@fortawesome/fontawesome-svg-core'
1313
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
1414

15-
import { faFileAlt, faFileWord, faExclamationTriangle, faTimes, faMicrophone, faDesktop, faExternalLinkAlt, faSave, faTrashAlt, faCog, faCheckCircle, faSpinner, faChevronRight, faMinusCircle, faPlusCircle, faArrowLeft } from '@fortawesome/free-solid-svg-icons'
15+
import { faFileAlt, faFileWord, faExclamationTriangle, faTimes, faMicrophone, faDesktop, faExternalLinkAlt, faSave, faTrashAlt, faCog, faCheckCircle, faSpinner, faChevronRight, faMinusCircle, faPlusCircle, faArrowLeft, faFlask } from '@fortawesome/free-solid-svg-icons'
1616

1717
import { faThumbsUp } from '@fortawesome/free-regular-svg-icons'
1818

1919
import { faApple, faWindows, faAndroid, faChrome } from '@fortawesome/fontawesome-free-brands'
2020

21-
library.add(faFileAlt, faThumbsUp, faFileWord, faExclamationTriangle, faTimes, faMicrophone, faDesktop, faApple, faWindows, faAndroid, faExternalLinkAlt, faSave, faTrashAlt, faCog, faCheckCircle, faSpinner, faChrome,faChevronRight, faMinusCircle, faPlusCircle, faArrowLeft)
21+
library.add(faFileAlt, faThumbsUp, faFileWord, faExclamationTriangle, faTimes, faMicrophone, faDesktop, faApple, faWindows, faAndroid, faExternalLinkAlt, faSave, faTrashAlt, faCog, faCheckCircle, faSpinner, faChrome,faChevronRight, faMinusCircle, faPlusCircle, faArrowLeft, faFlask)
2222

2323
Vue.component('fa', {
2424
functional: true,
@@ -34,10 +34,10 @@ Vue.component('fa', {
3434
}
3535
})
3636

37-
Raven
38-
.config('REMOVED')
39-
.addPlugin(RavenVue, Vue)
40-
.install();
37+
// Raven
38+
// .config('REMOVED')
39+
// .addPlugin(RavenVue, Vue)
40+
// .install();
4141

4242
const dateFormatPlugin = {
4343
install () {

app/src/router/index.js

+8
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ const SettingsWordReplacementsView = () => import('../views/settings/SettingsWor
1717
const SettingsCensorView = () => import('../views/settings/SettingsCensorView.vue')
1818
const SettingsControlsView = () => import('../views/settings/SettingsControlsView.vue')
1919
const SettingsVmixView = () => import('../views/settings/SettingsVmixView.vue')
20+
const SettingsExperimentsView = () => import('../views/settings/SettingsExperimentsView.vue')
2021
const SettingsRemoteDisplaysView = () => import('../views/settings/SettingsRemoteDisplaysView.vue')
2122
const CaptionerView = () => import('../views/CaptionerView.vue')
2223
const Transcript = () => import('../components/Transcript.vue')
@@ -98,6 +99,13 @@ export function createRouter () {
9899
navbarTitle: 'Connect to vMix',
99100
},
100101
},
102+
{
103+
path: 'experiments',
104+
component: SettingsExperimentsView,
105+
meta: {
106+
navbarTitle: 'Experiments',
107+
},
108+
},
101109
]
102110
},
103111
]

app/src/store/actions.js

+4
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ export default {
7373

7474
commit('SET_ROOM_MEMBERSHIP_ID', { roomMembershipId: get(settings, 'roomMembershipId') });
7575

76+
get(settings, 'exp').forEach((experiment) => {
77+
commit('ADD_EXPERIMENT', { experiment });
78+
});
79+
7680
const wordReplacements = get(settings, 'wordReplacements');
7781
for (let i = 0; i < wordReplacements.length; i++) {
7882
commit('ADD_WORD_REPLACEMENT', { wordReplacement: wordReplacements[i] });

app/src/store/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ export function createStore () {
8686
webControllerAddress: '',
8787
},
8888
},
89+
exp: [],
8990
},
9091
receivers: {
9192
chromecast: {

app/src/store/mutations.js

+11
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,17 @@ export default {
132132
state.detached = false;
133133
},
134134

135+
ADD_EXPERIMENT: (state, { experiment }) => {
136+
if (!state.settings.exp.includes(experiment)) {
137+
state.settings.exp.push(experiment);
138+
}
139+
},
140+
141+
REMOVE_EXPERIMENT: (state, { experiment }) => {
142+
state.settings.exp = state.settings.exp.filter((e) => {
143+
return e != experiment;
144+
});
145+
},
135146

136147

137148
SOCKET_ONOPEN (state, event) {

app/src/views/CaptionerView.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export default {
4747
this.initRoom();
4848
}
4949
50-
this.$refs.welcomeModal.showModal();
50+
// this.$refs.welcomeModal.showModal();
5151
5252
if (this.vmixOn) {
5353
this.$store.dispatch('REFRESH_VMIX_SETUP_STATUS')

app/src/views/SettingsView.vue

+22-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
<template>
22
<div class="settings-view" :style="{height}" style="overflow:auto">
33
<router-link to="/captioner" class="btn btn-light d-none d-sm-block position-fixed py-md-3 px-3 px-md-4" style="z-index:2;right:0;top:0" role="tab" active-class=""><fa icon="times" size="2x" /></router-link>
4-
54
<!-- xs navbar -->
65
<nav class="d-sm-none navbar sticky-top navbar-light bg-primary pr-2" :class="{'pl-2': showBackButton}">
76
<div class="mr-auto">
@@ -26,8 +25,9 @@
2625
<b-list-group-item to="/captioner/settings/appearance">Appearance</b-list-group-item>
2726
<b-list-group-item to="/captioner/settings/censor">Censor</b-list-group-item>
2827
<b-list-group-item to="/captioner/settings/controls">Controls</b-list-group-item>
28+
<b-list-group-item v-show="experiments['experiments']" to="/captioner/settings/experiments">Experiments</b-list-group-item>
2929
<b-list-group-item to="/captioner/settings/language">Language</b-list-group-item>
30-
<b-list-group-item to="/captioner/settings/remote-displays">Remote Displays</b-list-group-item>
30+
<b-list-group-item v-show="experiments['remoteDisplays']" to="/captioner/settings/remote-displays">Remote Displays</b-list-group-item>
3131
<b-list-group-item to="/captioner/settings/word-replacements">Word Replacements</b-list-group-item>
3232
<!-- <b-list-group-item to="/captioner/settings/title-cards">Title Cards</b-list-group-item> -->
3333
</b-list-group>
@@ -46,14 +46,15 @@
4646
<nav>
4747
<b-nav vertical pills>
4848
<b-nav-item to="/captioner/settings/about">About</b-nav-item>
49+
<b-nav-item class="nav-item-rainbow" v-if="experiments.includes('science')" to="/captioner/settings/experiments"><fa icon="flask" /> Experiments</b-nav-item>
4950
</b-nav>
5051
<hr/>
5152
<b-nav vertical pills>
5253
<b-nav-item to="/captioner/settings/appearance">Appearance</b-nav-item>
5354
<b-nav-item to="/captioner/settings/censor">Censor</b-nav-item>
5455
<b-nav-item to="/captioner/settings/controls">Controls</b-nav-item>
5556
<b-nav-item to="/captioner/settings/language">Language</b-nav-item>
56-
<b-nav-item to="/captioner/settings/remote-displays">Remote Displays</b-nav-item>
57+
<b-nav-item v-if="experiments.includes('remoteDisplays')" to="/captioner/settings/remote-displays">Remote Displays</b-nav-item>
5758
<b-nav-item to="/captioner/settings/word-replacements">Word Replacements</b-nav-item>
5859
<!-- <b-nav-item to="/captioner/settings/title-cards">Title Cards</b-nav-item> -->
5960
</b-nav>
@@ -80,6 +81,21 @@
8081
</div>
8182
</template>
8283

84+
<style scoped>
85+
.nav-item-rainbow .nav-link.active {
86+
animation: rainbow 10s infinite alternate;
87+
}
88+
@keyframes rainbow {
89+
0% {background-color: hsl(0, 50%, 50%);}
90+
20% {background-color: hsl(50, 50%, 50%);}
91+
40% {background-color: hsl(100, 50%, 50%);}
92+
60% {background-color: hsl(150, 50%, 50%);}
93+
80% {background-color: hsl(200, 50%, 50%);}
94+
100% {background-color: hsl(255, 50%, 50%);}
95+
}
96+
</style>
97+
98+
8399
<script>
84100
import Combokeys from 'combokeys'
85101
import appHeightAdjuster from '../util/appHeightAdjuster'
@@ -113,12 +129,14 @@ export default {
113129
this.$watch('largerLayout', function() {
114130
this.height = appHeightAdjuster();
115131
});
116-
117132
},
118133
beforeDestroy: function() {
119134
this.escShortcut.detach();
120135
},
121136
computed: {
137+
experiments: function() {
138+
return this.$store.state.settings.exp;
139+
},
122140
showBackButton: function() {
123141
return this.$route.path !== '/captioner/settings';
124142
},
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
<template>
2+
<div class="settings-experiments-view">
3+
<p>Be sure to help out and give me feedback about experiments! Email me at <a href="mailto:github@curtgrimes.com">github@curtgrimes.com</a> or <a href="https://m.me/webcaptioner">message me on Facebook</a>.</p>
4+
<b-modal ref="invalidExperiment" class="text-center" hide-header @shown="focusInvalidExperimentModalOkButton()">
5+
<div style="font-size:7rem" class="p-0">&#129300;</div>
6+
<div slot="modal-footer">
7+
<b-btn class="float-right" variant="secondary" ref="invalidExperimentModalOkButton" @click="hideInvalidExperimentModal()">Ok</b-btn>
8+
</div>
9+
</b-modal>
10+
<b-input-group size="lg" class="mb-4">
11+
<b-form-input @keydown.enter.native="addExperiment" v-model="experimentName" autofocus placeholder="Experiment Name"></b-form-input>
12+
<b-input-group-append>
13+
<b-btn @click="addExperiment()">Add</b-btn>
14+
</b-input-group-append>
15+
</b-input-group>
16+
<div v-if="experiments.length">
17+
<h4>Added Experiments</h4>
18+
<b-list-group class="mb-4">
19+
<b-list-group-item v-for="experiment in experiments" :key="experiment">
20+
<div class="row">
21+
<div class="col-8">
22+
<p class="mb-0"><strong>{{experiment}}</strong></p>
23+
<p class="small mb-0">{{getDescription(experiment)}}</p>
24+
</div>
25+
<div class="col-4 pr-2">
26+
<b-btn class="float-right" variant="danger" size="sm" @click="removeExperiment(experiment)">Remove</b-btn>
27+
</div>
28+
</div>
29+
</b-list-group-item>
30+
</b-list-group>
31+
</div>
32+
<div class="embed-responsive embed-responsive-16by9">
33+
<iframe class="embed-responsive-item" src="https://www.youtube.com/embed/Y2VNxmn0lNA?rel=0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
34+
</div>
35+
</div>
36+
</template>
37+
38+
<script>
39+
40+
export default {
41+
name: 'settings-experiments-view',
42+
data: function() {
43+
return {
44+
experimentName: '',
45+
};
46+
},
47+
computed: {
48+
experiments: function() {
49+
return this.$store.state.settings.exp;
50+
},
51+
},
52+
methods: {
53+
hideInvalidExperimentModal: function() {
54+
this.$refs.invalidExperiment.hide();
55+
},
56+
getDescription: function(experiment) {
57+
switch(experiment) {
58+
case 'science':
59+
return 'Add a persistent "Experiments" menu item to settings for easy access.';
60+
case 'remoteDisplays':
61+
return 'Send captions to other phones or tablets.';
62+
default:
63+
return '';
64+
}
65+
},
66+
isValidExperiment: function() {
67+
return ['remoteDisplays','science'].includes(this.experimentName);
68+
},
69+
addExperiment: function() {
70+
if (this.isValidExperiment()) {
71+
this.$store.commit('ADD_EXPERIMENT', {experiment: this.experimentName});
72+
73+
this.experimentName = '';
74+
}
75+
else {
76+
this.$refs.invalidExperiment.show();
77+
}
78+
},
79+
focusInvalidExperimentModalOkButton: function() {
80+
this.$refs.invalidExperimentModalOkButton.focus();
81+
},
82+
removeExperiment: function(experimentName) {
83+
this.$store.commit('REMOVE_EXPERIMENT', {experiment: experimentName});
84+
},
85+
},
86+
}
87+
</script>

0 commit comments

Comments
 (0)