feature/improve-tag-organization-ux #8
@@ -126,8 +126,13 @@ function RecipeDetail() {
|
|||||||
|
|
||||||
const trimmedTag = tagInput.trim();
|
const trimmedTag = tagInput.trim();
|
||||||
|
|
||||||
|
// Convert existing tags to string array (handle both string and object formats)
|
||||||
|
const existingTagNames = (recipe.tags || []).map(tagItem =>
|
||||||
|
typeof tagItem === 'string' ? tagItem : tagItem.tag?.name || tagItem.name
|
||||||
|
);
|
||||||
|
|
||||||
// Check if tag already exists on recipe
|
// Check if tag already exists on recipe
|
||||||
if (recipe.tags?.includes(trimmedTag)) {
|
if (existingTagNames.includes(trimmedTag)) {
|
||||||
setTagInput('');
|
setTagInput('');
|
||||||
// Keep focus in input field
|
// Keep focus in input field
|
||||||
setTimeout(() => tagInputRef.current?.focus(), 0);
|
setTimeout(() => tagInputRef.current?.focus(), 0);
|
||||||
@@ -136,11 +141,12 @@ function RecipeDetail() {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
setSavingTags(true);
|
setSavingTags(true);
|
||||||
const updatedTags = [...(recipe.tags || []), trimmedTag];
|
// Send array of tag names (strings) to API
|
||||||
|
const updatedTags = [...existingTagNames, trimmedTag];
|
||||||
await recipesApi.update(id, { tags: updatedTags });
|
await recipesApi.update(id, { tags: updatedTags });
|
||||||
|
|
||||||
// Update local state
|
// Reload the recipe to get the updated tag structure from API
|
||||||
setRecipe({ ...recipe, tags: updatedTags });
|
await loadRecipe(id);
|
||||||
setTagInput('');
|
setTagInput('');
|
||||||
|
|
||||||
// Reload available tags to include newly created ones
|
// Reload available tags to include newly created ones
|
||||||
@@ -161,11 +167,15 @@ function RecipeDetail() {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
setSavingTags(true);
|
setSavingTags(true);
|
||||||
const updatedTags = recipe.tags?.filter(tag => tag !== tagToRemove) || [];
|
// Convert existing tags to string array and filter out the removed tag
|
||||||
|
const existingTagNames = (recipe.tags || []).map(tagItem =>
|
||||||
|
typeof tagItem === 'string' ? tagItem : tagItem.tag?.name || tagItem.name
|
||||||
|
);
|
||||||
|
const updatedTags = existingTagNames.filter(tag => tag !== tagToRemove);
|
||||||
await recipesApi.update(id, { tags: updatedTags });
|
await recipesApi.update(id, { tags: updatedTags });
|
||||||
|
|
||||||
// Update local state
|
// Reload the recipe to get the updated tag structure from API
|
||||||
setRecipe({ ...recipe, tags: updatedTags });
|
await loadRecipe(id);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('Failed to remove tag:', err);
|
console.error('Failed to remove tag:', err);
|
||||||
alert('Failed to remove tag');
|
alert('Failed to remove tag');
|
||||||
|
|||||||
Reference in New Issue
Block a user