update pair request alert when button is pressed
This commit is contained in:
parent
f62cc48482
commit
1e41c0d85e
7 changed files with 54 additions and 18 deletions
|
@ -53,9 +53,13 @@ data Alert = Alert
|
||||||
, alertButton :: Maybe AlertButton
|
, alertButton :: Maybe AlertButton
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{- When clicked, a button always redirects to a URL
|
||||||
|
- It may also run an IO action in the background, which is useful
|
||||||
|
- to make the button close or otherwise change the alert. -}
|
||||||
data AlertButton = AlertButton
|
data AlertButton = AlertButton
|
||||||
{ buttonUrl :: Text
|
{ buttonLabel :: Text
|
||||||
, buttonLabel :: Text
|
, buttonUrl :: Text
|
||||||
|
, buttonAction :: Maybe (AlertId -> IO ())
|
||||||
}
|
}
|
||||||
|
|
||||||
type AlertPair = (AlertId, Alert)
|
type AlertPair = (AlertId, Alert)
|
||||||
|
|
|
@ -16,6 +16,7 @@ import Assistant.WebApp
|
||||||
import Assistant.WebApp.Types
|
import Assistant.WebApp.Types
|
||||||
import Assistant.Alert
|
import Assistant.Alert
|
||||||
import Utility.Verifiable
|
import Utility.Verifiable
|
||||||
|
import Utility.Tense
|
||||||
|
|
||||||
import Network.Multicast
|
import Network.Multicast
|
||||||
import Network.Socket
|
import Network.Socket
|
||||||
|
@ -54,24 +55,38 @@ pairListenerThread st dstatus urlrenderer = thread $ withSocketsDo $ do
|
||||||
- so repeated requests do not add additional alerts. -}
|
- so repeated requests do not add additional alerts. -}
|
||||||
pairReqAlert :: DaemonStatusHandle -> UrlRenderer -> PairMsg -> IO ()
|
pairReqAlert :: DaemonStatusHandle -> UrlRenderer -> PairMsg -> IO ()
|
||||||
pairReqAlert dstatus urlrenderer msg = unlessM myreq $ do
|
pairReqAlert dstatus urlrenderer msg = unlessM myreq $ do
|
||||||
let (_, pairdata) = verifiableVal v
|
|
||||||
let repo = remoteUserName pairdata ++ "@" ++
|
|
||||||
fromMaybe (showAddr $ remoteAddress pairdata)
|
|
||||||
(remoteHostName pairdata) ++
|
|
||||||
(remoteDirectory pairdata)
|
|
||||||
url <- renderUrl urlrenderer (FinishPairR msg) []
|
url <- renderUrl urlrenderer (FinishPairR msg) []
|
||||||
void $ addAlert dstatus $ pairRequestAlert repo
|
void $ addAlert dstatus $ pairRequestAlert repo
|
||||||
(repo ++ " is sending a pair request.") $
|
(repo ++ " is sending a pair request.") $
|
||||||
AlertButton
|
AlertButton
|
||||||
{ buttonUrl = url
|
{ buttonUrl = url
|
||||||
, buttonLabel = T.pack "Respond"
|
, buttonLabel = T.pack "Respond"
|
||||||
|
, buttonAction = Just onclick
|
||||||
}
|
}
|
||||||
where
|
where
|
||||||
v = fromPairMsg msg
|
v = fromPairMsg msg
|
||||||
|
(_, pairdata) = verifiableVal v
|
||||||
|
repo = concat
|
||||||
|
[ remoteUserName pairdata
|
||||||
|
, "@"
|
||||||
|
, fromMaybe (showAddr $ remoteAddress pairdata)
|
||||||
|
(remoteHostName pairdata)
|
||||||
|
, ":"
|
||||||
|
, (remoteDirectory pairdata)
|
||||||
|
]
|
||||||
{- Filter out our own pair requests, by checking if we
|
{- Filter out our own pair requests, by checking if we
|
||||||
- can verify using the secrets of any of them. -}
|
- can verify using the secrets of any of them. -}
|
||||||
myreq = any (verified v . inProgressSecret) . pairingInProgress
|
myreq = any (verified v . inProgressSecret) . pairingInProgress
|
||||||
<$> getDaemonStatus dstatus
|
<$> getDaemonStatus dstatus
|
||||||
|
{- Remove the button when it's clicked, and convert the
|
||||||
|
- alert to filler. It cannot be entirely removed since
|
||||||
|
- more pair request messages are coming in and would
|
||||||
|
- re-add it. -}
|
||||||
|
onclick i = updateAlert dstatus i $ \alert -> Just $ alert
|
||||||
|
{ alertButton = Nothing
|
||||||
|
, alertPriority = Filler
|
||||||
|
, alertData = [UnTensed $ T.pack $ "pair request with " ++ repo ++ " in progress"]
|
||||||
|
}
|
||||||
|
|
||||||
{- When a valid PairAck is seen, a host has successfully paired with
|
{- When a valid PairAck is seen, a host has successfully paired with
|
||||||
- us, and we should finish pairing with them. Then send a PairDone.
|
- us, and we should finish pairing with them. Then send a PairDone.
|
||||||
|
|
|
@ -132,3 +132,10 @@ renderUrl :: UrlRenderer -> Route WebApp -> [(Text, Text)] -> IO Text
|
||||||
renderUrl urlrenderer route params = do
|
renderUrl urlrenderer route params = do
|
||||||
r <- readMVar urlrenderer
|
r <- readMVar urlrenderer
|
||||||
return $ r route params
|
return $ r route params
|
||||||
|
|
||||||
|
{- Redirects back to the referring page, or if there's none, HomeR -}
|
||||||
|
redirectBack :: Handler ()
|
||||||
|
redirectBack = do
|
||||||
|
clearUltDest
|
||||||
|
setUltDestReferer
|
||||||
|
redirectUltDest HomeR
|
||||||
|
|
|
@ -116,12 +116,6 @@ postFileBrowserR = void openFileBrowser
|
||||||
getFileBrowserR :: Handler ()
|
getFileBrowserR :: Handler ()
|
||||||
getFileBrowserR = whenM openFileBrowser $ redirectBack
|
getFileBrowserR = whenM openFileBrowser $ redirectBack
|
||||||
|
|
||||||
redirectBack :: Handler ()
|
|
||||||
redirectBack = do
|
|
||||||
clearUltDest
|
|
||||||
setUltDestReferer
|
|
||||||
redirectUltDest HomeR
|
|
||||||
|
|
||||||
{- Opens the system file browser on the repo, or, as a fallback,
|
{- Opens the system file browser on the repo, or, as a fallback,
|
||||||
- goes to a file:// url. Returns True if it's ok to redirect away
|
- goes to a file:// url. Returns True if it's ok to redirect away
|
||||||
- from the page (ie, the system file browser was opened).
|
- from the page (ie, the system file browser was opened).
|
||||||
|
|
|
@ -76,4 +76,19 @@ getSideBarR nid = do
|
||||||
getCloseAlert :: AlertId -> Handler ()
|
getCloseAlert :: AlertId -> Handler ()
|
||||||
getCloseAlert i = do
|
getCloseAlert i = do
|
||||||
webapp <- getYesod
|
webapp <- getYesod
|
||||||
void $ liftIO $ removeAlert (daemonStatus webapp) i
|
liftIO $ removeAlert (daemonStatus webapp) i
|
||||||
|
|
||||||
|
{- When an alert with a button is clicked on, the button takes us here. -}
|
||||||
|
getClickAlert :: AlertId -> Handler ()
|
||||||
|
getClickAlert i = do
|
||||||
|
webapp <- getYesod
|
||||||
|
m <- alertMap <$> liftIO (getDaemonStatus $ daemonStatus webapp)
|
||||||
|
case M.lookup i m of
|
||||||
|
Just (Alert { alertButton = Just b }) -> do
|
||||||
|
{- Spawn a thread to run the action while redirecting. -}
|
||||||
|
case buttonAction b of
|
||||||
|
Nothing -> noop
|
||||||
|
Just a -> liftIO $ void $ forkIO $ a i
|
||||||
|
redirect $ buttonUrl b
|
||||||
|
_ -> redirectBack
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,8 @@
|
||||||
/sidebar/#NotificationId SideBarR GET
|
/sidebar/#NotificationId SideBarR GET
|
||||||
/notifier/transfers NotifierTransfersR GET
|
/notifier/transfers NotifierTransfersR GET
|
||||||
/notifier/sidebar NotifierSideBarR GET
|
/notifier/sidebar NotifierSideBarR GET
|
||||||
/closealert/#AlertId CloseAlert GET
|
/alert/close/#AlertId CloseAlert GET
|
||||||
|
/alert/click/#AlertId ClickAlert GET
|
||||||
/filebrowser FileBrowserR GET POST
|
/filebrowser FileBrowserR GET POST
|
||||||
|
|
||||||
/transfer/pause/#Transfer PauseTransferR GET POST
|
/transfer/pause/#Transfer PauseTransferR GET POST
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<div .alert .fade .in .#{divclass} :block:.alert-block ##{alertid} :closable:onclick="(function( $ ) { $.get('@{CloseAlert aid}') })( jQuery );">
|
<div .alert .fade .in .#{divclass} :block:.alert-block ##{alertid}>
|
||||||
$if closable
|
$if closable
|
||||||
<a .close>×</a>
|
<a .close onclick="(function( $ ) { $.get('@{CloseAlert aid}') })( jQuery );">×</a>
|
||||||
$maybe h <- renderAlertHeader alert
|
$maybe h <- renderAlertHeader alert
|
||||||
$if block
|
$if block
|
||||||
<h4 .alert-heading>
|
<h4 .alert-heading>
|
||||||
|
@ -20,5 +20,5 @@
|
||||||
$of Nothing
|
$of Nothing
|
||||||
$of Just button
|
$of Just button
|
||||||
<br>
|
<br>
|
||||||
<a .btn .btn-primary href="#{buttonUrl button}">
|
<a .btn .btn-primary href="@{ClickAlert aid}">
|
||||||
#{buttonLabel button}
|
#{buttonLabel button}
|
||||||
|
|
Loading…
Add table
Reference in a new issue