ui: Migrate AddContactPage to Redux
This commit is contained in:
parent
3396a36b47
commit
a88ceb7897
@ -6,7 +6,7 @@ import 'ui/pages/newconversation.dart';
|
|||||||
import 'ui/pages/login/login.dart';
|
import 'ui/pages/login/login.dart';
|
||||||
import 'ui/pages/register.dart';
|
import 'ui/pages/register.dart';
|
||||||
import 'ui/pages/intro.dart';
|
import 'ui/pages/intro.dart';
|
||||||
import 'ui/pages/addcontact.dart';
|
import 'ui/pages/addcontact/addcontact.dart';
|
||||||
import 'repositories/roster.dart';
|
import 'repositories/roster.dart';
|
||||||
|
|
||||||
import 'package:flutter_redux/flutter_redux.dart';
|
import 'package:flutter_redux/flutter_redux.dart';
|
||||||
|
5
lib/redux/addcontact/actions.dart
Normal file
5
lib/redux/addcontact/actions.dart
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
class AddContactAction {
|
||||||
|
final String jid;
|
||||||
|
|
||||||
|
AddContactAction({ required this.jid });
|
||||||
|
}
|
10
lib/redux/addcontact/reducers.dart
Normal file
10
lib/redux/addcontact/reducers.dart
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import "package:moxxyv2/ui/pages/addcontact/state.dart";
|
||||||
|
import "package:moxxyv2/redux/addcontact/actions.dart";
|
||||||
|
|
||||||
|
AddContactPageState addContactPageReducer(AddContactPageState state, dynamic action) {
|
||||||
|
if (action is AddContactAction) {
|
||||||
|
return state.copyWith(doingWork: true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return state;
|
||||||
|
}
|
@ -2,8 +2,10 @@ import "dart:collection";
|
|||||||
import "package:moxxyv2/redux/conversation/reducers.dart";
|
import "package:moxxyv2/redux/conversation/reducers.dart";
|
||||||
import "package:moxxyv2/redux/conversations/reducers.dart";
|
import "package:moxxyv2/redux/conversations/reducers.dart";
|
||||||
import "package:moxxyv2/redux/login/reducers.dart";
|
import "package:moxxyv2/redux/login/reducers.dart";
|
||||||
|
import "package:moxxyv2/redux/addcontact/reducers.dart";
|
||||||
import "package:moxxyv2/ui/pages/login/state.dart";
|
import "package:moxxyv2/ui/pages/login/state.dart";
|
||||||
import "package:moxxyv2/ui/pages/conversation/state.dart";
|
import "package:moxxyv2/ui/pages/conversation/state.dart";
|
||||||
|
import "package:moxxyv2/ui/pages/addcontact/state.dart";
|
||||||
import "package:moxxyv2/models/message.dart";
|
import "package:moxxyv2/models/message.dart";
|
||||||
import "package:moxxyv2/models/conversation.dart";
|
import "package:moxxyv2/models/conversation.dart";
|
||||||
|
|
||||||
@ -12,7 +14,8 @@ MoxxyState moxxyReducer(MoxxyState state, dynamic action) {
|
|||||||
messages: messageReducer(state.messages, action),
|
messages: messageReducer(state.messages, action),
|
||||||
conversations: conversationReducer(state.conversations, action),
|
conversations: conversationReducer(state.conversations, action),
|
||||||
loginPageState: loginReducer(state.loginPageState, action),
|
loginPageState: loginReducer(state.loginPageState, action),
|
||||||
conversationPageState: conversationPageReducer(state.conversationPageState, action)
|
conversationPageState: conversationPageReducer(state.conversationPageState, action),
|
||||||
|
addContactPageState: addContactPageReducer(state.addContactPageState, action)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -21,7 +24,8 @@ class MoxxyState {
|
|||||||
final List<Conversation> conversations;
|
final List<Conversation> conversations;
|
||||||
final LoginPageState loginPageState;
|
final LoginPageState loginPageState;
|
||||||
final ConversationPageState conversationPageState;
|
final ConversationPageState conversationPageState;
|
||||||
|
final AddContactPageState addContactPageState;
|
||||||
|
|
||||||
const MoxxyState({ required this.messages, required this.conversations, required this.loginPageState, required this.conversationPageState });
|
const MoxxyState({ required this.messages, required this.conversations, required this.loginPageState, required this.conversationPageState, required this.addContactPageState });
|
||||||
MoxxyState.initialState() : messages = HashMap(), conversations = List.empty(growable: true), loginPageState = LoginPageState(doingWork: false, showPassword: false), conversationPageState = ConversationPageState(showSendButton: false);
|
MoxxyState.initialState() : messages = HashMap(), conversations = List.empty(growable: true), loginPageState = LoginPageState(doingWork: false, showPassword: false), conversationPageState = ConversationPageState(showSendButton: false), addContactPageState = AddContactPageState(doingWork: false);
|
||||||
}
|
}
|
||||||
|
@ -1,104 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:moxxyv2/ui/widgets/topbar.dart';
|
|
||||||
|
|
||||||
class AddContactPage extends StatefulWidget {
|
|
||||||
const AddContactPage({ Key? key }) : super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
_AddContactPageState createState() => _AddContactPageState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _AddContactPageState extends State<AddContactPage> {
|
|
||||||
bool _doingWork = false;
|
|
||||||
|
|
||||||
void _addToRoster(BuildContext context) {
|
|
||||||
setState(() {
|
|
||||||
this._doingWork = true;
|
|
||||||
});
|
|
||||||
Future.delayed(
|
|
||||||
Duration(seconds: 3),
|
|
||||||
() {
|
|
||||||
Navigator.pushNamedAndRemoveUntil(
|
|
||||||
context,
|
|
||||||
"/conversation",
|
|
||||||
ModalRoute.withName("/conversations"));
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Scaffold(
|
|
||||||
appBar: PreferredSize(
|
|
||||||
preferredSize: Size.fromHeight(60),
|
|
||||||
child: BorderlessTopbar(
|
|
||||||
children: [
|
|
||||||
BackButton(),
|
|
||||||
Text(
|
|
||||||
"Add new contact",
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 19
|
|
||||||
)
|
|
||||||
)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
),
|
|
||||||
// TODO: The TextFields look a bit too smal
|
|
||||||
// TODO: Hide the LinearProgressIndicator if we're not doing anything
|
|
||||||
// TODO: Disable the inputs and the BackButton if we're working on loggin in
|
|
||||||
body: Column(
|
|
||||||
children: [
|
|
||||||
Visibility(
|
|
||||||
visible: this._doingWork,
|
|
||||||
child: LinearProgressIndicator(value: null)
|
|
||||||
),
|
|
||||||
|
|
||||||
Padding(
|
|
||||||
padding: EdgeInsets.only(top: 8.0, left: 16.0, right: 16.0),
|
|
||||||
child: Container(
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
borderRadius: BorderRadius.circular(15),
|
|
||||||
border: Border.all(
|
|
||||||
width: 1,
|
|
||||||
color: Colors.purple
|
|
||||||
)
|
|
||||||
),
|
|
||||||
child: TextField(
|
|
||||||
maxLines: 1,
|
|
||||||
enabled: !this._doingWork,
|
|
||||||
decoration: InputDecoration(
|
|
||||||
labelText: "XMPP-Address",
|
|
||||||
border: InputBorder.none,
|
|
||||||
contentPadding: EdgeInsets.only(top: 4.0, bottom: 4.0, left: 8.0, right: 8.0),
|
|
||||||
suffixIcon: Padding(
|
|
||||||
padding: EdgeInsetsDirectional.only(end: 6.0),
|
|
||||||
child: Icon(Icons.qr_code)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
Padding(
|
|
||||||
padding: EdgeInsets.all(16.0),
|
|
||||||
child: Text("You can add a contact either by typing in their XMPP address or by scanning their QR code")
|
|
||||||
),
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
child: Padding(
|
|
||||||
padding: EdgeInsets.all(16.0),
|
|
||||||
child: ElevatedButton(
|
|
||||||
child: Text("Add to contacts"),
|
|
||||||
// TODO: Add to roster and open a chat
|
|
||||||
onPressed: this._doingWork ? null : () => _addToRoster(context)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
116
lib/ui/pages/addcontact/addcontact.dart
Normal file
116
lib/ui/pages/addcontact/addcontact.dart
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:moxxyv2/ui/widgets/topbar.dart';
|
||||||
|
import 'package:moxxyv2/redux/state.dart';
|
||||||
|
import 'package:moxxyv2/redux/addcontact/actions.dart';
|
||||||
|
|
||||||
|
import 'package:flutter_redux/flutter_redux.dart';
|
||||||
|
import 'package:redux/redux.dart';
|
||||||
|
|
||||||
|
class _AddContactPageViewModel {
|
||||||
|
final bool doingWork;
|
||||||
|
final void Function(String jid) addContact;
|
||||||
|
|
||||||
|
_AddContactPageViewModel({ required this.addContact, required this.doingWork});
|
||||||
|
}
|
||||||
|
|
||||||
|
class AddContactPage extends StatelessWidget {TextEditingController controller = TextEditingController();
|
||||||
|
|
||||||
|
void _addToRoster(BuildContext context, _AddContactPageViewModel viewModel) {
|
||||||
|
viewModel.addContact(this.controller.text);
|
||||||
|
|
||||||
|
// TODO: Remove
|
||||||
|
// TODO: Redirect to a new conversation with the new contact
|
||||||
|
Future.delayed(
|
||||||
|
Duration(seconds: 3),
|
||||||
|
() {
|
||||||
|
Navigator.pushNamedAndRemoveUntil(
|
||||||
|
context,
|
||||||
|
"/conversations",
|
||||||
|
(route) => false);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return StoreConnector<MoxxyState, _AddContactPageViewModel>(
|
||||||
|
converter: (store) => _AddContactPageViewModel(
|
||||||
|
doingWork: store.state.addContactPageState.doingWork,
|
||||||
|
addContact: (jid) => store.dispatch(AddContactAction(jid: jid))
|
||||||
|
),
|
||||||
|
builder: (context, viewModel) => Scaffold(
|
||||||
|
appBar: PreferredSize(
|
||||||
|
preferredSize: Size.fromHeight(60),
|
||||||
|
child: BorderlessTopbar(
|
||||||
|
children: [
|
||||||
|
BackButton(),
|
||||||
|
Text(
|
||||||
|
"Add new contact",
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 19
|
||||||
|
)
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
),
|
||||||
|
// TODO: The TextFields look a bit too smal
|
||||||
|
// TODO: Hide the LinearProgressIndicator if we're not doing anything
|
||||||
|
// TODO: Disable the inputs and the BackButton if we're working on loggin in
|
||||||
|
body: Column(
|
||||||
|
children: [
|
||||||
|
Visibility(
|
||||||
|
visible: viewModel.doingWork,
|
||||||
|
child: LinearProgressIndicator(value: null)
|
||||||
|
),
|
||||||
|
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.only(top: 8.0, left: 16.0, right: 16.0),
|
||||||
|
child: Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.circular(15),
|
||||||
|
border: Border.all(
|
||||||
|
width: 1,
|
||||||
|
color: Colors.purple
|
||||||
|
)
|
||||||
|
),
|
||||||
|
child: TextField(
|
||||||
|
maxLines: 1,
|
||||||
|
enabled: !viewModel.doingWork,
|
||||||
|
controller: this.controller,
|
||||||
|
decoration: InputDecoration(
|
||||||
|
labelText: "XMPP-Address",
|
||||||
|
border: InputBorder.none,
|
||||||
|
contentPadding: EdgeInsets.only(top: 4.0, bottom: 4.0, left: 8.0, right: 8.0),
|
||||||
|
suffixIcon: Padding(
|
||||||
|
padding: EdgeInsetsDirectional.only(end: 6.0),
|
||||||
|
child: Icon(Icons.qr_code)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.all(16.0),
|
||||||
|
child: Text("You can add a contact either by typing in their XMPP address or by scanning their QR code")
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Padding(
|
||||||
|
padding: EdgeInsets.all(16.0),
|
||||||
|
child: ElevatedButton(
|
||||||
|
child: Text("Add to contacts"),
|
||||||
|
// TODO: Add to roster and open a chat
|
||||||
|
onPressed: viewModel.doingWork ? null : () => _addToRoster(context, viewModel)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
11
lib/ui/pages/addcontact/state.dart
Normal file
11
lib/ui/pages/addcontact/state.dart
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
class AddContactPageState {
|
||||||
|
final bool doingWork;
|
||||||
|
|
||||||
|
AddContactPageState({ required this.doingWork });
|
||||||
|
|
||||||
|
AddContactPageState copyWith({ bool? doingWork }) {
|
||||||
|
return AddContactPageState(
|
||||||
|
doingWork: doingWork ?? this.doingWork
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user