@@ -1888,17 +1888,22 @@ async function hide_settings() {
1888
1888
1889
1889
window . addEventListener ( 'popstate' , hide_sidebar , false ) ;
1890
1890
1891
+ // Create a reusable function for sidebar toggle logic
1892
+ const toggleSidebar = async ( ) => {
1893
+ if ( sidebar . classList . contains ( "expanded" ) ||
1894
+ document . querySelector ( ".sidebar-button.rotated" ) ) {
1895
+ await hide_sidebar ( ) ;
1896
+ chat . classList . remove ( "hidden" ) ;
1897
+ sidebar_buttons . forEach ( btn => btn . classList . remove ( "rotated" ) ) ;
1898
+ } else {
1899
+ await show_menu ( ) ;
1900
+ }
1901
+ window . scrollTo ( 0 , 0 ) ;
1902
+ } ;
1903
+
1904
+ // Attach the event listener to each button with the reusable function
1891
1905
sidebar_buttons . forEach ( button => {
1892
- button . addEventListener ( "click" , async ( ) => {
1893
- if ( sidebar . classList . contains ( "expanded" ) || button . classList . contains ( "rotated" ) ) {
1894
- await hide_sidebar ( ) ;
1895
- chat . classList . remove ( "hidden" ) ;
1896
- sidebar_buttons . forEach ( btn => btn . classList . remove ( "rotated" ) ) ;
1897
- } else {
1898
- await show_menu ( ) ;
1899
- }
1900
- window . scrollTo ( 0 , 0 ) ;
1901
- } ) ;
1906
+ button . addEventListener ( "click" , toggleSidebar ) ;
1902
1907
} ) ;
1903
1908
1904
1909
function add_url_to_history ( url ) {
@@ -1916,14 +1921,19 @@ async function show_menu() {
1916
1921
1917
1922
function open_settings ( ) {
1918
1923
if ( settings . classList . contains ( "hidden" ) ) {
1924
+ // Store current sidebar state before modifying it
1925
+ const wasSidebarExpanded = sidebar . classList . contains ( "expanded" ) ;
1926
+
1919
1927
chat . classList . add ( "hidden" ) ;
1920
- sidebar . classList . remove ( "expanded" ) ;
1921
1928
settings . classList . remove ( "hidden" ) ;
1922
1929
add_url_to_history ( "/chat/settings/" ) ;
1923
1930
1924
- // Make sure the sidebar is in collapsed state when settings are open
1925
- sidebar . classList . remove ( "expanded" ) ;
1926
- sidebar_buttons . forEach ( btn => btn . classList . remove ( "rotated" ) ) ;
1931
+ // Only collapse sidebar when appropriate (not during specific UI states)
1932
+ if ( ! document . body . classList . contains ( "mobile-view" ) &&
1933
+ ! document . body . classList . contains ( "transition-lock" ) ) {
1934
+ sidebar . classList . remove ( "expanded" ) ;
1935
+ sidebar_buttons . forEach ( btn => btn . classList . remove ( "rotated" ) ) ;
1936
+ }
1927
1937
1928
1938
// Show all hidden fields that should be visible
1929
1939
document . querySelectorAll ( '.settings .field.box.hidden' ) . forEach ( field => {
@@ -1938,34 +1948,70 @@ function open_settings() {
1938
1948
log_storage . classList . add ( "hidden" ) ;
1939
1949
}
1940
1950
1951
+ // Store the event handler function as a named function
1952
+ function handleCollapsibleHeaderClick ( e ) {
1953
+ e . stopPropagation ( ) ; // Prevent event bubbling
1954
+ this . classList . toggle ( 'active' ) ;
1955
+ const content = this . nextElementSibling ;
1956
+
1957
+ if ( content . classList . contains ( 'hidden' ) ) {
1958
+ content . classList . remove ( 'hidden' ) ;
1959
+ content . style . display = "block" ;
1960
+ setTimeout ( ( ) => {
1961
+ content . style . maxHeight = ( content . scrollHeight + 100 ) + "px" ;
1962
+ } , 10 ) ;
1963
+ } else {
1964
+ content . style . maxHeight = "0" ;
1965
+ setTimeout ( ( ) => {
1966
+ content . classList . add ( 'hidden' ) ;
1967
+ content . style . display = "none" ;
1968
+ } , 300 ) ;
1969
+ }
1970
+ }
1971
+
1972
+ // Function to handle collapsible header clicks with improved animation handling
1973
+ function handleCollapsibleHeaderClick ( e ) {
1974
+ e . stopPropagation ( ) ; // Prevent event bubbling
1975
+ this . classList . toggle ( 'active' ) ;
1976
+ const content = this . nextElementSibling ;
1977
+
1978
+ if ( content . classList . contains ( 'hidden' ) ) {
1979
+ // Show content immediately but with zero height
1980
+ content . classList . remove ( 'hidden' ) ;
1981
+ content . style . display = "block" ;
1982
+ content . style . maxHeight = "0" ;
1983
+
1984
+ // Use requestAnimationFrame to ensure browser has rendered the element
1985
+ requestAnimationFrame ( ( ) => {
1986
+ // Use a second frame to ensure CSS has applied
1987
+ requestAnimationFrame ( ( ) => {
1988
+ content . style . maxHeight = ( content . scrollHeight + 100 ) + "px" ;
1989
+ } ) ;
1990
+ } ) ;
1991
+ } else {
1992
+ content . style . maxHeight = "0" ;
1993
+
1994
+ // Use the transitionend event instead of setTimeout
1995
+ const transitionEndHandler = function ( ) {
1996
+ content . classList . add ( 'hidden' ) ;
1997
+ content . style . display = "none" ;
1998
+ content . removeEventListener ( 'transitionend' , transitionEndHandler ) ;
1999
+ } ;
2000
+
2001
+ content . addEventListener ( 'transitionend' , transitionEndHandler ) ;
2002
+ }
2003
+ }
2004
+
1941
2005
// Function to handle collapsible fields
1942
2006
function setupCollapsibleFields ( ) {
1943
2007
const collapsibleHeaders = document . querySelectorAll ( '.collapsible-header' ) ;
1944
2008
1945
2009
collapsibleHeaders . forEach ( header => {
1946
- // Remove existing event listeners
1947
- const newHeader = header . cloneNode ( true ) ;
1948
- header . parentNode . replaceChild ( newHeader , header ) ;
2010
+ // Properly remove existing event listeners
2011
+ header . removeEventListener ( 'click' , handleCollapsibleHeaderClick ) ;
1949
2012
1950
- newHeader . addEventListener ( 'click' , function ( e ) {
1951
- e . stopPropagation ( ) ; // Prevent event bubbling
1952
- this . classList . toggle ( 'active' ) ;
1953
- const content = this . nextElementSibling ;
1954
-
1955
- if ( content . classList . contains ( 'hidden' ) ) {
1956
- content . classList . remove ( 'hidden' ) ;
1957
- content . style . display = "block" ;
1958
- setTimeout ( ( ) => {
1959
- content . style . maxHeight = ( content . scrollHeight + 100 ) + "px" ;
1960
- } , 10 ) ;
1961
- } else {
1962
- content . style . maxHeight = "0" ;
1963
- setTimeout ( ( ) => {
1964
- content . classList . add ( 'hidden' ) ;
1965
- content . style . display = "none" ;
1966
- } , 300 ) ;
1967
- }
1968
- } ) ;
2013
+ // Add the event listener
2014
+ header . addEventListener ( 'click' , handleCollapsibleHeaderClick ) ;
1969
2015
} ) ;
1970
2016
}
1971
2017
0 commit comments