Skip to content

Commit

Permalink
Add db logic to save SOS phone number
Browse files Browse the repository at this point in the history
  • Loading branch information
adityaoberai committed Jan 21, 2023
1 parent 032ee73 commit 1b6c687
Show file tree
Hide file tree
Showing 10 changed files with 215 additions and 12 deletions.
18 changes: 12 additions & 6 deletions SOS/App.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
namespace SOS;
using SOS.Data;

namespace SOS;

public partial class App : Application
{
public App()
{
InitializeComponent();
public static SettingsRepository SettingsRepo { get; private set; }

public App(SettingsRepository repo)
{
InitializeComponent();

MainPage = new AppShell();

MainPage = new AppShell();
}
SettingsRepo = repo;
}
}
15 changes: 15 additions & 0 deletions SOS/Data/Constants.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
namespace SOS.Data
{
public static class Constants
{
public const string DatabaseFilename = "SOSSettings.db3";

public const SQLite.SQLiteOpenFlags Flags =
SQLite.SQLiteOpenFlags.ReadWrite |
SQLite.SQLiteOpenFlags.Create |
SQLite.SQLiteOpenFlags.SharedCache;

public static string DatabasePath =>
Path.Combine(FileSystem.AppDataDirectory, DatabaseFilename);
}
}
81 changes: 81 additions & 0 deletions SOS/Data/SettingsRepository.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
using SOS.Models;
using SQLite;

namespace SOS.Data
{
public class SettingsRepository
{
private SQLiteAsyncConnection conn;

public async Task Init()
{
if (conn != null)
{
return;
}

conn = new SQLiteAsyncConnection(Constants.DatabasePath, Constants.Flags);
await conn.CreateTableAsync<SettingsData>();
}

public async Task<DbResponse> SaveNumber(string phoneNumber)
{
try
{
await Init();

var settingsList = await conn.Table<SettingsData>().ToListAsync();
var settings = settingsList.FirstOrDefault();
if (settings is null)
{
settings = new SettingsData { PhoneNumber = phoneNumber };
await conn.InsertAsync(settings);
}
else
{
settings.PhoneNumber = phoneNumber;
await conn.UpdateAsync(settings);
}
return new DbResponse()
{
Status = true,
StatusMessage = "Number saved sucessfully",
SettingsData = settings
};
}
catch (Exception ex)
{
return new DbResponse()
{
Status = false,
StatusMessage = ex.Message,
SettingsData = null
};
}
}

public async Task<DbResponse> IsNumberSavedAsync()
{
await Init();
var settingsList = await conn.Table<SettingsData>().ToListAsync();
var settings = settingsList.FirstOrDefault();

if (settings is null)
{
return new DbResponse()
{
Status = false,
StatusMessage = "SOS number missing",
SettingsData = null
};
}

return new DbResponse()
{
Status = true,
StatusMessage = "SOS number exists",
SettingsData = settings
};
}
}
}
21 changes: 20 additions & 1 deletion SOS/MainPage.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,31 @@ public partial class MainPage : ContentPage
public MainPage()
{
InitializeComponent();

Init();
}

private async void Init()
{
var settingsDbResponse = await App.SettingsRepo.IsNumberSavedAsync();
if (settingsDbResponse.Status == false)
{
await DisplayAlert("Alert", "Please add SOS number", "Ok");
}
}

private async void SOSButtonClicked(object sender, EventArgs e)
{
var settingsDbResponse = await App.SettingsRepo.IsNumberSavedAsync();
if (settingsDbResponse.Status == false)
{
await DisplayAlert("Alert", "SOS number missing", "Ok");
return;
}

var settings = settingsDbResponse.SettingsData;
SOSButton.BackgroundColor = Colors.Crimson;
await DisplayAlert("Alert", "Button Works", "Ok");
await DisplayAlert("Alert", $"Saved number: {settings.PhoneNumber}", "Ok");
SOSButton.BackgroundColor = Colors.Red;
}
}
8 changes: 6 additions & 2 deletions SOS/MauiProgram.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace SOS;
using SOS.Data;

namespace SOS;

public static class MauiProgram
{
Expand All @@ -13,6 +15,8 @@ public static MauiApp CreateMauiApp()
fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
});

return builder.Build();
builder.Services.AddSingleton<SettingsRepository>();

return builder.Build();
}
}
9 changes: 9 additions & 0 deletions SOS/Models/DbResponse.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace SOS.Models
{
public class DbResponse
{
public bool Status { get; set; }
public string StatusMessage { get; set; }
public SettingsData SettingsData { get; set; }
}
}
13 changes: 13 additions & 0 deletions SOS/Models/SettingsData.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using SQLite;

namespace SOS.Models
{
[Table("settings")]
public class SettingsData
{
[PrimaryKey, AutoIncrement, Column("_id")]
public int Id { get; set; }
[MaxLength(14), Unique]
public string PhoneNumber { get; set; }
}
}
10 changes: 10 additions & 0 deletions SOS/SOS.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,20 @@
<MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="sqlite-net-pcl" Version="1.8.116" />
<PackageReference Include="SQLitePCLRaw.core" Version="2.1.0" />
<PackageReference Include="SQLitePCLRaw.bundle_green" Version="2.1.0" />
<PackageReference Include="SQLitePCLRaw.provider.dynamic_cdecl" Version="2.1.0" />
<PackageReference Include="SQLitePCLRaw.provider.sqlite3" Version="2.1.0" />
</ItemGroup>

<ItemGroup>
<MauiXaml Update="SettingsPage.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
</ItemGroup>

<ProjectExtensions><VisualStudio><UserProperties XamarinHotReloadDebuggerTimeoutExceptionSOSHideInfoBar="True" /></VisualStudio></ProjectExtensions>

</Project>
7 changes: 6 additions & 1 deletion SOS/SettingsPage.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@
VerticalOptions="Center"
HorizontalOptions="FillAndExpand"
Clicked="SaveSettingsButtonClicked" />


<Label Text ="SOS number missing"
x:Name="SavedNumberLabel"
VerticalOptions="Center"
HorizontalOptions="FillAndExpand" />

</VerticalStackLayout>
</ContentPage>
45 changes: 43 additions & 2 deletions SOS/SettingsPage.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,55 @@
using SOS.Models;
using System.Text.RegularExpressions;

namespace SOS;

public partial class SettingsPage : ContentPage
{
public SettingsData settings;

public SettingsPage()
{
InitializeComponent();

Task.Run(async () => await SetNumberIfExists());
}

private async Task SetNumberIfExists()
{
var settingsDbResponse = await App.SettingsRepo.IsNumberSavedAsync();
settings = settingsDbResponse.SettingsData;

if(settingsDbResponse.Status is true)
{
SavedNumberLabel.Text = $"Saved Number: {settings.PhoneNumber}";
}

else
{
SavedNumberLabel.Text = settingsDbResponse.StatusMessage;
settings = new SettingsData();
}
}

private async void SaveSettingsButtonClicked(object sender, EventArgs e)
{
await DisplayAlert("Alert", "Button Works", "Ok");
{
string phoneNumber = PhoneNumber.Text;

Regex validatePhoneNumberRegex = new Regex("^\\+?[1-9][0-9]{7,14}$");

if(String.IsNullOrEmpty(phoneNumber) || validatePhoneNumberRegex.IsMatch(phoneNumber) is not true)
{
await DisplayAlert("Alert", "Enter phone number in proper format", "Ok");
return;
}

var settingsDbResponse = await App.SettingsRepo.SaveNumber(phoneNumber);

if(settingsDbResponse.Status is false)
{
await DisplayAlert("Error", settingsDbResponse.StatusMessage, "Ok");
}

await SetNumberIfExists();
}
}

0 comments on commit 1b6c687

Please sign in to comment.