Spaces:
Running
Running
File size: 8,325 Bytes
16db317 973b60b 16db317 973b60b 16db317 973b60b 16db317 f0a3ee0 16db317 f0a3ee0 973b60b f0a3ee0 16db317 f0a3ee0 16db317 f0a3ee0 16db317 f0a3ee0 16db317 f0a3ee0 16db317 f0a3ee0 16db317 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 |
document.addEventListener('DOMContentLoaded', function() {
const trackForm = document.getElementById('trackForm');
const trackingLinksContainer = document.getElementById('trackingLinks');
const mediaContainer = document.getElementById('mediaContainer');
const screenshotPreview = document.getElementById('screenshotPreview');
const videoPreview = document.getElementById('videoPreview');
const trackingDetails = document.getElementById('trackingDetails');
// Load tracking links from localStorage
loadTrackingLinks();
trackForm.addEventListener('submit', function(e) {
e.preventDefault();
const targetUrl = document.getElementById('targetUrl').value;
const trackingMode = document.getElementById('trackingMode').value;
// Show loading state
const submitButton = trackForm.querySelector('button[type="submit"]');
const originalButtonText = submitButton.innerHTML;
submitButton.innerHTML = `<i data-feather="loader" class="loading-spinner mr-2"></i> Generating...`;
feather.replace();
// Generate tracking token
const trackingToken = generateToken();
// Create trackable URL
const trackableUrl = `${window.location.origin}/track.html?token=${trackingToken}`;
// Save tracking link
saveTrackingLink({
token: trackingToken,
originalUrl: targetUrl,
trackableUrl: trackableUrl,
mode: trackingMode,
createdAt: new Date().toISOString()
});
// Show success message with copy button
setTimeout(() => {
submitButton.innerHTML = originalButtonText;
feather.replace();
alert(`Your trackable link has been created:\n\n${trackableUrl}\n\nIt has been copied to your clipboard.`);
navigator.clipboard.writeText(trackableUrl);
// Reset form
trackForm.reset();
loadTrackingLinks();
}, 1500);
});
function generateToken() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
const r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
// Database simulation functions
function saveToDB(data, collection) {
// In a real app, this would be a server API call
let db = JSON.parse(localStorage.getItem('db') || '{}');
if (!db[collection]) db[collection] = [];
db[collection].push(data);
localStorage.setItem('db', JSON.stringify(db));
return data;
}
function queryDB(collection, queryFn) {
let db = JSON.parse(localStorage.getItem('db') || '{}');
if (!db[collection]) return [];
return db[collection].filter(queryFn);
}
function saveTrackingLink(trackingData) {
return saveToDB(trackingData, 'trackingLinks');
}
function loadTrackingLinks() {
return queryDB('trackingLinks', () => true);
}
function saveTrackingResult(resultData) {
return saveToDB(resultData, 'trackingResults');
}
function getTrackingResult(token) {
return queryDB('trackingResults', r => r.token === token)[0];
}
function loadUserTrackingLinks() {
const trackingLinks = JSON.parse(localStorage.getItem('trackingLinks') || '[]');
trackingLinksContainer.innerHTML = '';
if (trackingLinks.length === 0) {
trackingLinksContainer.innerHTML = '<p class="text-gray-500 text-sm">No tracking links yet</p>';
return;
}
trackingLinks.forEach(link => {
const linkElement = document.createElement('div');
linkElement.className = 'tracking-link-item p-3 bg-white rounded-md flex justify-between items-center';
linkElement.innerHTML = `
<div class="truncate">
<div class="font-medium truncate">${link.originalUrl}</div>
<div class="text-xs text-gray-500">${new Date(link.createdAt).toLocaleString()}</div>
</div>
<i data-feather="chevron-right" class="text-gray-400"></i>
`;
linkElement.addEventListener('click', () => {
showTrackingDetails(link);
});
trackingLinksContainer.appendChild(linkElement);
});
feather.replace();
}
function showTrackingDetails(link) {
// Get actual tracking data from localStorage
const trackingHistory = JSON.parse(localStorage.getItem('trackingHistory') || '[]');
const trackingData = trackingHistory.find(data => data.token === link.token);
if (!trackingData) {
alert('No tracking data available yet for this link');
return;
}
// Format tracking data for display
const userData = trackingData.userData;
const mockData = {
ip: userData.ip,
device: `${userData.device.platform} (${userData.device.userAgent})`,
location: {9
lat: userData.location.latitude,
lng: userData.location.longitude,
city: userData.location.city,
country: userData.location.country
},
openedAt: trackingData.accessedAt,
screenshot: link.mode !== 'basic' ? 'http://static.photos/technology/640x360/42' : null,
video: link.mode === 'ninja' ? 'http://static.photos/technology/640x360/99' : null,
browser: {
language: userData.browser.language,
referrer: userData.browser.referrer || 'Direct'
},
screen: `${userData.device.screen.width}x${userData.device.screen.height}`
};
// Update map
const marker = new google.maps.Marker({
position: { lat: mockData.location.lat, lng: mockData.location.lng },
map: window.map,
title: "Visitor Location"
});
window.map.setCenter({ lat: mockData.location.lat, lng: mockData.location.lng });
window.map.setZoom(8);
// Update tracking details with additional info
document.getElementById('ipAddress').textContent = mockData.ip;
document.getElementById('deviceInfo').textContent = mockData.device;
document.getElementById('locationInfo').textContent = `${mockData.location.city}, ${mockData.location.country}`;
document.getElementById('openTime').textContent = new Date(mockData.openedAt).toLocaleString();
// Add new info elements if they don't exist
if (!document.getElementById('browserInfo')) {
const statsContainer = document.getElementById('trackingStats');
statsContainer.innerHTML += `
<div><span class="font-medium">Browser:</span> <span id="browserInfo"></span></div>
<div><span class="font-medium">Screen:</span> <span id="screenInfo"></span></div>
<div><span class="font-medium">Referrer:</span> <span id="referrerInfo"></span></div>
`;
}
document.getElementById('browserInfo').textContent = mockData.browser.language;
document.getElementById('screenInfo').textContent = mockData.screen;
document.getElementById('referrerInfo').textContent = mockData.browser.referrer;
// Update media
if (mockData.screenshot) {
document.getElementById('screenshotImg').src = mockData.screenshot;
screenshotPreview.classList.remove('hidden');
} else {
screenshotPreview.classList.add('hidden');
}
if (mockData.video) {
document.getElementById('trackingVideo').src = mockData.video;
videoPreview.classList.remove('hidden');
} else {
videoPreview.classList.add('hidden');
}
// Show containers
mediaContainer.classList.remove('hidden');
trackingDetails.classList.remove('hidden');
}
function getRandomInRange(from, to, fixed) {
return parseFloat((Math.random() * (to - from) + from).toFixed(fixed));
}
}); |