@linktr.ee/linkapp 0.0.48 → 0.0.49
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 +1 -1
- package/dev-server/components/form/array-field.tsx +115 -0
- package/dev-server/components/form/file-field.tsx +48 -0
- package/dev-server/components/form/form-element.tsx +304 -0
- package/dev-server/components/form/link-behavior-field.tsx +68 -0
- package/dev-server/components/form/location-field.tsx +60 -0
- package/dev-server/components/settings-preview.tsx +138 -302
- package/dev-server/components/ui/checkbox.tsx +29 -0
- package/dev-server/components/ui/dialog.tsx +2 -10
- package/dev-server/components/ui/field.tsx +24 -49
- package/dev-server/components/ui/input.tsx +20 -21
- package/dev-server/components/ui/label.tsx +4 -4
- package/dev-server/components/ui/radio-group.tsx +37 -0
- package/dev-server/components/ui/select.tsx +153 -0
- package/dev-server/components/ui/switch.tsx +31 -0
- package/dev-server/components/ui/tabs.tsx +1 -1
- package/dev-server/components/ui/textarea.tsx +18 -19
- package/dev-server/env.d.ts +4 -1
- package/dev-server/expanded/main.tsx +20 -22
- package/dev-server/expanded.html +0 -1
- package/dev-server/featured/main.tsx +29 -36
- package/dev-server/featured-carousel.html +0 -1
- package/dev-server/featured.html +0 -1
- package/dev-server/index.html +1 -7
- package/dev-server/lib/utils.ts +3 -3
- package/dev-server/package.json +3 -3
- package/dev-server/postcss/tailwind-source-fallback.js +2 -7
- package/dev-server/postcss.config.mjs +2 -2
- package/dev-server/preview/Preview.tsx +310 -350
- package/dev-server/preview/main.tsx +8 -8
- package/dev-server/preview/preview.css +0 -1
- package/dev-server/public/site.webmanifest +1 -1
- package/dev-server/rsbuild.config.ts +1 -1
- package/dev-server/shared/dev-parent-simulator.ts +219 -0
- package/dev-server/shared/theme-presets.ts +71 -75
- package/dev-server/shared/theme-utils.ts +11 -11
- package/dist/cli.js +18 -12
- package/dist/cli.js.map +1 -1
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +27 -42
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +26 -16
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/deploy.d.ts +1 -11
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +3 -13
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +132 -388
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +17 -29
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts.map +1 -1
- package/dist/commands/logout.js +6 -11
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/rollback.d.ts +10 -0
- package/dist/commands/rollback.d.ts.map +1 -0
- package/dist/commands/rollback.js +148 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/status.d.ts +8 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +96 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/test-url-match-rules.d.ts.map +1 -1
- package/dist/commands/test-url-match-rules.js +20 -26
- package/dist/commands/test-url-match-rules.js.map +1 -1
- package/dist/lib/auth/device-flow.d.ts +1 -1
- package/dist/lib/auth/device-flow.d.ts.map +1 -1
- package/dist/lib/auth/device-flow.js +3 -3
- package/dist/lib/auth/device-flow.js.map +1 -1
- package/dist/lib/auth/token-storage.d.ts.map +1 -1
- package/dist/lib/auth/token-storage.js +14 -37
- package/dist/lib/auth/token-storage.js.map +1 -1
- package/dist/lib/build/detect-layouts.d.ts.map +1 -1
- package/dist/lib/build/detect-layouts.js +27 -13
- package/dist/lib/build/detect-layouts.js.map +1 -1
- package/dist/lib/config/load-config.d.ts.map +1 -1
- package/dist/lib/config/load-config.js +0 -2
- package/dist/lib/config/load-config.js.map +1 -1
- package/dist/lib/deploy/deploy-output.d.ts +2 -1
- package/dist/lib/deploy/deploy-output.d.ts.map +1 -1
- package/dist/lib/deploy/deploy-output.js +9 -1
- package/dist/lib/deploy/deploy-output.js.map +1 -1
- package/dist/lib/deploy/deploy-phases.d.ts +2 -0
- package/dist/lib/deploy/deploy-phases.d.ts.map +1 -1
- package/dist/lib/deploy/deploy-phases.js +9 -23
- package/dist/lib/deploy/deploy-phases.js.map +1 -1
- package/dist/lib/deploy/deploy-utils.d.ts +15 -7
- package/dist/lib/deploy/deploy-utils.d.ts.map +1 -1
- package/dist/lib/deploy/deploy-utils.js +49 -36
- package/dist/lib/deploy/deploy-utils.js.map +1 -1
- package/dist/lib/deploy/generate-manifest-files.d.ts.map +1 -1
- package/dist/lib/deploy/generate-manifest-files.js +13 -39
- package/dist/lib/deploy/generate-manifest-files.js.map +1 -1
- package/dist/lib/deploy/pack-project.d.ts.map +1 -1
- package/dist/lib/deploy/pack-project.js +34 -20
- package/dist/lib/deploy/pack-project.js.map +1 -1
- package/dist/lib/deploy/slot-manager.d.ts +54 -0
- package/dist/lib/deploy/slot-manager.d.ts.map +1 -0
- package/dist/lib/deploy/slot-manager.js +72 -0
- package/dist/lib/deploy/slot-manager.js.map +1 -0
- package/dist/lib/deploy/test-url-match-rules.d.ts +10 -2
- package/dist/lib/deploy/test-url-match-rules.d.ts.map +1 -1
- package/dist/lib/deploy/test-url-match-rules.js +1 -1
- package/dist/lib/deploy/test-url-match-rules.js.map +1 -1
- package/dist/lib/deploy/upload.d.ts +1 -0
- package/dist/lib/deploy/upload.d.ts.map +1 -1
- package/dist/lib/deploy/upload.js +15 -24
- package/dist/lib/deploy/upload.js.map +1 -1
- package/dist/lib/deploy/validation.d.ts.map +1 -1
- package/dist/lib/deploy/validation.js +43 -48
- package/dist/lib/deploy/validation.js.map +1 -1
- package/dist/lib/rsbuild/config-factory.d.ts.map +1 -1
- package/dist/lib/rsbuild/config-factory.js +10 -17
- package/dist/lib/rsbuild/config-factory.js.map +1 -1
- package/dist/lib/rsbuild/plugins/asset-versioning.d.ts.map +1 -1
- package/dist/lib/rsbuild/plugins/asset-versioning.js +4 -14
- package/dist/lib/rsbuild/plugins/asset-versioning.js.map +1 -1
- package/dist/lib/rsbuild/plugins/brotli-compression.d.ts.map +1 -1
- package/dist/lib/rsbuild/plugins/brotli-compression.js +4 -4
- package/dist/lib/rsbuild/plugins/brotli-compression.js.map +1 -1
- package/dist/lib/rsbuild/plugins/copy-public.d.ts.map +1 -1
- package/dist/lib/rsbuild/plugins/copy-public.js.map +1 -1
- package/dist/lib/rsbuild/postcss/tailwind-source-fallback.d.ts.map +1 -1
- package/dist/lib/rsbuild/postcss/tailwind-source-fallback.js +1 -3
- package/dist/lib/rsbuild/postcss/tailwind-source-fallback.js.map +1 -1
- package/dist/lib/utils/console.d.ts +8 -0
- package/dist/lib/utils/console.d.ts.map +1 -0
- package/dist/lib/utils/console.js +10 -0
- package/dist/lib/utils/console.js.map +1 -0
- package/dist/lib/utils/filesystem.d.ts +9 -0
- package/dist/lib/utils/filesystem.d.ts.map +1 -0
- package/dist/lib/utils/filesystem.js +30 -0
- package/dist/lib/utils/filesystem.js.map +1 -0
- package/dist/lib/utils/formatters.d.ts +8 -0
- package/dist/lib/utils/formatters.d.ts.map +1 -0
- package/dist/lib/utils/formatters.js +22 -0
- package/dist/lib/utils/formatters.js.map +1 -0
- package/dist/lib/utils/index.d.ts +7 -0
- package/dist/lib/utils/index.d.ts.map +1 -0
- package/dist/lib/utils/index.js +7 -0
- package/dist/lib/utils/index.js.map +1 -0
- package/dist/lib/utils/setup-runtime.d.ts.map +1 -1
- package/dist/lib/utils/setup-runtime.js +22 -63
- package/dist/lib/utils/setup-runtime.js.map +1 -1
- package/dist/schema/config.schema.d.ts +9 -48
- package/dist/schema/config.schema.d.ts.map +1 -1
- package/dist/schema/config.schema.js +119 -120
- package/dist/schema/config.schema.js.map +1 -1
- package/dist/sdk/hooks/mocks.d.ts +9 -0
- package/dist/sdk/hooks/mocks.d.ts.map +1 -0
- package/dist/sdk/hooks/mocks.js +17 -0
- package/dist/sdk/hooks/mocks.js.map +1 -0
- package/dist/sdk/hooks/use-audience-manager.d.ts +44 -0
- package/dist/sdk/hooks/use-audience-manager.d.ts.map +1 -0
- package/dist/sdk/hooks/use-audience-manager.js +109 -0
- package/dist/sdk/hooks/use-audience-manager.js.map +1 -0
- package/dist/sdk/hooks/use-ip.d.ts +45 -0
- package/dist/sdk/hooks/use-ip.d.ts.map +1 -0
- package/dist/sdk/hooks/use-ip.js +46 -0
- package/dist/sdk/hooks/use-ip.js.map +1 -0
- package/dist/sdk/hooks/use-sdk-request.d.ts +46 -0
- package/dist/sdk/hooks/use-sdk-request.d.ts.map +1 -0
- package/dist/sdk/hooks/use-sdk-request.js +65 -0
- package/dist/sdk/hooks/use-sdk-request.js.map +1 -0
- package/dist/sdk/hooks/use-theme.d.ts +45 -0
- package/dist/sdk/hooks/use-theme.d.ts.map +1 -0
- package/dist/sdk/hooks/use-theme.js +97 -0
- package/dist/sdk/hooks/use-theme.js.map +1 -0
- package/dist/sdk/hooks/use-visitor.d.ts +41 -0
- package/dist/sdk/hooks/use-visitor.d.ts.map +1 -0
- package/dist/sdk/hooks/use-visitor.js +42 -0
- package/dist/sdk/hooks/use-visitor.js.map +1 -0
- package/dist/sdk/hooks/validation.d.ts +8 -0
- package/dist/sdk/hooks/validation.d.ts.map +1 -0
- package/dist/sdk/hooks/validation.js +13 -0
- package/dist/sdk/hooks/validation.js.map +1 -0
- package/dist/sdk/index.d.ts +17 -5
- package/dist/sdk/index.d.ts.map +1 -1
- package/dist/sdk/index.js +16 -5
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/message-bus.d.ts +59 -0
- package/dist/sdk/message-bus.d.ts.map +1 -0
- package/dist/sdk/message-bus.js +152 -0
- package/dist/sdk/message-bus.js.map +1 -0
- package/dist/sdk/messages.d.ts +121 -0
- package/dist/sdk/messages.d.ts.map +1 -0
- package/dist/sdk/messages.js +9 -0
- package/dist/sdk/messages.js.map +1 -0
- package/dist/sdk/send-message.d.ts +1 -1
- package/dist/sdk/send-message.js +18 -18
- package/dist/sdk/send-message.js.map +1 -1
- package/dist/sdk/use-expand-link-app.d.ts +3 -3
- package/dist/sdk/use-expand-link-app.d.ts.map +1 -1
- package/dist/sdk/use-expand-link-app.js +9 -5
- package/dist/sdk/use-expand-link-app.js.map +1 -1
- package/dist/types.d.ts +235 -55
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +8 -3
- package/dist/types.js.map +1 -1
- package/package.json +3 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-ip.d.ts","sourceRoot":"","sources":["../../../src/sdk/hooks/use-ip.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAqB,MAAM,gBAAgB,CAAA;AAI/D,MAAM,WAAW,WAAW;IAC1B,2DAA2D;IAC3D,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;IACjB,yCAAyC;IACzC,SAAS,EAAE,OAAO,CAAA;IAClB,kCAAkC;IAClC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,+BAA+B;IAC/B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7B;AAID;;;;;;;GAOG;AACH,wBAAgB,KAAK,IAAI,WAAW,CAUnC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useIP hook - Request and access IP/geolocation data from the parent profile page
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```tsx
|
|
6
|
+
* import { useIP } from '@linktr.ee/linkapp/sdk'
|
|
7
|
+
*
|
|
8
|
+
* function MyComponent() {
|
|
9
|
+
* const { ip, isLoading, error } = useIP()
|
|
10
|
+
* const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone
|
|
11
|
+
*
|
|
12
|
+
* if (isLoading) return <div>Loading...</div>
|
|
13
|
+
* if (error) return <div>Error: {error.message}</div>
|
|
14
|
+
*
|
|
15
|
+
* return (
|
|
16
|
+
* <div>
|
|
17
|
+
* <p>Country: {ip?.countryCode}</p>
|
|
18
|
+
* <p>City: {ip?.city}</p>
|
|
19
|
+
* <p>Timezone: {timezone}</p>
|
|
20
|
+
* </div>
|
|
21
|
+
* )
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
import { MOCK_IP } from './mocks.js';
|
|
26
|
+
import { useSDKRequest } from './use-sdk-request.js';
|
|
27
|
+
const extractIP = (response) => response.payload.ip;
|
|
28
|
+
/**
|
|
29
|
+
* Hook to request and access IP/geolocation data from the parent profile page
|
|
30
|
+
*
|
|
31
|
+
* Sends REQUEST_IP message on mount and stores the response.
|
|
32
|
+
* In dev mode (not in iframe), returns mock data.
|
|
33
|
+
*
|
|
34
|
+
* Note: For timezone, use `Intl.DateTimeFormat().resolvedOptions().timeZone` directly.
|
|
35
|
+
*/
|
|
36
|
+
export function useIP() {
|
|
37
|
+
const { data, isLoading, error, refetch } = useSDKRequest({
|
|
38
|
+
requestType: 'REQUEST_IP',
|
|
39
|
+
responseType: 'IP_RESPONSE',
|
|
40
|
+
extractData: extractIP,
|
|
41
|
+
mockData: MOCK_IP,
|
|
42
|
+
errorMessage: 'Failed to fetch IP data',
|
|
43
|
+
});
|
|
44
|
+
return { ip: data, isLoading, error, refetch };
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=use-ip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-ip.js","sourceRoot":"","sources":["../../../src/sdk/hooks/use-ip.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAapD,MAAM,SAAS,GAAG,CAAC,QAA2B,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAA;AAEtE;;;;;;;GAOG;AACH,MAAM,UAAU,KAAK;IACnB,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,aAAa,CAA4B;QACnF,WAAW,EAAE,YAAY;QACzB,YAAY,EAAE,aAAa;QAC3B,WAAW,EAAE,SAAS;QACtB,QAAQ,EAAE,OAAO;QACjB,YAAY,EAAE,yBAAyB;KACxC,CAAC,CAAA;IAEF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;AAChD,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic hook for SDK request-response pattern
|
|
3
|
+
*
|
|
4
|
+
* Handles:
|
|
5
|
+
* - Loading/error state management
|
|
6
|
+
* - Dev mode detection with mock data fallback
|
|
7
|
+
* - Request-response correlation via messageBus
|
|
8
|
+
* - Refetch capability
|
|
9
|
+
*/
|
|
10
|
+
import type { LinkAppToParentMessage, ParentMessageType, ParentToLinkAppMessage } from '../messages.js';
|
|
11
|
+
export interface UseSDKRequestResult<T> {
|
|
12
|
+
data: T | null;
|
|
13
|
+
isLoading: boolean;
|
|
14
|
+
error: Error | null;
|
|
15
|
+
refetch: () => Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
interface UseSDKRequestOptions<TData, TResponse extends ParentToLinkAppMessage> {
|
|
18
|
+
/** Request message type (e.g., "REQUEST_VISITOR") */
|
|
19
|
+
requestType: LinkAppToParentMessage['type'];
|
|
20
|
+
/** Expected response message type (e.g., "VISITOR_RESPONSE") */
|
|
21
|
+
responseType: ParentMessageType;
|
|
22
|
+
/** Extract data from response payload */
|
|
23
|
+
extractData: (response: TResponse) => TData;
|
|
24
|
+
/** Mock data for dev mode (when not in iframe) */
|
|
25
|
+
mockData: TData;
|
|
26
|
+
/** Request timeout in ms (default: 10000) */
|
|
27
|
+
timeout?: number;
|
|
28
|
+
/** Error message prefix */
|
|
29
|
+
errorMessage?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Generic hook for making SDK requests to parent window
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* const { data: visitor, isLoading, error } = useSDKRequest({
|
|
37
|
+
* requestType: "REQUEST_VISITOR",
|
|
38
|
+
* responseType: "VISITOR_RESPONSE",
|
|
39
|
+
* extractData: (res) => res.payload.visitor,
|
|
40
|
+
* mockData: { mobileDetected: false, ... },
|
|
41
|
+
* });
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare function useSDKRequest<TData, TResponse extends ParentToLinkAppMessage>(options: UseSDKRequestOptions<TData, TResponse>): UseSDKRequestResult<TData>;
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=use-sdk-request.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-sdk-request.d.ts","sourceRoot":"","sources":["../../../src/sdk/hooks/use-sdk-request.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AAEvG,MAAM,WAAW,mBAAmB,CAAC,CAAC;IACpC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAA;IACd,SAAS,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7B;AAED,UAAU,oBAAoB,CAAC,KAAK,EAAE,SAAS,SAAS,sBAAsB;IAC5E,qDAAqD;IACrD,WAAW,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAA;IAC3C,gEAAgE;IAChE,YAAY,EAAE,iBAAiB,CAAA;IAC/B,yCAAyC;IACzC,WAAW,EAAE,CAAC,QAAQ,EAAE,SAAS,KAAK,KAAK,CAAA;IAC3C,kDAAkD;IAClD,QAAQ,EAAE,KAAK,CAAA;IACf,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2BAA2B;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,SAAS,sBAAsB,EAC3E,OAAO,EAAE,oBAAoB,CAAC,KAAK,EAAE,SAAS,CAAC,GAC9C,mBAAmB,CAAC,KAAK,CAAC,CAgD5B"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic hook for SDK request-response pattern
|
|
3
|
+
*
|
|
4
|
+
* Handles:
|
|
5
|
+
* - Loading/error state management
|
|
6
|
+
* - Dev mode detection with mock data fallback
|
|
7
|
+
* - Request-response correlation via messageBus
|
|
8
|
+
* - Refetch capability
|
|
9
|
+
*/
|
|
10
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
11
|
+
import { messageBus } from '../message-bus.js';
|
|
12
|
+
/**
|
|
13
|
+
* Generic hook for making SDK requests to parent window
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* const { data: visitor, isLoading, error } = useSDKRequest({
|
|
18
|
+
* requestType: "REQUEST_VISITOR",
|
|
19
|
+
* responseType: "VISITOR_RESPONSE",
|
|
20
|
+
* extractData: (res) => res.payload.visitor,
|
|
21
|
+
* mockData: { mobileDetected: false, ... },
|
|
22
|
+
* });
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export function useSDKRequest(options) {
|
|
26
|
+
const { requestType, responseType, extractData, mockData, timeout = 10000, errorMessage = 'Request failed' } = options;
|
|
27
|
+
const [data, setData] = useState(null);
|
|
28
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
29
|
+
const [error, setError] = useState(null);
|
|
30
|
+
const fetch = useCallback(async () => {
|
|
31
|
+
// Dev mode: not in iframe, return mock data
|
|
32
|
+
if (!messageBus.isInIframe()) {
|
|
33
|
+
setData(mockData);
|
|
34
|
+
setIsLoading(false);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
setIsLoading(true);
|
|
39
|
+
setError(null);
|
|
40
|
+
const requestId = messageBus.generateRequestId();
|
|
41
|
+
const response = await messageBus.request({
|
|
42
|
+
source: 'linkapp',
|
|
43
|
+
type: requestType,
|
|
44
|
+
payload: { requestId },
|
|
45
|
+
}, responseType, timeout);
|
|
46
|
+
setData(extractData(response));
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
setError(err instanceof Error ? err : new Error(errorMessage));
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
setIsLoading(false);
|
|
53
|
+
}
|
|
54
|
+
}, [requestType, responseType, extractData, mockData, timeout, errorMessage]);
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
void fetch();
|
|
57
|
+
}, [fetch]);
|
|
58
|
+
return {
|
|
59
|
+
data,
|
|
60
|
+
isLoading,
|
|
61
|
+
error,
|
|
62
|
+
refetch: fetch,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=use-sdk-request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-sdk-request.js","sourceRoot":"","sources":["../../../src/sdk/hooks/use-sdk-request.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAyB9C;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,aAAa,CAC3B,OAA+C;IAE/C,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,GAAG,KAAK,EAAE,YAAY,GAAG,gBAAgB,EAAE,GAAG,OAAO,CAAA;IAEtH,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAA;IACpD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAChD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAA;IAEtD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACnC,4CAA4C;QAC5C,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC;YAC7B,OAAO,CAAC,QAAQ,CAAC,CAAA;YACjB,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,OAAM;QACR,CAAC;QAED,IAAI,CAAC;YACH,YAAY,CAAC,IAAI,CAAC,CAAA;YAClB,QAAQ,CAAC,IAAI,CAAC,CAAA;YAEd,MAAM,SAAS,GAAG,UAAU,CAAC,iBAAiB,EAAE,CAAA;YAChD,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,OAAO,CACvC;gBACE,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,EAAE,SAAS,EAAE;aACG,EAC3B,YAAY,EACZ,OAAO,CACR,CAAA;YAED,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAA;QAChC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAA;QAChE,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAA;QACrB,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAA;IAE7E,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,KAAK,EAAE,CAAA;IACd,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;IAEX,OAAO;QACL,IAAI;QACJ,SAAS;QACT,KAAK;QACL,OAAO,EAAE,KAAK;KACf,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useTheme hook - Request and access theme data from the parent profile page
|
|
3
|
+
*
|
|
4
|
+
* Also subscribes to THEME_UPDATE messages for real-time theme changes.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```tsx
|
|
8
|
+
* import { useTheme } from '@linktr.ee/linkapp/sdk'
|
|
9
|
+
*
|
|
10
|
+
* function MyComponent() {
|
|
11
|
+
* const { theme, isLoading, applyToDocument } = useTheme()
|
|
12
|
+
*
|
|
13
|
+
* if (isLoading) return <div>Loading...</div>
|
|
14
|
+
*
|
|
15
|
+
* return (
|
|
16
|
+
* <div style={{ color: theme?.textColor }}>
|
|
17
|
+
* <p>Theme loaded</p>
|
|
18
|
+
* <button onClick={applyToDocument}>Apply to document</button>
|
|
19
|
+
* </div>
|
|
20
|
+
* )
|
|
21
|
+
* }
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
import type { ThemeData } from "../messages.js";
|
|
25
|
+
export interface UseThemeResult {
|
|
26
|
+
/** Theme data, null if not yet loaded or error */
|
|
27
|
+
theme: ThemeData | null;
|
|
28
|
+
/** Whether the initial request is in progress */
|
|
29
|
+
isLoading: boolean;
|
|
30
|
+
/** Error if the request failed */
|
|
31
|
+
error: Error | null;
|
|
32
|
+
/** Apply theme CSS variables to the document root */
|
|
33
|
+
applyToDocument: () => void;
|
|
34
|
+
/** Manually refetch theme data */
|
|
35
|
+
refetch: () => Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Hook to request and access theme data from the parent profile page
|
|
39
|
+
*
|
|
40
|
+
* Sends REQUEST_THEME message on mount and stores the response.
|
|
41
|
+
* Also subscribes to THEME_UPDATE for real-time theme changes.
|
|
42
|
+
* In dev mode (not in iframe), returns default theme data.
|
|
43
|
+
*/
|
|
44
|
+
export declare function useTheme(): UseThemeResult;
|
|
45
|
+
//# sourceMappingURL=use-theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-theme.d.ts","sourceRoot":"","sources":["../../../src/sdk/hooks/use-theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,OAAO,KAAK,EAAE,SAAS,EAA4C,MAAM,gBAAgB,CAAC;AAI1F,MAAM,WAAW,cAAc;IAC7B,kDAAkD;IAClD,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,iDAAiD;IACjD,SAAS,EAAE,OAAO,CAAC;IACnB,kCAAkC;IAClC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,qDAAqD;IACrD,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,kCAAkC;IAClC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAyBD;;;;;;GAMG;AACH,wBAAgB,QAAQ,IAAI,cAAc,CAqDzC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useTheme hook - Request and access theme data from the parent profile page
|
|
3
|
+
*
|
|
4
|
+
* Also subscribes to THEME_UPDATE messages for real-time theme changes.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```tsx
|
|
8
|
+
* import { useTheme } from '@linktr.ee/linkapp/sdk'
|
|
9
|
+
*
|
|
10
|
+
* function MyComponent() {
|
|
11
|
+
* const { theme, isLoading, applyToDocument } = useTheme()
|
|
12
|
+
*
|
|
13
|
+
* if (isLoading) return <div>Loading...</div>
|
|
14
|
+
*
|
|
15
|
+
* return (
|
|
16
|
+
* <div style={{ color: theme?.textColor }}>
|
|
17
|
+
* <p>Theme loaded</p>
|
|
18
|
+
* <button onClick={applyToDocument}>Apply to document</button>
|
|
19
|
+
* </div>
|
|
20
|
+
* )
|
|
21
|
+
* }
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
import { useCallback, useEffect, useState } from "react";
|
|
25
|
+
import { messageBus } from "../message-bus.js";
|
|
26
|
+
import { MOCK_THEME } from "./mocks.js";
|
|
27
|
+
import { useSDKRequest } from "./use-sdk-request.js";
|
|
28
|
+
/** Apply CSS variables to document root */
|
|
29
|
+
function applyCSSVariables(variables) {
|
|
30
|
+
if (typeof document === "undefined")
|
|
31
|
+
return;
|
|
32
|
+
const root = document.documentElement;
|
|
33
|
+
for (const [key, value] of Object.entries(variables)) {
|
|
34
|
+
root.style.setProperty(key, value);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** Extract legacy theme properties from CSS variables */
|
|
38
|
+
function extractLegacyProps(variables, fallback) {
|
|
39
|
+
return {
|
|
40
|
+
textColor: variables["--button-style-text"] || fallback.textColor,
|
|
41
|
+
backgroundColor: variables["--button-style-background"] || fallback.backgroundColor,
|
|
42
|
+
borderRadius: variables["--button-style-inner-radius"] || fallback.borderRadius,
|
|
43
|
+
borderColor: variables["--button-style-border-color"] || fallback.borderColor,
|
|
44
|
+
backgroundHover: variables["--button-style-background-hover"] || fallback.backgroundHover,
|
|
45
|
+
contrastColor: variables["--button-style-contrast-color"] || fallback.contrastColor,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const extractTheme = (response) => response.payload.theme;
|
|
49
|
+
/**
|
|
50
|
+
* Hook to request and access theme data from the parent profile page
|
|
51
|
+
*
|
|
52
|
+
* Sends REQUEST_THEME message on mount and stores the response.
|
|
53
|
+
* Also subscribes to THEME_UPDATE for real-time theme changes.
|
|
54
|
+
* In dev mode (not in iframe), returns default theme data.
|
|
55
|
+
*/
|
|
56
|
+
export function useTheme() {
|
|
57
|
+
const [liveTheme, setLiveTheme] = useState(null);
|
|
58
|
+
const { data: initialTheme, isLoading, error, refetch, } = useSDKRequest({
|
|
59
|
+
requestType: "REQUEST_THEME",
|
|
60
|
+
responseType: "THEME_RESPONSE",
|
|
61
|
+
extractData: extractTheme,
|
|
62
|
+
mockData: MOCK_THEME,
|
|
63
|
+
errorMessage: "Failed to fetch theme data",
|
|
64
|
+
});
|
|
65
|
+
// Use live theme if available, otherwise initial theme
|
|
66
|
+
const theme = liveTheme ?? initialTheme;
|
|
67
|
+
const applyToDocument = useCallback(() => {
|
|
68
|
+
if (theme?.cssVariables) {
|
|
69
|
+
applyCSSVariables(theme.cssVariables);
|
|
70
|
+
}
|
|
71
|
+
}, [theme]);
|
|
72
|
+
// Subscribe to theme updates from parent
|
|
73
|
+
useEffect(() => {
|
|
74
|
+
const unsubscribe = messageBus.on("THEME_UPDATE", (message) => {
|
|
75
|
+
const variables = message.payload.variables;
|
|
76
|
+
setLiveTheme((prev) => {
|
|
77
|
+
const base = prev ?? initialTheme ?? MOCK_THEME;
|
|
78
|
+
return {
|
|
79
|
+
...base,
|
|
80
|
+
cssVariables: variables,
|
|
81
|
+
...extractLegacyProps(variables, base),
|
|
82
|
+
};
|
|
83
|
+
});
|
|
84
|
+
// Auto-apply to document
|
|
85
|
+
applyCSSVariables(variables);
|
|
86
|
+
});
|
|
87
|
+
return unsubscribe;
|
|
88
|
+
}, [initialTheme]);
|
|
89
|
+
return {
|
|
90
|
+
theme,
|
|
91
|
+
isLoading,
|
|
92
|
+
error,
|
|
93
|
+
applyToDocument,
|
|
94
|
+
refetch,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=use-theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-theme.js","sourceRoot":"","sources":["../../../src/sdk/hooks/use-theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAerD,2CAA2C;AAC3C,SAAS,iBAAiB,CAAC,SAAiC;IAC1D,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO;IAC5C,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAC;IACtC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,yDAAyD;AACzD,SAAS,kBAAkB,CAAC,SAAiC,EAAE,QAAmB;IAChF,OAAO;QACL,SAAS,EAAE,SAAS,CAAC,qBAAqB,CAAC,IAAI,QAAQ,CAAC,SAAS;QACjE,eAAe,EAAE,SAAS,CAAC,2BAA2B,CAAC,IAAI,QAAQ,CAAC,eAAe;QACnF,YAAY,EAAE,SAAS,CAAC,6BAA6B,CAAC,IAAI,QAAQ,CAAC,YAAY;QAC/E,WAAW,EAAE,SAAS,CAAC,6BAA6B,CAAC,IAAI,QAAQ,CAAC,WAAW;QAC7E,eAAe,EAAE,SAAS,CAAC,iCAAiC,CAAC,IAAI,QAAQ,CAAC,eAAe;QACzF,aAAa,EAAE,SAAS,CAAC,+BAA+B,CAAC,IAAI,QAAQ,CAAC,aAAa;KACpF,CAAC;AACJ,CAAC;AAED,MAAM,YAAY,GAAG,CAAC,QAA8B,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;AAEhF;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ;IACtB,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAmB,IAAI,CAAC,CAAC;IAEnE,MAAM,EACJ,IAAI,EAAE,YAAY,EAClB,SAAS,EACT,KAAK,EACL,OAAO,GACR,GAAG,aAAa,CAAkC;QACjD,WAAW,EAAE,eAAe;QAC5B,YAAY,EAAE,gBAAgB;QAC9B,WAAW,EAAE,YAAY;QACzB,QAAQ,EAAE,UAAU;QACpB,YAAY,EAAE,4BAA4B;KAC3C,CAAC,CAAC;IAEH,uDAAuD;IACvD,MAAM,KAAK,GAAG,SAAS,IAAI,YAAY,CAAC;IAExC,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QACvC,IAAI,KAAK,EAAE,YAAY,EAAE,CAAC;YACxB,iBAAiB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACxC,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,yCAAyC;IACzC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,WAAW,GAAG,UAAU,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,OAA2B,EAAE,EAAE;YAChF,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;YAE5C,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE;gBACpB,MAAM,IAAI,GAAG,IAAI,IAAI,YAAY,IAAI,UAAU,CAAC;gBAChD,OAAO;oBACL,GAAG,IAAI;oBACP,YAAY,EAAE,SAAS;oBACvB,GAAG,kBAAkB,CAAC,SAAS,EAAE,IAAI,CAAC;iBACvC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,yBAAyB;YACzB,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,OAAO,WAAW,CAAC;IACrB,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,OAAO;QACL,KAAK;QACL,SAAS;QACT,KAAK;QACL,eAAe;QACf,OAAO;KACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useVisitor hook - Request and access visitor data from the parent profile page
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```tsx
|
|
6
|
+
* import { useVisitor } from '@linktr.ee/linkapp/sdk'
|
|
7
|
+
*
|
|
8
|
+
* function MyComponent() {
|
|
9
|
+
* const { visitor, isLoading, error } = useVisitor()
|
|
10
|
+
*
|
|
11
|
+
* if (isLoading) return <div>Loading...</div>
|
|
12
|
+
* if (error) return <div>Error: {error.message}</div>
|
|
13
|
+
*
|
|
14
|
+
* return (
|
|
15
|
+
* <div>
|
|
16
|
+
* {visitor?.mobileDetected && <p>You're on mobile</p>}
|
|
17
|
+
* {visitor?.isFollowing && <p>Thanks for following!</p>}
|
|
18
|
+
* </div>
|
|
19
|
+
* )
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
import type { VisitorData } from '../messages.js';
|
|
24
|
+
export interface UseVisitorResult {
|
|
25
|
+
/** Visitor data, null if not yet loaded or error */
|
|
26
|
+
visitor: VisitorData | null;
|
|
27
|
+
/** Whether the request is in progress */
|
|
28
|
+
isLoading: boolean;
|
|
29
|
+
/** Error if the request failed */
|
|
30
|
+
error: Error | null;
|
|
31
|
+
/** Manually refetch visitor data */
|
|
32
|
+
refetch: () => Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Hook to request and access visitor data from the parent profile page
|
|
36
|
+
*
|
|
37
|
+
* Sends REQUEST_VISITOR message on mount and stores the response.
|
|
38
|
+
* In dev mode (not in iframe), returns mock data.
|
|
39
|
+
*/
|
|
40
|
+
export declare function useVisitor(): UseVisitorResult;
|
|
41
|
+
//# sourceMappingURL=use-visitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-visitor.d.ts","sourceRoot":"","sources":["../../../src/sdk/hooks/use-visitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAA0B,MAAM,gBAAgB,CAAA;AAIzE,MAAM,WAAW,gBAAgB;IAC/B,oDAAoD;IACpD,OAAO,EAAE,WAAW,GAAG,IAAI,CAAA;IAC3B,yCAAyC;IACzC,SAAS,EAAE,OAAO,CAAA;IAClB,kCAAkC;IAClC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,oCAAoC;IACpC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7B;AAID;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI,gBAAgB,CAU7C"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useVisitor hook - Request and access visitor data from the parent profile page
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```tsx
|
|
6
|
+
* import { useVisitor } from '@linktr.ee/linkapp/sdk'
|
|
7
|
+
*
|
|
8
|
+
* function MyComponent() {
|
|
9
|
+
* const { visitor, isLoading, error } = useVisitor()
|
|
10
|
+
*
|
|
11
|
+
* if (isLoading) return <div>Loading...</div>
|
|
12
|
+
* if (error) return <div>Error: {error.message}</div>
|
|
13
|
+
*
|
|
14
|
+
* return (
|
|
15
|
+
* <div>
|
|
16
|
+
* {visitor?.mobileDetected && <p>You're on mobile</p>}
|
|
17
|
+
* {visitor?.isFollowing && <p>Thanks for following!</p>}
|
|
18
|
+
* </div>
|
|
19
|
+
* )
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
import { MOCK_VISITOR } from './mocks.js';
|
|
24
|
+
import { useSDKRequest } from './use-sdk-request.js';
|
|
25
|
+
const extractVisitor = (response) => response.payload.visitor;
|
|
26
|
+
/**
|
|
27
|
+
* Hook to request and access visitor data from the parent profile page
|
|
28
|
+
*
|
|
29
|
+
* Sends REQUEST_VISITOR message on mount and stores the response.
|
|
30
|
+
* In dev mode (not in iframe), returns mock data.
|
|
31
|
+
*/
|
|
32
|
+
export function useVisitor() {
|
|
33
|
+
const { data, isLoading, error, refetch } = useSDKRequest({
|
|
34
|
+
requestType: 'REQUEST_VISITOR',
|
|
35
|
+
responseType: 'VISITOR_RESPONSE',
|
|
36
|
+
extractData: extractVisitor,
|
|
37
|
+
mockData: MOCK_VISITOR,
|
|
38
|
+
errorMessage: 'Failed to fetch visitor data',
|
|
39
|
+
});
|
|
40
|
+
return { visitor: data, isLoading, error, refetch };
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=use-visitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-visitor.js","sourceRoot":"","sources":["../../../src/sdk/hooks/use-visitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAapD,MAAM,cAAc,GAAG,CAAC,QAAgC,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAA;AAErF;;;;;GAKG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,aAAa,CAAsC;QAC7F,WAAW,EAAE,iBAAiB;QAC9B,YAAY,EAAE,kBAAkB;QAChC,WAAW,EAAE,cAAc;QAC3B,QAAQ,EAAE,YAAY;QACtB,YAAY,EAAE,8BAA8B;KAC7C,CAAC,CAAA;IAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;AACrD,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation utilities for SDK hooks
|
|
3
|
+
*/
|
|
4
|
+
/** Validate email format */
|
|
5
|
+
export declare function isValidEmail(email: string): boolean;
|
|
6
|
+
/** Simulated delay for dev mode */
|
|
7
|
+
export declare function devDelay(ms?: number): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/sdk/hooks/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,4BAA4B;AAC5B,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,mCAAmC;AACnC,wBAAgB,QAAQ,CAAC,EAAE,SAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhD"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation utilities for SDK hooks
|
|
3
|
+
*/
|
|
4
|
+
const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
5
|
+
/** Validate email format */
|
|
6
|
+
export function isValidEmail(email) {
|
|
7
|
+
return EMAIL_REGEX.test(email);
|
|
8
|
+
}
|
|
9
|
+
/** Simulated delay for dev mode */
|
|
10
|
+
export function devDelay(ms = 500) {
|
|
11
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/sdk/hooks/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,GAAG,4BAA4B,CAAA;AAEhD,4BAA4B;AAC5B,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAChC,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,QAAQ,CAAC,EAAE,GAAG,GAAG;IAC/B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AAC1D,CAAC"}
|
package/dist/sdk/index.d.ts
CHANGED
|
@@ -3,19 +3,31 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @example
|
|
5
5
|
* ```tsx
|
|
6
|
-
* import { useExpandLinkApp } from '@linktr.ee/linkapp/sdk'
|
|
6
|
+
* import { useExpandLinkApp, useVisitor, useAudienceManager } from '@linktr.ee/linkapp/sdk'
|
|
7
7
|
*
|
|
8
8
|
* function FeaturedLayout() {
|
|
9
9
|
* const expandLinkApp = useExpandLinkApp()
|
|
10
|
+
* const { visitor } = useVisitor()
|
|
11
|
+
* const { subscribe, isSubscribing } = useAudienceManager()
|
|
10
12
|
*
|
|
11
13
|
* return (
|
|
12
|
-
* <
|
|
13
|
-
*
|
|
14
|
-
*
|
|
14
|
+
* <div>
|
|
15
|
+
* {visitor?.isFollowing && <p>Thanks for following!</p>}
|
|
16
|
+
* <button onClick={() => expandLinkApp({ itemId: '123' })}>
|
|
17
|
+
* View More
|
|
18
|
+
* </button>
|
|
19
|
+
* </div>
|
|
15
20
|
* )
|
|
16
21
|
* }
|
|
17
22
|
* ```
|
|
18
23
|
*/
|
|
19
24
|
export { useExpandLinkApp } from './use-expand-link-app.js';
|
|
20
|
-
export {
|
|
25
|
+
export { messageBus } from './message-bus.js';
|
|
26
|
+
export { useVisitor } from './hooks/use-visitor.js';
|
|
27
|
+
export { useIP } from './hooks/use-ip.js';
|
|
28
|
+
export { useAudienceManager } from './hooks/use-audience-manager.js';
|
|
29
|
+
export type { UseVisitorResult } from './hooks/use-visitor.js';
|
|
30
|
+
export type { UseIPResult } from './hooks/use-ip.js';
|
|
31
|
+
export type { UseAudienceManagerResult } from './hooks/use-audience-manager.js';
|
|
32
|
+
export type { VisitorData, IPData, SubscribeResult, RequestId, LinkAppToParentMessage, ParentToLinkAppMessage, } from './messages.js';
|
|
21
33
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/sdk/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAG3D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAG7C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAGpE,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,YAAY,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAA;AAE/E,YAAY,EACV,WAAW,EACX,MAAM,EACN,eAAe,EACf,SAAS,EACT,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,eAAe,CAAA"}
|
package/dist/sdk/index.js
CHANGED
|
@@ -3,19 +3,30 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @example
|
|
5
5
|
* ```tsx
|
|
6
|
-
* import { useExpandLinkApp } from '@linktr.ee/linkapp/sdk'
|
|
6
|
+
* import { useExpandLinkApp, useVisitor, useAudienceManager } from '@linktr.ee/linkapp/sdk'
|
|
7
7
|
*
|
|
8
8
|
* function FeaturedLayout() {
|
|
9
9
|
* const expandLinkApp = useExpandLinkApp()
|
|
10
|
+
* const { visitor } = useVisitor()
|
|
11
|
+
* const { subscribe, isSubscribing } = useAudienceManager()
|
|
10
12
|
*
|
|
11
13
|
* return (
|
|
12
|
-
* <
|
|
13
|
-
*
|
|
14
|
-
*
|
|
14
|
+
* <div>
|
|
15
|
+
* {visitor?.isFollowing && <p>Thanks for following!</p>}
|
|
16
|
+
* <button onClick={() => expandLinkApp({ itemId: '123' })}>
|
|
17
|
+
* View More
|
|
18
|
+
* </button>
|
|
19
|
+
* </div>
|
|
15
20
|
* )
|
|
16
21
|
* }
|
|
17
22
|
* ```
|
|
18
23
|
*/
|
|
24
|
+
// Core hooks
|
|
19
25
|
export { useExpandLinkApp } from './use-expand-link-app.js';
|
|
20
|
-
|
|
26
|
+
// Message bus for advanced usage
|
|
27
|
+
export { messageBus } from './message-bus.js';
|
|
28
|
+
// New hooks for visitor, IP, and audience manager
|
|
29
|
+
export { useVisitor } from './hooks/use-visitor.js';
|
|
30
|
+
export { useIP } from './hooks/use-ip.js';
|
|
31
|
+
export { useAudienceManager } from './hooks/use-audience-manager.js';
|
|
21
32
|
//# sourceMappingURL=index.js.map
|
package/dist/sdk/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,aAAa;AACb,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAE3D,iCAAiC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,kDAAkD;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MessageBus for bidirectional communication between LinkApp iframe and parent window
|
|
3
|
+
*
|
|
4
|
+
* Provides:
|
|
5
|
+
* - send(message): Fire-and-forget message to parent
|
|
6
|
+
* - request<T>(message, timeout): Send request and await response with correlation
|
|
7
|
+
* - on(type, handler): Subscribe to incoming message types
|
|
8
|
+
*/
|
|
9
|
+
import type { LinkAppToParentMessage, ParentMessageType, ParentToLinkAppMessage, RequestId } from './messages.js';
|
|
10
|
+
type MessageHandler<T extends ParentToLinkAppMessage> = (message: T) => void;
|
|
11
|
+
/**
|
|
12
|
+
* Singleton message bus for LinkApp SDK communication
|
|
13
|
+
*/
|
|
14
|
+
declare class LinkAppMessageBus {
|
|
15
|
+
private handlers;
|
|
16
|
+
private pendingRequests;
|
|
17
|
+
private listenerAttached;
|
|
18
|
+
constructor();
|
|
19
|
+
private setupMessageListener;
|
|
20
|
+
private handleMessage;
|
|
21
|
+
/**
|
|
22
|
+
* Check if running inside an iframe
|
|
23
|
+
*/
|
|
24
|
+
isInIframe(): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Generate a unique request ID for correlation
|
|
27
|
+
*/
|
|
28
|
+
generateRequestId(): RequestId;
|
|
29
|
+
/**
|
|
30
|
+
* Send a message to the parent window (fire-and-forget)
|
|
31
|
+
*/
|
|
32
|
+
send(message: LinkAppToParentMessage): void;
|
|
33
|
+
/**
|
|
34
|
+
* Send a request and await the response
|
|
35
|
+
*
|
|
36
|
+
* @param message - The request message to send
|
|
37
|
+
* @param responseType - The expected response message type
|
|
38
|
+
* @param timeoutMs - Timeout in milliseconds (default: 10000)
|
|
39
|
+
* @returns Promise that resolves with the response message
|
|
40
|
+
*/
|
|
41
|
+
request<T extends ParentToLinkAppMessage>(message: LinkAppToParentMessage, responseType: ParentMessageType, timeoutMs?: number): Promise<T>;
|
|
42
|
+
/**
|
|
43
|
+
* Subscribe to a specific message type from parent
|
|
44
|
+
*
|
|
45
|
+
* @param type - The message type to listen for
|
|
46
|
+
* @param handler - Callback function when message is received
|
|
47
|
+
* @returns Unsubscribe function
|
|
48
|
+
*/
|
|
49
|
+
on<T extends ParentMessageType>(type: T, handler: MessageHandler<Extract<ParentToLinkAppMessage, {
|
|
50
|
+
type: T;
|
|
51
|
+
}>>): () => void;
|
|
52
|
+
/**
|
|
53
|
+
* Clear all pending requests (for testing)
|
|
54
|
+
*/
|
|
55
|
+
clearPendingRequests(): void;
|
|
56
|
+
}
|
|
57
|
+
export declare const messageBus: LinkAppMessageBus;
|
|
58
|
+
export {};
|
|
59
|
+
//# sourceMappingURL=message-bus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-bus.d.ts","sourceRoot":"","sources":["../../src/sdk/message-bus.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAEjH,KAAK,cAAc,CAAC,CAAC,SAAS,sBAAsB,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,CAAA;AAS5E;;GAEG;AACH,cAAM,iBAAiB;IACrB,OAAO,CAAC,QAAQ,CAAyD;IACzE,OAAO,CAAC,eAAe,CAA4C;IACnE,OAAO,CAAC,gBAAgB,CAAQ;;IAQhC,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,aAAa;IA0CrB;;OAEG;IACH,UAAU,IAAI,OAAO;IAKrB;;OAEG;IACH,iBAAiB,IAAI,SAAS;IAI9B;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI;IAc3C;;;;;;;OAOG;IACG,OAAO,CAAC,CAAC,SAAS,sBAAsB,EAC5C,OAAO,EAAE,sBAAsB,EAC/B,YAAY,EAAE,iBAAiB,EAC/B,SAAS,SAAQ,GAChB,OAAO,CAAC,CAAC,CAAC;IA+Bb;;;;;;OAMG;IACH,EAAE,CAAC,CAAC,SAAS,iBAAiB,EAC5B,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,sBAAsB,EAAE;QAAE,IAAI,EAAE,CAAC,CAAA;KAAE,CAAC,CAAC,GACpE,MAAM,IAAI;IAYb;;OAEG;IACH,oBAAoB,IAAI,IAAI;CAM7B;AAGD,eAAO,MAAM,UAAU,mBAA0B,CAAA"}
|