Skip to content

Commit 87ca830

Browse files
committed
feat(toast): adds useToast hook
Adds a hook for simple creation toast notifications. Adds context into the ComponentsProvider. fix #188
1 parent c825d4c commit 87ca830

File tree

7 files changed

+633
-155
lines changed

7 files changed

+633
-155
lines changed

.storybook/components/DocsContainer.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
import React from 'react'
21
import { DocsContainer as BaseContainer } from '@storybook/addon-docs/blocks'
3-
import { useDarkMode } from 'storybook-dark-mode'
42
import { themes } from '@storybook/theming'
3+
import React from 'react'
4+
import { useDarkMode } from 'storybook-dark-mode'
5+
import { ComponentsProvider } from '../../src'
56

6-
export const DocsContainer = ({ context, ...props }) => {
7+
export const DocsContainer = ({ context, children, ...props }) => {
78
const dark = useDarkMode()
89

910
return (
@@ -25,6 +26,8 @@ export const DocsContainer = ({ context, ...props }) => {
2526
},
2627
}}
2728
{...props}
28-
/>
29+
>
30+
<ComponentsProvider>{children}</ComponentsProvider>
31+
</BaseContainer>
2932
)
3033
}

src/components/ComponentsProvider/ComponentsProvider.tsx

Lines changed: 63 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
import React, { FC, PropsWithChildren } from 'react'
1+
import React, { FC, PropsWithChildren, useCallback } from 'react'
22
import { CSSProps, styled } from '../../stitches.config'
33
import { ConditionalWrapper } from '../../utils'
44
import { ThemeProvider, ThemeProviderProps } from '../ThemeProvider'
55
import { ToastProvider, ToastViewport } from '../Toast'
6+
import { ToasterProvider } from '../Toast/Toaster'
67
import { 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+
>
2227
export 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

Comments
 (0)