feat(push notification): membuat trait untuk simpan data subcription dan use di di semua component

This commit is contained in:
Yoga Pangestu 2025-11-16 14:38:01 +07:00
parent 163a90b857
commit fd5a85400c
28 changed files with 90 additions and 52 deletions

View File

@ -3,6 +3,7 @@
namespace App\Livewire\Studio\Catalog\Bottle;
use App\Models\Bottle;
use App\Traits\Notification\WithSubscribeNotification;
use App\Traits\WithConfirmation;
use App\Traits\WithShowPrice;
use App\Traits\WithToast;
@ -13,7 +14,7 @@
#[Title('Botol')]
class Index extends Component
{
use WithConfirmation, WithShowPrice, WithToast;
use WithConfirmation, WithShowPrice, WithSubscribeNotification, WithToast;
public function delete(Bottle $bottle)
{

View File

@ -4,6 +4,7 @@
use App\Livewire\Forms\Studio\Catalog\BrandForm;
use App\Models\Brand as BrandModel;
use App\Traits\Notification\WithSubscribeNotification;
use App\Traits\WithAuthorization;
use App\Traits\WithCloseModal;
use App\Traits\WithConfirmation;
@ -17,7 +18,7 @@
#[Title('Merek')]
class Brand extends Component
{
use WithAuthorization, WithCloseModal, WithConfirmation, WithToast, WithUpdatedData;
use WithAuthorization, WithCloseModal, WithConfirmation, WithSubscribeNotification, WithToast, WithUpdatedData;
public BrandForm $form;

View File

@ -4,6 +4,7 @@
use App\Livewire\Forms\Studio\Catalog\CategoryForm;
use App\Models\Category as CategoryModel;
use App\Traits\Notification\WithSubscribeNotification;
use App\Traits\WithAuthorization;
use App\Traits\WithCloseModal;
use App\Traits\WithConfirmation;
@ -17,7 +18,7 @@
#[Title('Kategori')]
class Category extends Component
{
use WithAuthorization, WithCloseModal, WithConfirmation, WithToast, WithUpdatedData;
use WithAuthorization, WithCloseModal, WithConfirmation, WithSubscribeNotification, WithToast, WithUpdatedData;
public CategoryForm $form;

View File

@ -3,6 +3,7 @@
namespace App\Livewire\Studio\Catalog\Perfume;
use App\Models\Perfume;
use App\Traits\Notification\WithSubscribeNotification;
use App\Traits\WithConfirmation;
use App\Traits\WithShowPrice;
use App\Traits\WithToast;
@ -13,7 +14,7 @@
#[Title('Parfum')]
class Index extends Component
{
use WithConfirmation, WithShowPrice, WithToast;
use WithConfirmation, WithShowPrice, WithSubscribeNotification, WithToast;
public function delete(Perfume $perfume)
{

View File

@ -3,6 +3,7 @@
namespace App\Livewire\Studio\Catalog\Product;
use App\Models\Product;
use App\Traits\Notification\WithSubscribeNotification;
use App\Traits\WithConfirmation;
use App\Traits\WithShowPrice;
use App\Traits\WithToast;
@ -13,7 +14,7 @@
#[Title('Produk')]
class Index extends Component
{
use WithConfirmation, WithShowPrice,WithToast;
use WithConfirmation, WithShowPrice, WithSubscribeNotification, WithToast;
public function delete(Product $product)
{

View File

@ -17,6 +17,7 @@
use App\Models\Tier;
use App\Models\User;
use App\Models\Voucher;
use App\Traits\Notification\WithSubscribeNotification;
use Carbon\Carbon;
use Livewire\Attributes\Title;
use Livewire\Component;
@ -24,6 +25,8 @@
#[Title('Analisa')]
class Analysis extends Component
{
use WithSubscribeNotification;
public string $period = 'all';
public array $outlets = [];

View File

@ -7,15 +7,16 @@
use App\Models\OrderItem;
use App\Models\Perfume;
use App\Models\Purchase;
use App\Models\PushNotification;
use App\Traits\Notification\WithSubscribeNotification;
use Illuminate\Support\Facades\DB;
use Livewire\Attributes\On;
use Livewire\Attributes\Title;
use Livewire\Component;
#[Title('Ringkasan')]
class Overview extends Component
{
use WithSubscribeNotification;
public array $outlets = [];
public array $selectedOutletIds = [];
@ -250,31 +251,6 @@ protected function loadStats()
]);
}
#[On('notification:subscribe')]
public function notificationSubscribe(string $subscription)
{
$subscription = json_decode($subscription, true);
$isExist = PushNotification::where('user_id', auth()->id())
->whereJsonContains('subscriptions->keys->auth', $subscription['keys']['auth'])
->first();
if ($isExist) {
return;
}
$userId = auth()->id();
$encodedSubscription = json_encode($subscription);
PushNotification::updateOrCreate(
[
'user_id' => $userId,
'subscriptions' => $encodedSubscription,
],
['subscriptions' => $encodedSubscription],
);
}
public function render()
{
return view('livewire.studio.dashboard.overview');

View File

@ -4,6 +4,7 @@
use App\Livewire\Forms\Studio\Feature\ChooseUsForm;
use App\Models\ChooseUs as ChooseUsModel;
use App\Traits\Notification\WithSubscribeNotification;
use App\Traits\WithAuthorization;
use App\Traits\WithCloseModal;
use App\Traits\WithConfirmation;
@ -17,7 +18,7 @@
#[Title('Pilih Kami')]
class ChooseUs extends Component
{
use WithAuthorization, WithCloseModal, WithConfirmation, WithToast, WithUpdatedData;
use WithAuthorization, WithCloseModal, WithConfirmation, WithSubscribeNotification, WithToast, WithUpdatedData;
public ChooseUsForm $form;

View File

@ -4,6 +4,7 @@
use App\Livewire\Forms\Studio\Feature\PerfumeFeatureForm;
use App\Models\PerfumeFeature as PerfumeFeatureModel;
use App\Traits\Notification\WithSubscribeNotification;
use App\Traits\WithAuthorization;
use App\Traits\WithCloseModal;
use App\Traits\WithConfirmation;
@ -17,7 +18,7 @@
#[Title('Keunggulan Parfum')]
class PerfumeFeature extends Component
{
use WithAuthorization, WithCloseModal, WithConfirmation, WithToast, WithUpdatedData;
use WithAuthorization, WithCloseModal, WithConfirmation, WithSubscribeNotification, WithToast, WithUpdatedData;
public PerfumeFeatureForm $form;

View File

@ -5,6 +5,7 @@
use App\Livewire\Forms\Studio\Finance\ExpenseForm;
use App\Models\Expense as ExpenseModel;
use App\Models\Outlet;
use App\Traits\Notification\WithSubscribeNotification;
use App\Traits\WithAuthorization;
use App\Traits\WithCloseModal;
use App\Traits\WithConfirmation;
@ -18,7 +19,7 @@
#[Title('Pengeluaran')]
class Expense extends Component
{
use WithAuthorization, WithCloseModal, WithConfirmation, WithToast, WithUpdatedData;
use WithAuthorization, WithCloseModal, WithConfirmation, WithSubscribeNotification, WithToast, WithUpdatedData;
public ExpenseForm $form;

View File

@ -7,6 +7,7 @@
use App\Models\Payroll as PayrollModel;
use App\Models\PayrollAdjustment;
use App\Models\User;
use App\Traits\Notification\WithSubscribeNotification;
use App\Traits\WithAuthorization;
use App\Traits\WithCloseModal;
use App\Traits\WithConfirmation;
@ -22,7 +23,7 @@
#[Title('Penggajian')]
class Payroll extends Component
{
use WithAuthorization, WithCloseModal, WithConfirmation, WithToast, WithUpdatedData, WithUserSelector;
use WithAuthorization, WithCloseModal, WithConfirmation, WithSubscribeNotification, WithToast, WithUpdatedData, WithUserSelector;
public PayrollForm $form;

View File

@ -4,6 +4,7 @@
use App\Livewire\Forms\Studio\Loyalty\CustomerForm;
use App\Models\Customer as CustomerModel;
use App\Traits\Notification\WithSubscribeNotification;
use App\Traits\WithAuthorization;
use App\Traits\WithCloseModal;
use App\Traits\WithConfirmation;
@ -17,7 +18,7 @@
#[Title('Customer')]
class Customer extends Component
{
use WithAuthorization, WithCloseModal, WithConfirmation, WithToast, WithUpdatedData;
use WithAuthorization, WithCloseModal, WithConfirmation, WithSubscribeNotification, WithToast, WithUpdatedData;
public CustomerForm $form;

View File

@ -7,6 +7,7 @@
use App\Models\Perfume;
use App\Models\Product;
use App\Models\Tier as TierModel;
use App\Traits\Notification\WithSubscribeNotification;
use App\Traits\WithAuthorization;
use App\Traits\WithCloseModal;
use App\Traits\WithConfirmation;
@ -20,7 +21,7 @@
#[Title('Tier')]
class Tier extends Component
{
use WithAuthorization, WithCloseModal, WithConfirmation, WithToast, WithUpdatedData;
use WithAuthorization, WithCloseModal, WithConfirmation, WithSubscribeNotification, WithToast, WithUpdatedData;
public array $tiers = [];

View File

@ -5,6 +5,7 @@
use App\Livewire\Forms\Studio\Loyalty\Tier\RewardForm;
use App\Livewire\Studio\Loyalty\Tier;
use App\Models\TierReward;
use App\Traits\Notification\WithSubscribeNotification;
use App\Traits\WithAuthorization;
use App\Traits\WithCloseModal;
use App\Traits\WithConfirmation;
@ -18,7 +19,7 @@
#[Title('Hadiah')]
class Reward extends Component
{
use WithAuthorization, WithCloseModal, WithConfirmation, WithToast, WithUpdatedData;
use WithAuthorization, WithCloseModal, WithConfirmation, WithSubscribeNotification, WithToast, WithUpdatedData;
public RewardForm $form;

View File

@ -3,6 +3,7 @@
namespace App\Livewire\Studio\Loyalty\Voucher;
use App\Models\Voucher;
use App\Traits\Notification\WithSubscribeNotification;
use App\Traits\WithConfirmation;
use App\Traits\WithToast;
use Flux\Flux;
@ -12,7 +13,7 @@
#[Title('Voucher')]
class Index extends Component
{
use WithConfirmation, WithToast;
use WithConfirmation, WithSubscribeNotification, WithToast;
public array $stats = [];

View File

@ -3,6 +3,7 @@
namespace App\Livewire\Studio\Manage\Article;
use App\Models\Article;
use App\Traits\Notification\WithSubscribeNotification;
use App\Traits\WithConfirmation;
use App\Traits\WithToast;
use Flux\Flux;
@ -12,7 +13,7 @@
#[Title('Artikel')]
class Index extends Component
{
use WithConfirmation, WithToast;
use WithConfirmation, WithSubscribeNotification, WithToast;
public function delete(Article $article)
{

View File

@ -4,6 +4,7 @@
use App\Livewire\Forms\Studio\Manage\FaqForm;
use App\Models\Faq as FaqModel;
use App\Traits\Notification\WithSubscribeNotification;
use App\Traits\WithAuthorization;
use App\Traits\WithCloseModal;
use App\Traits\WithConfirmation;
@ -17,7 +18,7 @@
#[Title('FAQs')]
class Faq extends Component
{
use WithAuthorization, WithCloseModal, WithConfirmation, WithToast, WithUpdatedData;
use WithAuthorization, WithCloseModal, WithConfirmation, WithSubscribeNotification, WithToast, WithUpdatedData;
public FaqForm $form;

View File

@ -3,6 +3,7 @@
namespace App\Livewire\Studio\Manage\Order;
use App\Models\Order;
use App\Traits\Notification\WithSubscribeNotification;
use App\Traits\Order\WithUpdateStock;
use App\Traits\WithCloseModal;
use App\Traits\WithConfirmation;
@ -14,7 +15,7 @@
#[Title('Order')]
class Index extends Component
{
use WithCloseModal, WithConfirmation, WithToast, WithUpdateStock;
use WithCloseModal, WithConfirmation, WithSubscribeNotification, WithToast, WithUpdateStock;
public function delete(Order $order)
{

View File

@ -3,6 +3,7 @@
namespace App\Livewire\Studio\Manage\Purchase;
use App\Models\Purchase;
use App\Traits\Notification\WithSubscribeNotification;
use App\Traits\Purchase\WithUpdateStock;
use App\Traits\WithCloseModal;
use App\Traits\WithConfirmation;
@ -14,7 +15,7 @@
#[Title('Belanja')]
class Index extends Component
{
use WithCloseModal, WithConfirmation, WithToast, WithUpdateStock;
use WithCloseModal, WithConfirmation, WithSubscribeNotification, WithToast, WithUpdateStock;
public function delete(Purchase $purchase)
{

View File

@ -6,6 +6,7 @@
use App\Models\Bottle;
use App\Models\Formula as FormulaModel;
use App\Models\PushNotification;
use App\Traits\Notification\WithSubscribeNotification;
use App\Traits\WithAuthorization;
use App\Traits\WithCloseModal;
use App\Traits\WithConfirmation;
@ -21,7 +22,7 @@
#[Title('Rumus')]
class Formula extends Component
{
use WithAuthorization, WithCloseModal, WithConfirmation, WithToast, WithUpdatedData;
use WithAuthorization, WithCloseModal, WithConfirmation, WithSubscribeNotification, WithToast, WithUpdatedData;
public FormulaForm $form;

View File

@ -4,6 +4,7 @@
use App\Enums\Day;
use App\Models\Outlet;
use App\Traits\Notification\WithSubscribeNotification;
use App\Traits\WithCloseModal;
use App\Traits\WithConfirmation;
use App\Traits\WithMediaHandler;
@ -16,7 +17,7 @@
#[Title('Outlet')]
class Index extends Component
{
use WithCloseModal, WithConfirmation, WithMediaHandler, WithToast;
use WithCloseModal, WithConfirmation, WithMediaHandler, WithSubscribeNotification, WithToast;
public array $outlets = [];

View File

@ -4,6 +4,7 @@
use App\Models\Employee;
use App\Models\User;
use App\Traits\Notification\WithSubscribeNotification;
use App\Traits\WithConfirmation;
use App\Traits\WithToast;
use Flux\Flux;
@ -14,7 +15,7 @@
#[Title('Pegawai')]
class Index extends Component
{
use WithConfirmation, WithToast;
use WithConfirmation, WithSubscribeNotification, WithToast;
public array $employees = [];

View File

@ -4,6 +4,7 @@
use App\Livewire\Forms\Studio\Setting\AccountForm;
use App\Models\User;
use App\Traits\Notification\WithSubscribeNotification;
use App\Traits\WithAuthorization;
use App\Traits\WithToast;
use App\Traits\WithUpdatedData;
@ -13,7 +14,7 @@
#[Title('Akun')]
class Account extends Component
{
use WithAuthorization, WithToast, WithUpdatedData;
use WithAuthorization, WithSubscribeNotification, WithToast, WithUpdatedData;
public AccountForm $form;

View File

@ -10,6 +10,7 @@
use App\Settings\GeneralSettings;
use App\Settings\SeoSettings;
use App\Settings\SocialSettings;
use App\Traits\Notification\WithSubscribeNotification;
use App\Traits\WithAuthorization;
use App\Traits\WithToast;
use App\Traits\WithUpdatedData;
@ -19,7 +20,7 @@
#[Title('Aplikasi')]
class Application extends Component
{
use WithAuthorization, WithToast, WithUpdatedData;
use WithAuthorization, WithSubscribeNotification, WithToast, WithUpdatedData;
public GeneralForm $generalForm;

View File

@ -4,6 +4,7 @@
use App\Livewire\Forms\Studio\Setting\PasswordForm;
use App\Models\User;
use App\Traits\Notification\WithSubscribeNotification;
use App\Traits\WithAuthorization;
use App\Traits\WithToast;
use App\Traits\WithUpdatedData;
@ -14,7 +15,7 @@
#[Title('Kata Sandi')]
class Password extends Component
{
use WithAuthorization, WithToast, WithUpdatedData;
use WithAuthorization, WithSubscribeNotification, WithToast, WithUpdatedData;
public PasswordForm $form;

View File

@ -4,6 +4,7 @@
use App\Livewire\Forms\Studio\Setting\ProfileForm;
use App\Models\Employee;
use App\Traits\Notification\WithSubscribeNotification;
use App\Traits\WithAuthorization;
use App\Traits\WithToast;
use App\Traits\WithUpdatedData;
@ -13,7 +14,7 @@
#[Title('Profil')]
class Profile extends Component
{
use WithAuthorization, WithToast, WithUpdatedData;
use WithAuthorization, WithSubscribeNotification, WithToast, WithUpdatedData;
public ProfileForm $form;

View File

@ -3,6 +3,7 @@
namespace App\Livewire\Studio\Setting;
use App\Models\Whatsapp as WhatsappModel;
use App\Traits\Notification\WithSubscribeNotification;
use App\Traits\WithToast;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
@ -12,7 +13,7 @@
#[Title('Whatsapp')]
class Whatsapp extends Component
{
use WithToast;
use WithSubscribeNotification, WithToast;
public array $whatsapp = [];

View File

@ -0,0 +1,34 @@
<?php
namespace App\Traits\Notification;
use App\Models\PushNotification;
use Livewire\Attributes\On;
trait WithSubscribeNotification
{
#[On('notification:subscribe')]
public function notificationSubscribe(string $subscription)
{
$subscription = json_decode($subscription, true);
$isExist = PushNotification::where('user_id', auth()->id())
->whereJsonContains('subscriptions->keys->auth', $subscription['keys']['auth'])
->first();
if ($isExist) {
return;
}
$userId = auth()->id();
$encodedSubscription = json_encode($subscription);
PushNotification::updateOrCreate(
[
'user_id' => $userId,
'subscriptions' => $encodedSubscription,
],
['subscriptions' => $encodedSubscription],
);
}
}