Spaces:
Paused
Paused
File size: 8,241 Bytes
b72f5af |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 |
/**
* 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 UIWindowEmailConfirmationRequired from './UIWindowEmailConfirmationRequired.js'
async function UIWindowSaveAccount(options){
const internal_id = window.uuidv4();
options = options ?? {};
options.reload_on_success = options.reload_on_success ?? false;
options.send_confirmation_code = options.send_confirmation_code ?? false;
return new Promise(async (resolve) => {
let h = '';
h += `<div>`;
// success
h += `<div class="save-account-success">`;
h += `<img src="${html_encode(window.icons['c-check.svg'])}" style="width:50px; height:50px; display: block; margin:10px auto;">`;
h += `<p style="text-align:center; margin-bottom:10px;">Thank you for creating an account. This session has been saved.</p>`;
h += `<button class="button button-action button-block save-account-success-ok-btn">OK</button>`
h+= `</div>`;
// form
h += `<div class="save-account-form" style="padding: 20px; border-bottom: 1px solid #ced7e1; width: 100%; box-sizing: border-box;">`;
// title
h += `<h1 class="signup-form-title" style="margin-bottom:0;">Create Account</h1>`;
// description
h += `<p class="create-account-desc">${options.message ?? 'Create an account to save your current session and avoid losing your work.'}</p>`;
// signup form
h += `<form class="signup-form">`;
// error msg
h += `<div class="signup-error-msg"></div>`;
// username
h += `<div style="overflow: hidden;">`;
h += `<label for="username-${internal_id}">Username</label>`;
h += `<input id="username-${internal_id}" class="username" value="${options.default_username ?? ''}" type="text" autocomplete="username" spellcheck="false" autocorrect="off" autocapitalize="off" data-gramm_editor="false"/>`;
h += `</div>`;
// email
h += `<div style="overflow: hidden; margin-top: 20px;">`;
h += `<label for="email-${internal_id}">Email</label>`;
h += `<input id="email-${internal_id}" class="email" type="email" autocomplete="email" spellcheck="false" autocorrect="off" autocapitalize="off" data-gramm_editor="false"/>`;
h += `</div>`;
// password
h += `<div style="overflow: hidden; margin-top: 20px; margin-bottom: 20px;">`;
h += `<label for="password-${internal_id}">Password</label>`;
h += `<input id="password-${internal_id}" class="password" type="password" name="password" autocomplete="new-password" />`;
h += `</div>`;
// bot trap - if this value is submitted server will ignore the request
h += `<input type="text" name="p102xyzname" class="p102xyzname" value="">`;
// Create Account
h += `<button class="signup-btn button button-primary button-block button-normal">Create Account</button>`
h += `</form>`;
h += `</div>`;
h += `</div>`;
const el_window = await UIWindow({
title: null,
icon: null,
uid: null,
app: 'save-account',
single_instance: true,
is_dir: false,
body_content: h,
has_head: true,
selectable_body: false,
draggable_body: true,
allow_context_menu: false,
is_draggable: true,
is_droppable: false,
is_resizable: false,
stay_on_top: false,
allow_native_ctxmenu: true,
allow_user_select: true,
width: 350,
dominant: true,
show_in_taskbar: false,
...options.window_options,
onAppend: function(this_window){
if(options.default_username)
$(this_window).find('.email').get(0).focus({preventScroll:true});
else
$(this_window).find('.username').get(0).focus({preventScroll:true});
},
window_class: 'window-save-account',
window_css:{
height: 'initial',
},
on_close: ()=>{
resolve(false)
},
body_css: {
width: 'initial',
'background-color': 'rgba(231, 238, 245, .95)',
'backdrop-filter': 'blur(3px)',
}
})
$(el_window).find('.signup-btn').on('click', function(e){
// todo do some basic validation client-side
//Username
let username = $(el_window).find('.username').val();
//Email
let email = $(el_window).find('.email').val();
//Password
let password = $(el_window).find('.password').val();
// disable 'Create Account' button
$(el_window).find('.signup-btn').prop('disabled', true);
$.ajax({
url: api_origin + "/save_account",
type: 'POST',
async: true,
contentType: "application/json",
data: JSON.stringify({
username: username,
email: email,
password: password,
referrer: options.referrer,
send_confirmation_code: options.send_confirmation_code,
}),
headers: {
"Authorization": "Bearer "+auth_token
},
success: async function (data){
update_auth_data(data.token, data.user)
//close this window
if(data.user.email_confirmation_required){
let is_verified = await UIWindowEmailConfirmationRequired({
stay_on_top: true,
has_head: true
});
resolve(is_verified);
}else{
resolve(true);
}
$(el_window).find('.save-account-form').hide(100, ()=>{
$(el_window).find('.save-account-success').show(100);
})
},
error: function (err){
$(el_window).find('.signup-error-msg').html(err.responseText);
$(el_window).find('.signup-error-msg').fadeIn();
// re-enable 'Create Account' button
$(el_window).find('.signup-btn').prop('disabled', false);
}
});
})
$(el_window).find('.signup-form').on('submit', function(e){
e.preventDefault();
e.stopPropagation();
return false;
})
$(el_window).find('.save-account-success-ok-btn').on('click', ()=>{
$(el_window).close();
})
//remove login window
$(el_window).find('.signup-c2a-clickable').parents('.window').close();
})
}
export default UIWindowSaveAccount |