@churchapps/apphelper 0.12.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/donations/components/MultiGatewayDonationForm.d.ts.map +1 -1
- package/dist/donations/components/MultiGatewayDonationForm.js +88 -184
- package/dist/donations/components/MultiGatewayDonationForm.js.map +1 -1
- package/dist/donations/components/NonAuthDonation.d.ts.map +1 -1
- package/dist/donations/components/NonAuthDonation.js +16 -74
- package/dist/donations/components/NonAuthDonation.js.map +1 -1
- package/dist/donations/components/PayPalNonAuthDonationInner.d.ts.map +1 -1
- package/dist/donations/components/PayPalNonAuthDonationInner.js +9 -5
- package/dist/donations/components/PayPalNonAuthDonationInner.js.map +1 -1
- package/dist/donations/components/PaymentMethods.d.ts.map +1 -1
- package/dist/donations/components/PaymentMethods.js +33 -31
- package/dist/donations/components/PaymentMethods.js.map +1 -1
- package/dist/donations/components/RecurringDonations.js +6 -6
- package/dist/donations/components/RecurringDonations.js.map +1 -1
- package/dist/donations/components/index.d.ts +0 -2
- package/dist/donations/components/index.d.ts.map +1 -1
- package/dist/donations/components/index.js +0 -1
- package/dist/donations/components/index.js.map +1 -1
- package/dist/donations/helpers/DonationHelper.d.ts +3 -3
- package/dist/donations/helpers/DonationHelper.d.ts.map +1 -1
- package/dist/donations/helpers/DonationHelper.js +6 -3
- package/dist/donations/helpers/DonationHelper.js.map +1 -1
- package/dist/donations/helpers/DonationInterface.d.ts +1 -1
- package/dist/donations/helpers/DonationInterface.d.ts.map +1 -1
- package/dist/donations/helpers/PaymentMethod.d.ts +2 -2
- package/dist/donations/helpers/PaymentMethod.d.ts.map +1 -1
- package/dist/donations/helpers/StripePaymentMethod.d.ts +1 -1
- package/dist/donations/helpers/StripePaymentMethod.d.ts.map +1 -1
- package/dist/donations/index.d.ts +1 -0
- package/dist/donations/index.d.ts.map +1 -1
- package/dist/donations/index.js +1 -0
- package/dist/donations/index.js.map +1 -1
- package/dist/donations/providers/KingdomFundingProvider.d.ts +3 -0
- package/dist/donations/providers/KingdomFundingProvider.d.ts.map +1 -0
- package/dist/donations/providers/KingdomFundingProvider.js +86 -0
- package/dist/donations/providers/KingdomFundingProvider.js.map +1 -0
- package/dist/donations/providers/PayPalProvider.d.ts +3 -0
- package/dist/donations/providers/PayPalProvider.d.ts.map +1 -0
- package/dist/donations/providers/PayPalProvider.js +84 -0
- package/dist/donations/providers/PayPalProvider.js.map +1 -0
- package/dist/donations/providers/StripeProvider.d.ts +34 -0
- package/dist/donations/providers/StripeProvider.d.ts.map +1 -0
- package/dist/donations/providers/StripeProvider.js +74 -0
- package/dist/donations/providers/StripeProvider.js.map +1 -0
- package/dist/donations/providers/index.d.ts +3 -0
- package/dist/donations/providers/index.d.ts.map +1 -0
- package/dist/donations/providers/index.js +6 -0
- package/dist/donations/providers/index.js.map +1 -0
- package/dist/donations/providers/registry.d.ts +6 -0
- package/dist/donations/providers/registry.d.ts.map +1 -0
- package/dist/donations/providers/registry.js +36 -0
- package/dist/donations/providers/registry.js.map +1 -0
- package/dist/donations/providers/types.d.ts +113 -0
- package/dist/donations/providers/types.d.ts.map +1 -0
- package/dist/donations/providers/types.js +2 -0
- package/dist/donations/providers/types.js.map +1 -0
- package/package.json +1 -1
- package/dist/donations/components/PayPalCardForm.d.ts +0 -17
- package/dist/donations/components/PayPalCardForm.d.ts.map +0 -1
- package/dist/donations/components/PayPalCardForm.js +0 -118
- package/dist/donations/components/PayPalCardForm.js.map +0 -1
- package/dist/helpers/__tests__/WebPushHelper.test.d.ts +0 -13
- package/dist/helpers/__tests__/WebPushHelper.test.d.ts.map +0 -1
- package/dist/helpers/__tests__/WebPushHelper.test.js +0 -99
- package/dist/helpers/__tests__/WebPushHelper.test.js.map +0 -1
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import type { ReactNode, FC, ForwardRefExoticComponent, RefAttributes } from "react";
|
|
2
|
+
import type { Stripe } from "@stripe/stripe-js";
|
|
3
|
+
import type { PaymentGateway } from "../helpers";
|
|
4
|
+
import type { PaperProps } from "@mui/material/Paper";
|
|
5
|
+
export interface PaymentToken {
|
|
6
|
+
id: string;
|
|
7
|
+
type: "card" | "bank" | "paypal";
|
|
8
|
+
saved?: boolean;
|
|
9
|
+
brand?: string;
|
|
10
|
+
last4?: string;
|
|
11
|
+
expMonth?: string;
|
|
12
|
+
expYear?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface ChargeContext {
|
|
15
|
+
provider: string;
|
|
16
|
+
gatewayId?: string;
|
|
17
|
+
churchId: string;
|
|
18
|
+
amount: number;
|
|
19
|
+
funds: {
|
|
20
|
+
id: string;
|
|
21
|
+
amount: number;
|
|
22
|
+
}[];
|
|
23
|
+
person: {
|
|
24
|
+
id: string;
|
|
25
|
+
email: string;
|
|
26
|
+
name: string;
|
|
27
|
+
};
|
|
28
|
+
notes?: string;
|
|
29
|
+
church: {
|
|
30
|
+
name: string;
|
|
31
|
+
subDomain: string;
|
|
32
|
+
churchURL: string;
|
|
33
|
+
logo: string;
|
|
34
|
+
};
|
|
35
|
+
recurring: boolean;
|
|
36
|
+
interval?: {
|
|
37
|
+
interval_count: number;
|
|
38
|
+
interval: string;
|
|
39
|
+
};
|
|
40
|
+
billingCycleAnchor?: number;
|
|
41
|
+
saveCard?: boolean;
|
|
42
|
+
customerId?: string;
|
|
43
|
+
currency?: string;
|
|
44
|
+
}
|
|
45
|
+
export interface ChargeRequest {
|
|
46
|
+
endpoint: "/donate/charge" | "/donate/subscribe";
|
|
47
|
+
body: any;
|
|
48
|
+
}
|
|
49
|
+
export interface FinalizeResult {
|
|
50
|
+
result: any;
|
|
51
|
+
requiresAction?: boolean;
|
|
52
|
+
success?: boolean;
|
|
53
|
+
error?: string;
|
|
54
|
+
}
|
|
55
|
+
export interface ProviderCapabilities {
|
|
56
|
+
savedCard: boolean;
|
|
57
|
+
savedBank: boolean;
|
|
58
|
+
guestAch: boolean;
|
|
59
|
+
memberNewCard: boolean;
|
|
60
|
+
recurring: boolean;
|
|
61
|
+
editRecurring: boolean;
|
|
62
|
+
}
|
|
63
|
+
export interface ProviderDescriptor {
|
|
64
|
+
adminValue: string;
|
|
65
|
+
label: string;
|
|
66
|
+
keyLabels: {
|
|
67
|
+
public: string;
|
|
68
|
+
private: string;
|
|
69
|
+
webhook?: string;
|
|
70
|
+
};
|
|
71
|
+
feeFields: ("card" | "ach" | "paypal" | "kf")[];
|
|
72
|
+
currencies: string[] | "all";
|
|
73
|
+
selectableInAdmin: boolean;
|
|
74
|
+
betaOnly?: boolean;
|
|
75
|
+
setupInstructionsKey?: string;
|
|
76
|
+
signupUrl?: (church: any, user: any) => string;
|
|
77
|
+
}
|
|
78
|
+
export interface MemberEntryHandle {
|
|
79
|
+
tokenize(): Promise<PaymentToken>;
|
|
80
|
+
}
|
|
81
|
+
export interface MemberEntryProps {
|
|
82
|
+
gateway: PaymentGateway;
|
|
83
|
+
getContext?: () => ChargeContext;
|
|
84
|
+
}
|
|
85
|
+
export interface GuestFormProps {
|
|
86
|
+
churchId: string;
|
|
87
|
+
gateway: PaymentGateway;
|
|
88
|
+
recaptchaSiteKey: string;
|
|
89
|
+
mainContainerCssProps?: PaperProps;
|
|
90
|
+
showHeader?: boolean;
|
|
91
|
+
churchLogo?: string;
|
|
92
|
+
allowSingleGift?: boolean;
|
|
93
|
+
allowRecurring?: boolean;
|
|
94
|
+
showFundSelector?: boolean;
|
|
95
|
+
allowedFundIds?: string[];
|
|
96
|
+
defaultFundId?: string;
|
|
97
|
+
}
|
|
98
|
+
export interface PaymentProvider {
|
|
99
|
+
readonly key: string;
|
|
100
|
+
readonly descriptor: ProviderDescriptor;
|
|
101
|
+
readonly capabilities: ProviderCapabilities;
|
|
102
|
+
MemberWrapper?: FC<{
|
|
103
|
+
stripePromise?: Promise<Stripe | null> | null;
|
|
104
|
+
children: ReactNode;
|
|
105
|
+
}>;
|
|
106
|
+
MemberEntry?: ForwardRefExoticComponent<MemberEntryProps & RefAttributes<MemberEntryHandle>>;
|
|
107
|
+
buildChargeRequest(ctx: ChargeContext, token: PaymentToken): ChargeRequest;
|
|
108
|
+
finalizeResult?(result: any, deps: {
|
|
109
|
+
stripe?: Stripe | null;
|
|
110
|
+
}): Promise<FinalizeResult>;
|
|
111
|
+
GuestForm: FC<GuestFormProps>;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/donations/providers/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/donations/providers/types.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@churchapps/apphelper",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"description": "Library of helper functions, components, and feature modules (donations/forms/login/markdown/website) for React and NextJS ChurchApps",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
interface PayPalCardFormProps {
|
|
3
|
-
onCardDataChange?: (cardData: PayPalCardData) => void;
|
|
4
|
-
style?: React.CSSProperties;
|
|
5
|
-
}
|
|
6
|
-
export interface PayPalCardData {
|
|
7
|
-
cardNumber: string;
|
|
8
|
-
expiryMonth: string;
|
|
9
|
-
expiryYear: string;
|
|
10
|
-
cvv: string;
|
|
11
|
-
holderName: string;
|
|
12
|
-
isValid: boolean;
|
|
13
|
-
errors: string[];
|
|
14
|
-
}
|
|
15
|
-
export declare const PayPalCardForm: React.FC<PayPalCardFormProps>;
|
|
16
|
-
export {};
|
|
17
|
-
//# sourceMappingURL=PayPalCardForm.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PayPalCardForm.d.ts","sourceRoot":"","sources":["../../../src/donations/components/PayPalCardForm.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAGrD,UAAU,mBAAmB;IAC3B,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAC;IACtD,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAuDD,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAqJxD,CAAC"}
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { useState, useCallback } from "react";
|
|
4
|
-
import { Grid, TextField, Box } from "@mui/material";
|
|
5
|
-
const validateCardNumber = (number) => {
|
|
6
|
-
// Remove spaces and non-numeric characters
|
|
7
|
-
const cleanNumber = number.replace(/\D/g, "");
|
|
8
|
-
// Check length (13-19 digits for most cards)
|
|
9
|
-
if (cleanNumber.length < 13 || cleanNumber.length > 19) {
|
|
10
|
-
return false;
|
|
11
|
-
}
|
|
12
|
-
// Luhn algorithm
|
|
13
|
-
let sum = 0;
|
|
14
|
-
let isEven = false;
|
|
15
|
-
for (let i = cleanNumber.length - 1; i >= 0; i--) {
|
|
16
|
-
let digit = parseInt(cleanNumber.charAt(i));
|
|
17
|
-
if (isEven) {
|
|
18
|
-
digit *= 2;
|
|
19
|
-
if (digit > 9) {
|
|
20
|
-
digit -= 9;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
sum += digit;
|
|
24
|
-
isEven = !isEven;
|
|
25
|
-
}
|
|
26
|
-
return sum % 10 === 0;
|
|
27
|
-
};
|
|
28
|
-
const validateExpiryDate = (month, year) => {
|
|
29
|
-
const currentDate = new Date();
|
|
30
|
-
const currentMonth = currentDate.getMonth() + 1;
|
|
31
|
-
const currentYear = currentDate.getFullYear();
|
|
32
|
-
const expMonth = parseInt(month);
|
|
33
|
-
let expYear = parseInt(year);
|
|
34
|
-
// Support 2-digit year inputs by converting to full year (e.g., 25 => 2025)
|
|
35
|
-
if (!isNaN(expYear) && expYear < 100)
|
|
36
|
-
expYear = 2000 + expYear;
|
|
37
|
-
if (isNaN(expMonth) || expMonth < 1 || expMonth > 12)
|
|
38
|
-
return false;
|
|
39
|
-
if (isNaN(expYear))
|
|
40
|
-
return false;
|
|
41
|
-
if (expYear < currentYear)
|
|
42
|
-
return false;
|
|
43
|
-
if (expYear === currentYear && expMonth < currentMonth)
|
|
44
|
-
return false;
|
|
45
|
-
return true;
|
|
46
|
-
};
|
|
47
|
-
const validateCVV = (cvv) => {
|
|
48
|
-
return /^\d{3,4}$/.test(cvv);
|
|
49
|
-
};
|
|
50
|
-
export const PayPalCardForm = ({ onCardDataChange, style }) => {
|
|
51
|
-
const [cardNumber, setCardNumber] = useState("");
|
|
52
|
-
const [expiryMonth, setExpiryMonth] = useState("");
|
|
53
|
-
const [expiryYear, setExpiryYear] = useState("");
|
|
54
|
-
const [cvv, setCvv] = useState("");
|
|
55
|
-
const [holderName, setHolderName] = useState("");
|
|
56
|
-
const formatCardNumber = (value) => {
|
|
57
|
-
// Remove all non-numeric characters
|
|
58
|
-
const numericOnly = value.replace(/\D/g, "");
|
|
59
|
-
// Add spaces every 4 digits
|
|
60
|
-
const formatted = numericOnly.replace(/(\d{4})(?=\d)/g, "$1 ");
|
|
61
|
-
// Limit to 19 digits (including spaces)
|
|
62
|
-
return formatted.substring(0, 23);
|
|
63
|
-
};
|
|
64
|
-
const validateAndNotify = useCallback((cardNum, expMonth, expYear, cvvValue, name) => {
|
|
65
|
-
const errors = [];
|
|
66
|
-
const cleanCardNumber = cardNum.replace(/\D/g, "");
|
|
67
|
-
if (!name.trim()) {
|
|
68
|
-
errors.push("Card holder name is required");
|
|
69
|
-
}
|
|
70
|
-
if (!validateCardNumber(cleanCardNumber)) {
|
|
71
|
-
errors.push("Invalid card number");
|
|
72
|
-
}
|
|
73
|
-
if (!validateExpiryDate(expMonth, expYear)) {
|
|
74
|
-
errors.push("Invalid expiry date");
|
|
75
|
-
}
|
|
76
|
-
if (!validateCVV(cvvValue)) {
|
|
77
|
-
errors.push("Invalid CVV");
|
|
78
|
-
}
|
|
79
|
-
const cardData = {
|
|
80
|
-
cardNumber: cleanCardNumber,
|
|
81
|
-
expiryMonth: expMonth.padStart(2, "0"),
|
|
82
|
-
expiryYear: expYear,
|
|
83
|
-
cvv: cvvValue,
|
|
84
|
-
holderName: name,
|
|
85
|
-
isValid: errors.length === 0,
|
|
86
|
-
errors
|
|
87
|
-
};
|
|
88
|
-
onCardDataChange?.(cardData);
|
|
89
|
-
}, [onCardDataChange]);
|
|
90
|
-
const handleCardNumberChange = (e) => {
|
|
91
|
-
const formatted = formatCardNumber(e.target.value);
|
|
92
|
-
setCardNumber(formatted);
|
|
93
|
-
validateAndNotify(formatted, expiryMonth, expiryYear, cvv, holderName);
|
|
94
|
-
};
|
|
95
|
-
const handleExpiryMonthChange = (e) => {
|
|
96
|
-
const value = e.target.value.replace(/\D/g, "").substring(0, 2);
|
|
97
|
-
setExpiryMonth(value);
|
|
98
|
-
validateAndNotify(cardNumber, value, expiryYear, cvv, holderName);
|
|
99
|
-
};
|
|
100
|
-
const handleExpiryYearChange = (e) => {
|
|
101
|
-
const value = e.target.value.replace(/\D/g, "").substring(0, 4);
|
|
102
|
-
setExpiryYear(value);
|
|
103
|
-
validateAndNotify(cardNumber, expiryMonth, value, cvv, holderName);
|
|
104
|
-
};
|
|
105
|
-
const handleCvvChange = (e) => {
|
|
106
|
-
const value = e.target.value.replace(/\D/g, "").substring(0, 4);
|
|
107
|
-
setCvv(value);
|
|
108
|
-
validateAndNotify(cardNumber, expiryMonth, expiryYear, value, holderName);
|
|
109
|
-
};
|
|
110
|
-
const handleHolderNameChange = (e) => {
|
|
111
|
-
const value = e.target.value;
|
|
112
|
-
setHolderName(value);
|
|
113
|
-
validateAndNotify(cardNumber, expiryMonth, expiryYear, cvv, value);
|
|
114
|
-
};
|
|
115
|
-
// Note: years and months arrays could be used for dropdown selects if needed in the future
|
|
116
|
-
return (_jsx(Box, { style: { ...style }, sx: { p: 1.5, backgroundColor: "white", border: "1px solid #ccc", borderRadius: 1 }, children: _jsxs(Grid, { container: true, spacing: 2, children: [_jsx(Grid, { size: 12, children: _jsx(TextField, { fullWidth: true, label: "Card Holder Name", value: holderName, onChange: handleHolderNameChange, placeholder: "John Doe", size: "small" }) }), _jsx(Grid, { size: 12, children: _jsx(TextField, { fullWidth: true, label: "Card Number", value: cardNumber, onChange: handleCardNumberChange, placeholder: "1234 5678 9012 3456", inputProps: { maxLength: 23 }, size: "small" }) }), _jsx(Grid, { size: { xs: 6, sm: 3 }, children: _jsx(TextField, { fullWidth: true, label: "Month", value: expiryMonth, onChange: handleExpiryMonthChange, placeholder: "MM", inputProps: { maxLength: 2 }, size: "small" }) }), _jsx(Grid, { size: { xs: 6, sm: 3 }, children: _jsx(TextField, { fullWidth: true, label: "Year", value: expiryYear, onChange: handleExpiryYearChange, placeholder: "YYYY", inputProps: { maxLength: 4 }, size: "small" }) }), _jsx(Grid, { size: { xs: 12, sm: 6 }, children: _jsx(TextField, { fullWidth: true, label: "CVV", value: cvv, onChange: handleCvvChange, placeholder: "123", inputProps: { maxLength: 4 }, size: "small" }) })] }) }));
|
|
117
|
-
};
|
|
118
|
-
//# sourceMappingURL=PayPalCardForm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PayPalCardForm.js","sourceRoot":"","sources":["../../../src/donations/components/PayPalCardForm.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @vitest-environment jsdom
|
|
3
|
-
*
|
|
4
|
-
* Unit test for the consolidated apphelper WebPushHelper.subscribe() flow.
|
|
5
|
-
* Stubs the browser push APIs + the underlying ApiHelper, then runs subscribe()
|
|
6
|
-
* end-to-end and asserts:
|
|
7
|
-
* - the right VAPID public key is fetched from the server
|
|
8
|
-
* - pushManager.subscribe is called with userVisibleOnly + the decoded VAPID key
|
|
9
|
-
* - POST /webpush/subscribe is called with the right body shape (the same shape
|
|
10
|
-
* the server's `webpush:` token decoder expects)
|
|
11
|
-
*/
|
|
12
|
-
export {};
|
|
13
|
-
//# sourceMappingURL=WebPushHelper.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WebPushHelper.test.d.ts","sourceRoot":"","sources":["../../../src/helpers/__tests__/WebPushHelper.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @vitest-environment jsdom
|
|
3
|
-
*
|
|
4
|
-
* Unit test for the consolidated apphelper WebPushHelper.subscribe() flow.
|
|
5
|
-
* Stubs the browser push APIs + the underlying ApiHelper, then runs subscribe()
|
|
6
|
-
* end-to-end and asserts:
|
|
7
|
-
* - the right VAPID public key is fetched from the server
|
|
8
|
-
* - pushManager.subscribe is called with userVisibleOnly + the decoded VAPID key
|
|
9
|
-
* - POST /webpush/subscribe is called with the right body shape (the same shape
|
|
10
|
-
* the server's `webpush:` token decoder expects)
|
|
11
|
-
*/
|
|
12
|
-
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
13
|
-
// Mock @churchapps/helpers — WebPushHelper imports ApiHelper + UserHelper from there.
|
|
14
|
-
const apiPostMock = vi.fn().mockResolvedValue(undefined);
|
|
15
|
-
const apiGetMock = vi.fn().mockResolvedValue({ publicKey: "BNcRdreALRFXTkOOUHK1EtK2wtaz5Ry4YfYCA_0QTpQtUbVlUls0VJXg7A8u-Ts1XbjhazAkj7I99e8QcYP7DkM", enabled: true });
|
|
16
|
-
vi.mock("@churchapps/helpers", () => ({
|
|
17
|
-
ApiHelper: { get: apiGetMock, post: apiPostMock },
|
|
18
|
-
UserHelper: { user: { id: "USR00000001" } },
|
|
19
|
-
}));
|
|
20
|
-
const { WebPushHelper } = await import("../WebPushHelper");
|
|
21
|
-
describe("WebPushHelper.subscribe", () => {
|
|
22
|
-
let fakeSubscription;
|
|
23
|
-
let pushManagerSubscribeMock;
|
|
24
|
-
let pushManagerGetSubscriptionMock;
|
|
25
|
-
beforeEach(() => {
|
|
26
|
-
apiPostMock.mockClear();
|
|
27
|
-
apiGetMock.mockClear();
|
|
28
|
-
fakeSubscription = {
|
|
29
|
-
endpoint: `https://example-push.test/endpoint/${Date.now()}`,
|
|
30
|
-
toJSON() {
|
|
31
|
-
return {
|
|
32
|
-
endpoint: this.endpoint,
|
|
33
|
-
keys: { p256dh: "p256dh-fake", auth: "auth-fake" },
|
|
34
|
-
};
|
|
35
|
-
},
|
|
36
|
-
};
|
|
37
|
-
pushManagerSubscribeMock = vi.fn().mockResolvedValue(fakeSubscription);
|
|
38
|
-
pushManagerGetSubscriptionMock = vi.fn().mockResolvedValue(null);
|
|
39
|
-
const fakeRegistration = {
|
|
40
|
-
scope: "/mobile",
|
|
41
|
-
pushManager: {
|
|
42
|
-
subscribe: pushManagerSubscribeMock,
|
|
43
|
-
getSubscription: pushManagerGetSubscriptionMock,
|
|
44
|
-
},
|
|
45
|
-
};
|
|
46
|
-
Object.defineProperty(navigator, "serviceWorker", {
|
|
47
|
-
configurable: true,
|
|
48
|
-
value: {
|
|
49
|
-
getRegistration: vi.fn().mockResolvedValue(fakeRegistration),
|
|
50
|
-
register: vi.fn().mockResolvedValue(fakeRegistration),
|
|
51
|
-
ready: Promise.resolve(fakeRegistration),
|
|
52
|
-
},
|
|
53
|
-
});
|
|
54
|
-
// PushManager presence is what isSupported() checks for
|
|
55
|
-
window.PushManager = function () { };
|
|
56
|
-
// Notification API
|
|
57
|
-
window.Notification = function () { };
|
|
58
|
-
window.Notification.permission = "default";
|
|
59
|
-
window.Notification.requestPermission = vi.fn().mockResolvedValue("granted");
|
|
60
|
-
// Clear any prior opt-out / cooldown state in the jsdom localStorage
|
|
61
|
-
window.localStorage.clear();
|
|
62
|
-
});
|
|
63
|
-
it("posts a webpush subscription to the server when the user grants permission", async () => {
|
|
64
|
-
WebPushHelper.configure({ scope: "/mobile", appName: "B1AppPwa" });
|
|
65
|
-
const sub = await WebPushHelper.subscribe();
|
|
66
|
-
expect(sub).toBeTruthy();
|
|
67
|
-
expect(sub?.endpoint).toBe(fakeSubscription.endpoint);
|
|
68
|
-
// VAPID public key request to the server
|
|
69
|
-
expect(apiGetMock).toHaveBeenCalledWith("/webpush/publicKey", "MessagingApi");
|
|
70
|
-
// pushManager.subscribe was called with userVisibleOnly + the decoded key bytes
|
|
71
|
-
expect(pushManagerSubscribeMock).toHaveBeenCalledTimes(1);
|
|
72
|
-
const args = pushManagerSubscribeMock.mock.calls[0][0];
|
|
73
|
-
expect(args.userVisibleOnly).toBe(true);
|
|
74
|
-
expect(args.applicationServerKey).toBeInstanceOf(Uint8Array);
|
|
75
|
-
// The subscription POST carries the right body shape
|
|
76
|
-
expect(apiPostMock).toHaveBeenCalledWith("/webpush/subscribe", expect.objectContaining({
|
|
77
|
-
appName: "B1AppPwa",
|
|
78
|
-
subscription: expect.objectContaining({
|
|
79
|
-
endpoint: fakeSubscription.endpoint,
|
|
80
|
-
keys: expect.objectContaining({ p256dh: "p256dh-fake", auth: "auth-fake" }),
|
|
81
|
-
}),
|
|
82
|
-
}), "MessagingApi");
|
|
83
|
-
});
|
|
84
|
-
it("returns null and does not POST if permission is denied", async () => {
|
|
85
|
-
window.Notification.requestPermission = vi.fn().mockResolvedValue("denied");
|
|
86
|
-
const sub = await WebPushHelper.subscribe();
|
|
87
|
-
expect(sub).toBeNull();
|
|
88
|
-
expect(apiPostMock).not.toHaveBeenCalled();
|
|
89
|
-
expect(pushManagerSubscribeMock).not.toHaveBeenCalled();
|
|
90
|
-
});
|
|
91
|
-
it("re-posts an existing subscription instead of subscribing again", async () => {
|
|
92
|
-
pushManagerGetSubscriptionMock.mockResolvedValue(fakeSubscription);
|
|
93
|
-
const sub = await WebPushHelper.subscribe();
|
|
94
|
-
expect(sub).toBeTruthy();
|
|
95
|
-
expect(pushManagerSubscribeMock).not.toHaveBeenCalled();
|
|
96
|
-
expect(apiPostMock).toHaveBeenCalledTimes(1);
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
//# sourceMappingURL=WebPushHelper.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WebPushHelper.test.js","sourceRoot":"","sources":["../../../src/helpers/__tests__/WebPushHelper.test.ts"],"names":[],"mappings":"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"}
|