untangled

NEW CHANNEL: #fulcro
mitchelkuijpers 2016-10-25T09:31:33.002981Z

Whohoo return values for mutations (will be very useful for certain situations)

tony.kay 2016-10-25T19:50:21.002994Z

Hey everyone trying to use latest cljs: @wilkerlucio just sent me a PR that fixes Untangled to work with the latest Om/Cljs. I have applied it to develop branch, and pushed it to clojars as part of 0.6.0-SNAPSHOT

wilkerlucio 2016-10-25T19:53:36.002996Z

@tony.kay just fyi, I just tested compiling with the latest snapshot and it's working again, thanks for the release 🙂

tony.kay 2016-10-25T19:56:35.002997Z

welcome

tony.kay 2016-10-25T19:56:42.002998Z

thanks for figuring out the fix

tony.kay 2016-10-25T19:57:00.002999Z

I'll probably cut an official release soon

tony.kay 2016-10-25T19:57:25.003Z

hoping to get the forms stuff worked out as well this week. Too many things going on

tony.kay 2016-10-25T19:57:33.003001Z

I'm really excited about the forms addition.

wilkerlucio 2016-10-25T19:58:33.003002Z

nice, exciting times

tony.kay 2016-10-25T19:59:16.003003Z

I also need to get some cookbook recipes and docs around the new additions

tony.kay 2016-10-25T19:59:26.003004Z

if anyone is looking for stuff to do 🙂

wilkerlucio 2016-10-25T20:20:24.003008Z

@tony.kay what features you are looking for help on documenting?

tony.kay 2016-10-25T20:46:31.003009Z

The stuff in the changelog

tony.kay 2016-10-25T20:46:38.003010Z

@wilkerlucio like the new return value support

tony.kay 2016-10-25T20:46:48.003011Z

want to put it in the devguide

tony.kay 2016-10-25T20:47:05.003012Z

probably using a client-simulated server, which I've done in other files.

tony.kay 2016-10-25T20:47:31.003013Z

post-mutation parameters can probably just go where post mutations are talked about

tony.kay 2016-10-25T20:48:20.003014Z

Make sure the new load function is in data fetch, and note the deprecated load-data.

tony.kay 2016-10-25T20:48:50.003015Z

those are the main updates that are needed

tony.kay 2016-10-25T20:49:00.003016Z

Then, of course, I want to start a section on forms when I get that done

tony.kay 2016-10-25T20:49:09.003017Z

I would also like a section covering the i18n story

tony.kay 2016-10-25T20:49:13.003018Z

and one for the support viewer

tony.kay 2016-10-25T20:49:36.003019Z

both of those last two need cookbook examples too

wilkerlucio 2016-10-25T20:52:48.003020Z

@tony.kay ok, I'm still trying to catch up with all the new goodies, I would like to experiment a bit with the server-return, then I can help with some docs, do you have an example use case for the server return?

tony.kay 2016-10-25T20:53:14.003021Z

Yeah, um....where did I put that 😉

tony.kay 2016-10-25T20:54:18.003022Z

@wilkerlucio See the discussion above with jasonjckn (11:11am ysterday)

tony.kay 2016-10-25T20:54:32.003023Z

it has pointers to the exact lines of example code in my template

tony.kay 2016-10-25T20:54:57.003024Z

and a discussion of how/why. I made one change at the end of that discussion, so make sure you follow that 🙂

tony.kay 2016-10-25T20:55:17.003025Z

I hope it didn't throw off the hyperlinks

tony.kay 2016-10-25T20:56:04.003026Z

My coding guidelines around it are to make your return handler a multimethod, and co-locate the return handler with the mutation.

tony.kay 2016-10-25T20:56:16.003027Z

that way you can reason about them together

tony.kay 2016-10-25T20:57:11.003028Z

If I had control of the Om parser internals I probably would have made it an additional key on mutation methods (:value, :action, :return-action)

wilkerlucio 2016-10-25T21:00:04.003029Z

@tony.kay just to check if I'm getting it right, the :return is something you can get back from a server mutation, and then it will be dispatched into a post-mutation to be handled on the client, is that correct?

2016-10-25T21:50:28.003030Z

@tony.kay perhaps the mutation results should trigger a mutation ? it seems like the untangled api is asymmetric, e.g. on mutation failure (tx/fallback) => trigger mutation, but on mutation success (mutation result) implement some global handler

2016-10-25T21:51:21.003031Z

in that bucket we also have post-mutations

tony.kay 2016-10-25T21:53:03.003032Z

@jasonjckn the problem is we only have the symbol that is already an Om mutation

tony.kay 2016-10-25T21:53:13.003033Z

and made the original net request

tony.kay 2016-10-25T21:53:19.003034Z

we need a separate entry point

2016-10-25T21:53:30.003035Z

e.g. here's symmetry: post-mutation: a mutation triggered to operate on recently changed local state mutation result: a mutation triggered to operate on recently interim state returned fallback: a mutation triggered to operator on error state

tony.kay 2016-10-25T21:53:43.003036Z

yes, but fallback is for things like server exceptions

tony.kay 2016-10-25T21:53:51.003037Z

return values are for...well, anything

tony.kay 2016-10-25T21:54:09.003038Z

and each mutation may want a specific handler for its return value

2016-10-25T21:54:59.003039Z

yah good points, oh well, i guess it's the best design right now, in theory, you could add (tx/mutation-result :action 'foo/bar)

2016-10-25T21:55:06.003040Z

but i don't know if that improves anything

2016-10-25T21:55:46.003042Z

i guess i can feed mutation results into another multi method

tony.kay 2016-10-25T21:55:48.003043Z

yeah, just makes it noisy

tony.kay 2016-10-25T21:56:20.003044Z

if you co-locate the defmethods of mutate and handle-return, then the code is all right together

tony.kay 2016-10-25T21:56:28.003045Z

that was my comment earlier about guidelines

2016-10-25T21:56:32.003046Z

I suppose the 'real' API win would be the following:

(defmethod mutate 'foo/bar [..]
  {:value {:keys []}
   :action (fn [] ..)
   :result-action (fn [] ..)})

2016-10-25T21:56:36.003047Z

is that workable?

tony.kay 2016-10-25T21:56:40.003048Z

I wish

tony.kay 2016-10-25T21:56:44.003049Z

that was my earlier comment

tony.kay 2016-10-25T21:56:52.003050Z

see above about 1 hr ago

2016-10-25T21:56:55.003051Z

kk

2016-10-25T21:57:16.003052Z

If I had control of the Om parser internals I probably would have made it an additional key on mutation methods (:value, :action, :return-action) ah yes

tony.kay 2016-10-25T21:57:21.003053Z

yep

2016-10-25T21:57:22.003054Z

didn't read that till now

2016-10-25T21:57:33.003055Z

so we're on the same page, too bad that's not doable

2016-10-25T21:57:36.003056Z

but multi method should be fine

tony.kay 2016-10-25T21:57:40.003057Z

well, we can fork Om 😉

2016-10-25T21:58:08.003058Z

om.next.next

2016-10-25T21:58:10.003059Z

😛

tony.kay 2016-10-25T21:58:11.003060Z

nice

2016-10-25T21:58:35.003061Z

maybe it's worth opening a githbu issue about this

2016-10-25T21:58:43.003062Z

you won't be the only one to try and wrap om.next in a framework

tony.kay 2016-10-25T21:58:47.003063Z

on Om?

tony.kay 2016-10-25T21:58:53.003064Z

I can already tell you the answer

2016-10-25T21:58:54.003065Z

yes to see if they can make it more pluggable

tony.kay 2016-10-25T21:59:56.003066Z

The answer is to customize your own merge. Hm.

tony.kay 2016-10-25T22:00:05.003067Z

my brain is itching

2016-10-25T22:00:07.003068Z

in clojure philosophy data is extensible, e.g. {:untangled/mutation-result ... :action ... :value ...}

tony.kay 2016-10-25T22:00:15.003069Z

which means there may be a way to hack that in after all

2016-10-25T22:00:23.003070Z

interesting 😄

tony.kay 2016-10-25T22:00:40.003071Z

actually, I think there is

tony.kay 2016-10-25T22:01:02.003072Z

darn it...

tony.kay 2016-10-25T22:01:14.003073Z

OK, well, thanks for pushing on that. I see how to do it now

tony.kay 2016-10-25T22:01:31.003074Z

@wilkerlucio might want to hold off on docs, I think we can do without the extra mmethod

2016-10-25T22:01:51.003075Z

i love it when we our conversations lead to these refinements 🙂

tony.kay 2016-10-25T22:01:56.003076Z

me too

tony.kay 2016-10-25T22:02:08.003077Z

it's also why some of this stuff is in a SNAPSHOT

tony.kay 2016-10-25T22:02:15.003078Z

play with it

2016-10-25T22:05:33.003079Z

also may be worth doing :fallback-action in the same place if that makes sense, you could keep both apis for backwards compatibility.

tony.kay 2016-10-25T22:06:14.003083Z

fallback is needed for exceptions. Don't know what went wrong, so they're not as easy to target

2016-10-25T22:06:20.003084Z

kk

tony.kay 2016-10-25T22:06:27.003085Z

they are the fallback for everything in the tx, not just an item

2016-10-25T22:06:35.003086Z

ah yes

tony.kay 2016-10-25T22:06:38.003087Z

if you want targeted, use return vals

tony.kay 2016-10-25T22:06:58.003088Z

:result-action or :return-action?

2016-10-25T22:07:51.003089Z

so the arguments are are [env k result-without-tempids] ?

tony.kay 2016-10-25T22:07:55.003090Z

hm. This might not be the best idea, for other reasons. I have no AST or anything. So, if you write a mutation that wants to play with that stuff globally (e.g. to rewrite the params of a remote) it might crash

tony.kay 2016-10-25T22:08:09.003091Z

in other words all I have for env is state

2016-10-25T22:08:23.003092Z

hm

tony.kay 2016-10-25T22:08:27.003093Z

I could mark it in env

tony.kay 2016-10-25T22:08:33.003094Z

(:is-return? env)

2016-10-25T22:09:02.003095Z

that seems fine

2016-10-25T22:09:30.003096Z

in theory you could pass the right env, you just don't know how to do build it up yet

2016-10-25T22:09:35.003097Z

leave it for another PR

2016-10-25T22:10:06.003098Z

it's just not easily available to you through om.next, the env still definitely makes sense in mutation results

2016-10-25T22:10:34.003100Z

-that- might be something to open a PR about in the future

tony.kay 2016-10-25T22:10:53.003101Z

I'm not sure I can't get to it...I'll just have to walk through the implementation

2016-10-25T22:11:03.003102Z

for now is-return? is good enough

tony.kay 2016-10-25T22:11:05.003103Z

but a marker seems good nevertheless.

2016-10-25T22:11:06.003104Z

i'd leave that for another day

2016-10-25T22:11:20.003105Z

honestly nobody will probably notice

2016-10-25T22:12:53.003106Z

can you put the right :ref in there though?

2016-10-25T22:14:24.003107Z

i like :remote-result fwiw

2016-10-25T22:16:47.003109Z

or possibly (:remote (assoc ast :action-result ...) :action ...)

tony.kay 2016-10-25T23:08:19.003117Z

@jasonjckn erm, :result-action?

tony.kay 2016-10-25T23:09:02.003119Z

it's not a result, it's an action

2016-10-25T23:09:15.003120Z

it's all okay but that name doesn't really highly it's the remote's action, not the local action

tony.kay 2016-10-25T23:09:30.003121Z

bleh...naming

2016-10-25T23:09:30.003122Z

there's really 2 different actions, easy to conflate

tony.kay 2016-10-25T23:09:44.003123Z

:remote-result-action

tony.kay 2016-10-25T23:09:49.003124Z

wordy

2016-10-25T23:09:50.003125Z

yes there's no confusion there

2016-10-25T23:09:52.003126Z

yah wordy

2016-10-25T23:10:10.003127Z

(:remote (assoc ast :action-result ...) :action ...) is more in line with om.next

2016-10-25T23:10:16.003128Z

but not as 'easy'

tony.kay 2016-10-25T23:10:28.003129Z

yeah, I kinda hate that

tony.kay 2016-10-25T23:10:28.003130Z

🙂

2016-10-25T23:10:39.003131Z

yah i wish om.next did something else there

2016-10-25T23:10:50.003132Z

for situations where you have remote params

2016-10-25T23:11:07.003133Z

:remote-result ?

2016-10-25T23:11:08.003134Z

no?

tony.kay 2016-10-25T23:11:46.003135Z

I'm sorta liking how it is currently implemented, partially because the env isn't the same (since we're no longer parsing a query)

tony.kay 2016-10-25T23:12:02.003136Z

I think conflating them is going to cause all manner of confusing bugs

tony.kay 2016-10-25T23:12:28.003137Z

but I do like the symmetry of this new approach

2016-10-25T23:12:54.003139Z

the env is the same no? it's just we're not sure how to generate it right now

tony.kay 2016-10-25T23:13:13.003140Z

Let me dig in the plumbing for a min

tony.kay 2016-10-25T23:13:50.003141Z

here's the problem: our hack location is in Om merge

tony.kay 2016-10-25T23:13:58.003142Z

and Om does not pass the original env of the request to me

tony.kay 2016-10-25T23:14:09.003143Z

I can get to app state because I made it

tony.kay 2016-10-25T23:14:19.003144Z

so I can close over the atom in the merge routines

tony.kay 2016-10-25T23:14:43.003145Z

All I get from Om is the target and source values

tony.kay 2016-10-25T23:15:41.003146Z

and you want to be called after all of the merging is done...so this is the phase to run in

tony.kay 2016-10-25T23:16:05.003148Z

um...I can probably hack it through with metadata

tony.kay 2016-10-25T23:16:27.003149Z

but to get env absolutely correct I'd really have to hack into the parser

2016-10-25T23:16:41.003150Z

is there some conversation you can have with @anmonteiro about this

tony.kay 2016-10-25T23:16:42.003151Z

and re-parse the original complete tx while dispatching to this

2016-10-25T23:16:49.003152Z

some new extension to om to make env available

tony.kay 2016-10-25T23:17:09.003154Z

no, this is something Om is leaving up to the implementor for good reasons, I think

2016-10-25T23:19:16.003155Z

changing the parser is no big deal IMO

2016-10-25T23:19:22.003156Z

that's how om.next has meant to be used, every tutorial is like that

tony.kay 2016-10-25T23:19:38.003157Z

I'm kinda leaning towards my current solution again. I don't think this is something ppl are going to need a lot, and co-locating a clear mmethod next to your mutation really is pretty clean

tony.kay 2016-10-25T23:19:54.003158Z

no, you're wrong there.

tony.kay 2016-10-25T23:19:59.003159Z

we use the term wrong

tony.kay 2016-10-25T23:20:11.003160Z

our multimethods are really emitters

tony.kay 2016-10-25T23:20:19.003161Z

the parser is the thing that makes an AST

tony.kay 2016-10-25T23:20:25.003162Z

and dispatches to our emitters

tony.kay 2016-10-25T23:20:41.003163Z

I'm saying we'd have to hack the thing that makes the AST and dispatches

2016-10-25T23:20:45.003164Z

i see

tony.kay 2016-10-25T23:20:46.003165Z

which is not something you ever do

2016-10-25T23:20:51.003166Z

yah that's no good

tony.kay 2016-10-25T23:21:07.003167Z

I can see a hack that would work, but it is uuuuugly

tony.kay 2016-10-25T23:21:33.003168Z

mmm, not sure it would work either

2016-10-25T23:22:28.003169Z

does it make it easier if it's {:remote (assoc ast :action-result (fn [] ..) :action } this seems like the right place for it, does this not give you some flexibility in the remote implementation to call the action-result handler when the remote action finishes?

tony.kay 2016-10-25T23:22:47.003170Z

no

tony.kay 2016-10-25T23:22:59.003171Z

well

tony.kay 2016-10-25T23:23:00.003172Z

hold on

tony.kay 2016-10-25T23:23:33.003173Z

not seeing how that could work

tony.kay 2016-10-25T23:23:59.003174Z

and then I've got a mess of logic to even pull it out

tony.kay 2016-10-25T23:24:07.003175Z

in a whole different part of the plumbing

tony.kay 2016-10-25T23:24:53.003176Z

the problem continues to be the correct env, which I cannot generate

tony.kay 2016-10-25T23:25:14.003177Z

but your server code can pass back anything you might need

tony.kay 2016-10-25T23:25:19.003178Z

which is the intention

tony.kay 2016-10-25T23:25:33.003179Z

e.g. you can add things in your params on the mutation that you want reflected back

tony.kay 2016-10-25T23:26:08.003180Z

yeah, I'm sticking with how I've implemented it. It's just too fragile and complected to add this into mutate, even though on the surface it looks like a good idea

2016-10-25T23:26:34.003181Z

untangled implements this remote right? so in the implementation, here's a shitty one, but you maintain a registry of mutation name->{action-result function , env, etc} then when merge comes back (or maybe there's some callback in remote) you use that registry, obviously this sucks, does it work? i'm not that familiar with om, but i feel like if it's doesn't already support this 'callback when remote mutation comes back' this seems like a logical flow of it's design

tony.kay 2016-10-25T23:27:51.003182Z

It seriously makes an internal mess.

tony.kay 2016-10-25T23:28:00.003183Z

for very little benefit

2016-10-25T23:28:04.003184Z

sure I follow

2016-10-25T23:28:22.003185Z

anyways if you ever think of some small change to om.next that would allow this to be internal niceness, definitely post an issue

tony.kay 2016-10-25T23:28:28.003186Z

not remotely simple to accomplish or maintain

2016-10-25T23:28:49.003187Z

i don't know the specifics of om, but just thinking about it generally it seems to flow at least in my mind, so maybe there's some small change they can make

2016-10-25T23:29:41.003188Z

whether that's env available in reconciler pluggable merge, or env available in remote mutation ajax cb, etc, etc

tony.kay 2016-10-25T23:30:40.003190Z

env is generated during the parse, not any of those other phases

tony.kay 2016-10-25T23:31:08.003191Z

the whole constructions of invocations of parse has to do with the front-side of transactions, not the back-side

2016-10-25T23:32:05.003192Z

the results of parsing, e.g. the AST are needed both before remotes are contacted, and also after they're contacted, to for example normalize the returned data

2016-10-25T23:32:26.003193Z

so from that abstract view it would follow env should be available after remote returns with action-result

2016-10-25T23:33:08.003194Z

i understand the specific om.next api right now doesn't allow for that, but maybe there's a small change worth suggesting

tony.kay 2016-10-25T23:33:35.003197Z

hm. There's actually a trick we could leverage that is already supported

tony.kay 2016-10-25T23:33:52.003198Z

hadn't thought of that...

2016-10-25T23:34:04.003199Z

😄 that sounds promising

tony.kay 2016-10-25T23:34:26.003200Z

so, when you invoke the parser, you say (p q) or (p q :remote)

tony.kay 2016-10-25T23:34:32.003201Z

the :remote is convention

tony.kay 2016-10-25T23:34:40.003202Z

multiple remotes just use diff keywords

tony.kay 2016-10-25T23:35:13.003203Z

(p q :result-action) would act like a remote parse

2016-10-25T23:35:22.003204Z

yess

tony.kay 2016-10-25T23:35:22.003205Z

oh, but it would expect the value to be a boolean or ast

2016-10-25T23:35:35.003206Z

hm

tony.kay 2016-10-25T23:35:37.003207Z

not a thunk

2016-10-25T23:35:46.003208Z

well you could do the (assoc ast thing

2016-10-25T23:36:29.003209Z

are you the first person to use this for non-remote things?

tony.kay 2016-10-25T23:36:40.003210Z

I don't think you should, actually

2016-10-25T23:37:13.003211Z

yah good brainstorming, but i think we're back to where we were before

tony.kay 2016-10-25T23:38:12.003212Z

{:result-action (callback body)}

2016-10-25T23:38:20.003213Z

right

tony.kay 2016-10-25T23:38:25.003214Z

where callback is a macro that emits an ast hack

2016-10-25T23:38:51.003215Z

are you the first person to use :remote for non remote things?

tony.kay 2016-10-25T23:39:12.003216Z

I don't know of anyone even thinking along these lines, no

adambros 2016-10-25T23:39:27.003217Z

wouldnt callback need env or ast?

2016-10-25T23:39:37.003218Z

it would

tony.kay 2016-10-25T23:39:44.003219Z

yes, but I'd call my own parser on the original tx

adambros 2016-10-25T23:39:57.003220Z

ah so it doesnt need to be passed

tony.kay 2016-10-25T23:40:13.003222Z

you'd just use it from the param list of your mutate

tony.kay 2016-10-25T23:40:19.003223Z

which I'd be invoking again

tony.kay 2016-10-25T23:40:24.003224Z

close over it

tony.kay 2016-10-25T23:40:46.003225Z

it's really hacky to get a small amount of syntactic sugar

2016-10-25T23:40:50.003226Z

agreed

2016-10-25T23:41:09.003227Z

talk to @anmonteiro at some point, I don't see why there isn't a small change here in om.next

tony.kay 2016-10-25T23:41:26.003228Z

well, perhaps we'll find future creative things to do that need these ideas. I'm going to stick wit hthe current impl

tony.kay 2016-10-25T23:42:20.003229Z

It really isn't a small change. The ability to plug-n-play your own database, networking, and everything else eliminates being able to do it well, I think

2016-10-25T23:42:31.003230Z

it's very clojury to support {:action ... :remote ... :untangled/action-result } sort of thing and there's no reason why env shouldn't be available, it's needed to merge&normalize, so why not for :untangled/action-result

tony.kay 2016-10-25T23:42:42.003231Z

it is not needed

tony.kay 2016-10-25T23:42:45.003233Z

the query is needed

tony.kay 2016-10-25T23:42:54.003234Z

and you can modify the query before you call merge

tony.kay 2016-10-25T23:43:17.003235Z

actually merge doesn't even use the query

tony.kay 2016-10-25T23:43:20.003236Z

normalize does

tony.kay 2016-10-25T23:43:30.003237Z

and that certainly isn't a place to be calling callbacks

tony.kay 2016-10-25T23:43:42.003238Z

you haven't even put the data in the db yet

tony.kay 2016-10-25T23:44:13.003239Z

Q -> net -> server -> resp -> om callback -> normalize -> merge -> result-callbacks

2016-10-25T23:44:24.003240Z

ok, and you don't like on-success mutation? even though you have post-mutation and error mutation

tony.kay 2016-10-25T23:44:57.003242Z

post-mutation was experimental, and I don't think it should remain, to be honest

2016-10-25T23:45:02.003243Z

ok

tony.kay 2016-10-25T23:45:05.003244Z

what error mutation?

2016-10-25T23:45:09.003245Z

tx/fallback

tony.kay 2016-10-25T23:45:20.003246Z

but that just is a hook to trigger mutations

tony.kay 2016-10-25T23:45:49.003247Z

on-success is what I just added 🙂

tony.kay 2016-10-25T23:46:06.003248Z

and it needs to trigger on the original mutation symbol

2016-10-25T23:46:17.003249Z

nods

2016-10-25T23:46:44.003250Z

alright well looks like you chose the best available option then

tony.kay 2016-10-25T23:47:04.003251Z

For now. It is almost certainly possible to make our desired thing work

tony.kay 2016-10-25T23:47:18.003252Z

and it will be an easy port from the current implementation

tony.kay 2016-10-25T23:47:42.003253Z

so, let's call this v1 of return value handling and move on

2016-10-25T23:47:48.003254Z

nods

adambros 2016-10-25T23:47:50.003255Z

jokingly just write a defmutation macro that looks like what you want but outputs 2 defmethods

2016-10-25T23:47:56.003256Z

haha

tony.kay 2016-10-25T23:48:09.003257Z

Actually, I kind of like that best so far

2016-10-25T23:49:32.003258Z

yah i mean i'll probably just do that for the team here if that's the api lol

2016-10-25T23:49:36.003259Z

i do want the logic co-located

tony.kay 2016-10-25T23:50:05.003260Z

but how often will you acutally need it? I've written a lot of Om code so far without needing it at all

tony.kay 2016-10-25T23:50:21.003261Z

I can see the basic need, but it seems like something you rarely should use

2016-10-25T23:50:23.003262Z

not often, but the other guys keep asking about it

tony.kay 2016-10-25T23:50:35.003263Z

yeah, but part of that is a desire to do things "the old way"

tony.kay 2016-10-25T23:50:41.003264Z

and should be discouraged 🙂

2016-10-25T23:50:45.003265Z

for sure, i've had the conversation a number of times now

2016-10-25T23:50:50.003266Z

yah definitely

tony.kay 2016-10-25T23:51:23.003267Z

optimistic updates -> tx and fallbacks on the (very rare) failures is soooo much better for the end user

tony.kay 2016-10-25T23:51:31.003268Z

and the developer

2016-10-25T23:51:31.003269Z

it's not just with developers though, it's also with UI people

2016-10-25T23:51:36.003270Z

(the conversation) 😞

tony.kay 2016-10-25T23:51:41.003271Z

The UI ppl should not even be aware of a remote

2016-10-25T23:51:54.003272Z

their little spinners and stuff

tony.kay 2016-10-25T23:51:56.003273Z

except for lazy loading

tony.kay 2016-10-25T23:52:07.003274Z

yeah, but that is loading, not mutation

2016-10-25T23:52:31.003275Z

well action buttons with spinners

2016-10-25T23:52:49.003276Z

"applying action... " "action applied.." sort of UI feedback

2016-10-25T23:52:53.003277Z

anyways i'm on the same page as you