Created project base structure, state management, router and login
This commit is contained in:
21
lib/providers/api_client_provider.dart
Normal file
21
lib/providers/api_client_provider.dart
Normal file
@@ -0,0 +1,21 @@
|
||||
import 'package:my_linkding/providers/server_instances_provider.dart';
|
||||
import 'package:my_linkding/services/api_client.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
|
||||
part 'api_client_provider.g.dart';
|
||||
|
||||
@Riverpod(keepAlive: true)
|
||||
class ApiClientProvider extends _$ApiClientProvider {
|
||||
@override
|
||||
ApiClient? build() {
|
||||
final savedInstances = ref.watch(serverInstancesProvider);
|
||||
if (savedInstances.isNotEmpty) {
|
||||
return ApiClient(serverInstance: savedInstances[0]);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
void setApiClient(ApiClient client) {
|
||||
state = client;
|
||||
}
|
||||
}
|
||||
26
lib/providers/api_client_provider.g.dart
Normal file
26
lib/providers/api_client_provider.g.dart
Normal file
@@ -0,0 +1,26 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'api_client_provider.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$apiClientProviderHash() => r'eff6aeacbfe369f2204d77f4884cc9d78ecf1e27';
|
||||
|
||||
/// See also [ApiClientProvider].
|
||||
@ProviderFor(ApiClientProvider)
|
||||
final apiClientProviderProvider =
|
||||
NotifierProvider<ApiClientProvider, ApiClient?>.internal(
|
||||
ApiClientProvider.new,
|
||||
name: r'apiClientProviderProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$apiClientProviderHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef _$ApiClientProvider = Notifier<ApiClient?>;
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
|
||||
18
lib/providers/app_status_provider.dart
Normal file
18
lib/providers/app_status_provider.dart
Normal file
@@ -0,0 +1,18 @@
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
|
||||
import 'package:my_linkding/models/app_status.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
part 'app_status_provider.g.dart';
|
||||
|
||||
@Riverpod(keepAlive: true)
|
||||
class AppStatusProvider extends _$AppStatusProvider {
|
||||
@override
|
||||
AppStatus build() {
|
||||
return AppStatus();
|
||||
}
|
||||
|
||||
void setSharedPreferencesInstance(SharedPreferences instance) {
|
||||
state = state.copyWith(sharedPreferences: instance);
|
||||
}
|
||||
}
|
||||
26
lib/providers/app_status_provider.g.dart
Normal file
26
lib/providers/app_status_provider.g.dart
Normal file
@@ -0,0 +1,26 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'app_status_provider.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$appStatusProviderHash() => r'ba585a0cf3cf46f88f5895eacec3e992bf0cd42f';
|
||||
|
||||
/// See also [AppStatusProvider].
|
||||
@ProviderFor(AppStatusProvider)
|
||||
final appStatusProviderProvider =
|
||||
NotifierProvider<AppStatusProvider, AppStatus>.internal(
|
||||
AppStatusProvider.new,
|
||||
name: r'appStatusProviderProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$appStatusProviderHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef _$AppStatusProvider = Notifier<AppStatus>;
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
|
||||
23
lib/providers/router_provider.dart
Normal file
23
lib/providers/router_provider.dart
Normal file
@@ -0,0 +1,23 @@
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:my_linkding/providers/api_client_provider.dart';
|
||||
import 'package:my_linkding/router/paths.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
|
||||
import 'package:my_linkding/router/routes.dart';
|
||||
|
||||
part 'router_provider.g.dart';
|
||||
|
||||
@Riverpod(keepAlive: true)
|
||||
GoRouter router(RouterRef ref) {
|
||||
return GoRouter(
|
||||
redirect: (context, state) {
|
||||
if (ref.watch(apiClientProviderProvider) == null) {
|
||||
return RoutesPaths.connect;
|
||||
}
|
||||
return null;
|
||||
},
|
||||
initialLocation: RoutesPaths.links,
|
||||
routes: appRoutes,
|
||||
navigatorKey: rootNavigatorKey,
|
||||
);
|
||||
}
|
||||
24
lib/providers/router_provider.g.dart
Normal file
24
lib/providers/router_provider.g.dart
Normal file
@@ -0,0 +1,24 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'router_provider.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$routerHash() => r'47e3f3d747dcb7b2543c73209f8a2f5561eb6ff7';
|
||||
|
||||
/// See also [router].
|
||||
@ProviderFor(router)
|
||||
final routerProvider = Provider<GoRouter>.internal(
|
||||
router,
|
||||
name: r'routerProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product') ? null : _$routerHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef RouterRef = ProviderRef<GoRouter>;
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
|
||||
48
lib/providers/server_instances_provider.dart
Normal file
48
lib/providers/server_instances_provider.dart
Normal file
@@ -0,0 +1,48 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:my_linkding/config/shared_preferences_keys.dart';
|
||||
import 'package:my_linkding/providers/shared_preferences_provider.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
|
||||
import 'package:my_linkding/services/api_client.dart';
|
||||
import 'package:my_linkding/providers/api_client_provider.dart';
|
||||
import 'package:my_linkding/models/server_instance.dart';
|
||||
|
||||
part 'server_instances_provider.g.dart';
|
||||
|
||||
@Riverpod(keepAlive: true)
|
||||
class ServerInstances extends _$ServerInstances {
|
||||
@override
|
||||
List<ServerInstance> build() {
|
||||
final instances = ref.watch(sharedPreferencesProvider).getStringList(SharedPreferencesKeys.serversInstances);
|
||||
|
||||
if (instances == null) return [];
|
||||
|
||||
List<ServerInstance> generatedInstances = [];
|
||||
for (final instance in instances) {
|
||||
try {
|
||||
generatedInstances.add(ServerInstance.fromJson(jsonDecode(instance)));
|
||||
} catch (_) {/* IF ERROR OMIT */}
|
||||
}
|
||||
|
||||
return generatedInstances;
|
||||
}
|
||||
|
||||
ServerInstance? getInstance(String id) {
|
||||
try {
|
||||
return state.firstWhere((instance) => instance.id == id);
|
||||
} catch (_) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
void saveNewInstance(ServerInstance instance) {
|
||||
state = [instance];
|
||||
saveServerInstances([instance]);
|
||||
}
|
||||
|
||||
void saveServerInstances(List<ServerInstance> instances) async {
|
||||
final stringList = instances.map((i) => jsonEncode(i.toJson())).toList();
|
||||
ref.read(sharedPreferencesProvider).setStringList(SharedPreferencesKeys.serversInstances, stringList);
|
||||
}
|
||||
}
|
||||
26
lib/providers/server_instances_provider.g.dart
Normal file
26
lib/providers/server_instances_provider.g.dart
Normal file
@@ -0,0 +1,26 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'server_instances_provider.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$serverInstancesHash() => r'82b7d3367afbe5c19ad0238977e5df35fac3499b';
|
||||
|
||||
/// See also [ServerInstances].
|
||||
@ProviderFor(ServerInstances)
|
||||
final serverInstancesProvider =
|
||||
NotifierProvider<ServerInstances, List<ServerInstance>>.internal(
|
||||
ServerInstances.new,
|
||||
name: r'serverInstancesProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$serverInstancesHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef _$ServerInstances = Notifier<List<ServerInstance>>;
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
|
||||
6
lib/providers/shared_preferences_provider.dart
Normal file
6
lib/providers/shared_preferences_provider.dart
Normal file
@@ -0,0 +1,6 @@
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
final sharedPreferencesProvider = Provider<SharedPreferences>((ref) {
|
||||
throw UnimplementedError();
|
||||
});
|
||||
Reference in New Issue
Block a user