From a6019e264234ae55921ee9c4cadb0929fc801ddf Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Sun, 22 Oct 2023 19:49:53 +0200
Subject: [PATCH] AMADEUS: When making operations on playlists, send requests
 to lektord

NOTE: The hashmap thing is still a bit buggy...
---
 amadeus/src/app.rs                            | 34 +++++++++++++------
 amadeus/src/components/mainpanel/playlists.rs |  6 ++++
 2 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/amadeus/src/app.rs b/amadeus/src/app.rs
index 1dc0b0bb..86b9c8ec 100644
--- a/amadeus/src/app.rs
+++ b/amadeus/src/app.rs
@@ -22,7 +22,7 @@ use iced::{
 };
 use iced_aw::{native::Split, split};
 use lektor_lib::{requests::*, ConnectConfigPtr};
-use lektor_payloads::{KId, Kara, PlayState, PlayStateWithCurrent};
+use lektor_payloads::{KId, Kara, KaraFilter, PlayState, PlayStateWithCurrent};
 use lektor_utils::{config::UserConfig, log};
 use std::{future::Future, sync::Arc};
 
@@ -250,6 +250,12 @@ impl Amadeus {
                 playlists::Request::Inner(plt, karalist::Request(req)) => {
                     self.handle_kara_request(req, Some(plt))
                 }
+                playlists::Request::AddTo(name, id) => {
+                    send(add_to_playlist(cfg, name, KaraFilter::KId(id)))
+                }
+                playlists::Request::RemoveFrom(name, id) => {
+                    send(remove_from_playlist(cfg, name, KaraFilter::KId(id)))
+                }
             },
 
             // Search/Database
@@ -315,27 +321,35 @@ impl Amadeus {
             // Need to open a modal to take decision.
             (None, RemoveFromPlaylist(id)) => {
                 let plts = self.playlist_list().to_vec();
-                let on_select = OnPlaylistSelectCallback::new(move |name| {
-                    playlists::Message::RemoveKaraFromPlaylist(name, id.clone()).into()
+                let callback = OnPlaylistSelectCallback::new(move |name| {
+                    Message::from_iter([
+                        playlists::Request::RemoveFrom(name.clone(), id.clone()).into(),
+                        playlists::Message::RemoveKaraFromPlaylist(name, id.clone()).into(),
+                    ])
                 });
-                Command::perform(async {}, |_| {
-                    ShowModal::ChoosePlaylist(plts, on_select).into()
-                })
+                let action = |_| ShowModal::ChoosePlaylist(plts, callback).into();
+                Command::perform(async {}, action)
             }
             (Some(plt), AddToPlaylist(id)) => {
                 let plts = self.playlist_list().to_vec();
-                self.with_kara(id, |kara| {
+                self.with_kara(id.clone(), |kara| {
                     let cb = OnPlaylistSelectCallback::new(move |name| {
-                        playlists::Message::AddKaraToPlaylist(name, kara.clone()).into()
+                        Message::from_iter([
+                            playlists::Request::AddTo(name.clone(), id.clone()).into(),
+                            playlists::Message::AddKaraToPlaylist(name, kara.clone()).into(),
+                        ])
                     });
                     ShowModal::ChoosePlaylistExpect(plt, plts, cb).into()
                 })
             }
             (None, AddToPlaylist(id)) => {
                 let plts = self.playlist_list().to_vec();
-                self.with_kara(id, |kara| {
+                self.with_kara(id.clone(), |kara| {
                     let cb = OnPlaylistSelectCallback::new(move |name| {
-                        playlists::Message::AddKaraToPlaylist(name, kara.clone()).into()
+                        Message::from_iter([
+                            playlists::Request::AddTo(name.clone(), id.clone()).into(),
+                            playlists::Message::AddKaraToPlaylist(name, kara.clone()).into(),
+                        ])
                     });
                     ShowModal::ChoosePlaylist(plts, cb).into()
                 })
diff --git a/amadeus/src/components/mainpanel/playlists.rs b/amadeus/src/components/mainpanel/playlists.rs
index 5d9b4ca4..5a5956e9 100644
--- a/amadeus/src/components/mainpanel/playlists.rs
+++ b/amadeus/src/components/mainpanel/playlists.rs
@@ -32,6 +32,12 @@ pub enum Request {
     /// Refresh a playlist.
     Refresh(Arc<str>),
 
+    /// Add a [KId] to a playlist.
+    AddTo(Arc<str>, KId),
+
+    /// Remove a [KId] from a playlist.
+    RemoveFrom(Arc<str>, KId),
+
     /// Inner playlist event, wrapper around the [karalist::Request]
     Inner(Arc<str>, karalist::Request),
 }
-- 
GitLab