* 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 8f4b517b8585ca64a4bf44f6cb40ac070ece8932. * 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>
126 lines
2.9 KiB
TypeScript
126 lines
2.9 KiB
TypeScript
import React from 'react'
|
|
import {View, AccessibilityProps, TextStyle, ViewStyle} from 'react-native'
|
|
|
|
import {atoms as a, useTheme, native} from '#/alf'
|
|
import {Text} from '#/components/Typography'
|
|
|
|
import * as Toggle from '#/components/forms/Toggle'
|
|
|
|
export type ItemProps = Omit<Toggle.ItemProps, 'style' | 'role' | 'children'> &
|
|
AccessibilityProps &
|
|
React.PropsWithChildren<{}>
|
|
|
|
export type GroupProps = Omit<Toggle.GroupProps, 'style' | 'type'> & {
|
|
multiple?: boolean
|
|
}
|
|
|
|
export function Group({children, multiple, ...props}: GroupProps) {
|
|
const t = useTheme()
|
|
return (
|
|
<Toggle.Group type={multiple ? 'checkbox' : 'radio'} {...props}>
|
|
<View
|
|
style={[
|
|
a.w_full,
|
|
a.flex_row,
|
|
a.border,
|
|
a.rounded_sm,
|
|
a.overflow_hidden,
|
|
t.atoms.border,
|
|
]}>
|
|
{children}
|
|
</View>
|
|
</Toggle.Group>
|
|
)
|
|
}
|
|
|
|
export function Button({children, ...props}: ItemProps) {
|
|
return (
|
|
<Toggle.Item {...props} style={[a.flex_grow]}>
|
|
<ButtonInner>{children}</ButtonInner>
|
|
</Toggle.Item>
|
|
)
|
|
}
|
|
|
|
function ButtonInner({children}: React.PropsWithChildren<{}>) {
|
|
const t = useTheme()
|
|
const state = Toggle.useItemContext()
|
|
|
|
const {baseStyles, hoverStyles, activeStyles, textStyles} =
|
|
React.useMemo(() => {
|
|
const base: ViewStyle[] = []
|
|
const hover: ViewStyle[] = []
|
|
const active: ViewStyle[] = []
|
|
const text: TextStyle[] = []
|
|
|
|
hover.push(
|
|
t.name === 'light' ? t.atoms.bg_contrast_100 : t.atoms.bg_contrast_25,
|
|
)
|
|
|
|
if (state.selected) {
|
|
active.push({
|
|
backgroundColor: t.palette.contrast_800,
|
|
})
|
|
text.push(t.atoms.text_inverted)
|
|
hover.push({
|
|
backgroundColor: t.palette.contrast_800,
|
|
})
|
|
|
|
if (state.disabled) {
|
|
active.push({
|
|
backgroundColor: t.palette.contrast_500,
|
|
})
|
|
}
|
|
}
|
|
|
|
if (state.disabled) {
|
|
base.push({
|
|
backgroundColor: t.palette.contrast_100,
|
|
})
|
|
text.push({
|
|
opacity: 0.5,
|
|
})
|
|
}
|
|
|
|
return {
|
|
baseStyles: base,
|
|
hoverStyles: hover,
|
|
activeStyles: active,
|
|
textStyles: text,
|
|
}
|
|
}, [t, state])
|
|
|
|
return (
|
|
<View
|
|
style={[
|
|
{
|
|
borderLeftWidth: 1,
|
|
marginLeft: -1,
|
|
},
|
|
a.flex_grow,
|
|
a.py_md,
|
|
native({
|
|
paddingBottom: 10,
|
|
}),
|
|
a.px_sm,
|
|
t.atoms.bg,
|
|
t.atoms.border,
|
|
baseStyles,
|
|
activeStyles,
|
|
(state.hovered || state.focused || state.pressed) && hoverStyles,
|
|
]}>
|
|
{typeof children === 'string' ? (
|
|
<Text
|
|
style={[
|
|
a.text_center,
|
|
a.font_bold,
|
|
t.atoms.text_contrast_500,
|
|
textStyles,
|
|
]}>
|
|
{children}
|
|
</Text>
|
|
) : (
|
|
children
|
|
)}
|
|
</View>
|
|
)
|
|
}
|