src/JanusHercules/Shared/Presentation/Component/Header/NavSideLiveComponent.php line 26

Open in your IDE?
  1. <?php
  2. namespace JanusHercules\Shared\Presentation\Component\Header;
  3. use App\Entity\User;
  4. use App\Service\Membership\MembershipService;
  5. use Exception;
  6. use JanusHercules\Shared\Presentation\Entity\GroupNavigationItem;
  7. use JanusHercules\Shared\Presentation\Entity\NavigationGroupList;
  8. use JanusHercules\Shared\Presentation\Entity\NavigationItem;
  9. use JanusHercules\Shared\Presentation\Service\HeaderPresentationService;
  10. use Psr\Log\LoggerInterface;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\HttpFoundation\RequestStack;
  13. use Symfony\Component\HttpKernel\KernelInterface;
  14. use Symfony\UX\LiveComponent\Attribute\AsLiveComponent;
  15. use Symfony\UX\LiveComponent\Attribute\LiveAction;
  16. use Symfony\UX\LiveComponent\Attribute\LiveProp;
  17. use Symfony\UX\LiveComponent\ComponentToolsTrait;
  18. use Symfony\UX\LiveComponent\DefaultActionTrait;
  19. #[AsLiveComponent(
  20. 'NavSide',
  21. '@janus_hercules.shared.presentation/header/nav_side_live_component.html.twig'
  22. )]
  23. class NavSideLiveComponent extends AbstractController
  24. {
  25. use DefaultActionTrait;
  26. use ComponentToolsTrait;
  27. public LoggerInterface $logger;
  28. #[LiveProp(writable: true)]
  29. public bool $showJoboffererHeader = false;
  30. #[LiveProp]
  31. public string $digitalEstateUrlContent = '';
  32. #[LiveProp]
  33. public bool $userCanSeeWebsiteNavigationItems = false;
  34. #[LiveProp(writable: true)]
  35. public string $profileLabel = '';
  36. public string $direction = '';
  37. public string $view = '';
  38. public bool $inJoboffererRegisterFlow = false;
  39. private KernelInterface $kernel;
  40. public function __construct(
  41. private readonly HeaderPresentationService $headerService,
  42. private readonly RequestStack $request,
  43. LoggerInterface $logger,
  44. KernelInterface $kernel,
  45. private readonly MembershipService $membershipService,
  46. ) {
  47. $this->kernel = $kernel;
  48. $this->logger = $logger;
  49. }
  50. // @phpstan-ignore-next-line
  51. public function getSideNavbarItems(): array|NavigationGroupList
  52. {
  53. /** @var array|NavigationGroupList[] $rightNavbarItems */
  54. $rightNavbarItems = [];
  55. try {
  56. if ($this->direction === 'right') {
  57. if ($this->view == 'Desktop') {
  58. /** @var ?User $user */
  59. $user = $this->getUser();
  60. if (!is_null($user)) {
  61. if ($user->hasAtLeastOneAdminRole()) {
  62. $rightNavbarItems[] = $this->getAdminDropdownContent();
  63. }
  64. $rightNavbarItems[] = $this->getUserDropdownItems($user, $this->getUrl($user));
  65. return $rightNavbarItems;
  66. } else {
  67. return [
  68. new NavigationItem('', 'Für Arbeitgeber', '', $this->generateUrl('digitalEstate.pro-joboo-de')),
  69. new NavigationGroupList('Login', '', [
  70. new GroupNavigationItem('', [
  71. new NavigationItem('', 'Login', '', $this->generateUrl('fos_user_security_login')),
  72. new NavigationItem('', 'Registrieren', '', $this->generateUrl('fos_user_registration_register', ['createWithRole' => User::ROLE_NAME_JOBSEEKER])),
  73. new NavigationItem('', 'Registrieren als Arbeitgeber', '', $this->generateUrl('fos_user_registration_register', ['createWithRole' => User::ROLE_NAME_JOBOFFERER]))
  74. ])
  75. ])
  76. ];
  77. }
  78. }
  79. } elseif ($this->direction == 'left') {
  80. return $this->getLeftMenuItems();
  81. }
  82. } catch (Exception $e) {
  83. $this->logger->error('Error occurred while fetching navbar Items ' . $e->getMessage());
  84. }
  85. return $rightNavbarItems;
  86. }
  87. public function getAdminDropdownContent(): NavigationGroupList
  88. {
  89. $adminItemsArray = $this->getItems();
  90. return new NavigationGroupList('Admin', 'assets/icons/settings.svg', [new GroupNavigationItem('Admin', $adminItemsArray)]);
  91. }
  92. private function getUserDropdownItems(User $user, string $url): ?NavigationGroupList
  93. {
  94. try {
  95. $inRegistrationFlow = $this
  96. ->headerService
  97. ->isInJoboffererReregistration($this->request->getCurrentRequest());
  98. if ($user->isJobofferer() && $inRegistrationFlow) {
  99. return new NavigationGroupList(
  100. $this->profileLabel,
  101. 'assets/icons/user-avatar.svg',
  102. []
  103. );
  104. }
  105. return new NavigationGroupList($this->profileLabel, 'assets/icons/user-avatar.svg', [
  106. new GroupNavigationItem('Profil', $this->getProfilGroupItems($user)),
  107. new GroupNavigationItem('Konto', $this->getJoboffererAccountItems($user, $url)),
  108. new GroupNavigationItem('', [
  109. new NavigationItem('', 'Abmelden', '', $this->generateUrl('fos_user_security_logout')),
  110. ])
  111. ]);
  112. } catch (Exception $e) {
  113. $this->logger->error('Error occurred while fetching right User dropdown items for desktop: ' . $e->getMessage());
  114. return null;
  115. }
  116. }
  117. /**
  118. * @return NavigationItem[]
  119. *
  120. * @throws Exception
  121. */
  122. private function getProfilGroupItems(User $user): array
  123. {
  124. $profilGroupItems = [];
  125. try {
  126. if ($user->getDefaultJobseekerProfile() && $user->getDefaultJobseekerProfile()->getId()) {
  127. $profilGroupItems[] = new NavigationItem('', 'Suchaufträge', '', $this->generateUrl('account.wanted_jobs.index', ['id' => $user->getDefaultJobseekerProfile()->getId()]));
  128. }
  129. $profilGroupItems[] = new NavigationItem('', 'Profil bearbeiten', '', $this->generateUrl('account.profiles.index'));
  130. $profilGroupItems[] = new NavigationItem('', 'Merkliste', '', $this->generateUrl('account.favorites.index_router'));
  131. } catch (Exception $e) {
  132. $this->logger->error('Error occurred while fetching the profile group items: ' . $e->getMessage());
  133. }
  134. return $profilGroupItems;
  135. }
  136. /**
  137. * @throws Exception
  138. */
  139. public function getUrl(?User $user): string
  140. {
  141. if (!$user) {
  142. return '';
  143. }
  144. try {
  145. $url = '';
  146. if ($this->headerService->userCanSeeWebsiteNavigationItems($user)) {
  147. $url = $this->generateUrl('account.subscription.jobofferer.index');
  148. if ($user->hasJoboffererProfile() || $user->hasJobseekerProfile()) {
  149. if ($user->getBillwerkCustomerId() && !$this->headerService->userHasActiveJoboffererMembership($user)) {
  150. $url = $this->generateUrl('account.subscription.jobofferer.index', ['state' => 'notrial']);
  151. }
  152. }
  153. }
  154. return $url;
  155. } catch (Exception $e) {
  156. $this->logger->error('Error occurred while fetching the url: ' . $e->getMessage());
  157. return '';
  158. }
  159. }
  160. /**
  161. * @return GroupNavigationItem[]
  162. *
  163. * @throws Exception
  164. */
  165. #[LiveAction]
  166. public function getRightNavItemsForMobile(): array
  167. {
  168. /** @var ?User $user */
  169. $user = $this->getUser();
  170. if (!$user) {
  171. return $this->getAnonymousItems();
  172. }
  173. try {
  174. $url = $this->getUrl($user);
  175. if ($user->hasJobseekerProfile()) {
  176. if ($user->hasAtLeastOneAdminRole()) {
  177. return array_merge($this->getAdminItems(), $this->getJobseekerItems($user, $url));
  178. }
  179. return $this->getJobseekerItems($user, $url);
  180. } elseif ($user->hasJoboffererProfile()) {
  181. if ($user->hasAtLeastOneAdminRole()) {
  182. return array_merge($this->getAdminItems(), $this->getJoboffererItems($user, $url));
  183. }
  184. return $this->getJoboffererItems($user, $url);
  185. }
  186. } catch (Exception $e) {
  187. $this->logger->error('Error occurred while fetching right navigation items for mobile: ' . $e->getMessage());
  188. return [];
  189. }
  190. return [];
  191. }
  192. /**
  193. * @return GroupNavigationItem[]
  194. */
  195. private function getJobseekerItems(
  196. User $user,
  197. string $url
  198. ): array {
  199. try {
  200. $carrierGroupItems = [];
  201. if ($user->getDefaultJobseekerProfile() && $user->getDefaultJobseekerProfile()->getId() && $user->isJobseeker() && count($user->getDefaultJobseekerProfile()->getWantedJobs()) > 0) {
  202. $carrierGroupItems[] = new NavigationItem('', 'Job-Radar', '', $this->generateUrl('janus_hercules.jobradar.presentation.overviewpage', ['jobseekerProfileId' => $user->getDefaultJobseekerProfile()->getId()]) . '?page=1&wantedJobId=');
  203. }
  204. $carrierGroupItems[] = new NavigationItem('', 'Bewerbungen', '', $this->generateUrl('account.conversations.index_router', ['page' => 1]));
  205. if ($user->isJobseeker()) {
  206. $carrierGroupItems[] = new NavigationItem('', 'Jobs finden', '', $this->generateUrl('recurrent_jobs_search.form'));
  207. }
  208. return [
  209. new GroupNavigationItem('Karriere', $carrierGroupItems),
  210. new GroupNavigationItem('Profil', $this->getProfilGroupItems($user)),
  211. new GroupNavigationItem('Konto', [
  212. new NavigationItem('', 'Passwort ändern', '', $this->generateUrl('fos_user_change_password')),
  213. new NavigationItem('', 'Mitgliedschaft', '', $url),
  214. ]),
  215. new GroupNavigationItem('', [
  216. new NavigationItem('', 'Abmelden', '', $this->generateUrl('fos_user_security_logout')),
  217. ])
  218. ];
  219. } catch (Exception $e) {
  220. $this->logger->error('Error occurred while fetching right jobseeker items for desktop: ' . $e->getMessage());
  221. return [];
  222. }
  223. }
  224. /**
  225. * @return GroupNavigationItem[]
  226. *
  227. * @throws Exception
  228. */
  229. private function getJoboffererItems(
  230. User $user,
  231. string $url
  232. ): array {
  233. try {
  234. $personalSearchItems = [new NavigationItem('', 'Bewerbungen', '', $this->generateUrl('account.conversations.index_router', ['page' => 1]))];
  235. if ($user->getDefaultJoboffererProfile() && $user->getDefaultJoboffererProfile()->getId()) {
  236. $personalSearchItems[] = new NavigationItem('', 'Stellenanzeigen', '', $this->generateUrl('account.recurrent_jobs.index', ['id' => $user->getDefaultJoboffererProfile()->getId()]));
  237. }
  238. if ($user->isJobofferer()) {
  239. $personalSearchItems[] = new NavigationItem('', 'Arbeitskräfte finden', '', $this->generateUrl('wanted_jobs_search.form'));
  240. }
  241. return [
  242. new GroupNavigationItem('Personal finden', $personalSearchItems),
  243. new GroupNavigationItem('Profil', [
  244. new NavigationItem('', 'Profil bearbeiten', '', $this->generateUrl('account.profiles.index')),
  245. new NavigationItem('', 'Merkliste', '', $this->generateUrl('account.favorites.index_router')),
  246. ]),
  247. new GroupNavigationItem('Konto', $this->getJoboffererAccountItems($user, $url)),
  248. new GroupNavigationItem('', [
  249. new NavigationItem('', 'Abmelden', '', $this->generateUrl('fos_user_security_logout')),
  250. ])
  251. ];
  252. } catch (Exception $e) {
  253. $this->logger->error('Error occurred while fetching right jobseeker items for desktop: ' . $e->getMessage());
  254. return [];
  255. }
  256. }
  257. /**
  258. * @return GroupNavigationItem[]
  259. *
  260. * @throws Exception
  261. */
  262. private function getAnonymousItems(): array
  263. {
  264. try {
  265. return [
  266. new GroupNavigationItem('Karriere', [
  267. new NavigationItem('', 'Jobs finden', '', $this->generateUrl('recurrent_jobs_search.form')),
  268. new NavigationItem('', "So geht's", '', $this->generateUrl('content', ['content' => 'so-geht-es'])),
  269. new NavigationItem('', 'Vorteile', '', $this->generateUrl('fos_user_registration_register', ['createWithRole' => User::ROLE_NAME_JOBSEEKER]))
  270. ]),
  271. new GroupNavigationItem('Profil', [
  272. new NavigationItem('', 'Login', '', $this->generateUrl('fos_user_security_login')),
  273. new NavigationItem('', 'Registrieren', '', $this->generateUrl('fos_user_registration_register', ['createWithRole' => User::ROLE_NAME_JOBSEEKER])),
  274. ]),
  275. new GroupNavigationItem('Für Arbeitgeber', [
  276. new NavigationItem('', 'Arbeitskräfte finden', '', $this->generateUrl('wanted_jobs_search.form')),
  277. new NavigationItem('', 'Für Arbeitgeber', '', $this->generateUrl('digitalEstate.pro-joboo-de')),
  278. new NavigationItem('', 'Registrieren als Arbeitgeber', '', $this->generateUrl('fos_user_registration_register', ['createWithRole' => User::ROLE_NAME_JOBOFFERER]))
  279. ]),
  280. ];
  281. } catch (Exception $e) {
  282. $this->logger->error('Error occurred while fetching right anonymous items for desktop: ' . $e->getMessage());
  283. return [];
  284. }
  285. }
  286. /**
  287. * @return NavigationItem[]
  288. *
  289. * @throws Exception
  290. */
  291. public function getJoboffererAccountItems(User $user, string $url): array
  292. {
  293. $accountItems = [new NavigationItem('', 'Passwort ändern', '', $this->generateUrl('fos_user_change_password')),
  294. new NavigationItem('', 'Mitgliedschaft', '', $url)];
  295. if ($user->hasJoboffererProfile() && $this->membershipService->userHasOrHadMembership($user)) {
  296. $accountItems[] = new NavigationItem('', 'Zahlart & Rechnungen', '', $this->generateUrl('account.subscription.manage'));
  297. }
  298. if ($user->hasJoboffererProfile() && $this->headerService->userCanDeleteProfile($user)) {
  299. $accountItems[] = new NavigationItem('', 'Konto verwalten', '', $this->generateUrl('account.deletion.index'));
  300. }
  301. return $accountItems;
  302. }
  303. /**
  304. * @return GroupNavigationItem[]
  305. */
  306. public function getAdminItems(): array
  307. {
  308. $adminItemsArray = $this->getItems();
  309. return [
  310. new GroupNavigationItem('Admin', $adminItemsArray)
  311. ];
  312. }
  313. /**
  314. * @return NavigationItem[]
  315. *
  316. * @throws Exception
  317. */
  318. public function getLeftMenuItems(): array
  319. {
  320. try {
  321. /** @var ?User $user */
  322. $user = $this->getUser();
  323. if ($user && $this->userCanSeeWebsiteNavigationItems) {
  324. if ($user->hasJobseekerProfile()) {
  325. return $this->getLeftJobseekerItems($user);
  326. } elseif ($user->hasJoboffererProfile()) {
  327. return $this->getLeftJoboffererItems($user);
  328. }
  329. }
  330. } catch (Exception $e) {
  331. $this->logger->error('Error occurred while fetching left navigation items: ' . $e->getMessage());
  332. }
  333. return $this->getAnonymousLeftMenu();
  334. }
  335. /**
  336. * @return NavigationItem[]
  337. *
  338. * @throws Exception
  339. */
  340. private function getLeftJobseekerItems(User $user): array
  341. {
  342. $jobseekerLeftItems = [];
  343. try {
  344. if ($user->getDefaultJobseekerProfile() && $user->isJobseeker() && count($user->getDefaultJobseekerProfile()->getWantedJobs()) > 0) {
  345. $jobseekerLeftItems[] = new NavigationItem('RADAR', 'Job-Radar', 'assets/icons/radar.svg', $this->generateUrl('janus_hercules.jobradar.presentation.overviewpage', ['jobseekerProfileId' => $user->getDefaultJobseekerProfile()->getId()]) . '?page=1&wantedJobId=');
  346. }
  347. $jobseekerLeftItems[] = new NavigationItem('MESSAGE', 'Bewerbungen', 'assets/icons/mail.svg', $this->generateUrl('account.conversations.index_router', ['page' => 1]));
  348. if ($user->isJobseeker()) {
  349. $jobseekerLeftItems[] = new NavigationItem('', 'Jobs finden', 'assets/icons/jobs-finden.svg', $this->generateUrl('recurrent_jobs_search.form'));
  350. }
  351. } catch (Exception $e) {
  352. $this->logger->error('Error occurred while fetching left jobseeker items: ' . $e->getMessage());
  353. }
  354. return $jobseekerLeftItems;
  355. }
  356. /**
  357. * @return NavigationItem[]
  358. *
  359. * @throws Exception
  360. */
  361. private function getLeftJoboffererItems(
  362. User $user
  363. ): array {
  364. $joboffererLeftItems = [];
  365. $inRegistrationFlow = $this
  366. ->headerService
  367. ->isInJoboffererReregistration($this->request->getCurrentRequest());
  368. if ($inRegistrationFlow) {
  369. return $joboffererLeftItems;
  370. }
  371. try {
  372. $joboffererLeftItems[] = new NavigationItem('MESSAGE', 'Bewerbungen', 'assets/icons/mail.svg', $this->generateUrl('account.conversations.index_router', ['page' => 1]));
  373. if ($user->getDefaultJoboffererProfile() && $user->getDefaultJoboffererProfile()->getId()) {
  374. $joboffererLeftItems[] = new NavigationItem('', 'Stellenanzeigen', 'assets/icons/user-screen.svg', $this->generateUrl('account.recurrent_jobs.index', ['id' => $user->getDefaultJoboffererProfile()->getId()]));
  375. }
  376. if ($user->isJobofferer()) {
  377. $joboffererLeftItems[] = new NavigationItem('', 'Arbeitskräfte finden', 'assets/icons/user-search.svg', $this->generateUrl('wanted_jobs_search.form'));
  378. }
  379. } catch (Exception $e) {
  380. $this->logger->error('Error occurred while fetching left jobofferer items: ' . $e->getMessage());
  381. }
  382. $hideNavigation = $user->getDefaultJoboffererProfile()?->getState() === 0;
  383. if ($hideNavigation) {
  384. $joboffererLeftItems = [];
  385. }
  386. return $joboffererLeftItems;
  387. }
  388. /**
  389. * @return NavigationItem[]
  390. */
  391. private function getAnonymousLeftMenu(): array
  392. {
  393. return [
  394. new NavigationItem('', 'Jobs finden', '', $this->generateUrl('recurrent_jobs_search.form')),
  395. new NavigationItem('', 'Arbeitskräfte finden', '', $this->generateUrl('wanted_jobs_search.form')),
  396. new NavigationItem('', "So geht's", '', $this->generateUrl('content', ['content' => 'so-geht-es'])),
  397. new NavigationItem('', 'Vorteile', '', $this->generateUrl('fos_user_registration_register', ['createWithRole' => User::ROLE_NAME_JOBSEEKER]))
  398. ];
  399. }
  400. /**
  401. * @return NavigationItem[]
  402. */
  403. private function getItems(): array
  404. {
  405. $isProd = $this->kernel->getEnvironment() === 'prod';
  406. $billwerk = $isProd ? 'app' : 'sandbox';
  407. $adminItemsArray = [
  408. new NavigationItem('', 'Admin-Portale', '', $this->generateUrl('admin.portals'))
  409. ];
  410. if ($isProd) {
  411. $adminItemsArray[] = new NavigationItem('', 'Google Analytics', '', 'https://analytics.google.com/analytics/web/');
  412. $adminItemsArray[] = new NavigationItem('', 'Google Search Console', '', 'https://www.google.com/webmasters/tools/dashboard?hl=de&siteUrl=https%3A%2F%2Fwww.go-gastro.com%2F');
  413. $adminItemsArray[] = new NavigationItem('', 'Pingdom Uptime', '', 'https://my.pingdom.com/reports/uptime');
  414. $adminItemsArray[] = new NavigationItem('', 'Pingdom Page Speed', '', 'https://my.pingdom.com/reports/rbc/4566471');
  415. }
  416. $adminItemsArray[] = new NavigationItem('', 'Munin', '', 'https://operations.' . $this->kernel->getEnvironment() . '.go-gastro.com/munin/localdomain/localhost.localdomain/index.html');
  417. $adminItemsArray[] = new NavigationItem('', 'Kibana', '', 'https://operations.' . $this->kernel->getEnvironment() . '.go-gastro.com/kibana');
  418. $adminItemsArray[] = new NavigationItem('', 'Datadog', '', 'https://app.datadoghq.com/dash/integration/1/system---overview?live=true&page=0&is_auto=false&tile_size=m&tpl_var_scope=stage%3A' . $this->kernel->getEnvironment());
  419. $adminItemsArray[] = new NavigationItem('', 'Billwerk', '', 'https://' . $billwerk . '.billwerk.com/');
  420. $adminItemsArray[] = new NavigationItem('', 'AWS Kosten', '', 'https://console.aws.amazon.com/cost-reports/home?#/custom?groupBy=Service&forecastTimeRangeOption=None&hasBlended=false&hasAmortized=false&excludeDiscounts=false&excludeRefund=false&excludeCredit=false&excludeRIUpfrontFees=false&excludeRIRecurringCharges=false&excludeOtherSubscriptionCosts=false&excludeSupportCharges=false&excludeTax=true&excludeTaggedResources=false&chartStyle=Stack&timeRangeOption=MonthToDate&granularity=Daily&reportName=Daily costs month-to-date w%2Fo taxes&reportType=CostUsage&isTemplate=false&filter=[]&reportId=5a7e6351-e19b-49c0-b371-78cb8702d482');
  421. $adminItemsArray[] = new NavigationItem('', 'Login mit QR-code', '', $this->generateUrl('admin.login_qr'));
  422. return $adminItemsArray;
  423. }
  424. }