websockets
This commit is contained in:
parent
0c7008a3fc
commit
963e2b5656
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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 = [];
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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),
|
||||
);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue