@shware/analytics 3.6.4 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -3
- package/dist/_virtual/_rolldown/runtime.cjs +23 -0
- package/dist/constants/storage.cjs +12 -37
- package/dist/constants/storage.cjs.map +1 -1
- package/dist/constants/storage.d.cts +10 -8
- package/dist/constants/storage.d.cts.map +1 -0
- package/dist/constants/storage.d.mts +13 -0
- package/dist/constants/storage.d.mts.map +1 -0
- package/dist/constants/storage.mjs +12 -13
- package/dist/constants/storage.mjs.map +1 -1
- package/dist/feedback/index.cjs +14 -40
- package/dist/feedback/index.cjs.map +1 -1
- package/dist/feedback/index.d.cts +4 -4
- package/dist/feedback/index.d.cts.map +1 -0
- package/dist/feedback/index.d.mts +6 -0
- package/dist/feedback/index.d.mts.map +1 -0
- package/dist/feedback/index.mjs +12 -14
- package/dist/feedback/index.mjs.map +1 -1
- package/dist/hooks/use-app-analytics.cjs +46 -65
- package/dist/hooks/use-app-analytics.cjs.map +1 -1
- package/dist/hooks/use-app-analytics.d.cts +3 -1
- package/dist/hooks/use-app-analytics.d.cts.map +1 -0
- package/dist/hooks/use-app-analytics.d.mts +5 -0
- package/dist/hooks/use-app-analytics.d.mts.map +1 -0
- package/dist/hooks/use-app-analytics.mjs +41 -36
- package/dist/hooks/use-app-analytics.mjs.map +1 -1
- package/dist/hooks/use-click-id-persistence.cjs +43 -65
- package/dist/hooks/use-click-id-persistence.cjs.map +1 -1
- package/dist/hooks/use-click-id-persistence.d.cts +3 -1
- package/dist/hooks/use-click-id-persistence.d.cts.map +1 -0
- package/dist/hooks/use-click-id-persistence.d.mts +5 -0
- package/dist/hooks/use-click-id-persistence.d.mts.map +1 -0
- package/dist/hooks/use-click-id-persistence.mjs +40 -38
- package/dist/hooks/use-click-id-persistence.mjs.map +1 -1
- package/dist/hooks/use-outbound-click-analytics.cjs +33 -55
- package/dist/hooks/use-outbound-click-analytics.cjs.map +1 -1
- package/dist/hooks/use-outbound-click-analytics.d.cts +3 -1
- package/dist/hooks/use-outbound-click-analytics.d.cts.map +1 -0
- package/dist/hooks/{use-outbound-click-analytics.d.ts → use-outbound-click-analytics.d.mts} +3 -1
- package/dist/hooks/use-outbound-click-analytics.d.mts.map +1 -0
- package/dist/hooks/use-outbound-click-analytics.mjs +31 -29
- package/dist/hooks/use-outbound-click-analytics.mjs.map +1 -1
- package/dist/hooks/use-previous.cjs +11 -35
- package/dist/hooks/use-previous.cjs.map +1 -1
- package/dist/hooks/use-previous.d.cts +3 -1
- package/dist/hooks/use-previous.d.cts.map +1 -0
- package/dist/hooks/use-previous.d.mts +5 -0
- package/dist/hooks/use-previous.d.mts.map +1 -0
- package/dist/hooks/use-previous.mjs +9 -9
- package/dist/hooks/use-previous.mjs.map +1 -1
- package/dist/hooks/use-track-impression.cjs +24 -51
- package/dist/hooks/use-track-impression.cjs.map +1 -1
- package/dist/hooks/use-track-impression.d.cts +5 -6
- package/dist/hooks/use-track-impression.d.cts.map +1 -0
- package/dist/hooks/use-track-impression.d.mts +6 -0
- package/dist/hooks/use-track-impression.d.mts.map +1 -0
- package/dist/hooks/use-track-impression.mjs +22 -25
- package/dist/hooks/use-track-impression.mjs.map +1 -1
- package/dist/hooks/use-web-analytics.cjs +98 -109
- package/dist/hooks/use-web-analytics.cjs.map +1 -1
- package/dist/hooks/use-web-analytics.d.cts +3 -1
- package/dist/hooks/use-web-analytics.d.cts.map +1 -0
- package/dist/hooks/{use-web-analytics.d.ts → use-web-analytics.d.mts} +3 -1
- package/dist/hooks/use-web-analytics.d.mts.map +1 -0
- package/dist/hooks/use-web-analytics.mjs +93 -80
- package/dist/hooks/use-web-analytics.mjs.map +1 -1
- package/dist/index.cjs +28 -74
- package/dist/index.d.cts +11 -13
- package/dist/index.d.mts +11 -0
- package/dist/index.mjs +3 -34
- package/dist/link/index.cjs +31 -58
- package/dist/link/index.cjs.map +1 -1
- package/dist/link/index.d.cts +7 -7
- package/dist/link/index.d.cts.map +1 -0
- package/dist/link/index.d.mts +11 -0
- package/dist/link/index.d.mts.map +1 -0
- package/dist/link/index.mjs +28 -31
- package/dist/link/index.mjs.map +1 -1
- package/dist/native/fbsdk.cjs +12 -33
- package/dist/native/fbsdk.cjs.map +1 -1
- package/dist/native/fbsdk.d.cts +4 -4
- package/dist/native/fbsdk.d.cts.map +1 -0
- package/dist/native/{fbsdk.d.ts → fbsdk.d.mts} +4 -4
- package/dist/native/fbsdk.d.mts.map +1 -0
- package/dist/native/fbsdk.mjs +10 -7
- package/dist/native/fbsdk.mjs.map +1 -1
- package/dist/native/fingerprint.cjs +41 -64
- package/dist/native/fingerprint.cjs.map +1 -1
- package/dist/native/fingerprint.d.cts +22 -20
- package/dist/native/fingerprint.d.cts.map +1 -0
- package/dist/native/fingerprint.d.mts +28 -0
- package/dist/native/fingerprint.d.mts.map +1 -0
- package/dist/native/fingerprint.mjs +36 -42
- package/dist/native/fingerprint.mjs.map +1 -1
- package/dist/native/firebase.cjs +12 -39
- package/dist/native/firebase.cjs.map +1 -1
- package/dist/native/firebase.d.cts +4 -4
- package/dist/native/firebase.d.cts.map +1 -0
- package/dist/native/firebase.d.mts +6 -0
- package/dist/native/firebase.d.mts.map +1 -0
- package/dist/native/firebase.mjs +10 -13
- package/dist/native/firebase.mjs.map +1 -1
- package/dist/native/index.cjs +11 -45
- package/dist/native/index.d.cts +4 -7
- package/dist/native/index.d.mts +4 -0
- package/dist/native/index.mjs +2 -12
- package/dist/native/posthog.cjs +5 -30
- package/dist/native/posthog.cjs.map +1 -1
- package/dist/native/posthog.d.cts +3 -1
- package/dist/native/posthog.d.cts.map +1 -0
- package/dist/native/posthog.d.mts +5 -0
- package/dist/native/posthog.d.mts.map +1 -0
- package/dist/native/posthog.mjs +5 -6
- package/dist/native/posthog.mjs.map +1 -1
- package/dist/native/setup.cjs +91 -129
- package/dist/native/setup.cjs.map +1 -1
- package/dist/native/setup.d.cts +6 -6
- package/dist/native/setup.d.cts.map +1 -0
- package/dist/native/{setup.d.ts → setup.d.mts} +6 -6
- package/dist/native/setup.d.mts.map +1 -0
- package/dist/native/setup.mjs +83 -105
- package/dist/native/setup.mjs.map +1 -1
- package/dist/next/index.cjs +72 -145
- package/dist/next/index.cjs.map +1 -1
- package/dist/next/index.d.cts +18 -19
- package/dist/next/index.d.cts.map +1 -0
- package/dist/next/index.d.mts +21 -0
- package/dist/next/index.d.mts.map +1 -0
- package/dist/next/index.mjs +65 -107
- package/dist/next/index.mjs.map +1 -1
- package/dist/react-router/index.cjs +80 -144
- package/dist/react-router/index.cjs.map +1 -1
- package/dist/react-router/index.d.cts +18 -19
- package/dist/react-router/index.d.cts.map +1 -0
- package/dist/react-router/index.d.mts +21 -0
- package/dist/react-router/index.d.mts.map +1 -0
- package/dist/react-router/index.mjs +75 -115
- package/dist/react-router/index.mjs.map +1 -1
- package/dist/schema/index.cjs +188 -233
- package/dist/schema/index.cjs.map +1 -1
- package/dist/schema/index.d.cts +236 -235
- package/dist/schema/index.d.cts.map +1 -0
- package/dist/schema/index.d.mts +325 -0
- package/dist/schema/index.d.mts.map +1 -0
- package/dist/schema/index.mjs +178 -222
- package/dist/schema/index.mjs.map +1 -1
- package/dist/server/index.cjs +9 -40
- package/dist/server/index.d.cts +5 -9
- package/dist/server/index.d.mts +5 -0
- package/dist/server/index.mjs +5 -12
- package/dist/server/linkedin-conversions-api.cjs +66 -95
- package/dist/server/linkedin-conversions-api.cjs.map +1 -1
- package/dist/server/linkedin-conversions-api.d.cts +45 -45
- package/dist/server/linkedin-conversions-api.d.cts.map +1 -0
- package/dist/server/linkedin-conversions-api.d.mts +56 -0
- package/dist/server/linkedin-conversions-api.d.mts.map +1 -0
- package/dist/server/linkedin-conversions-api.mjs +63 -68
- package/dist/server/linkedin-conversions-api.mjs.map +1 -1
- package/dist/server/meta-conversions-api.cjs +157 -265
- package/dist/server/meta-conversions-api.cjs.map +1 -1
- package/dist/server/meta-conversions-api.d.cts +8 -9
- package/dist/server/meta-conversions-api.d.cts.map +1 -0
- package/dist/server/meta-conversions-api.d.mts +10 -0
- package/dist/server/meta-conversions-api.d.mts.map +1 -0
- package/dist/server/meta-conversions-api.mjs +151 -243
- package/dist/server/meta-conversions-api.mjs.map +1 -1
- package/dist/server/openai-conversions-api.cjs +69 -96
- package/dist/server/openai-conversions-api.cjs.map +1 -1
- package/dist/server/openai-conversions-api.d.cts +34 -34
- package/dist/server/openai-conversions-api.d.cts.map +1 -0
- package/dist/server/openai-conversions-api.d.mts +47 -0
- package/dist/server/openai-conversions-api.d.mts.map +1 -0
- package/dist/server/openai-conversions-api.mjs +65 -68
- package/dist/server/openai-conversions-api.mjs.map +1 -1
- package/dist/server/reddit-conversions-api.cjs +64 -91
- package/dist/server/reddit-conversions-api.cjs.map +1 -1
- package/dist/server/reddit-conversions-api.d.cts +61 -61
- package/dist/server/reddit-conversions-api.d.cts.map +1 -0
- package/dist/server/reddit-conversions-api.d.mts +75 -0
- package/dist/server/reddit-conversions-api.d.mts.map +1 -0
- package/dist/server/reddit-conversions-api.mjs +59 -62
- package/dist/server/reddit-conversions-api.mjs.map +1 -1
- package/dist/setup/index.cjs +34 -63
- package/dist/setup/index.cjs.map +1 -1
- package/dist/setup/index.d.cts +30 -30
- package/dist/setup/index.d.cts.map +1 -0
- package/dist/setup/index.d.mts +41 -0
- package/dist/setup/index.d.mts.map +1 -0
- package/dist/setup/index.mjs +31 -36
- package/dist/setup/index.mjs.map +1 -1
- package/dist/setup/session.cjs +70 -106
- package/dist/setup/session.cjs.map +1 -1
- package/dist/setup/session.d.cts +26 -24
- package/dist/setup/session.d.cts.map +1 -0
- package/dist/setup/session.d.mts +31 -0
- package/dist/setup/session.d.mts.map +1 -0
- package/dist/setup/session.mjs +68 -80
- package/dist/setup/session.mjs.map +1 -1
- package/dist/tanstack/index.cjs +86 -156
- package/dist/tanstack/index.cjs.map +1 -1
- package/dist/tanstack/index.d.cts +19 -20
- package/dist/tanstack/index.d.cts.map +1 -0
- package/dist/tanstack/index.d.mts +22 -0
- package/dist/tanstack/index.d.mts.map +1 -0
- package/dist/tanstack/index.mjs +81 -127
- package/dist/tanstack/index.mjs.map +1 -1
- package/dist/third-parties/google-analytics.cjs +18 -43
- package/dist/third-parties/google-analytics.cjs.map +1 -1
- package/dist/third-parties/google-analytics.d.cts +7 -7
- package/dist/third-parties/google-analytics.d.cts.map +1 -0
- package/dist/third-parties/google-analytics.d.mts +12 -0
- package/dist/third-parties/google-analytics.d.mts.map +1 -0
- package/dist/third-parties/google-analytics.mjs +16 -17
- package/dist/third-parties/google-analytics.mjs.map +1 -1
- package/dist/third-parties/ignored-events.cjs +35 -68
- package/dist/third-parties/ignored-events.cjs.map +1 -1
- package/dist/third-parties/ignored-events.d.cts +3 -1
- package/dist/third-parties/ignored-events.d.cts.map +1 -0
- package/dist/third-parties/ignored-events.d.mts +5 -0
- package/dist/third-parties/ignored-events.d.mts.map +1 -0
- package/dist/third-parties/ignored-events.mjs +34 -43
- package/dist/third-parties/ignored-events.mjs.map +1 -1
- package/dist/third-parties/index.cjs +16 -53
- package/dist/third-parties/index.d.cts +6 -12
- package/dist/third-parties/index.d.mts +6 -0
- package/dist/third-parties/index.mjs +1 -14
- package/dist/third-parties/linkedin-insight-tag.cjs +28 -50
- package/dist/third-parties/linkedin-insight-tag.cjs.map +1 -1
- package/dist/third-parties/linkedin-insight-tag.d.cts +8 -9
- package/dist/third-parties/linkedin-insight-tag.d.cts.map +1 -0
- package/dist/third-parties/{linkedin-insight-tag.d.ts → linkedin-insight-tag.d.mts} +8 -9
- package/dist/third-parties/linkedin-insight-tag.d.mts.map +1 -0
- package/dist/third-parties/linkedin-insight-tag.mjs +25 -23
- package/dist/third-parties/linkedin-insight-tag.mjs.map +1 -1
- package/dist/third-parties/meta-pixel.cjs +45 -66
- package/dist/third-parties/meta-pixel.cjs.map +1 -1
- package/dist/third-parties/meta-pixel.d.cts +7 -8
- package/dist/third-parties/meta-pixel.d.cts.map +1 -0
- package/dist/third-parties/meta-pixel.d.mts +12 -0
- package/dist/third-parties/meta-pixel.d.mts.map +1 -0
- package/dist/third-parties/meta-pixel.mjs +41 -38
- package/dist/third-parties/meta-pixel.mjs.map +1 -1
- package/dist/third-parties/openai-pixel.cjs +63 -68
- package/dist/third-parties/openai-pixel.cjs.map +1 -1
- package/dist/third-parties/openai-pixel.d.cts +7 -8
- package/dist/third-parties/openai-pixel.d.cts.map +1 -0
- package/dist/third-parties/{openai-pixel.d.ts → openai-pixel.d.mts} +7 -8
- package/dist/third-parties/openai-pixel.d.mts.map +1 -0
- package/dist/third-parties/openai-pixel.mjs +60 -41
- package/dist/third-parties/openai-pixel.mjs.map +1 -1
- package/dist/third-parties/posthog.cjs +23 -43
- package/dist/third-parties/posthog.cjs.map +1 -1
- package/dist/third-parties/posthog.d.cts +5 -5
- package/dist/third-parties/posthog.d.cts.map +1 -0
- package/dist/third-parties/{posthog.d.ts → posthog.d.mts} +5 -5
- package/dist/third-parties/posthog.d.mts.map +1 -0
- package/dist/third-parties/posthog.mjs +20 -16
- package/dist/third-parties/posthog.mjs.map +1 -1
- package/dist/third-parties/reddit-pixel.cjs +37 -58
- package/dist/third-parties/reddit-pixel.cjs.map +1 -1
- package/dist/third-parties/reddit-pixel.d.cts +7 -8
- package/dist/third-parties/reddit-pixel.d.cts.map +1 -0
- package/dist/third-parties/reddit-pixel.d.mts +12 -0
- package/dist/third-parties/reddit-pixel.d.mts.map +1 -0
- package/dist/third-parties/reddit-pixel.mjs +33 -30
- package/dist/third-parties/reddit-pixel.mjs.map +1 -1
- package/dist/track/fbq.cjs +179 -135
- package/dist/track/fbq.cjs.map +1 -1
- package/dist/track/fbq.d.cts +234 -233
- package/dist/track/fbq.d.cts.map +1 -0
- package/dist/track/fbq.d.mts +280 -0
- package/dist/track/fbq.d.mts.map +1 -0
- package/dist/track/fbq.mjs +176 -108
- package/dist/track/fbq.mjs.map +1 -1
- package/dist/track/gtag.cjs +63 -86
- package/dist/track/gtag.cjs.map +1 -1
- package/dist/track/gtag.d.cts +682 -682
- package/dist/track/gtag.d.cts.map +1 -0
- package/dist/track/gtag.d.mts +762 -0
- package/dist/track/gtag.d.mts.map +1 -0
- package/dist/track/gtag.mjs +62 -61
- package/dist/track/gtag.mjs.map +1 -1
- package/dist/track/index.cjs +111 -136
- package/dist/track/index.cjs.map +1 -1
- package/dist/track/index.d.cts +8 -8
- package/dist/track/index.d.cts.map +1 -0
- package/dist/track/{index.d.ts → index.d.mts} +8 -8
- package/dist/track/index.d.mts.map +1 -0
- package/dist/track/index.mjs +105 -106
- package/dist/track/index.mjs.map +1 -1
- package/dist/track/lintrk.cjs +0 -19
- package/dist/track/lintrk.d.cts +12 -10
- package/dist/track/lintrk.d.cts.map +1 -0
- package/dist/track/lintrk.d.mts +14 -0
- package/dist/track/lintrk.d.mts.map +1 -0
- package/dist/track/lintrk.mjs +1 -1
- package/dist/track/oaiq.cjs +153 -146
- package/dist/track/oaiq.cjs.map +1 -1
- package/dist/track/oaiq.d.cts +65 -64
- package/dist/track/oaiq.d.cts.map +1 -0
- package/dist/track/oaiq.d.mts +112 -0
- package/dist/track/oaiq.d.mts.map +1 -0
- package/dist/track/oaiq.mjs +149 -118
- package/dist/track/oaiq.mjs.map +1 -1
- package/dist/track/rdt.cjs +66 -110
- package/dist/track/rdt.cjs.map +1 -1
- package/dist/track/rdt.d.cts +74 -73
- package/dist/track/rdt.d.cts.map +1 -0
- package/dist/track/rdt.d.mts +97 -0
- package/dist/track/rdt.d.mts.map +1 -0
- package/dist/track/rdt.mjs +63 -83
- package/dist/track/rdt.mjs.map +1 -1
- package/dist/track/types.cjs +0 -19
- package/dist/track/types.d.cts +140 -111
- package/dist/track/types.d.cts.map +1 -0
- package/dist/track/types.d.mts +171 -0
- package/dist/track/types.d.mts.map +1 -0
- package/dist/track/types.mjs +1 -1
- package/dist/utils/field.cjs +8 -32
- package/dist/utils/field.cjs.map +1 -1
- package/dist/utils/field.d.cts +3 -1
- package/dist/utils/field.d.cts.map +1 -0
- package/dist/utils/{field.d.ts → field.d.mts} +3 -1
- package/dist/utils/field.d.mts.map +1 -0
- package/dist/utils/field.mjs +7 -7
- package/dist/utils/field.mjs.map +1 -1
- package/dist/utils/stripe.cjs +25 -49
- package/dist/utils/stripe.cjs.map +1 -1
- package/dist/utils/stripe.d.cts +3 -1
- package/dist/utils/stripe.d.cts.map +1 -0
- package/dist/utils/{stripe.d.ts → stripe.d.mts} +3 -1
- package/dist/utils/stripe.d.mts.map +1 -0
- package/dist/utils/stripe.mjs +23 -23
- package/dist/utils/stripe.mjs.map +1 -1
- package/dist/visitor/index.cjs +54 -86
- package/dist/visitor/index.cjs.map +1 -1
- package/dist/visitor/index.d.cts +4 -5
- package/dist/visitor/index.d.cts.map +1 -0
- package/dist/visitor/{index.d.ts → index.d.mts} +4 -5
- package/dist/visitor/index.d.mts.map +1 -0
- package/dist/visitor/index.mjs +51 -59
- package/dist/visitor/index.mjs.map +1 -1
- package/dist/visitor/types.cjs +0 -19
- package/dist/visitor/types.d.cts +15 -14
- package/dist/visitor/types.d.cts.map +1 -0
- package/dist/visitor/types.d.mts +21 -0
- package/dist/visitor/types.d.mts.map +1 -0
- package/dist/visitor/types.mjs +1 -1
- package/dist/web/index.cjs +108 -148
- package/dist/web/index.cjs.map +1 -1
- package/dist/web/index.d.cts +5 -6
- package/dist/web/index.d.cts.map +1 -0
- package/dist/web/index.d.mts +9 -0
- package/dist/web/index.d.mts.map +1 -0
- package/dist/web/index.mjs +101 -109
- package/dist/web/index.mjs.map +1 -1
- package/package.json +102 -49
- package/dist/constants/storage.d.ts +0 -11
- package/dist/feedback/index.d.ts +0 -6
- package/dist/hooks/use-app-analytics.d.ts +0 -3
- package/dist/hooks/use-click-id-persistence.d.ts +0 -3
- package/dist/hooks/use-previous.d.ts +0 -3
- package/dist/hooks/use-track-impression.d.ts +0 -7
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.ts +0 -13
- package/dist/index.mjs.map +0 -1
- package/dist/link/index.d.ts +0 -11
- package/dist/native/fingerprint.d.ts +0 -26
- package/dist/native/firebase.d.ts +0 -6
- package/dist/native/index.cjs.map +0 -1
- package/dist/native/index.d.ts +0 -7
- package/dist/native/index.mjs.map +0 -1
- package/dist/native/posthog.d.ts +0 -3
- package/dist/next/index.d.ts +0 -22
- package/dist/react-router/index.d.ts +0 -22
- package/dist/schema/index.d.ts +0 -324
- package/dist/server/index.cjs.map +0 -1
- package/dist/server/index.d.ts +0 -9
- package/dist/server/index.mjs.map +0 -1
- package/dist/server/linkedin-conversions-api.d.ts +0 -56
- package/dist/server/meta-conversions-api.d.ts +0 -11
- package/dist/server/openai-conversions-api.d.ts +0 -47
- package/dist/server/reddit-conversions-api.d.ts +0 -75
- package/dist/setup/index.d.ts +0 -41
- package/dist/setup/session.d.ts +0 -29
- package/dist/tanstack/index.d.ts +0 -23
- package/dist/third-parties/google-analytics.d.ts +0 -12
- package/dist/third-parties/ignored-events.d.ts +0 -3
- package/dist/third-parties/index.cjs.map +0 -1
- package/dist/third-parties/index.d.ts +0 -12
- package/dist/third-parties/index.mjs.map +0 -1
- package/dist/third-parties/meta-pixel.d.ts +0 -13
- package/dist/third-parties/reddit-pixel.d.ts +0 -13
- package/dist/track/fbq.d.ts +0 -279
- package/dist/track/gtag.d.ts +0 -762
- package/dist/track/lintrk.cjs.map +0 -1
- package/dist/track/lintrk.d.ts +0 -12
- package/dist/track/lintrk.mjs.map +0 -1
- package/dist/track/oaiq.d.ts +0 -111
- package/dist/track/rdt.d.ts +0 -96
- package/dist/track/types.cjs.map +0 -1
- package/dist/track/types.d.ts +0 -142
- package/dist/track/types.mjs.map +0 -1
- package/dist/visitor/types.cjs.map +0 -1
- package/dist/visitor/types.d.ts +0 -20
- package/dist/visitor/types.mjs.map +0 -1
- package/dist/web/index.d.ts +0 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/use-app-analytics.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport { AppState } from 'react-native';\nimport { keys } from '../constants/storage';\nimport { config } from '../setup/index';\nimport { session } from '../setup/session';\nimport { track } from '../track/index';\nimport { usePrevious } from './use-previous';\n\nfunction sendFirstOpen(pathname: string) {\n if (config.storage.getItem(keys.first_open_time)) return;\n track('first_open', { screen_name: pathname, screen_class: pathname });\n config.storage.setItem(keys.first_open_time, new Date().toISOString());\n}\n\nfunction sendUserEngagement() {\n const engagement_time_msec = session.flush();\n if (engagement_time_msec <= 0) return;\n track('user_engagement', { engagement_time_msec, trigger: 'background' });\n}\n\nexport function useAppAnalytics(pathname: string) {\n const prevPathname = usePrevious(pathname);\n\n useEffect(() => {\n sendFirstOpen(pathname);\n track('session_start', undefined);\n\n const subscription = AppState.addEventListener('change', (state) => {\n session.updateAccumulator();\n // when returning to the foreground from the background\n if (state === 'active' && !session.isActive()) {\n session.updateActive(true);\n }\n // when entering the background\n else if (state !== 'active' && session.isActive()) {\n session.updateActive(false);\n sendUserEngagement();\n }\n });\n\n return () => subscription.remove();\n }, []);\n\n // when the screen is switched, the engagement time of the previous screen is recorded\n useEffect(() => {\n track('screen_view', {\n screen_name: pathname,\n screen_class: pathname,\n previous_screen_class: prevPathname ?? undefined,\n engagement_time_msec: prevPathname ? session.flush() : undefined,\n });\n }, [pathname]);\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"use-app-analytics.mjs","names":[],"sources":["../../src/hooks/use-app-analytics.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport { AppState } from 'react-native';\nimport { keys } from '../constants/storage';\nimport { config } from '../setup/index';\nimport { session } from '../setup/session';\nimport { track } from '../track/index';\nimport { usePrevious } from './use-previous';\n\nfunction sendFirstOpen(pathname: string) {\n if (config.storage.getItem(keys.first_open_time)) return;\n track('first_open', { screen_name: pathname, screen_class: pathname });\n config.storage.setItem(keys.first_open_time, new Date().toISOString());\n}\n\nfunction sendUserEngagement() {\n const engagement_time_msec = session.flush();\n if (engagement_time_msec <= 0) return;\n track('user_engagement', { engagement_time_msec, trigger: 'background' });\n}\n\nexport function useAppAnalytics(pathname: string) {\n const prevPathname = usePrevious(pathname);\n\n useEffect(() => {\n sendFirstOpen(pathname);\n track('session_start', undefined);\n\n const subscription = AppState.addEventListener('change', (state) => {\n session.updateAccumulator();\n // when returning to the foreground from the background\n if (state === 'active' && !session.isActive()) {\n session.updateActive(true);\n }\n // when entering the background\n else if (state !== 'active' && session.isActive()) {\n session.updateActive(false);\n sendUserEngagement();\n }\n });\n\n return () => subscription.remove();\n }, []);\n\n // when the screen is switched, the engagement time of the previous screen is recorded\n useEffect(() => {\n track('screen_view', {\n screen_name: pathname,\n screen_class: pathname,\n previous_screen_class: prevPathname ?? undefined,\n engagement_time_msec: prevPathname ? session.flush() : undefined,\n });\n }, [pathname]);\n}\n"],"mappings":";;;;;;;;AAQA,SAAS,cAAc,UAAkB;CACvC,IAAI,OAAO,QAAQ,QAAQ,KAAK,eAAe,GAAG;CAClD,MAAM,cAAc;EAAE,aAAa;EAAU,cAAc;CAAS,CAAC;CACrE,OAAO,QAAQ,QAAQ,KAAK,kCAAiB,IAAI,KAAK,EAAA,CAAE,YAAY,CAAC;AACvE;AAEA,SAAS,qBAAqB;CAC5B,MAAM,uBAAuB,QAAQ,MAAM;CAC3C,IAAI,wBAAwB,GAAG;CAC/B,MAAM,mBAAmB;EAAE;EAAsB,SAAS;CAAa,CAAC;AAC1E;AAEA,SAAgB,gBAAgB,UAAkB;CAChD,MAAM,eAAe,YAAY,QAAQ;CAEzC,gBAAgB;EACd,cAAc,QAAQ;EACtB,MAAM,iBAAiB,KAAA,CAAS;EAEhC,MAAM,eAAe,SAAS,iBAAiB,WAAW,UAAU;GAClE,QAAQ,kBAAkB;GAE1B,IAAI,UAAU,YAAY,CAAC,QAAQ,SAAS,GAC1C,QAAQ,aAAa,IAAI;QAGtB,IAAI,UAAU,YAAY,QAAQ,SAAS,GAAG;IACjD,QAAQ,aAAa,KAAK;IAC1B,mBAAmB;GACrB;EACF,CAAC;EAED,aAAa,aAAa,OAAO;CACnC,GAAG,CAAC,CAAC;CAGL,gBAAgB;EACd,MAAM,eAAe;GACnB,aAAa;GACb,cAAc;GACd,uBAAuB,gBAAgB,KAAA;GACvC,sBAAsB,eAAe,QAAQ,MAAM,IAAI,KAAA;EACzD,CAAC;CACH,GAAG,CAAC,QAAQ,CAAC;AACf"}
|
|
@@ -1,74 +1,52 @@
|
|
|
1
|
-
"
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
|
|
20
|
-
// src/hooks/use-click-id-persistence.ts
|
|
21
|
-
var use_click_id_persistence_exports = {};
|
|
22
|
-
__export(use_click_id_persistence_exports, {
|
|
23
|
-
useClickIdPersistence: () => useClickIdPersistence
|
|
24
|
-
});
|
|
25
|
-
module.exports = __toCommonJS(use_click_id_persistence_exports);
|
|
26
|
-
var import_utils = require("@shware/utils");
|
|
27
|
-
var import_cookie = require("cookie");
|
|
28
|
-
var import_react = require("react");
|
|
29
|
-
var import_storage = require("../constants/storage.cjs");
|
|
30
|
-
var TTL_MS = 90 * 24 * 60 * 60 * 1e3;
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_constants_storage = require("../constants/storage.cjs");
|
|
3
|
+
let _shware_utils = require("@shware/utils");
|
|
4
|
+
let react = require("react");
|
|
5
|
+
let cookie = require("cookie");
|
|
6
|
+
//#region src/hooks/use-click-id-persistence.ts
|
|
7
|
+
const TTL_MS = 2160 * 60 * 60 * 1e3;
|
|
31
8
|
function setCookie(name, value, ttlInMs) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
9
|
+
const d = /* @__PURE__ */ new Date();
|
|
10
|
+
d.setTime(d.getTime() + ttlInMs);
|
|
11
|
+
const expires = `expires=${d.toUTCString()}`;
|
|
12
|
+
document.cookie = `${name}=${value}; ${expires}; path=/; SameSite=Lax; Secure`;
|
|
36
13
|
}
|
|
14
|
+
/** Extract the raw fbclid portion from a formatted fbc string (fb.1.ts.FBCLID) */
|
|
37
15
|
function extractFbclid(fbc) {
|
|
38
|
-
|
|
39
|
-
|
|
16
|
+
const parts = fbc.split(".");
|
|
17
|
+
return parts.length >= 4 ? parts.slice(3).join(".") : void 0;
|
|
40
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Persist a click-id value across cookie + localStorage.
|
|
21
|
+
* - cookie: readable by third-party SDKs (e.g. Meta Pixel)
|
|
22
|
+
* - localStorage (via expiringStorage): survives Safari ITP JS-cookie caps
|
|
23
|
+
*
|
|
24
|
+
* If only one store has the value, sync it to the other.
|
|
25
|
+
*/
|
|
41
26
|
function persist(cookieName, storageKey, cookieValue, newValue) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
setCookie(cookieName, stored, TTL_MS);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
27
|
+
if (newValue) {
|
|
28
|
+
setCookie(cookieName, newValue, TTL_MS);
|
|
29
|
+
_shware_utils.expiringStorage.setItem(storageKey, newValue, TTL_MS);
|
|
30
|
+
} else {
|
|
31
|
+
const stored = _shware_utils.expiringStorage.getItem(storageKey);
|
|
32
|
+
if (cookieValue && !stored) _shware_utils.expiringStorage.setItem(storageKey, cookieValue, TTL_MS);
|
|
33
|
+
else if (!cookieValue && stored) setCookie(cookieName, stored, TTL_MS);
|
|
34
|
+
}
|
|
53
35
|
}
|
|
54
36
|
function useClickIdPersistence() {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
const rdt_cid = params.get("rdt_cid");
|
|
67
|
-
persist("_rdt_cid", import_storage.keys.rdt_cid, parsed._rdt_cid, rdt_cid ?? void 0);
|
|
68
|
-
}, []);
|
|
37
|
+
(0, react.useEffect)(() => {
|
|
38
|
+
const params = new URLSearchParams(window.location.search);
|
|
39
|
+
const parsed = (0, cookie.parseCookie)(document.cookie);
|
|
40
|
+
const fbclid = params.get("fbclid");
|
|
41
|
+
const existingFbc = parsed._fbc ?? _shware_utils.expiringStorage.getItem(require_constants_storage.keys.fbc);
|
|
42
|
+
const newFbc = fbclid && extractFbclid(existingFbc ?? "") !== fbclid ? `fb.1.${Date.now()}.${fbclid}` : void 0;
|
|
43
|
+
persist("_fbc", require_constants_storage.keys.fbc, parsed._fbc, newFbc);
|
|
44
|
+
if (fbclid) _shware_utils.expiringStorage.setItem(require_constants_storage.keys.fbclid, fbclid, TTL_MS);
|
|
45
|
+
const rdt_cid = params.get("rdt_cid");
|
|
46
|
+
persist("_rdt_cid", require_constants_storage.keys.rdt_cid, parsed._rdt_cid, rdt_cid ?? void 0);
|
|
47
|
+
}, []);
|
|
69
48
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
});
|
|
49
|
+
//#endregion
|
|
50
|
+
exports.useClickIdPersistence = useClickIdPersistence;
|
|
51
|
+
|
|
74
52
|
//# sourceMappingURL=use-click-id-persistence.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/use-click-id-persistence.ts"],"sourcesContent":["import { expiringStorage } from '@shware/utils';\nimport { parseCookie } from 'cookie';\nimport { useEffect } from 'react';\nimport { keys } from '../constants/storage';\n\n// common practice ~90 days\nconst TTL_MS = 90 * 24 * 60 * 60 * 1000;\n\nfunction setCookie(name: string, value: string, ttlInMs: number) {\n const d = new Date();\n d.setTime(d.getTime() + ttlInMs);\n const expires = `expires=${d.toUTCString()}`;\n document.cookie = `${name}=${value}; ${expires}; path=/; SameSite=Lax; Secure`;\n}\n\n/** Extract the raw fbclid portion from a formatted fbc string (fb.1.ts.FBCLID) */\nfunction extractFbclid(fbc: string): string | undefined {\n // fb.<subdomainIndex>.<creationTime>.<fbclid>\n const parts = fbc.split('.');\n return parts.length >= 4 ? parts.slice(3).join('.') : undefined;\n}\n\n/**\n * Persist a click-id value across cookie + localStorage.\n * - cookie: readable by third-party SDKs (e.g. Meta Pixel)\n * - localStorage (via expiringStorage): survives Safari ITP JS-cookie caps\n *\n * If only one store has the value, sync it to the other.\n */\nfunction persist(\n cookieName: string,\n storageKey: string,\n cookieValue: string | undefined,\n newValue: string | undefined\n) {\n if (newValue) {\n setCookie(cookieName, newValue, TTL_MS);\n expiringStorage.setItem(storageKey, newValue, TTL_MS);\n } else {\n const stored = expiringStorage.getItem<string>(storageKey);\n if (cookieValue && !stored) {\n // cookie → localStorage: back up before ITP wipes the cookie\n expiringStorage.setItem(storageKey, cookieValue, TTL_MS);\n } else if (!cookieValue && stored) {\n // localStorage → cookie: restore so third-party SDKs (Meta Pixel) can read it\n setCookie(cookieName, stored, TTL_MS);\n }\n }\n}\n\n// todo: do not set tracking cookies before the user has granted consent where required.\n// reference: https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc/#3--store-clickid\n// reference: https://watsspace.com/blog/meta-conversions-api-fbc-and-fbp-parameters/\nexport function useClickIdPersistence() {\n useEffect(() => {\n const params = new URLSearchParams(window.location.search);\n const parsed = parseCookie(document.cookie);\n\n // --- Meta fbc ---\n const fbclid = params.get('fbclid');\n const existingFbc = parsed._fbc ?? expiringStorage.getItem<string>(keys.fbc);\n // Only build a new fbc if the fbclid actually changed (preserve original creationTime otherwise).\n const fbclidChanged = fbclid && extractFbclid(existingFbc ?? '') !== fbclid;\n const newFbc = fbclidChanged ? `fb.1.${Date.now()}.${fbclid}` : undefined;\n\n persist('_fbc', keys.fbc, parsed._fbc, newFbc);\n\n // Also persist raw fbclid so the server-side Conversions API fallback\n // (fbc reconstruction from fbclid) works even after SPA navigation.\n if (fbclid) {\n expiringStorage.setItem(keys.fbclid, fbclid, TTL_MS);\n }\n\n // --- Reddit rdt_cid ---\n const rdt_cid = params.get('rdt_cid');\n persist('_rdt_cid', keys.rdt_cid, parsed._rdt_cid, rdt_cid ?? undefined);\n }, []);\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"use-click-id-persistence.cjs","names":["expiringStorage","keys"],"sources":["../../src/hooks/use-click-id-persistence.ts"],"sourcesContent":["import { expiringStorage } from '@shware/utils';\nimport { parseCookie } from 'cookie';\nimport { useEffect } from 'react';\nimport { keys } from '../constants/storage';\n\n// common practice ~90 days\nconst TTL_MS = 90 * 24 * 60 * 60 * 1000;\n\nfunction setCookie(name: string, value: string, ttlInMs: number) {\n const d = new Date();\n d.setTime(d.getTime() + ttlInMs);\n const expires = `expires=${d.toUTCString()}`;\n document.cookie = `${name}=${value}; ${expires}; path=/; SameSite=Lax; Secure`;\n}\n\n/** Extract the raw fbclid portion from a formatted fbc string (fb.1.ts.FBCLID) */\nfunction extractFbclid(fbc: string): string | undefined {\n // fb.<subdomainIndex>.<creationTime>.<fbclid>\n const parts = fbc.split('.');\n return parts.length >= 4 ? parts.slice(3).join('.') : undefined;\n}\n\n/**\n * Persist a click-id value across cookie + localStorage.\n * - cookie: readable by third-party SDKs (e.g. Meta Pixel)\n * - localStorage (via expiringStorage): survives Safari ITP JS-cookie caps\n *\n * If only one store has the value, sync it to the other.\n */\nfunction persist(\n cookieName: string,\n storageKey: string,\n cookieValue: string | undefined,\n newValue: string | undefined\n) {\n if (newValue) {\n setCookie(cookieName, newValue, TTL_MS);\n expiringStorage.setItem(storageKey, newValue, TTL_MS);\n } else {\n const stored = expiringStorage.getItem<string>(storageKey);\n if (cookieValue && !stored) {\n // cookie → localStorage: back up before ITP wipes the cookie\n expiringStorage.setItem(storageKey, cookieValue, TTL_MS);\n } else if (!cookieValue && stored) {\n // localStorage → cookie: restore so third-party SDKs (Meta Pixel) can read it\n setCookie(cookieName, stored, TTL_MS);\n }\n }\n}\n\n// todo: do not set tracking cookies before the user has granted consent where required.\n// reference: https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc/#3--store-clickid\n// reference: https://watsspace.com/blog/meta-conversions-api-fbc-and-fbp-parameters/\nexport function useClickIdPersistence() {\n useEffect(() => {\n const params = new URLSearchParams(window.location.search);\n const parsed = parseCookie(document.cookie);\n\n // --- Meta fbc ---\n const fbclid = params.get('fbclid');\n const existingFbc = parsed._fbc ?? expiringStorage.getItem<string>(keys.fbc);\n // Only build a new fbc if the fbclid actually changed (preserve original creationTime otherwise).\n const fbclidChanged = fbclid && extractFbclid(existingFbc ?? '') !== fbclid;\n const newFbc = fbclidChanged ? `fb.1.${Date.now()}.${fbclid}` : undefined;\n\n persist('_fbc', keys.fbc, parsed._fbc, newFbc);\n\n // Also persist raw fbclid so the server-side Conversions API fallback\n // (fbc reconstruction from fbclid) works even after SPA navigation.\n if (fbclid) {\n expiringStorage.setItem(keys.fbclid, fbclid, TTL_MS);\n }\n\n // --- Reddit rdt_cid ---\n const rdt_cid = params.get('rdt_cid');\n persist('_rdt_cid', keys.rdt_cid, parsed._rdt_cid, rdt_cid ?? undefined);\n }, []);\n}\n"],"mappings":";;;;;;AAMA,MAAM,SAAS,OAAU,KAAK,KAAK;AAEnC,SAAS,UAAU,MAAc,OAAe,SAAiB;CAC/D,MAAM,oBAAI,IAAI,KAAK;CACnB,EAAE,QAAQ,EAAE,QAAQ,IAAI,OAAO;CAC/B,MAAM,UAAU,WAAW,EAAE,YAAY;CACzC,SAAS,SAAS,GAAG,KAAK,GAAG,MAAM,IAAI,QAAQ;AACjD;;AAGA,SAAS,cAAc,KAAiC;CAEtD,MAAM,QAAQ,IAAI,MAAM,GAAG;CAC3B,OAAO,MAAM,UAAU,IAAI,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAA;AACxD;;;;;;;;AASA,SAAS,QACP,YACA,YACA,aACA,UACA;CACA,IAAI,UAAU;EACZ,UAAU,YAAY,UAAU,MAAM;EACtC,cAAA,gBAAgB,QAAQ,YAAY,UAAU,MAAM;CACtD,OAAO;EACL,MAAM,SAASA,cAAAA,gBAAgB,QAAgB,UAAU;EACzD,IAAI,eAAe,CAAC,QAElB,cAAA,gBAAgB,QAAQ,YAAY,aAAa,MAAM;OAClD,IAAI,CAAC,eAAe,QAEzB,UAAU,YAAY,QAAQ,MAAM;CAExC;AACF;AAKA,SAAgB,wBAAwB;CACtC,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,MAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;EACzD,MAAM,UAAA,GAAA,OAAA,YAAA,CAAqB,SAAS,MAAM;EAG1C,MAAM,SAAS,OAAO,IAAI,QAAQ;EAClC,MAAM,cAAc,OAAO,QAAQA,cAAAA,gBAAgB,QAAgBC,0BAAAA,KAAK,GAAG;EAG3E,MAAM,SADgB,UAAU,cAAc,eAAe,EAAE,MAAM,SACtC,QAAQ,KAAK,IAAI,EAAE,GAAG,WAAW,KAAA;EAEhE,QAAQ,QAAQA,0BAAAA,KAAK,KAAK,OAAO,MAAM,MAAM;EAI7C,IAAI,QACF,cAAA,gBAAgB,QAAQA,0BAAAA,KAAK,QAAQ,QAAQ,MAAM;EAIrD,MAAM,UAAU,OAAO,IAAI,SAAS;EACpC,QAAQ,YAAYA,0BAAAA,KAAK,SAAS,OAAO,UAAU,WAAW,KAAA,CAAS;CACzE,GAAG,CAAC,CAAC;AACP"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-click-id-persistence.d.cts","names":[],"sources":["../../src/hooks/use-click-id-persistence.ts"],"mappings":";iBAqDgB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-click-id-persistence.d.mts","names":[],"sources":["../../src/hooks/use-click-id-persistence.ts"],"mappings":";iBAqDgB"}
|
|
@@ -1,49 +1,51 @@
|
|
|
1
|
-
|
|
1
|
+
import { keys } from "../constants/storage.mjs";
|
|
2
2
|
import { expiringStorage } from "@shware/utils";
|
|
3
|
-
import { parseCookie } from "cookie";
|
|
4
3
|
import { useEffect } from "react";
|
|
5
|
-
import {
|
|
6
|
-
|
|
4
|
+
import { parseCookie } from "cookie";
|
|
5
|
+
//#region src/hooks/use-click-id-persistence.ts
|
|
6
|
+
const TTL_MS = 2160 * 60 * 60 * 1e3;
|
|
7
7
|
function setCookie(name, value, ttlInMs) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
const d = /* @__PURE__ */ new Date();
|
|
9
|
+
d.setTime(d.getTime() + ttlInMs);
|
|
10
|
+
const expires = `expires=${d.toUTCString()}`;
|
|
11
|
+
document.cookie = `${name}=${value}; ${expires}; path=/; SameSite=Lax; Secure`;
|
|
12
12
|
}
|
|
13
|
+
/** Extract the raw fbclid portion from a formatted fbc string (fb.1.ts.FBCLID) */
|
|
13
14
|
function extractFbclid(fbc) {
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
const parts = fbc.split(".");
|
|
16
|
+
return parts.length >= 4 ? parts.slice(3).join(".") : void 0;
|
|
16
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Persist a click-id value across cookie + localStorage.
|
|
20
|
+
* - cookie: readable by third-party SDKs (e.g. Meta Pixel)
|
|
21
|
+
* - localStorage (via expiringStorage): survives Safari ITP JS-cookie caps
|
|
22
|
+
*
|
|
23
|
+
* If only one store has the value, sync it to the other.
|
|
24
|
+
*/
|
|
17
25
|
function persist(cookieName, storageKey, cookieValue, newValue) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
setCookie(cookieName, stored, TTL_MS);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
26
|
+
if (newValue) {
|
|
27
|
+
setCookie(cookieName, newValue, TTL_MS);
|
|
28
|
+
expiringStorage.setItem(storageKey, newValue, TTL_MS);
|
|
29
|
+
} else {
|
|
30
|
+
const stored = expiringStorage.getItem(storageKey);
|
|
31
|
+
if (cookieValue && !stored) expiringStorage.setItem(storageKey, cookieValue, TTL_MS);
|
|
32
|
+
else if (!cookieValue && stored) setCookie(cookieName, stored, TTL_MS);
|
|
33
|
+
}
|
|
29
34
|
}
|
|
30
35
|
function useClickIdPersistence() {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const rdt_cid = params.get("rdt_cid");
|
|
43
|
-
persist("_rdt_cid", keys.rdt_cid, parsed._rdt_cid, rdt_cid ?? void 0);
|
|
44
|
-
}, []);
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
const params = new URLSearchParams(window.location.search);
|
|
38
|
+
const parsed = parseCookie(document.cookie);
|
|
39
|
+
const fbclid = params.get("fbclid");
|
|
40
|
+
const existingFbc = parsed._fbc ?? expiringStorage.getItem(keys.fbc);
|
|
41
|
+
const newFbc = fbclid && extractFbclid(existingFbc ?? "") !== fbclid ? `fb.1.${Date.now()}.${fbclid}` : void 0;
|
|
42
|
+
persist("_fbc", keys.fbc, parsed._fbc, newFbc);
|
|
43
|
+
if (fbclid) expiringStorage.setItem(keys.fbclid, fbclid, TTL_MS);
|
|
44
|
+
const rdt_cid = params.get("rdt_cid");
|
|
45
|
+
persist("_rdt_cid", keys.rdt_cid, parsed._rdt_cid, rdt_cid ?? void 0);
|
|
46
|
+
}, []);
|
|
45
47
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
//#endregion
|
|
49
|
+
export { useClickIdPersistence };
|
|
50
|
+
|
|
49
51
|
//# sourceMappingURL=use-click-id-persistence.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/use-click-id-persistence.ts"],"sourcesContent":["import { expiringStorage } from '@shware/utils';\nimport { parseCookie } from 'cookie';\nimport { useEffect } from 'react';\nimport { keys } from '../constants/storage';\n\n// common practice ~90 days\nconst TTL_MS = 90 * 24 * 60 * 60 * 1000;\n\nfunction setCookie(name: string, value: string, ttlInMs: number) {\n const d = new Date();\n d.setTime(d.getTime() + ttlInMs);\n const expires = `expires=${d.toUTCString()}`;\n document.cookie = `${name}=${value}; ${expires}; path=/; SameSite=Lax; Secure`;\n}\n\n/** Extract the raw fbclid portion from a formatted fbc string (fb.1.ts.FBCLID) */\nfunction extractFbclid(fbc: string): string | undefined {\n // fb.<subdomainIndex>.<creationTime>.<fbclid>\n const parts = fbc.split('.');\n return parts.length >= 4 ? parts.slice(3).join('.') : undefined;\n}\n\n/**\n * Persist a click-id value across cookie + localStorage.\n * - cookie: readable by third-party SDKs (e.g. Meta Pixel)\n * - localStorage (via expiringStorage): survives Safari ITP JS-cookie caps\n *\n * If only one store has the value, sync it to the other.\n */\nfunction persist(\n cookieName: string,\n storageKey: string,\n cookieValue: string | undefined,\n newValue: string | undefined\n) {\n if (newValue) {\n setCookie(cookieName, newValue, TTL_MS);\n expiringStorage.setItem(storageKey, newValue, TTL_MS);\n } else {\n const stored = expiringStorage.getItem<string>(storageKey);\n if (cookieValue && !stored) {\n // cookie → localStorage: back up before ITP wipes the cookie\n expiringStorage.setItem(storageKey, cookieValue, TTL_MS);\n } else if (!cookieValue && stored) {\n // localStorage → cookie: restore so third-party SDKs (Meta Pixel) can read it\n setCookie(cookieName, stored, TTL_MS);\n }\n }\n}\n\n// todo: do not set tracking cookies before the user has granted consent where required.\n// reference: https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc/#3--store-clickid\n// reference: https://watsspace.com/blog/meta-conversions-api-fbc-and-fbp-parameters/\nexport function useClickIdPersistence() {\n useEffect(() => {\n const params = new URLSearchParams(window.location.search);\n const parsed = parseCookie(document.cookie);\n\n // --- Meta fbc ---\n const fbclid = params.get('fbclid');\n const existingFbc = parsed._fbc ?? expiringStorage.getItem<string>(keys.fbc);\n // Only build a new fbc if the fbclid actually changed (preserve original creationTime otherwise).\n const fbclidChanged = fbclid && extractFbclid(existingFbc ?? '') !== fbclid;\n const newFbc = fbclidChanged ? `fb.1.${Date.now()}.${fbclid}` : undefined;\n\n persist('_fbc', keys.fbc, parsed._fbc, newFbc);\n\n // Also persist raw fbclid so the server-side Conversions API fallback\n // (fbc reconstruction from fbclid) works even after SPA navigation.\n if (fbclid) {\n expiringStorage.setItem(keys.fbclid, fbclid, TTL_MS);\n }\n\n // --- Reddit rdt_cid ---\n const rdt_cid = params.get('rdt_cid');\n persist('_rdt_cid', keys.rdt_cid, parsed._rdt_cid, rdt_cid ?? undefined);\n }, []);\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"use-click-id-persistence.mjs","names":[],"sources":["../../src/hooks/use-click-id-persistence.ts"],"sourcesContent":["import { expiringStorage } from '@shware/utils';\nimport { parseCookie } from 'cookie';\nimport { useEffect } from 'react';\nimport { keys } from '../constants/storage';\n\n// common practice ~90 days\nconst TTL_MS = 90 * 24 * 60 * 60 * 1000;\n\nfunction setCookie(name: string, value: string, ttlInMs: number) {\n const d = new Date();\n d.setTime(d.getTime() + ttlInMs);\n const expires = `expires=${d.toUTCString()}`;\n document.cookie = `${name}=${value}; ${expires}; path=/; SameSite=Lax; Secure`;\n}\n\n/** Extract the raw fbclid portion from a formatted fbc string (fb.1.ts.FBCLID) */\nfunction extractFbclid(fbc: string): string | undefined {\n // fb.<subdomainIndex>.<creationTime>.<fbclid>\n const parts = fbc.split('.');\n return parts.length >= 4 ? parts.slice(3).join('.') : undefined;\n}\n\n/**\n * Persist a click-id value across cookie + localStorage.\n * - cookie: readable by third-party SDKs (e.g. Meta Pixel)\n * - localStorage (via expiringStorage): survives Safari ITP JS-cookie caps\n *\n * If only one store has the value, sync it to the other.\n */\nfunction persist(\n cookieName: string,\n storageKey: string,\n cookieValue: string | undefined,\n newValue: string | undefined\n) {\n if (newValue) {\n setCookie(cookieName, newValue, TTL_MS);\n expiringStorage.setItem(storageKey, newValue, TTL_MS);\n } else {\n const stored = expiringStorage.getItem<string>(storageKey);\n if (cookieValue && !stored) {\n // cookie → localStorage: back up before ITP wipes the cookie\n expiringStorage.setItem(storageKey, cookieValue, TTL_MS);\n } else if (!cookieValue && stored) {\n // localStorage → cookie: restore so third-party SDKs (Meta Pixel) can read it\n setCookie(cookieName, stored, TTL_MS);\n }\n }\n}\n\n// todo: do not set tracking cookies before the user has granted consent where required.\n// reference: https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc/#3--store-clickid\n// reference: https://watsspace.com/blog/meta-conversions-api-fbc-and-fbp-parameters/\nexport function useClickIdPersistence() {\n useEffect(() => {\n const params = new URLSearchParams(window.location.search);\n const parsed = parseCookie(document.cookie);\n\n // --- Meta fbc ---\n const fbclid = params.get('fbclid');\n const existingFbc = parsed._fbc ?? expiringStorage.getItem<string>(keys.fbc);\n // Only build a new fbc if the fbclid actually changed (preserve original creationTime otherwise).\n const fbclidChanged = fbclid && extractFbclid(existingFbc ?? '') !== fbclid;\n const newFbc = fbclidChanged ? `fb.1.${Date.now()}.${fbclid}` : undefined;\n\n persist('_fbc', keys.fbc, parsed._fbc, newFbc);\n\n // Also persist raw fbclid so the server-side Conversions API fallback\n // (fbc reconstruction from fbclid) works even after SPA navigation.\n if (fbclid) {\n expiringStorage.setItem(keys.fbclid, fbclid, TTL_MS);\n }\n\n // --- Reddit rdt_cid ---\n const rdt_cid = params.get('rdt_cid');\n persist('_rdt_cid', keys.rdt_cid, parsed._rdt_cid, rdt_cid ?? undefined);\n }, []);\n}\n"],"mappings":";;;;;AAMA,MAAM,SAAS,OAAU,KAAK,KAAK;AAEnC,SAAS,UAAU,MAAc,OAAe,SAAiB;CAC/D,MAAM,oBAAI,IAAI,KAAK;CACnB,EAAE,QAAQ,EAAE,QAAQ,IAAI,OAAO;CAC/B,MAAM,UAAU,WAAW,EAAE,YAAY;CACzC,SAAS,SAAS,GAAG,KAAK,GAAG,MAAM,IAAI,QAAQ;AACjD;;AAGA,SAAS,cAAc,KAAiC;CAEtD,MAAM,QAAQ,IAAI,MAAM,GAAG;CAC3B,OAAO,MAAM,UAAU,IAAI,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAA;AACxD;;;;;;;;AASA,SAAS,QACP,YACA,YACA,aACA,UACA;CACA,IAAI,UAAU;EACZ,UAAU,YAAY,UAAU,MAAM;EACtC,gBAAgB,QAAQ,YAAY,UAAU,MAAM;CACtD,OAAO;EACL,MAAM,SAAS,gBAAgB,QAAgB,UAAU;EACzD,IAAI,eAAe,CAAC,QAElB,gBAAgB,QAAQ,YAAY,aAAa,MAAM;OAClD,IAAI,CAAC,eAAe,QAEzB,UAAU,YAAY,QAAQ,MAAM;CAExC;AACF;AAKA,SAAgB,wBAAwB;CACtC,gBAAgB;EACd,MAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;EACzD,MAAM,SAAS,YAAY,SAAS,MAAM;EAG1C,MAAM,SAAS,OAAO,IAAI,QAAQ;EAClC,MAAM,cAAc,OAAO,QAAQ,gBAAgB,QAAgB,KAAK,GAAG;EAG3E,MAAM,SADgB,UAAU,cAAc,eAAe,EAAE,MAAM,SACtC,QAAQ,KAAK,IAAI,EAAE,GAAG,WAAW,KAAA;EAEhE,QAAQ,QAAQ,KAAK,KAAK,OAAO,MAAM,MAAM;EAI7C,IAAI,QACF,gBAAgB,QAAQ,KAAK,QAAQ,QAAQ,MAAM;EAIrD,MAAM,UAAU,OAAO,IAAI,SAAS;EACpC,QAAQ,YAAY,KAAK,SAAS,OAAO,UAAU,WAAW,KAAA,CAAS;CACzE,GAAG,CAAC,CAAC;AACP"}
|
|
@@ -1,58 +1,36 @@
|
|
|
1
|
-
"
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
|
|
20
|
-
// src/hooks/use-outbound-click-analytics.ts
|
|
21
|
-
var use_outbound_click_analytics_exports = {};
|
|
22
|
-
__export(use_outbound_click_analytics_exports, {
|
|
23
|
-
useOutboundClickAnalytics: () => useOutboundClickAnalytics
|
|
24
|
-
});
|
|
25
|
-
module.exports = __toCommonJS(use_outbound_click_analytics_exports);
|
|
26
|
-
var import_react = require("react");
|
|
27
|
-
var import_track = require("../track/index.cjs");
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_track_index = require("../track/index.cjs");
|
|
3
|
+
let react = require("react");
|
|
4
|
+
//#region src/hooks/use-outbound-click-analytics.ts
|
|
5
|
+
/**
|
|
6
|
+
* Tracks outbound link clicks - when a user clicks a link that leads away
|
|
7
|
+
* from the current domain to another website.
|
|
8
|
+
*/
|
|
28
9
|
function useOutboundClickAnalytics() {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
return () => document.removeEventListener("click", onClick, { capture: true });
|
|
52
|
-
}, []);
|
|
10
|
+
(0, react.useEffect)(() => {
|
|
11
|
+
const onClick = (event) => {
|
|
12
|
+
const anchor = event.target.closest("a");
|
|
13
|
+
if (!anchor || !anchor.href) return;
|
|
14
|
+
try {
|
|
15
|
+
const url = new URL(anchor.href, window.location.origin);
|
|
16
|
+
if (url.hostname !== window.location.hostname) require_track_index.track("click", {
|
|
17
|
+
outbound: true,
|
|
18
|
+
link_id: anchor.id || "",
|
|
19
|
+
link_url: anchor.href,
|
|
20
|
+
link_text: anchor.textContent?.trim() || "",
|
|
21
|
+
link_domain: url.hostname,
|
|
22
|
+
link_classes: anchor.className || ""
|
|
23
|
+
});
|
|
24
|
+
} catch {}
|
|
25
|
+
};
|
|
26
|
+
document.addEventListener("click", onClick, {
|
|
27
|
+
passive: true,
|
|
28
|
+
capture: true
|
|
29
|
+
});
|
|
30
|
+
return () => document.removeEventListener("click", onClick, { capture: true });
|
|
31
|
+
}, []);
|
|
53
32
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
});
|
|
33
|
+
//#endregion
|
|
34
|
+
exports.useOutboundClickAnalytics = useOutboundClickAnalytics;
|
|
35
|
+
|
|
58
36
|
//# sourceMappingURL=use-outbound-click-analytics.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/use-outbound-click-analytics.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport { track } from '../track/index';\n\n/**\n * Tracks outbound link clicks - when a user clicks a link that leads away\n * from the current domain to another website.\n */\nexport function useOutboundClickAnalytics() {\n useEffect(() => {\n const onClick = (event: MouseEvent) => {\n // Find the closest anchor element from the clicked target\n const target = event.target as HTMLElement;\n const anchor = target.closest('a');\n if (!anchor || !anchor.href) return;\n\n try {\n const url = new URL(anchor.href, window.location.origin);\n\n // Check if it's an external link (different hostname)\n if (url.hostname !== window.location.hostname) {\n track('click', {\n outbound: true,\n link_id: anchor.id || '',\n link_url: anchor.href,\n link_text: anchor.textContent?.trim() || '',\n link_domain: url.hostname,\n link_classes: anchor.className || '',\n });\n }\n } catch {\n // Invalid URL, ignore\n }\n };\n\n document.addEventListener('click', onClick, { passive: true, capture: true });\n return () => document.removeEventListener('click', onClick, { capture: true });\n }, []);\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"use-outbound-click-analytics.cjs","names":[],"sources":["../../src/hooks/use-outbound-click-analytics.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport { track } from '../track/index';\n\n/**\n * Tracks outbound link clicks - when a user clicks a link that leads away\n * from the current domain to another website.\n */\nexport function useOutboundClickAnalytics() {\n useEffect(() => {\n const onClick = (event: MouseEvent) => {\n // Find the closest anchor element from the clicked target\n const target = event.target as HTMLElement;\n const anchor = target.closest('a');\n if (!anchor || !anchor.href) return;\n\n try {\n const url = new URL(anchor.href, window.location.origin);\n\n // Check if it's an external link (different hostname)\n if (url.hostname !== window.location.hostname) {\n track('click', {\n outbound: true,\n link_id: anchor.id || '',\n link_url: anchor.href,\n link_text: anchor.textContent?.trim() || '',\n link_domain: url.hostname,\n link_classes: anchor.className || '',\n });\n }\n } catch {\n // Invalid URL, ignore\n }\n };\n\n document.addEventListener('click', onClick, { passive: true, capture: true });\n return () => document.removeEventListener('click', onClick, { capture: true });\n }, []);\n}\n"],"mappings":";;;;;;;;AAOA,SAAgB,4BAA4B;CAC1C,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,MAAM,WAAW,UAAsB;GAGrC,MAAM,SADS,MAAM,OACC,QAAQ,GAAG;GACjC,IAAI,CAAC,UAAU,CAAC,OAAO,MAAM;GAE7B,IAAI;IACF,MAAM,MAAM,IAAI,IAAI,OAAO,MAAM,OAAO,SAAS,MAAM;IAGvD,IAAI,IAAI,aAAa,OAAO,SAAS,UACnC,oBAAA,MAAM,SAAS;KACb,UAAU;KACV,SAAS,OAAO,MAAM;KACtB,UAAU,OAAO;KACjB,WAAW,OAAO,aAAa,KAAK,KAAK;KACzC,aAAa,IAAI;KACjB,cAAc,OAAO,aAAa;IACpC,CAAC;GAEL,QAAQ,CAER;EACF;EAEA,SAAS,iBAAiB,SAAS,SAAS;GAAE,SAAS;GAAM,SAAS;EAAK,CAAC;EAC5E,aAAa,SAAS,oBAAoB,SAAS,SAAS,EAAE,SAAS,KAAK,CAAC;CAC/E,GAAG,CAAC,CAAC;AACP"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
//#region src/hooks/use-outbound-click-analytics.d.ts
|
|
1
2
|
/**
|
|
2
3
|
* Tracks outbound link clicks - when a user clicks a link that leads away
|
|
3
4
|
* from the current domain to another website.
|
|
4
5
|
*/
|
|
5
6
|
declare function useOutboundClickAnalytics(): void;
|
|
6
|
-
|
|
7
|
+
//#endregion
|
|
7
8
|
export { useOutboundClickAnalytics };
|
|
9
|
+
//# sourceMappingURL=use-outbound-click-analytics.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-outbound-click-analytics.d.cts","names":[],"sources":["../../src/hooks/use-outbound-click-analytics.ts"],"mappings":";;;;;iBAOgB"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
//#region src/hooks/use-outbound-click-analytics.d.ts
|
|
1
2
|
/**
|
|
2
3
|
* Tracks outbound link clicks - when a user clicks a link that leads away
|
|
3
4
|
* from the current domain to another website.
|
|
4
5
|
*/
|
|
5
6
|
declare function useOutboundClickAnalytics(): void;
|
|
6
|
-
|
|
7
|
+
//#endregion
|
|
7
8
|
export { useOutboundClickAnalytics };
|
|
9
|
+
//# sourceMappingURL=use-outbound-click-analytics.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-outbound-click-analytics.d.mts","names":[],"sources":["../../src/hooks/use-outbound-click-analytics.ts"],"mappings":";;;;;iBAOgB"}
|
|
@@ -1,33 +1,35 @@
|
|
|
1
|
-
// src/hooks/use-outbound-click-analytics.ts
|
|
2
|
-
import { useEffect } from "react";
|
|
3
1
|
import { track } from "../track/index.mjs";
|
|
2
|
+
import { useEffect } from "react";
|
|
3
|
+
//#region src/hooks/use-outbound-click-analytics.ts
|
|
4
|
+
/**
|
|
5
|
+
* Tracks outbound link clicks - when a user clicks a link that leads away
|
|
6
|
+
* from the current domain to another website.
|
|
7
|
+
*/
|
|
4
8
|
function useOutboundClickAnalytics() {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
return () => document.removeEventListener("click", onClick, { capture: true });
|
|
28
|
-
}, []);
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
const onClick = (event) => {
|
|
11
|
+
const anchor = event.target.closest("a");
|
|
12
|
+
if (!anchor || !anchor.href) return;
|
|
13
|
+
try {
|
|
14
|
+
const url = new URL(anchor.href, window.location.origin);
|
|
15
|
+
if (url.hostname !== window.location.hostname) track("click", {
|
|
16
|
+
outbound: true,
|
|
17
|
+
link_id: anchor.id || "",
|
|
18
|
+
link_url: anchor.href,
|
|
19
|
+
link_text: anchor.textContent?.trim() || "",
|
|
20
|
+
link_domain: url.hostname,
|
|
21
|
+
link_classes: anchor.className || ""
|
|
22
|
+
});
|
|
23
|
+
} catch {}
|
|
24
|
+
};
|
|
25
|
+
document.addEventListener("click", onClick, {
|
|
26
|
+
passive: true,
|
|
27
|
+
capture: true
|
|
28
|
+
});
|
|
29
|
+
return () => document.removeEventListener("click", onClick, { capture: true });
|
|
30
|
+
}, []);
|
|
29
31
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
32
|
+
//#endregion
|
|
33
|
+
export { useOutboundClickAnalytics };
|
|
34
|
+
|
|
33
35
|
//# sourceMappingURL=use-outbound-click-analytics.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/use-outbound-click-analytics.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport { track } from '../track/index';\n\n/**\n * Tracks outbound link clicks - when a user clicks a link that leads away\n * from the current domain to another website.\n */\nexport function useOutboundClickAnalytics() {\n useEffect(() => {\n const onClick = (event: MouseEvent) => {\n // Find the closest anchor element from the clicked target\n const target = event.target as HTMLElement;\n const anchor = target.closest('a');\n if (!anchor || !anchor.href) return;\n\n try {\n const url = new URL(anchor.href, window.location.origin);\n\n // Check if it's an external link (different hostname)\n if (url.hostname !== window.location.hostname) {\n track('click', {\n outbound: true,\n link_id: anchor.id || '',\n link_url: anchor.href,\n link_text: anchor.textContent?.trim() || '',\n link_domain: url.hostname,\n link_classes: anchor.className || '',\n });\n }\n } catch {\n // Invalid URL, ignore\n }\n };\n\n document.addEventListener('click', onClick, { passive: true, capture: true });\n return () => document.removeEventListener('click', onClick, { capture: true });\n }, []);\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"use-outbound-click-analytics.mjs","names":[],"sources":["../../src/hooks/use-outbound-click-analytics.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport { track } from '../track/index';\n\n/**\n * Tracks outbound link clicks - when a user clicks a link that leads away\n * from the current domain to another website.\n */\nexport function useOutboundClickAnalytics() {\n useEffect(() => {\n const onClick = (event: MouseEvent) => {\n // Find the closest anchor element from the clicked target\n const target = event.target as HTMLElement;\n const anchor = target.closest('a');\n if (!anchor || !anchor.href) return;\n\n try {\n const url = new URL(anchor.href, window.location.origin);\n\n // Check if it's an external link (different hostname)\n if (url.hostname !== window.location.hostname) {\n track('click', {\n outbound: true,\n link_id: anchor.id || '',\n link_url: anchor.href,\n link_text: anchor.textContent?.trim() || '',\n link_domain: url.hostname,\n link_classes: anchor.className || '',\n });\n }\n } catch {\n // Invalid URL, ignore\n }\n };\n\n document.addEventListener('click', onClick, { passive: true, capture: true });\n return () => document.removeEventListener('click', onClick, { capture: true });\n }, []);\n}\n"],"mappings":";;;;;;;AAOA,SAAgB,4BAA4B;CAC1C,gBAAgB;EACd,MAAM,WAAW,UAAsB;GAGrC,MAAM,SADS,MAAM,OACC,QAAQ,GAAG;GACjC,IAAI,CAAC,UAAU,CAAC,OAAO,MAAM;GAE7B,IAAI;IACF,MAAM,MAAM,IAAI,IAAI,OAAO,MAAM,OAAO,SAAS,MAAM;IAGvD,IAAI,IAAI,aAAa,OAAO,SAAS,UACnC,MAAM,SAAS;KACb,UAAU;KACV,SAAS,OAAO,MAAM;KACtB,UAAU,OAAO;KACjB,WAAW,OAAO,aAAa,KAAK,KAAK;KACzC,aAAa,IAAI;KACjB,cAAc,OAAO,aAAa;IACpC,CAAC;GAEL,QAAQ,CAER;EACF;EAEA,SAAS,iBAAiB,SAAS,SAAS;GAAE,SAAS;GAAM,SAAS;EAAK,CAAC;EAC5E,aAAa,SAAS,oBAAoB,SAAS,SAAS,EAAE,SAAS,KAAK,CAAC;CAC/E,GAAG,CAAC,CAAC;AACP"}
|
|
@@ -1,38 +1,14 @@
|
|
|
1
|
-
"
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
|
|
20
|
-
// src/hooks/use-previous.ts
|
|
21
|
-
var use_previous_exports = {};
|
|
22
|
-
__export(use_previous_exports, {
|
|
23
|
-
usePrevious: () => usePrevious
|
|
24
|
-
});
|
|
25
|
-
module.exports = __toCommonJS(use_previous_exports);
|
|
26
|
-
var import_react = require("react");
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
let react = require("react");
|
|
3
|
+
//#region src/hooks/use-previous.ts
|
|
27
4
|
function usePrevious(value) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
5
|
+
const ref = (0, react.useRef)(void 0);
|
|
6
|
+
(0, react.useEffect)(() => {
|
|
7
|
+
ref.current = value;
|
|
8
|
+
});
|
|
9
|
+
return ref.current;
|
|
33
10
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
});
|
|
11
|
+
//#endregion
|
|
12
|
+
exports.usePrevious = usePrevious;
|
|
13
|
+
|
|
38
14
|
//# sourceMappingURL=use-previous.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/use-previous.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nexport function usePrevious<T>(value: T): T | undefined {\n const ref = useRef<T | undefined>(undefined);\n useEffect(() => {\n ref.current = value;\n });\n return ref.current;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"use-previous.cjs","names":[],"sources":["../../src/hooks/use-previous.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nexport function usePrevious<T>(value: T): T | undefined {\n const ref = useRef<T | undefined>(undefined);\n useEffect(() => {\n ref.current = value;\n });\n return ref.current;\n}\n"],"mappings":";;;AAEA,SAAgB,YAAe,OAAyB;CACtD,MAAM,OAAA,GAAA,MAAA,OAAA,CAA4B,KAAA,CAAS;CAC3C,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,IAAI,UAAU;CAChB,CAAC;CACD,OAAO,IAAI;AACb"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-previous.d.cts","names":[],"sources":["../../src/hooks/use-previous.ts"],"mappings":";iBAEgB,YAAY,GAAG,OAAO,IAAI"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-previous.d.mts","names":[],"sources":["../../src/hooks/use-previous.ts"],"mappings":";iBAEgB,YAAY,GAAG,OAAO,IAAI"}
|