68 lines
2.0 KiB
JavaScript
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 };
|
|
}
|