+ Compartilhe apresentações, catálogos, portfólios e documentos diretamente na sua página profissional. +
+ +Anexe PDFs com apresentações, catálogos ou materiais exclusivos para quem acessar sua página Premium.
@@ -2594,6 +2623,63 @@ @:} } } + + // ======================================== + // Sistema de Confirmação ao Sair da Página + // ======================================== + let formChanged = false; + let isSubmitting = false; + + $(document).ready(function() { + // Marcar formulário como alterado quando qualquer campo mudar + $('form :input').on('change input', function() { + if (!isSubmitting) { + formChanged = true; + console.log('Formulário alterado detectado'); + } + }); + + // Quando submeter o formulário, desabilitar aviso + $('form').on('submit', function() { + console.log('Formulário submetido - desabilitando avisos'); + isSubmitting = true; + formChanged = false; + }); + + // Aviso ao tentar fechar/recarregar a página + window.addEventListener('beforeunload', function(e) { + if (formChanged && !isSubmitting) { + console.log('beforeunload: Tentativa de sair com alterações não salvas'); + e.preventDefault(); + e.returnValue = ''; // Chrome requer isso + return 'Você tem alterações não salvas. Deseja realmente sair?'; + } + }); + + // Interceptar cliques em links de navegação (incluindo Dashboard) + $(document).on('click', 'a:not(.no-confirm)', function(e) { + if (formChanged && !isSubmitting) { + const href = $(this).attr('href'); + + // Não avisar para links externos, âncoras ou JavaScript + if (href && !href.startsWith('#') && !href.startsWith('javascript:')) { + console.log('Link clicado com alterações não salvas:', href); + + if (!confirm('Você tem alterações não salvas. Deseja realmente sair desta página?')) { + e.preventDefault(); + console.log('Usuário cancelou navegação'); + return false; + } + + // Usuário confirmou, permitir navegação + console.log('Usuário confirmou saída'); + formChanged = false; + } + } + }); + + console.log('Sistema de confirmação ao sair inicializado'); + }); } diff --git a/src/BCards.Web/Views/UserPage/Display.cshtml b/src/BCards.Web/Views/UserPage/Display.cshtml index 0501289..c239bdd 100644 --- a/src/BCards.Web/Views/UserPage/Display.cshtml +++ b/src/BCards.Web/Views/UserPage/Display.cshtml @@ -19,43 +19,92 @@ { if (string.IsNullOrEmpty(url)) return "#"; - // Se já tem protocolo, retorna direto - if (url.StartsWith("http://") || url.StartsWith("https://")) - return url; - - // WhatsApp - garantir prefixo wa.me + // WhatsApp - sempre normalizar para evitar URLs malformadas if (!string.IsNullOrEmpty(icon) && icon.Contains("whatsapp")) { - // Remove qualquer prefixo parcial que possa existir - var cleanUrl = url.Replace("wa.me/", "").Replace("whatsapp://", ""); + // Remove qualquer prefixo conhecido (incluindo https://) + var cleanUrl = url + .Replace("https://wa.me/", "") + .Replace("http://wa.me/", "") + .Replace("https://api.whatsapp.com/send?phone=", "") + .Replace("https://api.whatsapp.com/", "") + .Replace("wa.me/", "") + .Replace("whatsapp://send?phone=", "") + .Replace("whatsapp://", ""); + + // Remove barras extras + cleanUrl = cleanUrl.TrimStart('/').Trim(); + + // Apenas números devem sobrar return $"https://wa.me/{cleanUrl}"; } + // Se já tem protocolo correto para outras redes, retorna direto + if (url.StartsWith("http://") || url.StartsWith("https://")) + return url; + // Facebook if (!string.IsNullOrEmpty(icon) && icon.Contains("facebook")) { - var cleanUrl = url.Replace("facebook.com/", "").Replace("fb.com/", ""); + var cleanUrl = url + .Replace("https://facebook.com/", "") + .Replace("https://www.facebook.com/", "") + .Replace("https://fb.com/", "") + .Replace("https://www.fb.com/", "") + .Replace("http://facebook.com/", "") + .Replace("http://www.facebook.com/", "") + .Replace("facebook.com/", "") + .Replace("fb.com/", "") + .TrimStart('/').Trim(); return $"https://facebook.com/{cleanUrl}"; } // Instagram if (!string.IsNullOrEmpty(icon) && icon.Contains("instagram")) { - var cleanUrl = url.Replace("instagram.com/", "").Replace("instagr.am/", ""); + var cleanUrl = url + .Replace("https://instagram.com/", "") + .Replace("https://www.instagram.com/", "") + .Replace("https://instagr.am/", "") + .Replace("http://instagram.com/", "") + .Replace("http://www.instagram.com/", "") + .Replace("instagram.com/", "") + .Replace("instagr.am/", "") + .TrimStart('/').Trim(); return $"https://instagram.com/{cleanUrl}"; } // Twitter/X if (!string.IsNullOrEmpty(icon) && (icon.Contains("twitter") || icon.Contains("x-twitter"))) { - var cleanUrl = url.Replace("x.com/", "").Replace("twitter.com/", ""); + var cleanUrl = url + .Replace("https://x.com/", "") + .Replace("https://twitter.com/", "") + .Replace("https://www.twitter.com/", "") + .Replace("https://www.x.com/", "") + .Replace("http://x.com/", "") + .Replace("http://twitter.com/", "") + .Replace("x.com/", "") + .Replace("twitter.com/", "") + .TrimStart('/').Trim(); return $"https://x.com/{cleanUrl}"; } // TikTok if (!string.IsNullOrEmpty(icon) && icon.Contains("tiktok")) { - var cleanUrl = url.Replace("tiktok.com/", "").Replace("tiktok.com/@", ""); + var cleanUrl = url + .Replace("https://tiktok.com/@", "") + .Replace("https://www.tiktok.com/@", "") + .Replace("https://tiktok.com/", "") + .Replace("https://www.tiktok.com/", "") + .Replace("https://vm.tiktok.com/", "") + .Replace("http://tiktok.com/@", "") + .Replace("http://tiktok.com/", "") + .Replace("tiktok.com/@", "") + .Replace("tiktok.com/", "") + .TrimStart('/').Trim(); + // Se não tem @, adiciona if (!cleanUrl.StartsWith("@")) cleanUrl = "@" + cleanUrl; @@ -65,14 +114,29 @@ // Pinterest if (!string.IsNullOrEmpty(icon) && icon.Contains("pinterest")) { - var cleanUrl = url.Replace("pinterest.com/", "").Replace("pin.it/", ""); + var cleanUrl = url + .Replace("https://pinterest.com/", "") + .Replace("https://www.pinterest.com/", "") + .Replace("https://pin.it/", "") + .Replace("http://pinterest.com/", "") + .Replace("http://www.pinterest.com/", "") + .Replace("pinterest.com/", "") + .Replace("pin.it/", "") + .TrimStart('/').Trim(); return $"https://pinterest.com/{cleanUrl}"; } // Discord if (!string.IsNullOrEmpty(icon) && icon.Contains("discord")) { - var cleanUrl = url.Replace("discord.gg/", "").Replace("discord.com/invite/", ""); + var cleanUrl = url + .Replace("https://discord.gg/", "") + .Replace("https://discord.com/invite/", "") + .Replace("http://discord.gg/", "") + .Replace("http://discord.com/invite/", "") + .Replace("discord.gg/", "") + .Replace("discord.com/invite/", "") + .TrimStart('/').Trim(); return $"https://discord.gg/{cleanUrl}"; }