@boltclaw/referrals 0.0.0-stage → 0.4.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.
Files changed (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +500 -3
  3. package/dist/api-types.d.ts +245 -0
  4. package/dist/api-types.js +2 -0
  5. package/dist/api-types.js.map +1 -0
  6. package/dist/assistant-tools.d.ts +40 -0
  7. package/dist/assistant-tools.js +120 -0
  8. package/dist/assistant-tools.js.map +1 -0
  9. package/dist/assistant.d.ts +62 -0
  10. package/dist/assistant.js +305 -0
  11. package/dist/assistant.js.map +1 -0
  12. package/dist/case.d.ts +2 -0
  13. package/dist/case.js +30 -0
  14. package/dist/case.js.map +1 -0
  15. package/dist/client.d.ts +22 -0
  16. package/dist/client.js +80 -0
  17. package/dist/client.js.map +1 -0
  18. package/dist/element.d.ts +4 -0
  19. package/dist/element.js +204 -0
  20. package/dist/element.js.map +1 -0
  21. package/dist/errors.d.ts +19 -0
  22. package/dist/errors.js +62 -0
  23. package/dist/errors.js.map +1 -0
  24. package/dist/generated/api.d.ts +6477 -0
  25. package/dist/generated/api.js +891 -0
  26. package/dist/generated/api.js.map +1 -0
  27. package/dist/index.d.ts +18 -0
  28. package/dist/index.js +10 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/loader.d.ts +118 -0
  31. package/dist/loader.js +524 -0
  32. package/dist/loader.js.map +1 -0
  33. package/dist/middleware.d.ts +100 -0
  34. package/dist/middleware.js +378 -0
  35. package/dist/middleware.js.map +1 -0
  36. package/dist/origin.d.ts +3 -0
  37. package/dist/origin.js +22 -0
  38. package/dist/origin.js.map +1 -0
  39. package/dist/react.d.ts +69 -0
  40. package/dist/react.js +328 -0
  41. package/dist/react.js.map +1 -0
  42. package/dist/server-index.d.ts +17 -0
  43. package/dist/server-index.js +9 -0
  44. package/dist/server-index.js.map +1 -0
  45. package/dist/server.d.ts +106 -0
  46. package/dist/server.js +511 -0
  47. package/dist/server.js.map +1 -0
  48. package/dist/typed-code.d.ts +78 -0
  49. package/dist/typed-code.js +234 -0
  50. package/dist/typed-code.js.map +1 -0
  51. package/dist/types.d.ts +254 -0
  52. package/dist/types.js +61 -0
  53. package/dist/types.js.map +1 -0
  54. package/dist/webhooks.d.ts +20 -0
  55. package/dist/webhooks.js +90 -0
  56. package/dist/webhooks.js.map +1 -0
  57. package/package.json +97 -6
@@ -0,0 +1,378 @@
1
+ import { ReferralsServer } from "./server.js";
2
+ export const REFERRAL_COOKIE = "bc_ref";
3
+ export const DEFAULT_REFERRAL_PARAM = "via";
4
+ export const ACCEPTED_PARAMS = ["ref", "via", "fpr", "lmref", "tolt_referral"];
5
+ export const DEFAULT_COOKIE_DAYS = 30;
6
+ const CODE = /^[a-z0-9]+(-[a-z0-9]+)*$/;
7
+ const PROGRAM_ID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
8
+ const HEADER_NAME = /^[A-Za-z0-9-]{1,64}$/;
9
+ const IP_LITERAL = /^[0-9A-Fa-f:.]{2,45}$/;
10
+ export const MAX_PARAMS = 20;
11
+ const PARAM = /^[A-Za-z0-9_-]{1,32}$/;
12
+ const TAG = /^[A-Za-z0-9_.:-]{1,200}$/;
13
+ const DAY_SECONDS = 86_400;
14
+ export function isReferralCode(value) {
15
+ return typeof value === "string" && value.length >= 3 && value.length <= 40 && CODE.test(value);
16
+ }
17
+ function decode(value) {
18
+ try {
19
+ return decodeURIComponent(value.replace(/\+/g, " "));
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ }
25
+ function planFor(options) {
26
+ const programs = options.programs ?? {};
27
+ if (typeof programs !== "object" || programs === null || Array.isArray(programs)) {
28
+ throw new TypeError("programs must be an object of query name to program id.");
29
+ }
30
+ const own = [];
31
+ for (const [name, programId] of Object.entries(programs)) {
32
+ if (!PARAM.test(name))
33
+ throw new TypeError(`programs: "${name}" is not a query name (letters, digits, _ or -, at most 32).`);
34
+ if (typeof programId !== "string" || !PROGRAM_ID.test(programId))
35
+ throw new TypeError(`programs: "${name}" must map to a program id.`);
36
+ own.push({ name, programId: programId.toLowerCase() });
37
+ }
38
+ let names;
39
+ if (options.params !== undefined) {
40
+ if (!Array.isArray(options.params) || options.params.length === 0)
41
+ throw new TypeError("params must be a list of query names.");
42
+ names = [];
43
+ for (const name of options.params) {
44
+ if (typeof name !== "string" || !PARAM.test(name))
45
+ throw new TypeError(`params: "${String(name)}" is not a query name (letters, digits, _ or -, at most 32).`);
46
+ if (!names.includes(name))
47
+ names.push(name);
48
+ }
49
+ }
50
+ else {
51
+ names = [options.param !== undefined && PARAM.test(options.param) ? options.param : DEFAULT_REFERRAL_PARAM];
52
+ for (const name of options.acceptParams ?? []) {
53
+ if (ACCEPTED_PARAMS.includes(name) && !names.includes(name))
54
+ names.push(name);
55
+ }
56
+ }
57
+ for (const { name } of own)
58
+ if (!names.includes(name))
59
+ names.push(name);
60
+ if (names.length > MAX_PARAMS)
61
+ throw new TypeError(`At most ${MAX_PARAMS} query names.`);
62
+ if (options.ipHeader !== undefined && options.ipHeader !== false && (typeof options.ipHeader !== "string" || !HEADER_NAME.test(options.ipHeader))) {
63
+ throw new TypeError("ipHeader must be a header name, or false.");
64
+ }
65
+ if (typeof options.ipHeader === "string" && FORWARDED_CHAINS.has(options.ipHeader.toLowerCase())) {
66
+ throw new TypeError("ipHeader must be a header your host overwrites; X-Forwarded-For is read from its last entry by itself.");
67
+ }
68
+ const mapped = new Set(own.map((o) => o.name));
69
+ return { shared: names.filter((n) => !mapped.has(n)), own: own.sort((a, b) => names.indexOf(a.name) - names.indexOf(b.name)) };
70
+ }
71
+ export function referralCookieName(param) {
72
+ return param === null ? REFERRAL_COOKIE : `${REFERRAL_COOKIE}_${param}`;
73
+ }
74
+ function subCookieName(param) {
75
+ return param === null ? "bc_sub" : `bc_sub_${param}`;
76
+ }
77
+ export function codeFromSearch(search, params) {
78
+ const last = new Map();
79
+ const query = search.startsWith("?") ? search.slice(1) : search;
80
+ for (const pair of query.split("&")) {
81
+ const eq = pair.indexOf("=");
82
+ if (eq === -1)
83
+ continue;
84
+ const key = decode(pair.slice(0, eq));
85
+ if (key === null || !params.includes(key))
86
+ continue;
87
+ const value = decode(pair.slice(eq + 1));
88
+ if (value !== null)
89
+ last.set(key, value);
90
+ }
91
+ for (const name of params) {
92
+ const value = last.get(name);
93
+ if (value !== undefined && isReferralCode(value))
94
+ return value;
95
+ }
96
+ return null;
97
+ }
98
+ export function codeFromCookie(cookie, name = REFERRAL_COOKIE) {
99
+ for (const part of (cookie ?? "").split(";")) {
100
+ const trimmed = part.replace(/^\s+/, "");
101
+ if (!trimmed.startsWith(`${name}=`))
102
+ continue;
103
+ const value = decode(trimmed.slice(name.length + 1));
104
+ if (isReferralCode(value))
105
+ return value;
106
+ }
107
+ return null;
108
+ }
109
+ export function referralCodeFor(cookie, programId = null, options = {}) {
110
+ if (programId !== null) {
111
+ const id = programId.toLowerCase();
112
+ for (const [name, mapped] of Object.entries(options.programs ?? {})) {
113
+ if (typeof mapped === "string" && mapped.toLowerCase() === id && PARAM.test(name))
114
+ return codeFromCookie(cookie, referralCookieName(name));
115
+ }
116
+ }
117
+ return codeFromCookie(cookie);
118
+ }
119
+ const SUB_TAG = /^[a-z0-9_-]{1,80}$/;
120
+ export function subCookie(sub, days, secure, name = "bc_sub") {
121
+ const flags = `; Path=/; SameSite=Lax${secure ? "; Secure" : ""}`;
122
+ return sub !== null && SUB_TAG.test(sub)
123
+ ? `${name}=${encodeURIComponent(sub)}; Max-Age=${days * DAY_SECONDS}${flags}`
124
+ : `${name}=; Max-Age=0${flags}`;
125
+ }
126
+ export function referralCookie(code, days, secure, name = REFERRAL_COOKIE) {
127
+ return `${name}=${encodeURIComponent(code)}; Path=/; Max-Age=${days * DAY_SECONDS}; SameSite=Lax${secure ? "; Secure" : ""}`;
128
+ }
129
+ function cookieDays(options) {
130
+ const days = options.cookieDays ?? DEFAULT_COOKIE_DAYS;
131
+ return Number.isInteger(days) && days >= 1 && days <= 365 ? days : DEFAULT_COOKIE_DAYS;
132
+ }
133
+ export function referralVisit(facts, options = {}) {
134
+ return visitOf(facts, options, planFor(options));
135
+ }
136
+ function visitOf(facts, options, plan) {
137
+ let search = "";
138
+ try {
139
+ search = new URL(facts.url, "http://localhost").search;
140
+ }
141
+ catch {
142
+ search = "";
143
+ }
144
+ const params = new URLSearchParams(search);
145
+ const tag = (name) => {
146
+ const value = params.get(name);
147
+ return value !== null && TAG.test(value) ? value : null;
148
+ };
149
+ const sub = tag("bc_sub");
150
+ const days = cookieDays(options);
151
+ const firstClick = options.attribution === "first_click";
152
+ const codes = [];
153
+ const keepOne = (names, param, programId) => {
154
+ const code = codeFromSearch(search, names);
155
+ if (code === null)
156
+ return;
157
+ const cookie = referralCookieName(param);
158
+ const existing = codeFromCookie(facts.cookie, cookie);
159
+ const keep = firstClick && existing !== null;
160
+ const setCookie = keep ? null : referralCookie(code, days, facts.secure, cookie);
161
+ const carried = names.find((n) => codeFromSearch(search, [n]) === code) ?? names[0];
162
+ codes.push({
163
+ param: carried,
164
+ programId,
165
+ code,
166
+ cookie,
167
+ existing,
168
+ current: setCookie !== null ? code : (existing ?? code),
169
+ setCookie,
170
+ setSubCookie: setCookie !== null ? subCookie(sub, days, facts.secure, subCookieName(param)) : null,
171
+ });
172
+ };
173
+ if (plan.shared.length > 0)
174
+ keepOne(plan.shared, null, null);
175
+ for (const { name, programId } of plan.own)
176
+ keepOne([name], name, programId);
177
+ const shared = codes.find((c) => c.programId === null) ?? null;
178
+ const existing = codeFromCookie(facts.cookie);
179
+ const setCookies = [];
180
+ for (const c of codes)
181
+ for (const value of [c.setCookie, c.setSubCookie])
182
+ if (value !== null)
183
+ setCookies.push(value);
184
+ return {
185
+ code: shared?.code ?? null,
186
+ existing,
187
+ current: shared?.setCookie ? shared.code : existing,
188
+ setCookie: shared?.setCookie ?? null,
189
+ setSubCookie: shared?.setSubCookie ?? null,
190
+ click: tag("bc_click"),
191
+ sub,
192
+ codes,
193
+ setCookies,
194
+ };
195
+ }
196
+ function addressOf(value) {
197
+ const first = (value ?? "").split(",")[0]?.trim() ?? "";
198
+ return IP_LITERAL.test(first) ? first : null;
199
+ }
200
+ const FORWARDED_CHAINS = new Set(["x-forwarded-for", "forwarded", "x-forwarded"]);
201
+ export function clientAddress(header, options = {}, platform) {
202
+ if (typeof platform === "string" && IP_LITERAL.test(platform))
203
+ return platform;
204
+ const name = options.ipHeader ?? false;
205
+ if (name !== false && typeof name === "string" && HEADER_NAME.test(name) && !FORWARDED_CHAINS.has(name.toLowerCase())) {
206
+ const raw = header(name.toLowerCase());
207
+ const own = addressOf(Array.isArray(raw) ? raw[0] : raw);
208
+ if (own !== null)
209
+ return own;
210
+ }
211
+ return nearestForwarded(header("x-forwarded-for"));
212
+ }
213
+ function reporterOf(options) {
214
+ const report = options.reportClicks;
215
+ if (report === undefined)
216
+ return null;
217
+ if (report instanceof ReferralsServer)
218
+ return report;
219
+ return new ReferralsServer({ ...report, programId: report.programId ?? "clicks" });
220
+ }
221
+ function core(options) {
222
+ const plan = planFor(options);
223
+ const reporter = reporterOf(options);
224
+ return (facts, waitUntil) => {
225
+ let visit;
226
+ try {
227
+ visit = visitOf(facts, options, plan);
228
+ }
229
+ catch {
230
+ return { code: null, existing: null, current: null, setCookie: null, setSubCookie: null, click: null, sub: null, codes: [], setCookies: [] };
231
+ }
232
+ if (!reporter)
233
+ return visit;
234
+ let path = null;
235
+ try {
236
+ path = new URL(facts.url, "http://localhost").pathname;
237
+ }
238
+ catch {
239
+ path = null;
240
+ }
241
+ for (const seen of visit.codes) {
242
+ let pending;
243
+ try {
244
+ pending = reporter
245
+ .recordClick({
246
+ code: seen.code,
247
+ ip: facts.ip ?? null,
248
+ userAgent: facts.userAgent ?? null,
249
+ referrer: facts.referrer ?? null,
250
+ country: facts.country ?? null,
251
+ landingPath: path,
252
+ })
253
+ .catch((error) => {
254
+ try {
255
+ options.onError?.(error);
256
+ }
257
+ catch {
258
+ }
259
+ });
260
+ }
261
+ catch (error) {
262
+ pending = Promise.resolve();
263
+ try {
264
+ options.onError?.(error);
265
+ }
266
+ catch {
267
+ }
268
+ }
269
+ try {
270
+ (waitUntil ?? options.waitUntil)?.(pending);
271
+ }
272
+ catch {
273
+ }
274
+ }
275
+ return visit;
276
+ };
277
+ }
278
+ export function nextReferralsMiddleware(options = {}) {
279
+ const decide = core(options);
280
+ return (request, response, event) => {
281
+ const href = request.nextUrl?.href ?? request.url;
282
+ let secure = false;
283
+ try {
284
+ secure = (request.nextUrl?.protocol ?? new URL(href).protocol) === "https:";
285
+ }
286
+ catch {
287
+ secure = false;
288
+ }
289
+ const forwardedProto = request.headers.get("x-forwarded-proto");
290
+ if (forwardedProto && forwardedProto.split(",")[0]?.trim() === "https")
291
+ secure = true;
292
+ const ip = clientAddress((name) => request.headers.get(name), options, request.ip);
293
+ const waitUntil = typeof event?.waitUntil === "function" ? (p) => event.waitUntil(p) : undefined;
294
+ const visit = decide({
295
+ url: href,
296
+ cookie: request.headers.get("cookie"),
297
+ secure,
298
+ ip,
299
+ userAgent: request.headers.get("user-agent"),
300
+ referrer: request.headers.get("referer"),
301
+ country: request.geo?.country ?? request.headers.get("x-vercel-ip-country") ?? request.headers.get("cf-ipcountry"),
302
+ }, waitUntil);
303
+ const headers = new Headers();
304
+ for (const value of visit.setCookies) {
305
+ headers.append("Set-Cookie", value);
306
+ try {
307
+ response?.headers.append("Set-Cookie", value);
308
+ }
309
+ catch {
310
+ }
311
+ }
312
+ return { ...visit, headers };
313
+ };
314
+ }
315
+ export const nextReferralsProxy = nextReferralsMiddleware;
316
+ function first(value) {
317
+ if (Array.isArray(value))
318
+ return value[0] ?? null;
319
+ return value ?? null;
320
+ }
321
+ function isInternal(address) {
322
+ const a = address.toLowerCase();
323
+ return (/^(10\.|127\.|192\.168\.|169\.254\.)/.test(a) ||
324
+ /^172\.(1[6-9]|2\d|3[01])\./.test(a) ||
325
+ /^100\.(6[4-9]|[7-9]\d|1[01]\d|12[0-7])\./.test(a) ||
326
+ a === "::1" ||
327
+ /^f[cd][0-9a-f]{2}:/.test(a) ||
328
+ /^fe[89ab][0-9a-f]:/.test(a));
329
+ }
330
+ function nearestForwarded(value) {
331
+ const header = Array.isArray(value) ? value.join(",") : value;
332
+ if (!header)
333
+ return null;
334
+ const parts = header.split(",").map((p) => p.trim()).filter(Boolean);
335
+ for (const part of [...parts].reverse()) {
336
+ if (!isInternal(part))
337
+ return addressOf(part);
338
+ }
339
+ return addressOf(parts[parts.length - 1]);
340
+ }
341
+ export function expressReferralsMiddleware(options = {}) {
342
+ const decide = core(options);
343
+ return (req, res, next) => {
344
+ try {
345
+ const forwardedProto = first(req.headers["x-forwarded-proto"])?.split(",")[0]?.trim();
346
+ const secure = req.secure === true || req.protocol === "https" || forwardedProto === "https";
347
+ const visit = decide({
348
+ url: req.originalUrl ?? req.url ?? "/",
349
+ cookie: first(req.headers.cookie),
350
+ secure,
351
+ ip: clientAddress((name) => req.headers[name], options, req.ip),
352
+ userAgent: first(req.headers["user-agent"]),
353
+ referrer: first(req.headers.referer),
354
+ country: first(req.headers["cf-ipcountry"]) ?? first(req.headers["x-vercel-ip-country"]),
355
+ });
356
+ for (const value of visit.setCookies) {
357
+ if (typeof res.append === "function") {
358
+ res.append("Set-Cookie", value);
359
+ }
360
+ else if (typeof res.setHeader === "function") {
361
+ const before = res.getHeader?.("Set-Cookie");
362
+ const list = before === undefined ? [] : Array.isArray(before) ? before.map(String) : [String(before)];
363
+ res.setHeader("Set-Cookie", [...list, value]);
364
+ }
365
+ }
366
+ if (res.locals)
367
+ res.locals.boltclawReferral = visit;
368
+ }
369
+ catch {
370
+ }
371
+ next();
372
+ };
373
+ }
374
+ export function referralsMiddleware(options = {}) {
375
+ const decide = core(options);
376
+ return (facts) => decide(facts);
377
+ }
378
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const DEFAULT_ORIGIN = "https://boltclaw.ai";
2
+ export declare function isAllowedUrl(url: URL): boolean;
3
+ export declare function normaliseOrigin(value: string | undefined): string;
package/dist/origin.js ADDED
@@ -0,0 +1,22 @@
1
+ export const DEFAULT_ORIGIN = "https://boltclaw.ai";
2
+ export function isAllowedUrl(url) {
3
+ if (url.username !== "" || url.password !== "")
4
+ return false;
5
+ if (url.protocol === "https:")
6
+ return true;
7
+ return url.protocol === "http:" && (url.hostname === "localhost" || url.hostname === "127.0.0.1");
8
+ }
9
+ export function normaliseOrigin(value) {
10
+ let url;
11
+ try {
12
+ url = new URL(value ?? DEFAULT_ORIGIN);
13
+ }
14
+ catch {
15
+ throw new TypeError("origin must be an absolute URL such as https://boltclaw.ai.");
16
+ }
17
+ if (!isAllowedUrl(url)) {
18
+ throw new TypeError("origin must be https (http is allowed only for localhost and 127.0.0.1).");
19
+ }
20
+ return url.origin;
21
+ }
22
+ //# sourceMappingURL=origin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"origin.js","sourceRoot":"","sources":["../src/origin.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,qBAAqB,CAAC;AAGpD,MAAM,UAAU,YAAY,CAAC,GAAQ;IACnC,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IAC7D,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,KAAK,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,CAAC,CAAC;AACpG,CAAC;AAGD,MAAM,UAAU,eAAe,CAAC,KAAyB;IACvD,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,IAAI,cAAc,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,SAAS,CAAC,6DAA6D,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,SAAS,CAAC,0EAA0E,CAAC,CAAC;IAClG,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,CAAC;AACpB,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { type CSSProperties, type ReactElement } from "react";
2
+ import { type FetchLike } from "./client.js";
3
+ import { type NoticeEvents, type NoticeEventType, type PanelEventType, type PanelEvents, type PanelTokens } from "./loader.js";
4
+ import type { EmbedTheme, Offer, ReferrerPanelView } from "./types.js";
5
+ export type { NoticeEvents, NoticeEventType, PanelEventType, PanelEvents, PanelTokens } from "./loader.js";
6
+ export type { Offer } from "./types.js";
7
+ export interface ReferralPanelProps {
8
+ token: string;
9
+ embedKey: string;
10
+ mode?: "inline" | "modal" | "thank-you";
11
+ open?: boolean;
12
+ onClose?: () => void;
13
+ origin?: string;
14
+ theme?: EmbedTheme;
15
+ tokens?: PanelTokens;
16
+ locale?: string;
17
+ onEvent?: <T extends PanelEventType>(type: T, payload: PanelEvents[T]) => void;
18
+ onDismiss?: () => void;
19
+ className?: string;
20
+ }
21
+ export declare function ReferralPanel(props: ReferralPanelProps): ReactElement | null;
22
+ export interface ReferralNoticeProps {
23
+ token: string;
24
+ embedKey: string;
25
+ href: string;
26
+ origin?: string;
27
+ theme?: EmbedTheme;
28
+ tokens?: PanelTokens;
29
+ locale?: string;
30
+ navigate?: boolean;
31
+ onOpen?: (href: string) => void;
32
+ onShown?: (count: number) => void;
33
+ onEvent?: <T extends NoticeEventType>(type: T, payload: NoticeEvents[T]) => void;
34
+ className?: string;
35
+ }
36
+ export declare function ReferralNotice(props: ReferralNoticeProps): ReactElement;
37
+ export interface UseReferrerOptions {
38
+ origin?: string;
39
+ refreshMs?: number;
40
+ fetch?: FetchLike;
41
+ }
42
+ export interface UseReferrerResult {
43
+ view: ReferrerPanelView | null;
44
+ error: Error | null;
45
+ loading: boolean;
46
+ expired: boolean;
47
+ refresh: () => Promise<void>;
48
+ }
49
+ export declare function useReferrer(token: string | null | undefined, options?: UseReferrerOptions): UseReferrerResult;
50
+ export interface UseOfferOptions {
51
+ origin?: string;
52
+ fetch?: FetchLike;
53
+ }
54
+ export interface UseOfferResult {
55
+ offer: Offer | null;
56
+ loading: boolean;
57
+ }
58
+ export declare function useOffer(code?: string | null, options?: UseOfferOptions): UseOfferResult;
59
+ export interface ReferralWelcomeProps {
60
+ offer?: Offer | null;
61
+ code?: string | null;
62
+ origin?: string;
63
+ fetch?: FetchLike;
64
+ showCta?: boolean;
65
+ onClose?: () => void;
66
+ className?: string;
67
+ style?: CSSProperties;
68
+ }
69
+ export declare function ReferralWelcome(props: ReferralWelcomeProps): ReactElement | null;