import { api } from '../api.js'; import './login-view.js'; import './file-list.js'; import './file-upload.js'; import './share-modal.js'; import './photo-gallery.js'; import './file-preview.js'; import { shortcuts } from '../shortcuts.js'; export class RBoxApp extends HTMLElement { constructor() { super(); this.currentView = 'files'; this.currentFolderId = null; this.user = null; } async connectedCallback() { await this.init(); } async init() { if (!api.getToken()) { this.showLogin(); } else { try { this.user = await api.getCurrentUser(); this.render(); } catch (error) { this.showLogin(); } } } showLogin() { this.innerHTML = ''; const loginView = this.querySelector('login-view'); loginView.addEventListener('auth-success', () => this.init()); } render() { this.innerHTML = `

RBox

`; this.attachListeners(); this.registerShortcuts(); } registerShortcuts() { shortcuts.register('ctrl+u', () => { const upload = this.querySelector('file-upload'); if (upload) { upload.setFolder(this.currentFolderId); upload.show(); } }); shortcuts.register('ctrl+f', () => { const searchInput = this.querySelector('#search-input'); if (searchInput) { searchInput.focus(); } }); shortcuts.register('ctrl+/', () => { this.showShortcutsHelp(); }); shortcuts.register('ctrl+shift+n', () => { if (this.currentView === 'files') { const fileList = this.querySelector('file-list'); if (fileList) { fileList.triggerCreateFolder(); } } }); shortcuts.register('1', () => { this.switchView('files'); }); shortcuts.register('2', () => { this.switchView('photos'); }); shortcuts.register('3', () => { this.switchView('shared'); }); shortcuts.register('4', () => { this.switchView('deleted'); }); shortcuts.register('f2', () => { console.log('Rename shortcut - to be implemented'); }); } showShortcutsHelp() { const helpContent = `

Keyboard Shortcuts

File Operations

Ctrl + U Upload files
Ctrl + Shift + N Create new folder
Ctrl + F Focus search

Navigation

1 My Files
2 Photo Gallery
3 Shared Items
4 Deleted Files

General

ESC Close modals
Ctrl + / Show this help
`; const helpDiv = document.createElement('div'); helpDiv.innerHTML = helpContent; helpDiv.querySelector('.shortcuts-help-modal').style.cssText = ` position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.5); display: flex; align-items: center; justify-content: center; z-index: 10000; `; document.body.appendChild(helpDiv); const closeHelp = () => { document.body.removeChild(helpDiv); document.removeEventListener('keydown', handleEscape); }; const handleEscape = (e) => { if (e.key === 'Escape') { closeHelp(); } }; const closeBtn = helpDiv.querySelector('#close-shortcuts-help'); closeBtn.addEventListener('click', closeHelp); helpDiv.querySelector('.shortcuts-help-modal').addEventListener('click', (e) => { if (e.target.classList.contains('shortcuts-help-modal')) closeHelp(); }); document.addEventListener('keydown', handleEscape); } attachListeners() { this.querySelector('#logout-btn')?.addEventListener('click', () => { api.logout(); }); this.querySelectorAll('.nav-link').forEach(link => { link.addEventListener('click', (e) => { e.preventDefault(); const view = link.dataset.view; this.switchView(view); }); }); const fileList = this.querySelector('file-list'); if (fileList) { fileList.addEventListener('upload-request', () => { const upload = this.querySelector('file-upload'); upload.setFolder(this.currentFolderId); upload.show(); }); fileList.addEventListener('folder-open', (e) => { this.currentFolderId = e.detail.folderId; fileList.loadContents(this.currentFolderId); }); fileList.addEventListener('share-request', (e) => { const modal = this.querySelector('share-modal'); modal.show(e.detail.fileId); }); } const upload = this.querySelector('file-upload'); if (upload) { upload.addEventListener('upload-complete', () => { const fileList = this.querySelector('file-list'); fileList.loadContents(this.currentFolderId); }); } const searchInput = this.querySelector('#search-input'); if (searchInput) { let searchTimeout; searchInput.addEventListener('input', (e) => { clearTimeout(searchTimeout); const query = e.target.value.trim(); if (query.length > 0) { searchTimeout = setTimeout(() => this.performSearch(query), 300); } }); } this.addEventListener('photo-click', (e) => { const preview = this.querySelector('file-preview'); preview.show(e.detail.photo); }); this.addEventListener('share-file', (e) => { const modal = this.querySelector('share-modal'); modal.show(e.detail.file.id); }); } async performSearch(query) { try { const files = await api.searchFiles(query); const mainContent = this.querySelector('#main-content'); mainContent.innerHTML = `

Search Results for "${query}"

`; const fileList = mainContent.querySelector('file-list'); fileList.setFiles(files); this.attachListeners(); } catch (error) { console.error('Search failed:', error); } } switchView(view) { this.currentView = view; this.querySelectorAll('.nav-link').forEach(link => { link.classList.remove('active'); }); this.querySelector(`[data-view="${view}"]`)?.classList.add('active'); const mainContent = this.querySelector('#main-content'); switch (view) { case 'files': mainContent.innerHTML = ''; this.attachListeners(); break; case 'photos': mainContent.innerHTML = ''; this.attachListeners(); break; case 'shared': mainContent.innerHTML = '
Shared Items - Coming Soon
'; break; case 'deleted': mainContent.innerHTML = '
Deleted Files - Coming Soon
'; break; case 'starred': mainContent.innerHTML = '
Starred Items - Coming Soon
'; break; case 'recent': mainContent.innerHTML = '
Recent Files - Coming Soon
'; break; } } }