1- import React , { FC , PropsWithChildren } from 'react'
1+ import React , { FC , PropsWithChildren , useCallback } from 'react'
22import { CSSProps , styled } from '../../stitches.config'
33import { ConditionalWrapper } from '../../utils'
44import { ThemeProvider , ThemeProviderProps } from '../ThemeProvider'
55import { ToastProvider , ToastViewport } from '../Toast'
6+ import { ToasterProvider } from '../Toast/Toaster'
67import { TooltipProvider } from '../Tooltip'
78
89//---------------------------- Props ----------------------------------//
@@ -19,6 +20,10 @@ export type ToastProviderPropsWithoutChildren = Omit<
1920 React . ComponentProps < typeof ToastProvider > ,
2021 'children'
2122>
23+ export type ToasterProviderPropsWithoutChildren = Omit <
24+ React . ComponentProps < typeof ToasterProvider > ,
25+ 'children'
26+ >
2227export type ToastViewportPropsWithoutChildren = Omit <
2328 React . ComponentProps < typeof ToastViewport > ,
2429 'children'
@@ -36,7 +41,9 @@ export type ComponentsProviderProps = {
3641 /**
3742 * Toast configuration options
3843 */
39- toast ?: false | ToastProviderPropsWithoutChildren
44+ toast ?:
45+ | false
46+ | ( ToastProviderPropsWithoutChildren & ToasterProviderPropsWithoutChildren )
4047 /**
4148 * Toast viewport configuration options
4249 */
@@ -70,32 +77,59 @@ export const ComponentsProvider: FC<
7077 css,
7178 isolated = true ,
7279 children,
73- } ) => (
74- < ConditionalWrapper
75- condition = { toast }
76- wrapper = { ( wrappedChildren ) => (
77- < ToastProvider { ...toast } > { wrappedChildren } </ ToastProvider >
78- ) }
79- >
80- < ConditionalWrapper
81- condition = { tooltip }
82- wrapper = { ( wrappedChildren ) => (
83- < TooltipProvider { ...tooltip } > { wrappedChildren } </ TooltipProvider >
84- ) }
85- >
86- < ConditionalWrapper
87- condition = { theme }
88- wrapper = { ( wrappedChildren ) => (
89- < ThemeProvider { ...theme } > { wrappedChildren } </ ThemeProvider >
90- ) }
91- >
92- < >
93- < Isolate css = { css } isolated = { isolated } >
94- { children }
95- </ Isolate >
96- { viewport && < ToastViewport { ...viewport } /> }
97- </ >
80+ } ) => {
81+ const toastWrapper = useCallback (
82+ ( wrappedChildren ) => {
83+ const {
84+ label,
85+ duration,
86+ swipeDirection,
87+ swipeThreshold,
88+ ...toasterProps
89+ } = toast as ToastProviderPropsWithoutChildren &
90+ ToasterProviderPropsWithoutChildren
91+ return (
92+ < ToastProvider
93+ label = { label }
94+ duration = { duration }
95+ swipeDirection = { swipeDirection }
96+ swipeThreshold = { swipeThreshold }
97+ >
98+ < ToasterProvider duration = { duration } { ...toasterProps } >
99+ { wrappedChildren }
100+ </ ToasterProvider >
101+ </ ToastProvider >
102+ )
103+ } ,
104+ [ toast ]
105+ )
106+
107+ const tooltipWrapper = useCallback (
108+ ( wrappedChildren ) => (
109+ < TooltipProvider { ...tooltip } > { wrappedChildren } </ TooltipProvider >
110+ ) ,
111+ [ tooltip ]
112+ )
113+
114+ const themeWrapper = useCallback (
115+ ( wrappedChildren ) => (
116+ < ThemeProvider { ...theme } > { wrappedChildren } </ ThemeProvider >
117+ ) ,
118+ [ theme ]
119+ )
120+
121+ return (
122+ < ConditionalWrapper condition = { toast } wrapper = { toastWrapper } >
123+ < ConditionalWrapper condition = { tooltip } wrapper = { tooltipWrapper } >
124+ < ConditionalWrapper condition = { theme } wrapper = { themeWrapper } >
125+ < >
126+ < Isolate css = { css } isolated = { isolated } >
127+ { children }
128+ </ Isolate >
129+ { viewport && < ToastViewport { ...viewport } /> }
130+ </ >
131+ </ ConditionalWrapper >
98132 </ ConditionalWrapper >
99133 </ ConditionalWrapper >
100- </ ConditionalWrapper >
101- )
134+ )
135+ }
0 commit comments