templates/flex/flex-custom.html.twig line 1

Open in your IDE?
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>{% block title %}Welcome to FirstID Flex (PoC with no TCF){% endblock %}</title>
  6.     <link rel="icon"
  7.           href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 128 128%22><text y=%221.2em%22 font-size=%2296%22>⚫️</text></svg>">
  8.     <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css"
  9.           integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
  10.     <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"
  11.             integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj"
  12.             crossorigin="anonymous"></script>
  13.     <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"
  14.             integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF"
  15.             crossorigin="anonymous"></script>
  16.     {# Axeptio TCF API #}
  17.     <script>
  18.         window.axeptioSettings = {
  19.             clientId: "6605abb04cb7eac815d52c91",
  20.             cookiesVersion: "first-id-fr-EU",
  21.         };
  22.         (function (d, s) {
  23.             var t = d.getElementsByTagName(s)[0],
  24.                 e = d.createElement(s);
  25.             e.async = false;
  26.             e.src = "//static.axept.io/tcf/sdk.js";
  27.             e.type = "module";
  28.             t.parentNode.insertBefore(e, t);
  29.         })(document, "script");
  30.     </script>
  31.     {# End Axeptio TCF API #}
  32. </head>
  33. <body>
  34. <nav class="navbar navbar-expand-lg navbar-light bg-light">
  35.     <a class="navbar-brand" href="{{ path('app_index') }}">{{ site_name }}</a>
  36.     <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent"
  37.             aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
  38.         <span class="navbar-toggler-icon"></span>
  39.     </button>
  40.     <button id="deleteFingerprints" class="btn btn-danger ml-auto">Delete Fingerprints</button>
  41. </nav>
  42. <div class="container">
  43.     <div class="row">
  44.         <div class="col-md-12">
  45.             <h3>First ID: <span id="firstid"></span></h3>
  46.             <div class="form-group mt-3">
  47.                 <label for="flexSelect">Mode:</label>
  48.                 <select class="form-control" id="flexSelect">
  49.                     <option selected value="loader-latest-flex.js">Flex - loader latest</option>
  50.                     <option value="loader-flex.js">Flex - loader</option>
  51.                     <option value="loader-latest-flex-no-tcf.js">Flex - NoTcf - loader latest</option>
  52.                     <option value="loader-flex-no-tcf.js">Flex - NoTcf - loader</option>
  53.                     <option value="loader.js">NON FLEX - loader</option>
  54.                     <option value="loader-latest.js">NON FLEX - loader latest</option>
  55.                     <option value="loader-no-tcf.js">NON FLEX - NoTcf - loader</option>
  56.                     <option value="loader-latest-no-tcf.js">NON FLEX - NoTcf - loader latest</option>
  57.                     <option value="loader-latest-premium-lite.js">Premium Lite - loader latest</option>
  58.                     <option value="loader-premium-lite.js">Premium Lite - loader</option>
  59.                     <option value="loader-latest-premium-lite-no-tcf.js">Premium Lite - NoTcf - loader latest</option>
  60.                     <option value="loader-premium-lite-no-tcf.js">Premium Lite - NoTcf - loader</option>
  61.                     <option value="loader-adaptive.js">Adaptive - loader</option>
  62.                     <option value="loader-adaptive-no-tcf.js">Adaptive - NoTcf</option>
  63.                 </select>
  64.             </div>
  65.         </div>
  66.     </div>
  67.     <div class="mt-4 row">
  68.         <div class="col-md-6">
  69.             <h4>Client ID:</h4>
  70.             <input type="text" id="ClientIdInput" class="mb-2 form-control" placeholder="Enter Client ID (e.g., XXXX)">
  71.         </div>
  72.         <div class="col-md-6">
  73.             <h4>PwdId:</h4>
  74.             <input type="text" id="PwdidInput" class="mb-2 form-control" placeholder="Enter a PwdId">
  75.         </div>
  76.         <div class="col-md-6">
  77.             <h4>CxenseId:</h4>
  78.             <input type="text" id="CxenseIdInput" class="mb-2 form-control" placeholder="Enter CxenseId">
  79.         </div>
  80.         <div class="col-md-6">
  81.             <h4>Email hashé:</h4>
  82.             <input type="text" id="EmailInput" class="mb-2 form-control" placeholder="Enter Hashed Email">
  83.         </div>
  84.     </div>
  85.     <div class="mt-4 row">
  86.         <button id="loadSDK" class="btn btn-secondary m-4">(re)Load SDK with parameters</button>
  87.         <button id="loadCustomData" class="btn btn-secondary m-4">Only pass Pwdid and CxenseId (sdk must already be loaded)</button>
  88.         <button id="loadNewSDK" class="btn btn-secondary m-4">Load new SDK without unloading previous</button>
  89.     </div>
  90.     {% block body %}{% endblock %}
  91. </div>
  92. <script>
  93.     function getCookieValueFromCookieName(cookieName) {
  94.         let cookieArr = document.cookie.split(";");
  95.         for (let i = 0; i < cookieArr.length; i++) {
  96.             let cookiePair = cookieArr[i].split("=");
  97.             if (cookieName === cookiePair[0].trim()) {
  98.                 return decodeURIComponent(cookiePair[1]);
  99.             }
  100.         }
  101.         return null;
  102.     }
  103.     document.getElementById('loadCustomData').addEventListener('click', async function() {
  104.         if(!window.FIRSTID) {
  105.             console.error('FirstID SDK not loaded yet.');
  106.             alert('FirstID SDK not loaded yet.');
  107.             return
  108.         }
  109.         if(!window.FIRSTID.setCustomData) {
  110.             console.error('FirstID SDK does not support setCustomData method.');
  111.             alert('FirstID SDK does not support setCustomData method.');
  112.             return
  113.         }
  114.         console.log('Custom data setting...');
  115.         const pwdId = document.getElementById('PwdidInput').value;
  116.         const cxenseId = document.getElementById('CxenseIdInput').value;
  117.         if(pwdId || cxenseId) {
  118.             await window.FIRSTID.setCustomData({
  119.                 pwdId: pwdId,
  120.                 cxenseId: cxenseId
  121.             })
  122.             console.log('Custom data set.');
  123.         }
  124.         const emailHashed = document.getElementById('EmailInput').value;
  125.         if(emailHashed) {
  126.             await window.FIRSTID.setEmailHashed(emailHashed)
  127.             console.log('Email hashed set.');
  128.         }
  129.     });
  130.     const sdkScriptId = 'firstId-sdk-script';
  131.     function loadSDK({ cleanPreviousVersion = true, loadCustomData = true }) {
  132.         console.time("sdk:callback");
  133.         console.time("sdk:event");
  134.         const sdkVersion = document.getElementById('flexSelect').value;
  135.         const existingScript = document.getElementById(sdkScriptId);
  136.         if (existingScript && cleanPreviousVersion) {
  137.             existingScript.remove();
  138.             console.log('Existing SDK script removed.');
  139.             window.FIRSTID = undefined;
  140.             window.FIRSTID_LOADING = undefined;
  141.             window.FIRSTID_BY_TYPE = undefined;
  142.         }
  143.         window.firstId = {
  144.             callbacks: [],
  145.             debug: true,
  146.             cookieName: 'firstid',
  147.             xhrTimeoutInMs: 30000
  148.         };
  149.         if(loadCustomData) {
  150.             const clientId = document.getElementById('ClientIdInput').value;
  151.             const pwdId = document.getElementById('PwdidInput').value;
  152.             const cxenseId = document.getElementById('CxenseIdInput').value;
  153.             const emailHashed = document.getElementById('EmailInput').value;
  154.             if(clientId) {
  155.                 window.firstId.clientId = clientId;
  156.                 console.log('Client ID set to:', clientId);
  157.             }
  158.             if(pwdId || cxenseId) {
  159.                 window.firstId.customData = {
  160.                     pwdId: pwdId,
  161.                     cxenseId: cxenseId
  162.                 }
  163.             }
  164.             if(emailHashed) {
  165.                 window.firstId.emailHashed = emailHashed;
  166.             }
  167.         }
  168.         window.firstId.callbacks.push(() => {
  169.             console.log('FirstID SDK (No TCF) loaded and initialized.');
  170.             console.timeEnd("sdk:callback");
  171.             // Additional FirstID SDK logic here
  172.         });
  173.         window.firstId.callbacks.push(() => {
  174.             console.log(FIRSTID.getId());
  175.         });
  176.         // FirstID SDK will be initialized automatically
  177.         var script = document.createElement('script');
  178.         script.id = sdkScriptId;
  179.         script.src = `https://cdn.preprod.first-id.fr/sdk/loader/${sdkVersion}?id=1234567890`;
  180.         script.defer = true;
  181.         document.head.appendChild(script);
  182.     }
  183.     document.getElementById('loadSDK').addEventListener('click', function() {
  184.         loadSDK({
  185.             loadCustomData: true
  186.         });
  187.     });
  188.     document.getElementById('loadNewSDK').addEventListener('click', function() {
  189.         loadSDK({
  190.             loadCustomData: true,
  191.             cleanPreviousVersion: false
  192.         });
  193.     });
  194.     let interval = undefined;
  195.     function updateFid() {
  196.         let fid = getCookieValueFromCookieName('firstid');
  197.         if (fid) {
  198.             $('#firstid').text(fid);
  199.         } else {
  200.             $('#firstid').text('No First ID cookie found.');
  201.         }
  202.     }
  203.     interval = setInterval(updateFid, 1000);
  204.     document.addEventListener('firstId:available', (event) => console.log('First id available:', event.detail.firstId));
  205.     document.addEventListener('firstId:new', (event) => console.log('New first id:', event.detail));
  206.     document.addEventListener('firstId:initialized', (event) => {
  207.         console.log('First id initialized:', event.detail)
  208.         console.timeEnd("sdk:event");
  209.     });
  210.     document.getElementById('deleteFingerprints').addEventListener('click', async function() {
  211.         const confirmDelete = confirm('Êtes-vous sûr de vouloir supprimer vos fingerprints dans la matrice ?');
  212.         if (!confirmDelete) {
  213.             return;
  214.         }
  215.         try {
  216.             const browserSignature = [
  217.                 navigator?.userAgent ?? '',
  218.                 navigator?.language ?? '',
  219.                 screen?.width ?? 0,
  220.                 screen?.height ?? 0,
  221.                 navigator?.deviceMemory ?? 0,
  222.                 navigator?.hardwareConcurrency ?? 0
  223.             ].join("::");
  224.             const queryParams = new URLSearchParams({
  225.                 bs: browserSignature,
  226.             });
  227.             const clientIdInput = document.getElementById('ClientIdInput').value;
  228.             if (clientIdInput) {
  229.                 queryParams.append('clientId', clientIdInput);
  230.             }
  231.             const deleteUrl = `https://api-v4.preprod.first-id.fr/fg?${queryParams.toString()}`;
  232.             const deleteUrlipv6 = `https://api-v6.preprod.first-id.fr/fg?${queryParams.toString()}`;
  233.             console.log('Deleting fingerprints with URL:', deleteUrl);
  234.             console.log('Deleting fingerprints with URL:', deleteUrlipv6);
  235.             const [response, responseipv6] = await Promise.allSettled([
  236.                 fetch(deleteUrl, {
  237.                     method: 'DELETE',
  238.                     credentials: 'include'
  239.                 }),
  240.                 fetch(deleteUrlipv6, {
  241.                     method: 'DELETE',
  242.                     credentials: 'include'
  243.                 })
  244.             ]);
  245.             const responseOk = response.status === 'fulfilled' && response.value.ok;
  246.             const responseIpv6Ok = responseipv6.status === 'fulfilled' && responseipv6.value.ok;
  247.             if (responseOk || responseIpv6Ok) {
  248.                 console.log('Fingerprints deleted successfully');
  249.                 alert('Fingerprints supprimés avec succès !');
  250.             } else {
  251.                 const responseStatus = response.status === 'fulfilled'
  252.                     ? `${response.value.status} ${response.value.statusText}`
  253.                     : `Erreur: ${response.reason}`;
  254.                 const responseIpv6Status = responseipv6.status === 'fulfilled'
  255.                     ? `${responseipv6.value.status} ${responseipv6.value.statusText}`
  256.                     : `Erreur: ${responseipv6.reason}`;
  257.                 console.error('Error deleting fingerprints:', responseStatus, responseIpv6Status);
  258.                 alert(`Erreur lors de la suppression :
  259. ${responseStatus}
  260. ${responseIpv6Status}`);
  261.             }
  262.         } catch (error) {
  263.             console.error('Error deleting fingerprints:', error);
  264.             alert('Erreur lors de la suppression des fingerprints');
  265.         }
  266.     });
  267. </script>
  268. </body>
  269. </html>