61004b887b
* WIP * Sorting working * Rough handling of hidden/muted * Better muted/hidden sorting and handling * Clarify some naming * Fix parents * Handle first reply under highlighted/composer * WIP RaW * WIP optimistic * Optimistic WIP * Little cleanup, inserting dupes * Re-org * Add in new optimistic insert logic * Update types * Sorta working linear view optimistic state * Simple working version, no pref for OP * Working optimistic reply insertions, preference for OP * Ensure deletes are coming through * WIP scroll handling * WIP scroll tweaks * Clean up scrolling * Clean up onPostSuccess * Add annotations * Fix highlighted post calc * WIP kill me * Update APIs * Nvm don't kill me * Fix optimistic insert * Handle read more cases in tree view * Basically working read more * Handle linear view * Reorg * More reorg * Split up thread post components * New reply tree layout * Fix up traversal metadata * Tighten some spacing * Use indent ya idiot * Some linear mode cleanup * Fix lines on read more items * Vibe coding to success * Almost there with read mores * Update APIs * Bump sdk * Update import * Checkpoint new traversal * Checkpoint cleanup * Checkpoint, need to fix blocked posts * Checkpoint: think we're good, needs more cleanup * Clean it up * Two passes only * Set to default params, update comment * Fix render bug on native * Checkpoint parent rendering, can opt for slower handling here * Clean up parent handling, reply handling * Fix read more extra space * Fix read more in linear view * Fix hidden reply handling, seen count, before/after calc * Update naming * Rename Slice to ThreadItem * Add basic post and anchor skeletons * Refactor client-side hidden * WIP hidden fetching * Update types * Clean up query a bit * Scrolling still broken * Ok maybe fix scrolling * Checkpoint move state into meta query * Don't load remote hidden items unless needed * skeleton view * Reset hidden items when params change * Split up traversal and avoid multiple passes * Clean up * Checkpoint: handling exhausted replies * Clean up traversal functions further * Clean up pagination * Limit optimistic reply depth * Handle optimistic insert in hidden replies * Share root query key for easier cache extraction * Make blurred posts not look like ass * Fix double deleted item * Make optimistic deleted state not look like crap in tree view * Fix parents traversal 4 real * Rename tree post * Make optimistic deletions of linear posts not look bad * Rename linear post components * Handle tombstone views * Rename read more component * Add moreParents handling * Align interaction states of read more * Fix read more on FF * Tree view skeleton * Reply composer skele * Remove hack for showing more replies * Checkpoint: sort change scrolling fixed * Checkpoint: learned new things, reset to base * Feature gate * Rename * Replace show more * Update settings screen * Update pkg and endpoint * Remove console * Eureka * Cleanup last commit * No tests atm * Remove scroll provider * Clean up callbacks, better error state * Remove todo * Remove todo * Remove todos * Format * Ok I think scrolling is solid * Add back mobile compose input * Ok need to compute headerHeight every time * Update comments * Ok button up web too * Threads v2 tweaks (#8467) * fix error screen collapsing * use personx icon for blocked posts * Remove height/width * Revert unused Header change * Clarify code * Relate consts to theme values * Remove debug code * Typo * Fix debounce of threads prefs * Update metadata comments, dev mode * Missed a spot * Clean up todo * Fix up no-unauthenticated posts * Truncate parents if no-unauth * Update getBranch docs * Remove debug code * Expand fetching in some cases * Clear scroll need for root post to fix jump bug * Fix reply composer skeleton state * Remove uneeded initialized value * Add profile shadow cache * Some metrics * prettier tweak * eslint ignore * Fix optimistic insertion * Typo * Rename, comment * Remove wait * Counter naming * Replies seen counter for moderated sub-trees * Remove borders on skeleton * Align tombstone with optimistic deletion state * Fix optimistic deletion for thread * Add tree view icon * Rename * Cleanup * Update settings copy * Header menu open metric * Bump package * Better reply prompt (#8474) * restyle reply prompt * hide bottom bar border for cleaner look * use new border hiding hook in DMs * create `transparentifyColor` function * adjust padding * fix padding in immersive lpayer * Apply suggestions from code review Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com> * Integrate post-source (cherry picked from commit fe053e9b38395a4fcb30a4367bc800f64ea84fe9) --------- Co-authored-by: Samuel Newman <mozzius@protonmail.com> Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com>
141 lines
3.6 KiB
TypeScript
141 lines
3.6 KiB
TypeScript
import React from 'react'
|
|
import {StyleSheet, View} from 'react-native'
|
|
import {DismissableLayer, FocusGuards, FocusScope} from 'radix-ui/internal'
|
|
import {RemoveScrollBar} from 'react-remove-scroll-bar'
|
|
|
|
import {useA11y} from '#/state/a11y'
|
|
import {useModals} from '#/state/modals'
|
|
import {type ComposerOpts, useComposerState} from '#/state/shell/composer'
|
|
import {
|
|
EmojiPicker,
|
|
type EmojiPickerPosition,
|
|
type EmojiPickerState,
|
|
} from '#/view/com/composer/text-input/web/EmojiPicker'
|
|
import {atoms as a, flatten, useBreakpoints, useTheme} from '#/alf'
|
|
import {ComposePost, useComposerCancelRef} from '../com/composer/Composer'
|
|
|
|
const BOTTOM_BAR_HEIGHT = 61
|
|
|
|
export function Composer({}: {winHeight: number}) {
|
|
const state = useComposerState()
|
|
const isActive = !!state
|
|
|
|
// rendering
|
|
// =
|
|
|
|
if (!isActive) {
|
|
return null
|
|
}
|
|
|
|
return (
|
|
<>
|
|
<RemoveScrollBar />
|
|
<Inner state={state} />
|
|
</>
|
|
)
|
|
}
|
|
|
|
function Inner({state}: {state: ComposerOpts}) {
|
|
const ref = useComposerCancelRef()
|
|
const {isModalActive} = useModals()
|
|
const t = useTheme()
|
|
const {gtMobile} = useBreakpoints()
|
|
const {reduceMotionEnabled} = useA11y()
|
|
const [pickerState, setPickerState] = React.useState<EmojiPickerState>({
|
|
isOpen: false,
|
|
pos: {top: 0, left: 0, right: 0, bottom: 0, nextFocusRef: null},
|
|
})
|
|
|
|
const onOpenPicker = React.useCallback(
|
|
(pos: EmojiPickerPosition | undefined) => {
|
|
if (!pos) return
|
|
setPickerState({
|
|
isOpen: true,
|
|
pos,
|
|
})
|
|
},
|
|
[],
|
|
)
|
|
|
|
const onClosePicker = React.useCallback(() => {
|
|
setPickerState(prev => ({
|
|
...prev,
|
|
isOpen: false,
|
|
}))
|
|
}, [])
|
|
|
|
FocusGuards.useFocusGuards()
|
|
|
|
return (
|
|
<FocusScope.FocusScope loop trapped asChild>
|
|
<DismissableLayer.DismissableLayer
|
|
role="dialog"
|
|
aria-modal
|
|
style={flatten([
|
|
{position: 'fixed'},
|
|
a.inset_0,
|
|
{backgroundColor: '#000c'},
|
|
a.flex,
|
|
a.flex_col,
|
|
a.align_center,
|
|
!reduceMotionEnabled && a.fade_in,
|
|
])}
|
|
onFocusOutside={evt => evt.preventDefault()}
|
|
onInteractOutside={evt => evt.preventDefault()}
|
|
onDismiss={() => {
|
|
// TEMP: remove when all modals are ALF'd -sfn
|
|
if (!isModalActive) {
|
|
ref.current?.onPressCancel()
|
|
}
|
|
}}>
|
|
<View
|
|
style={[
|
|
styles.container,
|
|
!gtMobile && styles.containerMobile,
|
|
t.atoms.bg,
|
|
t.atoms.border_contrast_medium,
|
|
!reduceMotionEnabled && [
|
|
a.zoom_fade_in,
|
|
{animationDelay: 0.1},
|
|
{animationFillMode: 'backwards'},
|
|
],
|
|
]}>
|
|
<ComposePost
|
|
cancelRef={ref}
|
|
replyTo={state.replyTo}
|
|
quote={state.quote}
|
|
onPost={state.onPost}
|
|
onPostSuccess={state.onPostSuccess}
|
|
mention={state.mention}
|
|
openEmojiPicker={onOpenPicker}
|
|
text={state.text}
|
|
imageUris={state.imageUris}
|
|
/>
|
|
</View>
|
|
<EmojiPicker state={pickerState} close={onClosePicker} />
|
|
</DismissableLayer.DismissableLayer>
|
|
</FocusScope.FocusScope>
|
|
)
|
|
}
|
|
|
|
const styles = StyleSheet.create({
|
|
container: {
|
|
marginTop: 50,
|
|
maxWidth: 600,
|
|
width: '100%',
|
|
paddingVertical: 0,
|
|
borderRadius: 8,
|
|
marginBottom: 0,
|
|
borderWidth: 1,
|
|
// @ts-expect-error web only
|
|
maxHeight: 'calc(100% - (40px * 2))',
|
|
overflow: 'hidden',
|
|
},
|
|
containerMobile: {
|
|
borderRadius: 0,
|
|
marginBottom: BOTTOM_BAR_HEIGHT,
|
|
// @ts-expect-error web only
|
|
maxHeight: `calc(100% - ${BOTTOM_BAR_HEIGHT}px)`,
|
|
},
|
|
})
|