Files
reactShop/src/utils/categoryPush.js

68 lines
2.0 KiB
JavaScript

/**
* Web Push for category “new articles” notifications — same VAPID/SW as article/pickup push.
*/
export {
PUSH_SUBSCRIPTIONS_CHANGED_EVENT,
emitPushSubscriptionsChanged,
fetchPushConfiguration,
registerPushServiceWorker,
ensurePushSubscription,
isPushApiSupported,
parseSubscribedStatus,
parseSuccess,
} from "./articlePush.js";
/**
* @param {number} kKategorie
* @param {string} endpoint
*/
export async function categoryPushStatus(kKategorie, endpoint) {
const res = await fetch("/api/category/push/status", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ kKategorie, endpoint }),
});
const data = await res.json().catch(() => ({}));
return { ...data, httpOk: res.ok };
}
/**
* @param {number} kKategorie
* @param {PushSubscription} subscription
*/
export async function categoryPushSubscribe(kKategorie, subscription) {
const subJson = subscription.toJSON();
const res = await fetch("/api/category/push/subscribe", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
kKategorie,
subscription: subJson,
}),
});
const data = await res.json().catch(() => ({}));
return { ...data, httpOk: res.ok };
}
/** POST /api/category/push/unsubscribe — body is always `{ endpoint, kKategorie }` (scoped row only). */
export async function categoryPushUnsubscribe(endpoint, kKategorie) {
const parsed =
kKategorie != null && kKategorie !== ""
? typeof kKategorie === "number"
? kKategorie
: parseInt(String(kKategorie), 10)
: NaN;
if (!Number.isFinite(parsed) || parsed <= 0) {
return { success: false, httpOk: false, error: "missing_kKategorie" };
}
const body = { endpoint, kKategorie: parsed };
const res = await fetch("/api/category/push/unsubscribe", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(body),
});
const data = await res.json().catch(() => ({}));
return { ...data, httpOk: res.ok };
}