Design Pass: Profile View, Unlock Modal, Password Entry and Add Profile

This commit is contained in:
Sarah Jamie Lewis 2021-05-24 13:23:36 -07:00
parent 28ad4d0ec6
commit 53ff9351cb
7 changed files with 70 additions and 32 deletions

View File

@ -118,7 +118,9 @@ class CwtchNotifier {
break;
case "AppError":
print("New App Error: $data");
error.handleUpdate(data["Data"]);
if (data["Data"] != null) {
error.handleUpdate(data["Data"]);
}
break;
case "UpdateGlobalSettings":
settings.handleUpdate(jsonDecode(data["Data"]));

View File

@ -1364,10 +1364,14 @@ ThemeData mkThemeData(Settings opaque) {
),
elevatedButtonTheme: ElevatedButtonThemeData(
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(opaque.current().defaultButtonColor()),
foregroundColor: MaterialStateProperty.all(opaque.current().defaultButtonTextColor()),
overlayColor: MaterialStateProperty.all(opaque.current().defaultButtonActiveColor()),
padding: MaterialStateProperty.all(EdgeInsets.all(20))),
backgroundColor: MaterialStateProperty.all(opaque.current().defaultButtonColor()),
foregroundColor: MaterialStateProperty.all(opaque.current().defaultButtonTextColor()),
overlayColor: MaterialStateProperty.all(opaque.current().defaultButtonActiveColor()),
padding: MaterialStateProperty.all(EdgeInsets.all(20)),
shape: MaterialStateProperty.all(RoundedRectangleBorder(
borderRadius: BorderRadius.circular(18.0),
)),
),
),
dialogTheme: DialogTheme(
backgroundColor: opaque.current().backgroundPaneColor(),
@ -1387,5 +1391,6 @@ ThemeData mkThemeData(Settings opaque) {
caption: TextStyle(color: opaque.current().mainTextColor()),
button: TextStyle(color: opaque.current().mainTextColor()),
overline: TextStyle(color: opaque.current().mainTextColor())),
textSelectionTheme: TextSelectionThemeData(cursorColor: opaque.current().defaultButtonActiveColor()),
);
}

View File

@ -127,18 +127,8 @@ class _AddEditProfileViewState extends State<AddEditProfileView> {
Visibility(
visible: Provider.of<ProfileInfoState>(context).onion.isEmpty,
child: Row(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[
Radio(
value: false,
groupValue: usePassword,
onChanged: _handleSwitchPassword,
),
Text(
AppLocalizations.of(context).radioNoPassword,
style: TextStyle(color: theme.current().mainTextColor()),
),
Radio(
value: true,
groupValue: usePassword,
Checkbox(
value: usePassword,
onChanged: _handleSwitchPassword,
),
Text(
@ -214,10 +204,19 @@ class _AddEditProfileViewState extends State<AddEditProfileView> {
SizedBox(
height: 20,
),
ElevatedButton(
onPressed: _createPressed,
style: ElevatedButton.styleFrom(primary: theme.current().defaultButtonColor()),
child: Text(Provider.of<ProfileInfoState>(context).onion.isEmpty ? AppLocalizations.of(context).addNewProfileBtn : AppLocalizations.of(context).saveProfileBtn),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Expanded(
child: ElevatedButton(
onPressed: _createPressed,
child: Text(
Provider.of<ProfileInfoState>(context).onion.isEmpty ? AppLocalizations.of(context).addNewProfileBtn : AppLocalizations.of(context).saveProfileBtn,
textAlign: TextAlign.center,
),
),
),
],
),
Visibility(
visible: Provider.of<ProfileInfoState>(context, listen: false).onion.isNotEmpty,

View File

@ -85,7 +85,7 @@ class _ContactsViewState extends State<ContactsView> {
Widget _buildContactList() {
final tiles = Provider.of<ContactListState>(context).filteredList().map((ContactInfoState contact) {
return ChangeNotifierProvider<ContactInfoState>.value(key: ValueKey(contact.profileOnion+""+contact.onion), value: contact, builder: (_, __) => ContactRow());
return ChangeNotifierProvider<ContactInfoState>.value(key: ValueKey(contact.profileOnion + "" + contact.onion), value: contact, builder: (_, __) => ContactRow());
});
final divided = ListTile.divideTiles(
context: context,

View File

@ -132,14 +132,19 @@ class _ProfileMgrViewState extends State<ProfileMgrView> {
SizedBox(
height: 20,
),
ElevatedButton(
child: Text(AppLocalizations.of(context).unlock, semanticsLabel: AppLocalizations.of(context).unlock),
onPressed: () {
Provider.of<FlwtchState>(context, listen: false).cwtch.LoadProfiles(ctrlrPassword.value.text);
ctrlrPassword.text = "";
Navigator.pop(context);
},
),
Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [
Spacer(),
Expanded(
child: ElevatedButton(
child: Text(AppLocalizations.of(context).unlock, semanticsLabel: AppLocalizations.of(context).unlock),
onPressed: () {
Provider.of<FlwtchState>(context, listen: false).cwtch.LoadProfiles(ctrlrPassword.value.text);
ctrlrPassword.text = "";
Navigator.pop(context);
},
)),
Spacer()
]),
],
)),
));
@ -161,6 +166,14 @@ class _ProfileMgrViewState extends State<ProfileMgrView> {
tiles: tiles,
).toList();
if (tiles.isEmpty) {
return Center(
child: Text(
"Please create or unlock a profile to begin!",
textAlign: TextAlign.center,
));
}
return ListView(children: divided);
}
}

View File

@ -98,7 +98,7 @@ class _ContactRowState extends State<ContactRow> {
ChangeNotifierProvider.value(value: profile),
ChangeNotifierProvider.value(value: profile.contactList.getContact(handle)),
],
builder:(context, child) => MessageView(),
builder: (context, child) => MessageView(),
);
},
),

View File

@ -14,16 +14,35 @@ class CwtchPasswordField extends StatefulWidget {
}
class _CwtchTextFieldState extends State<CwtchPasswordField> {
bool obscureText = true;
@override
Widget build(BuildContext context) {
// todo: translations
var label = "View Password";
if (!obscureText) {
label = "Hide Password";
}
return Consumer<Settings>(builder: (context, theme, child) {
return TextFormField(
controller: widget.controller,
validator: widget.validator,
obscureText: true,
obscureText: obscureText,
enableSuggestions: false,
autocorrect: false,
decoration: InputDecoration(
suffixIcon: IconButton(
onPressed: () {
obscureText = !obscureText;
},
icon: Icon((obscureText ? Icons.remove_red_eye : Icons.remove_red_eye_outlined), semanticLabel: label),
tooltip: label,
color: theme.current().mainTextColor(),
highlightColor: theme.current().defaultButtonColor(),
focusColor: theme.current().defaultButtonActiveColor(),
splashColor: theme.current().defaultButtonActiveColor(),
),
errorStyle: TextStyle(
color: theme.current().textfieldErrorColor(),
fontWeight: FontWeight.bold,