|
|
document.addEventListener('DOMContentLoaded', function() { |
|
|
|
|
|
const passwordInput = document.getElementById('passwordInput'); |
|
|
const unlockBtn = document.getElementById('unlockBtn'); |
|
|
const passwordSection = document.getElementById('passwordSection'); |
|
|
const fileSection = document.getElementById('fileSection'); |
|
|
|
|
|
|
|
|
const uploadBtn = document.getElementById('uploadBtn'); |
|
|
const fileInput = document.getElementById('fileInput'); |
|
|
const fileList = document.getElementById('fileList'); |
|
|
|
|
|
|
|
|
let files = []; |
|
|
|
|
|
|
|
|
const urlHash = window.location.hash.substring(1); |
|
|
if (urlHash) { |
|
|
console.log('Vault accessed via hash:', urlHash); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
unlockBtn.addEventListener('click', function() { |
|
|
const password = passwordInput.value.trim(); |
|
|
|
|
|
if (!password) { |
|
|
alert('Please enter a password'); |
|
|
return; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
passwordSection.classList.add('hidden'); |
|
|
fileSection.classList.remove('hidden'); |
|
|
|
|
|
|
|
|
loadFiles(); |
|
|
}); |
|
|
|
|
|
|
|
|
passwordInput.addEventListener('keyup', function(e) { |
|
|
if (e.key === 'Enter') { |
|
|
unlockBtn.click(); |
|
|
} |
|
|
}); |
|
|
|
|
|
|
|
|
uploadBtn.addEventListener('click', function() { |
|
|
fileInput.click(); |
|
|
}); |
|
|
|
|
|
fileInput.addEventListener('change', function(e) { |
|
|
if (e.target.files.length > 0) { |
|
|
const file = e.target.files[0]; |
|
|
uploadFile(file); |
|
|
} |
|
|
}); |
|
|
|
|
|
function uploadFile(file) { |
|
|
|
|
|
|
|
|
|
|
|
const newFile = { |
|
|
id: Date.now(), |
|
|
name: file.name, |
|
|
type: getFileType(file.name), |
|
|
size: formatFileSize(file.size), |
|
|
date: new Date().toLocaleDateString(), |
|
|
file: file |
|
|
}; |
|
|
|
|
|
files.unshift(newFile); |
|
|
renderFiles(); |
|
|
|
|
|
|
|
|
fileInput.value = ''; |
|
|
} |
|
|
|
|
|
function loadFiles() { |
|
|
|
|
|
setTimeout(() => { |
|
|
|
|
|
files = [ |
|
|
{ id: 1, name: 'Project_Documentation.pdf', type: 'pdf', size: '2.4 MB', date: '2023-05-15' }, |
|
|
{ id: 2, name: 'Budget_2023.xlsx', type: 'sheet', size: '1.1 MB', date: '2023-04-22' }, |
|
|
{ id: 3, name: 'Team_Photo.jpg', type: 'image', size: '3.7 MB', date: '2023-03-10' }, |
|
|
{ id: 4, name: 'Backup_Archive.zip', type: 'zip', size: '45.2 MB', date: '2023-02-05' } |
|
|
]; |
|
|
renderFiles(); |
|
|
}, 800); |
|
|
} |
|
|
|
|
|
function renderFiles() { |
|
|
fileList.innerHTML = ''; |
|
|
|
|
|
if (files.length === 0) { |
|
|
fileList.innerHTML = ` |
|
|
<div class="p-4 text-center text-gray-500"> |
|
|
<i data-feather="folder" class="w-12 h-12 mx-auto text-gray-400 mb-2"></i> |
|
|
<p>No files in this vault yet</p> |
|
|
</div> |
|
|
`; |
|
|
feather.replace(); |
|
|
return; |
|
|
} |
|
|
|
|
|
files.forEach(file => { |
|
|
const fileItem = document.createElement('div'); |
|
|
fileItem.className = 'file-item px-4 py-3 hover:bg-gray-50 transition duration-150'; |
|
|
fileItem.innerHTML = ` |
|
|
<div class="grid grid-cols-12 gap-4 items-center"> |
|
|
<div class="col-span-6 flex items-center"> |
|
|
<i data-feather="${getFileIcon(file.type)}" class="mr-3 ${getFileTypeClass(file.type)}"></i> |
|
|
<span class="truncate">${file.name}</span> |
|
|
</div> |
|
|
<div class="col-span-2 text-sm text-gray-500">${getFileTypeName(file.type)}</div> |
|
|
<div class="col-span-2 text-sm text-gray-500">${file.size}</div> |
|
|
<div class="col-span-2 flex justify-end space-x-2"> |
|
|
<button class="download-btn p-2 text-gray-500 hover:text-blue-600 rounded-full hover:bg-blue-50" data-id="${file.id}"> |
|
|
<i data-feather="download"></i> |
|
|
</button> |
|
|
<button class="delete-btn p-2 text-gray-500 hover:text-red-600 rounded-full hover:bg-red-50" data-id="${file.id}"> |
|
|
<i data-feather="trash-2"></i> |
|
|
</button> |
|
|
</div> |
|
|
</div> |
|
|
`; |
|
|
fileList.appendChild(fileItem); |
|
|
}); |
|
|
|
|
|
feather.replace(); |
|
|
|
|
|
|
|
|
document.querySelectorAll('.download-btn').forEach(btn => { |
|
|
btn.addEventListener('click', function() { |
|
|
const fileId = parseInt(this.getAttribute('data-id')); |
|
|
downloadFile(fileId); |
|
|
}); |
|
|
}); |
|
|
|
|
|
document.querySelectorAll('.delete-btn').forEach(btn => { |
|
|
btn.addEventListener('click', function() { |
|
|
const fileId = parseInt(this.getAttribute('data-id')); |
|
|
deleteFile(fileId); |
|
|
}); |
|
|
}); |
|
|
} |
|
|
|
|
|
function downloadFile(fileId) { |
|
|
const file = files.find(f => f.id === fileId); |
|
|
if (file) { |
|
|
alert(`Downloading: ${file.name}\n\nIn a real app, this would download the file.`); |
|
|
} |
|
|
} |
|
|
|
|
|
function deleteFile(fileId) { |
|
|
if (confirm('Are you sure you want to delete this file?')) { |
|
|
files = files.filter(f => f.id !== fileId); |
|
|
renderFiles(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function getFileType(filename) { |
|
|
const extension = filename.split('.').pop().toLowerCase(); |
|
|
|
|
|
if (['pdf'].includes(extension)) return 'pdf'; |
|
|
if (['jpg', 'jpeg', 'png', 'gif', 'svg'].includes(extension)) return 'image'; |
|
|
if (['doc', 'docx'].includes(extension)) return 'doc'; |
|
|
if (['xls', 'xlsx'].includes(extension)) return 'sheet'; |
|
|
if (['ppt', 'pptx'].includes(extension)) return 'ppt'; |
|
|
if (['zip', 'rar', '7z'].includes(extension)) return 'zip'; |
|
|
return 'other'; |
|
|
} |
|
|
|
|
|
function getFileIcon(type) { |
|
|
const icons = { |
|
|
'pdf': 'file-text', |
|
|
'image': 'image', |
|
|
'doc': 'file-text', |
|
|
'sheet': 'file-text', |
|
|
'ppt': 'file-text', |
|
|
'zip': 'archive', |
|
|
'other': 'file' |
|
|
}; |
|
|
return icons[type] || 'file'; |
|
|
} |
|
|
|
|
|
function getFileTypeClass(type) { |
|
|
return `file-type-${type}`; |
|
|
} |
|
|
|
|
|
function getFileTypeName(type) { |
|
|
const names = { |
|
|
'pdf': 'PDF', |
|
|
'image': 'Image', |
|
|
'doc': 'Document', |
|
|
'sheet': 'Spreadsheet', |
|
|
'ppt': 'Presentation', |
|
|
'zip': 'Archive', |
|
|
'other': 'File' |
|
|
}; |
|
|
return names[type] || 'File'; |
|
|
} |
|
|
|
|
|
function formatFileSize(bytes) { |
|
|
if (bytes === 0) return '0 Bytes'; |
|
|
const k = 1024; |
|
|
const sizes = ['Bytes', 'KB', 'MB', 'GB']; |
|
|
const i = Math.floor(Math.log(bytes) / Math.log(k)); |
|
|
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; |
|
|
} |
|
|
}); |