diff --git a/public/app-runtime.js b/public/app-runtime.js index 24ceb75..33f271e 100644 --- a/public/app-runtime.js +++ b/public/app-runtime.js @@ -1988,6 +1988,22 @@ window.SUN_LEGACY_CATALOG_V175=[{"id":"1","name":"Фуршетный бокс const DEFAULT_SUPABASE_URL = 'https://cksuehzcimitsxmeloes.supabase.co'; const DEFAULT_SUPABASE_KEY = 'sb_publishable_v8Z3hEBnu7zsDwAb5KCWcg_T96IejsM'; + // REST/Auth/Storage/Functions traffic to DEFAULT_SUPABASE_URL is routed through a + // same-region reverse proxy on Timeweb so it isn't a direct request to *.supabase.co + // (some Russian ISPs throttle/drop those). Realtime keeps using DEFAULT_SUPABASE_URL + // directly - a PHP proxy can't handle a WebSocket upgrade - and the app already + // degrades gracefully when Realtime can't connect. + const SUPABASE_API_PROXY = 'https://api.caterium.ru'; + function supabaseProxyFetch(input, init) { + try { + const url = typeof input === 'string' ? input : input?.url; + if (url && url.indexOf(DEFAULT_SUPABASE_URL) === 0) { + const proxied = SUPABASE_API_PROXY + url.slice(DEFAULT_SUPABASE_URL.length); + input = typeof input === 'string' ? proxied : new Request(proxied, input); + } + } catch (_) {} + return fetch(input, init); + } let config = loadConfig(); let client = null; @@ -2899,6 +2915,7 @@ window.SUN_LEGACY_CATALOG_V175=[{"id":"1","name":"Фуршетный бокс ${signed?`

Профиль

${esc(session.user.email||session.user.id)}
`:''} ${signed&&!selected?`

Рабочая компания

${membershipsLoading?'Загружаю доступные рабочие базы…':'У этого аккаунта пока нет доступной рабочей базы.'}

`:''} ${signed&&selected?`

Рабочая компания

${esc(workspace.name)}${supportMode?'· поддержка, только просмотр':''}
Роль: ${supportMode?'Разработчик · поддержка':esc(roleLabel(workspace.role))}${workspace.display_name?` · ${esc(workspace.display_name)}`:''}
${!supportMode&&memberships.length>1?``:''}
`:''} + ${signed&&selected&&!supportMode?`

Синхронизация

Принудительно загрузить актуальные заказы, клиентов и остальные данные с сервера, заменив локальную копию на этом устройстве. Перед загрузкой автоматически создаётся резервная копия.

`:''} ${signed&&selected&&!supportMode&&hasPermission('users.manage')?`

Пользователи

Управление сотрудниками и правами внутри этой компании.

`:''}
${esc(statusText())}
`; bindCloudUI(); @@ -2940,7 +2957,7 @@ window.SUN_LEGACY_CATALOG_V175=[{"id":"1","name":"Фуршетный бокс await loadSupabaseLibrary(); const signature=`${config.url}|${config.key}`; if(!client||signature!==clientSignature){ - client=window.supabase.createClient(config.url,config.key,{auth:{persistSession:true,autoRefreshToken:true,detectSessionInUrl:true}});clientSignature=signature; + client=window.supabase.createClient(config.url,config.key,{auth:{persistSession:true,autoRefreshToken:true,detectSessionInUrl:true},global:{fetch:supabaseProxyFetch}});clientSignature=signature; client.auth.onAuthStateChange((_event,next)=>{session=next;membershipsLoading=Boolean(next?.user);membershipsLoaded=!next?.user;setTimeout(async()=>{try{if(!next?.user){const sw=await switchTenantLocal('');if(sw.changed){location.reload();return;}}else{const sw=await loadMemberships();if(sw){location.reload();return;}}}finally{renderCloudUI();updatePill();}},0);}); } const {data,error}=await client.auth.getSession();if(error)throw error;session=data.session||null;