# জাভাস্ক্রিপ্ট মার্জ এবং বাগ ফিক্স ডকুমেন্টেশন

## সমস্যা

### মূল সমস্যা
পপ-আপ থেকে উইশলিস্ট আইটেম রিমুভ করলে "Add to Wishlist" বাটনের ক্লাস (`bizzwishlist-added`) সঠিকভাবে আপডেট হতো (হার্ট আইকন ফাঁকা হয়ে যেতো)। কিন্তু মিনি উইশলিস্ট থেকে রিমুভ করলে বাটনের ক্লাস আপডেট হতো না — অর্থাৎ বাটনে ভরাট হার্ট (♥) দেখাতো, যখন আইটেমটি আসলে উইশলিস্টে নেই।

### কারণ
`common.js` ফাইলের `removeMiniItem()` ফাংশনে `updateButtonsForProduct()` কল করা হয়নি। এই ফাংশনটি শুধু `wishlist.js`-এ ছিল, `common.js` থেকে অ্যাক্সেস করা সম্ভব ছিল না কারণ সেটি ভিন্ন মডিউলে (`BizzWishlistMini`) ছিল।

## কি করা হয়েছে

### ১. দুটি জাভাস্ক্রিপ্ট ফাইল মার্জ

**আগে:**
- `assets/js/wishlist.js` — মূল উইশলিস্ট ফাংশনালিটি (`BizzWishlist` মডিউল)
- `assets/js/common.js` — মিনি উইশলিস্ট উইজেট (`BizzWishlistMini` মডিউল)

**এখন:**
- শুধু `assets/js/wishlist.js` — সব কিছু একটি ফাইলে, একটি মডিউলে (`BizzWishlist`)
- `assets/js/common.js` ফাইল ডিলিট করা হয়েছে

### ২. বাগ ফিক্স — মিনি উইশলিস্ট থেকে রিমুভ

`removeMiniItem()` ফাংশনে এখন `updateButtonsForProduct(productId, false)` কল করা হয়, যাতে রিমুভ করার পর পেজের সব "Add to Wishlist" বাটন সঠিকভাবে আপডেট হয় (ভরাট হার্ট ♥ থেকে ফাঁকা হার্ট ♡ হয়ে যায়)।

### ৩. বাগ ফিক্স — উইশলিস্ট পেজ থেকে রিমুভ

`removeFromWishlist()` ফাংশনেও `updateButtonsForProduct(productId, false)` যোগ করা হয়েছে। আগে উইশলিস্ট পেজ থেকে রিমুভ করলে অন্য পেজের বাটন আপডেট হতো না।

### ৪. ইভেন্ট ট্রিগার যোগ

বাহ্যিক প্লাগিন থেকে উইশলিস্ট কন্ট্রোল করা সহজ করতে নিম্নলিখিত ইভেন্ট ট্রিগার যোগ করা হয়েছে:

| ইভেন্ট নাম | কখন ট্রিগার হয় | প্যারামিটার |
|---|---|---|
| `bizzwishlist_changed` | যেকোনো উইশলিস্ট পরিবর্তনে | — |
| `bizzwishlist_item_added` | আইটেম উইশলিস্টে যোগ হলে | `[productId, variationId]` |
| `bizzwishlist_item_removed` | আইটেম উইশলিস্ট থেকে রিমুভ হলে | `[productId, variationId]` |
| `bizzwishlist_added_to_cart` | উইশলিস্ট থেকে কার্টে যোগ হলে | `[productId, variationId]` বা `[selectedIds]` |
| `bizzwishlist_popup_opened` | উইশলিস্ট পপ-আপ খুললে | — |
| `bizzwishlist_popup_closed` | উইশলিস্ট পপ-আপ বন্ধ হলে | — |

**ব্যবহারের উদাহরণ (অন্য প্লাগিন থেকে):**
```javascript
jQuery(document).on('bizzwishlist_item_removed', function(e, productId, variationId) {
    console.log('Product ' + productId + ' removed from wishlist');
});

jQuery(document).on('bizzwishlist_changed', function() {
    // Wishlist updated, do something
});
```

### ৫. PHP ফাইল আপডেট

**`includes/Frontend/Assets.php`:**
- `enqueue_common()` মেথড থেকে `common.js` স্ক্রিপ্ট এনকিউ এবং `bizzwishlist_common_params` লোকালাইজেশন সরানো হয়েছে
- শুধু `common.css` স্টাইলশিট এনকিউ রাখা হয়েছে (মিনি উইশলিস্ট CSS এখনও আলাদা ফাইলে আছে)

## কোথায় কোথায় কোড চেক করা হয়েছে

1. **`assets/js/wishlist.js`** — মূল উইশলিস্ট জাভাস্ক্রিপ্ট
2. **`assets/js/common.js`** — মিনি উইশলিস্ট জাভাস্ক্রিপ্ট (এখন ডিলিট)
3. **`includes/Frontend/Assets.php`** — স্ক্রিপ্ট/স্টাইল এনকিউ
4. **`includes/Plugin.php`** — হুক রেজিস্ট্রেশন (পরিবর্তন প্রয়োজন হয়নি)
5. **`includes/Frontend/MiniWishlist.php`** — মিনি উইজেট রেন্ডারিং (পরিবর্তন প্রয়োজন হয়নি)
6. **`includes/Ajax/WishlistAjax.php`** — AJAX হ্যান্ডলার (পরিবর্তন প্রয়োজন হয়নি)

## কি কি ডুপ্লিকেট কোড ছিল

### AJAX URL ও nonce
- `common.js`: `bizzwishlist_common_params.ajax_url`, `bizzwishlist_common_params.nonce`
- `wishlist.js`: `bizzwishlist_params.ajax_url`, `bizzwishlist_params.nonce`
- **সমাধান:** একটি প্যারামিটার অবজেক্ট (`bizzwishlist_params`) ব্যবহার করা হচ্ছে

### i18n স্ট্রিং
- `common.js`-এ ছিল: `add_to_cart`, `remove`, `empty_wishlist`, `select_options`
- `wishlist.js`-এ একই স্ট্রিং আগে থেকেই ছিল
- **সমাধান:** ডুপ্লিকেট লোকালাইজেশন সরানো হয়েছে

### `bizzwishlist_changed` ইভেন্ট লিসেনার
- `common.js`-এ ইভেন্ট লিসেন করে `refreshFragment()` কল করতো
- `wishlist.js`-এ ইভেন্ট ট্রিগার করতো
- **সমাধান:** মার্জ করা কোডে `refreshMiniWishlist()` সরাসরি `refreshFragment()` কল করে, আলাদা ইভেন্ট লিসেনার প্রয়োজন নেই। `bizzwishlist_changed` ইভেন্ট শুধু বাহ্যিক প্লাগিনের জন্য ট্রিগার হয়।

### `refreshFragment()` ডাবল কল সমস্যা
- `common.js`-এর `removeMiniItem()`-এ `refreshFragment()` কল করতো এবং `bizzwishlist_changed` ইভেন্টও ট্রিগার করতো
- ইভেন্ট লিসেনার আবার `refreshFragment()` কল করতো — ফলে ডাবল AJAX রিকোয়েস্ট হতো
- **সমাধান:** এখন `removeMiniItem()` → `refreshMiniWishlist()` → `refreshFragment()` + ইভেন্ট ট্রিগার, একবারই refresh হয়

## কি কি কোড বাদ দেওয়া হয়েছে

1. **`BizzWishlistMini` মডিউল র‍্যাপার** — আলাদা IIFE মডিউল প্রয়োজন নেই, `BizzWishlist`-এ মার্জ হয়েছে
2. **`bizzwishlist_changed` ইভেন্ট লিসেনার** — অভ্যন্তরীণ লিসেনার প্রয়োজন নেই, সরাসরি ফাংশন কল করা হয়
3. **`bizzwishlist_common_params` লোকালাইজেশন** — PHP থেকে আলাদা প্যারামিটার পাস করার প্রয়োজন নেই
4. **`common.js` ফাইল** — সম্পূর্ণ ডিলিট

## কি কি কোড যোগ করা হয়েছে

1. **`initMiniWishlist()` ফাংশন** — `init()`-এ কল হয়, মিনি উইজেট থাকলে ফ্র্যাগমেন্ট লোড করে
2. **`updateButtonsForProduct()` কল** — `removeMiniItem()` এবং `removeFromWishlist()`-এ যোগ করা হয়েছে
3. **`updateCounterValue()` কল** — `removeMiniItem()`-এ কাউন্টার আপডেটের জন্য যোগ করা হয়েছে
4. **নতুন ইভেন্ট ট্রিগার** — `bizzwishlist_item_added`, `bizzwishlist_item_removed`, `bizzwishlist_added_to_cart`, `bizzwishlist_popup_opened`, `bizzwishlist_popup_closed`
5. **`refreshFragment()` গার্ড চেক** — মিনি উইজেট না থাকলে AJAX কল এড়ানো হয়
6. **`STORAGE_KEY` ভেরিয়েবল** — `BizzWishlist` মডিউলে sessionStorage key যোগ করা হয়েছে
7. **`refreshFragment` এক্সপোজ** — `BizzWishlist.refreshFragment()` হিসেবে বাইরে থেকে কল করা যায়

## সারসংক্ষেপ

এই পরিবর্তনে দুটি জাভাস্ক্রিপ্ট ফাইল (`wishlist.js` + `common.js`) একটিতে (`wishlist.js`) মার্জ করা হয়েছে। এতে:
- কোড ডুপ্লিকেশন দূর হয়েছে
- মিনি উইশলিস্ট থেকে রিমুভ করলে বাটন আপডেট হয়
- উইশলিস্ট পেজ থেকে রিমুভ করলেও বাটন আপডেট হয়
- সব জায়গা থেকে রিমুভ করার পর "Add to Wishlist" বাটন সঠিকভাবে দেখায়
- বাহ্যিক প্লাগিনের জন্য বিভিন্ন ইভেন্ট ট্রিগার যোগ হয়েছে
- একটি কম HTTP রিকোয়েস্ট (একটি JS ফাইল কম লোড হয়)
- ডাবল AJAX রিকোয়েস্ট সমস্যা সমাধান হয়েছে
