mirror of
https://github.com/urbit/shrub.git
synced 2024-12-22 02:11:38 +03:00
155 lines
3.5 KiB
Plaintext
155 lines
3.5 KiB
Plaintext
:: contact-store [landscape]:
|
|
::
|
|
:: data store that holds individual contact data
|
|
::
|
|
/- store=contact-store
|
|
/+ default-agent, dbug, *migrate
|
|
|%
|
|
+$ card card:agent:gall
|
|
+$ state-4 [%4 =rolodex:store]
|
|
+$ versioned-state
|
|
$% [%0 *]
|
|
[%1 *]
|
|
[%2 *]
|
|
[%3 *]
|
|
state-4
|
|
==
|
|
--
|
|
::
|
|
=| state-4
|
|
=* state -
|
|
%- agent:dbug
|
|
^- agent:gall
|
|
|_ =bowl:gall
|
|
+* this .
|
|
def ~(. (default-agent this %|) bowl)
|
|
::
|
|
++ on-init on-init:def
|
|
++ on-save !>(state)
|
|
++ on-load
|
|
|= old-vase=vase
|
|
^- (quip card _this)
|
|
=/ old !<(versioned-state old-vase)
|
|
?- -.old
|
|
%4 [~ this(state old)]
|
|
%3 [~ this]
|
|
%2 [~ this]
|
|
%1 [~ this]
|
|
%0 [~ this]
|
|
==
|
|
::
|
|
++ on-watch
|
|
|= =path
|
|
^- (quip card _this)
|
|
?> (team:title our.bowl src.bowl)
|
|
|^
|
|
=/ cards=(list card)
|
|
?+ path (on-watch:def path)
|
|
[%updates ~] ~
|
|
==
|
|
[cards this]
|
|
::
|
|
++ give
|
|
|= =cage
|
|
^- (list card)
|
|
[%give %fact ~ cage]~
|
|
--
|
|
::
|
|
++ on-poke
|
|
|= [=mark =vase]
|
|
^- (quip card _this)
|
|
?> (team:title our.bowl src.bowl)
|
|
|^
|
|
=^ cards state
|
|
?+ mark (on-poke:def mark vase)
|
|
%contact-update (update !<(update:store vase))
|
|
%import (import q.vase)
|
|
==
|
|
[cards this]
|
|
::
|
|
++ update
|
|
|= =update:store
|
|
^- (quip card _state)
|
|
|^
|
|
?- -.update
|
|
%initial (handle-initial +.update)
|
|
%add (handle-add +.update)
|
|
%remove (handle-remove +.update)
|
|
%edit (handle-edit +.update)
|
|
==
|
|
::
|
|
++ handle-initial
|
|
|= rolo=rolodex:store
|
|
^- (quip card _state)
|
|
=. rolodex (~(uni by rolodex) rolo)
|
|
:_ state(rolodex rolodex)
|
|
(send-diff [%initial rolodex])
|
|
::
|
|
++ handle-add
|
|
|= [=ship =contact:store]
|
|
^- (quip card _state)
|
|
?< (~(has by rolodex) ship)
|
|
:- (send-diff [%add ship contact])
|
|
state(rolodex (~(put by rolodex) ship contact))
|
|
::
|
|
++ handle-remove
|
|
|= =ship
|
|
^- (quip card _state)
|
|
?> (~(has by rolodex) ship)
|
|
:- (send-diff [%remove ship])
|
|
state(rolodex (~(del by rolodex) ship))
|
|
::
|
|
++ handle-edit
|
|
|= [=ship =edit-field:store]
|
|
^- (quip card _state)
|
|
=/ contact (~(got by rolodex) ship)
|
|
=. contact (edit-contact contact edit-field)
|
|
:- (send-diff [%edit ship edit-field])
|
|
state(rolodex (~(put by rolodex) ship contact))
|
|
::
|
|
++ edit-contact
|
|
|= [=contact:store edit=edit-field:store]
|
|
^- contact:store
|
|
?- -.edit
|
|
%nickname contact(nickname nickname.edit)
|
|
%email contact(email email.edit)
|
|
%phone contact(phone phone.edit)
|
|
%website contact(website website.edit)
|
|
%color contact(color color.edit)
|
|
%avatar contact(avatar avatar.edit)
|
|
==
|
|
::
|
|
++ send-diff
|
|
|= =update:store
|
|
^- (list card)
|
|
[%give %fact ~[/updates] %contact-update !>(update)]~
|
|
--
|
|
::
|
|
++ import
|
|
|= arc=*
|
|
^- (quip card _state)
|
|
[~ *state-4]
|
|
--
|
|
::
|
|
++ on-peek
|
|
|= =path
|
|
^- (unit (unit cage))
|
|
?+ path (on-peek:def path)
|
|
[%x %all ~] ``noun+!>(rolodex)
|
|
[%x %export ~] ``noun+!>(state)
|
|
::
|
|
[%x %contact @ ~]
|
|
=/ =ship (slav %p i.t.t.path)
|
|
=/ contact=(unit contact:store) (~(get by rolodex) ship)
|
|
?~ contact ~
|
|
:- ~ :- ~ :- %contact-update
|
|
!> ^- update:store
|
|
[%add ship u.contact]
|
|
==
|
|
::
|
|
++ on-leave on-leave:def
|
|
++ on-agent on-agent:def
|
|
++ on-arvo on-arvo:def
|
|
++ on-fail on-fail:def
|
|
--
|