«Το Sinners κάνει πρεμιέρα στο Netflix»


r.type === this.reactorFilter);
},
getReactionCount(type) {
return this.reactionCounts[type] || 0;
},
computeReactionCounts() {
const counts = {};
for (const r of this.reactorsList) {
counts[r.type] = (counts[r.type] || 0) + 1;
}
this.reactionCounts = counts;
},
scrollToComment(commentId) {
this.$nextTick(() => {
setTimeout(() => {
const el = document.querySelector([data-comment-id='${commentId}']);
if (el) {
el.scrollIntoView({ behavior: ‘smooth’, block: ‘start’ });
el.classList.add(‘comment--active’);
setTimeout(() => {
el.classList.remove(‘comment-highlight-active’);
el.classList.add(‘comment-highlight-fade’);
setTimeout(() => {
el.classList.remove(‘comment-highlight-fade’);
this.highlightedCommentId = null;
}, 1500);
}, 5000);
}
}, 300);
});
},
scrollToNewComment(commentId) {
this.$nextTick(() => {
setTimeout(() => {
const el = document.querySelector([data-comment-id='${commentId}']);
if (el) {
el.scrollIntoView({ behavior: ‘smooth’, block: ‘start’ });
}
}, 100);
});
},

    nudgeCloseHint(flag) {
        this[flag] = true;
        setTimeout(() => { this[flag] = false; }, 400);

        // Throttle the toast so repeated outside-clicks don't stack notifications.
        const now = Date.now();
        if (now - this.closeHintAt > 2000) {
            this.closeHintAt = now;
            window.dispatchEvent(new CustomEvent('show-toast', {
                detail: { message: 'Για να κλείσεις, χρησιμοποίησε το κουμπί κλεισίματος.', icon: 'info', duration: 2500 }
            }));
        }
    },
    open() {
        this.isOpen = true;
        $wire.open();
    },
    close() {
        this.isOpen = false;
    },
    openAddModal(replyToId = null, replyToAuthor = null) {
        this.replyToId = replyToId;
        this.replyToAuthor = replyToAuthor;
        this.newCommentText = replyToAuthor ? '@' + replyToAuthor + ' ' : '';
        this.showAddModal = true;
        this.$nextTick(() => {
            const ta = this.$refs.addTextarea;
            if (ta) { ta.focus(); ta.setSelectionRange(ta.value.length, ta.value.length); this.autoGrow(ta); }
        });
    },
    closeAddModal() {
        this.showAddModal = false;
        this.replyToId = null;
        this.replyToAuthor = null;
        this.newCommentText="";
    },
    async submitComment() {
        if (this.isSubmitting) return;
        this.isSubmitting = true;
        await $wire.saveComment(this.newCommentText, this.replyToId);
        this.isSubmitting = false;
        this.closeAddModal();
    },
    openEditModal(commentId, text) {
        this.editingCommentId = commentId;
        this.editCommentText = text;
        this.showEditModal = true;
        this.$nextTick(() => {
            const ta = this.$refs.editTextarea;
            if (ta) { ta.focus(); ta.setSelectionRange(ta.value.length, ta.value.length); this.autoGrow(ta); }
        });
    },
    closeEditModal() {
        this.showEditModal = false;
        this.editingCommentId = null;
        this.editCommentText="";
    },
    async submitEdit() {
        if (this.isSubmitting) return;
        this.isSubmitting = true;
        await $wire.updateComment(this.editingCommentId, this.editCommentText);
        this.isSubmitting = false;
        this.closeEditModal();
    },
    openDeleteModal(commentId) {
        this.deletingCommentId = commentId;
        this.showDeleteModal = true;
    },
    closeDeleteModal() {
        this.showDeleteModal = false;
        this.deletingCommentId = null;
    },
    async confirmDelete() {
        if (this.isSubmitting) return;
        this.isSubmitting = true;
        const id = this.deletingCommentId;
        this.showDeleteModal = false;
        this.animatingDeleteId = id;
        await new Promise(r => setTimeout(r, 400));
        await $wire.deleteComment(id);
        this.animatingDeleteId = null;
        this.deletingCommentId = null;
        this.isSubmitting = false;
    },
    openReportModal(commentId) {
        this.reportingCommentId = commentId;
        this.reportReason = '';
        this.showReportModal = true;
        this.$nextTick(() => {
            const ta = this.$refs.reportTextarea;
            if (ta) { ta.focus(); }
        });
    },
    closeReportModal() {
        this.showReportModal = false;
        this.reportingCommentId = null;
        this.reportReason = '';
    },
    async submitReport() {
        if (this.isSubmitting) return;
        this.isSubmitting = true;
        await $wire.submitReport(this.reportingCommentId, this.reportReason);
        this.isSubmitting = false;
        this.closeReportModal();
    },
    openDisapproveModal(commentId) {
        this.disapprovingCommentId = commentId;
        this.showDisapproveModal = true;
    },
    closeDisapproveModal() {
        this.showDisapproveModal = false;
        this.disapprovingCommentId = null;
    },
    async confirmDisapprove() {
        if (this.isSubmitting) return;
        this.isSubmitting = true;
        const id = this.disapprovingCommentId;
        this.showDisapproveModal = false;
        await $wire.toggleApproval(id);
        // Animate fade-in AFTER state change (amber classes now applied)
        this.pendingFadeInId = id;
        setTimeout(() => this.pendingFadeInId = null, 500);
        this.disapprovingCommentId = null;
        this.isSubmitting = false;
    },
    openApproveModal(commentId) {
        this.approvingCommentId = commentId;
        this.showApproveModal = true;
    },
    closeApproveModal() {
        this.showApproveModal = false;
        this.approvingCommentId = null;
    },
    async confirmApprove() {
        if (this.isSubmitting) return;
        this.isSubmitting = true;
        const id = this.approvingCommentId;
        this.showApproveModal = false;
        // Animate fade-out BEFORE state change (amber is still visible)
        this.pendingFadeOutId = id;
        await new Promise(r => setTimeout(r, 600));
        await $wire.toggleApproval(id);
        this.pendingFadeOutId = null;
        this.approvingCommentId = null;
        this.isSubmitting = false;
    },
    async openReactorsModal(commentId, count) {
        this.reactorsCount = count;
        this.loadingReactorsForId = commentId;
        this.showReactorsModal = true;
        this.reactorsList = await $wire.loadReactors(commentId);
        this.computeReactionCounts();
        this.loadingReactorsForId = null;
    },
    closeReactorsModal() {
        this.showReactorsModal = false;
        // Delay clearing data until after fade animation (200ms)
        setTimeout(() => {
            this.reactorsCount = 0;
            this.reactorFilter="all";
            this.reactorsList = [];
            this.reactionCounts = {};
        }, 200);
    }
}"
x-init=""
@open-comments.window="open()"
@scroll-to-comment.window="scrollToComment($event.detail.commentId)"
@scroll-to-new-comment.window="scrollToNewComment($event.detail.commentId)"
@uh-conversation-undo.window="if ($event.detail.nodeId === 132606) $wire.unfollowConversation()"
@keydown.escape.window="if (isOpen && !showAddModal && !showEditModal && !showDeleteModal && !showReportModal && !showReactorsModal) close()"

>

Ταξινόμηση




Πώς σε ειδοποιούμε

  • Σε ειδοποιούμε όταν υπάρχει νέα δραστηριότητα — όχι όμως για κάθε σχόλιο ξεχωριστά.

  • Ομαδοποιούμε τις νέες απαντήσεις, ώστε μια έντονη συζήτηση να μη σε κατακλύζει.

  • Θα λάβεις νέα ειδοποίηση μόνο αφού δεις την προηγούμενη.

Απενεργοποίησε τα email όποτε θες από τις ρυθμίσεις σου.


Πρόσθεσε σχόλιο

Επεξεργασία σχολίου

Διαγραφή σχολίου;

Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.


Αναφορά σχολίου

Περίγραψε γιατί αναφέρεις αυτό το σχόλιο.

Ελάχιστο 10 χαρακτήρες

/500


Απόρριψη σχολίου;

Αυτό το σχόλιο δεν θα είναι πλέον ορατό σε άλλους χρήστες.


Έγκριση σχολίου;

Αυτό το σχόλιο θα γίνει ορατό σε όλους τους χρήστες.






Μπες στη Συζήτηση

Μοιράσου τις σκέψεις σου με την κοινότητα


  • Σχολίασε και απάντησε


  • Αντίδραση με emojis


  • Συμμετέχω στην κοινότητα




Πάρε μέρος στον μεγάλο Διαγωνισμός μας

Dimitris Marizas
Dimitris Marizashttps://technoid.gr
Γράφω για τεχνολογία από τη σκοπιά του ανθρώπου που τη χρησιμοποιεί καθημερινά — όχι από αίθουσες συνεδρίων. Ασχολούμαι με δίκτυα, δορυφορικό internet, smartphones και ψηφιακές υπηρεσίες, με έμφαση στο τι σημαίνουν αυτά πρακτικά για τον Έλληνα χρήστη. Πίσω από κάθε άρθρο κρύβεται ώρες ανάλυσης, δοκιμών και — όταν χρειάζεται — κριτικής σε ό,τι το marketing προσπαθεί να κρύψει.

ΑΦΗΣΤΕ ΜΙΑ ΑΠΑΝΤΗΣΗ

εισάγετε το σχόλιό σας!
παρακαλώ εισάγετε το όνομά σας εδώ