feat: update ScriptSetupBlock and script.js to support new visitor ID storage options
This commit is contained in:
@@ -40,7 +40,7 @@ export default function ScriptSetupBlock({
|
||||
const [scriptCopied, setScriptCopied] = useState(false)
|
||||
|
||||
const copyScript = useCallback(() => {
|
||||
const script = `<script defer data-domain="${site.domain}" data-api="${API_URL}" src="${APP_URL}/script.js"></script>`
|
||||
const script = `<script defer data-domain="${site.domain}" data-api="${API_URL}" data-storage="local" data-storage-ttl="24" src="${APP_URL}/script.js"></script>`
|
||||
navigator.clipboard.writeText(script)
|
||||
setScriptCopied(true)
|
||||
toast.success('Script copied to clipboard')
|
||||
@@ -87,10 +87,10 @@ export default function ScriptSetupBlock({
|
||||
|
||||
<div className="rounded-xl bg-neutral-100 dark:bg-neutral-800 p-4 relative group">
|
||||
<code className="text-xs text-neutral-900 dark:text-white break-all font-mono block pr-10">
|
||||
{`<script defer data-domain="${site.domain}" data-api="${API_URL}" src="${APP_URL}/script.js"></script>`}
|
||||
{`<script defer data-domain="${site.domain}" data-api="${API_URL}" data-storage="local" data-storage-ttl="24" src="${APP_URL}/script.js"></script>`}
|
||||
</code>
|
||||
<p className="mt-2 text-xs text-neutral-500 dark:text-neutral-400">
|
||||
Optional: <code className="rounded px-1 bg-neutral-200 dark:bg-neutral-700">data-storage="local"</code> for cross-tab unique visitors; <code className="rounded px-1 bg-neutral-200 dark:bg-neutral-700">data-storage-ttl="24"</code> (hours) to expire the ID.
|
||||
Optional: <code className="rounded px-1 bg-neutral-200 dark:bg-neutral-700">data-storage="session"</code> for per-tab (ephemeral) visitor counting.
|
||||
</p>
|
||||
<button
|
||||
type="button"
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/**
|
||||
* Pulse - Privacy-First Tracking Script
|
||||
* Lightweight, no cookies, GDPR compliant.
|
||||
* Default: ephemeral session ID (sessionStorage, per-tab). Optional: data-storage="local"
|
||||
* and data-storage-ttl (hours) for a persistent cross-tab visitor ID with optional expiry.
|
||||
* Default: cross-tab visitor ID (localStorage, optional data-storage-ttl in hours).
|
||||
* Optional: data-storage="session" for per-tab (ephemeral) counting.
|
||||
*/
|
||||
|
||||
(function() {
|
||||
@@ -21,8 +21,8 @@
|
||||
|
||||
const domain = script.getAttribute('data-domain');
|
||||
const apiUrl = script.getAttribute('data-api') || 'https://pulse-api.ciphera.net';
|
||||
// * Visitor ID storage: "session" (default, ephemeral per-tab) or "local" (persistent, cross-tab)
|
||||
const storageMode = (script.getAttribute('data-storage') || 'session').toLowerCase() === 'local' ? 'local' : 'session';
|
||||
// * Visitor ID storage: "local" (default, cross-tab) or "session" (ephemeral per-tab)
|
||||
const storageMode = (script.getAttribute('data-storage') || 'local').toLowerCase() === 'session' ? 'session' : 'local';
|
||||
// * When storage is "local", optional TTL in hours; after TTL the ID is regenerated (e.g. 24 = one day)
|
||||
const ttlHours = storageMode === 'local' ? parseFloat(script.getAttribute('data-storage-ttl') || '24', 10) : 0;
|
||||
const ttlMs = ttlHours > 0 ? ttlHours * 60 * 60 * 1000 : 0;
|
||||
@@ -151,7 +151,7 @@
|
||||
return cachedSessionId;
|
||||
}
|
||||
|
||||
// * Default: session storage (ephemeral, per-tab)
|
||||
// * data-storage="session": session storage (ephemeral, per-tab)
|
||||
try {
|
||||
cachedSessionId = sessionStorage.getItem(key);
|
||||
if (!cachedSessionId && legacyKey) {
|
||||
|
||||
Reference in New Issue
Block a user