""" share_dialog.py — Del en playliste med andre brugere eller sæt den public. """ from PyQt6.QtWidgets import ( QDialog, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QComboBox, QFrame, QListWidget, QListWidgetItem, QMessageBox, ) from PyQt6.QtCore import Qt class ShareDialog(QDialog): def __init__(self, playlist_id: str, playlist_name: str, server_url: str, token: str, parent=None): super().__init__(parent) self._playlist_id = playlist_id self._playlist_name = playlist_name self._server_url = server_url.rstrip("/") self._token = token self.setWindowTitle(f"Del — {playlist_name}") self.setMinimumWidth(480) self._build_ui() self._load_shares() self._load_visibility() def _headers(self): return { "Content-Type": "application/json", "Authorization": f"Bearer {self._token}", } def _build_ui(self): layout = QVBoxLayout(self) layout.setContentsMargins(12, 12, 12, 12) layout.setSpacing(10) # Synlighed vis_frame = QFrame() vis_frame.setObjectName("track_display") vis_layout = QHBoxLayout(vis_frame) vis_layout.setContentsMargins(10, 8, 10, 8) vis_layout.addWidget(QLabel("Synlighed:")) self._vis_combo = QComboBox() self._vis_combo.addItem("🔒 Privat (kun mig)", "private") self._vis_combo.addItem("👥 Delt (inviterede)", "shared") self._vis_combo.addItem("🌐 Public (alle kan se)", "public") vis_layout.addWidget(self._vis_combo, stretch=1) btn_vis = QPushButton("Gem") btn_vis.setFixedHeight(28) btn_vis.clicked.connect(self._set_visibility) vis_layout.addWidget(btn_vis) layout.addWidget(vis_frame) # Invitér bruger inv_frame = QFrame() inv_frame.setObjectName("track_display") inv_layout = QVBoxLayout(inv_frame) inv_layout.setContentsMargins(10, 8, 10, 8) inv_layout.setSpacing(6) inv_layout.addWidget(QLabel("Invitér via e-mail:")) row = QHBoxLayout() self._email_input = QLineEdit() self._email_input.setPlaceholderText("bruger@eksempel.dk") row.addWidget(self._email_input) self._perm_combo = QComboBox() self._perm_combo.addItem("Se", "view") self._perm_combo.addItem("Kopiere", "copy") self._perm_combo.addItem("Redigere","edit") self._perm_combo.setFixedWidth(90) row.addWidget(self._perm_combo) btn_inv = QPushButton("Invitér") btn_inv.setFixedHeight(28) btn_inv.clicked.connect(self._invite) row.addWidget(btn_inv) inv_layout.addLayout(row) layout.addWidget(inv_frame) # Liste over delinger lbl = QLabel("Delt med:") lbl.setObjectName("track_meta") layout.addWidget(lbl) self._shares_list = QListWidget() self._shares_list.setMaximumHeight(150) layout.addWidget(self._shares_list) btn_remove = QPushButton("✕ Fjern valgt deling") btn_remove.clicked.connect(self._remove_share) layout.addWidget(btn_remove) self._status = QLabel("") self._status.setObjectName("result_count") self._status.setWordWrap(True) layout.addWidget(self._status) btn_close = QPushButton("Luk") btn_close.clicked.connect(self.accept) layout.addWidget(btn_close) def _load_visibility(self): try: import urllib.request, json req = urllib.request.Request( f"{self._server_url}/sharing/playlists/{self._playlist_id}", headers=self._headers() ) with urllib.request.urlopen(req, timeout=8) as resp: data = json.loads(resp.read()) vis = data.get("visibility", "private") for i in range(self._vis_combo.count()): if self._vis_combo.itemData(i) == vis: self._vis_combo.setCurrentIndex(i) break except Exception: pass def _load_shares(self): try: import urllib.request, json req = urllib.request.Request( f"{self._server_url}/sharing/playlists/{self._playlist_id}/shares", headers=self._headers() ) with urllib.request.urlopen(req, timeout=8) as resp: shares = json.loads(resp.read()) self._shares_list.clear() for s in shares: perm = {"view": "Se", "copy": "Kopiere", "edit": "Redigere"}.get( s["permission"], s["permission"] ) accepted = "✓" if s["accepted"] else "⏳" item = QListWidgetItem(f"{accepted} {s['email']} — {perm}") item.setData(Qt.ItemDataRole.UserRole, s["id"]) self._shares_list.addItem(item) except Exception as e: self._status.setText(f"Kunne ikke hente delinger: {e}") def _set_visibility(self): vis = self._vis_combo.currentData() try: import urllib.request, json req = urllib.request.Request( f"{self._server_url}/sharing/playlists/{self._playlist_id}/visibility?visibility={vis}", data=b"", headers=self._headers(), method="PATCH" ) with urllib.request.urlopen(req, timeout=8) as resp: json.loads(resp.read()) self._status.setText(f"✓ Synlighed sat til {self._vis_combo.currentText()}") except Exception as e: self._status.setText(f"⚠ Fejl: {e}") def _invite(self): email = self._email_input.text().strip() perm = self._perm_combo.currentData() if not email or "@" not in email: self._status.setText("⚠ Ugyldig e-mailadresse") return try: import urllib.request, json data = json.dumps({"email": email, "permission": perm}).encode() req = urllib.request.Request( f"{self._server_url}/sharing/playlists/{self._playlist_id}/share", data=data, headers=self._headers(), method="POST" ) with urllib.request.urlopen(req, timeout=8) as resp: json.loads(resp.read()) self._email_input.clear() self._status.setText(f"✓ Invitation sendt til {email}") self._load_shares() except Exception as e: self._status.setText(f"⚠ Fejl: {e}") def _remove_share(self): item = self._shares_list.currentItem() if not item: return share_id = item.data(Qt.ItemDataRole.UserRole) try: import urllib.request req = urllib.request.Request( f"{self._server_url}/sharing/playlists/{self._playlist_id}/share/{share_id}", headers=self._headers(), method="DELETE" ) urllib.request.urlopen(req, timeout=8) self._status.setText("✓ Deling fjernet") self._load_shares() except Exception as e: self._status.setText(f"⚠ Fejl: {e}")