synpad 0.1.0

A full-featured Matrix chat client built with Dioxus
/// Detect media type from MIME type string.
pub fn media_type_from_mime(mime: &str) -> MediaType {
    if mime.starts_with("image/") {
        MediaType::Image
    } else if mime.starts_with("video/") {
        MediaType::Video
    } else if mime.starts_with("audio/") {
        MediaType::Audio
    } else {
        MediaType::File
    }
}

/// Media type categories.
#[derive(Clone, Debug, PartialEq)]
pub enum MediaType {
    Image,
    Video,
    Audio,
    File,
}

/// Calculate display dimensions that fit within max bounds while preserving aspect ratio.
pub fn fit_dimensions(
    original_width: u32,
    original_height: u32,
    max_width: u32,
    max_height: u32,
) -> (u32, u32) {
    if original_width == 0 || original_height == 0 {
        return (max_width, max_height);
    }

    let width_ratio = max_width as f64 / original_width as f64;
    let height_ratio = max_height as f64 / original_height as f64;
    let ratio = width_ratio.min(height_ratio).min(1.0);

    let new_width = (original_width as f64 * ratio) as u32;
    let new_height = (original_height as f64 * ratio) as u32;

    (new_width.max(1), new_height.max(1))
}

/// Get a file extension icon name based on the MIME type.
pub fn file_icon_for_mime(mime: &str) -> &'static str {
    match mime {
        m if m.starts_with("image/") => "image",
        m if m.starts_with("video/") => "video",
        m if m.starts_with("audio/") => "audio",
        "application/pdf" => "pdf",
        m if m.contains("zip") || m.contains("tar") || m.contains("gzip") => "archive",
        m if m.contains("text") => "text",
        _ => "file",
    }
}