import { Controller } from "@hotwired/stimulus" export default class extends Controller { static targets = ["trustIndicator"] async convictUser(event) { event.preventDefault() const userId = event.currentTarget.dataset.userId const modal = document.createElement('div') modal.classList.add('cm') modal.innerHTML = `

Set User Trust Level

Choose a trust level for this user:

` document.body.appendChild(modal) const close = modal.querySelector('.cm-close') close.addEventListener('click', () => { document.body.removeChild(modal) }) const buttons = modal.querySelectorAll('.co') buttons.forEach(btn => { btn.addEventListener('click', async () => { const level = btn.dataset.value await this.updateUserTrustLevel(userId, level) document.body.removeChild(modal) }) }) } async updateUserTrustLevel(userId, level) { try { const token = document.querySelector('meta[name="csrf-token"]')?.content; if (!token) { throw new Error('CSRF token not found'); } const resp = await fetch(`/users/${userId}/update_trust_level`, { method: 'PATCH', headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': token }, body: JSON.stringify({ trust_level: level }) }); if (resp.ok) { const cell = document.querySelector(`.admin-timeline-user-header-cell[data-user-id="${userId}"]`); if (cell) { cell.classList.remove('user-trust-red', 'user-trust-green', 'user-trust-yellow'); if (level === 'red') { cell.classList.add('user-trust-red'); } else if (level === 'green') { cell.classList.add('user-trust-green'); } else if (level === 'yellow') { cell.classList.add('user-trust-yellow'); } const indicator = cell.querySelector('.user-trust-indicator'); if (indicator) { if (level === 'red') { indicator.textContent = '🔴'; indicator.title = 'Convicted'; } else if (level === 'green') { indicator.textContent = '🟢'; indicator.title = 'Trusted'; } else if (level === 'yellow') { // For suspected users, show indicator only in admin UI indicator.textContent = '🟡'; indicator.title = 'Suspected (Hidden from user)'; } else { // Blue/unscored indicator.textContent = '🔵'; indicator.title = 'Unscored'; } } } const notice = document.createElement('div'); notice.classList.add('tln'); notice.innerHTML = `trust set to ${level}`; document.body.appendChild(notice); setTimeout(() => { notice.remove(); }, 3000); } else { const err = await resp.json(); throw new Error(err.error); } } catch (error) { console.error(error); } } }