aboutsummaryrefslogtreecommitdiffstats
path: root/lib/presentation/screens/settings/settings_screens/profiles
diff options
context:
space:
mode:
Diffstat (limited to 'lib/presentation/screens/settings/settings_screens/profiles')
-rw-r--r--lib/presentation/screens/settings/settings_screens/profiles/profiles_screen.dart20
-rw-r--r--lib/presentation/screens/settings/settings_screens/profiles/widgets/new_profile_screen.dart252
-rw-r--r--lib/presentation/screens/settings/settings_screens/profiles/widgets/profiles_content.dart125
3 files changed, 397 insertions, 0 deletions
diff --git a/lib/presentation/screens/settings/settings_screens/profiles/profiles_screen.dart b/lib/presentation/screens/settings/settings_screens/profiles/profiles_screen.dart
new file mode 100644
index 0000000..cd831b1
--- /dev/null
+++ b/lib/presentation/screens/settings/settings_screens/profiles/profiles_screen.dart
@@ -0,0 +1,20 @@
+import 'package:flutter_ics_homescreen/export.dart';
+
+import 'widgets/profiles_content.dart';
+
+class ProfilesPage extends StatelessWidget {
+ const ProfilesPage({super.key});
+
+ static Page<void> page() => const MaterialPage<void>(child: ProfilesPage());
+ @override
+ Widget build(BuildContext context) {
+ return const Scaffold(
+ body: Stack(
+ children: [
+ ProfilesContent(),
+ ],
+ ),
+ );
+ }
+}
+
diff --git a/lib/presentation/screens/settings/settings_screens/profiles/widgets/new_profile_screen.dart b/lib/presentation/screens/settings/settings_screens/profiles/widgets/new_profile_screen.dart
new file mode 100644
index 0000000..0cf1ddb
--- /dev/null
+++ b/lib/presentation/screens/settings/settings_screens/profiles/widgets/new_profile_screen.dart
@@ -0,0 +1,252 @@
+import 'package:new_virtual_keyboard/virtual_keyboard.dart';
+import 'package:flutter_ics_homescreen/export.dart';
+
+class NewProfilePage extends ConsumerStatefulWidget {
+ const NewProfilePage({super.key});
+
+ static Page<void> page() => const MaterialPage<void>(child: NewProfilePage());
+
+ @override
+ NewProfilePageState createState() => NewProfilePageState();
+}
+
+class NewProfilePageState extends ConsumerState<NewProfilePage> {
+ final _controller = TextEditingController();
+ final _formKey = GlobalKey<FormState>();
+ bool shiftEnabled = false;
+
+ int chars = 0;
+ @override
+ void initState() {
+ super.initState();
+ }
+
+ _onKeyPress(VirtualKeyboardKey key) {
+ String text = _controller.text;
+ if (key.keyType == VirtualKeyboardKeyType.String) {
+ text = text + (shiftEnabled ? key.capsText : key.text)!;
+ } else if (key.keyType == VirtualKeyboardKeyType.Action) {
+ switch (key.action) {
+ case VirtualKeyboardKeyAction.Backspace:
+ if (text.isEmpty) return;
+ text = text.substring(0, text.length - 1);
+ break;
+ case VirtualKeyboardKeyAction.Return:
+ text = '$text\n';
+ break;
+ case VirtualKeyboardKeyAction.Space:
+ text = text + key.text!;
+ break;
+ case VirtualKeyboardKeyAction.Shift:
+ shiftEnabled = !shiftEnabled;
+ break;
+ default:
+ }
+ }
+
+// Update the screen
+ if (text.length >= 25) {
+ _controller.text = text.substring(0, 25);
+ } else {
+ _controller.text = text;
+ }
+
+ updateMaxChar(_controller.text.length);
+ }
+
+ void showKeyboard() {
+ var ctx = homeScaffoldKey.currentContext;
+ showModalBottomSheet(
+ elevation: 0.0,
+ backgroundColor: Colors.transparent,
+ barrierColor: Colors.transparent,
+ context: ctx!,
+ builder: (ctx) {
+ return Container(
+ height: 479,
+ width: 1080,
+ decoration: const BoxDecoration(
+ color: AGLDemoColors.resolutionBlueColor,
+ border: Border(
+ top: BorderSide(
+ color: Color(0xFF295EF7),
+ width: 1,
+ )),
+ ),
+ child: VirtualKeyboard(
+ height: 478,
+ textColor: AGLDemoColors.periwinkleColor,
+ fontSize: 40,
+ // [A-Z, 0-9]
+ type: VirtualKeyboardType.Alphanumeric,
+ // Callback for key press event
+ onKeyPress: (key) {
+ _onKeyPress(key);
+ },
+ ),
+ );
+ },
+ );
+ }
+
+ @override
+ void didChangeDependencies() async {
+ Future.delayed(const Duration(seconds: 0), () {
+ showKeyboard();
+ });
+ super.didChangeDependencies();
+ }
+
+ @override
+ void dispose() {
+ _controller.dispose();
+ super.dispose();
+ }
+
+ void updateMaxChar(int charsCount) {
+ setState(() {
+ chars = charsCount;
+ });
+ }
+
+ void addUser() {
+ ref.read(usersProvider.notifier).addUser(_controller.text);
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ body: Form(
+ key: _formKey,
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ CommonTitle(
+ title: 'New Profile',
+ hasBackButton: true,
+ onPressed: () {
+ context.flow<AppState>().update((state) => AppState.profiles);
+ },
+ ),
+ Expanded(
+ child: Padding(
+ padding:
+ const EdgeInsets.symmetric(vertical: 50, horizontal: 144),
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.start,
+ children: [
+ Text(
+ 'Profile Name',
+ style: Theme.of(context)
+ .textTheme
+ .bodyMedium!
+ .copyWith(fontSize: 40),
+ ),
+ const SizedBox(
+ height: 20,
+ ),
+ Container(
+ decoration: const BoxDecoration(
+ gradient: LinearGradient(
+ begin: Alignment.centerLeft,
+ end: Alignment.centerRight,
+ stops: [0, 0.5, 1],
+ colors: <Color>[
+ Colors.black12,
+ Colors.black,
+ Colors.black12
+ ],
+ ),
+ ),
+ child: Column(
+ children: [
+ Container(
+ height: 140,
+ padding: const EdgeInsets.only(top: 30),
+ child: TextFormField(
+ onTap: () {
+ showKeyboard();
+ },
+ controller: _controller,
+ autofocus: true,
+ maxLength: 25,
+ validator: (value) {
+ if (value == null || value.isEmpty) {
+ return 'Please enter some text';
+ }
+ return null;
+ },
+ //maxLengthEnforcement: MaxLengthEnforcement.none,
+ onChanged: (value) {
+ if (_controller.text.length <= 1) {
+ if (_formKey.currentState!.validate()) {}
+ _formKey.currentState!.save();
+ }
+ updateMaxChar(_controller.text.length);
+ },
+ decoration: const InputDecoration(
+ border: InputBorder.none,
+ counterText: '',
+ ),
+ textAlign: TextAlign.center,
+ textDirection: TextDirection.rtl,
+ style: const TextStyle(fontSize: 60),
+ ),
+ ),
+ Container(
+ decoration: const BoxDecoration(
+ gradient: LinearGradient(
+ begin: Alignment.centerLeft,
+ end: Alignment.centerRight,
+ stops: [0, 0.2, 0.8, 1],
+ colors: <Color>[
+ Colors.transparent,
+ AGLDemoColors.neonBlueColor,
+ AGLDemoColors.neonBlueColor,
+ Colors.transparent,
+ ],
+ ),
+ ),
+ height: 2,
+ )
+ ],
+ ),
+ ),
+ const SizedBox(
+ height: 20,
+ ),
+ Center(
+ child: Text('$chars/25 Characters',
+ style: const TextStyle(fontSize: 26)),
+ ),
+ ],
+ ),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsets.only(bottom: 350.0),
+ child: GenericButton(
+ heigth: 130,
+ width: 493,
+ text: 'Save Profile',
+ onTap: () {
+ if (_formKey.currentState!.validate()) {
+ addUser();
+ context
+ .flow<AppState>()
+ .update((state) => AppState.profiles);
+ }
+ },
+ ),
+
+ ),
+ Padding(
+ padding: const EdgeInsets.only(bottom: 150.0),
+ child: Container(),
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/presentation/screens/settings/settings_screens/profiles/widgets/profiles_content.dart b/lib/presentation/screens/settings/settings_screens/profiles/widgets/profiles_content.dart
new file mode 100644
index 0000000..eb89553
--- /dev/null
+++ b/lib/presentation/screens/settings/settings_screens/profiles/widgets/profiles_content.dart
@@ -0,0 +1,125 @@
+import '../../../../../../data/models/user.dart';
+import '../../../../../../export.dart';
+
+class ProfilesContent extends ConsumerStatefulWidget {
+ const ProfilesContent({super.key});
+
+ @override
+ ProfilesContentState createState() => ProfilesContentState();
+}
+
+class ProfilesContentState extends ConsumerState<ProfilesContent> {
+ late User currentUser;
+
+ void setCurrentUser(String userId) {
+ setState(() {
+ ref.read(usersProvider.notifier).selectUser(userId);
+ });
+ }
+
+ void removeUser(String userId) {
+ setState(() {
+ ref.read(usersProvider.notifier).removeUser(userId);
+ });
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ var users = ref.watch(usersProvider.select((users) => users));
+ final currentUser = users.selectedUser;
+ final usersList = users.users;
+ return Column(
+ crossAxisAlignment: CrossAxisAlignment.stretch,
+ children: [
+ CommonTitle(
+ title: "Profiles",
+ hasBackButton: true,
+ onPressed: () {
+ context.flow<AppState>().update((state) => AppState.settings);
+ },
+ ),
+ Expanded(
+ child: ListView.separated(
+ padding: const EdgeInsets.symmetric(vertical: 50, horizontal: 144),
+ itemCount: usersList.length,
+ separatorBuilder: (context, index) {
+ return const SizedBox(
+ height: 8,
+ );
+ },
+ itemBuilder: (context, index) {
+ return Container(
+ height: 130,
+ decoration: BoxDecoration(
+ gradient: LinearGradient(
+ begin: Alignment.centerLeft,
+ end: Alignment.centerRight,
+ stops: currentUser == usersList[index]
+ ? [0, 0.01, 0.8]
+ : [0.1, 1],
+ colors: currentUser == usersList[index]
+ ? <Color>[
+ Colors.white,
+ Colors.blue,
+ const Color.fromARGB(16, 41, 98, 255)
+ ]
+ : <Color>[Colors.black, Colors.black12]),
+ ),
+ child: ListTile(
+ minVerticalPadding: 0.0,
+ contentPadding: const EdgeInsets.symmetric(
+ horizontal: 16.0, vertical: 40.0),
+ leading: Text(users.users[index].name,
+ style: const TextStyle(fontSize: 40)),
+ //title: Text(widget.title),
+ //enabled: isSwitchOn,
+ trailing: IconButton(
+ padding: EdgeInsets.zero,
+ onPressed: () {
+ removeUser(users.users[index].id);
+ },
+ icon: const Icon(
+ Icons.close,
+ color: AGLDemoColors.periwinkleColor,
+ size: 48,
+ ),
+ ),
+
+ onTap: () {
+ setCurrentUser(usersList[index].id);
+ },
+ ),
+ );
+ },
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsets.only(bottom: 150.0),
+ child: Column(
+ children: [
+ GenericButton(
+ heigth: 122,
+ width: 317,
+ text: 'New Profile',
+ onTap: () {
+ context
+ .flow<AppState>()
+ .update((state) => AppState.newProfile);
+ },
+ ),
+
+ const SizedBox(height: 20),
+ GenericButton(
+ heigth: 122,
+ width: 412,
+ text: 'Reset to Default',
+ onTap: () {},
+ ),
+ ],
+ ),
+ ),
+ ],
+ );
+ }
+}
+