Skip to content

Commit d744d86

Browse files
Episode 27: Login Page Design
1 parent 03b548f commit d744d86

File tree

5 files changed

+59
-15
lines changed

5 files changed

+59
-15
lines changed

TimeTrackerTutorial.Android/Properties/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.letscreateseries.timetrackertutorial">
3-
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
3+
<uses-sdk android:minSdkVersion="25" android:targetSdkVersion="28" />
44
<application android:label="TimeTrackerTutorial.Android"></application>
55
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
66
<uses-permission android:name="android.permission.INTERNET" />

TimeTrackerTutorial/PageModels/LoginPageModel.cs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
using System;
22
using TimeTrackerTutorial.PageModels.Base;
3+
using TimeTrackerTutorial.Services.Account;
34
using TimeTrackerTutorial.Services.Navigation;
45
using TimeTrackerTutorial.ViewModels;
6+
using TimeTrackerTutorial.ViewModels.Buttons;
57
using Xamarin.Forms;
68

79
namespace TimeTrackerTutorial.PageModels
@@ -18,13 +20,43 @@ public string Icon
1820
public LoginEntryViewModel EmailEntryViewModel { get; set; }
1921
public LoginEntryViewModel PasswordEntryViewModel { get; set; }
2022

23+
public ButtonModel ForgotPasswordModel { get; set; }
24+
public ButtonModel LogInModel { get; set; }
25+
public ButtonModel UsePhoneModel { get; set; }
26+
27+
private IAccountService _accountService;
2128
private INavigationService _navigationService;
2229

23-
public LoginPageModel(INavigationService navigationService)
30+
public LoginPageModel(INavigationService navigationService,
31+
IAccountService accountService)
2432
{
33+
_accountService = accountService;
2534
_navigationService = navigationService;
2635
EmailEntryViewModel = new LoginEntryViewModel("email", false);
2736
PasswordEntryViewModel = new LoginEntryViewModel("password", true);
37+
38+
ForgotPasswordModel = new ButtonModel("forgot password", OnForgotPassword);
39+
LogInModel = new ButtonModel("LOG IN", OnLogin);
40+
UsePhoneModel = new ButtonModel("USE PHONE NUMBER", GoToPhoneLogin);
41+
}
42+
43+
private async void OnLogin()
44+
{
45+
var loginAttempt = await _accountService.LoginAsync(EmailEntryViewModel.Text, PasswordEntryViewModel.Text);
46+
if (loginAttempt)
47+
{
48+
// navigate to the Dashboard.
49+
await _navigationService.NavigateToAsync<DashboardPageModel>();
50+
}
51+
else
52+
{
53+
// TODO: Display an Alert for Failure!
54+
}
55+
}
56+
57+
private void OnForgotPassword()
58+
{
59+
2860
}
2961

3062
private void GoToPhoneLogin()

TimeTrackerTutorial/Pages/LoginPage.xaml

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,31 @@
55
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
66
xmlns:views="clr-namespace:TimeTrackerTutorial.Views" mc:Ignorable="d"
77
NavigationPage.HasNavigationBar="False"
8+
xmlns:buttons="clr-namespace:TimeTrackerTutorial.Views.Buttons"
89
xmlns:skViews="clr-namespace:TimeTrackerTutorial.Views.SKViews"
910
x:Class="TimeTrackerTutorial.Pages.LoginPage">
1011
<ContentPage.Content>
1112
<Grid>
1213
<skViews:RectGradientView StartColor="{StaticResource GradientStartColor}"
1314
EndColor="{StaticResource GradientEndColor}"
1415
VerticalOptions="FillAndExpand" />
15-
<StackLayout>
16+
<StackLayout WidthRequest="220" HorizontalOptions="Center">
1617
<!-- App Icon -->
1718
<Image WidthRequest="200" Aspect="AspectFit"
18-
HorizontalOptions="Center" Margin="20,80,20,20"
19+
VerticalOptions="EndAndExpand"
20+
HorizontalOptions="Center" Margin="20,0,20,40"
1921
Source="history" />
2022
<views:LoginEntryView BindingContext="{Binding EmailEntryViewModel}" />
2123
<views:LoginEntryView BindingContext="{Binding PasswordEntryViewModel}" />
24+
25+
<buttons:BindableButton BackgroundColor="Transparent"
26+
TextColor="White" FontFamily="Nunito-Regular"
27+
BindingContext="{Binding ForgotPasswordModel}"
28+
HorizontalOptions="End" WidthRequest="140" />
29+
<buttons:BindableButton BindingContext="{Binding LogInModel}" />
30+
<buttons:BindableButton BindingContext="{Binding UsePhoneModel}"
31+
BackgroundColor="Transparent" TextColor="White"
32+
VerticalOptions="StartAndExpand" />
2233
</StackLayout>
2334
</Grid>
2435
</ContentPage.Content>
Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<Button xmlns="http://xamarin.com/schemas/2014/forms"
3-
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
4-
xmlns:d="http://xamarin.com/schemas/2014/forms/design"
5-
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6-
mc:Ignorable="d"
7-
Text="{Binding Text}"
8-
IsVisible="{Binding IsVisible}"
9-
IsEnabled="{Binding IsEnabled}"
10-
Command="{Binding Command}"
11-
x:Class="TimeTrackerTutorial.Views.Buttons.BindableButton" />
2+
<Button xmlns="http://xamarin.com/schemas/2014/forms"
3+
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
4+
xmlns:d="http://xamarin.com/schemas/2014/forms/design"
5+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6+
mc:Ignorable="d" FontFamily="Nunito-ExtraBold" BackgroundColor="White"
7+
HeightRequest="50" CornerRadius="25"
8+
TextColor="{StaticResource GradientEndColor}" Text="{Binding Text}"
9+
IsVisible="{Binding IsVisible}" IsEnabled="{Binding IsEnabled}"
10+
Command="{Binding Command}" WidthRequest="220"
11+
HorizontalOptions="CenterAndExpand"
12+
x:Class="TimeTrackerTutorial.Views.Buttons.BindableButton" />

TimeTrackerTutorial/Views/LoginEntryView.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
xmlns:skViews="clr-namespace:TimeTrackerTutorial.Views.SKViews"
66
x:Class="TimeTrackerTutorial.Views.LoginEntryView">
77
<ContentView.Content>
8-
<Grid RowDefinitions="40,2">
8+
<Grid RowDefinitions="40,2" RowSpacing="0">
99
<entries:PlainEntry Placeholder="{Binding Placeholder}"
1010
PlaceholderColor="#AFFF" FontFamily="Nunito-Regular"
1111
x:Name="entInput" Text="{Binding Text}" TextColor="White"

0 commit comments

Comments
 (0)