Skip to content

Commit b6e181d

Browse files
authored
DEV: Cleanup & modernize (#44)
1 parent 8fe4c25 commit b6e181d

File tree

13 files changed

+1195
-361
lines changed

13 files changed

+1195
-361
lines changed

common/common.scss

Lines changed: 0 additions & 8 deletions
This file was deleted.
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import Component from "@glimmer/component";
2+
import { on } from "@ember/modifier";
3+
import { action } from "@ember/object";
4+
import didInsert from "@ember/render-modifiers/modifiers/did-insert";
5+
import { service } from "@ember/service";
6+
import DButton from "discourse/components/d-button";
7+
import loadScript from "discourse/lib/load-script";
8+
import { i18n } from "discourse-i18n";
9+
10+
export default class LaunchButton extends Component {
11+
@service site;
12+
@service currentUser;
13+
14+
get label() {
15+
return this.args.label || i18n(themePrefix("launch_jitsi"));
16+
}
17+
18+
get icon() {
19+
return settings.button_icon;
20+
}
21+
22+
@action
23+
registerElement(element) {
24+
this.buttonElement = element;
25+
}
26+
27+
@action
28+
launch() {
29+
if (this.args.isPreview) {
30+
return;
31+
}
32+
33+
const domain = settings.meet_jitsi_domain;
34+
35+
if (
36+
(this.site.mobileView && this.args.mobileIframe === "false") ||
37+
(!this.site.mobileView && this.args.desktopIframe === "false")
38+
) {
39+
window.open(`https://${domain}/${this.args.room}`, "_blank");
40+
return;
41+
}
42+
43+
loadScript(settings.jitsi_script_src).then(() => {
44+
const options = {
45+
roomName: this.args.room,
46+
height: 450,
47+
parentNode: this.buttonElement.parentNode,
48+
userInfo: {
49+
displayName: this.currentUser?.username || "",
50+
},
51+
interfaceConfigOverwrite: {
52+
DEFAULT_REMOTE_DISPLAY_NAME: "",
53+
},
54+
};
55+
56+
const jitsiAPI = new window.JitsiMeetExternalAPI(domain, options);
57+
this.buttonElement.classList.add("hidden");
58+
59+
jitsiAPI.addEventListener(
60+
"videoConferenceLeft",
61+
() => {
62+
this.buttonElement.classList.remove("hidden");
63+
this.buttonElement.nextElementSibling?.remove();
64+
},
65+
{ once: true }
66+
);
67+
});
68+
}
69+
70+
<template>
71+
<DButton
72+
class="btn btn-primary launch-jitsi"
73+
@icon={{this.icon}}
74+
@translatedLabel={{this.label}}
75+
{{didInsert this.registerElement}}
76+
{{on "click" this.launch}}
77+
/>
78+
</template>
79+
}
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
import Component from "@glimmer/component";
2+
import { cached } from "@glimmer/tracking";
3+
import { action } from "@ember/object";
4+
import DModal from "discourse/components/d-modal";
5+
import Form from "discourse/components/form";
6+
import { isRailsTesting, isTesting } from "discourse/lib/environment";
7+
import { i18n } from "discourse-i18n";
8+
9+
export default class InsertJitsiComponent extends Component {
10+
@cached
11+
get formData() {
12+
return {
13+
jitsiRoom: "",
14+
buttonText: "",
15+
mobileIframe: settings.default_mobile_iframe,
16+
desktopIframe: settings.default_desktop_iframe,
17+
};
18+
}
19+
20+
keyDown(e) {
21+
if (e.keyCode === 13) {
22+
e.preventDefault();
23+
e.stopPropagation();
24+
return false;
25+
}
26+
}
27+
28+
get randomID() {
29+
return isTesting() || isRailsTesting()
30+
? "identifier"
31+
: Math.random().toString(36).slice(-10);
32+
}
33+
34+
@action
35+
insert(data) {
36+
const roomID = data.jitsiRoom.trim() || this.randomID;
37+
let text;
38+
39+
if (this.args.model.plainText) {
40+
const domain = settings.meet_jitsi_domain;
41+
text = `https://${domain}/${encodeURIComponent(roomID)}`;
42+
} else {
43+
const attributes = [
44+
`room="${roomID}"`,
45+
data.buttonText ? `label="${data.buttonText}"` : "",
46+
`mobileIframe="${data.mobileIframe}"`,
47+
`desktopIframe="${data.desktopIframe}"`,
48+
]
49+
.filter(Boolean)
50+
.join(" ");
51+
52+
text = `[wrap=discourse-jitsi ${attributes}][/wrap]`;
53+
}
54+
55+
this.args.model.insertMeeting(text);
56+
this.args.closeModal();
57+
}
58+
59+
<template>
60+
<DModal
61+
@title={{i18n (themePrefix "modal.title")}}
62+
class="insert-jitsi"
63+
@closeModal={{@closeModal}}
64+
>
65+
<:body>
66+
<Form
67+
@data={{this.formData}}
68+
@onSubmit={{this.insert}}
69+
class="insert-jitsi-form"
70+
as |form|
71+
>
72+
<form.Field
73+
@name="jitsiRoom"
74+
@title={{i18n (themePrefix "room_label")}}
75+
@description={{i18n (themePrefix "modal.room_field_description")}}
76+
@format="large"
77+
@descriptionFormat="full"
78+
as |field|
79+
>
80+
<field.Input />
81+
</form.Field>
82+
83+
{{#unless @model.plainText}}
84+
<form.Field
85+
@name="buttonText"
86+
@title={{i18n (themePrefix "button_text_label")}}
87+
@format="large"
88+
@descriptionFormat="full"
89+
as |field|
90+
>
91+
<field.Input placeholder={{i18n (themePrefix "launch_jitsi")}} />
92+
</form.Field>
93+
94+
{{#unless settings.hide_iframe_buttons}}
95+
<form.CheckboxGroup
96+
@title={{i18n (themePrefix "modal.iframe_title")}}
97+
as |group|
98+
>
99+
<group.Field
100+
@name="mobileIframe"
101+
@title={{i18n (themePrefix "modal.mobile_iframe")}}
102+
@format="full"
103+
as |field|
104+
>
105+
<field.Checkbox />
106+
</group.Field>
107+
108+
<group.Field
109+
@name="desktopIframe"
110+
@title={{i18n (themePrefix "modal.desktop_iframe")}}
111+
@format="full"
112+
as |field|
113+
>
114+
<field.Checkbox />
115+
</group.Field>
116+
</form.CheckboxGroup>
117+
{{/unless}}
118+
{{/unless}}
119+
120+
<form.Actions>
121+
<form.Submit @label={{themePrefix "modal.insert"}} />
122+
</form.Actions>
123+
</Form>
124+
</:body>
125+
</DModal>
126+
</template>
127+
}

javascripts/discourse/components/modal/insert-jitsi.hbs

Lines changed: 0 additions & 58 deletions
This file was deleted.

javascripts/discourse/components/modal/insert-jitsi.js

Lines changed: 0 additions & 47 deletions
This file was deleted.

0 commit comments

Comments
 (0)