1
1
/* eslint-disable @typescript-eslint/naming-convention */
2
2
import * as React from 'react' ;
3
3
import { Icon } from '@fluentui/react' ;
4
- import { Caption1 , ComponentProps , Slot } from '@fluentui/react-components' ;
4
+ import type { IContextualMenuProps } from '@fluentui/react' ;
5
+ import { Caption1 , ComponentProps , MenuButtonProps , Slot , slot } from '@fluentui/react-components' ;
5
6
import type { FluentProviderProps } from '@fluentui/react-provider' ;
6
7
8
+ // LegacyRef Issue
9
+ // using v8 in conjunction with v9 interfaces
10
+ {
11
+ type AppContextualMenuProps = IContextualMenuProps & {
12
+ useLegacyContextMenu ?: boolean ;
13
+ isShadowRendering ?: boolean ;
14
+ isMeasured ?: boolean ;
15
+ contextMenuRef ?: React . RefObject < HTMLDivElement | null > ;
16
+ } ;
17
+
18
+ type MenuDefinition = any ;
19
+ const useGetMenuProps = ( menuDefinition ?: MenuDefinition ) => {
20
+ return { } as IContextualMenuProps ;
21
+ } ;
22
+
23
+ type ControlWithMenuProps = {
24
+ menuHidden ?: boolean ;
25
+ } ;
26
+ type AppAnchorInternalProps = { } ;
27
+
28
+ type AppMenuButtonProps = MenuButtonProps & Omit < AppAnchorInternalProps , 'type' > & ControlWithMenuProps ;
29
+
30
+ type AppMenuButtonSlot = React . FC < Partial < AppMenuButtonProps > & React . RefAttributes < HTMLButtonElement > > ;
31
+
32
+ type ContextualMenuSlotType = React . FC <
33
+ Pick < JSX . IntrinsicElements [ 'div' ] , 'children' > &
34
+ ( typeof AppContextualMenu extends React . ComponentType < infer Props > ? Props : { } )
35
+ > ;
36
+
37
+ const AppContextualMenu = React . forwardRef < HTMLDivElement , AppContextualMenuProps > ( ( props , ref ) => {
38
+ console . log ( props , ref ) ;
39
+ return < > </ > ;
40
+ } ) ;
41
+
42
+ type AppSplitButtonProps = {
43
+ menuButton : NonNullable < Slot < AppMenuButtonSlot > > ;
44
+ menu : NonNullable < Slot < ContextualMenuSlotType > > ;
45
+ } ;
46
+
47
+ const AppSplitButtonMenuButton = React . memo (
48
+ React . forwardRef < HTMLButtonElement , AppMenuButtonProps > ( ( props , ref ) => {
49
+ console . log ( props , ref ) ;
50
+ return < > </ > ;
51
+ } ) ,
52
+ ) ;
53
+
54
+ const props = { menuButton : { } , menu : { } } as AppSplitButtonProps ;
55
+
56
+ const defaultMenuProps = useGetMenuProps ( ) ;
57
+
58
+ const appContextualMenuProps : AppContextualMenuProps = {
59
+ ...defaultMenuProps ,
60
+ } ;
61
+
62
+ const menuButtonDefaultProps : AppMenuButtonProps = {
63
+ ...defaultMenuProps ,
64
+ } ;
65
+
66
+ slot . always ( props . menuButton , {
67
+ defaultProps : menuButtonDefaultProps ,
68
+ elementType : AppSplitButtonMenuButton ,
69
+ } ) ;
70
+
71
+ slot . always ( props . menu , {
72
+ defaultProps : appContextualMenuProps ,
73
+ elementType : AppContextualMenu ,
74
+ } ) ;
75
+ }
76
+
77
+ // children Issue
78
+ // using v8/3rd party React components in conjunction with v9
7
79
{
8
80
type Slots = {
9
81
root : NonNullable < Slot < 'i' > > ;
@@ -19,6 +91,7 @@ import type { FluentProviderProps } from '@fluentui/react-provider';
19
91
}
20
92
}
21
93
94
+ // children Issue - non-compatible Component interfaces
22
95
{
23
96
function Component ( props : { textType : React . ComponentType < React . PropsWithChildren < { className ?: string } > > } ) {
24
97
return < div /> ;
@@ -29,6 +102,7 @@ import type { FluentProviderProps } from '@fluentui/react-provider';
29
102
}
30
103
}
31
104
105
+ // children Issue - non-compatible v9 children type used as react implicit children
32
106
{
33
107
type Props = Pick < FluentProviderProps , 'children' > ;
34
108
function Problem ( props : Props ) {
0 commit comments