fix bugs
continuous-integration/drone/push Build is passing Details

master
Maxime BATISTA 2 years ago
parent e25a1042b2
commit 629d2f3cb1

@ -143,43 +143,12 @@ namespace LocalServices.Data
return JsonSerializer.Deserialize<Dictionary<K, V>>(text); return JsonSerializer.Deserialize<Dictionary<K, V>>(text);
} }
private async void Save<K, T>(string fileName, Dictionary<K, T> dict) private void Save<K, T>(string fileName, Dictionary<K, T> dict)
{ {
string json = JsonSerializer.Serialize(dict); string json = JsonSerializer.Serialize(dict);
using (var stream = WaitForFile(dbPath + "/" + fileName, FileMode.Open, FileAccess.Write, FileShare.Write)) Debug.WriteLine(json);
{
var bytes = Encoding.ASCII.GetBytes(json); File.WriteAllText(dbPath + "/" + fileName, json);
await stream.WriteAsync(bytes, 0, bytes.Length);
}
}
// This is a workaround function to wait for a file to be released before opening it.
// This was to fix the Save method that used to throw sometimes as the file were oftenly being scanned by the androids' antivirus.
// Simply wait until the file is released and return it. This function will never return until
private static FileStream WaitForFile(string fullPath, FileMode mode, FileAccess access, FileShare share)
{
for (int attempt = 0 ; attempt < 40; attempt++)
{
FileStream? fs = null;
try
{
fs = new FileStream(fullPath, mode, access, share);
return fs;
}
catch (FileNotFoundException e)
{
throw e;
}
catch (IOException e)
{
Debug.WriteLine(e.Message + " in thread " + Thread.CurrentThread.Name + " " + Thread.CurrentThread.ManagedThreadId);
if (fs != null)
fs.Dispose();
Thread.Sleep(200);
}
}
throw new TimeoutException("Could not access file '" + fullPath + "', maximum attempts reached.");
} }
} }
} }

@ -18,6 +18,7 @@ public partial class OwnedRecipeView : ContentView
BindingContext = info; BindingContext = info;
this.clickCallback = onClickCallback; this.clickCallback = onClickCallback;
this.removeCallback = onRemoveCallback; this.removeCallback = onRemoveCallback;
this.recipeInfo = info;
} }
public bool IsViewing(RecipeInfo info) public bool IsViewing(RecipeInfo info)

@ -1,82 +1,84 @@
using Services; using Services;
using Services; using Models;
using Models; using ShoopNCook.Views;
using ShoopNCook.Views;
namespace ShoopNCook.Pages;
namespace ShoopNCook.Pages;
public partial class MyRecipesPage : ContentPage
public partial class MyRecipesPage : ContentPage {
{
private IRecipesService service;
private IRecipesService service; private Account account;
private Account account;
public MyRecipesPage(Account account, IRecipesService service)
public MyRecipesPage( {
Account account, InitializeComponent();
IRecipesService service)
{ this.service = service;
InitializeComponent(); this.account = account;
this.service = service; service
this.account = account; .GetRecipesOf(account)
.GetAccountRecipes()
service .ForEach(AddRecipeView);
.GetRecipesOf(account) }
.GetAccountRecipes()
.ForEach(AddRecipeView); private void AddRecipeView(RecipeInfo info)
} {
RecipesLayout.Children.Add(new OwnedRecipeView(info, () =>
private void AddRecipeView(RecipeInfo info) {
{ Recipe? recipe = service.GetRecipe(info);
RecipesLayout.Children.Add(new OwnedRecipeView(info, () => if (recipe == null)
{ {
Recipe recipe = service.GetRecipe(info); UserNotifier.Error("Could not find recipe");
IAccountRecipesPreferencesService preferences = service.GetPreferencesOf(account); return;
Shell.Current.Navigation.PushAsync(new RecipePage(recipe, preferences, 1)); }
}, IAccountRecipesPreferencesService preferences = service.GetPreferencesOf(account);
() => RemoveRecipe(info) Shell.Current.Navigation.PushAsync(new RecipePage(recipe, preferences, 1));
)); },
} () => RemoveRecipe(info)
));
private void RemoveRecipe(RecipeInfo info) }
{
IAccountOwnedRecipesService recipes = service.GetRecipesOf(account); private void RemoveRecipe(RecipeInfo info)
{
if (!recipes.RemoveRecipe(info)) IAccountOwnedRecipesService recipes = service.GetRecipesOf(account);
{
UserNotifier.Error("Could not remove recipe"); if (!recipes.RemoveRecipe(info))
return; {
} UserNotifier.Error("Could not remove recipe");
foreach (OwnedRecipeView view in RecipesLayout.Children) return;
{ }
if (view.IsViewing(info)) foreach (OwnedRecipeView view in RecipesLayout.Children)
{ {
RecipesLayout.Remove(view); if (view.IsViewing(info))
break; {
} RecipesLayout.Remove(view);
} break;
UserNotifier.Success("Recipe successfully removed"); }
} }
UserNotifier.Success("Recipe successfully removed");
private async void OnBackButtonClicked(object sender, EventArgs e) }
{
await Navigation.PopAsync(); private async void OnBackButtonClicked(object sender, EventArgs e)
} {
private async void OnAddRecipeButtonClicked(object sender, EventArgs e) await Navigation.PopAsync();
{ }
IAccountOwnedRecipesService recipes = service.GetRecipesOf(account); private async void OnAddRecipeButtonClicked(object sender, EventArgs e)
{
var page = new CreateRecipePage(account.User, recipe => IAccountOwnedRecipesService recipes = service.GetRecipesOf(account);
{
if (!recipes.UploadRecipe(recipe)) var page = new CreateRecipePage(account.User, recipe =>
{ {
UserNotifier.Error("Could not upload recipe."); if (!recipes.UploadRecipe(recipe))
return; {
} UserNotifier.Error("Could not upload recipe.");
UserNotifier.Success("Recipe Successfuly uploaded !"); return;
AddRecipeView(recipe.Info); }
Shell.Current.Navigation.PopAsync(); //go back to current recipe page. UserNotifier.Success("Recipe Successfuly uploaded !");
}); AddRecipeView(recipe.Info);
Shell.Current.Navigation.PushAsync(page); //display RecipePage editor Shell.Current.Navigation.PopAsync(); //go back to current recipe page.
} });
Shell.Current.Navigation.PushAsync(page); //display RecipePage editor
}
} }
Loading…
Cancel
Save