nycki.net/static/first-time.js
nycki f235ca54ce
All checks were successful
/ build (push) Successful in 30s
consent check page
2025-06-30 14:28:06 -07:00

95 lines
2.5 KiB
JavaScript

/**
* first-time.js by Nick "Nycki" Lamicela, 2025.
*
* A simple script for redirecting the user to a "first time here" page, for example, a nsfw content opt-in page.
*
* You may use this on your site, with or without attribution.
*/
const firstTime = {};
/**
* Check if the user has opted into this gate. If not, redirect to gate page.
*
* Usage: in the head of each protected page.
*
* <head>
* <script src="/firstTime.js"></script>
* <script>firstTime.check("consent");</script>
* </head>
*/
firstTime.check = function (key='default', href=`/first-time-${key}/`) {
const currentSetting = localStorage.getItem(`first-time-${key}`);
if (currentSetting === 'granted') {
// do nothing
return;
} else {
// redirect to gate
const nextPage = window.location;
window.location.replace(`${href}?next=${nextPage}`);
}
};
/**
* Grant the user access to this gate.
*
* Usage: on the gate page.
*
* <head>
* <script src="/firstTime.js"></script>
* </head>
* <body>
* <button onclick="firstTime.grant('consent')">I Consent</button>
* </body>
*/
firstTime.grant = function (key='default') {
// save preference
localStorage.setItem(`first-time-${key}`, 'granted');
// redirect back to original page
let nextPage = '/';
const queries = (window.location.search || '').slice(1).split('&');
for (const query of queries) {
const [k, v] = query.split('=', 2);
if (k == 'next') {
nextPage = v;
}
}
window.location.replace(nextPage);
};
/**
* "No thanks" button for leaving a gate.
*
* Optional: on the gate page, after the consent button.
*
* <head>
* <script src="/firstTime.js"></script>
* </head>
* <body>
* <button onclick="firstTime.grant('consent')">I Consent</button>
* <button onclick="firstTime.leave('/index.html')">No Thanks</button>
* </body>
*/
firstTime.leave = function (href='/') {
window.location.replace(href);
};
/**
* "Clear settings" button for resetting a gate.
*
* Optional: on the gate page.
*
* <head>
* <script src="/firstTime.js"></script>
* </head>
* <body>
* <button onclick="firstTime.grant('consent')">I Consent</button>
* <button onclick="firstTime.leave()">No Thanks</button>
* <button onclick="firstTime.clear('consent'); firstTime.leave()">Clear this setting.</button>
* </body>
*/
firstTime.clear = function (key='default') {
localStorage.removeItem(`first-time-${key}`);
};