websockets

This commit is contained in:
zoe 2022-08-15 15:08:37 +02:00
parent 0c7008a3fc
commit 963e2b5656
7 changed files with 85 additions and 12 deletions

View File

@ -103,6 +103,10 @@ Future<bool> saveIdentity(
Uri.https(baseurl, "/api/v1/accounts/verify_credentials"),
headers: headers,
);
final instanceResponse = await http.get(
Uri.https(baseurl, "/api/v1/instance"),
headers: headers,
);
if (response.statusCode == 200) {
final account = AccountModel.fromJson(jsonDecode(response.body));
await global.settings!.addNewIdentity("${account.acct}@$baseurl");
@ -114,6 +118,11 @@ Future<bool> saveIdentity(
.saveInstanceUrl(baseurl);
await global.settings!.identities["${account.acct}@$baseurl"]!
.saveToken(token);
if (instanceResponse.statusCode == 200) {
await global.settings!.identities["${account.acct}@$baseurl"]!
.saveWebsocketUrl(
jsonDecode(instanceResponse.body)["urls"]["streaming_api"]);
}
}
return true;

View File

@ -1,11 +1,14 @@
import 'package:flutter/painting.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../business_logic/auth/oauth.dart' as oauth;
import './websocket.dart' as websocket;
class AccountSettings {
final String identity;
late String instanceUrl;
static const String instanceUrlKey = "instance-url";
late String webSocketUrl = "";
static const String webSocketUrlKey = "web-socket";
late String authCode;
static const String authCodeKey = "authcode";
late String clientSecret;
@ -30,6 +33,8 @@ class AccountSettings {
settings.instanceUrl =
settings.prefs.getString("${settings.identity}.$instanceUrlKey") ??
"example.com";
settings.webSocketUrl =
settings.prefs.getString("${settings.identity}.$webSocketUrlKey") ?? "";
settings.authCode =
settings.prefs.getString("${settings.identity}.$authCodeKey") ?? "";
return settings;
@ -37,12 +42,25 @@ class AccountSettings {
Future<void> delete() async {
await prefs.remove("$identity.$instanceUrlKey");
await prefs.remove("$identity.$webSocketUrlKey");
await prefs.remove("$identity.$authCodeKey");
await prefs.remove("$identity.$clientSecretKey");
await prefs.remove("$identity.$clientIdKey");
await prefs.remove("$identity.$tokenKey");
}
Future<bool> saveWebsocketUrl(String url) async {
webSocketUrl = url;
print(webSocketUrl);
var p = await prefs.setString("$identity.$webSocketUrlKey", url);
websocket.reloadWebsockets();
return p;
}
Map<String, String> getAuthHeaders() {
return {"Authorization": "Bearer $token"};
}
Future<bool> saveInstanceUrl(String url) async {
instanceUrl = url;
return await prefs.setString("$identity.$instanceUrlKey", url);
@ -130,8 +148,8 @@ class Settings {
});
a.add(key);
identities.addAll({key: await AccountSettings.create(key)});
return prefs.setStringList(identitiesKey, a);
var p = await prefs.setStringList(identitiesKey, a);
return p;
}
Future<bool> saveLocale(String locale) async {
@ -141,7 +159,8 @@ class Settings {
Future<bool> saveActiveIdentity(String identity) {
activeIdentity = identity;
return prefs.setString(activeIdentityKey, identity);
var p = prefs.setString(activeIdentityKey, identity);
return p;
}
Future<bool> saveBatchSize(int size) async {
@ -155,9 +174,12 @@ class Settings {
if (identities.isNotEmpty) {
await saveActiveIdentity(identities.keys.first);
}
return await prefs.setStringList(
var p = await prefs.setStringList(
identitiesKey,
identities.keys.toList(),
);
print("removing identity");
websocket.reloadWebsockets();
return p;
}
}

View File

@ -1,4 +1,35 @@
import 'package:web_socket_channel/web_socket_channel.dart';
import 'package:web_socket_channel/io.dart';
import '../global.dart' as global;
WebSocketChannel? channel;
IOWebSocketChannel? channel;
bool connected = false;
Map<String, IOWebSocketChannel> map = {};
Future<void> reloadWebsockets() async {
closeSockets();
for (int i = 0; i < global.settings!.identities.length; i++) {
final idName = global.settings!.identities.keys.toList()[i];
final id = global.settings!.identities[idName]!;
final uri = Uri.parse(
"${id.webSocketUrl}/api/v1/streaming",
);
Map<String, String> headers = id.getAuthHeaders();
headers.addAll(global.defaultHeaders);
map.addAll(
{
idName: IOWebSocketChannel.connect(
uri,
headers: headers,
),
},
);
}
}
void closeSockets() {
for (int i = 0; i < map.length; i++) {
String key = map.keys.toList()[i];
map[key]!.sink.close();
}
}

View File

@ -1,5 +1,6 @@
import 'package:flutter/painting.dart';
import 'package:flutter/material.dart';
import 'package:loris/business_logic/settings.dart';
import './pages/timeline/timeline.dart' as tl;
const String name = "loris";
const String version = "v0.1 'is this thing on'";
@ -7,6 +8,8 @@ const String useragent = "$name/$version";
const String website = "https://git.kittycat.homes/zoe/loris";
const String legalese = "todo";
final GlobalKey<tl.TimelineState> tlKey = GlobalKey<tl.TimelineState>();
const Map<String, String> defaultHeaders = {
"User-Agent": useragent,
"accept": "application/json",

View File

@ -7,11 +7,10 @@ import '../../global.dart' as global;
class Timeline extends StatefulWidget {
const Timeline({Key? key}) : super(key: key);
@override
State<Timeline> createState() => _TimelineState();
State<Timeline> createState() => TimelineState();
}
class _TimelineState extends State<Timeline>
with AutomaticKeepAliveClientMixin {
class TimelineState extends State<Timeline> with AutomaticKeepAliveClientMixin {
String? oldestId;
final controller = ScrollController();
List<Widget> children = [];

View File

@ -5,6 +5,8 @@ import 'package:loris/pages/chat/chat.dart';
import 'package:loris/pages/notifications/notifications.dart';
import 'package:loris/pages/timeline/timeline.dart';
import 'package:loris/pages/settings/settings.dart';
import '../global.dart' as global;
import '../business_logic/websocket.dart' as websocket;
class MainScaffold extends StatefulWidget {
const MainScaffold({Key? key}) : super(key: key);
@ -18,9 +20,11 @@ class _MainScaffoldState extends State<MainScaffold> {
@override
Widget build(BuildContext context) {
// websocket.connect();
websocket.reloadWebsockets();
final screens = [
const Timeline(),
Timeline(
key: global.tlKey,
),
chat(context),
notifications(context),
settings(context),

View File

@ -124,6 +124,11 @@ ThemeData getTheme(CustomColors colors) {
color: colors.colorScheme.primary,
),
),
canvasColor: colors.colorScheme.surface,
dialogBackgroundColor: colors.colorScheme.surface,
selectedRowColor: colors.colorScheme.background,
textSelectionTheme:
TextSelectionThemeData(selectionColor: colors.hintColor),
);
}