TeaWeb/shared/js/ui/modal/ModalInvite.ts

217 lines
7.2 KiB
TypeScript
Raw Normal View History

import {settings, Settings} from "../../settings";
import {createModal, Modal} from "../../ui/elements/Modal";
import {ConnectionHandler} from "../../ConnectionHandler";
import {ServerAddress} from "../../tree/Server";
import { tr } from "tc-shared/i18n/localize";
2020-03-30 13:44:18 +02:00
type URLGeneratorSettings = {
flag_direct: boolean,
flag_resolved: boolean
}
2019-10-13 21:33:07 +02:00
2020-03-30 13:44:18 +02:00
const DefaultGeneratorSettings: URLGeneratorSettings = {
flag_direct: true,
flag_resolved: false
};
type URLGenerator = {
generate: (properties: {
address: ServerAddress,
resolved_address: ServerAddress
} & URLGeneratorSettings) => string;
setting_available: (key: keyof URLGeneratorSettings) => boolean;
};
const build_url = (base, params) => {
if (Object.keys(params).length == 0)
2020-03-30 13:44:18 +02:00
return base;
return base + "?" + Object.keys(params)
.map(e => e + "=" + encodeURIComponent(params[e]))
.join("&");
2020-03-30 13:44:18 +02:00
};
//TODO: Server password
const url_generators: { [key: string]: URLGenerator } = {
2020-03-30 13:44:18 +02:00
"tea-web": {
generate: properties => {
const address = properties.resolved_address ? properties.resolved_address : properties.address;
const address_str = address.host + (address.port === 9987 ? "" : ":" + address.port);
2020-03-30 13:44:18 +02:00
const parameter = "connect_default=" + (properties.flag_direct ? 1 : 0) + "&connect_address=" + encodeURIComponent(address_str);
let pathbase = "";
if (document.location.protocol !== 'https:') {
2020-03-30 13:44:18 +02:00
/*
* Seems to be a test environment or the TeaClient for localhost where we dont have to use https.
*/
pathbase = "https://web.teaspeak.de/";
} else if (document.location.hostname === "localhost" || document.location.host.startsWith("127.")) {
2020-03-30 13:44:18 +02:00
pathbase = "https://web.teaspeak.de/";
} else {
pathbase = document.location.origin + document.location.pathname;
2019-10-13 21:33:07 +02:00
}
2020-03-30 13:44:18 +02:00
return pathbase + "?" + parameter;
2019-10-13 21:33:07 +02:00
},
2020-03-30 13:44:18 +02:00
setting_available: setting => {
return {
flag_direct: true,
flag_resolved: true
}[setting] || false;
}
},
"tea-client": {
generate: properties => {
const address = properties.resolved_address ? properties.resolved_address : properties.address;
2019-10-13 21:33:07 +02:00
2020-03-30 13:44:18 +02:00
let parameters = {
connect_default: properties.flag_direct ? 1 : 0
};
2019-10-13 21:33:07 +02:00
if (address.port != 9987)
2020-03-30 13:44:18 +02:00
parameters["port"] = address.port;
2019-10-13 21:33:07 +02:00
2020-03-30 13:44:18 +02:00
return build_url("teaclient://" + address.host + "/", parameters);
2019-10-13 21:33:07 +02:00
},
2020-03-30 13:44:18 +02:00
setting_available: setting => {
return {
flag_direct: true,
flag_resolved: true
}[setting] || false;
2019-10-13 21:33:07 +02:00
}
2020-03-30 13:44:18 +02:00
},
"teamspeak": {
generate: properties => {
const address = properties.resolved_address ? properties.resolved_address : properties.address;
let parameters = {};
if (address.port != 9987)
2020-03-30 13:44:18 +02:00
parameters["port"] = address.port;
/*
ts3server://<host>?
port=9987
nickname=UserNickname
password=serverPassword
channel=MyDefaultChannel
cid=channelID
channelpassword=defaultChannelPassword
token=TokenKey
addbookmark=MyBookMarkLabel
*/
return build_url("ts3server://" + address.host + "/", parameters);
},
setting_available: setting => {
return {
flag_direct: false,
flag_resolved: true
}[setting] || false;
}
}
};
2019-05-25 17:54:26 +02:00
2020-03-30 13:44:18 +02:00
export function spawnInviteEditor(connection: ConnectionHandler) {
let modal: Modal;
modal = createModal({
header: tr("Invite URL creator"),
body: () => {
let template = $("#tmpl_invite").renderTag();
2019-10-13 21:33:07 +02:00
2020-03-30 13:44:18 +02:00
template.find(".button-close").on('click', event => modal.close());
return template;
},
footer: undefined,
min_width: "20em",
width: "50em"
});
modal.htmlTag.find(".modal-body").addClass("modal-invite");
const button_copy = modal.htmlTag.find(".button-copy");
const input_type = modal.htmlTag.find(".property-type select");
const label_output = modal.htmlTag.find(".text-output");
const invite_settings = [
{
key: "flag_direct",
node: modal.htmlTag.find(".flag-direct-connect input"),
value: node => node.prop('checked'),
set_value: (node, value) => node.prop('checked', value == "1"),
disable: (node, flag) => node.prop('disabled', flag)
.firstParent('.checkbox').toggleClass('disabled', flag)
2020-03-30 13:44:18 +02:00
},
2019-05-25 17:54:26 +02:00
2020-03-30 13:44:18 +02:00
{
key: "flag_resolved",
node: modal.htmlTag.find(".flag-resolved-address input"),
value: node => node.prop('checked'),
set_value: (node, value) => node.prop('checked', value == "1"),
disable: (node, flag) => node.prop('disabled', flag)
.firstParent('.checkbox').toggleClass('disabled', flag)
2020-03-30 13:44:18 +02:00
}
];
2019-10-13 21:33:07 +02:00
2020-03-30 13:44:18 +02:00
const update_buttons = () => {
const generator = url_generators[input_type.val() as string];
if (!generator) {
for (const s of invite_settings)
2020-03-30 13:44:18 +02:00
s.disable(s.node, true);
return;
}
2019-10-13 21:33:07 +02:00
for (const s of invite_settings)
2020-03-30 13:44:18 +02:00
s.disable(s.node, !generator.setting_available(s.key as any));
};
2019-05-25 17:54:26 +02:00
2020-03-30 13:44:18 +02:00
const update_link = () => {
const generator = url_generators[input_type.val() as string];
if (!generator) {
2020-03-30 13:44:18 +02:00
button_copy.prop('disabled', true);
label_output.text(tr("Missing link generator"));
return;
}
button_copy.prop('disabled', false);
2019-10-13 21:33:07 +02:00
2020-03-30 13:44:18 +02:00
const properties = {
address: connection.channelTree.server.remote_address,
resolved_address: connection.channelTree.client.serverConnection.remote_address()
};
for (const s of invite_settings)
2020-03-30 13:44:18 +02:00
properties[s.key] = s.value(s.node);
2019-10-13 21:33:07 +02:00
2020-03-30 13:44:18 +02:00
label_output.text(generator.generate(properties as any));
};
2019-05-25 17:54:26 +02:00
2019-10-13 21:33:07 +02:00
for (const s of invite_settings) {
2020-03-30 13:44:18 +02:00
s.node.on('change keyup', () => {
settings.changeGlobal(Settings.FN_INVITE_LINK_SETTING(s.key), s.value(s.node));
update_link()
2019-10-13 21:33:07 +02:00
});
2020-03-30 13:44:18 +02:00
s.set_value(s.node, settings.global(Settings.FN_INVITE_LINK_SETTING(s.key), DefaultGeneratorSettings[s.key]));
2019-05-25 17:54:26 +02:00
}
2020-03-30 13:44:18 +02:00
input_type.on('change', () => {
settings.changeGlobal(Settings.KEY_LAST_INVITE_LINK_TYPE, input_type.val() as string);
update_buttons();
update_link();
}).val(settings.global(Settings.KEY_LAST_INVITE_LINK_TYPE));
2020-03-30 13:44:18 +02:00
button_copy.on('click', event => {
label_output.select();
document.execCommand('copy');
});
update_buttons();
update_link();
modal.open();
2019-10-13 21:33:07 +02:00
}
/*
2020-03-30 13:44:18 +02:00
<option value="tea-web">{{tr "TeaWeb" /}}</option>
<option value="tea-client">{{tr "TeaClient" /}}</option>
<option value="teamspeak">{{tr "TeamSpeak" /}}</option>
*/