diff --git a/public/core/auth-security-v1774.js b/public/core/auth-security-v1774.js index 7322dc6..940627e 100644 --- a/public/core/auth-security-v1774.js +++ b/public/core/auth-security-v1774.js @@ -1,7 +1,7 @@ (()=>{ 'use strict'; - const VERSION='17.8.5-single-session-login'; + const VERSION='17.9.1-public-basic-signup'; const PENDING_REGISTRATION_KEY='sunPendingRegistrationV23'; let busy=false; @@ -9,7 +9,20 @@ const cloud=()=>window.SunCloudV2||null; const client=()=>cloud()?.getClient?.()||null; const esc=value=>window.SunSafe?.escapeHTML?window.SunSafe.escapeHTML(String(value??'')):String(value??''); + const PLAN_LABELS={basic:'Базовый',professional:'Профессиональный',full:'Полный'}; + let signupPolicy={checked:false,promoOptional:false,defaultPlan:'basic'}; + async function refreshSignupPolicy(c=client()){ + if(!c)return signupPolicy; + try{ + const {data,error}=await c.rpc('caterium_public_signup_policy'); + if(error)throw error; + signupPolicy={checked:true,promoOptional:data?.promo_optional===true,defaultPlan:data?.default_plan==='basic'?'basic':'basic'}; + }catch(_){signupPolicy={checked:true,promoOptional:false,defaultPlan:'basic'};} + return signupPolicy; + } + function promoHintText(){return signupPolicy.promoOptional?'Без промокода будет создана компания на Базовом тарифе. Промокод может активировать другой тариф и пробный период.':'Для создания новой компании требуется действующий промокод.';} + function renderPromoPolicy(){const label=$('sunGatePromoLabelTextV181'),hint=$('sunGatePromoHintV181');if(label)label.textContent=signupPolicy.promoOptional?'Промокод — необязательно':'Промокод пробной версии';if(hint&&!String($('sunGatePromoV181')?.value||'').trim())hint.textContent=promoHintText();} function redirectUrl(){try{const u=new URL(location.href);u.hash='';return u.toString();}catch(_){return location.href.split('#')[0];}} function savePendingRegistration(email,promoCode){try{localStorage.setItem(PENDING_REGISTRATION_KEY,JSON.stringify({email:String(email||'').trim().toLowerCase(),companyName:'Новая компания',promoCode:String(promoCode||'').trim().toUpperCase(),createdAt:new Date().toISOString()}));}catch(_){}} @@ -23,16 +36,20 @@ const fields=$('sunGateRegisterFieldsV27');if(!fields)return; const company=$('sunGateCompanyV3');if(company?.parentElement)company.parentElement.remove(); if(!$('sunGatePromoV181')){ - const label=document.createElement('label');label.id='sunGatePromoLabelV181';label.innerHTML='Промокод пробной версииПромокод создаёт компанию и активирует пробный период.'; + const label=document.createElement('label');label.id='sunGatePromoLabelV181';label.innerHTML='Промокод пробной версииПроверяю условия регистрации…'; fields.appendChild(label); - const input=$('sunGatePromoV181');input?.addEventListener('input',()=>{input.value=input.value.toUpperCase().replace(/\s+/g,'');}); - input?.addEventListener('blur',async()=>{const code=String(input.value||'').trim(),email=String($('sunGateEmailV3')?.value||'').trim().toLowerCase(),h=$('sunGatePromoHintV181');if(!code||!h)return;try{const c=client();if(!c)return;const {data,error}=await c.rpc('caterium_trial_promo_preview',{p_code:code,p_email:email||null});if(error)throw error;h.textContent=data?.valid?`Промокод принят · ${Number(data.trial_days||14)} дней пробного доступа`:(data?.reason||'Промокод недействителен');}catch(_){h.textContent='Не удалось проверить промокод.';}}); + const input=$('sunGatePromoV181');input?.addEventListener('input',()=>{input.value=input.value.toUpperCase().replace(/\s+/g,'');if(!input.value)renderPromoPolicy();}); + input?.addEventListener('blur',async()=>{const code=String(input.value||'').trim(),email=String($('sunGateEmailV3')?.value||'').trim().toLowerCase(),h=$('sunGatePromoHintV181');if(!h)return;if(!code){await refreshSignupPolicy();renderPromoPolicy();return;}try{const c=client();if(!c)return;const {data,error}=await c.rpc('caterium_trial_promo_preview',{p_code:code,p_email:email||null});if(error)throw error;const label=PLAN_LABELS[data?.plan]||data?.plan||'тариф по промокоду';h.textContent=data?.valid?`Промокод принят · ${label} · ${Number(data.trial_days||14)} дней`:(data?.reason||'Промокод недействителен');}catch(_){h.textContent='Не удалось проверить промокод.';}}); } + void refreshSignupPolicy().then(renderPromoPolicy); } - async function validatePromo(c,email,code){if(!code)throw new Error('Введите промокод пробной версии Caterium.');const {data,error}=await c.rpc('caterium_trial_promo_preview',{p_code:code,p_email:email});if(error)throw error;if(!data?.valid)throw new Error(data?.reason||'Промокод недействителен.');return data;} + async function validatePromo(c,email,code){ + if(!code){const policy=await refreshSignupPolicy(c);if(policy.promoOptional)return {valid:true,plan:'basic',withoutPromo:true};throw new Error('Введите промокод пробной версии Caterium.');} + const {data,error}=await c.rpc('caterium_trial_promo_preview',{p_code:code,p_email:email});if(error)throw error;if(!data?.valid)throw new Error(data?.reason||'Промокод недействителен.');return data; + } - function showPublicConfirmation(gate,email){if(!gate)return;gate.innerHTML=`

Мы отправили письмо на ${esc(email)}. После подтверждения войдите в Caterium — компания и пробный период будут созданы автоматически. Название компании вы укажете в настройках.

Мы отправили письмо на ${esc(email)}. После подтверждения войдите в Caterium — компания и доступ будут созданы автоматически. Без промокода активируется Базовый тариф; с промокодом — тариф и срок по условиям кода. Название компании вы укажете в настройках.

Письмо подтверждения отправлено на ${esc(email)}. После подтверждения войдите по ссылке приглашения — Caterium автоматически подключит вас к компании.