diff --git a/src/User/Action/Command/SaveUserMediaPreferencesCommand.php b/src/User/Action/Command/SaveUserMediaPreferencesCommand.php index 94fe7fc..b084877 100644 --- a/src/User/Action/Command/SaveUserMediaPreferencesCommand.php +++ b/src/User/Action/Command/SaveUserMediaPreferencesCommand.php @@ -3,6 +3,7 @@ namespace App\User\Action\Command; use OneToMany\RichBundle\Contract\CommandInterface; +use Symfony\Component\Form\FormInterface; /** @implements CommandInterface */ class SaveUserMediaPreferencesCommand implements CommandInterface @@ -14,4 +15,15 @@ class SaveUserMediaPreferencesCommand implements CommandInterface public string $language, public string $provider, ) {} + + public static function fromUserMediaPreferencesForm(FormInterface $form): self + { + return new static( + resolution: $form->get('resolution')->getData(), + codec: $form->get('codec')->getData(), + quality: $form->get('quality')->getData(), + language: $form->get('language')->getData(), + provider: $form->get('provider')->getData(), + ); + } } \ No newline at end of file diff --git a/src/User/Framework/Controller/Web/PreferencesController.php b/src/User/Framework/Controller/Web/PreferencesController.php index b5450a8..5630276 100644 --- a/src/User/Framework/Controller/Web/PreferencesController.php +++ b/src/User/Framework/Controller/Web/PreferencesController.php @@ -29,28 +29,41 @@ class PreferencesController extends AbstractController private readonly Broadcaster $broadcaster, ) {} - #[Route('/user/preferences', 'app_user_preferences', methods: ['GET', 'POST'])] - public function mediaPreferences(Request $request, SaveUserMediaPreferencesHandler $saveUserMediaPreferencesHandler): Response + #[Route('/user/preferences', 'app_user_preferences', methods: ['GET'])] + public function mediaPreferences(): Response { $downloadPreferences = $this->getUser()->getDownloadPreferences(); $formData = (array) UserPreferencesFactory::createFromUser($this->getUser()); $form = $this->createForm(UserMediaPreferencesForm::class, $formData); - if ($request->isMethod('POST')) { - $form->handleRequest($request); - if ($form->isSubmitted() && $form->isValid()) { - $saveUserMediaPreferencesHandler->handle(new SaveUserMediaPreferencesCommand( - resolution: (string) $form->get('resolution')->getData(), - codec: (string) $form->get('codec')->getData(), - quality: (string) $form->get('quality')->getData(), - language: (string) $form->get('language')->getData(), - provider: (string) $form->get('provider')->getData(), - )); - $this->broadcaster->alert( - title: 'Success', - message: 'Your media preferences have been saved.' - ); - } + return $this->render( + 'user/preferences.html.twig', + [ + 'downloadPreferences' => $downloadPreferences, + 'preferences_form' => $form, + ] + ); + } + + #[Route('/user/preferences', 'app_user_preferences_submit', methods: ['POST'])] + public function mediaPreferencesSubmit( + Request $request, + SaveUserMediaPreferencesHandler $saveUserMediaPreferencesHandler + ): Response + { + $downloadPreferences = $this->getUser()->getDownloadPreferences(); + $formData = (array) UserPreferencesFactory::createFromUser($this->getUser()); + $form = $this->createForm(UserMediaPreferencesForm::class, $formData); + + $form->handleRequest($request); + if ($form->isSubmitted() && $form->isValid()) { + $saveUserMediaPreferencesHandler->handle( + SaveUserMediaPreferencesCommand::fromUserMediaPreferencesForm($form) + ); + $this->broadcaster->alert( + title: 'Success', + message: 'Your media preferences have been saved.' + ); } return $this->render( diff --git a/src/User/Framework/Form/UserMediaPreferencesForm.php b/src/User/Framework/Form/UserMediaPreferencesForm.php index a7cf1be..29626fd 100644 --- a/src/User/Framework/Form/UserMediaPreferencesForm.php +++ b/src/User/Framework/Form/UserMediaPreferencesForm.php @@ -11,11 +11,14 @@ use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; +use Symfony\Component\Routing\Generator\UrlGenerator; +use Symfony\Component\Routing\Generator\UrlGeneratorInterface; class UserMediaPreferencesForm extends AbstractType { public function __construct( private readonly PreferenceOptionRepository $preferenceOptionRepository, + private readonly UrlGeneratorInterface $urlGenerator, ) {} public function buildForm(FormBuilderInterface $builder, array $options): void @@ -30,6 +33,7 @@ class UserMediaPreferencesForm extends AbstractType private function addChoiceField(FormBuilderInterface $builder, string $fieldName, array $choices): void { $question = [ + 'action' => $this->urlGenerator->generate('app_user_preferences_submit'), 'attr' => ['class' => 'w-64 text-input mb-4'], 'label_attr' => ['class' => 'w-64 text-white block font-semibold mb-2'], 'choices' => $this->addDefaultChoice($choices),