@@ -350,11 +350,11 @@ let createComponentAST (log: Core.Logger) (parameters: ComponentParameters) =
350
350
|||> List.zip3
351
351
|> List.map ( fun ( psafe , pname , prop ) ->
352
352
let pConvert =
353
- match prop.propType with
353
+ match prop.propType |> Option.map SafeReactPropType.unwrapObjectOf with
354
354
| Some ( Array _)
355
355
| Some ( Bool _)
356
356
| Some ( Number _)
357
- | Some ( String _) ->
357
+ | Some ( String _) ->
358
358
SynExpr.CreateIdentString " p"
359
359
360
360
| Some ( Object _)
@@ -422,10 +422,43 @@ let createComponentAST (log: Core.Logger) (parameters: ComponentParameters) =
422
422
let propTypeName =
423
423
SafeReactPropType.tryGetFSharpTypeName ptype
424
424
|> Option.defaultValue ([ ptname])
425
- functionPattern pname [( " p" , appType propTypeName)]
426
- |> binding ( application [ SynExpr.CreateIdentString " Prop" ; application [ SynExpr.CreateIdentString psafe; SynExpr.CreateIdentString " p" ] |> SynExpr.CreateParen])
427
- |> withXMLDocLet ( prop |> generateComponentPropDescription |> toXMLDoc)
428
- |> SynMemberDefn.CreateStaticMember))
425
+
426
+ match ptype |> SafeReactPropType.unwrapObjectOf with
427
+ | Union (_, Some utypes)
428
+ | FlowUnion (_, Some utypes) ->
429
+ utypes
430
+ |> List.indexed
431
+ |> List.map ( fun ( i , case ) ->
432
+ let caseTypeName =
433
+ case
434
+ |> SafeReactPropType.tryGetFSharpTypeName
435
+ |> Option.defaultValue ([ sprintf " %s Case%d Type" ptname i])
436
+
437
+ let caseName =
438
+ caseTypeName
439
+ |> List.rev
440
+ |> List.map String.toPascalCase
441
+ |> List.reduce ( sprintf " %s%s " )
442
+
443
+ functionPattern pname [( " p" , appType caseTypeName)]
444
+ |> binding
445
+ ( application
446
+ [ SynExpr.CreateIdentString " Prop"
447
+ application
448
+ [ SynExpr.CreateIdentString psafe
449
+ application
450
+ [ SynExpr.CreateLongIdent ( LongIdentWithDots.Create [ ptname; caseName ])
451
+ SynExpr.CreateIdentString " p" ] |> SynExpr.CreateParen ] |> SynExpr.CreateParen ])
452
+ |> withXMLDocLet ( prop |> generateComponentPropDescription |> toXMLDoc)
453
+ |> SynMemberDefn.CreateStaticMember)
454
+
455
+ | _ ->
456
+ functionPattern pname [( " p" , appType propTypeName)]
457
+ |> binding ( application [ SynExpr.CreateIdentString " Prop" ; application [ SynExpr.CreateIdentString psafe; SynExpr.CreateIdentString " p" ] |> SynExpr.CreateParen ])
458
+ |> withXMLDocLet ( prop |> generateComponentPropDescription |> toXMLDoc)
459
+ |> SynMemberDefn.CreateStaticMember
460
+ |> List.singleton))
461
+ |> List.concat
429
462
430
463
// static member children(value: int) = Children([ Html.Html.text value ])
431
464
// static member children(value: string) = Children([ Html.Html.text value ])
0 commit comments