@ -42,22 +42,45 @@ export function QuestionSheet({ question, disabled }: QuestionSheetProps) {
const [ searchQuery , setSearchQuery ] = useState ( "" ) ;
const [ searchQuery , setSearchQuery ] = useState ( "" ) ;
const listRef = useRef < HTMLDivElement > ( null ) ;
const listRef = useRef < HTMLDivElement > ( null ) ;
const sheetRef = useRef < HTMLElement > ( null ) ;
const sheetRef = useRef < HTMLElement > ( null ) ;
const [ localSelectedList , setLocalSelectedList ] = useState < string [ ] > ( selectedList ) ;
const localSelectedListRef = useRef < string [ ] > ( selectedList ) ;
useEffect ( ( ) = > {
localSelectedListRef . current = localSelectedList ;
} , [ localSelectedList ] ) ;
useEffect ( ( ) = > {
if ( ! isOpen ) {
setLocalSelectedList ( selectedList ) ;
localSelectedListRef . current = selectedList ;
}
} , [ isOpen , selectedList ] ) ;
const closeSheet = useCallback ( ( ) = > {
const closeSheet = useCallback ( ( ) = > {
setIsClosing ( true ) ;
setIsClosing ( true ) ;
if ( isMulti ) {
const currentList = localSelectedListRef . current ;
setAnswerValue (
question ,
currentList . length > 0 ? currentList : null ,
) ;
}
window . setTimeout ( ( ) = > {
window . setTimeout ( ( ) = > {
setIsOpen ( false ) ;
setIsOpen ( false ) ;
setIsClosing ( false ) ;
setIsClosing ( false ) ;
setSearchQuery ( "" ) ;
setSearchQuery ( "" ) ;
} , EXIT_ANIMATION_MS ) ;
} , EXIT_ANIMATION_MS ) ;
} , [ ] ) ;
} , [ isMulti , question , setAnswerValue ] ) ;
const openSheet = useCallback ( ( ) = > {
const openSheet = useCallback ( ( ) = > {
if ( disabled ) return ;
if ( disabled ) return ;
setLocalSelectedList ( selectedList ) ;
localSelectedListRef . current = selectedList ;
setIsOpen ( true ) ;
setIsOpen ( true ) ;
setIsClosing ( false ) ;
setIsClosing ( false ) ;
} , [ disabled ] ) ;
} , [ disabled , selectedList ] ) ;
useSheetScrollLock ( isOpen , { onBack : closeSheet } ) ;
useSheetScrollLock ( isOpen && ! isClosing , { onBack : closeSheet } ) ;
// Handle escape key
// Handle escape key
useEffect ( ( ) = > {
useEffect ( ( ) = > {
@ -275,13 +298,25 @@ export function QuestionSheet({ question, disabled }: QuestionSheetProps) {
: Boolean ( singleValue ) ;
: Boolean ( singleValue ) ;
const toggleMultiOption = ( optionId : string ) = > {
const toggleMultiOption = ( optionId : string ) = > {
let nextValue : string [ ] ;
if ( selectedList . includes ( optionId ) ) {
nextValue = selectedList . filter ( ( v ) = > v !== optionId ) ;
} else {
nextValue = [ . . . selectedList , optionId ] ;
}
setAnswerValue ( question , nextValue . length > 0 ? nextValue : null ) ;
setLocalSelectedList ( ( prev ) = > {
let nextValue : string [ ] ;
if ( prev . includes ( optionId ) ) {
nextValue = prev . filter ( ( v ) = > v !== optionId ) ;
} else {
nextValue = [ . . . prev , optionId ] ;
}
localSelectedListRef . current = nextValue ;
return nextValue ;
} ) ;
} ;
const handleConfirmMulti = ( ) = > {
const currentList = localSelectedListRef . current ;
setAnswerValue (
question ,
currentList . length > 0 ? currentList : null ,
) ;
closeSheet ( ) ;
} ;
} ;
const handleSelectSingle = ( optionId : string ) = > {
const handleSelectSingle = ( optionId : string ) = > {
@ -476,7 +511,7 @@ export function QuestionSheet({ question, disabled }: QuestionSheetProps) {
{ filteredOptions . length > 0 ? (
{ filteredOptions . length > 0 ? (
filteredOptions . map ( ( option ) = > {
filteredOptions . map ( ( option ) = > {
const isSelected = isMulti
const isSelected = isMulti
? s electedList. includes ( option . id )
? localS electedList. includes ( option . id )
: singleValue === option . id ;
: singleValue === option . id ;
return (
return (
@ -581,11 +616,11 @@ export function QuestionSheet({ question, disabled }: QuestionSheetProps) {
< Button
< Button
type = "button"
type = "button"
variant = "default"
variant = "default"
onClick = { closeSheet }
className = "w-full h-[50px] rounded-[14px] text-[15px] font-bold shadow-[0_8px_20px_rgba(240,68,91,0.25)]"
onClick = { handleConfirmMulti }
className = "w-full h-[50px] rounded-[14px] text-[15px] font-bold shadow-[0_8px_20px_rgba(240,68,91,0.25)] cursor-pointer "
>
>
{ s electedList. length > 0
? ` ${ confirmText } ( ${ s electedList. length } ) `
{ localS electedList. length > 0
? ` ${ confirmText } ( ${ localS electedList. length } ) `
: confirmText }
: confirmText }
< / Button >
< / Button >
< / div >
< / div >