feat(properties): add empty property check, placeholder labels and labels error handling

This commit is contained in:
ryan 2025-04-24 17:18:47 +03:00
parent 2d286e5834
commit 26724d9c45

View file

@ -206,12 +206,18 @@ pub fn ItemsList(
// Fetch labels for the custom properties // Fetch labels for the custom properties
let property_ids = custom_props_clone; let property_ids = custom_props_clone;
let labels = fetch_property_labels(property_ids).await; match fetch_property_labels(property_ids).await {
Ok(labels) => {
set_property_labels.update(|labels_map| { set_property_labels.update(|labels_map| {
for (key, value) in labels { for (key, value) in labels {
labels_map.insert(key, value); labels_map.insert(key, value);
} }
}); });
},
Err(e) => {
log!("Error fetching property labels: {:?}", e);
}
}
// log!("Items after loading: {:?}", items.get()); // log!("Items after loading: {:?}", items.get());
} }
@ -449,10 +455,16 @@ pub fn ItemsList(
.collect(); .collect();
if !missing_ids.is_empty() { if !missing_ids.is_empty() {
let new_labels = fetch_property_labels(missing_ids).await; match fetch_property_labels(missing_ids).await {
Ok(new_labels) => {
set_property_labels.update(|labels| { set_property_labels.update(|labels| {
labels.extend(new_labels.clone()); labels.extend(new_labels.clone());
}); });
},
Err(e) => {
log!("Error fetching property labels: {:?}", e);
}
}
} }
// Second pass: build results // Second pass: build results
@ -494,7 +506,7 @@ pub fn ItemsList(
} }
} }
async fn fetch_property_labels(property_ids: Vec<String>) -> HashMap<String, String> { async fn fetch_property_labels(property_ids: Vec<String>) -> Result<HashMap<String, String>, String> {
log!("Fetching property labels for properties: {:?}", property_ids); log!("Fetching property labels for properties: {:?}", property_ids);
// Remove the "http://www.wikidata.org/prop/" prefix from property IDs // Remove the "http://www.wikidata.org/prop/" prefix from property IDs
@ -529,7 +541,7 @@ pub fn ItemsList(
log!("Received response from Wikidata. Status: {}", response.status()); log!("Received response from Wikidata. Status: {}", response.status());
if response.status() != 200 { if response.status() != 200 {
log!("Error: Unexpected status code {}", response.status()); log!("Error: Unexpected status code {}", response.status());
return HashMap::new(); return Err(format!("Unexpected status code: {}", response.status()));
} }
match response.text().await { match response.text().await {
@ -557,23 +569,23 @@ pub fn ItemsList(
log!("Warning: No bindings found in the response"); log!("Warning: No bindings found in the response");
} }
log!("Fetched {} property labels", result.len()); log!("Fetched {} property labels", result.len());
result Ok(result)
} }
Err(e) => { Err(e) => {
log!("Error parsing response from Wikidata: {:?}", e); log!("Error parsing response from Wikidata: {:?}", e);
HashMap::new() Err(format!("Error parsing response: {:?}", e))
} }
} }
} }
Err(e) => { Err(e) => {
log!("Error reading response body: {:?}", e); log!("Error reading response body: {:?}", e);
HashMap::new() Err(format!("Error reading response body: {:?}", e))
} }
} }
} }
Err(e) => { Err(e) => {
log!("Error fetching property labels from Wikidata: {:?}", e); log!("Error fetching property labels from Wikidata: {:?}", e);
HashMap::new() Err(format!("Error fetching property labels: {:?}", e))
} }
} }
} }
@ -590,16 +602,34 @@ pub fn ItemsList(
let normalized_property = property.replace("http://www.wikidata.org/prop/", ""); let normalized_property = property.replace("http://www.wikidata.org/prop/", "");
let normalized_property_clone = normalized_property.clone(); let normalized_property_clone = normalized_property.clone();
// Check if property is empty
if normalized_property.is_empty() {
log!("Attempted to add empty property, ignoring");
return;
}
// Check if label already exists // Check if label already exists
if !property_labels.get().contains_key(&normalized_property) { if !property_labels.get().contains_key(&normalized_property) {
spawn_local({ spawn_local({
let normalized_property = normalized_property.clone(); let normalized_property = normalized_property.clone();
let set_property_labels = set_property_labels.clone(); let set_property_labels = set_property_labels.clone();
async move { async move {
let labels = fetch_property_labels(vec![normalized_property.clone()]).await; // Add a placeholder label while fetching
set_property_labels.update(|map| {
map.insert(normalized_property.clone(), normalized_property.clone());
});
match fetch_property_labels(vec![normalized_property.clone()]).await {
Ok(labels) => {
set_property_labels.update(|map| { set_property_labels.update(|map| {
map.extend(labels); map.extend(labels);
}); });
},
Err(e) => {
log!("Error fetching property labels: {:?}", e);
// Keep the placeholder label
}
}
} }
}); });
} }
@ -652,7 +682,10 @@ pub fn ItemsList(
// Ensure the grid updates reactively // Ensure the grid updates reactively
set_items.update(|items| { set_items.update(|items| {
for item in items { for item in items {
item.custom_properties.entry(normalized_property.clone()).or_insert_with(|| "".to_string()); // Safely insert the property if it doesn't exist
if !item.custom_properties.contains_key(&normalized_property) {
item.custom_properties.insert(normalized_property.clone(), "".to_string());
}
// Save the updated item to the database // Save the updated item to the database
let item_clone = item.clone(); let item_clone = item.clone();