@owlmeans/web-payment 0.1.18-rc.2 → 0.1.18-rc.21
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 +30 -1
- package/agent-meta/manifest.json +2 -2
- package/agent-meta/skills/web-payment/SKILL.md +287 -20
- package/build/@/components/ui/card.d.ts +10 -0
- package/build/@/components/ui/card.d.ts.map +1 -0
- package/build/@/components/ui/card.js +25 -0
- package/build/@/components/ui/card.js.map +1 -0
- package/build/@/components/ui/checkbox.d.ts +5 -0
- package/build/@/components/ui/checkbox.d.ts.map +1 -0
- package/build/@/components/ui/checkbox.js +6 -0
- package/build/@/components/ui/checkbox.js.map +1 -0
- package/build/@/components/ui/progress.d.ts +5 -0
- package/build/@/components/ui/progress.d.ts.map +1 -0
- package/build/@/components/ui/progress.js +11 -0
- package/build/@/components/ui/progress.js.map +1 -0
- package/build/@/components/ui/select.d.ts +8 -0
- package/build/@/components/ui/select.d.ts.map +1 -0
- package/build/@/components/ui/select.js +9 -0
- package/build/@/components/ui/select.js.map +1 -0
- package/build/capability-list.d.ts +7 -0
- package/build/capability-list.d.ts.map +1 -0
- package/build/capability-list.js +24 -0
- package/build/capability-list.js.map +1 -0
- package/build/checkout-limit.d.ts +11 -0
- package/build/checkout-limit.d.ts.map +1 -0
- package/build/checkout-limit.js +34 -0
- package/build/checkout-limit.js.map +1 -0
- package/build/consumer/cancellation.d.ts +20 -0
- package/build/consumer/cancellation.d.ts.map +1 -0
- package/build/consumer/cancellation.js +115 -0
- package/build/consumer/cancellation.js.map +1 -0
- package/build/consumer/copy.d.ts +23 -0
- package/build/consumer/copy.d.ts.map +1 -0
- package/build/consumer/copy.js +75 -0
- package/build/consumer/copy.js.map +1 -0
- package/build/consumer/ensure.d.ts +56 -0
- package/build/consumer/ensure.d.ts.map +1 -0
- package/build/consumer/ensure.js +71 -0
- package/build/consumer/ensure.js.map +1 -0
- package/build/consumer/fields.d.ts +43 -0
- package/build/consumer/fields.d.ts.map +1 -0
- package/build/consumer/fields.js +19 -0
- package/build/consumer/fields.js.map +1 -0
- package/build/consumer/hooks.d.ts +113 -0
- package/build/consumer/hooks.d.ts.map +1 -0
- package/build/consumer/hooks.js +225 -0
- package/build/consumer/hooks.js.map +1 -0
- package/build/consumer/index.d.ts +14 -0
- package/build/consumer/index.d.ts.map +1 -0
- package/build/consumer/index.js +12 -0
- package/build/consumer/index.js.map +1 -0
- package/build/consumer/legal.d.ts +53 -0
- package/build/consumer/legal.d.ts.map +1 -0
- package/build/consumer/legal.js +77 -0
- package/build/consumer/legal.js.map +1 -0
- package/build/consumer/performance-consent-dialog.d.ts +18 -0
- package/build/consumer/performance-consent-dialog.d.ts.map +1 -0
- package/build/consumer/performance-consent-dialog.js +71 -0
- package/build/consumer/performance-consent-dialog.js.map +1 -0
- package/build/consumer/provider.d.ts +33 -0
- package/build/consumer/provider.d.ts.map +1 -0
- package/build/consumer/provider.js +26 -0
- package/build/consumer/provider.js.map +1 -0
- package/build/consumer/refusal.d.ts +35 -0
- package/build/consumer/refusal.d.ts.map +1 -0
- package/build/consumer/refusal.js +98 -0
- package/build/consumer/refusal.js.map +1 -0
- package/build/consumer/subscription-start-dialog.d.ts +16 -0
- package/build/consumer/subscription-start-dialog.d.ts.map +1 -0
- package/build/consumer/subscription-start-dialog.js +43 -0
- package/build/consumer/subscription-start-dialog.js.map +1 -0
- package/build/consumer/types.d.ts +114 -0
- package/build/consumer/types.d.ts.map +1 -0
- package/build/consumer/types.js +2 -0
- package/build/consumer/types.js.map +1 -0
- package/build/consumer/withdrawal.d.ts +29 -0
- package/build/consumer/withdrawal.d.ts.map +1 -0
- package/build/consumer/withdrawal.js +140 -0
- package/build/consumer/withdrawal.js.map +1 -0
- package/build/copy.d.ts +14 -0
- package/build/copy.d.ts.map +1 -0
- package/build/copy.js +51 -0
- package/build/copy.js.map +1 -0
- package/build/dialog.d.ts +1 -1
- package/build/dialog.d.ts.map +1 -1
- package/build/dialog.js +46 -17
- package/build/dialog.js.map +1 -1
- package/build/entitlement.d.ts +26 -0
- package/build/entitlement.d.ts.map +1 -0
- package/build/entitlement.js +42 -0
- package/build/entitlement.js.map +1 -0
- package/build/estimate-cache.d.ts +14 -0
- package/build/estimate-cache.d.ts.map +1 -0
- package/build/estimate-cache.js +39 -0
- package/build/estimate-cache.js.map +1 -0
- package/build/estimate-summary.d.ts +64 -0
- package/build/estimate-summary.d.ts.map +1 -0
- package/build/estimate-summary.js +94 -0
- package/build/estimate-summary.js.map +1 -0
- package/build/estimate.d.ts +34 -0
- package/build/estimate.d.ts.map +1 -0
- package/build/estimate.js +92 -0
- package/build/estimate.js.map +1 -0
- package/build/format.d.ts +15 -0
- package/build/format.d.ts.map +1 -0
- package/build/format.js +68 -0
- package/build/format.js.map +1 -0
- package/build/hooks.d.ts +0 -4
- package/build/hooks.d.ts.map +1 -1
- package/build/hooks.js +3 -30
- package/build/hooks.js.map +1 -1
- package/build/i18n/be.json +1 -1
- package/build/i18n/de.json +1 -1
- package/build/i18n/en.json +1 -1
- package/build/i18n/es.json +1 -1
- package/build/i18n/fr.json +145 -0
- package/build/i18n/pl.json +1 -1
- package/build/i18n/ru.json +1 -1
- package/build/i18n/uk.json +1 -1
- package/build/i18n.d.ts +2 -1
- package/build/i18n.d.ts.map +1 -1
- package/build/i18n.js +11 -7
- package/build/i18n.js.map +1 -1
- package/build/index.d.ts +9 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +9 -0
- package/build/index.js.map +1 -1
- package/build/limit-meter.d.ts +7 -0
- package/build/limit-meter.d.ts.map +1 -0
- package/build/limit-meter.js +26 -0
- package/build/limit-meter.js.map +1 -0
- package/build/plan-card.d.ts +7 -0
- package/build/plan-card.d.ts.map +1 -0
- package/build/plan-card.js +29 -0
- package/build/plan-card.js.map +1 -0
- package/build/poll.d.ts +7 -0
- package/build/poll.d.ts.map +1 -0
- package/build/poll.js +28 -0
- package/build/poll.js.map +1 -0
- package/build/selectors.d.ts +18 -0
- package/build/selectors.d.ts.map +1 -0
- package/build/selectors.js +78 -0
- package/build/selectors.js.map +1 -0
- package/build/types.d.ts +120 -2
- package/build/types.d.ts.map +1 -1
- package/package.json +22 -7
- package/src/@/components/ui/card.tsx +93 -0
- package/src/@/components/ui/checkbox.tsx +23 -0
- package/src/@/components/ui/progress.tsx +44 -0
- package/src/@/components/ui/select.tsx +62 -0
- package/src/@/globals.css +10 -0
- package/src/capability-list.tsx +50 -0
- package/src/checkout-limit.tsx +48 -0
- package/src/consumer/cancellation.tsx +214 -0
- package/src/consumer/copy.ts +93 -0
- package/src/consumer/ensure.ts +124 -0
- package/src/consumer/fields.tsx +89 -0
- package/src/consumer/hooks.ts +358 -0
- package/src/consumer/index.ts +13 -0
- package/src/consumer/legal.tsx +129 -0
- package/src/consumer/performance-consent-dialog.tsx +132 -0
- package/src/consumer/provider.tsx +49 -0
- package/src/consumer/refusal.ts +110 -0
- package/src/consumer/subscription-start-dialog.tsx +87 -0
- package/src/consumer/types.ts +121 -0
- package/src/consumer/withdrawal.tsx +279 -0
- package/src/copy.tsx +62 -0
- package/src/dialog.tsx +58 -25
- package/src/entitlement.ts +56 -0
- package/src/estimate-cache.ts +40 -0
- package/src/estimate-summary.tsx +172 -0
- package/src/estimate.ts +119 -0
- package/src/format.ts +71 -0
- package/src/hooks.ts +3 -35
- package/src/i18n/be.json +1 -1
- package/src/i18n/de.json +1 -1
- package/src/i18n/en.json +1 -1
- package/src/i18n/es.json +1 -1
- package/src/i18n/fr.json +145 -0
- package/src/i18n/pl.json +1 -1
- package/src/i18n/ru.json +1 -1
- package/src/i18n/uk.json +1 -1
- package/src/i18n.ts +12 -7
- package/src/index.ts +9 -0
- package/src/limit-meter.tsx +55 -0
- package/src/plan-card.tsx +67 -0
- package/src/poll.ts +27 -0
- package/src/selectors.ts +93 -0
- package/src/types.ts +142 -2
- package/tests/consent-refusal.spec.ts +83 -0
- package/tests/consumer-hooks.spec.ts +205 -0
- package/tests/consumer.spec.ts +343 -0
- package/tests/context.ts +9 -0
- package/tests/dialog.spec.ts +49 -0
- package/tests/entitlement.spec.ts +117 -0
- package/tests/estimate-cache.spec.ts +46 -0
- package/tests/harness/consumer-fixtures.ts +105 -0
- package/tests/harness/consumer.tsx +197 -0
- package/tests/harness/entitlement.tsx +159 -0
- package/tests/harness/estimate-fixtures.ts +48 -0
- package/tests/harness/mount.tsx +19 -3
- package/tests/i18n.spec.ts +78 -8
- package/tests/pieces.spec.ts +134 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { RegisteredEntrypoint, RequestShape } from '@owlmeans/entrypoint';
|
|
3
|
+
import type { CancellationBody, DeclarationReceipt, PerformanceConsentBody, PerformanceConsentResponse, PerformanceConsentView, SubscriptionStartBody, SubscriptionStartQuery, SubscriptionStartResponse, SubscriptionStartView, WithdrawalBody, WithdrawalCandidateList } from '@owlmeans/payment';
|
|
4
|
+
import { type EnsureOptions } from './ensure.js';
|
|
5
|
+
import type { LegalLinksSource, PerformanceConsentDialogProps, SubscriptionStartDialogProps } from './types.js';
|
|
6
|
+
/** A protocol whose request carries `body`: the record, withdraw and cancel routes. */
|
|
7
|
+
type BodyRequest<Body> = RequestShape & {
|
|
8
|
+
body: Body;
|
|
9
|
+
};
|
|
10
|
+
export interface UsePerformanceConsentOptions {
|
|
11
|
+
/** Read the view on mount, so `required` is known before anything asks. Default `false`. */
|
|
12
|
+
enabled?: boolean;
|
|
13
|
+
uiLanguage?: string;
|
|
14
|
+
links?: LegalLinksSource;
|
|
15
|
+
/** Open the withdrawal function; the consent dialog closes (declined) first. */
|
|
16
|
+
onWithdraw?: () => void;
|
|
17
|
+
/** After the consent was recorded — refresh an account feed, say. */
|
|
18
|
+
onRecorded?: (response: PerformanceConsentResponse) => void;
|
|
19
|
+
}
|
|
20
|
+
export interface PerformanceConsentControl {
|
|
21
|
+
view: PerformanceConsentView | null;
|
|
22
|
+
/** From the last read; `null` before any. */
|
|
23
|
+
required: boolean | null;
|
|
24
|
+
/**
|
|
25
|
+
* `true` when no consent is needed or it was confirmed and recorded, `false` on a decline or a
|
|
26
|
+
* closed dialog. Reads the view fresh; a failed read answers `true`. Concurrent calls share one
|
|
27
|
+
* pending answer — one dialog.
|
|
28
|
+
*/
|
|
29
|
+
ensure: (opts?: EnsureOptions) => Promise<boolean>;
|
|
30
|
+
refresh: () => Promise<PerformanceConsentView | null>;
|
|
31
|
+
/** Spread into ONE `PerformanceConsentDialog`. */
|
|
32
|
+
dialog: PerformanceConsentDialogProps;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* The spend consent over two protocols — the view (`consent` GET) and the record (`giveConsent`
|
|
36
|
+
* POST) of `makeConsumerRightsProtocols` — bound with `ctx.entrypoint(protocol)`.
|
|
37
|
+
*/
|
|
38
|
+
export declare const usePerformanceConsent: <RecordRequest extends BodyRequest<PerformanceConsentBody>>(view: RegisteredEntrypoint<{}, PerformanceConsentView>, record: RegisteredEntrypoint<RecordRequest, PerformanceConsentResponse>, opts?: UsePerformanceConsentOptions) => PerformanceConsentControl;
|
|
39
|
+
export interface UseSubscriptionStartOptions {
|
|
40
|
+
uiLanguage?: string;
|
|
41
|
+
links?: LegalLinksSource;
|
|
42
|
+
onWithdraw?: () => void;
|
|
43
|
+
}
|
|
44
|
+
export interface SubscriptionStartParams {
|
|
45
|
+
/** The plan's title as the application names it — part of the statement. */
|
|
46
|
+
planTitle: string;
|
|
47
|
+
/** The price line the dialog shows above the statement. */
|
|
48
|
+
price?: ReactNode;
|
|
49
|
+
}
|
|
50
|
+
export interface SubscriptionStartControl {
|
|
51
|
+
/**
|
|
52
|
+
* The start request id to send with the subscription checkout (`CreateCheckoutBody.
|
|
53
|
+
* startRequestId`); `''` when none is needed (or the view could not be read — the checkout's
|
|
54
|
+
* own refusal then decides); `null` when the person declined or closed the dialog.
|
|
55
|
+
*/
|
|
56
|
+
ensure: (planSku: string, params: SubscriptionStartParams) => Promise<string | null>;
|
|
57
|
+
view: SubscriptionStartView | null;
|
|
58
|
+
/** Spread into ONE `SubscriptionStartDialog`. */
|
|
59
|
+
dialog: SubscriptionStartDialogProps;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* The subscription start request over the `start` GET (`?planSku`) and `requestStart` POST
|
|
63
|
+
* protocols, asked right before a subscription checkout.
|
|
64
|
+
*/
|
|
65
|
+
export declare const useSubscriptionStart: <ViewRequest extends RequestShape & {
|
|
66
|
+
query: SubscriptionStartQuery;
|
|
67
|
+
}, RecordRequest extends BodyRequest<SubscriptionStartBody>>(view: RegisteredEntrypoint<ViewRequest, SubscriptionStartView>, record: RegisteredEntrypoint<RecordRequest, SubscriptionStartResponse>, opts?: UseSubscriptionStartOptions) => SubscriptionStartControl;
|
|
68
|
+
export interface DeclarationControl<Body, Receipt> {
|
|
69
|
+
/** Send the declaration; the revived receipt, or `null` when it failed (`error` holds why). */
|
|
70
|
+
submit: (body: Body) => Promise<Receipt | null>;
|
|
71
|
+
receipt: Receipt | null;
|
|
72
|
+
pending: boolean;
|
|
73
|
+
error: unknown;
|
|
74
|
+
/** Forget the receipt and the error — before the form is shown again. */
|
|
75
|
+
reset: () => void;
|
|
76
|
+
}
|
|
77
|
+
export interface WithdrawalControl<Receipt extends DeclarationReceipt> extends DeclarationControl<WithdrawalBody, Receipt> {
|
|
78
|
+
/** In-app: the contracts that can still be withdrawn from; `null` before the first read. */
|
|
79
|
+
list: WithdrawalCandidateList | null;
|
|
80
|
+
load: () => Promise<WithdrawalCandidateList | null>;
|
|
81
|
+
/** Spread into a `WithdrawalForm` / `WithdrawalDialog` (with `mode` and `language`). */
|
|
82
|
+
form: {
|
|
83
|
+
list: WithdrawalCandidateList | null;
|
|
84
|
+
pending: boolean;
|
|
85
|
+
error: boolean;
|
|
86
|
+
receipt: Receipt | null;
|
|
87
|
+
onSubmit: (body: WithdrawalBody) => Promise<Receipt | null>;
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* The withdrawal function over the `withdrawals` GET (in-app; `null` on the public page) and a
|
|
92
|
+
* `withdraw` POST — the account one answers a `WithdrawalReceipt`, the public one a
|
|
93
|
+
* `DeclarationReceipt`.
|
|
94
|
+
*/
|
|
95
|
+
export declare const useWithdrawal: <Request extends BodyRequest<WithdrawalBody>, Receipt extends DeclarationReceipt>(list: RegisteredEntrypoint<{}, WithdrawalCandidateList> | null, withdraw: RegisteredEntrypoint<Request, Receipt>, opts?: {
|
|
96
|
+
enabled?: boolean;
|
|
97
|
+
}) => WithdrawalControl<Receipt>;
|
|
98
|
+
export interface CancellationControl<Receipt extends DeclarationReceipt> extends DeclarationControl<CancellationBody, Receipt> {
|
|
99
|
+
/** Spread into a `CancellationForm` (with `mode` and `language`). */
|
|
100
|
+
form: {
|
|
101
|
+
pending: boolean;
|
|
102
|
+
error: boolean;
|
|
103
|
+
receipt: Receipt | null;
|
|
104
|
+
onSubmit: (body: CancellationBody) => Promise<Receipt | null>;
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* The cancellation function over a `cancel` POST — the account one answers a
|
|
109
|
+
* `CancellationReceipt`, the public one a `DeclarationReceipt`.
|
|
110
|
+
*/
|
|
111
|
+
export declare const useCancellation: <Request extends BodyRequest<CancellationBody>, Receipt extends DeclarationReceipt>(cancel: RegisteredEntrypoint<Request, Receipt>) => CancellationControl<Receipt>;
|
|
112
|
+
export {};
|
|
113
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/consumer/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
2
|
+
import { reviveConsentResponse, reviveConsentView, reviveReceipt, reviveStartResponse, reviveWithdrawalList, } from '@owlmeans/payment';
|
|
3
|
+
import { makeAsker } from './ensure.js';
|
|
4
|
+
import { isConsentRefusal } from './refusal.js';
|
|
5
|
+
/** One call argument built by the hook — the protocol's own `CallArguments`, completed here. */
|
|
6
|
+
const argsOf = (request) => [request];
|
|
7
|
+
/**
|
|
8
|
+
* The spend consent over two protocols — the view (`consent` GET) and the record (`giveConsent`
|
|
9
|
+
* POST) of `makeConsumerRightsProtocols` — bound with `ctx.entrypoint(protocol)`.
|
|
10
|
+
*/
|
|
11
|
+
export const usePerformanceConsent = (view, record, opts = {}) => {
|
|
12
|
+
const viewRef = useRef(view);
|
|
13
|
+
viewRef.current = view;
|
|
14
|
+
const recordRef = useRef(record);
|
|
15
|
+
recordRef.current = record;
|
|
16
|
+
const optsRef = useRef(opts);
|
|
17
|
+
optsRef.current = opts;
|
|
18
|
+
const [current, setCurrent] = useState(null);
|
|
19
|
+
const [open, setOpen] = useState(false);
|
|
20
|
+
const [pending, setPending] = useState(false);
|
|
21
|
+
const [error, setError] = useState(false);
|
|
22
|
+
const load = useCallback(async () => {
|
|
23
|
+
const next = reviveConsentView(await viewRef.current.call());
|
|
24
|
+
setCurrent(next);
|
|
25
|
+
return next;
|
|
26
|
+
}, []);
|
|
27
|
+
const asker = useMemo(() => makeAsker({
|
|
28
|
+
load, required: next => next.required, skip: true,
|
|
29
|
+
show: () => { setError(false); setOpen(true); },
|
|
30
|
+
}), [load]);
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
if (opts.enabled === true)
|
|
33
|
+
void load().catch(() => undefined);
|
|
34
|
+
}, [opts.enabled, load]);
|
|
35
|
+
const decline = useCallback(() => {
|
|
36
|
+
setOpen(false);
|
|
37
|
+
asker.settle(false);
|
|
38
|
+
}, [asker]);
|
|
39
|
+
const onConfirm = useCallback(async (body) => {
|
|
40
|
+
setPending(true);
|
|
41
|
+
setError(false);
|
|
42
|
+
try {
|
|
43
|
+
const response = reviveConsentResponse(await recordRef.current.call(...argsOf({ body })));
|
|
44
|
+
setCurrent(held => held == null ? held : { ...held, required: false, purchases: [] });
|
|
45
|
+
setOpen(false);
|
|
46
|
+
asker.settle(true);
|
|
47
|
+
optsRef.current.onRecorded?.(response);
|
|
48
|
+
}
|
|
49
|
+
catch (e) {
|
|
50
|
+
setError(true);
|
|
51
|
+
// A stale text version is refused with a 428: show the current wording to confirm again.
|
|
52
|
+
if (isConsentRefusal(e))
|
|
53
|
+
void load().catch(() => undefined);
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
setPending(false);
|
|
57
|
+
}
|
|
58
|
+
}, [asker, load]);
|
|
59
|
+
const refresh = useCallback(async () => {
|
|
60
|
+
try {
|
|
61
|
+
return await load();
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}, [load]);
|
|
67
|
+
const ensure = useCallback(async () => await asker.ask(), [asker]);
|
|
68
|
+
const onWithdraw = opts.onWithdraw;
|
|
69
|
+
const dialog = {
|
|
70
|
+
open, view: current, pending, error, onConfirm, onDecline: decline,
|
|
71
|
+
onOpenChange: next => { if (next)
|
|
72
|
+
setOpen(true);
|
|
73
|
+
else
|
|
74
|
+
decline(); },
|
|
75
|
+
uiLanguage: opts.uiLanguage,
|
|
76
|
+
links: opts.links,
|
|
77
|
+
onWithdraw: onWithdraw != null ? () => { decline(); onWithdraw(); } : undefined,
|
|
78
|
+
};
|
|
79
|
+
return { view: current, required: current?.required ?? null, ensure, refresh, dialog };
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* The subscription start request over the `start` GET (`?planSku`) and `requestStart` POST
|
|
83
|
+
* protocols, asked right before a subscription checkout.
|
|
84
|
+
*/
|
|
85
|
+
export const useSubscriptionStart = (view, record, opts = {}) => {
|
|
86
|
+
const viewRef = useRef(view);
|
|
87
|
+
viewRef.current = view;
|
|
88
|
+
const recordRef = useRef(record);
|
|
89
|
+
recordRef.current = record;
|
|
90
|
+
const [current, setCurrent] = useState(null);
|
|
91
|
+
const [params, setParams] = useState({ planTitle: '' });
|
|
92
|
+
const [open, setOpen] = useState(false);
|
|
93
|
+
const [pending, setPending] = useState(false);
|
|
94
|
+
const [error, setError] = useState(false);
|
|
95
|
+
const asker = useMemo(() => makeAsker({
|
|
96
|
+
load: async (planSku, next) => {
|
|
97
|
+
const answer = await viewRef.current.call(...argsOf({ query: { planSku } }));
|
|
98
|
+
setCurrent(answer);
|
|
99
|
+
setParams(next);
|
|
100
|
+
return answer;
|
|
101
|
+
},
|
|
102
|
+
required: next => next.required,
|
|
103
|
+
skip: '',
|
|
104
|
+
show: () => { setError(false); setOpen(true); },
|
|
105
|
+
}), []);
|
|
106
|
+
const decline = useCallback(() => {
|
|
107
|
+
setOpen(false);
|
|
108
|
+
asker.settle(null);
|
|
109
|
+
}, [asker]);
|
|
110
|
+
const onConfirm = useCallback(async (body) => {
|
|
111
|
+
setPending(true);
|
|
112
|
+
setError(false);
|
|
113
|
+
try {
|
|
114
|
+
const response = reviveStartResponse(await recordRef.current.call(...argsOf({ body })));
|
|
115
|
+
setOpen(false);
|
|
116
|
+
asker.settle(response.startRequestId);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
setError(true);
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
setPending(false);
|
|
123
|
+
}
|
|
124
|
+
}, [asker]);
|
|
125
|
+
const ensure = useCallback(async (planSku, next) => await asker.ask(planSku, next), [asker]);
|
|
126
|
+
const onWithdraw = opts.onWithdraw;
|
|
127
|
+
const dialog = {
|
|
128
|
+
open, view: current, planTitle: params.planTitle, price: params.price, pending, error, onConfirm,
|
|
129
|
+
onDecline: decline,
|
|
130
|
+
onOpenChange: next => { if (next)
|
|
131
|
+
setOpen(true);
|
|
132
|
+
else
|
|
133
|
+
decline(); },
|
|
134
|
+
uiLanguage: opts.uiLanguage,
|
|
135
|
+
links: opts.links,
|
|
136
|
+
onWithdraw: onWithdraw != null ? () => { decline(); onWithdraw(); } : undefined,
|
|
137
|
+
};
|
|
138
|
+
return { ensure, view: current, dialog };
|
|
139
|
+
};
|
|
140
|
+
/** The submit half both statutory functions share: one protocol, one receipt. */
|
|
141
|
+
const useDeclaration = (entry) => {
|
|
142
|
+
const entryRef = useRef(entry);
|
|
143
|
+
entryRef.current = entry;
|
|
144
|
+
const [receipt, setReceipt] = useState(null);
|
|
145
|
+
const [pending, setPending] = useState(false);
|
|
146
|
+
const [error, setError] = useState(null);
|
|
147
|
+
const submit = useCallback(async (body) => {
|
|
148
|
+
setPending(true);
|
|
149
|
+
setError(null);
|
|
150
|
+
try {
|
|
151
|
+
const answer = reviveReceipt(await entryRef.current.call(...argsOf({ body })));
|
|
152
|
+
setReceipt(answer);
|
|
153
|
+
return answer;
|
|
154
|
+
}
|
|
155
|
+
catch (e) {
|
|
156
|
+
setError(e);
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
finally {
|
|
160
|
+
setPending(false);
|
|
161
|
+
}
|
|
162
|
+
}, []);
|
|
163
|
+
const reset = useCallback(() => {
|
|
164
|
+
setReceipt(null);
|
|
165
|
+
setError(null);
|
|
166
|
+
}, []);
|
|
167
|
+
return { submit, receipt, pending, error, reset };
|
|
168
|
+
};
|
|
169
|
+
/**
|
|
170
|
+
* The withdrawal function over the `withdrawals` GET (in-app; `null` on the public page) and a
|
|
171
|
+
* `withdraw` POST — the account one answers a `WithdrawalReceipt`, the public one a
|
|
172
|
+
* `DeclarationReceipt`.
|
|
173
|
+
*/
|
|
174
|
+
export const useWithdrawal = (list, withdraw, opts = {}) => {
|
|
175
|
+
const listRef = useRef(list);
|
|
176
|
+
listRef.current = list;
|
|
177
|
+
const [candidates, setCandidates] = useState(null);
|
|
178
|
+
const declaration = useDeclaration(withdraw);
|
|
179
|
+
const load = useCallback(async () => {
|
|
180
|
+
if (listRef.current == null) {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
try {
|
|
184
|
+
const next = reviveWithdrawalList(await listRef.current.call());
|
|
185
|
+
setCandidates(next);
|
|
186
|
+
return next;
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
}, []);
|
|
192
|
+
useEffect(() => {
|
|
193
|
+
if (opts.enabled === true)
|
|
194
|
+
void load();
|
|
195
|
+
}, [opts.enabled, load]);
|
|
196
|
+
return {
|
|
197
|
+
...declaration,
|
|
198
|
+
list: candidates,
|
|
199
|
+
load,
|
|
200
|
+
form: {
|
|
201
|
+
list: candidates,
|
|
202
|
+
pending: declaration.pending,
|
|
203
|
+
error: declaration.error != null,
|
|
204
|
+
receipt: declaration.receipt,
|
|
205
|
+
onSubmit: declaration.submit,
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
};
|
|
209
|
+
/**
|
|
210
|
+
* The cancellation function over a `cancel` POST — the account one answers a
|
|
211
|
+
* `CancellationReceipt`, the public one a `DeclarationReceipt`.
|
|
212
|
+
*/
|
|
213
|
+
export const useCancellation = (cancel) => {
|
|
214
|
+
const declaration = useDeclaration(cancel);
|
|
215
|
+
return {
|
|
216
|
+
...declaration,
|
|
217
|
+
form: {
|
|
218
|
+
pending: declaration.pending,
|
|
219
|
+
error: declaration.error != null,
|
|
220
|
+
receipt: declaration.receipt,
|
|
221
|
+
onSubmit: declaration.submit,
|
|
222
|
+
},
|
|
223
|
+
};
|
|
224
|
+
};
|
|
225
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/consumer/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import '../i18n.js';
|
|
2
|
+
export type * from './types.js';
|
|
3
|
+
export * from './refusal.js';
|
|
4
|
+
export * from './ensure.js';
|
|
5
|
+
export * from './copy.js';
|
|
6
|
+
export { LanguageToggle, LegalLinks, linksFor, useShownLanguage, useUiLanguage } from './legal.js';
|
|
7
|
+
export type { LanguageToggleProps, LegalLinksProps, ShownLanguage } from './legal.js';
|
|
8
|
+
export * from './performance-consent-dialog.js';
|
|
9
|
+
export * from './subscription-start-dialog.js';
|
|
10
|
+
export * from './withdrawal.js';
|
|
11
|
+
export * from './cancellation.js';
|
|
12
|
+
export * from './hooks.js';
|
|
13
|
+
export * from './provider.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/consumer/index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,CAAA;AACnB,mBAAmB,YAAY,CAAA;AAC/B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAClG,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AACrF,cAAc,iCAAiC,CAAA;AAC/C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import '../i18n.js';
|
|
2
|
+
export * from './refusal.js';
|
|
3
|
+
export * from './ensure.js';
|
|
4
|
+
export * from './copy.js';
|
|
5
|
+
export { LanguageToggle, LegalLinks, linksFor, useShownLanguage, useUiLanguage } from './legal.js';
|
|
6
|
+
export * from './performance-consent-dialog.js';
|
|
7
|
+
export * from './subscription-start-dialog.js';
|
|
8
|
+
export * from './withdrawal.js';
|
|
9
|
+
export * from './cancellation.js';
|
|
10
|
+
export * from './hooks.js';
|
|
11
|
+
export * from './provider.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/consumer/index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,CAAA;AAEnB,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAElG,cAAc,iCAAiC,CAAA;AAC/C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { ConsumerRightsLinks } from '@owlmeans/payment';
|
|
2
|
+
import { type FixedText } from './copy.js';
|
|
3
|
+
import type { LegalLinksSource, PieceError } from './types.js';
|
|
4
|
+
/** The interface language: the one given, else the active i18n language. */
|
|
5
|
+
export declare const useUiLanguage: (uiLanguage?: string) => string;
|
|
6
|
+
export interface ShownLanguage {
|
|
7
|
+
/** The language the legal copy is shown in now (base code). */
|
|
8
|
+
shown: string;
|
|
9
|
+
/** The contract language (base code). */
|
|
10
|
+
contract: string;
|
|
11
|
+
ui: string;
|
|
12
|
+
/** The contract and interface languages differ, so a toggle is offered. */
|
|
13
|
+
canToggle: boolean;
|
|
14
|
+
toggle: () => void;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Which language a legal text is shown in: the contract language first, with a toggle to the
|
|
18
|
+
* interface language and back. `resetKey` (the dialog's `open`, say) returns it to the contract
|
|
19
|
+
* language.
|
|
20
|
+
*/
|
|
21
|
+
export declare const useShownLanguage: (contractLanguage: string, uiLanguage?: string, resetKey?: unknown) => ShownLanguage;
|
|
22
|
+
export interface LanguageToggleProps {
|
|
23
|
+
language: ShownLanguage;
|
|
24
|
+
/** An extra `data-*` hook of the piece that hosts the toggle (`data-consent-language-toggle`). */
|
|
25
|
+
hook?: string;
|
|
26
|
+
className?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Switches a legal text between the contract and the interface language. Phrased in the
|
|
30
|
+
* INTERFACE language ("Show in German") — the reader who needs the toggle reads that one.
|
|
31
|
+
*/
|
|
32
|
+
export declare const LanguageToggle: ({ language, hook, className }: LanguageToggleProps) => import("react").JSX.Element | null;
|
|
33
|
+
/** The links of the shown language: the source's, else the view's own. */
|
|
34
|
+
export declare const linksFor: (language: string, own: ConsumerRightsLinks | undefined, source?: LegalLinksSource) => ConsumerRightsLinks | undefined;
|
|
35
|
+
export interface LegalLinksProps {
|
|
36
|
+
links?: ConsumerRightsLinks;
|
|
37
|
+
legal: FixedText;
|
|
38
|
+
onWithdraw?: () => void;
|
|
39
|
+
className?: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* "Billing Terms · Withdrawal information · Withdraw from contract here", each in the shown
|
|
43
|
+
* language: `[data-legal-link="billing-terms" | "withdrawal-information" | "withdrawal-function"]`.
|
|
44
|
+
* The withdrawal function is a button when the application opens it in-app (`onWithdraw`), else a
|
|
45
|
+
* link to its public page, else absent.
|
|
46
|
+
*/
|
|
47
|
+
export declare const LegalLinks: ({ links, legal, onWithdraw, className }: LegalLinksProps) => import("react").JSX.Element | null;
|
|
48
|
+
/** A piece's failure line: the application's own words, or the generic sentence for `true`. */
|
|
49
|
+
export declare const ErrorLine: ({ error, text }: {
|
|
50
|
+
error?: PieceError;
|
|
51
|
+
text: FixedText;
|
|
52
|
+
}) => import("react").JSX.Element | null;
|
|
53
|
+
//# sourceMappingURL=legal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legal.d.ts","sourceRoot":"","sources":["../../src/consumer/legal.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAE5D,OAAO,EAAkC,KAAK,SAAS,EAAE,MAAM,WAAW,CAAA;AAC1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE9D,4EAA4E;AAC5E,eAAO,MAAM,aAAa,gBAAiB,MAAM,KAAG,MAInD,CAAA;AAED,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAA;IACb,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAA;IAChB,EAAE,EAAE,MAAM,CAAA;IACV,2EAA2E;IAC3E,SAAS,EAAE,OAAO,CAAA;IAClB,MAAM,EAAE,MAAM,IAAI,CAAA;CACnB;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,qBAAsB,MAAM,eAAe,MAAM,aAAa,OAAO,KAAG,aASpG,CAAA;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,aAAa,CAAA;IACvB,kGAAkG;IAClG,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,kCAAmC,mBAAmB,uCAchF,CAAA;AAED,0EAA0E;AAC1E,eAAO,MAAM,QAAQ,aAAc,MAAM,OAAO,mBAAmB,GAAG,SAAS,WAAW,gBAAgB,KAAG,mBAAmB,GAAG,SASlI,CAAA;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,mBAAmB,CAAA;IAC3B,KAAK,EAAE,SAAS,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;GAKG;AACH,eAAO,MAAM,UAAU,4CAA6C,eAAe,uCAuBlF,CAAA;AAED,+FAA+F;AAC/F,eAAO,MAAM,SAAS,oBAAqB;IAAE,KAAK,CAAC,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,uCAQjF,CAAA"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Fragment, useCallback, useEffect, useState } from 'react';
|
|
3
|
+
import { useLanguage } from '@owlmeans/client-i18n';
|
|
4
|
+
import { baseLanguageOf } from '@owlmeans/payment';
|
|
5
|
+
import { cn } from '@/lib/utils';
|
|
6
|
+
import { languageNameOf, usePaymentText } from './copy.js';
|
|
7
|
+
/** The interface language: the one given, else the active i18n language. */
|
|
8
|
+
export const useUiLanguage = (uiLanguage) => {
|
|
9
|
+
const [active] = useLanguage();
|
|
10
|
+
return baseLanguageOf(uiLanguage ?? active) || 'en';
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Which language a legal text is shown in: the contract language first, with a toggle to the
|
|
14
|
+
* interface language and back. `resetKey` (the dialog's `open`, say) returns it to the contract
|
|
15
|
+
* language.
|
|
16
|
+
*/
|
|
17
|
+
export const useShownLanguage = (contractLanguage, uiLanguage, resetKey) => {
|
|
18
|
+
const ui = useUiLanguage(uiLanguage);
|
|
19
|
+
const contract = baseLanguageOf(contractLanguage) || ui;
|
|
20
|
+
const [showUi, setShowUi] = useState(false);
|
|
21
|
+
useEffect(() => { setShowUi(false); }, [contract, resetKey]);
|
|
22
|
+
const canToggle = contract !== ui;
|
|
23
|
+
const toggle = useCallback(() => setShowUi(value => !value), []);
|
|
24
|
+
return { shown: canToggle && showUi ? ui : contract, contract, ui, canToggle, toggle };
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Switches a legal text between the contract and the interface language. Phrased in the
|
|
28
|
+
* INTERFACE language ("Show in German") — the reader who needs the toggle reads that one.
|
|
29
|
+
*/
|
|
30
|
+
export const LanguageToggle = ({ language, hook, className }) => {
|
|
31
|
+
const ui = usePaymentText(language.ui);
|
|
32
|
+
if (!language.canToggle) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
const target = language.shown === language.contract ? language.ui : language.contract;
|
|
36
|
+
return _jsx("button", { type: "button", onClick: language.toggle, "data-language-toggle": "", "data-target-language": target, ...(hook != null ? { [hook]: '' } : {}), className: cn('text-primary w-fit cursor-pointer text-xs underline-offset-4 hover:underline', className), children: ui('consumer.show-in', { language: languageNameOf(target, language.ui) }) });
|
|
37
|
+
};
|
|
38
|
+
/** The links of the shown language: the source's, else the view's own. */
|
|
39
|
+
export const linksFor = (language, own, source) => {
|
|
40
|
+
if (source == null) {
|
|
41
|
+
return own;
|
|
42
|
+
}
|
|
43
|
+
const picked = typeof source === 'function'
|
|
44
|
+
? source(language)
|
|
45
|
+
: source[language] ?? source[baseLanguageOf(language)];
|
|
46
|
+
return picked ?? own;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* "Billing Terms · Withdrawal information · Withdraw from contract here", each in the shown
|
|
50
|
+
* language: `[data-legal-link="billing-terms" | "withdrawal-information" | "withdrawal-function"]`.
|
|
51
|
+
* The withdrawal function is a button when the application opens it in-app (`onWithdraw`), else a
|
|
52
|
+
* link to its public page, else absent.
|
|
53
|
+
*/
|
|
54
|
+
export const LegalLinks = ({ links, legal, onWithdraw, className }) => {
|
|
55
|
+
const anchor = (key, href, label) => href == null || href === ''
|
|
56
|
+
? null
|
|
57
|
+
: _jsx("a", { href: href, target: "_blank", rel: "noopener noreferrer", "data-legal-link": key, className: "text-primary underline-offset-4 hover:underline", children: label }, key);
|
|
58
|
+
const items = [
|
|
59
|
+
anchor('billing-terms', links?.billingTerms, legal('links.billing-terms')),
|
|
60
|
+
anchor('withdrawal-information', links?.withdrawalInformation, legal('links.withdrawal-information')),
|
|
61
|
+
onWithdraw != null
|
|
62
|
+
? _jsx("button", { type: "button", onClick: onWithdraw, "data-legal-link": "withdrawal-function", className: "text-primary cursor-pointer underline-offset-4 hover:underline", children: legal('links.withdrawal-function') }, "withdrawal-function")
|
|
63
|
+
: anchor('withdrawal-function', links?.withdrawalFunction, legal('links.withdrawal-function')),
|
|
64
|
+
].filter(item => item != null);
|
|
65
|
+
if (items.length === 0) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
return _jsx("p", { className: cn('flex flex-wrap items-center gap-x-2 gap-y-1 text-xs', className), "data-legal-links": "", children: items.map((item, index) => _jsxs(Fragment, { children: [index > 0 && _jsx("span", { "aria-hidden": "true", className: "text-muted-foreground", children: "\u00B7" }), item] }, index)) });
|
|
69
|
+
};
|
|
70
|
+
/** A piece's failure line: the application's own words, or the generic sentence for `true`. */
|
|
71
|
+
export const ErrorLine = ({ error, text }) => {
|
|
72
|
+
if (error == null || error === false) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
return _jsx("p", { role: "alert", className: "text-destructive text-sm", "data-consumer-error": "", children: error === true ? text('consumer.failed') : error });
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=legal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legal.js","sourceRoot":"","sources":["../../src/consumer/legal.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { PerformanceConsentDialogProps } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* The express request to start performing now, asked before credits bought inside their
|
|
4
|
+
* withdrawal window are spent (CRD Art. 16(m), § 356 Abs. 5 BGB, art. 38 UoPK, L221-28).
|
|
5
|
+
*
|
|
6
|
+
* The legal copy is shown in the CONTRACT language (`view.language`) with a toggle to the
|
|
7
|
+
* interface language; the purchases it covers are listed with their deadlines; ONE checkbox
|
|
8
|
+
* carries the whole statement and starts unchecked, and the confirm button stays disabled until
|
|
9
|
+
* it is ticked. Toggling the language unticks it — the statement agreed to is the one on screen —
|
|
10
|
+
* and `onConfirm` records the language actually shown.
|
|
11
|
+
*
|
|
12
|
+
* Selectors: `[data-consent-dialog]` (with `data-language`, `data-contract-language`),
|
|
13
|
+
* `[data-consent-purchase]` (`data-purchase-id`, `data-deadline`), `[data-consent-checkbox]`,
|
|
14
|
+
* `[data-consent-confirm]`, `[data-consent-decline]`, `[data-consent-language-toggle]`,
|
|
15
|
+
* `[data-legal-link]`.
|
|
16
|
+
*/
|
|
17
|
+
export declare const PerformanceConsentDialog: ({ open, onOpenChange, view, uiLanguage, pending, error, onConfirm, onDecline, links, onWithdraw, formatAmount, className, }: PerformanceConsentDialogProps) => import("react").JSX.Element | null;
|
|
18
|
+
//# sourceMappingURL=performance-consent-dialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance-consent-dialog.d.ts","sourceRoot":"","sources":["../../src/consumer/performance-consent-dialog.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAA;AAc/D;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,wBAAwB,gIAGlC,6BAA6B,uCAuF/B,CAAA"}
|