mirror of
https://github.com/urbit/shrub.git
synced 2024-12-22 18:31:44 +03:00
e2d10367af
When we receive a notification, it might not affect our count because it’ll get merged on the server side, but we unconditionally increment our count on the client if the notification hasn’t been loaded yet. Addresses this by storing a set of time, index so we can compute whether or not the notification is merged or unloaded and change the count accordingly. Fixes urbit/landscape#276
319 lines
6.9 KiB
Plaintext
319 lines
6.9 KiB
Plaintext
/- sur=hark-store, post
|
|
/+ resource, graph-store, group-store
|
|
^?
|
|
=< [. sur]
|
|
=, sur
|
|
|%
|
|
++ dejs
|
|
=, dejs:format
|
|
|%
|
|
++ index
|
|
%- of
|
|
:~ graph+graph-index
|
|
group+group-index
|
|
==
|
|
::
|
|
++ group-index
|
|
%- ot
|
|
:~ group+dejs-path:resource
|
|
description+so
|
|
==
|
|
::
|
|
++ graph-index
|
|
%- ot
|
|
:~ group+dejs-path:resource
|
|
graph+dejs-path:resource
|
|
module+so
|
|
description+so
|
|
index+(su ;~(pfix fas (more fas dem)))
|
|
==
|
|
::
|
|
++ stats-index
|
|
%- of
|
|
:~ graph+graph-stats-index
|
|
group+dejs-path:resource
|
|
==
|
|
++ graph-stats-index
|
|
%- ot
|
|
:~ graph+dejs-path:resource
|
|
index+graph-store-index
|
|
==
|
|
:: parse date as @ud
|
|
:: TODO: move to zuse
|
|
++ sd
|
|
|= jon=json
|
|
^- @da
|
|
?> ?=(%s -.jon)
|
|
`@da`(rash p.jon dem:ag)
|
|
::
|
|
++ notif-ref
|
|
^- $-(json [@da ^index])
|
|
%- ot
|
|
:~ time+sd
|
|
index+index
|
|
==
|
|
++ graph-store-index
|
|
(su ;~(pfix fas (more fas dem)))
|
|
::
|
|
++ add
|
|
|= jon=json
|
|
[*^index *notification]
|
|
::
|
|
++ read-graph-index
|
|
%- ot
|
|
:~ index+stats-index
|
|
target+graph-store-index
|
|
==
|
|
::
|
|
++ action
|
|
^- $-(json ^action)
|
|
%- of
|
|
:~ seen+ul
|
|
archive+notif-ref
|
|
unread-note+notif-ref
|
|
read-note+notif-ref
|
|
add-note+add
|
|
set-dnd+bo
|
|
read-count+stats-index
|
|
read-each+read-graph-index
|
|
read-all+ul
|
|
==
|
|
--
|
|
::
|
|
++ enjs
|
|
=, enjs:format
|
|
|%
|
|
++ update
|
|
|= upd=^update
|
|
^- json
|
|
|^
|
|
%+ frond -.upd
|
|
?+ -.upd a+~
|
|
%added (added +.upd)
|
|
%timebox (timebox +.upd)
|
|
%set-dnd b+dnd.upd
|
|
%count (numb count.upd)
|
|
%more (more +.upd)
|
|
%read-each (read-each +.upd)
|
|
%read-count (stats-index +.upd)
|
|
%unread-each (unread-each +.upd)
|
|
%unread-count (unread-count +.upd)
|
|
%remove-graph s+(enjs-path:resource +.upd)
|
|
%seen-index (seen-index +.upd)
|
|
%unreads (unreads +.upd)
|
|
::
|
|
?(%archive %read-note %unread-note)
|
|
(notif-ref +.upd)
|
|
==
|
|
::
|
|
++ stats-index
|
|
|= s=^stats-index
|
|
%+ frond -.s
|
|
|^
|
|
?- -.s
|
|
%graph (graph-stats-index +.s)
|
|
%group s+(enjs-path:resource +.s)
|
|
==
|
|
::
|
|
++ graph-stats-index
|
|
|= [graph=resource =index:graph-store]
|
|
%- pairs
|
|
:~ graph+s+(enjs-path:resource graph)
|
|
index+(index:enjs:graph-store index)
|
|
==
|
|
--
|
|
::
|
|
++ unreads
|
|
|= l=(list [^stats-index ^stats])
|
|
^- json
|
|
:- %a
|
|
^- (list json)
|
|
%+ turn l
|
|
|= [idx=^stats-index s=^stats]
|
|
%- pairs
|
|
:~ stats+(stats s)
|
|
index+(stats-index idx)
|
|
==
|
|
::
|
|
++ unread
|
|
|= =^unreads
|
|
%+ frond
|
|
-.unreads
|
|
?- -.unreads
|
|
%each a+(turn ~(tap by indices.unreads) index:enjs:graph-store)
|
|
::
|
|
%count
|
|
(numb num.unreads)
|
|
==
|
|
::
|
|
++ stats
|
|
|= s=^stats
|
|
^- json
|
|
%- pairs
|
|
:~ unreads+(unread unreads.s)
|
|
notifications+a+(turn ~(tap in notifications.s) notif-ref)
|
|
last+(time last-seen.s)
|
|
==
|
|
++ added
|
|
|= [tim=@da idx=^index not=^notification]
|
|
^- json
|
|
%- pairs
|
|
:~ time+s+(scot %ud tim)
|
|
index+(index idx)
|
|
notification+(notification not)
|
|
==
|
|
::
|
|
++ notif-ref
|
|
|= [tim=@da idx=^index]
|
|
^- json
|
|
%- pairs
|
|
:~ time+s+(scot %ud tim)
|
|
index+(index idx)
|
|
==
|
|
++ seen-index
|
|
|= [tim=@da idx=^stats-index]
|
|
^- json
|
|
%- pairs
|
|
:~ time+(time tim)
|
|
index+(stats-index idx)
|
|
==
|
|
::
|
|
++ more
|
|
|= upds=(list ^update)
|
|
^- json
|
|
a+(turn upds update)
|
|
::
|
|
++ index
|
|
|= =^index
|
|
%+ frond -.index
|
|
|^
|
|
?- -.index
|
|
%graph (graph-index +.index)
|
|
%group (group-index +.index)
|
|
==
|
|
::
|
|
++ graph-index
|
|
|= $: group=resource
|
|
graph=resource
|
|
module=@t
|
|
description=@t
|
|
idx=index:graph-store
|
|
==
|
|
^- json
|
|
%- pairs
|
|
:~ group+s+(enjs-path:resource group)
|
|
graph+s+(enjs-path:resource graph)
|
|
module+s+module
|
|
description+s+description
|
|
index+(index:enjs:graph-store idx)
|
|
==
|
|
::
|
|
++ group-index
|
|
|= [group=resource description=@t]
|
|
^- json
|
|
%- pairs
|
|
:~ group+s+(enjs-path:resource group)
|
|
description+s+description
|
|
==
|
|
--
|
|
::
|
|
++ notification
|
|
|= ^notification
|
|
^- json
|
|
%- pairs
|
|
:~ time+(time date)
|
|
read+b+read
|
|
contents+(^contents contents)
|
|
==
|
|
::
|
|
++ contents
|
|
|= =^contents
|
|
^- json
|
|
%+ frond -.contents
|
|
|^
|
|
?- -.contents
|
|
%graph (graph-contents +.contents)
|
|
%group (group-contents +.contents)
|
|
==
|
|
::
|
|
++ graph-contents
|
|
|= =(list post:post)
|
|
^- json
|
|
:- %a
|
|
(turn list post:enjs:graph-store)
|
|
::
|
|
++ group-contents
|
|
|= =(list ^group-contents)
|
|
^- json
|
|
:- %a
|
|
%+ turn list
|
|
|= =^group-contents
|
|
(update:enjs:group-store group-contents)
|
|
--
|
|
::
|
|
++ indexed-notification
|
|
|= [=^index =^notification]
|
|
%- pairs
|
|
:~ index+(^index index)
|
|
notification+(^notification notification)
|
|
==
|
|
::
|
|
++ timebox
|
|
|= [tim=@da arch=? l=(list [^index ^notification])]
|
|
^- json
|
|
%- pairs
|
|
:~ time+s+(scot %ud tim)
|
|
archive+b+arch
|
|
:- %notifications
|
|
^- json
|
|
:- %a
|
|
%+ turn l
|
|
|= [=^index =^notification]
|
|
^- json
|
|
(indexed-notification index notification)
|
|
==
|
|
::
|
|
++ read-each
|
|
|= [s=^stats-index target=index:graph-store]
|
|
%- pairs
|
|
:~ index+(stats-index s)
|
|
target+(index:enjs:graph-store target)
|
|
==
|
|
::
|
|
++ unread-each
|
|
|= [s=^stats-index target=index:graph-store tim=@da]
|
|
%- pairs
|
|
:~ index+(stats-index s)
|
|
target+(index:enjs:graph-store target)
|
|
last+(time tim)
|
|
==
|
|
::
|
|
++ unread-count
|
|
|= [s=^stats-index tim=@da]
|
|
%- pairs
|
|
:~ index+(stats-index s)
|
|
last+(time tim)
|
|
==
|
|
--
|
|
--
|
|
::
|
|
++ to-stats-index
|
|
|= =index
|
|
^- stats-index
|
|
?- -.index
|
|
%graph [%graph graph.index index.index]
|
|
%group [%group group.index]
|
|
==
|
|
++ stats-index-is-index
|
|
|= [=stats-index =index]
|
|
?- -.index
|
|
%graph
|
|
?. ?=(%graph -.stats-index) %.n
|
|
=([graph index]:index [graph index]:stats-index)
|
|
::
|
|
%group
|
|
?. ?=(%group -.stats-index) %.n
|
|
=(group:index group:stats-index)
|
|
==
|
|
--
|