takeone-youtube-clone/resources/views/emails/weekly-digest.blade.php
ghassan f8d13457fa Add full notification preferences system
Users can now control which in-app and email notifications they receive
from their Settings tab on their channel page.

Bell (in-app) preferences:
- New comment on my video (default: on)
- Reply to my comment (default: on)
- Comment liked (default: on)
- Video liked (default: on)
- New subscriber (default: on)
- New video from channels I follow (default: on)
- New post from channels I follow (default: on)
- New user registration — super admins only (default: on)

Email preferences (same set plus):
- Comment liked (default: off — too noisy)
- Video liked (default: off — too noisy)
- New post from channels I follow (default: off)
- My video finished processing (default: on)
- Weekly activity digest every Monday (default: on)
- New user registration — super admins only (default: on)

Implementation:
- Migration: notification_preferences JSON column on users table
- User::notificationPref($key) helper with typed defaults
- All existing notification classes updated to check prefs in via()
- 4 new notification classes: NewSubscriberNotification,
  VideoLikedNotification, NewPostNotification, WeeklyDigestNotification
- 8 new email views matching existing dark theme
- SendWeeklyDigest artisan command, scheduled every Monday 09:00
- NewSubscriberNotification wired into UserController::toggleSubscribe
- VideoLikedNotification wired into UserController::toggleLike
- NewPostNotification wired into PostController::store (to all subscribers)
- Bell renderer updated for new_subscriber, video_like, new_post types
- Preferences saved via AJAX (POST /settings/notifications) — instant
  toggle with automatic revert on failure

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 23:47:28 +03:00

64 lines
2.7 KiB
PHP

<x-emails.layout subject="Your weekly TAKEONE summary 📊">
<div style="width:64px;height:64px;border-radius:50%;background:rgba(230,30,30,.12);border:1px solid rgba(230,30,30,.25);margin:0 auto 24px;text-align:center;line-height:64px;font-size:28px;">&#x1F4CA;</div>
<h1 class="email-title">Your week in numbers</h1>
<p class="email-subtitle">Here's how your channel did in the last 7 days.</p>
<p class="email-text">Hi <strong style="color:#f1f1f1;">{{ $creator->name }}</strong>,</p>
<div class="email-infobox">
<div class="email-infobox-label">This Week's Stats</div>
<div class="email-inforow">
<span class="email-inforow-key">&#x1F440; Views</span>
<span class="email-inforow-val">{{ number_format($stats['views']) }}</span>
</div>
<div class="email-inforow">
<span class="email-inforow-key">&#x2764;&#xFE0F; Likes</span>
<span class="email-inforow-val">{{ number_format($stats['likes']) }}</span>
</div>
<div class="email-inforow">
<span class="email-inforow-key">&#x1F514; New Subscribers</span>
<span class="email-inforow-val">{{ number_format($stats['new_subs']) }}</span>
</div>
</div>
@if($stats['top_video'])
<p class="email-text" style="margin-top:20px;">Your top video this week:</p>
@if($stats['top_video']->thumbnail)
<div class="email-thumb-wrap">
<a href="{{ route('videos.show', $stats['top_video']) }}">
<img src="{{ route('media.thumbnail', $stats['top_video']->thumbnail) }}" alt="{{ $stats['top_video']->title }}">
</a>
</div>
@endif
<div class="email-infobox">
<div class="email-inforow">
<span class="email-inforow-key">Title</span>
<span class="email-inforow-val">{{ $stats['top_video']->title }}</span>
</div>
<div class="email-inforow">
<span class="email-inforow-key">Views this week</span>
<span class="email-inforow-val">{{ number_format($stats['top_video']->week_views ?? 0) }}</span>
</div>
</div>
<div class="email-btn-wrap">
<a href="{{ route('videos.show', $stats['top_video']) }}" class="email-btn">&#x25B6;&nbsp; Watch Top Video</a>
</div>
@else
<p class="email-text" style="text-align:center;color:var(--text-secondary);">
Upload your first video to start tracking performance!
</p>
<div class="email-btn-wrap">
<a href="{{ route('home') }}" class="email-btn">&#x1F3AC;&nbsp; Go to TAKEONE</a>
</div>
@endif
<hr class="email-divider">
<p class="email-note">You can manage your notification preferences in your <a href="{{ route('settings') }}">account settings</a>.</p>
</x-emails.layout>