@@ -5,8 +5,7 @@ module App.Types
5
5
( Model (.. ),
6
6
Action (.. ),
7
7
St (.. ),
8
- StDoc (.. ),
9
- newStDoc ,
8
+ newSt ,
10
9
Screen (.. ),
11
10
isQrCode ,
12
11
unQrCode ,
@@ -17,6 +16,8 @@ module App.Types
17
16
vsn ,
18
17
usd ,
19
18
btc ,
19
+ cny ,
20
+ rub ,
20
21
googlePlayLink ,
21
22
testGroupLink ,
22
23
functoraLink ,
@@ -30,10 +31,9 @@ import qualified Data.ByteString.Base64.URL as B64URL
30
31
import qualified Data.ByteString.Lazy as BL
31
32
import Data.Functor.Barbie
32
33
import qualified Data.Version as Version
33
- import qualified Functora.Aes as Aes
34
34
import Functora.Cfg
35
35
import Functora.Miso.Prelude
36
- import Functora.Miso.Types as X
36
+ import Functora.Miso.Types as X hiding ( Asset ( .. ))
37
37
import Functora.Money hiding (Currency , Money , Text )
38
38
import qualified Functora.Prelude as Prelude
39
39
import qualified Paths_delivery_calculator as Paths
@@ -46,27 +46,29 @@ data Model = Model
46
46
modelLoading :: Bool ,
47
47
modelState :: St Unique ,
48
48
modelFavMap :: Map Unicode Fav ,
49
- modelFavName :: Field Unicode Unique ,
50
49
modelUriViewer :: [FieldPair DynamicField Unique ],
50
+ modelDonateViewer :: [FieldPair DynamicField Unique ],
51
51
modelProducerQueue :: TChan (InstantOrDelayed (Model -> JSM Model )),
52
52
modelConsumerQueue :: TChan (InstantOrDelayed (Model -> JSM Model ))
53
53
}
54
54
deriving stock (Eq , Generic )
55
55
56
56
data Action
57
57
= Noop
58
- | InitUpdate (Maybe Aes. Crypto )
58
+ | InitUpdate (Maybe ( St Unique ) )
59
59
| SyncInputs
60
60
| ChanUpdate Model
61
61
| PushUpdate (InstantOrDelayed (Model -> JSM Model ))
62
62
63
63
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
70
72
}
71
73
deriving stock (Generic )
72
74
@@ -84,48 +86,50 @@ instance TraversableB St
84
86
85
87
deriving via GenericType (St Identity ) instance Binary (St Identity )
86
88
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
95
113
}
96
114
deriving stock (Generic )
97
115
98
- deriving stock instance (Hkt f ) => Eq (StDoc f )
116
+ deriving stock instance (Hkt f ) => Eq (Asset f )
99
117
100
- deriving stock instance (Hkt f ) => Ord (StDoc f )
118
+ deriving stock instance (Hkt f ) => Ord (Asset f )
101
119
102
- deriving stock instance (Hkt f ) => Show (StDoc f )
120
+ deriving stock instance (Hkt f ) => Show (Asset f )
103
121
104
- deriving stock instance (Hkt f ) => Data (StDoc f )
122
+ deriving stock instance (Hkt f ) => Data (Asset f )
105
123
106
- instance FunctorB StDoc
124
+ instance FunctorB Asset
107
125
108
- instance TraversableB StDoc
126
+ instance TraversableB Asset
109
127
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 )
126
129
127
130
data Screen
128
- = Converter
131
+ = Main
132
+ | Donate
129
133
| QrCode Screen
130
134
deriving stock (Eq , Ord , Show , Data , Generic )
131
135
deriving (Binary ) via GenericType Screen
@@ -140,91 +144,6 @@ unQrCode = \case
140
144
QrCode sc -> unQrCode sc
141
145
sc -> sc
142
146
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
-
228
147
stUri :: (MonadThrow m ) => Model -> m URI
229
148
stUri st = do
230
149
uri <- mkURI $ from @ Unicode @ Prelude. Text baseUri
@@ -234,35 +153,34 @@ stUri st = do
234
153
{ URI. uriQuery = qxs
235
154
}
236
155
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]
248
161
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
266
184
267
185
baseUri :: Unicode
268
186
#ifdef GHCID
@@ -295,6 +213,12 @@ usd = CurrencyInfo (CurrencyCode "usd") mempty
295
213
btc :: CurrencyInfo
296
214
btc = CurrencyInfo (CurrencyCode " btc" ) mempty
297
215
216
+ cny :: CurrencyInfo
217
+ cny = CurrencyInfo (CurrencyCode " cny" ) mempty
218
+
219
+ rub :: CurrencyInfo
220
+ rub = CurrencyInfo (CurrencyCode " rub" ) mempty
221
+
298
222
googlePlayLink :: URI
299
223
googlePlayLink =
300
224
either impureThrow id
0 commit comments