using JobsJobsJobs.Shared; using JobsJobsJobs.Shared.Api; using Microsoft.AspNetCore.Components; using System.Collections.Generic; using System.Linq; using System.Net.Http.Json; using System.Threading.Tasks; namespace JobsJobsJobs.Client.Pages.Citizen { /// /// Profile edit page (called EditProfile so as not to create naming conflicts) /// public partial class EditProfile : ComponentBase { /// /// Counter for IDs when "Add a Skill" button is clicked /// private int _newSkillCounter = 0; /// /// A flag that indicates all the required API calls have completed, and the form is ready to be displayed /// private bool AllLoaded { get; set; } = false; /// /// Whether the citizen is seeking employment at the time the profile is loaded (used to show success story /// link) /// private bool IsSeeking { get; set; } = false; /// /// The form for this page /// private ProfileForm ProfileForm { get; set; } = new ProfileForm(); /// /// All continents /// private IEnumerable Continents { get; set; } = Enumerable.Empty(); /// /// Whether this is a new profile or not /// private bool IsNew { get; set; } = false; /// /// Error messages from API access /// private IList ErrorMessages { get; } = new List(); protected override async Task OnInitializedAsync() { ServerApi.SetJwt(http, state); var continentTask = state.GetContinents(http); var profileTask = ServerApi.RetrieveProfile(http, state); await Task.WhenAll(continentTask, profileTask); Continents = continentTask.Result; if (profileTask.Result.IsOk) { if (profileTask.Result.Ok == null) { ProfileForm = new ProfileForm(); IsNew = true; } else { ProfileForm = ProfileForm.FromProfile(profileTask.Result.Ok); IsSeeking = profileTask.Result.Ok.SeekingEmployment; } if (ProfileForm.Skills.Count == 0) AddNewSkill(); } else { ErrorMessages.Add(profileTask.Result.Error); } AllLoaded = true; } /// /// Add a new skill to the form /// private void AddNewSkill() => ProfileForm.Skills.Add(new SkillForm { Id = $"new{_newSkillCounter++}" }); /// /// Remove the skill for the given ID /// /// The ID of the skill to remove private void RemoveSkill(string skillId) => ProfileForm.Skills.Remove(ProfileForm.Skills.First(s => s.Id == skillId)); /// /// Save changes to the current profile /// public async Task SaveProfile() { // Remove any skills left blank var blankSkills = ProfileForm.Skills .Where(s => string.IsNullOrEmpty(s.Description) && string.IsNullOrEmpty(s.Notes)) .ToList(); foreach (var blankSkill in blankSkills) ProfileForm.Skills.Remove(blankSkill); var res = await http.PostAsJsonAsync("/api/profile/save", ProfileForm); if (res.IsSuccessStatusCode) { toast.ShowSuccess("Profile Saved Successfully"); nav.NavigateTo($"/profile/view/{state.User!.Id}"); } else { var error = await res.Content.ReadAsStringAsync(); if (!string.IsNullOrEmpty(error)) error = $"- {error}"; toast.ShowError($"{(int)res.StatusCode} {error}"); } } } }