using System; using System.Net.Http; using System.Windows.Forms; using Elfisa.UI.Helpers; using Elfisa.UI.Theming; using Электронная_Фармация.Classes; using Электронная_Фармация.Properties; namespace Электронная_Фармация.HelpForms { public partial class HF_Registration : Form { public HF_Registration() { InitializeComponent(); Shown += (_, __) => WindowChromeHelper.ApplyTitleBarTheme(this, ThemeManager.Colors); } string login = Settings.Default.stringLogin.ToString(); string password = Settings.Default.stringPassword.ToString(); string doWeHaveAToken = Settings.Default.stringToken.ToString(); private void btnCloseThis_Click(object sender, EventArgs e) { Close(); } private void btnBrowseExportPath_Click(object sender, EventArgs e) { using (var dialog = new FolderBrowserDialog()) { dialog.Description = "Выберите папку для экспорта накладных"; dialog.ShowNewFolderButton = true; if (!string.IsNullOrWhiteSpace(txtInvoiceExportPath.Text) && System.IO.Directory.Exists(txtInvoiceExportPath.Text.Trim())) { dialog.SelectedPath = txtInvoiceExportPath.Text.Trim(); } if (dialog.ShowDialog(this) == DialogResult.OK) { txtInvoiceExportPath.Text = dialog.SelectedPath; AppConfig.SetInvoiceExportPath(dialog.SelectedPath); ToastNotification.ShowSuccess("Папка экспорта накладных сохранена"); } } } private async void btnConfirmRegistration_Click(object sender, EventArgs e) { btnConfirmRegistration.Enabled = false; btnCloseThis.Enabled = false; UseWaitCursor = true; string strLogin = txtLogin.Text; string strPassword = txtPassword.Text; if (strLogin.Length > 0 && strPassword.Length > 0) { // Адрес API берём из поля и сохраняем ДО входа: иначе логин уходит // на старый сохранённый/дефолтный адрес, а не на введённый пользователем. string apiUrl = txtApiUrl.Text.Trim(); Settings.Default.ApiBaseUrl = apiUrl; AppConfig.SetInvoiceExportPath(txtInvoiceExportPath.Text); Settings.Default.Save(); LoginRequest loginRequest = new LoginRequest(); loginRequest.Username = strLogin.Trim(); loginRequest.Password = strPassword.Trim(); var client = new ApiClient(AppConfig.NormalizeApiBaseUrl(apiUrl)); AppDebugLog.Info("Auth", $"Попытка авторизации. Сервер={client.BaseUrl}, login={loginRequest.Username}"); try { string token = await client.LoginAsync(loginRequest.Username, loginRequest.Password); Settings.Default.stringLogin = strLogin; Settings.Default.stringPassword = strPassword; Settings.Default.stringToken = token; Settings.Default.ApiBaseUrl = client.BaseUrl; AppConfig.SetInvoiceExportPath(txtInvoiceExportPath.Text); Settings.Default.Save(); AppDebugLog.Info("Auth", $"Авторизация успешна. token={AppDebugLog.MaskToken(token)}"); ToastNotification.ShowSuccess("Авторизация успешно выполнена"); // После входа обязательно запрашиваем Location ID для отправки заказов. if (!HF_LocationId.PromptAndSave(this)) { ToastNotification.ShowCustom( "Location ID не указан. Отправка заказов будет недоступна, пока его не заполните.", System.Drawing.Color.DarkOrange, System.Drawing.Color.White); } DialogResult = DialogResult.OK; Close(); return; } catch (UnauthorizedAccessException ex) { AppDebugLog.Error("Auth", "Ошибка авторизации", ex); ToastNotification.ShowError($"Ошибка авторизации: {ex.Message}"); } catch (HttpRequestException ex) { AppDebugLog.Error("Auth", "Ошибка сети при авторизации", ex); ToastNotification.ShowError($"Ошибка сети: {ex.Message}"); } } else { UiDialogs.ShowError("Есть незаполненные данные. Регистрация программы не пройдена", "Ошибка ввода", this); } btnConfirmRegistration.Enabled = true; btnCloseThis.Enabled = true; UseWaitCursor = false; } private void HF_Registration_Load(object sender, EventArgs e) { UiThemeHelper.ApplyToControlTree(this); WindowChromeHelper.ApplyDialogChrome(this, panel1, label3); txtLogin.Text = login; txtPassword.Text = password; txtApiUrl.Text = string.IsNullOrWhiteSpace(Settings.Default.ApiBaseUrl) ? AppConfig.DefaultApiBaseUrl : Settings.Default.ApiBaseUrl; txtInvoiceExportPath.Text = AppConfig.InvoiceExportPath; checkTokenGained.Checked = doWeHaveAToken.Length > 0; } } }