Live fish ship overnight from Florida • Orders ship Mon–Tue for safe arrival
Reset your password
We will send you an email to reset your password
Login
Mystery Boxes and Monster Fish Go Fast — Get Notified First
Be the first to know about new fish and exclusive offers.
Choosing a selection results in a full page refresh.
Opens in a new window.
(function () {
// Run only on /cart
var path = window.location.pathname || "";
if (!/^\/cart\/?$/.test(path)) return;
var modal = document.getElementById("raFoodUpsell");
if (!modal) return;
var bg = document.getElementById("raBg");
var closeBtn = document.getElementById("raCloseBtn");
var noBtn = document.getElementById("raNoThanks");
// ===== SETTINGS =====
var SHOW_LIMIT = 3; // change to 5 if desired
var COOLDOWN_DAYS = 2; // cooldown length
var OPEN_DELAY_MS = 1600; // delay after cart loads
// ====================
var KEY_COUNT = "ra_food_upsell_show_count";
var KEY_COOLDOWN_UNTIL = "ra_food_upsell_cooldown_until";
function now(){ return Date.now(); }
function getNum(key){
var v = Number(localStorage.getItem(key) || 0);
return isNaN(v) ? 0 : v;
}
function setNum(key, val){
localStorage.setItem(key, String(val));
}
function inCooldown(){
var until = getNum(KEY_COOLDOWN_UNTIL);
return until && now() < until;
}
function startCooldown(){
var until = now() + COOLDOWN_DAYS * 24 * 60 * 60 * 1000;
setNum(KEY_COOLDOWN_UNTIL, until);
setNum(KEY_COUNT, 0);
}
function incrementCount(){
var c = getNum(KEY_COUNT) + 1;
setNum(KEY_COUNT, c);
return c;
}
function open(){
modal.style.display = "block";
document.body.style.overflow = "hidden";
}
function close(){
modal.style.display = "none";
document.body.style.overflow = "";
}
// Close actions start cooldown immediately
function bindClose(el){
if (!el) return;
el.addEventListener("click", function(){
startCooldown();
close();
});
}
bindClose(bg);
bindClose(closeBtn);
bindClose(noBtn);
async function cartHasItems(){
try{
var res = await fetch("/cart.js", { credentials:"same-origin", cache:"no-store" });
if (!res.ok) return false;
var cart = await res.json();
return cart && cart.item_count > 0;
} catch(e){
return false;
}
}
// Load product featured images into the 3 thumbnail blocks automatically
async function loadThumbImages(){
var thumbs = document.querySelectorAll('#raFoodUpsell .raThumb.raImg[data-handle]');
if (!thumbs || !thumbs.length) return;
thumbs.forEach(async function(thumb){
try{
var handle = thumb.getAttribute('data-handle');
if (!handle) return;
var res = await fetch('/products/' + handle + '.js', { cache: 'no-store' });
if (!res.ok) return;
var product = await res.json();
if (!product || !product.featured_image) return;
thumb.style.backgroundImage = "url('" + product.featured_image + "')";
thumb.textContent = ""; // remove VB/FS/CP fallback
} catch(e){
// Fail silently; fallback initials remain
}
});
}
async function init(){
if (inCooldown()) return;
// Some themes update cart asynchronously; retry a few times
var attempts = 0;
while (attempts < 10){
var ok = await cartHasItems();
if (ok) break;
attempts++;
await new Promise(function(r){ setTimeout(r, 250); });
}
var hasItemsFinal = await cartHasItems();
if (!hasItemsFinal) return;
var shownCount = incrementCount();
// Preload images before showing
loadThumbImages();
// Show after cart page loads
setTimeout(open, OPEN_DELAY_MS);
// After N showings, suppress for 2 days (after showing this time)
if (shownCount >= SHOW_LIMIT){
startCooldown();
}
}
if (document.readyState === "loading"){
document.addEventListener("DOMContentLoaded", init);
} else {
init();
}
})();
📲 Text for VIP Fish Access
New imports before they hit the site