Skip to content

Commit 112f8a2

Browse files
committed
delivery calculator wip
1 parent e1fcefc commit 112f8a2

File tree

10 files changed

+116
-861
lines changed

10 files changed

+116
-861
lines changed

ghcjs/delivery-calculator/delivery-calculator.cabal

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ common pkg
2727
other-modules:
2828
App.Misc
2929
App.Types
30-
App.Widgets.Bolt11
31-
App.Widgets.Decrypt
3230
App.Widgets.Fav
3331
App.Widgets.Main
3432
App.Widgets.Menu

ghcjs/delivery-calculator/src/App/Types.hs

Lines changed: 80 additions & 156 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ module App.Types
55
( Model (..),
66
Action (..),
77
St (..),
8-
StDoc (..),
9-
newStDoc,
8+
newSt,
109
Screen (..),
1110
isQrCode,
1211
unQrCode,
@@ -17,6 +16,8 @@ module App.Types
1716
vsn,
1817
usd,
1918
btc,
19+
cny,
20+
rub,
2021
googlePlayLink,
2122
testGroupLink,
2223
functoraLink,
@@ -30,10 +31,9 @@ import qualified Data.ByteString.Base64.URL as B64URL
3031
import qualified Data.ByteString.Lazy as BL
3132
import Data.Functor.Barbie
3233
import qualified Data.Version as Version
33-
import qualified Functora.Aes as Aes
3434
import Functora.Cfg
3535
import Functora.Miso.Prelude
36-
import Functora.Miso.Types as X
36+
import Functora.Miso.Types as X hiding (Asset (..))
3737
import Functora.Money hiding (Currency, Money, Text)
3838
import qualified Functora.Prelude as Prelude
3939
import qualified Paths_delivery_calculator as Paths
@@ -46,27 +46,29 @@ data Model = Model
4646
modelLoading :: Bool,
4747
modelState :: St Unique,
4848
modelFavMap :: Map Unicode Fav,
49-
modelFavName :: Field Unicode Unique,
5049
modelUriViewer :: [FieldPair DynamicField Unique],
50+
modelDonateViewer :: [FieldPair DynamicField Unique],
5151
modelProducerQueue :: TChan (InstantOrDelayed (Model -> JSM Model)),
5252
modelConsumerQueue :: TChan (InstantOrDelayed (Model -> JSM Model))
5353
}
5454
deriving stock (Eq, Generic)
5555

5656
data Action
5757
= Noop
58-
| InitUpdate (Maybe Aes.Crypto)
58+
| InitUpdate (Maybe (St Unique))
5959
| SyncInputs
6060
| ChanUpdate Model
6161
| PushUpdate (InstantOrDelayed (Model -> JSM Model))
6262

6363
data St f = St
64-
{ stKm :: Aes.Km,
65-
stIkm :: Field Unicode f,
66-
stDoc :: StDoc f,
67-
stPre :: Field DynamicField f,
68-
stScreen :: Screen,
69-
stCpt :: Maybe Aes.Crypto
64+
{ stAssets :: [Asset f],
65+
stPayments :: [Money f],
66+
stFeePercent :: Field Rational f,
67+
stDefAssetCurrency :: Currency f,
68+
stDefPaymentCurrency :: Currency f,
69+
stFavName :: Field Unicode f,
70+
stPreview :: Field Unicode f,
71+
stScreen :: Screen
7072
}
7173
deriving stock (Generic)
7274

@@ -84,48 +86,50 @@ instance TraversableB St
8486

8587
deriving via GenericType (St Identity) instance Binary (St Identity)
8688

87-
data StDoc f = StDoc
88-
{ stDocFieldPairs :: [FieldPair DynamicField f],
89-
stDocSuccessViewer :: [FieldPair DynamicField f],
90-
stDocFailureViewer :: [FieldPair DynamicField f],
91-
stDocLnPreimage :: Field Unicode f,
92-
stDocLnPreimageViewer :: [FieldPair DynamicField f],
93-
stDocLnInvoice :: Field Unicode f,
94-
stDocLnInvoiceViewer :: [FieldPair DynamicField f]
89+
newSt :: (MonadIO m) => m (St Unique)
90+
newSt = do
91+
fee <- newRatioField 2
92+
assetCur <- newCurrency cny
93+
paymentCur <- newCurrency rub
94+
fav <- newTextField mempty
95+
pre <- newTextField mempty
96+
pure
97+
St
98+
{ stAssets = mempty,
99+
stPayments = mempty,
100+
stFeePercent = fee,
101+
stDefAssetCurrency = assetCur,
102+
stDefPaymentCurrency = paymentCur,
103+
stFavName = fav,
104+
stPreview = pre,
105+
stScreen = Main
106+
}
107+
108+
data Asset f = Asset
109+
{ assetLink :: Field URI f,
110+
assetPhoto :: Field URI f,
111+
assetPrice :: Money f,
112+
assetQty :: Field Natural f
95113
}
96114
deriving stock (Generic)
97115

98-
deriving stock instance (Hkt f) => Eq (StDoc f)
116+
deriving stock instance (Hkt f) => Eq (Asset f)
99117

100-
deriving stock instance (Hkt f) => Ord (StDoc f)
118+
deriving stock instance (Hkt f) => Ord (Asset f)
101119

102-
deriving stock instance (Hkt f) => Show (StDoc f)
120+
deriving stock instance (Hkt f) => Show (Asset f)
103121

104-
deriving stock instance (Hkt f) => Data (StDoc f)
122+
deriving stock instance (Hkt f) => Data (Asset f)
105123

106-
instance FunctorB StDoc
124+
instance FunctorB Asset
107125

108-
instance TraversableB StDoc
126+
instance TraversableB Asset
109127

110-
deriving via GenericType (StDoc Identity) instance Binary (StDoc Identity)
111-
112-
newStDoc :: (MonadIO m) => m (StDoc Unique)
113-
newStDoc = do
114-
r <- newTextField mempty
115-
ln <- newTextField mempty
116-
pure
117-
StDoc
118-
{ stDocFieldPairs = mempty,
119-
stDocSuccessViewer = mempty,
120-
stDocFailureViewer = mempty,
121-
stDocLnPreimage = r,
122-
stDocLnPreimageViewer = mempty,
123-
stDocLnInvoice = ln,
124-
stDocLnInvoiceViewer = mempty
125-
}
128+
deriving via GenericType (Asset Identity) instance Binary (Asset Identity)
126129

127130
data Screen
128-
= Converter
131+
= Main
132+
| Donate
129133
| QrCode Screen
130134
deriving stock (Eq, Ord, Show, Data, Generic)
131135
deriving (Binary) via GenericType Screen
@@ -140,91 +144,6 @@ unQrCode = \case
140144
QrCode sc -> unQrCode sc
141145
sc -> sc
142146

143-
unShareUri ::
144-
( MonadThrow m,
145-
MonadIO m
146-
) =>
147-
URI ->
148-
m (Maybe (St Unique))
149-
unShareUri uri = do
150-
kKm <- URI.mkQueryKey "k"
151-
kDoc <- URI.mkQueryKey "d"
152-
kSc <- URI.mkQueryKey "s"
153-
kPre <- URI.mkQueryKey "p"
154-
let qs = URI.uriQuery uri
155-
case (,,,)
156-
<$> qsGet kDoc qs
157-
<*> qsGet kKm qs
158-
<*> qsGet kSc qs
159-
<*> qsGet kPre qs of
160-
Nothing -> pure Nothing
161-
Just (vCpt, vKm, vSc, vPre) -> do
162-
bKm <- either throwString pure . B64URL.decode $ encodeUtf8 vKm
163-
bCpt <- either throwString pure . B64URL.decode $ encodeUtf8 vCpt
164-
bSc <- either throwString pure . B64URL.decode $ encodeUtf8 vSc
165-
bPre <- either throwString pure . B64URL.decode $ encodeUtf8 vPre
166-
km <- either (throwString . thd3) pure $ decodeBinary bKm
167-
ikm <- newPasswordField mempty
168-
cpt <- either (throwString . thd3) pure $ decodeBinary bCpt
169-
sc <- either (throwString . thd3) pure $ decodeBinary bSc
170-
iPre <- either (throwString . thd3) pure $ decodeBinary bPre
171-
pre <- identityToUnique iPre
172-
doc <- newStDoc
173-
pure
174-
$ Just
175-
St
176-
{ stKm = km,
177-
stIkm = ikm,
178-
stDoc = doc,
179-
stPre = pre,
180-
stScreen = sc,
181-
stCpt = Just cpt
182-
}
183-
184-
stQuery :: (MonadThrow m) => St Identity -> m [URI.QueryParam]
185-
stQuery st = do
186-
kDoc <- URI.mkQueryKey "d"
187-
vDoc <-
188-
(URI.mkQueryValue <=< encodeText)
189-
. encodeBinary
190-
$ fromMaybe
191-
(Aes.encryptHmac aes . encodeBinary . compressViewers $ st ^. #stDoc)
192-
(st ^. #stCpt)
193-
kKm <- URI.mkQueryKey "k"
194-
vKm <-
195-
(URI.mkQueryValue <=< encodeText)
196-
. encodeBinary
197-
. fromEither
198-
$ fmap (& #kmIkm .~ Ikm mempty) ekm
199-
kSc <- URI.mkQueryKey "s"
200-
vSc <-
201-
(URI.mkQueryValue <=< encodeText)
202-
$ encodeBinary (st ^. #stScreen)
203-
kPre <- URI.mkQueryKey "p"
204-
vPre <-
205-
(URI.mkQueryValue <=< encodeText)
206-
$ encodeBinary (st ^. #stPre)
207-
pure
208-
[ URI.QueryParam kDoc vDoc,
209-
URI.QueryParam kKm vKm,
210-
URI.QueryParam kSc vSc,
211-
URI.QueryParam kPre vPre
212-
]
213-
where
214-
aes :: Aes.SomeAesKey
215-
aes = Aes.drvSomeAesKey @Aes.Word256 $ fromEither ekm
216-
ekm :: Either Aes.Km Aes.Km
217-
ekm =
218-
case st ^. #stIkm . #fieldOutput of
219-
ikm | ikm == mempty -> Left (st ^. #stKm)
220-
ikm -> Right $ (st ^. #stKm) & #kmIkm .~ Ikm (encodeUtf8 ikm)
221-
encodeText :: (MonadThrow m) => BL.ByteString -> m Text
222-
encodeText =
223-
either throw pure
224-
. decodeUtf8Strict
225-
. B64URL.encode
226-
. from @BL.ByteString @ByteString
227-
228147
stUri :: (MonadThrow m) => Model -> m URI
229148
stUri st = do
230149
uri <- mkURI $ from @Unicode @Prelude.Text baseUri
@@ -234,35 +153,34 @@ stUri st = do
234153
{ URI.uriQuery = qxs
235154
}
236155

237-
compressViewers :: StDoc Identity -> StDoc Identity
238-
compressViewers st =
239-
st
240-
& #stDocSuccessViewer
241-
%~ fmap compress
242-
& #stDocFailureViewer
243-
%~ fmap compress
244-
& #stDocLnPreimageViewer
245-
%~ fmap compress
246-
& #stDocLnInvoiceViewer
247-
%~ fmap compress
156+
stQuery :: (MonadThrow m) => St Identity -> m [URI.QueryParam]
157+
stQuery st = do
158+
kSt <- URI.mkQueryKey "d"
159+
vSt <- URI.mkQueryValue <=< encode $ encodeBinary st
160+
pure [URI.QueryParam kSt vSt]
248161
where
249-
compress ::
250-
FieldPair DynamicField Identity ->
251-
FieldPair DynamicField Identity
252-
compress pair =
253-
pair
254-
& #fieldPairKey
255-
. #fieldInput
256-
.~ Identity (mempty :: Unicode)
257-
& #fieldPairKey
258-
. #fieldOutput
259-
.~ (mempty :: Unicode)
260-
& #fieldPairValue
261-
. #fieldInput
262-
.~ Identity (mempty :: Unicode)
263-
& #fieldPairValue
264-
. #fieldOutput
265-
.~ DynamicFieldText mempty
162+
encode :: (MonadThrow m) => BL.ByteString -> m Text
163+
encode =
164+
either throw pure
165+
. decodeUtf8Strict
166+
. B64URL.encode
167+
. from @BL.ByteString @ByteString
168+
169+
unShareUri ::
170+
( MonadIO m,
171+
MonadThrow m
172+
) =>
173+
URI ->
174+
m (Maybe (St Unique))
175+
unShareUri uri = do
176+
kSt <- URI.mkQueryKey "d"
177+
case qsGet kSt $ URI.uriQuery uri of
178+
Nothing -> pure Nothing
179+
Just tSt -> do
180+
bSt <- either throwString pure . B64URL.decode $ encodeUtf8 tSt
181+
iSt <- either (throwString . thd3) pure $ decodeBinary bSt
182+
uSt <- identityToUnique iSt
183+
pure $ Just uSt
266184

267185
baseUri :: Unicode
268186
#ifdef GHCID
@@ -295,6 +213,12 @@ usd = CurrencyInfo (CurrencyCode "usd") mempty
295213
btc :: CurrencyInfo
296214
btc = CurrencyInfo (CurrencyCode "btc") mempty
297215

216+
cny :: CurrencyInfo
217+
cny = CurrencyInfo (CurrencyCode "cny") mempty
218+
219+
rub :: CurrencyInfo
220+
rub = CurrencyInfo (CurrencyCode "rub") mempty
221+
298222
googlePlayLink :: URI
299223
googlePlayLink =
300224
either impureThrow id

0 commit comments

Comments
 (0)