Skip to content

Commit

Permalink
added reminder in login page about last login
Browse files Browse the repository at this point in the history
  • Loading branch information
Lung committed Nov 17, 2024
1 parent 12ac6fa commit a1aeee9
Show file tree
Hide file tree
Showing 10 changed files with 91 additions and 17 deletions.
11 changes: 11 additions & 0 deletions public/styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -482,3 +482,14 @@ tr:nth-child(even) {
left: 0.5em;
margin-right: -50%;
}

.login-box {
display: flex;
align-items: center;
}

.text-rotated {
transform: rotate(90deg);
font-weight: normal;
color: var(--color-light);
}
30 changes: 30 additions & 0 deletions src/Application/CookieHandler.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

namespace kissj\Application;

use Dflydev\FigCookies\FigRequestCookies;
use Dflydev\FigCookies\FigResponseCookies;
use Dflydev\FigCookies\SetCookie;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;

class CookieHandler
{
public function getCookie(Request $request, string $key): ?string
{
return FigRequestCookies::get($request, $key)->getValue();
}

public function setCookie(Response $response, string $key, string $value): Response
{
$response = FigResponseCookies::remove($response, $key);
$response = FigResponseCookies::set(
$response,
SetCookie::create($key, $value)
->rememberForever()
->withPath('/')
);

return $response;
}
}
19 changes: 9 additions & 10 deletions src/Middleware/LocalizationResolverMiddleware.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@

namespace kissj\Middleware;

use Dflydev\FigCookies\FigRequestCookies;
use Dflydev\FigCookies\FigResponseCookies;
use Dflydev\FigCookies\SetCookie;
use kissj\Application\CookieHandler;
use kissj\Event\Event;
use kissj\Event\EventType\EventTypeDefault;
use Negotiation\AcceptLanguage;
Expand All @@ -24,6 +22,8 @@ class LocalizationResolverMiddleware extends BaseMiddleware
public function __construct(
private readonly Twig $view,
private readonly Translator $translator,
private readonly CookieHandler $cookieHandler,
private readonly LanguageNegotiator $negotiator,
) {
}

Expand All @@ -32,15 +32,15 @@ public function process(Request $request, ResponseHandler $handler): Response
$bestLanguage = $this->getBestLanguage($request);

$this->translator->setLocale($bestLanguage);
$this->view->getEnvironment()->addGlobal('locale', $bestLanguage); // used in templates
$this->view->getEnvironment()->addGlobal('locale', $bestLanguage); // used in many templates

$response = $handler->handle($request);

if (isset($request->getQueryParams()[self::LOCALE_COOKIE_NAME])) {
$response = FigResponseCookies::remove($response, self::LOCALE_COOKIE_NAME);
$response = FigResponseCookies::set(
$response = $this->cookieHandler->setCookie(
$response,
SetCookie::create(self::LOCALE_COOKIE_NAME, $bestLanguage)
self::LOCALE_COOKIE_NAME,
$bestLanguage,
);
}

Expand All @@ -58,7 +58,7 @@ private function getBestLanguage(Request $request): string
}
}

$cookieLanguage = FigRequestCookies::get($request, self::LOCALE_COOKIE_NAME)->getValue();
$cookieLanguage = $this->cookieHandler->getCookie($request, self::LOCALE_COOKIE_NAME);
if ($cookieLanguage !== null && in_array($cookieLanguage, $availableLanguages, true)) {
return $cookieLanguage;
}
Expand Down Expand Up @@ -92,13 +92,12 @@ private function negotiateBestLanguage(Request $request, array $availableLanguag
throw new \RuntimeException('available languages cannot be empty');
}

$negotiator = new LanguageNegotiator();
$header = $request->getHeaderLine('Accept-Language');
if ($header === '') {
return $defaultLocale;
}
/** @var ?AcceptLanguage $negotiatedLanguage */
$negotiatedLanguage = $negotiator->getBest($header, $availableLanguages);
$negotiatedLanguage = $this->negotiator->getBest($header, $availableLanguages);

if ($negotiatedLanguage === null || !in_array($negotiatedLanguage->getValue(), $availableLanguages, true)) {
return $defaultLocale;
Expand Down
2 changes: 2 additions & 0 deletions src/Settings/Settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@
use Monolog\Processor\GitProcessor;
use Monolog\Processor\UidProcessor;
use Monolog\Processor\WebProcessor;
use Negotiation\LanguageNegotiator;
use Psr\Log\LoggerInterface;
use Redis;
use Sentry\Client as SentryClient;
Expand Down Expand Up @@ -176,6 +177,7 @@ public function getContainerDefinition(string $envPath, string $envFilename): ar
GuestRepository::class => autowire(),
GuestService::class => autowire(),
IstRepository::class => autowire(),
LanguageNegotiator::class => autowire(),
LocalizationResolverMiddleware::class => autowire(),
LoggedOnlyMiddleware::class => autowire(),
MonologContextMiddleware::class => autowire(),
Expand Down
4 changes: 4 additions & 0 deletions src/Skautis/SkautisController.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
namespace kissj\Skautis;

use kissj\AbstractController;
use kissj\Application\CookieHandler;
use kissj\Event\EventRepository;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
Expand All @@ -14,6 +15,7 @@ class SkautisController extends AbstractController
public function __construct(
private readonly EventRepository $eventRepository,
private readonly SkautisService $skautisService,
private readonly CookieHandler $cookieHandler,
) {
}

Expand Down Expand Up @@ -42,6 +44,8 @@ public function redirectFromSkautis(Request $request, Response $response): Respo
return $this->redirect($request, $response, 'landing', ['eventSlug' => $eventSlug]);
}

$response = $this->cookieHandler->setCookie($response, 'lastLogin', 'skautis');

$user = $this->skautisService->getOrCreateAndLogInSkautisUser($skautisUserData, $event);
$this->skautisService->updateSkautisUserMembership($user, $skautisUserData);

Expand Down
1 change: 1 addition & 0 deletions src/Templates/cs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,7 @@ login:
email: "E-mail"
or: "nebo"
sendMeEmail: "Odešli přihlašovací mail"
lastUsedLogin: "Poslední přihlášení"
howItWorks: "Jak přihlašování funguje?"
submitEmail: "Zadej svůj e-mail"
followButton: "Následuj přihlašovací tlačítko, které ti přijde na zadaný e-mail"
Expand Down
1 change: 1 addition & 0 deletions src/Templates/en.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,7 @@ login:
email: "email"
or: "or"
sendMeEmail: "Send me an email to register"
lastUsedLogin: "Last login"
howItWorks: "How does the registration system work?"
submitEmail: "Submit your email"
followButton: "Follow an access button in your email"
Expand Down
1 change: 1 addition & 0 deletions src/Templates/sk.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,7 @@ login:
email: "E-mail"
or: "nebo"
sendMeEmail: "Pošli mi prihlasovací link"
lastUsedLogin: "Posledné prihlásenie"
howItWorks: "Ako funguje registračný systém?"
submitEmail: "Zadaj svoj mail"
followButton: "Použi link, ktorý Ti naň obratom príde"
Expand Down
31 changes: 26 additions & 5 deletions src/Templates/translatable/kissj/login.twig
Original file line number Diff line number Diff line change
@@ -1,17 +1,28 @@
{% extends "_layout.twig" %}

{% block content %}
{% set bothLogins = event.eventType.isLoginEmailAllowed and event.eventType.isLoginSkautisAllowed %}
<div class="two-cards">
<div class="card registration-theme">
<h2>{% trans %}login.registrationFor{% endtrans %}{{ event.readableName }}</h2>
{% if event.eventType.isLoginSkautisAllowed %}
<a href="{{ skautisLoginUri }}" class="btn">{% trans %}login.skautis{% endtrans %}</a>
<div class="login-box">
<a href="{{ skautisLoginUri }}" class="btn">
{% trans %}login.skautis{% endtrans %}
</a>
{% if bothLogins and lastLogin == 'skautis' %}
<p class="text-rotated">
{% trans %}login.lastUsedLogin{% endtrans %}
</p>
{% endif %}
</div>
{% endif %}
{% if event.eventType.isLoginEmailAllowed and event.eventType.isLoginSkautisAllowed %}
{% if bothLogins %}
<p class="text-inside-line">{% trans %}login.or{% endtrans %}</p>
{% endif %}
{% if event.eventType.isLoginEmailAllowed %}
<form action="{{ url_for('sendLoginEmail', {'eventSlug': event.slug}) }}" method="post">
<div class="login-box">
<form action="{{ url_for('sendLoginEmail', {'eventSlug': event.slug}) }}" method="POST">
<div class="form-group">
<label for="form-email">{% trans %}login.email{% endtrans %}:</label>
<input
Expand All @@ -22,12 +33,22 @@
required
/>
</div>
<input type="submit" value="{% trans %}login.sendMeEmail{% endtrans %}" class="btn form-wide"/>
<input
type="submit"
value="{% trans %}login.sendMeEmail{% endtrans %}"
class="btn form-wide"
/>
</form>
{% if bothLogins and lastLogin == 'email' %}
<p class="text-rotated">
{% trans %}login.lastUsedLogin{% endtrans %}
</p>
{% endif %}
</div>
{% endif %}
<br/>
</div>
<div class="card approved-theme text-muted">
<div class="card text-muted">
<h2>{% trans %}login.howItWorks{% endtrans %}</h2>
<ol class="text-left">
<li>{% trans %}login.submitEmail{% endtrans %}</li>
Expand Down
8 changes: 6 additions & 2 deletions src/User/UserController.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use Exception;
use kissj\AbstractController;
use kissj\Application\CookieHandler;
use kissj\Event\Event;
use kissj\Participant\ParticipantRepository;
use kissj\Participant\ParticipantService;
Expand All @@ -22,6 +23,7 @@ public function __construct(
protected SkautisService $skautisService,
protected ParticipantService $participantService,
protected ParticipantRepository $participantRepository,
protected CookieHandler $cookieHandler,
) {
}

Expand All @@ -38,13 +40,14 @@ public function landing(Request $request, Response $response, ?User $user): Resp
return $this->redirect($request, $response, 'getDashboard');
}

public function login(Response $response, Event $event): Response
public function login(Request $request, Response $response, Event $event): Response
{
return $this->view->render(
$response,
'kissj/login.twig',
[
'skautisLoginUri' => $this->skautisService->getLoginUri($event->slug),
'lastLogin' => $this->cookieHandler->getCookie($request, 'lastLogin'),
],
);
}
Expand All @@ -61,7 +64,7 @@ public function sendLoginEmail(Request $request, Response $response): Response
$this->userService->sendLoginTokenByMail($email, $request, $event);
} catch (Exception $e) {
if ($_ENV['DEBUG'] === 'true') {
throw new Exception($e->getMessage(), $e->getCode(), $e);
throw $e; // TODO refactor into new EmailException
}
$this->sentryCollector->collect($e);
$this->logger->error('Error sending login email to ' . $email . ' with token ' .
Expand All @@ -88,6 +91,7 @@ public function tryLoginWithToken(Request $request, Response $response, string $
$user = $loginToken->user;
$this->userRegeneration->saveUserIdIntoSession($user);
$this->userService->invalidateAllLoginTokens($user);
$response = $this->cookieHandler->setCookie($response, 'lastLogin', 'email');

return $this->redirect($request, $response, 'getDashboard');
}
Expand Down

0 comments on commit a1aeee9

Please sign in to comment.