J'ai écrit un plugin d'authentification Yesod qui envoie par courrier des codes d'invitation, qui sont ensuite requis pour l'enregistrement. J'aimerais inclure dans le plugin un widget contenant un formulaire pour la création d'invitations ; le formulaire serait envoyé vers une route dans le plugin d'authentification. Ce qui me pose problème, c'est de trouver une signature de type pour le widget qui permette la création de l'URL appropriée et qui puisse également être utilisée dans un gestionnaire pour le site principal.
Réduit à l'essentiel, le widget ressemble à ceci :
invitationWidget :: GWidget Auth m ()
invitationWidget = do
tm <- lift getRouteToMaster
[whamlet|<form action=@{tm inviteR}>|]
inviteR :: AuthRoute
inviteR = PluginR "invite" ["invite"]
Le problème est qu'en spécifiant le Auth
pour le widget signifie que je ne peux pas l'intégrer directement dans un gestionnaire de type GHandler master master a
(l'erreur exacte est Couldn't match type `App' with `Yesod.Auth.Auth'
). Cependant, si le sous-site n'est pas spécifié, par ex. invitationWidget :: GWidget s m ()
alors je ne vois pas de moyen d'arriver à inviteR
(l'erreur pour cela est Could not deduce (MonadLift (GHandler Auth m) (GWidget s m))
).