urlGenerator = $urlGenerator; $this->userManager = $userManager; $this->accountService = $accountService; $this->mailSearch = $mailSearch; $this->initialState = $initialState; $this->userId = $userId; $this->l10n = $l10n; } /** * @inheritDoc */ #[\Override] public function getOrder(): int { return 4; } /** * @inheritDoc */ #[\Override] public function getIconClass(): string { return 'icon-mail'; } /** * @inheritDoc */ #[\Override] public function getIconUrl(): string { return $this->urlGenerator->getAbsoluteURL( $this->urlGenerator->imagePath(Application::APP_ID, 'mail-dark.svg') ); } /** * @inheritDoc */ #[\Override] public function getUrl(): ?string { return $this->urlGenerator->getAbsoluteURL($this->urlGenerator->linkToRoute('mail.page.index')); } /** * @inheritDoc */ #[\Override] public function load(): void { // No assets need to be loaded anymore as the widget is rendered from the API } abstract public function getSearchQuery(string $userId): SearchQuery; /** * @param string $userId * @param int|null $minTimestamp * @param int $limit * @return Message[] * @throws ClientException * @throws ServiceException */ protected function getEmails(string $userId, ?int $minTimestamp, int $limit = 7): array { $user = $this->userManager->get($userId); if ($user === null) { return []; } $query = $this->getSearchQuery($userId); if ($minTimestamp !== null) { $query->setStart((string)$minTimestamp); } return $this->mailSearch->findMessagesGlobally($user, $query, $limit); } protected function getMailboxIdsToExclude(string $userId): array { $mailboxIdsToExclude = []; foreach ($this->accountService->findByUserId($userId) as $account) { $mailboxIdsToExclude[] = $account->getMailAccount()->getJunkMailboxId(); $mailboxIdsToExclude[] = $account->getMailAccount()->getTrashMailboxId(); } return array_values(array_filter($mailboxIdsToExclude)); } /** * @inheritDoc */ #[\Override] public function getItems(string $userId, ?string $since = null, int $limit = 7): array { $intSince = $since === null ? null : (int)$since; $emails = $this->getEmails($userId, $intSince, $limit); /** @var list */ return array_map(function (Message $email) { $firstFrom = $email->getFrom()->first(); return new WidgetItem( $firstFrom ? $firstFrom->getLabel() : '', $email->getSubject(), $this->urlGenerator->getAbsoluteURL( $this->urlGenerator->linkToRoute('mail.page.thread', ['mailboxId' => $email->getMailboxId(), 'id' => $email->getId()]) ), $this->urlGenerator->getAbsoluteURL( $this->urlGenerator->linkToRoute('core.GuestAvatar.getAvatar', [ 'guestName' => $firstFrom ? ($firstFrom->getLabel() ? str_replace('/', '-', $firstFrom->getLabel()) : $firstFrom->getEmail()) : '', 'size' => 44, ]) ), (string)$email->getSentAt() ); }, $emails); } /** * @inheritDoc */ #[\Override] public function getItemsV2(string $userId, ?string $since = null, int $limit = 7): WidgetItems { $items = $this->getItems($userId, $since, $limit); return new WidgetItems( $items, empty($items) ? $this->l10n->t('No message found yet') : '', ); } /** * @inheritDoc */ #[\Override] public function getWidgetOptions(): WidgetOptions { return new WidgetOptions(true); } /** * @inheritDoc */ #[\Override] public function getWidgetButtons(string $userId): array { $buttons = []; if ($this->userId !== null) { $accounts = $this->accountService->findByUserId($this->userId); if (empty($accounts)) { $buttons[] = new WidgetButton( WidgetButton::TYPE_SETUP, $this->urlGenerator->linkToRouteAbsolute('mail.page.setup'), $this->l10n->t('Set up an account'), ); } } return $buttons; } }