Added the ability to add torrents by dragging.

This commit is contained in:
2025-10-24 22:39:51 +03:00
parent 6282d83351
commit 0e618878bc

View File

@@ -221,9 +221,73 @@
return `${m}:${s}`;
}
let dragActive = false;
let pageDragOverlay = false;
let dragCounter = 0;
// sadece drop-zone alanına gelen olayları işleme
function handleDragOver(e) {
e.preventDefault();
e.stopPropagation();
if (torrents.length === 0) dragActive = true;
else pageDragOverlay = true;
}
function handleDragEnter(e) {
e.preventDefault();
e.stopPropagation();
dragCounter++;
if (torrents.length === 0) dragActive = true;
else pageDragOverlay = true;
}
function handleDragLeave(e) {
e.preventDefault();
e.stopPropagation();
dragCounter--;
if (dragCounter <= 0) {
dragActive = false;
pageDragOverlay = false;
}
}
async function handleDrop(e) {
e.preventDefault();
e.stopPropagation();
dragCounter = 0;
dragActive = false;
pageDragOverlay = false;
const files = Array.from(e.dataTransfer?.files || []);
const torrentsToUpload = files.filter((f) => f.name.endsWith(".torrent"));
if (!torrentsToUpload.length) return;
for (const file of torrentsToUpload) {
const fd = new FormData();
fd.append("torrent", file);
await apiFetch("/api/transfer", { method: "POST", body: fd });
}
await list();
}
// 🧩 Global dinleyiciler — sadece overlay için, drop'u engellemeden
function addGlobalDragListeners() {
window.addEventListener("dragenter", handleDragEnter);
window.addEventListener("dragleave", handleDragLeave);
window.addEventListener("dragover", (e) => e.preventDefault());
window.addEventListener("drop", (e) => {
e.preventDefault();
dragCounter = 0;
dragActive = false;
pageDragOverlay = false;
});
}
onMount(() => {
list(); // 🔒 token'lı liste çekimi
wsConnect(); // 🔒 token'lı WebSocket
addGlobalDragListeners();
const slider = document.querySelector(".volume-slider");
if (slider) {
slider.value = volume;
@@ -255,12 +319,27 @@
</div>
{#if torrents.length === 0}
<div class="empty">
<div style="font-size:42px"></div>
<div style="font-weight:700">No files whatsoever!</div>
<div
class="empty drop-zone {dragActive ? 'active' : ''}"
on:dragenter={handleDragEnter}
on:dragover={handleDragOver}
on:dragleave={handleDragLeave}
on:drop={handleDrop}
>
<div class="drop-inner">
<i class="fa-solid fa-cloud-arrow-up"></i>
<div class="title">Drop your .torrent file here</div>
<div class="subtitle">or use the buttons above</div>
</div>
</div>
{:else}
<div class="torrent-list">
<div
class="torrent-list"
on:dragenter={handleDragEnter}
on:dragover={handleDragOver}
on:dragleave={handleDragLeave}
on:drop={handleDrop}
>
{#each torrents as t (t.infoHash)}
<div class="torrent" on:click={() => openModal(t)}>
{#if t.thumbnail}
@@ -328,16 +407,28 @@
</div>
</div>
{/each}
{#if pageDragOverlay}
<div class="page-drop-overlay">
<div class="page-drop-text">
<i class="fa-solid fa-cloud-arrow-up"></i>
<span>Drop to add torrent</span>
</div>
</div>
{/if}
</div>
{/if}
</section>
{#if showModal && selectedVideo}
<div class="modal-overlay" on:click={closeModal}>
<!-- 🟢 Global Close Button (Files.svelte ile aynı) -->
<button class="global-close-btn" on:click|stopPropagation={closeModal}
>✕</button
>
<div class="modal-content" on:click|stopPropagation>
<div class="modal-header">
<div class="video-title">{selectedVideo.name}</div>
<button class="close-btn" on:click={closeModal}>✕</button>
</div>
<div class="custom-player">
@@ -567,6 +658,81 @@
padding: 3px 0 8px 0;
}
/* 🪄 Drop Zone */
/* === 🧊 Drop Zone (boş sayfa görünümü) === */
.drop-zone {
border: 2px dashed rgba(160, 160, 160, 0.4);
border-radius: 12px;
padding: 60px 20px;
text-align: center;
background: rgba(245, 245, 245, 0.5);
transition: background 0.3s ease;
}
.drop-zone.active {
backdrop-filter: blur(10px) brightness(0.9);
background: rgba(150, 150, 150, 0.35);
border-color: rgba(100, 100, 100, 0.6);
transition: all 0.3s ease;
}
.drop-inner {
color: #777;
}
.drop-inner i {
font-size: 42px;
color: #aaa;
}
.drop-inner .title {
font-weight: 600;
margin-top: 6px;
}
.drop-inner .subtitle {
font-size: 13px;
color: #999;
}
/* === Liste doluyken sayfa üstü blur === */
.page-drop-overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
backdrop-filter: blur(8px);
background: rgba(200, 200, 200, 0.4);
border-radius: 12px;
z-index: 200;
display: flex;
align-items: center;
justify-content: center;
animation: fadeIn 0.2s ease;
}
.page-drop-text {
color: #666;
display: flex;
flex-direction: column;
align-items: center;
font-weight: 600;
font-size: 18px;
}
.page-drop-text i {
font-size: 42px;
margin-bottom: 8px;
color: #888;
}
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
/* --- Responsive Düzenlemeler --- */
@media (max-width: 1024px) {
.torrent {