@@ -13,8 +13,8 @@ import { BrowserData, BrowserDataAdt, getBrowserData, shareUrl } from "../model/
1313import { ElmishResult , Init , Subscribe , Update , cmd } from "@fun-ts/elmish" ;
1414import { ErrorIcon , LoaderIcon } from "./icons" ;
1515import { UrlDataOrigin , UrlDataOriginAdt , compressToUrlParam , getParametersFromUrl , getStableStringFromParameters , makeCurrentUrl } from "../model/url-data" ;
16- import { VCardDataAdt , getVCardUrl , vCardFieldsFromAppData , vCardFieldsFromAppDataLoaded } from "../model/v-card-url" ;
17- import { constant , identity , pipe } from "fp-ts/function" ;
16+ import { VCardDataAdt , getVCardString , getVCardUrl , vCardFieldsFromAppData , vCardFieldsFromAppDataLoaded , vCardStringAsUrl } from "../model/v-card-url" ;
17+ import { constant , flow , identity , pipe } from "fp-ts/function" ;
1818import { getWindowTitleFromAppData , setWindowTitle } from "../model/window-title" ;
1919
2020import { Card } from "./card" ;
@@ -193,8 +193,12 @@ export const update: Update<Model, Msg> = (model, msg) => pipe(
193193 pipe (
194194 data ,
195195 vCardFieldsFromAppData ,
196- d => getVCardUrl ( { ...d , avatarBase64 : O . none } ) ,
197- url => VCardDataAdt . as . Loaded ( { url } ) ,
196+ d => getVCardString ( { ...d , avatarBase64 : O . none } ) ,
197+ vCardString => VCardDataAdt . as . Loaded ( {
198+ url : vCardStringAsUrl ( vCardString ) ,
199+ vCard : vCardString ,
200+ vCardNoImage : vCardString ,
201+ } ) ,
198202 ) ,
199203 } ,
200204 pipe (
@@ -317,12 +321,20 @@ export const update: Update<Model, Msg> = (model, msg) => pipe(
317321 vCardFieldsFromAppDataLoaded ,
318322 O . fold (
319323 ( ) => VCardDataAdt . of . NotLoaded ( { } ) ,
320- data => VCardDataAdt . of . Loaded ( {
321- url : getVCardUrl ( {
324+ flow (
325+ data => ( {
322326 ...data ,
323327 avatarBase64 : O . some ( imageData . base64 )
328+ } ) ,
329+ dataWithImg => VCardDataAdt . of . Loaded ( {
330+ url : getVCardUrl ( dataWithImg ) ,
331+ vCard : getVCardString ( dataWithImg ) ,
332+ vCardNoImage : getVCardString ( {
333+ ...dataWithImg ,
334+ avatarBase64 : O . none
335+ } )
324336 } )
325- } )
337+ )
326338 ) ,
327339 ) ,
328340 } ,
@@ -339,13 +351,17 @@ export const update: Update<Model, Msg> = (model, msg) => pipe(
339351 vCardFieldsFromAppDataLoaded ,
340352 O . fold (
341353 ( ) => VCardDataAdt . of . NotLoaded ( { } ) ,
342- data => VCardDataAdt . of . Loaded ( {
343- url : getVCardUrl ( {
354+ flow (
355+ data => ( {
344356 ...data ,
345- avatarBase64 : O . none
357+ avatarBase64 : O . none ,
358+ } ) ,
359+ dataWithoutImg => VCardDataAdt . of . Loaded ( {
360+ url : getVCardUrl ( dataWithoutImg ) ,
361+ vCard : getVCardString ( dataWithoutImg ) ,
362+ vCardNoImage : getVCardString ( dataWithoutImg ) ,
346363 } )
347- } )
348- ) ,
364+ ) ) ,
349365 ) ,
350366 } ,
351367 cmd . none
@@ -418,6 +434,7 @@ export const view: PreactView<Model, Msg> = (dispatch, model) => (
418434 < QrCodeView
419435 appData = { model . appData }
420436 browserData = { model . browserData }
437+ vCardData = { model . vCardData }
421438 />
422439 </ Page >
423440 < Page route = { Routes . of . Share } >
@@ -506,11 +523,14 @@ const CardView: FunctionComponent<CardViewProps> = ({
506523type QrCodeViewProps = {
507524 appData : ADTType < typeof AppDataAdt > ;
508525 browserData : ADTType < typeof BrowserDataAdt > ;
526+ vCardData : ADTType < typeof VCardDataAdt > ;
509527} ;
510528
529+ // TODO: replace nested matchers with sequencing
511530const QrCodeView : FunctionComponent < QrCodeViewProps > = ( {
512531 appData,
513532 browserData,
533+ vCardData
514534} ) => pipe (
515535 browserData ,
516536 BrowserDataAdt . matchStrict ( {
@@ -530,14 +550,23 @@ const QrCodeView: FunctionComponent<QrCodeViewProps> = ({
530550 Failure : ( ) => < >
531551 < ErrorIcon /> An error occurred while loading application data.
532552 </ > ,
533- Loaded : ( appDataLoaded ) => (
534- < QrCodeCard
535- href = { pipe (
536- appDataLoaded ,
537- appDataToUrlParams ,
538- makeCurrentUrl ( location )
539- ) }
540- />
553+ Loaded : ( appDataLoaded ) => pipe (
554+ vCardData ,
555+ VCardDataAdt . matchStrict ( {
556+ NotLoaded : ( ) => < > </ > ,
557+ Loading : ( ) => < LoaderIcon /> ,
558+ Failure : ( ) => < >
559+ < ErrorIcon /> An error occurred while creating vcard data.
560+ </ > ,
561+ Loaded : ( vCardDataLoaded ) => < QrCodeCard
562+ href = { pipe (
563+ appDataLoaded ,
564+ appDataToUrlParams ,
565+ makeCurrentUrl ( location )
566+ ) }
567+ vcard = { vCardDataLoaded . vCardNoImage }
568+ />
569+ } )
541570 )
542571 } )
543572 ) ,
0 commit comments