Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
purescript-gargantext
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
148
Issues
148
List
Board
Labels
Milestones
Merge Requests
2
Merge Requests
2
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
gargantext
purescript-gargantext
Commits
5aa7ecf5
Verified
Commit
5aa7ecf5
authored
Sep 05, 2025
by
Przemyslaw Kaminski
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[notifications] add possibility to notify user from the backend
parent
632ce6a4
Pipeline
#7857
passed with stages
in 22 minutes and 7 seconds
Changes
5
Pipelines
1
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
26 additions
and
2 deletions
+26
-2
App.purs
src/Gargantext/Components/App/App.purs
+11
-1
ErrorsView.purs
src/Gargantext/Components/ErrorsView.purs
+1
-0
Notifications.purs
src/Gargantext/Components/Notifications.purs
+1
-1
Types.purs
src/Gargantext/Components/Notifications/Types.purs
+12
-0
Types.purs
src/Gargantext/Types.purs
+1
-0
No files found.
src/Gargantext/Components/App/App.purs
View file @
5aa7ecf5
...
@@ -2,6 +2,7 @@ module Gargantext.Components.App (app) where
...
@@ -2,6 +2,7 @@ module Gargantext.Components.App (app) where
import Gargantext.Prelude
import Gargantext.Prelude
import Data.Array as A
import Data.Sequence as Seq
import Data.Sequence as Seq
import Data.Tuple.Nested ((/\))
import Data.Tuple.Nested ((/\))
import Gargantext.AsyncTasks as GAT
import Gargantext.AsyncTasks as GAT
...
@@ -14,7 +15,7 @@ import Gargantext.Hooks (useHashRouter)
...
@@ -14,7 +15,7 @@ import Gargantext.Hooks (useHashRouter)
import Gargantext.Hooks.FirstEffect (useFirstEffect')
import Gargantext.Hooks.FirstEffect (useFirstEffect')
import Gargantext.Router as Router
import Gargantext.Router as Router
import Gargantext.Sessions as Sessions
import Gargantext.Sessions as Sessions
import Gargantext.Types (CacheParams, defaultCacheParams)
import Gargantext.Types (CacheParams, defaultCacheParams
, FrontendError(FStringNotification)
)
import Gargantext.Utils (getter, host)
import Gargantext.Utils (getter, host)
import Gargantext.Utils.Reactix as R2
import Gargantext.Utils.Reactix as R2
import Reactix as R
import Reactix as R
...
@@ -122,6 +123,15 @@ mainAppCpt = here.component "main" cpt
...
@@ -122,6 +123,15 @@ mainAppCpt = here.component "main" cpt
wsProto <- Notifications.wsProtocol
wsProto <- Notifications.wsProtocol
h <- host
h <- host
Notifications.connect ws (wsProto <> "://" <> h <> "/ws") session
Notifications.connect ws (wsProto <> "://" <> h <> "/ws") session
-- Subscribe to ping requests (e.g. NotifyUser)
let
callback n = case n of
NotificationsT.NNotifyUser _userId notification -> T.modify_ (A.cons $ FStringNotification { notification }) boxes.errors
_ -> here.log2 "ping received but not handled" n
let action = NotificationsT.InsertCallback NotificationsT.Ping "ping!" callback
Notifications.performAction ws action
-- T.write_ ws boxes.wsNotification
-- T.write_ ws boxes.wsNotification
-- NOTE: Dummy subscription
-- NOTE: Dummy subscription
-- let action = NotificationsT.InsertCallback (NotificationsT.UpdateTree (-1)) "some-uuid" (\_ -> here.log "callback!")
-- let action = NotificationsT.InsertCallback (NotificationsT.UpdateTree (-1)) "some-uuid" (\_ -> here.log "callback!")
...
...
src/Gargantext/Components/ErrorsView.purs
View file @
5aa7ecf5
...
@@ -38,6 +38,7 @@ componentCpt = here.component "main" cpt
...
@@ -38,6 +38,7 @@ componentCpt = here.component "main" cpt
showError errors i (FStringError { error }) = errorAlert errors i "danger" error
showError errors i (FStringError { error }) = errorAlert errors i "danger" error
showError errors i (FStringWarning { warning }) = errorAlert errors i "warning" warning
showError errors i (FStringWarning { warning }) = errorAlert errors i "warning" warning
showError errors i (FStringNotification { notification }) = errorAlert errors i "info" notification
showError errors i (FRESTError { error }) = errorAlert errors i "danger" (show error)
showError errors i (FRESTError { error }) = errorAlert errors i "danger" (show error)
showError errors i (FOtherError { error }) = errorAlert errors i "danger" (show error)
showError errors i (FOtherError { error }) = errorAlert errors i "danger" (show error)
...
...
src/Gargantext/Components/Notifications.purs
View file @
5aa7ecf5
...
@@ -142,7 +142,7 @@ performAction ws (RemoveCallback topic uuid) = do
...
@@ -142,7 +142,7 @@ performAction ws (RemoveCallback topic uuid) = do
-- WSNotification $ ws' { state = removeCallback ws'.state topic uuid }
-- WSNotification $ ws' { state = removeCallback ws'.state topic uuid }
performAction (WSNotification ws') (Call notification) = do
performAction (WSNotification ws') (Call notification) = do
state <- Ref.read ws'.state
state <- Ref.read ws'.state
-- here.log2 "[performAction Call]
state" state
-- here.log2 "[performAction Call]
notification" notification
callNotification state notification
callNotification state notification
-- | Correctly choose between "ws" and "wss" protocols based on what
-- | Correctly choose between "ws" and "wss" protocols based on what
...
...
src/Gargantext/Components/Notifications/Types.purs
View file @
5aa7ecf5
...
@@ -18,6 +18,7 @@ import Effect.Timer (setTimeout)
...
@@ -18,6 +18,7 @@ import Effect.Timer (setTimeout)
import Effect.Var (($=))
import Effect.Var (($=))
import Effect.Var as Var
import Effect.Var as Var
import Foreign as F
import Foreign as F
import Gargantext.Components.Login.Types (UserId)
import Gargantext.Sessions.Types (Session(..))
import Gargantext.Sessions.Types (Session(..))
import Gargantext.Types as GT
import Gargantext.Types as GT
import Gargantext.Utils.Reactix as R2
import Gargantext.Utils.Reactix as R2
...
@@ -37,6 +38,7 @@ type UUID = String
...
@@ -37,6 +38,7 @@ type UUID = String
data Topic
data Topic
= UpdateWorkerProgress GT.WorkerTask
= UpdateWorkerProgress GT.WorkerTask
| UpdateTree NodeId
| UpdateTree NodeId
| Ping
derive instance Generic Topic _
derive instance Generic Topic _
instance Eq Topic where
instance Eq Topic where
...
@@ -58,6 +60,8 @@ instance JSON.ReadForeign Topic where
...
@@ -58,6 +60,8 @@ instance JSON.ReadForeign Topic where
"update_tree" -> do
"update_tree" -> do
{ node_id } <- JSON.readImpl f :: F.F { node_id :: NodeId }
{ node_id } <- JSON.readImpl f :: F.F { node_id :: NodeId }
pure $ UpdateTree node_id
pure $ UpdateTree node_id
"ping" -> do
pure Ping
s -> F.fail $ F.ErrorAtProperty "type" $ F.ForeignError $ "unknown Topic type: " <> s
s -> F.fail $ F.ErrorAtProperty "type" $ F.ForeignError $ "unknown Topic type: " <> s
instance JSON.WriteForeign Topic where
instance JSON.WriteForeign Topic where
...
@@ -69,6 +73,9 @@ instance JSON.WriteForeign Topic where
...
@@ -69,6 +73,9 @@ instance JSON.WriteForeign Topic where
{ "type": "update_tree"
{ "type": "update_tree"
, node_id
, node_id
}
}
writeImpl Ping = JSON.writeImpl
{ "type": "ping"
}
data WSRequest
data WSRequest
= WSSubscribe Topic
= WSSubscribe Topic
...
@@ -98,6 +105,7 @@ instance JSON.WriteForeign WSRequest where
...
@@ -98,6 +105,7 @@ instance JSON.WriteForeign WSRequest where
data Notification
data Notification
= NUpdateWorkerProgress GT.WorkerTask GT.AsyncTaskLog
= NUpdateWorkerProgress GT.WorkerTask GT.AsyncTaskLog
| NUpdateTree NodeId
| NUpdateTree NodeId
| NNotifyUser UserId String
derive instance Generic Notification _
derive instance Generic Notification _
instance JSON.ReadForeign Notification where
instance JSON.ReadForeign Notification where
...
@@ -110,6 +118,9 @@ instance JSON.ReadForeign Notification where
...
@@ -110,6 +118,9 @@ instance JSON.ReadForeign Notification where
"update_tree" -> do
"update_tree" -> do
{ node_id } <- JSON.readImpl f :: F.F { node_id :: NodeId }
{ node_id } <- JSON.readImpl f :: F.F { node_id :: NodeId }
pure $ NUpdateTree node_id
pure $ NUpdateTree node_id
"notify_user" -> do
{ user_id, message } <- JSON.readImpl f :: F.F { user_id :: UserId, message :: String }
pure $ NNotifyUser user_id message
s -> F.fail $ F.ErrorAtProperty "type" $ F.ForeignError $ "unkown type: " <> s
s -> F.fail $ F.ErrorAtProperty "type" $ F.ForeignError $ "unkown type: " <> s
notificationTopics :: Notification -> Array Topic
notificationTopics :: Notification -> Array Topic
...
@@ -123,6 +134,7 @@ notificationTopics (NUpdateWorkerProgress workerTask@(GT.WorkerTask { node_id })
...
@@ -123,6 +134,7 @@ notificationTopics (NUpdateWorkerProgress workerTask@(GT.WorkerTask { node_id })
Nothing -> []
Nothing -> []
Just nId -> [ UpdateTree nId ]
Just nId -> [ UpdateTree nId ]
notificationTopics (NUpdateTree nodeId) = [ UpdateTree nodeId ]
notificationTopics (NUpdateTree nodeId) = [ UpdateTree nodeId ]
notificationTopics (NNotifyUser _ _) = [ Ping ]
type Callback = Notification -> Effect Unit
type Callback = Notification -> Effect Unit
...
...
src/Gargantext/Types.purs
View file @
5aa7ecf5
...
@@ -922,6 +922,7 @@ toggleSidePanelState Opened = Closed
...
@@ -922,6 +922,7 @@ toggleSidePanelState Opened = Closed
data FrontendError
data FrontendError
= FStringError { error :: String }
= FStringError { error :: String }
| FStringWarning { warning :: String }
| FStringWarning { warning :: String }
| FStringNotification { notification :: String }
| FRESTError { error :: RESTError }
| FRESTError { error :: RESTError }
| FOtherError { error :: String }
| FOtherError { error :: String }
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment