Slide 1

Slide 1 text

Ray Ryan Zach Klippenstein Hello Square Workflow

Slide 2

Slide 2 text

Nav logic sprawl Tragedy of convenient presenters

Slide 3

Slide 3 text

CartScreen ChargeScreen TipScreen SignatureScreen ReceiptScreen

Slide 4

Slide 4 text

class ChargeScreen { fun onCardSwiped(card: Card) { doStuffWithCard(card) if (tippingEnabled) goTo(TipScreen) else if (signatureRequired) goTo(SignatureScreen) else if (!skipReceipts) goTo(ReceiptScreen) else popTo(CartScreen) } } class TipScreen { fun onTip(tip: Money) { doStuffWithTip(tip) if (signatureRequired) goTo(SignatureScreen) else if (!skipReceipts) goTo(ReceiptScreen) else popTo(CartScreen) } }

Slide 5

Slide 5 text

class ChargeScreen { fun onCardSwiped(card: Card) { doStuffWithCard(card) if (tippingEnabled) goTo(TipScreen) else if (signatureRequired) goTo(SignatureScreen) else if (!skipReceipts) goTo(ReceiptScreen) else popTo(CartScreen) } } class TipScreen { fun onTip(tip: Money) { doStuffWithTip(tip) if (signatureRequired) goTo(SignatureScreen) else if (!skipReceipts) goTo(ReceiptScreen) else popTo(CartScreen) } }

Slide 6

Slide 6 text

CartScreen ChargeScreen TipScreen SignatureScreen ReceiptScreen

Slide 7

Slide 7 text

class CheckoutWorkflow { } CartScreen ChargeScreen TipScreen SignatureScreen ReceiptScreen onCard / tipping onCard onTip onCard / skipSig onTip / skipSig onSig onSig / skipReceipt onReceipt

Slide 8

Slide 8 text

Those who do not know React are condemned to reinvent it poorly.

Slide 9

Slide 9 text

Workflow moving parts

Slide 10

Slide 10 text

Workflow

Slide 11

Slide 11 text

class NewGameScreen( val onStart: (String, String) -> Unit ) Rendering Workflow

Slide 12

Slide 12 text

class NewGameScreen( val onStart: (String, String) -> Unit ) class NewGameRunner( view: View ) : LayoutRunner { val player1 = view.findById() // etc. fun showRendering(r: NewGameScreen) { playButton.setOnClickHandler { r.onStart(player1.text, player2.text) } } } LayoutRunner Workflow Rendering

Slide 13

Slide 13 text

class NewGameScreen( val onStart: (String, String) -> Unit ) class NewGameRunner( view: View ) : LayoutRunner { val player1 = view.findById() // etc. fun showRendering(r: NewGameScreen) { playButton.setOnClickHandler { r.onStart(player1.text, player2.text) } } } LayoutRunner Workflow Rendering

Slide 14

Slide 14 text

Let’s code! https://github.com/square/workflow/tree/zachklipp+ray/todo-android-livecode

Slide 15

Slide 15 text

square.com