Procházet zdrojové kódy

feat: simple status bar and identified / anonymous content split

Fela Maslen před 4 roky
rodič
revize
22c6718e40

+ 21 - 0
gmus-mobile/lib/components/content.dart

@@ -0,0 +1,21 @@
+import 'package:flutter/material.dart';
+import 'package:get/get.dart';
+import 'package:gmus_mobile/components/identify.dart';
+
+import '../controller.dart';
+
+class Content extends StatelessWidget {
+  final Controller controller = Get.find();
+  @override
+  Widget build(BuildContext context) {
+    return Obx(() {
+      var loggedIn = controller.uniqueName.value.length > 0;
+      if (!loggedIn) {
+        return Identify();
+      }
+
+      return Text("Artists and stuff here");
+    });
+  }
+}
+

+ 29 - 0
gmus-mobile/lib/components/identify.dart

@@ -0,0 +1,29 @@
+import 'package:flutter/material.dart';
+import 'package:get/get.dart';
+
+import '../controller.dart';
+import '../socket.dart' as socket;
+
+class Identify extends StatelessWidget {
+  final Controller controller = Get.find();
+  @override
+  Widget build(BuildContext context) {
+    return Column(
+      children: [
+        TextField(
+            onChanged: controller.setName,
+            decoration: InputDecoration(
+                border: InputBorder.none,
+                hintText: 'Set name',
+              ),
+        ),
+        TextButton(
+            child: Text('Connect'),
+            onPressed: () {
+              socket.connect(controller);
+            },
+        ),
+      ],
+    );
+  }
+}

+ 21 - 0
gmus-mobile/lib/components/status.dart

@@ -0,0 +1,21 @@
+import 'package:flutter/material.dart';
+import 'package:get/get.dart';
+
+import '../controller.dart';
+
+class StatusBar extends StatelessWidget {
+  final Controller controller = Get.find();
+  @override
+  Widget build(BuildContext context) {
+    return Obx(() {
+      var uniqueName = controller.uniqueName.value;
+      if (uniqueName.length == 0) {
+        return Text("Disconnected");
+      }
+
+      return Center(
+        child: Text("Connected | ${controller.uniqueName}"),
+      );
+    });
+  }
+}

+ 28 - 0
gmus-mobile/lib/controller.dart

@@ -0,0 +1,28 @@
+import 'dart:convert';
+
+import 'package:get/get.dart';
+
+class Controller extends GetxController {
+  var name = ''.obs;
+  var uniqueName = ''.obs;
+
+  setName(String newName) {
+    name.value = newName;
+  }
+  setUniqueName(String newUniqueName) {
+    uniqueName.value = newUniqueName;
+  }
+
+  onRemoteMessage(String message) {
+    var action = jsonDecode(message);
+    switch (action['type']) {
+      case 'CLIENT_LIST_UPDATED':
+        print("Client list updated: ${action['payload']}");
+        break;
+
+      case 'STATE_SET':
+        print("State set (remote): ${action['payload']}");
+        break;
+    }
+  }
+}

+ 6 - 23
gmus-mobile/lib/main.dart

@@ -3,21 +3,16 @@ import 'dart:io';
 import 'package:flutter_dotenv/flutter_dotenv.dart' as DotEnv;
 import 'package:flutter/material.dart';
 import 'package:get/get.dart';
+import 'package:gmus_mobile/components/content.dart';
+import 'package:gmus_mobile/components/status.dart';
 
 import 'config.dart';
-import 'socket.dart' as socket;
-
-class Controller extends GetxController {
-  var name = ''.obs;
-  setName(String newName) {
-    name.value = newName;
-  }
-}
+import 'controller.dart';
 
 class Gmus extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
-    final Controller controller = Get.put(Controller());
+    Get.put(Controller());
 
     return Scaffold(
       appBar: AppBar(
@@ -26,20 +21,8 @@ class Gmus extends StatelessWidget {
       body: Container(
           child: Column(
               children: [
-                Obx(() => Text("Name: ${controller.name}")),
-                TextField(
-                    onChanged: controller.setName,
-                    decoration: InputDecoration(
-                        border: InputBorder.none,
-                        hintText: 'Set name',
-                      ),
-                ),
-                TextButton(
-                    child: Text('Connect'),
-                    onPressed: () {
-                      socket.connect(controller.name.value);
-                    },
-                ),
+                Content(),
+                StatusBar(),
               ],
           ),
         ),

+ 11 - 6
gmus-mobile/lib/socket.dart

@@ -2,10 +2,9 @@ import 'dart:convert';
 
 import 'package:nanoid/nanoid.dart';
 import 'package:web_socket_channel/io.dart';
-import 'package:web_socket_channel/web_socket_channel.dart';
-import 'package:web_socket_channel/status.dart' as status;
 
-import 'config.dart';
+import './config.dart';
+import './controller.dart';
 
 String getApiUrlWithProtocol() {
   final String baseUrl = config['apiUrl'];
@@ -37,8 +36,14 @@ Future keepalive(IOWebSocketChannel channel) {
   });
 }
 
-void connect(String name) async {
-  final String uniqueName = getUniqueName(name);
+void connect(Controller controller) async {
+  if (controller.name.value.length == 0) {
+    return;
+  }
+
+  final String uniqueName = getUniqueName(controller.name.value);
+  controller.setUniqueName(uniqueName);
+
   final String webSocketUrl = getWebSocketUrl();
   final String pubsubUrl = "$webSocketUrl?client-name=$uniqueName";
 
@@ -47,7 +52,7 @@ void connect(String name) async {
   var channel = IOWebSocketChannel.connect(Uri.parse(pubsubUrl));
 
   channel.stream.listen((message) {
-    print("Received message: $message");
+    controller.onRemoteMessage(message);
   });
 
   keepalive(channel);