312 lines
12 KiB
C#
312 lines
12 KiB
C#
using Krypton.Toolkit;
|
|
using qtcnet_client.Properties;
|
|
using QtCNETAPI.Models;
|
|
using QtCNETAPI.Services.ApiService;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
|
|
namespace qtcnet_client.Forms
|
|
{
|
|
public partial class ProfileForm : Form
|
|
{
|
|
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
|
|
public string UserId { get; set; } = string.Empty;
|
|
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
|
|
public string Username { get; set; } = "Username";
|
|
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
|
|
public string Bio { get; set; } = string.Empty;
|
|
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
|
|
public int Status { get; set; } = 0;
|
|
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
|
|
public string TextStatus { get; set; } = string.Empty;
|
|
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
|
|
public string[] Tags { get; set; } = [];
|
|
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
|
|
public Contact.ContactStatus ContactStatus { get; set; }
|
|
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
|
|
public Image ProfileImage { get; set; } = Resources.DefaultPfp;
|
|
|
|
public event EventHandler? OnClose;
|
|
|
|
private IApiService _apiService;
|
|
public ProfileForm(IApiService apiService)
|
|
{
|
|
_apiService = apiService;
|
|
InitializeComponent();
|
|
}
|
|
|
|
private void ProfileForm_Load(object sender, EventArgs e)
|
|
{
|
|
Text = $"QtC.NET User Profile - {Username}";
|
|
lblUsername.Text = Username;
|
|
lblStatus.Text = TextStatus;
|
|
rtxtBio.Text = Bio;
|
|
pbProfileImage.Image = ProfileImage;
|
|
|
|
ResizeFormToUsername();
|
|
|
|
if (Status == 0) lblStatus.Visible = false;
|
|
|
|
if (UserId == _apiService.CurrentUser?.Id)
|
|
{
|
|
btnAction1.Visible = false;
|
|
btnAction2.Visible = false;
|
|
|
|
btnSaveProfile.Visible = true;
|
|
rtxtBio.ReadOnly = false;
|
|
}
|
|
|
|
switch (ContactStatus)
|
|
{
|
|
case Contact.ContactStatus.Accepted:
|
|
if (Status == 0) btnAction1.Visible = false;
|
|
btnAction1.Image = Resources.MessageIcon;
|
|
btnAction2.Image = Resources.RemoveContactIcon;
|
|
btnAction1.Click += BtnAction1_MessageClick;
|
|
btnAction2.Click += BtnAction2_RemoveContactClick;
|
|
break;
|
|
case Contact.ContactStatus.AwaitingApprovalFromSelf:
|
|
btnAction1.Image = Resources.AcceptContactIcon;
|
|
btnAction2.Image = Resources.DeclineContactIcon;
|
|
btnAction1.Click += BtnAction1_AcceptContactClick;
|
|
btnAction2.Click += BtnAction2_DeclineContactClick;
|
|
break;
|
|
case Contact.ContactStatus.AwaitingApprovalFromOther:
|
|
btnAction1.Image = Resources.RequestSentIcon;
|
|
btnAction2.Image = Resources.CancelRequestIcon;
|
|
btnAction1.Enabled = false;
|
|
btnAction2.Click += BtnAction2_CancelContactRequestClick;
|
|
break;
|
|
case Contact.ContactStatus.NoRelation:
|
|
btnAction1.Image = null;
|
|
btnAction2.Image = Resources.AddContactIcon;
|
|
btnAction1.Enabled = false;
|
|
btnAction2.Click += BtnAction2_AddContactClick;
|
|
break;
|
|
}
|
|
}
|
|
|
|
private async void BtnAction2_AddContactClick(object? sender, EventArgs e)
|
|
{
|
|
// send request to add user as a contact
|
|
var _res = await _apiService.AddContactToCurrentUser(UserId);
|
|
if (_res.Success && _res.Data != null)
|
|
{
|
|
if (_res.Data.OwnerId == UserId)
|
|
ContactStatus = _res.Data.UserStatus;
|
|
else
|
|
ContactStatus = _res.Data.OwnerStatus;
|
|
}
|
|
|
|
ReevaluateContactStatus();
|
|
}
|
|
|
|
private async void BtnAction2_CancelContactRequestClick(object? sender, EventArgs e)
|
|
{
|
|
// remove contact from user
|
|
var _res = await _apiService.RemoveContactFromCurrentUser(UserId);
|
|
if (_res.Success && _res.Data != null)
|
|
ContactStatus = Contact.ContactStatus.NoRelation;
|
|
|
|
ReevaluateContactStatus();
|
|
}
|
|
|
|
private async void BtnAction1_AcceptContactClick(object? sender, EventArgs e)
|
|
{
|
|
// accept contact request
|
|
var _res = await _apiService.AcceptContactRequest(UserId);
|
|
if (_res.Success)
|
|
ContactStatus = Contact.ContactStatus.Accepted;
|
|
|
|
ReevaluateContactStatus();
|
|
}
|
|
|
|
private async void BtnAction2_DeclineContactClick(object? sender, EventArgs e)
|
|
{
|
|
// remove contact from user
|
|
var _res = await _apiService.RemoveContactFromCurrentUser(UserId);
|
|
if (_res.Success && _res.Data != null)
|
|
ContactStatus = Contact.ContactStatus.NoRelation;
|
|
|
|
ReevaluateContactStatus();
|
|
}
|
|
|
|
private void BtnAction1_MessageClick(object? sender, EventArgs e)
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
private async void BtnAction2_RemoveContactClick(object? sender, EventArgs e)
|
|
{
|
|
// remove contact from user
|
|
var _res = await _apiService.RemoveContactFromCurrentUser(UserId);
|
|
if (_res.Success && _res.Data != null)
|
|
ContactStatus = Contact.ContactStatus.NoRelation;
|
|
|
|
ReevaluateContactStatus();
|
|
}
|
|
|
|
private void ProfileForm_FormClosed(object sender, FormClosedEventArgs e) => OnClose?.Invoke(this, EventArgs.Empty);
|
|
|
|
private void ReevaluateContactStatus()
|
|
{
|
|
if (UserId != _apiService.CurrentUser?.Id)
|
|
{
|
|
switch (ContactStatus)
|
|
{
|
|
case Contact.ContactStatus.Accepted:
|
|
if (Status == 0) btnAction1.Visible = false;
|
|
btnAction1.Image = Resources.MessageIcon;
|
|
btnAction2.Image = Resources.RemoveContactIcon;
|
|
btnAction1.Click += BtnAction1_MessageClick;
|
|
btnAction2.Click += BtnAction2_RemoveContactClick;
|
|
break;
|
|
case Contact.ContactStatus.AwaitingApprovalFromSelf:
|
|
btnAction1.Image = Resources.AcceptContactIcon;
|
|
btnAction2.Image = Resources.DeclineContactIcon;
|
|
btnAction1.Click += BtnAction1_AcceptContactClick;
|
|
btnAction2.Click += BtnAction2_DeclineContactClick;
|
|
break;
|
|
case Contact.ContactStatus.AwaitingApprovalFromOther:
|
|
btnAction1.Image = Resources.RequestSentIcon;
|
|
btnAction2.Image = Resources.CancelRequestIcon;
|
|
btnAction1.Enabled = false;
|
|
btnAction2.Click += BtnAction2_CancelContactRequestClick;
|
|
break;
|
|
case Contact.ContactStatus.NoRelation:
|
|
btnAction1.Image = null;
|
|
btnAction2.Image = Resources.AddContactIcon;
|
|
btnAction1.Enabled = false;
|
|
btnAction2.Click += BtnAction2_AddContactClick;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
btnAction1.Enabled = false;
|
|
btnAction2.Enabled = false;
|
|
}
|
|
}
|
|
|
|
private void lblUsername_DoubleClick(object sender, EventArgs e)
|
|
{
|
|
if (UserId == _apiService.CurrentUser?.Id)
|
|
{
|
|
lblUsername.Visible = false;
|
|
|
|
TextBox txtUsernameEdit = new()
|
|
{
|
|
Text = lblUsername.Text,
|
|
Font = lblUsername.Font,
|
|
MaxLength = 25,
|
|
Dock = lblUsername.Dock,
|
|
Location = lblUsername.Location,
|
|
Size = lblUsername.Size,
|
|
};
|
|
txtUsernameEdit.KeyDown += TxtUsernameEdit_KeyDown;
|
|
tlpUsernameTags.Controls.Add(txtUsernameEdit);
|
|
txtUsernameEdit.Focus();
|
|
}
|
|
}
|
|
|
|
private void TxtUsernameEdit_KeyDown(object? sender, KeyEventArgs e)
|
|
{
|
|
if (sender is TextBox txtUsernameEdit && e.KeyCode == Keys.Enter)
|
|
{
|
|
lblUsername.Text = txtUsernameEdit.Text;
|
|
tlpUsernameTags.Controls.Remove(txtUsernameEdit);
|
|
txtUsernameEdit.Dispose();
|
|
ResizeFormToUsername();
|
|
lblUsername.Visible = true;
|
|
}
|
|
}
|
|
|
|
private async void btnSaveProfile_Click(object sender, EventArgs e)
|
|
{
|
|
// update current user profile based on stuff inputted
|
|
var _res = await _apiService.UpdateUserInformationAsync(new()
|
|
{
|
|
Id = _apiService.CurrentUser!.Id,
|
|
Username = lblUsername.Text,
|
|
Bio = rtxtBio.Text,
|
|
DateOfBirth = _apiService.CurrentUser.DateOfBirth,
|
|
});
|
|
if (_res.Success && _res.Data != null)
|
|
KryptonMessageBox.Show("Profile Updated", "Yipee!");
|
|
else
|
|
KryptonMessageBox.Show("Profile Update Failed. Please Try Again Later.", "Oops.");
|
|
}
|
|
|
|
private void pbProfileImage_Click(object sender, EventArgs e)
|
|
{
|
|
if(UserId == _apiService.CurrentUser?.Id)
|
|
{
|
|
Thread _fileDialogThread = new Thread(async () =>
|
|
{
|
|
using OpenFileDialog openFileDialog = new()
|
|
{
|
|
CheckFileExists = true,
|
|
CheckPathExists = true,
|
|
InitialDirectory = Environment.CurrentDirectory,
|
|
Filter = "Image Files (*.png, *.jpg, *.gif, *.bmp)|*.png;*.jpg;*.gif;*.bmp",
|
|
Title = "Select A New Profile Image"
|
|
};
|
|
var _res = openFileDialog.ShowDialog();
|
|
if(_res == DialogResult.OK)
|
|
{
|
|
// update the current users profile image
|
|
var _apiRes = await _apiService.UpdateUserProfilePic(openFileDialog.FileName);
|
|
if(_apiRes.Success)
|
|
{
|
|
Image newImg = Image.FromFile(openFileDialog.FileName);
|
|
pbProfileImage.Image = newImg;
|
|
pbProfileImage.Invalidate();
|
|
}
|
|
}
|
|
});
|
|
|
|
_fileDialogThread.SetApartmentState(ApartmentState.STA);
|
|
_fileDialogThread.Start();
|
|
}
|
|
}
|
|
|
|
private void pbProfileImage_MouseEnter(object sender, EventArgs e)
|
|
{
|
|
if(UserId == _apiService.CurrentUser?.Id)
|
|
{
|
|
Graphics g = pbProfileImage.CreateGraphics();
|
|
Rectangle rect = pbProfileImage.ClientRectangle;
|
|
|
|
// draw an opaque dark color onto the client rectangle of the picturebox
|
|
using SolidBrush sb = new(Color.FromArgb(50, Color.Black));
|
|
g.FillRectangle(sb, rect);
|
|
|
|
pbProfileImage.Cursor = Cursors.Hand;
|
|
}
|
|
}
|
|
|
|
private void pbProfileImage_MouseLeave(object sender, EventArgs e)
|
|
{
|
|
// redraw the box normally
|
|
pbProfileImage.Cursor = Cursors.Default;
|
|
pbProfileImage.Invalidate();
|
|
}
|
|
|
|
private void ResizeFormToUsername()
|
|
{
|
|
int padding = 40;
|
|
int minWidth = 445;
|
|
int newWidth = lblUsername.Right + padding;
|
|
|
|
if (newWidth > minWidth)
|
|
Width = newWidth;
|
|
}
|
|
}
|
|
}
|