Spaces:
Paused
Paused
/** | |
* Copyright (C) 2024 Puter Technologies Inc. | |
* | |
* This file is part of Puter. | |
* | |
* Puter is free software: you can redistribute it and/or modify | |
* it under the terms of the GNU Affero General Public License as published | |
* by the Free Software Foundation, either version 3 of the License, or | |
* (at your option) any later version. | |
* | |
* This program is distributed in the hope that it will be useful, | |
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
* GNU Affero General Public License for more details. | |
* | |
* You should have received a copy of the GNU Affero General Public License | |
* along with this program. If not, see <https://www.gnu.org/licenses/>. | |
*/ | |
import UIWindow from './UIWindow.js' | |
import UIWindowMyWebsites from './UIWindowMyWebsites.js' | |
async function UIWindowPublishWebsite(target_dir_uid, target_dir_name, target_dir_path){ | |
let h = ''; | |
h += `<div class="window-publishWebsite-content" style="padding: 20px; border-bottom: 1px solid #ced7e1;">`; | |
// success | |
h += `<div class="window-publishWebsite-success">`; | |
h += `<img src="${html_encode(window.icons['c-check.svg'])}" style="width:80px; height:80px; display: block; margin:10px auto;">`; | |
h += `<p style="text-align:center;"><strong>${target_dir_name}</strong> has been published to:<p>`; | |
h += `<p style="text-align:center;"><a class="publishWebsite-published-link" target="_blank"></a><img class="publishWebsite-published-link-icon" src="${html_encode(window.icons['launch.svg'])}"></p>`; | |
h += `<button class="button button-normal button-block button-primary publish-window-ok-btn" style="margin-top:20px;">OK</button>`; | |
h+= `</div>`; | |
// form | |
h += `<form class="window-publishWebsite-form">`; | |
// error msg | |
h += `<div class="publish-website-error-msg"></div>`; | |
// subdomain | |
h += `<div style="overflow: hidden;">`; | |
h += `<label style="margin-bottom: 10px;">Pick a name for your website:</label>`; | |
h += `<div style="font-family: monospace;">https://<input class="publish-website-subdomain" style="width:235px;" type="text" autocomplete="subdomain" spellcheck="false" autocorrect="off" autocapitalize="off" data-gramm_editor="false"/>.${window.hosting_domain}</div>`; | |
h += `</div>`; | |
// uid | |
h += `<input class="publishWebsiteTargetDirUID" type="hidden" value="${target_dir_uid}"/>`; | |
// Publish | |
h += `<button class="publish-btn button button-action button-block button-normal">Publish</button>` | |
h += `</form>`; | |
h += `</div>`; | |
const el_window = await UIWindow({ | |
title: 'Publish Website', | |
icon: null, | |
uid: null, | |
is_dir: false, | |
body_content: h, | |
has_head: true, | |
selectable_body: false, | |
draggable_body: false, | |
allow_context_menu: false, | |
is_resizable: false, | |
is_droppable: false, | |
init_center: true, | |
allow_native_ctxmenu: true, | |
allow_user_select: true, | |
width: 450, | |
dominant: true, | |
onAppend: function(this_window){ | |
$(this_window).find(`.publish-website-subdomain`).val(generate_identifier()); | |
$(this_window).find(`.publish-website-subdomain`).get(0).focus({preventScroll:true}); | |
}, | |
window_class: 'window-publishWebsite', | |
window_css:{ | |
height: 'initial' | |
}, | |
body_css: { | |
width: 'initial', | |
height: '100%', | |
'background-color': 'rgb(245 247 249)', | |
'backdrop-filter': 'blur(3px)', | |
} | |
}) | |
$(el_window).find('.publish-btn').on('click', function(e){ | |
// todo do some basic validation client-side | |
//Subdomain | |
let subdomain = $(el_window).find('.publish-website-subdomain').val(); | |
// disable 'Publish' button | |
$(el_window).find('.publish-btn').prop('disabled', true); | |
puter.hosting.create( | |
subdomain, | |
target_dir_path).then((res)=>{ | |
$(el_window).find('.window-publishWebsite-form').hide(100, function(){ | |
let url = 'https://' + subdomain + '.' + window.hosting_domain + '/'; | |
$(el_window).find('.publishWebsite-published-link').attr('href', url); | |
$(el_window).find('.publishWebsite-published-link').text(url); | |
$(el_window).find('.window-publishWebsite-success').show(100) | |
$(`.item[data-uid="${target_dir_uid}"] .item-has-website-badge`).show(); | |
}); | |
// find all items whose path starts with target_dir_path | |
$(`.item[data-path^="${target_dir_path}"]`).each(function(){ | |
// show the link badge | |
$(this).find('.item-has-website-url-badge').show(); | |
// update item's website_url attribute | |
$(this).attr('data-website_url', url + $(this).attr('data-path').substring(target_dir_path.length)); | |
}) | |
update_sites_cache(); | |
}).catch((err)=>{ | |
$(el_window).find('.publish-website-error-msg').html( | |
err.message + ( | |
err.code === 'subdomain_limit_reached' ? | |
' <span class="manage-your-websites-link">Manage Your Subdomains</span>' : '' | |
) | |
); | |
$(el_window).find('.publish-website-error-msg').fadeIn(); | |
// re-enable 'Publish' button | |
$(el_window).find('.publish-btn').prop('disabled', false); | |
}) | |
}) | |
$(el_window).find('.publish-window-ok-btn').on('click', function(){ | |
$(el_window).close(); | |
}) | |
} | |
$(document).on('click', '.manage-your-websites-link', async function(e){ | |
UIWindowMyWebsites(); | |
}) | |
export default UIWindowPublishWebsite |