This commit is contained in:
2025-10-10 22:49:05 +07:00
parent 02941e2234
commit 38c16bf0b9
49 changed files with 2702 additions and 740 deletions

View File

@@ -0,0 +1,23 @@
import 'package:riverpod_annotation/riverpod_annotation.dart';
import '../network/dio_client.dart';
import '../storage/secure_storage.dart';
part 'core_providers.g.dart';
/// Provider for DioClient (singleton)
///
/// This is the global HTTP client used across the entire app.
/// It's configured with interceptors, timeout settings, and auth token injection.
@Riverpod(keepAlive: true)
DioClient dioClient(Ref ref) {
return DioClient();
}
/// Provider for SecureStorage (singleton)
///
/// This is the global secure storage used for storing sensitive data like tokens.
/// Uses platform-specific secure storage (Keychain on iOS, EncryptedSharedPreferences on Android).
@Riverpod(keepAlive: true)
SecureStorage secureStorage(Ref ref) {
return SecureStorage();
}

View File

@@ -0,0 +1,119 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'core_providers.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint, type=warning
/// Provider for DioClient (singleton)
///
/// This is the global HTTP client used across the entire app.
/// It's configured with interceptors, timeout settings, and auth token injection.
@ProviderFor(dioClient)
const dioClientProvider = DioClientProvider._();
/// Provider for DioClient (singleton)
///
/// This is the global HTTP client used across the entire app.
/// It's configured with interceptors, timeout settings, and auth token injection.
final class DioClientProvider
extends $FunctionalProvider<DioClient, DioClient, DioClient>
with $Provider<DioClient> {
/// Provider for DioClient (singleton)
///
/// This is the global HTTP client used across the entire app.
/// It's configured with interceptors, timeout settings, and auth token injection.
const DioClientProvider._()
: super(
from: null,
argument: null,
retry: null,
name: r'dioClientProvider',
isAutoDispose: false,
dependencies: null,
$allTransitiveDependencies: null,
);
@override
String debugGetCreateSourceHash() => _$dioClientHash();
@$internal
@override
$ProviderElement<DioClient> $createElement($ProviderPointer pointer) =>
$ProviderElement(pointer);
@override
DioClient create(Ref ref) {
return dioClient(ref);
}
/// {@macro riverpod.override_with_value}
Override overrideWithValue(DioClient value) {
return $ProviderOverride(
origin: this,
providerOverride: $SyncValueProvider<DioClient>(value),
);
}
}
String _$dioClientHash() => r'895f0dc2f8d5eab562ad65390e5c6d4a1f722b0d';
/// Provider for SecureStorage (singleton)
///
/// This is the global secure storage used for storing sensitive data like tokens.
/// Uses platform-specific secure storage (Keychain on iOS, EncryptedSharedPreferences on Android).
@ProviderFor(secureStorage)
const secureStorageProvider = SecureStorageProvider._();
/// Provider for SecureStorage (singleton)
///
/// This is the global secure storage used for storing sensitive data like tokens.
/// Uses platform-specific secure storage (Keychain on iOS, EncryptedSharedPreferences on Android).
final class SecureStorageProvider
extends $FunctionalProvider<SecureStorage, SecureStorage, SecureStorage>
with $Provider<SecureStorage> {
/// Provider for SecureStorage (singleton)
///
/// This is the global secure storage used for storing sensitive data like tokens.
/// Uses platform-specific secure storage (Keychain on iOS, EncryptedSharedPreferences on Android).
const SecureStorageProvider._()
: super(
from: null,
argument: null,
retry: null,
name: r'secureStorageProvider',
isAutoDispose: false,
dependencies: null,
$allTransitiveDependencies: null,
);
@override
String debugGetCreateSourceHash() => _$secureStorageHash();
@$internal
@override
$ProviderElement<SecureStorage> $createElement($ProviderPointer pointer) =>
$ProviderElement(pointer);
@override
SecureStorage create(Ref ref) {
return secureStorage(ref);
}
/// {@macro riverpod.override_with_value}
Override overrideWithValue(SecureStorage value) {
return $ProviderOverride(
origin: this,
providerOverride: $SyncValueProvider<SecureStorage>(value),
);
}
}
String _$secureStorageHash() => r'5c9908c0046ad0e39469ee7acbb5540397b36693';

View File

@@ -1,3 +1,4 @@
/// Export all core providers
export 'core_providers.dart';
export 'network_info_provider.dart';
export 'sync_status_provider.dart';

View File

@@ -45,10 +45,10 @@ class SyncStatus extends _$SyncStatus {
try {
// Sync categories first (products depend on categories)
await ref.read(categoriesProvider.notifier).syncCategories();
await ref.read(categoriesProvider.notifier).refresh();
// Then sync products
await ref.read(productsProvider.notifier).syncProducts();
await ref.read(productsProvider.notifier).refresh();
// Update last sync time in settings
await ref.read(settingsProvider.notifier).updateLastSyncTime();
@@ -100,7 +100,7 @@ class SyncStatus extends _$SyncStatus {
);
try {
await ref.read(productsProvider.notifier).syncProducts();
await ref.read(productsProvider.notifier).refresh();
await ref.read(settingsProvider.notifier).updateLastSyncTime();
state = AsyncValue.data(
@@ -146,7 +146,7 @@ class SyncStatus extends _$SyncStatus {
);
try {
await ref.read(categoriesProvider.notifier).syncCategories();
await ref.read(categoriesProvider.notifier).refresh();
await ref.read(settingsProvider.notifier).updateLastSyncTime();
state = AsyncValue.data(

View File

@@ -36,7 +36,7 @@ final class SyncStatusProvider
SyncStatus create() => SyncStatus();
}
String _$syncStatusHash() => r'dc92a1b83c89af94dfe94b646aa81d9501f371d7';
String _$syncStatusHash() => r'bf09683a3a67b6c7104274c7a4b92ee410de8e45';
/// Sync status provider - manages data synchronization state