3371038f7d
* Add round and square buttons
* Allow some style for buttons, add icons
* Change text selection color
* Center button text, whoops
* Outer layout, some primitive updates
* WIP
* onboarding feed prefs (#2590)
* add `style` to toggle label to modify text style
* Revert "add `style` to toggle label to modify text style"
This reverts commit 8f4b517b85.
* following feed prefs
* remove unnecessary memo
* reusable divider component
* org imports
* add finished screen
* Theme SelectedAccountCard
* Require at least 3 interests
* Placeholder save logic
* WIP algo feeds
* Improve lineHeight handling, add RichText, improve Link by adding InlineLink
* Inherit lineHeight in heading comps
* Algo feeds mostly good
* Topical feeds ish
* Layout cleanup
* Improve button styles
* moderation prefs for onboarding (#2594)
* WIP algo feeds
* modify controlalbelgroup typing for easy .map()
* adjust padding on button
* add moderation screen
* add moderation screen
* add moderation screen
---------
Co-authored-by: Eric Bailey <git@esb.lol>
* Fix toggle button styles
* A11y props on outer portal
* Put it all on red
* New data shape
* Handle mock data
* Bulk write (not yet)
* Remove interests validation
* Clean up interests
* i18n layout and first step
* Clean up suggested follows screen
* Clean up following step
* Clean up algo feeds step
* Clean up topical feeds
* Add skeleton for feed card
* WIP moderation step
* cleanup moderation styles (#2605)
* cleanup moderation styles
* fix(?) toggle button group styles
* adjust toggle to fit any screen
* Some more cleanup
* Icons
* ToggleButton tweaks
* Reset
* Hook up data
* Better suggestions
* Bulk write
* Some logging
* Use new api
* Concat topical feeds
* Metrics
* Disable links in RichText, feedcards
* Tweak primary feed cards
* Update metrics
* Fix layout shift
* Fix ToggleButton again, whoops
* Error state
* Bump api package, ensure interests are saved
* Better fix for autofill
* i18n, button positions
* Remove unused export
* Add default prefs object
* Fix overflow in user cards
* Add 2 lines of bios to suggested accounts cards
* Nits
* Don't resolve facets by default
* Update storybook
* Disable flag for now
* Remove age dialog from moderations step
* Improvements and tweaks to new onboarding
---------
Co-authored-by: Hailey <153161762+haileyok@users.noreply.github.com>
Co-authored-by: Paul Frazee <pfrazee@gmail.com>
66 lines
1.7 KiB
TypeScript
66 lines
1.7 KiB
TypeScript
import React from 'react'
|
|
|
|
type Component = React.ReactElement
|
|
|
|
type ContextType = {
|
|
outlet: Component | null
|
|
append(id: string, component: Component): void
|
|
remove(id: string): void
|
|
}
|
|
|
|
type ComponentMap = {
|
|
[id: string]: Component
|
|
}
|
|
|
|
export function createPortalGroup() {
|
|
const Context = React.createContext<ContextType>({
|
|
outlet: null,
|
|
append: () => {},
|
|
remove: () => {},
|
|
})
|
|
|
|
function Provider(props: React.PropsWithChildren<{}>) {
|
|
const map = React.useRef<ComponentMap>({})
|
|
const [outlet, setOutlet] = React.useState<ContextType['outlet']>(null)
|
|
|
|
const append = React.useCallback<ContextType['append']>((id, component) => {
|
|
if (map.current[id]) return
|
|
map.current[id] = <React.Fragment key={id}>{component}</React.Fragment>
|
|
setOutlet(<>{Object.values(map.current)}</>)
|
|
}, [])
|
|
|
|
const remove = React.useCallback<ContextType['remove']>(id => {
|
|
delete map.current[id]
|
|
setOutlet(<>{Object.values(map.current)}</>)
|
|
}, [])
|
|
|
|
return (
|
|
<Context.Provider value={{outlet, append, remove}}>
|
|
{props.children}
|
|
</Context.Provider>
|
|
)
|
|
}
|
|
|
|
function Outlet() {
|
|
const ctx = React.useContext(Context)
|
|
return ctx.outlet
|
|
}
|
|
|
|
function Portal({children}: React.PropsWithChildren<{}>) {
|
|
const {append, remove} = React.useContext(Context)
|
|
const id = React.useId()
|
|
React.useEffect(() => {
|
|
append(id, children as Component)
|
|
return () => remove(id)
|
|
}, [id, children, append, remove])
|
|
return null
|
|
}
|
|
|
|
return {Provider, Outlet, Portal}
|
|
}
|
|
|
|
const DefaultPortal = createPortalGroup()
|
|
export const Provider = DefaultPortal.Provider
|
|
export const Outlet = DefaultPortal.Outlet
|
|
export const Portal = DefaultPortal.Portal
|