    //state.rs

    pub fn add_local_selected_item(&mut self, item: LocalSelectedItem) {
        if item.is_directory {
            let items = LocalSelectedItem::list_directory_items(&item);
            self.local_selected_items.extend(items);
        } else {
            self.local_selected_items.push(item);
        }

    }

    pub fn list_directory_items(item: &LocalSelectedItem) -> Vec<LocalSelectedItem> {
            let path = Path::new(&item.path);

            if item.is_directory {
                let mut items = Vec::new();
                if let Ok(entries) = fs::read_dir(path) {
                    for entry in entries.filter_map(Result::ok) {
                        let path = entry.path();
                        if path.is_dir() {
                            // Recursively process subdirectories
                            items.extend(Self::list_directory_items(&LocalSelectedItem {
                                name: path.file_name().unwrap().to_string_lossy().into_owned(),
                                path: path.to_string_lossy().into(),
                                is_directory: true,
                                destination_bucket: item.destination_bucket.clone(),
                                destination_path: PathBuf::from(&item.destination_path)
                                    .join(path.file_name().unwrap().to_string_lossy().into_owned())
                                    .to_string_lossy().into(),
                                transferred: false,
                                s3_creds: item.s3_creds.clone(),
                                progress: 0.0,
                            }));
                        } else {
                            // Process files
                            items.push(LocalSelectedItem {
                                name: path.file_name().unwrap().to_string_lossy().into_owned(),
                                path: path.to_string_lossy().into(),
                                is_directory: false,
                                destination_bucket: item.destination_bucket.clone(),
                                destination_path: PathBuf::from(&item.destination_path)
                                    .join(path.file_name().unwrap().to_string_lossy().into_owned())
                                    .to_string_lossy().into(),
                                transferred: false,
                                s3_creds: item.s3_creds.clone(),
                                progress: 0.0,
                            });
                        }
                    }
                }
                items
            } else {
                vec![item.clone()]
            }
        }


            fn transfer_from_local_to_s3(&mut self) {
                if let Some(selected_row) =
                    self.props.local_table_state.selected().and_then(|index| self.props.local_data.get(index))
                {
                    let sr = selected_row.clone();
                    if let Some(selected_bucket) = self.props.current_s3_bucket.clone() {
                        let selected_item = LocalSelectedItem::new(
                            sr.name,
                            sr.path,
                            sr.is_directory,
                            selected_bucket,
                            self.props.current_s3_path.clone(),
                            self.props.current_s3_creds.clone(),
                        );
                        let _ = self.action_tx.send(Action::SelectLocalItem {
                            item: selected_item
                        });
                    } else {
                        self.show_popup = true;
                    }
                }
            }