@akin-travel/partner-sdk 1.0.5
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/README.md +1204 -0
- package/dist/account/components/AccountInfoSection.d.ts +46 -0
- package/dist/account/components/AccountInfoSection.d.ts.map +1 -0
- package/dist/account/components/AccountInfoSection.js +52 -0
- package/dist/account/components/AccountInfoSection.js.map +1 -0
- package/dist/account/components/NotificationPreferencesSection.d.ts +40 -0
- package/dist/account/components/NotificationPreferencesSection.d.ts.map +1 -0
- package/dist/account/components/NotificationPreferencesSection.js +116 -0
- package/dist/account/components/NotificationPreferencesSection.js.map +1 -0
- package/dist/account/components/PasskeySection.d.ts +49 -0
- package/dist/account/components/PasskeySection.d.ts.map +1 -0
- package/dist/account/components/PasskeySection.js +298 -0
- package/dist/account/components/PasskeySection.js.map +1 -0
- package/dist/account/hooks/useAccountForm.d.ts +23 -0
- package/dist/account/hooks/useAccountForm.d.ts.map +1 -0
- package/dist/account/hooks/useAccountForm.js +133 -0
- package/dist/account/hooks/useAccountForm.js.map +1 -0
- package/dist/account/index.d.ts +10 -0
- package/dist/account/index.d.ts.map +1 -0
- package/dist/account/index.js +21 -0
- package/dist/account/index.js.map +1 -0
- package/dist/auth/AkinAuthProvider.d.ts +31 -0
- package/dist/auth/AkinAuthProvider.d.ts.map +1 -0
- package/dist/auth/AkinAuthProvider.js +632 -0
- package/dist/auth/AkinAuthProvider.js.map +1 -0
- package/dist/auth/components/LoginForm.d.ts +63 -0
- package/dist/auth/components/LoginForm.d.ts.map +1 -0
- package/dist/auth/components/LoginForm.js +230 -0
- package/dist/auth/components/LoginForm.js.map +1 -0
- package/dist/auth/components/MagicLinkForm.d.ts +41 -0
- package/dist/auth/components/MagicLinkForm.d.ts.map +1 -0
- package/dist/auth/components/MagicLinkForm.js +88 -0
- package/dist/auth/components/MagicLinkForm.js.map +1 -0
- package/dist/auth/components/RequireAuth.d.ts +62 -0
- package/dist/auth/components/RequireAuth.d.ts.map +1 -0
- package/dist/auth/components/RequireAuth.js +63 -0
- package/dist/auth/components/RequireAuth.js.map +1 -0
- package/dist/auth/components/RequireGuest.d.ts +60 -0
- package/dist/auth/components/RequireGuest.d.ts.map +1 -0
- package/dist/auth/components/RequireGuest.js +64 -0
- package/dist/auth/components/RequireGuest.js.map +1 -0
- package/dist/auth/components/SignupForm.d.ts +45 -0
- package/dist/auth/components/SignupForm.d.ts.map +1 -0
- package/dist/auth/components/SignupForm.js +167 -0
- package/dist/auth/components/SignupForm.js.map +1 -0
- package/dist/auth/index.d.ts +10 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +21 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/client.d.ts +17 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +136 -0
- package/dist/client.js.map +1 -0
- package/dist/components/PhoneInput.d.ts +62 -0
- package/dist/components/PhoneInput.d.ts.map +1 -0
- package/dist/components/PhoneInput.js +65 -0
- package/dist/components/PhoneInput.js.map +1 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +9 -0
- package/dist/components/index.js.map +1 -0
- package/dist/config.d.ts +111 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +56 -0
- package/dist/config.js.map +1 -0
- package/dist/constants/preferences.d.ts +22 -0
- package/dist/constants/preferences.d.ts.map +1 -0
- package/dist/constants/preferences.js +52 -0
- package/dist/constants/preferences.js.map +1 -0
- package/dist/currency/CurrencyProvider.d.ts +46 -0
- package/dist/currency/CurrencyProvider.d.ts.map +1 -0
- package/dist/currency/CurrencyProvider.js +145 -0
- package/dist/currency/CurrencyProvider.js.map +1 -0
- package/dist/currency/components/CurrencySelector.d.ts +43 -0
- package/dist/currency/components/CurrencySelector.d.ts.map +1 -0
- package/dist/currency/components/CurrencySelector.js +58 -0
- package/dist/currency/components/CurrencySelector.js.map +1 -0
- package/dist/currency/exchangeRates.d.ts +40 -0
- package/dist/currency/exchangeRates.d.ts.map +1 -0
- package/dist/currency/exchangeRates.js +90 -0
- package/dist/currency/exchangeRates.js.map +1 -0
- package/dist/currency/index.d.ts +6 -0
- package/dist/currency/index.d.ts.map +1 -0
- package/dist/currency/index.js +20 -0
- package/dist/currency/index.js.map +1 -0
- package/dist/header/components/CurrencyAccordion.d.ts +45 -0
- package/dist/header/components/CurrencyAccordion.d.ts.map +1 -0
- package/dist/header/components/CurrencyAccordion.js +54 -0
- package/dist/header/components/CurrencyAccordion.js.map +1 -0
- package/dist/header/components/HeaderMenu.d.ts +49 -0
- package/dist/header/components/HeaderMenu.d.ts.map +1 -0
- package/dist/header/components/HeaderMenu.js +95 -0
- package/dist/header/components/HeaderMenu.js.map +1 -0
- package/dist/header/components/LanguageAccordion.d.ts +45 -0
- package/dist/header/components/LanguageAccordion.d.ts.map +1 -0
- package/dist/header/components/LanguageAccordion.js +54 -0
- package/dist/header/components/LanguageAccordion.js.map +1 -0
- package/dist/header/components/UserAvatar.d.ts +26 -0
- package/dist/header/components/UserAvatar.d.ts.map +1 -0
- package/dist/header/components/UserAvatar.js +46 -0
- package/dist/header/components/UserAvatar.js.map +1 -0
- package/dist/header/index.d.ts +10 -0
- package/dist/header/index.d.ts.map +1 -0
- package/dist/header/index.js +13 -0
- package/dist/header/index.js.map +1 -0
- package/dist/i18n/I18nProvider.d.ts +57 -0
- package/dist/i18n/I18nProvider.d.ts.map +1 -0
- package/dist/i18n/I18nProvider.js +205 -0
- package/dist/i18n/I18nProvider.js.map +1 -0
- package/dist/i18n/components/LanguageSelector.d.ts +43 -0
- package/dist/i18n/components/LanguageSelector.d.ts.map +1 -0
- package/dist/i18n/components/LanguageSelector.js +57 -0
- package/dist/i18n/components/LanguageSelector.js.map +1 -0
- package/dist/i18n/index.d.ts +5 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +14 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/translations/en.json +283 -0
- package/dist/i18n/translations/es.json +283 -0
- package/dist/index.d.ts +81 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +191 -0
- package/dist/index.js.map +1 -0
- package/dist/loyalty/AkinLoyaltyProvider.d.ts +18 -0
- package/dist/loyalty/AkinLoyaltyProvider.d.ts.map +1 -0
- package/dist/loyalty/AkinLoyaltyProvider.js +399 -0
- package/dist/loyalty/AkinLoyaltyProvider.js.map +1 -0
- package/dist/loyalty/components/LoyaltyCard.d.ts +48 -0
- package/dist/loyalty/components/LoyaltyCard.d.ts.map +1 -0
- package/dist/loyalty/components/LoyaltyCard.js +140 -0
- package/dist/loyalty/components/LoyaltyCard.js.map +1 -0
- package/dist/loyalty/components/PointsDisplay.d.ts +40 -0
- package/dist/loyalty/components/PointsDisplay.d.ts.map +1 -0
- package/dist/loyalty/components/PointsDisplay.js +32 -0
- package/dist/loyalty/components/PointsDisplay.js.map +1 -0
- package/dist/loyalty/components/PreviousStays.d.ts +59 -0
- package/dist/loyalty/components/PreviousStays.d.ts.map +1 -0
- package/dist/loyalty/components/PreviousStays.js +101 -0
- package/dist/loyalty/components/PreviousStays.js.map +1 -0
- package/dist/loyalty/components/SimpleTierCards.d.ts +51 -0
- package/dist/loyalty/components/SimpleTierCards.d.ts.map +1 -0
- package/dist/loyalty/components/SimpleTierCards.js +96 -0
- package/dist/loyalty/components/SimpleTierCards.js.map +1 -0
- package/dist/loyalty/components/TierCard.d.ts +30 -0
- package/dist/loyalty/components/TierCard.d.ts.map +1 -0
- package/dist/loyalty/components/TierCard.js +41 -0
- package/dist/loyalty/components/TierCard.js.map +1 -0
- package/dist/loyalty/components/TierProgress.d.ts +32 -0
- package/dist/loyalty/components/TierProgress.d.ts.map +1 -0
- package/dist/loyalty/components/TierProgress.js +41 -0
- package/dist/loyalty/components/TierProgress.js.map +1 -0
- package/dist/loyalty/components/TierRequirementsTable.d.ts +54 -0
- package/dist/loyalty/components/TierRequirementsTable.d.ts.map +1 -0
- package/dist/loyalty/components/TierRequirementsTable.js +104 -0
- package/dist/loyalty/components/TierRequirementsTable.js.map +1 -0
- package/dist/loyalty/components/TransactionList.d.ts +44 -0
- package/dist/loyalty/components/TransactionList.d.ts.map +1 -0
- package/dist/loyalty/components/TransactionList.js +112 -0
- package/dist/loyalty/components/TransactionList.js.map +1 -0
- package/dist/loyalty/components/UpcomingStays.d.ts +49 -0
- package/dist/loyalty/components/UpcomingStays.d.ts.map +1 -0
- package/dist/loyalty/components/UpcomingStays.js +60 -0
- package/dist/loyalty/components/UpcomingStays.js.map +1 -0
- package/dist/loyalty/index.d.ts +12 -0
- package/dist/loyalty/index.d.ts.map +1 -0
- package/dist/loyalty/index.js +27 -0
- package/dist/loyalty/index.js.map +1 -0
- package/dist/types/account.d.ts +108 -0
- package/dist/types/account.d.ts.map +1 -0
- package/dist/types/account.js +3 -0
- package/dist/types/account.js.map +1 -0
- package/dist/types/auth.d.ts +205 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +3 -0
- package/dist/types/auth.js.map +1 -0
- package/dist/types/currency.d.ts +102 -0
- package/dist/types/currency.d.ts.map +1 -0
- package/dist/types/currency.js +3 -0
- package/dist/types/currency.js.map +1 -0
- package/dist/types/header.d.ts +105 -0
- package/dist/types/header.d.ts.map +1 -0
- package/dist/types/header.js +3 -0
- package/dist/types/header.js.map +1 -0
- package/dist/types/i18n.d.ts +90 -0
- package/dist/types/i18n.d.ts.map +1 -0
- package/dist/types/i18n.js +3 -0
- package/dist/types/i18n.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/loyalty.d.ts +312 -0
- package/dist/types/loyalty.d.ts.map +1 -0
- package/dist/types/loyalty.js +3 -0
- package/dist/types/loyalty.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +10 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/tierLabels.d.ts +27 -0
- package/dist/utils/tierLabels.d.ts.map +1 -0
- package/dist/utils/tierLabels.js +110 -0
- package/dist/utils/tierLabels.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { LoyaltyCardRenderProps } from '../../types/loyalty';
|
|
3
|
+
interface LoyaltyCardProps {
|
|
4
|
+
/**
|
|
5
|
+
* Render function that receives loyalty card data
|
|
6
|
+
* Use this to build your own styled loyalty card
|
|
7
|
+
*/
|
|
8
|
+
children: (props: LoyaltyCardRenderProps) => ReactNode;
|
|
9
|
+
/** Called when "Book now" button is clicked */
|
|
10
|
+
onBookNow?: () => void;
|
|
11
|
+
/** Called when "Add a stay" button is clicked */
|
|
12
|
+
onAddStay?: () => void;
|
|
13
|
+
/** Called when "Refer a friend" button is clicked */
|
|
14
|
+
onReferFriend?: () => void;
|
|
15
|
+
/** Called when "Set preferences" button is clicked */
|
|
16
|
+
onSetPreferences?: () => void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Headless LoyaltyCard component
|
|
20
|
+
*
|
|
21
|
+
* Provides comprehensive loyalty data including stats and progress.
|
|
22
|
+
* Use this as the main loyalty card at the top of a rewards page.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```tsx
|
|
26
|
+
* <LoyaltyCard>
|
|
27
|
+
* {({ firstName, tierDisplayName, points, membershipYearStats, tierProgress }) => (
|
|
28
|
+
* <div className="loyalty-card">
|
|
29
|
+
* <h1>Welcome back, {firstName}!</h1>
|
|
30
|
+
* <div className="tier">{tierDisplayName}</div>
|
|
31
|
+
* <div className="points">{points.toLocaleString()} points</div>
|
|
32
|
+
* <div className="stats">
|
|
33
|
+
* <span>{membershipYearStats.totalStays} stays this year</span>
|
|
34
|
+
* <span>{membershipYearStats.totalNights} nights this year</span>
|
|
35
|
+
* </div>
|
|
36
|
+
* {tierProgress?.nextTier && (
|
|
37
|
+
* <div className="progress">
|
|
38
|
+
* {tierProgress.pointsToNextTier} points to next tier
|
|
39
|
+
* </div>
|
|
40
|
+
* )}
|
|
41
|
+
* </div>
|
|
42
|
+
* )}
|
|
43
|
+
* </LoyaltyCard>
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare function LoyaltyCard({ children, onBookNow, onAddStay, onReferFriend, onSetPreferences, }: LoyaltyCardProps): import("react/jsx-runtime").JSX.Element;
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=LoyaltyCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LoyaltyCard.d.ts","sourceRoot":"","sources":["../../../src/loyalty/components/LoyaltyCard.tsx"],"names":[],"mappings":"AAEA,OAAc,EAAE,KAAK,SAAS,EAAW,MAAM,OAAO,CAAC;AAGvD,OAAO,KAAK,EAAE,sBAAsB,EAAc,MAAM,qBAAqB,CAAC;AAgB9E,UAAU,gBAAgB;IACxB;;;OAGG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,SAAS,CAAC;IAGvD,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,qDAAqD;IACrD,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,SAAS,EACT,SAAS,EACT,aAAa,EACb,gBAAgB,GACjB,EAAE,gBAAgB,2CAkElB"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.LoyaltyCard = LoyaltyCard;
|
|
38
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
39
|
+
const react_1 = __importStar(require("react"));
|
|
40
|
+
const AkinLoyaltyProvider_1 = require("../AkinLoyaltyProvider");
|
|
41
|
+
const AkinAuthProvider_1 = require("../../auth/AkinAuthProvider");
|
|
42
|
+
/**
|
|
43
|
+
* Get the membership year dates based on calendar year
|
|
44
|
+
* Most loyalty programs use calendar year (Jan 1 - Dec 31)
|
|
45
|
+
*/
|
|
46
|
+
function getMembershipYearDates() {
|
|
47
|
+
const now = new Date();
|
|
48
|
+
const currentYear = now.getFullYear();
|
|
49
|
+
return {
|
|
50
|
+
start: new Date(currentYear, 0, 1), // Jan 1
|
|
51
|
+
end: new Date(currentYear, 11, 31), // Dec 31
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Headless LoyaltyCard component
|
|
56
|
+
*
|
|
57
|
+
* Provides comprehensive loyalty data including stats and progress.
|
|
58
|
+
* Use this as the main loyalty card at the top of a rewards page.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```tsx
|
|
62
|
+
* <LoyaltyCard>
|
|
63
|
+
* {({ firstName, tierDisplayName, points, membershipYearStats, tierProgress }) => (
|
|
64
|
+
* <div className="loyalty-card">
|
|
65
|
+
* <h1>Welcome back, {firstName}!</h1>
|
|
66
|
+
* <div className="tier">{tierDisplayName}</div>
|
|
67
|
+
* <div className="points">{points.toLocaleString()} points</div>
|
|
68
|
+
* <div className="stats">
|
|
69
|
+
* <span>{membershipYearStats.totalStays} stays this year</span>
|
|
70
|
+
* <span>{membershipYearStats.totalNights} nights this year</span>
|
|
71
|
+
* </div>
|
|
72
|
+
* {tierProgress?.nextTier && (
|
|
73
|
+
* <div className="progress">
|
|
74
|
+
* {tierProgress.pointsToNextTier} points to next tier
|
|
75
|
+
* </div>
|
|
76
|
+
* )}
|
|
77
|
+
* </div>
|
|
78
|
+
* )}
|
|
79
|
+
* </LoyaltyCard>
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
function LoyaltyCard({ children, onBookNow, onAddStay, onReferFriend, onSetPreferences, }) {
|
|
83
|
+
const { member } = (0, AkinAuthProvider_1.useAkinAuth)();
|
|
84
|
+
const { tier, tierConfig, tierConfigs, tierProgress, points, isLoading, previousStays } = (0, AkinLoyaltyProvider_1.useAkinLoyalty)();
|
|
85
|
+
// Get membership year dates
|
|
86
|
+
const membershipYearDates = (0, react_1.useMemo)(() => getMembershipYearDates(), []);
|
|
87
|
+
// Default to TIER1 if no tier is set, and find the corresponding config
|
|
88
|
+
const effectiveTier = tier || 'TIER1';
|
|
89
|
+
const effectiveTierConfig = (0, react_1.useMemo)(() => {
|
|
90
|
+
if (tierConfig)
|
|
91
|
+
return tierConfig;
|
|
92
|
+
// Find TIER1 config as default
|
|
93
|
+
return tierConfigs.find((t) => t.tierName === 'TIER1') || null;
|
|
94
|
+
}, [tierConfig, tierConfigs]);
|
|
95
|
+
// Calculate stats from previous stays
|
|
96
|
+
const membershipYearStats = react_1.default.useMemo(() => {
|
|
97
|
+
const startOfYear = membershipYearDates.start;
|
|
98
|
+
const thisYearStays = previousStays.filter((s) => new Date(s.checkOut) >= startOfYear);
|
|
99
|
+
return {
|
|
100
|
+
points: thisYearStays.reduce((sum, s) => sum + (s.pointsEarned || 0), 0),
|
|
101
|
+
totalStays: thisYearStays.length,
|
|
102
|
+
originStays: 0, // Would need partner context to calculate
|
|
103
|
+
totalNights: thisYearStays.reduce((sum, s) => sum + s.nights, 0),
|
|
104
|
+
};
|
|
105
|
+
}, [previousStays, membershipYearDates.start]);
|
|
106
|
+
const lifetimeStats = react_1.default.useMemo(() => {
|
|
107
|
+
// Total network points = spendable + unspendable
|
|
108
|
+
const totalPoints = (member?.spendableNetworkPoints || 0) + (member?.unspendableNetworkPoints || 0);
|
|
109
|
+
return {
|
|
110
|
+
points: totalPoints,
|
|
111
|
+
totalStays: previousStays.length,
|
|
112
|
+
originStays: 0, // Would need partner context to calculate
|
|
113
|
+
totalNights: previousStays.reduce((sum, s) => sum + s.nights, 0),
|
|
114
|
+
};
|
|
115
|
+
}, [previousStays, member?.spendableNetworkPoints, member?.unspendableNetworkPoints]);
|
|
116
|
+
const props = {
|
|
117
|
+
firstName: member?.firstName || '',
|
|
118
|
+
fullName: member ? `${member.firstName} ${member.lastName}`.trim() : '',
|
|
119
|
+
loyaltyNumber: member?.loyaltyNumber || '',
|
|
120
|
+
currentTier: effectiveTier,
|
|
121
|
+
tierDisplayName: effectiveTierConfig?.displayName || null,
|
|
122
|
+
tierColor: effectiveTierConfig?.tierColor || null,
|
|
123
|
+
memberSince: member?.createdAt ? new Date(member.createdAt) : null,
|
|
124
|
+
membershipYearStart: membershipYearDates.start,
|
|
125
|
+
membershipYearEnd: membershipYearDates.end,
|
|
126
|
+
points,
|
|
127
|
+
lifetimePoints: lifetimeStats.points,
|
|
128
|
+
membershipYearStats,
|
|
129
|
+
lifetimeStats,
|
|
130
|
+
tierProgress,
|
|
131
|
+
isLoading,
|
|
132
|
+
// Action callbacks
|
|
133
|
+
onBookNow,
|
|
134
|
+
onAddStay,
|
|
135
|
+
onReferFriend,
|
|
136
|
+
onSetPreferences,
|
|
137
|
+
};
|
|
138
|
+
return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: children(props) });
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=LoyaltyCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LoyaltyCard.js","sourceRoot":"","sources":["../../../src/loyalty/components/LoyaltyCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
interface PointsDisplayRenderProps {
|
|
3
|
+
/** Current points balance */
|
|
4
|
+
points: number;
|
|
5
|
+
/** Formatted points string (e.g., "1,234") */
|
|
6
|
+
formattedPoints: string;
|
|
7
|
+
/** Whether data is loading */
|
|
8
|
+
isLoading: boolean;
|
|
9
|
+
}
|
|
10
|
+
interface PointsDisplayProps {
|
|
11
|
+
/**
|
|
12
|
+
* Render function that receives points data
|
|
13
|
+
* Use this to build your own styled points display
|
|
14
|
+
*/
|
|
15
|
+
children: (props: PointsDisplayRenderProps) => ReactNode;
|
|
16
|
+
/**
|
|
17
|
+
* Locale for number formatting
|
|
18
|
+
* @default 'en-US'
|
|
19
|
+
*/
|
|
20
|
+
locale?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Headless PointsDisplay component
|
|
24
|
+
*
|
|
25
|
+
* Provides points balance - you provide the UI.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```tsx
|
|
29
|
+
* <PointsDisplay>
|
|
30
|
+
* {({ formattedPoints, isLoading }) => (
|
|
31
|
+
* <div className="your-points">
|
|
32
|
+
* {isLoading ? 'Loading...' : `${formattedPoints} points`}
|
|
33
|
+
* </div>
|
|
34
|
+
* )}
|
|
35
|
+
* </PointsDisplay>
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export declare function PointsDisplay({ children, locale }: PointsDisplayProps): import("react/jsx-runtime").JSX.Element;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=PointsDisplay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PointsDisplay.d.ts","sourceRoot":"","sources":["../../../src/loyalty/components/PointsDisplay.tsx"],"names":[],"mappings":"AAEA,OAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG9C,UAAU,wBAAwB;IAChC,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,eAAe,EAAE,MAAM,CAAC;IACxB,8BAA8B;IAC9B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,kBAAkB;IAC1B;;;OAGG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,SAAS,CAAC;IAEzD;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAgB,EAAE,EAAE,kBAAkB,2CAU/E"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.PointsDisplay = PointsDisplay;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
const AkinLoyaltyProvider_1 = require("../AkinLoyaltyProvider");
|
|
7
|
+
/**
|
|
8
|
+
* Headless PointsDisplay component
|
|
9
|
+
*
|
|
10
|
+
* Provides points balance - you provide the UI.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```tsx
|
|
14
|
+
* <PointsDisplay>
|
|
15
|
+
* {({ formattedPoints, isLoading }) => (
|
|
16
|
+
* <div className="your-points">
|
|
17
|
+
* {isLoading ? 'Loading...' : `${formattedPoints} points`}
|
|
18
|
+
* </div>
|
|
19
|
+
* )}
|
|
20
|
+
* </PointsDisplay>
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
function PointsDisplay({ children, locale = 'en-US' }) {
|
|
24
|
+
const { points, isLoading } = (0, AkinLoyaltyProvider_1.useAkinLoyalty)();
|
|
25
|
+
const props = {
|
|
26
|
+
points,
|
|
27
|
+
formattedPoints: points.toLocaleString(locale),
|
|
28
|
+
isLoading,
|
|
29
|
+
};
|
|
30
|
+
return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: children(props) });
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=PointsDisplay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PointsDisplay.js","sourceRoot":"","sources":["../../../src/loyalty/components/PointsDisplay.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;AA4Cb,sCAUC;;AAnDD,gEAAwD;AAyBxD;;;;;;;;;;;;;;;GAeG;AACH,SAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAsB;IAC9E,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,oCAAc,GAAE,CAAC;IAE/C,MAAM,KAAK,GAA6B;QACtC,MAAM;QACN,eAAe,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC;QAC9C,SAAS;KACV,CAAC;IAEF,OAAO,2DAAG,QAAQ,CAAC,KAAK,CAAC,GAAI,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { PreviousStaysRenderProps } from '../../types/loyalty';
|
|
3
|
+
interface PreviousStaysProps {
|
|
4
|
+
/**
|
|
5
|
+
* Render function that receives previous stays data
|
|
6
|
+
* Use this to build your own styled previous stays list
|
|
7
|
+
*/
|
|
8
|
+
children: (props: PreviousStaysRenderProps) => ReactNode;
|
|
9
|
+
/**
|
|
10
|
+
* Number of stays to display initially and per page
|
|
11
|
+
* @default 10
|
|
12
|
+
*/
|
|
13
|
+
limit?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Headless PreviousStays component
|
|
17
|
+
*
|
|
18
|
+
* Provides previous stay data for display with pagination.
|
|
19
|
+
* Shows stays with past check-out dates, sorted most recent first.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```tsx
|
|
23
|
+
* <PreviousStays limit={10}>
|
|
24
|
+
* {({ stays, isEmpty, isLoading, hasMore, loadMore }) => (
|
|
25
|
+
* <div className="previous-stays">
|
|
26
|
+
* <h2>Previous Stays</h2>
|
|
27
|
+
* {isLoading && stays.length === 0 ? (
|
|
28
|
+
* <p>Loading...</p>
|
|
29
|
+
* ) : isEmpty ? (
|
|
30
|
+
* <p>No previous stays yet. Your travel history will appear here.</p>
|
|
31
|
+
* ) : (
|
|
32
|
+
* <>
|
|
33
|
+
* <ul>
|
|
34
|
+
* {stays.map((stay) => (
|
|
35
|
+
* <li key={stay.id}>
|
|
36
|
+
* <strong>{stay.propertyName}</strong>
|
|
37
|
+
* <span>{new Date(stay.checkOut).toLocaleDateString()}</span>
|
|
38
|
+
* <span>{stay.nights} nights</span>
|
|
39
|
+
* {stay.pointsEarned && (
|
|
40
|
+
* <span>+{stay.pointsEarned} points</span>
|
|
41
|
+
* )}
|
|
42
|
+
* </li>
|
|
43
|
+
* ))}
|
|
44
|
+
* </ul>
|
|
45
|
+
* {hasMore && (
|
|
46
|
+
* <button onClick={loadMore} disabled={isLoading}>
|
|
47
|
+
* {isLoading ? 'Loading...' : 'Load More'}
|
|
48
|
+
* </button>
|
|
49
|
+
* )}
|
|
50
|
+
* </>
|
|
51
|
+
* )}
|
|
52
|
+
* </div>
|
|
53
|
+
* )}
|
|
54
|
+
* </PreviousStays>
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export declare function PreviousStays({ children, limit }: PreviousStaysProps): import("react/jsx-runtime").JSX.Element;
|
|
58
|
+
export {};
|
|
59
|
+
//# sourceMappingURL=PreviousStays.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreviousStays.d.ts","sourceRoot":"","sources":["../../../src/loyalty/components/PreviousStays.tsx"],"names":[],"mappings":"AAEA,OAAc,EAAyB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAErE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAEpE,UAAU,kBAAkB;IAC1B;;;OAGG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,SAAS,CAAC;IAEzD;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,KAAU,EAAE,EAAE,kBAAkB,2CAqBzE"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.PreviousStays = PreviousStays;
|
|
38
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
39
|
+
const react_1 = __importStar(require("react"));
|
|
40
|
+
const AkinLoyaltyProvider_1 = require("../AkinLoyaltyProvider");
|
|
41
|
+
/**
|
|
42
|
+
* Headless PreviousStays component
|
|
43
|
+
*
|
|
44
|
+
* Provides previous stay data for display with pagination.
|
|
45
|
+
* Shows stays with past check-out dates, sorted most recent first.
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```tsx
|
|
49
|
+
* <PreviousStays limit={10}>
|
|
50
|
+
* {({ stays, isEmpty, isLoading, hasMore, loadMore }) => (
|
|
51
|
+
* <div className="previous-stays">
|
|
52
|
+
* <h2>Previous Stays</h2>
|
|
53
|
+
* {isLoading && stays.length === 0 ? (
|
|
54
|
+
* <p>Loading...</p>
|
|
55
|
+
* ) : isEmpty ? (
|
|
56
|
+
* <p>No previous stays yet. Your travel history will appear here.</p>
|
|
57
|
+
* ) : (
|
|
58
|
+
* <>
|
|
59
|
+
* <ul>
|
|
60
|
+
* {stays.map((stay) => (
|
|
61
|
+
* <li key={stay.id}>
|
|
62
|
+
* <strong>{stay.propertyName}</strong>
|
|
63
|
+
* <span>{new Date(stay.checkOut).toLocaleDateString()}</span>
|
|
64
|
+
* <span>{stay.nights} nights</span>
|
|
65
|
+
* {stay.pointsEarned && (
|
|
66
|
+
* <span>+{stay.pointsEarned} points</span>
|
|
67
|
+
* )}
|
|
68
|
+
* </li>
|
|
69
|
+
* ))}
|
|
70
|
+
* </ul>
|
|
71
|
+
* {hasMore && (
|
|
72
|
+
* <button onClick={loadMore} disabled={isLoading}>
|
|
73
|
+
* {isLoading ? 'Loading...' : 'Load More'}
|
|
74
|
+
* </button>
|
|
75
|
+
* )}
|
|
76
|
+
* </>
|
|
77
|
+
* )}
|
|
78
|
+
* </div>
|
|
79
|
+
* )}
|
|
80
|
+
* </PreviousStays>
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
function PreviousStays({ children, limit = 10 }) {
|
|
84
|
+
const { previousStays, isLoading: contextLoading } = (0, AkinLoyaltyProvider_1.useAkinLoyalty)();
|
|
85
|
+
const [displayCount, setDisplayCount] = (0, react_1.useState)(limit);
|
|
86
|
+
const displayedStays = react_1.default.useMemo(() => {
|
|
87
|
+
return previousStays.slice(0, displayCount);
|
|
88
|
+
}, [previousStays, displayCount]);
|
|
89
|
+
const loadMore = (0, react_1.useCallback)(() => {
|
|
90
|
+
setDisplayCount((prev) => prev + limit);
|
|
91
|
+
}, [limit]);
|
|
92
|
+
const props = {
|
|
93
|
+
stays: displayedStays,
|
|
94
|
+
isLoading: contextLoading,
|
|
95
|
+
hasMore: previousStays.length > displayCount,
|
|
96
|
+
loadMore,
|
|
97
|
+
isEmpty: previousStays.length === 0,
|
|
98
|
+
};
|
|
99
|
+
return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: children(props) });
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=PreviousStays.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreviousStays.js","sourceRoot":"","sources":["../../../src/loyalty/components/PreviousStays.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8Db,sCAqBC;;AAjFD,+CAAqE;AACrE,gEAAwD;AAiBxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,SAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,KAAK,GAAG,EAAE,EAAsB;IACxE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,IAAA,oCAAc,GAAE,CAAC;IACtE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IAExD,MAAM,cAAc,GAAG,eAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACxC,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAC9C,CAAC,EAAE,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC;IAElC,MAAM,QAAQ,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE;QAChC,eAAe,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IAC1C,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,KAAK,GAA6B;QACtC,KAAK,EAAE,cAAc;QACrB,SAAS,EAAE,cAAc;QACzB,OAAO,EAAE,aAAa,CAAC,MAAM,GAAG,YAAY;QAC5C,QAAQ;QACR,OAAO,EAAE,aAAa,CAAC,MAAM,KAAK,CAAC;KACpC,CAAC;IAEF,OAAO,2DAAG,QAAQ,CAAC,KAAK,CAAC,GAAI,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { SimpleTierCardsRenderProps } from '../../types/loyalty';
|
|
3
|
+
interface SimpleTierCardsProps {
|
|
4
|
+
/**
|
|
5
|
+
* Partner name for dynamic labels (e.g., "Haka stays")
|
|
6
|
+
* @default 'Origin'
|
|
7
|
+
*/
|
|
8
|
+
partnerName?: string;
|
|
9
|
+
/**
|
|
10
|
+
* Render function that receives tier card data
|
|
11
|
+
* Use this to build your own styled tier cards
|
|
12
|
+
*/
|
|
13
|
+
children: (props: SimpleTierCardsRenderProps) => ReactNode;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Headless SimpleTierCards component
|
|
17
|
+
*
|
|
18
|
+
* Provides tier card data for building custom tier card displays.
|
|
19
|
+
* You provide the UI, we provide the data and utilities.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```tsx
|
|
23
|
+
* <SimpleTierCards partnerName="Haka">
|
|
24
|
+
* {({ tierConfigs, formatRequirement, getTextColor }) => (
|
|
25
|
+
* <div className="grid grid-cols-4 gap-4">
|
|
26
|
+
* {tierConfigs.map((tier, index) => (
|
|
27
|
+
* <div
|
|
28
|
+
* key={tier.id}
|
|
29
|
+
* style={{
|
|
30
|
+
* backgroundColor: tier.tierColor || '#382108',
|
|
31
|
+
* color: getTextColor(tier.tierColor || '#382108'),
|
|
32
|
+
* }}
|
|
33
|
+
* className="p-4 rounded-lg"
|
|
34
|
+
* >
|
|
35
|
+
* <h3 className="text-2xl font-bold">{tier.displayName}</h3>
|
|
36
|
+
* <span className="text-sm">Tier {index + 1}</span>
|
|
37
|
+
* {tier.requirements?.filter(r => r.active).map(req => (
|
|
38
|
+
* <p key={req.id} className="text-xs opacity-80">
|
|
39
|
+
* {formatRequirement(req)}
|
|
40
|
+
* </p>
|
|
41
|
+
* ))}
|
|
42
|
+
* </div>
|
|
43
|
+
* ))}
|
|
44
|
+
* </div>
|
|
45
|
+
* )}
|
|
46
|
+
* </SimpleTierCards>
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export declare function SimpleTierCards({ partnerName, children }: SimpleTierCardsProps): import("react/jsx-runtime").JSX.Element;
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=SimpleTierCards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SimpleTierCards.d.ts","sourceRoot":"","sources":["../../../src/loyalty/components/SimpleTierCards.tsx"],"names":[],"mappings":"AAEA,OAAc,EAAW,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvD,OAAO,KAAK,EAAmB,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAEvF,UAAU,oBAAoB;IAC5B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,SAAS,CAAC;CAC5D;AAsBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,eAAe,CAAC,EAAE,WAAsB,EAAE,QAAQ,EAAE,EAAE,oBAAoB,2CA6CzF"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.SimpleTierCards = SimpleTierCards;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
const react_1 = require("react");
|
|
7
|
+
const AkinLoyaltyProvider_1 = require("../AkinLoyaltyProvider");
|
|
8
|
+
const tierLabels_1 = require("../../utils/tierLabels");
|
|
9
|
+
/**
|
|
10
|
+
* Get a contrasting text color (black or white) based on background luminance
|
|
11
|
+
*/
|
|
12
|
+
function getContrastingTextColor(bgColor) {
|
|
13
|
+
// Handle empty or invalid colors
|
|
14
|
+
if (!bgColor || !bgColor.startsWith('#')) {
|
|
15
|
+
return '#FFFFFF';
|
|
16
|
+
}
|
|
17
|
+
const hex = bgColor.replace('#', '');
|
|
18
|
+
const r = parseInt(hex.substr(0, 2), 16);
|
|
19
|
+
const g = parseInt(hex.substr(2, 2), 16);
|
|
20
|
+
const b = parseInt(hex.substr(4, 2), 16);
|
|
21
|
+
// Calculate relative luminance
|
|
22
|
+
const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;
|
|
23
|
+
return luminance > 0.5 ? '#000000' : '#FFFFFF';
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Headless SimpleTierCards component
|
|
27
|
+
*
|
|
28
|
+
* Provides tier card data for building custom tier card displays.
|
|
29
|
+
* You provide the UI, we provide the data and utilities.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```tsx
|
|
33
|
+
* <SimpleTierCards partnerName="Haka">
|
|
34
|
+
* {({ tierConfigs, formatRequirement, getTextColor }) => (
|
|
35
|
+
* <div className="grid grid-cols-4 gap-4">
|
|
36
|
+
* {tierConfigs.map((tier, index) => (
|
|
37
|
+
* <div
|
|
38
|
+
* key={tier.id}
|
|
39
|
+
* style={{
|
|
40
|
+
* backgroundColor: tier.tierColor || '#382108',
|
|
41
|
+
* color: getTextColor(tier.tierColor || '#382108'),
|
|
42
|
+
* }}
|
|
43
|
+
* className="p-4 rounded-lg"
|
|
44
|
+
* >
|
|
45
|
+
* <h3 className="text-2xl font-bold">{tier.displayName}</h3>
|
|
46
|
+
* <span className="text-sm">Tier {index + 1}</span>
|
|
47
|
+
* {tier.requirements?.filter(r => r.active).map(req => (
|
|
48
|
+
* <p key={req.id} className="text-xs opacity-80">
|
|
49
|
+
* {formatRequirement(req)}
|
|
50
|
+
* </p>
|
|
51
|
+
* ))}
|
|
52
|
+
* </div>
|
|
53
|
+
* ))}
|
|
54
|
+
* </div>
|
|
55
|
+
* )}
|
|
56
|
+
* </SimpleTierCards>
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
function SimpleTierCards({ partnerName = 'Origin', children }) {
|
|
60
|
+
const { tierConfigs, isLoading } = (0, AkinLoyaltyProvider_1.useAkinLoyalty)();
|
|
61
|
+
// Sort tiers by display order
|
|
62
|
+
const sortedTiers = (0, react_1.useMemo)(() => [...tierConfigs].sort((a, b) => a.displayOrder - b.displayOrder), [tierConfigs]);
|
|
63
|
+
/**
|
|
64
|
+
* Format a requirement for display (e.g., "10+ Origin stays")
|
|
65
|
+
*/
|
|
66
|
+
const formatRequirement = (req) => {
|
|
67
|
+
const label = (0, tierLabels_1.getLabel)(req.requirementKey, partnerName, req.displayName);
|
|
68
|
+
const value = req.requirementValue;
|
|
69
|
+
// Achievement-type requirements just show the label (e.g., "By invitation")
|
|
70
|
+
if (req.requirementKey.startsWith('achievement_')) {
|
|
71
|
+
return label;
|
|
72
|
+
}
|
|
73
|
+
// Format based on operator
|
|
74
|
+
switch (req.operator) {
|
|
75
|
+
case 'gte':
|
|
76
|
+
return `${value}+ ${label}`;
|
|
77
|
+
case 'gt':
|
|
78
|
+
return `>${value} ${label}`;
|
|
79
|
+
case 'lte':
|
|
80
|
+
return `≤${value} ${label}`;
|
|
81
|
+
case 'lt':
|
|
82
|
+
return `<${value} ${label}`;
|
|
83
|
+
case 'eq':
|
|
84
|
+
default:
|
|
85
|
+
return `${value} ${label}`;
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
const props = {
|
|
89
|
+
tierConfigs: sortedTiers,
|
|
90
|
+
formatRequirement,
|
|
91
|
+
getTextColor: getContrastingTextColor,
|
|
92
|
+
isLoading,
|
|
93
|
+
};
|
|
94
|
+
return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: children(props) });
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=SimpleTierCards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SimpleTierCards.js","sourceRoot":"","sources":["../../../src/loyalty/components/SimpleTierCards.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;AA0Eb,0CA6CC;;AArHD,iCAAuD;AACvD,gEAAwD;AACxD,uDAAkD;AAgBlD;;GAEG;AACH,SAAS,uBAAuB,CAAC,OAAe;IAC9C,iCAAiC;IACjC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEzC,+BAA+B;IAC/B,MAAM,SAAS,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;IAE5D,OAAO,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACjD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,SAAgB,eAAe,CAAC,EAAE,WAAW,GAAG,QAAQ,EAAE,QAAQ,EAAwB;IACxF,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,IAAA,oCAAc,GAAE,CAAC;IAEpD,8BAA8B;IAC9B,MAAM,WAAW,GAAG,IAAA,eAAO,EACzB,GAAG,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,EACtE,CAAC,WAAW,CAAC,CACd,CAAC;IAEF;;OAEG;IACH,MAAM,iBAAiB,GAAG,CAAC,GAAoB,EAAU,EAAE;QACzD,MAAM,KAAK,GAAG,IAAA,qBAAQ,EAAC,GAAG,CAAC,cAAc,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG,GAAG,CAAC,gBAAgB,CAAC;QAEnC,4EAA4E;QAC5E,IAAI,GAAG,CAAC,cAAc,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YAClD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,2BAA2B;QAC3B,QAAQ,GAAG,CAAC,QAAQ,EAAE,CAAC;YACrB,KAAK,KAAK;gBACR,OAAO,GAAG,KAAK,KAAK,KAAK,EAAE,CAAC;YAC9B,KAAK,IAAI;gBACP,OAAO,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;YAC9B,KAAK,KAAK;gBACR,OAAO,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;YAC9B,KAAK,IAAI;gBACP,OAAO,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;YAC9B,KAAK,IAAI,CAAC;YACV;gBACE,OAAO,GAAG,KAAK,IAAI,KAAK,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,KAAK,GAA+B;QACxC,WAAW,EAAE,WAAW;QACxB,iBAAiB;QACjB,YAAY,EAAE,uBAAuB;QACrC,SAAS;KACV,CAAC;IAEF,OAAO,2DAAG,QAAQ,CAAC,KAAK,CAAC,GAAI,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { TierCardRenderProps } from '../../types/loyalty';
|
|
3
|
+
interface TierCardProps {
|
|
4
|
+
/**
|
|
5
|
+
* Render function that receives tier data
|
|
6
|
+
* Use this to build your own styled tier card
|
|
7
|
+
*/
|
|
8
|
+
children: (props: TierCardRenderProps) => ReactNode;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Headless TierCard component
|
|
12
|
+
*
|
|
13
|
+
* Provides tier data for display - you provide the UI.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```tsx
|
|
17
|
+
* <TierCard>
|
|
18
|
+
* {({ tier, displayName, color, points, loyaltyNumber }) => (
|
|
19
|
+
* <div style={{ backgroundColor: color }} className="your-tier-card">
|
|
20
|
+
* <h2>{displayName}</h2>
|
|
21
|
+
* <p>{points.toLocaleString()} points</p>
|
|
22
|
+
* <span>#{loyaltyNumber}</span>
|
|
23
|
+
* </div>
|
|
24
|
+
* )}
|
|
25
|
+
* </TierCard>
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function TierCard({ children }: TierCardProps): import("react/jsx-runtime").JSX.Element;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=TierCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TierCard.d.ts","sourceRoot":"","sources":["../../../src/loyalty/components/TierCard.tsx"],"names":[],"mappings":"AAEA,OAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,UAAU,aAAa;IACrB;;;OAGG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,SAAS,CAAC;CACrD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE,aAAa,2CAgBnD"}
|