diff --git a/b0esche_cloud/assets/fonts/animal-park/animal_park.otf b/b0esche_cloud/assets/fonts/animal-park/animal_park.otf new file mode 100644 index 0000000..6857b5e Binary files /dev/null and b/b0esche_cloud/assets/fonts/animal-park/animal_park.otf differ diff --git a/b0esche_cloud/assets/fonts/pixelated-elegance/PixelatedEleganceRegular-ovyAA.ttf b/b0esche_cloud/assets/fonts/pixelated-elegance/PixelatedEleganceRegular-ovyAA.ttf new file mode 100644 index 0000000..9deeb16 Binary files /dev/null and b/b0esche_cloud/assets/fonts/pixelated-elegance/PixelatedEleganceRegular-ovyAA.ttf differ diff --git a/b0esche_cloud/assets/fonts/pixelated-elegance/info.txt b/b0esche_cloud/assets/fonts/pixelated-elegance/info.txt new file mode 100644 index 0000000..b6e4896 --- /dev/null +++ b/b0esche_cloud/assets/fonts/pixelated-elegance/info.txt @@ -0,0 +1,2 @@ +license: Public Domain +link: https://www.fontspace.com/pixelated-elegance-font-f126145 \ No newline at end of file diff --git a/b0esche_cloud/assets/fonts/renoire-demo/renoire_demo.otf b/b0esche_cloud/assets/fonts/renoire-demo/renoire_demo.otf new file mode 100644 index 0000000..e4cf80b Binary files /dev/null and b/b0esche_cloud/assets/fonts/renoire-demo/renoire_demo.otf differ diff --git a/b0esche_cloud/assets/fonts/sparky-stones/SparkyStonesRegular-BW6ld.ttf b/b0esche_cloud/assets/fonts/sparky-stones/SparkyStonesRegular-BW6ld.ttf new file mode 100644 index 0000000..68bd2f5 Binary files /dev/null and b/b0esche_cloud/assets/fonts/sparky-stones/SparkyStonesRegular-BW6ld.ttf differ diff --git a/b0esche_cloud/assets/fonts/sparky-stones/info.txt b/b0esche_cloud/assets/fonts/sparky-stones/info.txt new file mode 100644 index 0000000..f182574 --- /dev/null +++ b/b0esche_cloud/assets/fonts/sparky-stones/info.txt @@ -0,0 +1,2 @@ +license: Freeware +link: https://www.fontspace.com/sparky-stones-font-f88004 \ No newline at end of file diff --git a/b0esche_cloud/assets/fonts/veteran-typewriter/license1.txt b/b0esche_cloud/assets/fonts/veteran-typewriter/license1.txt new file mode 100644 index 0000000..a60cbd6 --- /dev/null +++ b/b0esche_cloud/assets/fonts/veteran-typewriter/license1.txt @@ -0,0 +1,5 @@ +This font is free to use personal and commercial works too. But you can't sell them direktly. + +Please don't make illegal copies of the fonts. + +Thanks and regards: Koczman Bálint \ No newline at end of file diff --git a/b0esche_cloud/assets/fonts/veteran-typewriter/veteran_typewriter.ttf b/b0esche_cloud/assets/fonts/veteran-typewriter/veteran_typewriter.ttf new file mode 100644 index 0000000..202e264 Binary files /dev/null and b/b0esche_cloud/assets/fonts/veteran-typewriter/veteran_typewriter.ttf differ diff --git a/b0esche_cloud/ios/Flutter/Debug.xcconfig b/b0esche_cloud/ios/Flutter/Debug.xcconfig index 592ceee..ec97fc6 100644 --- a/b0esche_cloud/ios/Flutter/Debug.xcconfig +++ b/b0esche_cloud/ios/Flutter/Debug.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/b0esche_cloud/ios/Flutter/Release.xcconfig b/b0esche_cloud/ios/Flutter/Release.xcconfig index 592ceee..c4855bf 100644 --- a/b0esche_cloud/ios/Flutter/Release.xcconfig +++ b/b0esche_cloud/ios/Flutter/Release.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/b0esche_cloud/ios/Podfile b/b0esche_cloud/ios/Podfile new file mode 100644 index 0000000..620e46e --- /dev/null +++ b/b0esche_cloud/ios/Podfile @@ -0,0 +1,43 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '13.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/b0esche_cloud/lib/blocs/auth/auth_bloc.dart b/b0esche_cloud/lib/blocs/auth/auth_bloc.dart new file mode 100644 index 0000000..ff4d431 --- /dev/null +++ b/b0esche_cloud/lib/blocs/auth/auth_bloc.dart @@ -0,0 +1,42 @@ +import 'package:bloc/bloc.dart'; +import 'auth_event.dart'; +import 'auth_state.dart'; + +class AuthBloc extends Bloc { + AuthBloc() : super(AuthInitial()) { + on(_onLoginRequested); + on(_onLogoutRequested); + on(_onCheckAuthRequested); + } + + void _onLoginRequested(LoginRequested event, Emitter emit) async { + emit(AuthLoading()); + // Simulate API call to go.b0esche.cloud/auth/login + await Future.delayed(const Duration(seconds: 1)); + if (event.email.isNotEmpty && event.password.isNotEmpty) { + // Assume JWT received + emit(AuthAuthenticated(token: 'fake-jwt', userId: 'user123')); + } else { + emit(const AuthFailure('Invalid credentials')); + } + } + + void _onLogoutRequested( + LogoutRequested event, + Emitter emit, + ) async { + emit(AuthLoading()); + // Call logout API + await Future.delayed(const Duration(milliseconds: 500)); + emit(AuthUnauthenticated()); + } + + void _onCheckAuthRequested( + CheckAuthRequested event, + Emitter emit, + ) async { + // Check if token is valid + // For now, assume unauthenticated + emit(AuthUnauthenticated()); + } +} diff --git a/b0esche_cloud/lib/blocs/auth/auth_event.dart b/b0esche_cloud/lib/blocs/auth/auth_event.dart new file mode 100644 index 0000000..4df3a53 --- /dev/null +++ b/b0esche_cloud/lib/blocs/auth/auth_event.dart @@ -0,0 +1,22 @@ +import 'package:equatable/equatable.dart'; + +abstract class AuthEvent extends Equatable { + const AuthEvent(); + + @override + List get props => []; +} + +class LoginRequested extends AuthEvent { + final String email; + final String password; + + const LoginRequested(this.email, this.password); + + @override + List get props => [email, password]; +} + +class LogoutRequested extends AuthEvent {} + +class CheckAuthRequested extends AuthEvent {} diff --git a/b0esche_cloud/lib/blocs/auth/auth_state.dart b/b0esche_cloud/lib/blocs/auth/auth_state.dart new file mode 100644 index 0000000..cbffa93 --- /dev/null +++ b/b0esche_cloud/lib/blocs/auth/auth_state.dart @@ -0,0 +1,33 @@ +import 'package:equatable/equatable.dart'; + +abstract class AuthState extends Equatable { + const AuthState(); + + @override + List get props => []; +} + +class AuthInitial extends AuthState {} + +class AuthLoading extends AuthState {} + +class AuthAuthenticated extends AuthState { + final String token; + final String userId; + + const AuthAuthenticated({required this.token, required this.userId}); + + @override + List get props => [token, userId]; +} + +class AuthUnauthenticated extends AuthState {} + +class AuthFailure extends AuthState { + final String error; + + const AuthFailure(this.error); + + @override + List get props => [error]; +} diff --git a/b0esche_cloud/lib/blocs/document_viewer/document_viewer_bloc.dart b/b0esche_cloud/lib/blocs/document_viewer/document_viewer_bloc.dart new file mode 100644 index 0000000..55f786f --- /dev/null +++ b/b0esche_cloud/lib/blocs/document_viewer/document_viewer_bloc.dart @@ -0,0 +1,48 @@ +import 'package:bloc/bloc.dart'; +import 'document_viewer_event.dart'; +import 'document_viewer_state.dart'; + +class DocumentViewerBloc + extends Bloc { + DocumentViewerBloc() : super(ViewerInitial()) { + on(_onOpenDocument); + on(_onCloseDocument); + on(_onReloadDocument); + } + + void _onOpenDocument( + OpenDocument event, + Emitter emit, + ) async { + emit(ViewerLoading()); + // Simulate requesting viewer session from backend + await Future.delayed(const Duration(seconds: 2)); + // Mock: assume PDF viewer + final viewUrl = 'https://storage.b0esche.cloud/view/${event.fileId}'; + final canEdit = false; // Based on permissions + final fileName = 'document.pdf'; + emit(ViewerReady(viewUrl: viewUrl, canEdit: canEdit, fileName: fileName)); + } + + void _onCloseDocument( + CloseDocument event, + Emitter emit, + ) { + emit(ViewerInitial()); + } + + void _onReloadDocument( + ReloadDocument event, + Emitter emit, + ) { + // Reload current document + final currentState = state; + if (currentState is ViewerReady) { + emit(ViewerLoading()); + // Simulate reload + Future.delayed(const Duration(seconds: 1), () { + emit(currentState); + }); + } + } +} diff --git a/b0esche_cloud/lib/blocs/document_viewer/document_viewer_event.dart b/b0esche_cloud/lib/blocs/document_viewer/document_viewer_event.dart new file mode 100644 index 0000000..1b80289 --- /dev/null +++ b/b0esche_cloud/lib/blocs/document_viewer/document_viewer_event.dart @@ -0,0 +1,22 @@ +import 'package:equatable/equatable.dart'; + +abstract class DocumentViewerEvent extends Equatable { + const DocumentViewerEvent(); + + @override + List get props => []; +} + +class OpenDocument extends DocumentViewerEvent { + final String fileId; + final String orgId; + + const OpenDocument({required this.fileId, required this.orgId}); + + @override + List get props => [fileId, orgId]; +} + +class CloseDocument extends DocumentViewerEvent {} + +class ReloadDocument extends DocumentViewerEvent {} diff --git a/b0esche_cloud/lib/blocs/document_viewer/document_viewer_state.dart b/b0esche_cloud/lib/blocs/document_viewer/document_viewer_state.dart new file mode 100644 index 0000000..fb16968 --- /dev/null +++ b/b0esche_cloud/lib/blocs/document_viewer/document_viewer_state.dart @@ -0,0 +1,36 @@ +import 'package:equatable/equatable.dart'; + +abstract class DocumentViewerState extends Equatable { + const DocumentViewerState(); + + @override + List get props => []; +} + +class ViewerInitial extends DocumentViewerState {} + +class ViewerLoading extends DocumentViewerState {} + +class ViewerReady extends DocumentViewerState { + final String viewUrl; + final bool canEdit; + final String fileName; + + const ViewerReady({ + required this.viewUrl, + required this.canEdit, + required this.fileName, + }); + + @override + List get props => [viewUrl, canEdit, fileName]; +} + +class ViewerError extends DocumentViewerState { + final String error; + + const ViewerError(this.error); + + @override + List get props => [error]; +} diff --git a/b0esche_cloud/lib/blocs/file_browser/file_browser_bloc.dart b/b0esche_cloud/lib/blocs/file_browser/file_browser_bloc.dart new file mode 100644 index 0000000..7d8651a --- /dev/null +++ b/b0esche_cloud/lib/blocs/file_browser/file_browser_bloc.dart @@ -0,0 +1,85 @@ +import 'package:bloc/bloc.dart'; +import 'file_browser_event.dart'; +import 'file_browser_state.dart'; +import '../../repositories/file_repository.dart'; + +class FileBrowserBloc extends Bloc { + final FileRepository _fileRepository; + String _currentOrgId = ''; + String _currentPath = '/'; + + FileBrowserBloc(this._fileRepository) : super(DirectoryInitial()) { + on(_onLoadDirectory); + on(_onNavigateToFolder); + on(_onRefreshDirectory); + on(_onApplySort); + on(_onApplyFilter); + on(_onResetFileBrowser); + } + + void _onLoadDirectory( + LoadDirectory event, + Emitter emit, + ) async { + emit(DirectoryLoading()); + _currentOrgId = event.orgId; + _currentPath = event.path; + try { + final files = await _fileRepository.getFiles(event.orgId, event.path); + final breadcrumbs = _generateBreadcrumbs(event.path); + if (files.isEmpty) { + emit(DirectoryEmpty()); + } else { + emit(DirectoryLoaded(files: files, breadcrumbs: breadcrumbs)); + } + } catch (e) { + emit(DirectoryError(e.toString())); + } + } + + void _onNavigateToFolder( + NavigateToFolder event, + Emitter emit, + ) async { + // Assume event.folderId is the path + add(LoadDirectory(orgId: _currentOrgId, path: event.folderId)); + } + + void _onRefreshDirectory( + RefreshDirectory event, + Emitter emit, + ) async { + add(LoadDirectory(orgId: _currentOrgId, path: _currentPath)); + } + + void _onApplySort(ApplySort event, Emitter emit) { + // Implement sorting + // For now, just refresh + add(RefreshDirectory()); + } + + void _onApplyFilter(ApplyFilter event, Emitter emit) { + // Implement filtering + add(RefreshDirectory()); + } + + void _onResetFileBrowser( + ResetFileBrowser event, + Emitter emit, + ) { + emit(DirectoryInitial()); + _currentOrgId = ''; + _currentPath = '/'; + } + + List _generateBreadcrumbs(String path) { + final parts = path.split('/').where((p) => p.isNotEmpty).toList(); + final breadcrumbs = []; + String currentPath = ''; + for (final part in parts) { + currentPath += '/$part'; + breadcrumbs.add(Breadcrumb(name: part, path: currentPath)); + } + return breadcrumbs; + } +} diff --git a/b0esche_cloud/lib/blocs/file_browser/file_browser_event.dart b/b0esche_cloud/lib/blocs/file_browser/file_browser_event.dart new file mode 100644 index 0000000..544f6cd --- /dev/null +++ b/b0esche_cloud/lib/blocs/file_browser/file_browser_event.dart @@ -0,0 +1,49 @@ +import 'package:equatable/equatable.dart'; + +abstract class FileBrowserEvent extends Equatable { + const FileBrowserEvent(); + + @override + List get props => []; +} + +class LoadDirectory extends FileBrowserEvent { + final String orgId; + final String path; + + const LoadDirectory({required this.orgId, required this.path}); + + @override + List get props => [orgId, path]; +} + +class NavigateToFolder extends FileBrowserEvent { + final String folderId; + + const NavigateToFolder(this.folderId); + + @override + List get props => [folderId]; +} + +class RefreshDirectory extends FileBrowserEvent {} + +class ApplySort extends FileBrowserEvent { + final String sortBy; // name, date, size + + const ApplySort(this.sortBy); + + @override + List get props => [sortBy]; +} + +class ApplyFilter extends FileBrowserEvent { + final String filter; + + const ApplyFilter(this.filter); + + @override + List get props => [filter]; +} + +class ResetFileBrowser extends FileBrowserEvent {} diff --git a/b0esche_cloud/lib/blocs/file_browser/file_browser_state.dart b/b0esche_cloud/lib/blocs/file_browser/file_browser_state.dart new file mode 100644 index 0000000..b0033c2 --- /dev/null +++ b/b0esche_cloud/lib/blocs/file_browser/file_browser_state.dart @@ -0,0 +1,44 @@ +import 'package:equatable/equatable.dart'; +import '../../models/file_item.dart'; + +class Breadcrumb extends Equatable { + final String name; + final String path; + + const Breadcrumb({required this.name, required this.path}); + + @override + List get props => [name, path]; +} + +abstract class FileBrowserState extends Equatable { + const FileBrowserState(); + + @override + List get props => []; +} + +class DirectoryInitial extends FileBrowserState {} + +class DirectoryLoading extends FileBrowserState {} + +class DirectoryLoaded extends FileBrowserState { + final List files; + final List breadcrumbs; + + const DirectoryLoaded({required this.files, required this.breadcrumbs}); + + @override + List get props => [files, breadcrumbs]; +} + +class DirectoryEmpty extends FileBrowserState {} + +class DirectoryError extends FileBrowserState { + final String error; + + const DirectoryError(this.error); + + @override + List get props => [error]; +} diff --git a/b0esche_cloud/lib/blocs/organization/organization_bloc.dart b/b0esche_cloud/lib/blocs/organization/organization_bloc.dart new file mode 100644 index 0000000..2dea147 --- /dev/null +++ b/b0esche_cloud/lib/blocs/organization/organization_bloc.dart @@ -0,0 +1,61 @@ +import 'package:bloc/bloc.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'organization_event.dart'; +import 'organization_state.dart'; +import '../permission/permission_bloc.dart'; +import '../permission/permission_event.dart'; +import '../file_browser/file_browser_bloc.dart'; +import '../file_browser/file_browser_event.dart'; +import '../upload/upload_bloc.dart'; +import '../upload/upload_event.dart'; + +class OrganizationBloc extends Bloc { + final PermissionBloc permissionBloc; + final FileBrowserBloc fileBrowserBloc; + final UploadBloc uploadBloc; + + OrganizationBloc(this.permissionBloc, this.fileBrowserBloc, this.uploadBloc) + : super(OrganizationInitial()) { + on(_onLoadOrganizations); + on(_onSelectOrganization); + } + + void _onLoadOrganizations( + LoadOrganizations event, + Emitter emit, + ) async { + emit(OrganizationLoading()); + // Simulate loading orgs from API + await Future.delayed(const Duration(seconds: 1)); + final orgs = [ + const Organization(id: 'org1', name: 'Personal', role: 'admin'), + const Organization(id: 'org2', name: 'Company Inc', role: 'edit'), + ]; + emit(OrganizationLoaded(organizations: orgs)); + } + + void _onSelectOrganization( + SelectOrganization event, + Emitter emit, + ) { + final currentState = state; + if (currentState is OrganizationLoaded) { + final selected = currentState.organizations.firstWhere( + (org) => org.id == event.orgId, + orElse: () => currentState.selectedOrg!, + ); + emit( + OrganizationLoaded( + organizations: currentState.organizations, + selectedOrg: selected, + ), + ); + // Reset all dependent blocs + permissionBloc.add(PermissionsReset()); + fileBrowserBloc.add(ResetFileBrowser()); + uploadBloc.add(ResetUploads()); + // Load permissions for the selected org + permissionBloc.add(LoadPermissions(event.orgId)); + } + } +} diff --git a/b0esche_cloud/lib/blocs/organization/organization_event.dart b/b0esche_cloud/lib/blocs/organization/organization_event.dart new file mode 100644 index 0000000..08ac1b3 --- /dev/null +++ b/b0esche_cloud/lib/blocs/organization/organization_event.dart @@ -0,0 +1,19 @@ +import 'package:equatable/equatable.dart'; + +abstract class OrganizationEvent extends Equatable { + const OrganizationEvent(); + + @override + List get props => []; +} + +class LoadOrganizations extends OrganizationEvent {} + +class SelectOrganization extends OrganizationEvent { + final String orgId; + + const SelectOrganization(this.orgId); + + @override + List get props => [orgId]; +} diff --git a/b0esche_cloud/lib/blocs/organization/organization_state.dart b/b0esche_cloud/lib/blocs/organization/organization_state.dart new file mode 100644 index 0000000..fde7b40 --- /dev/null +++ b/b0esche_cloud/lib/blocs/organization/organization_state.dart @@ -0,0 +1,46 @@ +import 'package:equatable/equatable.dart'; + +class Organization extends Equatable { + final String id; + final String name; + final String role; // view, edit, admin + + const Organization({ + required this.id, + required this.name, + required this.role, + }); + + @override + List get props => [id, name, role]; +} + +abstract class OrganizationState extends Equatable { + const OrganizationState(); + + @override + List get props => []; +} + +class OrganizationInitial extends OrganizationState {} + +class OrganizationLoading extends OrganizationState {} + +class OrganizationLoaded extends OrganizationState { + final List organizations; + final Organization? selectedOrg; + + const OrganizationLoaded({required this.organizations, this.selectedOrg}); + + @override + List get props => [organizations, selectedOrg ?? '']; +} + +class OrganizationError extends OrganizationState { + final String error; + + const OrganizationError(this.error); + + @override + List get props => [error]; +} diff --git a/b0esche_cloud/lib/blocs/permission/permission_bloc.dart b/b0esche_cloud/lib/blocs/permission/permission_bloc.dart new file mode 100644 index 0000000..46f2d15 --- /dev/null +++ b/b0esche_cloud/lib/blocs/permission/permission_bloc.dart @@ -0,0 +1,36 @@ +import 'package:bloc/bloc.dart'; +import 'permission_event.dart'; +import 'permission_state.dart'; + +class PermissionBloc extends Bloc { + PermissionBloc() : super(PermissionInitial()) { + on(_onLoadPermissions); + on(_onPermissionsReset); + } + + void _onLoadPermissions( + LoadPermissions event, + Emitter emit, + ) async { + emit(PermissionLoading()); + // Simulate loading permissions from backend for orgId + await Future.delayed(const Duration(seconds: 1)); + // Mock capabilities based on orgId + final capabilities = Capabilities( + canRead: true, + canWrite: event.orgId == 'org1', // Only admin for personal + canShare: event.orgId == 'org1', + canAdmin: event.orgId == 'org1', + canAnnotate: true, + canEdit: true, + ); + emit(PermissionLoaded(capabilities)); + } + + void _onPermissionsReset( + PermissionsReset event, + Emitter emit, + ) { + emit(PermissionInitial()); + } +} diff --git a/b0esche_cloud/lib/blocs/permission/permission_event.dart b/b0esche_cloud/lib/blocs/permission/permission_event.dart new file mode 100644 index 0000000..25a28f7 --- /dev/null +++ b/b0esche_cloud/lib/blocs/permission/permission_event.dart @@ -0,0 +1,19 @@ +import 'package:equatable/equatable.dart'; + +abstract class PermissionEvent extends Equatable { + const PermissionEvent(); + + @override + List get props => []; +} + +class LoadPermissions extends PermissionEvent { + final String orgId; + + const LoadPermissions(this.orgId); + + @override + List get props => [orgId]; +} + +class PermissionsReset extends PermissionEvent {} diff --git a/b0esche_cloud/lib/blocs/permission/permission_state.dart b/b0esche_cloud/lib/blocs/permission/permission_state.dart new file mode 100644 index 0000000..a0e94a5 --- /dev/null +++ b/b0esche_cloud/lib/blocs/permission/permission_state.dart @@ -0,0 +1,58 @@ +import 'package:equatable/equatable.dart'; + +class Capabilities extends Equatable { + final bool canRead; + final bool canWrite; + final bool canShare; + final bool canAdmin; + final bool canAnnotate; + final bool canEdit; + + const Capabilities({ + required this.canRead, + required this.canWrite, + required this.canShare, + required this.canAdmin, + required this.canAnnotate, + required this.canEdit, + }); + + @override + List get props => [ + canRead, + canWrite, + canShare, + canAdmin, + canAnnotate, + canEdit, + ]; +} + +abstract class PermissionState extends Equatable { + const PermissionState(); + + @override + List get props => []; +} + +class PermissionInitial extends PermissionState {} + +class PermissionLoading extends PermissionState {} + +class PermissionLoaded extends PermissionState { + final Capabilities capabilities; + + const PermissionLoaded(this.capabilities); + + @override + List get props => [capabilities]; +} + +class PermissionDenied extends PermissionState { + final String error; + + const PermissionDenied(this.error); + + @override + List get props => [error]; +} diff --git a/b0esche_cloud/lib/blocs/session/session_bloc.dart b/b0esche_cloud/lib/blocs/session/session_bloc.dart new file mode 100644 index 0000000..13cccf4 --- /dev/null +++ b/b0esche_cloud/lib/blocs/session/session_bloc.dart @@ -0,0 +1,53 @@ +import 'dart:async'; +import 'package:bloc/bloc.dart'; +import 'session_event.dart'; +import 'session_state.dart'; + +class SessionBloc extends Bloc { + Timer? _expiryTimer; + + SessionBloc() : super(SessionInitial()) { + on(_onSessionStarted); + on(_onSessionExpired); + on(_onSessionRefreshed); + on(_onSessionEnded); + } + + void _onSessionStarted(SessionStarted event, Emitter emit) { + final expiresAt = DateTime.now().add( + const Duration(hours: 1), + ); // Fake expiry + emit(SessionActive(token: event.token, expiresAt: expiresAt)); + _startExpiryTimer(expiresAt); + } + + void _onSessionExpired(SessionExpired event, Emitter emit) { + _expiryTimer?.cancel(); + emit(SessionExpiredState()); + } + + void _onSessionRefreshed(SessionRefreshed event, Emitter emit) { + final expiresAt = DateTime.now().add(const Duration(hours: 1)); + emit(SessionActive(token: event.newToken, expiresAt: expiresAt)); + _startExpiryTimer(expiresAt); + } + + void _onSessionEnded(SessionEnded event, Emitter emit) { + _expiryTimer?.cancel(); + emit(SessionInitial()); + } + + void _startExpiryTimer(DateTime expiresAt) { + _expiryTimer?.cancel(); + final duration = expiresAt.difference(DateTime.now()); + _expiryTimer = Timer(duration, () { + add(SessionExpired()); + }); + } + + @override + Future close() { + _expiryTimer?.cancel(); + return super.close(); + } +} diff --git a/b0esche_cloud/lib/blocs/session/session_event.dart b/b0esche_cloud/lib/blocs/session/session_event.dart new file mode 100644 index 0000000..15471a8 --- /dev/null +++ b/b0esche_cloud/lib/blocs/session/session_event.dart @@ -0,0 +1,30 @@ +import 'package:equatable/equatable.dart'; + +abstract class SessionEvent extends Equatable { + const SessionEvent(); + + @override + List get props => []; +} + +class SessionStarted extends SessionEvent { + final String token; + + const SessionStarted(this.token); + + @override + List get props => [token]; +} + +class SessionExpired extends SessionEvent {} + +class SessionRefreshed extends SessionEvent { + final String newToken; + + const SessionRefreshed(this.newToken); + + @override + List get props => [newToken]; +} + +class SessionEnded extends SessionEvent {} diff --git a/b0esche_cloud/lib/blocs/session/session_state.dart b/b0esche_cloud/lib/blocs/session/session_state.dart new file mode 100644 index 0000000..00c56cd --- /dev/null +++ b/b0esche_cloud/lib/blocs/session/session_state.dart @@ -0,0 +1,31 @@ +import 'package:equatable/equatable.dart'; + +abstract class SessionState extends Equatable { + const SessionState(); + + @override + List get props => []; +} + +class SessionInitial extends SessionState {} + +class SessionActive extends SessionState { + final String token; + final DateTime expiresAt; + + const SessionActive({required this.token, required this.expiresAt}); + + @override + List get props => [token, expiresAt]; +} + +class SessionExpiredState extends SessionState {} + +class SessionError extends SessionState { + final String error; + + const SessionError(this.error); + + @override + List get props => [error]; +} diff --git a/b0esche_cloud/lib/blocs/shared_drive/shared_drive_event.dart b/b0esche_cloud/lib/blocs/shared_drive/shared_drive_event.dart new file mode 100644 index 0000000..f78ad3f --- /dev/null +++ b/b0esche_cloud/lib/blocs/shared_drive/shared_drive_event.dart @@ -0,0 +1,26 @@ +import 'package:equatable/equatable.dart'; + +abstract class SharedDriveEvent extends Equatable { + const SharedDriveEvent(); + + @override + List get props => []; +} + +class LoadSharedDrives extends SharedDriveEvent { + final String orgId; + + const LoadSharedDrives(this.orgId); + + @override + List get props => [orgId]; +} + +class OpenSharedDrive extends SharedDriveEvent { + final String driveId; + + const OpenSharedDrive(this.driveId); + + @override + List get props => [driveId]; +} diff --git a/b0esche_cloud/lib/blocs/upload/upload_bloc.dart b/b0esche_cloud/lib/blocs/upload/upload_bloc.dart new file mode 100644 index 0000000..4a21e9c --- /dev/null +++ b/b0esche_cloud/lib/blocs/upload/upload_bloc.dart @@ -0,0 +1,120 @@ +import 'package:bloc/bloc.dart'; +import 'upload_event.dart'; +import 'upload_state.dart'; +import '../../repositories/file_repository.dart'; + +class UploadBloc extends Bloc { + final FileRepository _fileRepository; + + UploadBloc(this._fileRepository) : super(UploadInitial()) { + on(_onStartUpload); + on(_onUploadProgress); + on(_onUploadPaused); + on(_onUploadCompleted); + on(_onUploadFailed); + on(_onCancelUpload); + on(_onResetUploads); + } + + void _onStartUpload(StartUpload event, Emitter emit) async { + final uploads = event.files + .map((file) => UploadItem(fileName: file.name)) + .toList(); + emit(UploadInProgress(uploads)); + + for (final file in event.files) { + try { + // Simulate upload + await _fileRepository.uploadFile(event.orgId, file); + add(UploadCompleted(file)); + } catch (e) { + add(UploadFailed(fileName: file.name, error: e.toString())); + } + } + } + + void _onUploadProgress(UploadProgress event, Emitter emit) { + final currentState = state; + if (currentState is UploadInProgress) { + final updatedUploads = currentState.uploads.map((upload) { + if (upload.fileName == event.fileName) { + return UploadItem( + fileName: upload.fileName, + progress: event.progress, + isPaused: upload.isPaused, + isCompleted: upload.isCompleted, + error: upload.error, + ); + } + return upload; + }).toList(); + emit(UploadInProgress(updatedUploads)); + } + } + + void _onUploadPaused(UploadPaused event, Emitter emit) { + final currentState = state; + if (currentState is UploadInProgress) { + final updatedUploads = currentState.uploads.map((upload) { + if (upload.fileName == event.fileName) { + return UploadItem( + fileName: upload.fileName, + progress: upload.progress, + isPaused: true, + isCompleted: upload.isCompleted, + error: upload.error, + ); + } + return upload; + }).toList(); + emit(UploadInProgress(updatedUploads)); + } + } + + void _onUploadCompleted(UploadCompleted event, Emitter emit) { + final currentState = state; + if (currentState is UploadInProgress) { + final updatedUploads = currentState.uploads.map((upload) { + if (upload.fileName == event.file.name) { + return UploadItem( + fileName: upload.fileName, + progress: 1.0, + isPaused: false, + isCompleted: true, + error: null, + ); + } + return upload; + }).toList(); + emit(UploadInProgress(updatedUploads)); + } + } + + void _onUploadFailed(UploadFailed event, Emitter emit) { + final currentState = state; + if (currentState is UploadInProgress) { + final updatedUploads = currentState.uploads.map((upload) { + if (upload.fileName == event.fileName) { + return UploadItem( + fileName: upload.fileName, + progress: upload.progress, + isPaused: upload.isPaused, + isCompleted: upload.isCompleted, + error: event.error, + ); + } + return upload; + }).toList(); + emit(UploadInProgress(updatedUploads)); + } + } + + void _onCancelUpload(CancelUpload event, Emitter emit) { + // Reset to initial + emit(UploadInitial()); + } + + void _onResetUploads(ResetUploads event, Emitter emit) { + emit(UploadInitial()); + } +} diff --git a/b0esche_cloud/lib/blocs/upload/upload_event.dart b/b0esche_cloud/lib/blocs/upload/upload_event.dart new file mode 100644 index 0000000..b330b6b --- /dev/null +++ b/b0esche_cloud/lib/blocs/upload/upload_event.dart @@ -0,0 +1,73 @@ +import 'package:equatable/equatable.dart'; +import '../../models/file_item.dart'; + +abstract class UploadEvent extends Equatable { + const UploadEvent(); + + @override + List get props => []; +} + +class StartUpload extends UploadEvent { + final List files; + final String targetPath; + final String orgId; + + const StartUpload({ + required this.files, + required this.targetPath, + required this.orgId, + }); + + @override + List get props => [files, targetPath, orgId]; +} + +class UploadProgress extends UploadEvent { + final String fileName; + final double progress; + + const UploadProgress({required this.fileName, required this.progress}); + + @override + List get props => [fileName, progress]; +} + +class UploadPaused extends UploadEvent { + final String fileName; + + const UploadPaused(this.fileName); + + @override + List get props => [fileName]; +} + +class UploadCompleted extends UploadEvent { + final FileItem file; + + const UploadCompleted(this.file); + + @override + List get props => [file]; +} + +class UploadFailed extends UploadEvent { + final String fileName; + final String error; + + const UploadFailed({required this.fileName, required this.error}); + + @override + List get props => [fileName, error]; +} + +class CancelUpload extends UploadEvent { + final String fileName; + + const CancelUpload(this.fileName); + + @override + List get props => [fileName]; +} + +class ResetUploads extends UploadEvent {} diff --git a/b0esche_cloud/lib/blocs/upload/upload_state.dart b/b0esche_cloud/lib/blocs/upload/upload_state.dart new file mode 100644 index 0000000..0dd652f --- /dev/null +++ b/b0esche_cloud/lib/blocs/upload/upload_state.dart @@ -0,0 +1,47 @@ +import 'package:equatable/equatable.dart'; + +class UploadItem extends Equatable { + final String fileName; + final double progress; + final bool isPaused; + final bool isCompleted; + final String? error; + + const UploadItem({ + required this.fileName, + this.progress = 0.0, + this.isPaused = false, + this.isCompleted = false, + this.error, + }); + + @override + List get props => [fileName, progress, isPaused, isCompleted, error]; +} + +abstract class UploadState extends Equatable { + const UploadState(); + + @override + List get props => []; +} + +class UploadInitial extends UploadState {} + +class UploadInProgress extends UploadState { + final List uploads; + + const UploadInProgress(this.uploads); + + @override + List get props => [uploads]; +} + +class UploadError extends UploadState { + final String error; + + const UploadError(this.error); + + @override + List get props => [error]; +} diff --git a/b0esche_cloud/lib/injection.dart b/b0esche_cloud/lib/injection.dart new file mode 100644 index 0000000..6ecdc78 --- /dev/null +++ b/b0esche_cloud/lib/injection.dart @@ -0,0 +1,27 @@ +import 'package:get_it/get_it.dart'; +import 'repositories/auth_repository.dart'; +import 'repositories/file_repository.dart'; +import 'repositories/mock_auth_repository.dart'; +import 'repositories/mock_file_repository.dart'; +import 'services/auth_service.dart'; +import 'services/file_service.dart'; +import 'viewmodels/login_view_model.dart'; +import 'viewmodels/file_explorer_view_model.dart'; + +final getIt = GetIt.instance; + +void configureDependencies() { + // Register repositories + getIt.registerSingleton(MockAuthRepository()); + getIt.registerSingleton(MockFileRepository()); + + // Register services + getIt.registerSingleton(AuthService(getIt())); + getIt.registerSingleton(FileService(getIt())); + + // Register viewmodels + getIt.registerSingleton(LoginViewModel(getIt())); + getIt.registerSingleton( + FileExplorerViewModel(getIt()), + ); +} diff --git a/b0esche_cloud/lib/main.dart b/b0esche_cloud/lib/main.dart index a725658..04e3c96 100644 --- a/b0esche_cloud/lib/main.dart +++ b/b0esche_cloud/lib/main.dart @@ -1,4 +1,210 @@ import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:go_router/go_router.dart'; +import 'blocs/auth/auth_bloc.dart'; +import 'blocs/session/session_bloc.dart'; +import 'blocs/organization/organization_bloc.dart'; +import 'blocs/permission/permission_bloc.dart'; +import 'blocs/file_browser/file_browser_bloc.dart'; +import 'blocs/upload/upload_bloc.dart'; +import 'repositories/mock_file_repository.dart'; +import 'pages/home_page.dart'; +import 'pages/login_form.dart'; +import 'pages/file_explorer.dart'; +import 'pages/document_viewer.dart'; + +final GoRouter _router = GoRouter( + routes: [ + GoRoute(path: '/', builder: (context, state) => const HomePage()), + GoRoute(path: '/login', builder: (context, state) => const LoginForm()), + GoRoute( + path: '/viewer/:fileId', + builder: (context, state) => + DocumentViewer(fileId: state.pathParameters['fileId']!), + ), + ], +); + +final ThemeData appTheme = ThemeData( + useMaterial3: true, + colorScheme: const ColorScheme( + brightness: Brightness.dark, + primary: Color(0xFF000000), + onPrimary: Color(0xFFFFFFFF), + primaryContainer: Color(0xFF1C1B1F), + onPrimaryContainer: Color(0xFFE6E1E5), + secondary: Color(0xFF5D5D5D), + onSecondary: Color(0xFFFFFFFF), + secondaryContainer: Color(0xFF2A2A2A), + onSecondaryContainer: Color(0xFFD9D9D9), + tertiary: Color(0xFF7D5260), + onTertiary: Color(0xFFFFFFFF), + tertiaryContainer: Color(0xFF633B48), + onTertiaryContainer: Color(0xFFFFD8E4), + error: Color(0xFFFFB4AB), + onError: Color(0xFF690005), + errorContainer: Color(0xFF93000A), + onErrorContainer: Color(0xFFFFDAD6), + background: Color(0xFF0F0F0F), + onBackground: Color(0xFFE6E1E5), + surface: Color(0xFF0F0F0F), + onSurface: Color(0xFFE6E1E5), + surfaceVariant: Color(0xFF49454F), + onSurfaceVariant: Color(0xFFCAC4D0), + outline: Color(0xFF938F99), + outlineVariant: Color(0xFF49454F), + shadow: Color(0xFF000000), + scrim: Color(0xFF000000), + inverseSurface: Color(0xFFE6E1E5), + onInverseSurface: Color(0xFF322F35), + inversePrimary: Color(0xFF6750A4), + surfaceTint: Color(0xFFD0BCFF), + ), + textTheme: const TextTheme( + displayLarge: TextStyle( + fontSize: 57, + fontWeight: FontWeight.w400, + letterSpacing: -0.25, + color: Color(0xFFE6E1E5), + ), + displayMedium: TextStyle( + fontSize: 45, + fontWeight: FontWeight.w400, + letterSpacing: 0, + color: Color(0xFFE6E1E5), + ), + displaySmall: TextStyle( + fontSize: 36, + fontWeight: FontWeight.w400, + letterSpacing: 0, + color: Color(0xFFE6E1E5), + ), + headlineLarge: TextStyle( + fontSize: 32, + fontWeight: FontWeight.w400, + letterSpacing: 0, + color: Color(0xFFE6E1E5), + ), + headlineMedium: TextStyle( + fontSize: 28, + fontWeight: FontWeight.w400, + letterSpacing: 0, + color: Color(0xFFE6E1E5), + ), + headlineSmall: TextStyle( + fontSize: 24, + fontWeight: FontWeight.w400, + letterSpacing: 0, + color: Color(0xFFE6E1E5), + ), + titleLarge: TextStyle( + fontSize: 22, + fontWeight: FontWeight.w500, + letterSpacing: 0, + color: Color(0xFFE6E1E5), + ), + titleMedium: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + letterSpacing: 0.15, + color: Color(0xFFE6E1E5), + ), + titleSmall: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, + letterSpacing: 0.1, + color: Color(0xFFE6E1E5), + ), + bodyLarge: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w400, + letterSpacing: 0.5, + color: Color(0xFFE6E1E5), + ), + bodyMedium: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w400, + letterSpacing: 0.25, + color: Color(0xFFE6E1E5), + ), + bodySmall: TextStyle( + fontSize: 12, + fontWeight: FontWeight.w400, + letterSpacing: 0.4, + color: Color(0xFFE6E1E5), + ), + labelLarge: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, + letterSpacing: 0.1, + color: Color(0xFFE6E1E5), + ), + labelMedium: TextStyle( + fontSize: 12, + fontWeight: FontWeight.w500, + letterSpacing: 0.5, + color: Color(0xFFE6E1E5), + ), + labelSmall: TextStyle( + fontSize: 11, + fontWeight: FontWeight.w500, + letterSpacing: 0.5, + color: Color(0xFFE6E1E5), + ), + ), + elevatedButtonTheme: ElevatedButtonThemeData( + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF5D5D5D), + foregroundColor: const Color(0xFFFFFFFF), + elevation: 0, + padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 12), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + ), + textButtonTheme: TextButtonThemeData( + style: TextButton.styleFrom( + foregroundColor: const Color(0xFFD0BCFF), + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + ), + ), + outlinedButtonTheme: OutlinedButtonThemeData( + style: OutlinedButton.styleFrom( + foregroundColor: const Color(0xFFE6E1E5), + side: const BorderSide(color: Color(0xFF938F99)), + padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 12), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + ), + inputDecorationTheme: const InputDecorationTheme( + filled: true, + fillColor: Color(0xFF1C1B1F), + border: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(8)), + borderSide: BorderSide(color: Color(0xFF938F99)), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(8)), + borderSide: BorderSide(color: Color(0xFF938F99)), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(8)), + borderSide: BorderSide(color: Color(0xFFD0BCFF)), + ), + labelStyle: TextStyle(color: Color(0xFFCAC4D0)), + hintStyle: TextStyle(color: Color(0xFF938F99)), + ), + cardTheme: CardThemeData( + color: const Color(0xFF1C1B1F), + elevation: 0, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + ), + appBarTheme: const AppBarTheme( + backgroundColor: Color(0xFF0F0F0F), + foregroundColor: Color(0xFFE6E1E5), + elevation: 0, + ), + scaffoldBackgroundColor: const Color(0xFF0F0F0F), +); void main() { runApp(const MainApp()); @@ -9,12 +215,26 @@ class MainApp extends StatelessWidget { @override Widget build(BuildContext context) { - return const MaterialApp( - home: Scaffold( - body: Center( - child: Text('Hello World!'), + return MultiBlocProvider( + providers: [ + BlocProvider(create: (_) => AuthBloc()), + BlocProvider(create: (_) => SessionBloc()), + BlocProvider( + create: (context) => OrganizationBloc( + context.read(), + context.read(), + context.read(), + ), ), - ), + BlocProvider(create: (_) => PermissionBloc()), + BlocProvider( + create: (_) => FileBrowserBloc(MockFileRepository()), + ), + BlocProvider( + create: (_) => UploadBloc(MockFileRepository()), + ), + ], + child: MaterialApp.router(routerConfig: _router, theme: appTheme), ); } } diff --git a/b0esche_cloud/lib/models/file_item.dart b/b0esche_cloud/lib/models/file_item.dart new file mode 100644 index 0000000..ed2db3f --- /dev/null +++ b/b0esche_cloud/lib/models/file_item.dart @@ -0,0 +1,38 @@ +import 'package:equatable/equatable.dart'; + +enum FileType { folder, file } + +class FileItem extends Equatable { + final String name; + final String path; + final FileType type; + final int size; // in bytes, 0 for folders + final DateTime lastModified; + + const FileItem({ + required this.name, + required this.path, + required this.type, + this.size = 0, + required this.lastModified, + }); + + @override + List get props => [name, path, type, size, lastModified]; + + FileItem copyWith({ + String? name, + String? path, + FileType? type, + int? size, + DateTime? lastModified, + }) { + return FileItem( + name: name ?? this.name, + path: path ?? this.path, + type: type ?? this.type, + size: size ?? this.size, + lastModified: lastModified ?? this.lastModified, + ); + } +} diff --git a/b0esche_cloud/lib/models/user.dart b/b0esche_cloud/lib/models/user.dart new file mode 100644 index 0000000..93824c9 --- /dev/null +++ b/b0esche_cloud/lib/models/user.dart @@ -0,0 +1,15 @@ +import 'package:equatable/equatable.dart'; + +class User extends Equatable { + final String email; + final String? name; + + const User({required this.email, this.name}); + + @override + List get props => [email, name]; + + User copyWith({String? email, String? name}) { + return User(email: email ?? this.email, name: name ?? this.name); + } +} diff --git a/b0esche_cloud/lib/pages/document_viewer.dart b/b0esche_cloud/lib/pages/document_viewer.dart new file mode 100644 index 0000000..df9d4f4 --- /dev/null +++ b/b0esche_cloud/lib/pages/document_viewer.dart @@ -0,0 +1,90 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import '../blocs/document_viewer/document_viewer_bloc.dart'; +import '../blocs/document_viewer/document_viewer_event.dart'; +import '../blocs/document_viewer/document_viewer_state.dart'; + +class DocumentViewer extends StatefulWidget { + final String fileId; + + const DocumentViewer({super.key, required this.fileId}); + + @override + State createState() => _DocumentViewerState(); +} + +class _DocumentViewerState extends State { + late DocumentViewerBloc _viewerBloc; + + @override + void initState() { + super.initState(); + _viewerBloc = DocumentViewerBloc(); + _viewerBloc.add( + OpenDocument(fileId: widget.fileId, orgId: 'org1'), + ); // Assume org1 + } + + @override + Widget build(BuildContext context) { + return BlocProvider.value( + value: _viewerBloc, + child: Scaffold( + appBar: AppBar( + title: BlocBuilder( + builder: (context, state) { + if (state is ViewerReady) { + return Text(state.fileName); + } + return const Text('Document Viewer'); + }, + ), + actions: [ + IconButton( + icon: const Icon(Icons.refresh), + onPressed: () { + _viewerBloc.add(ReloadDocument()); + }, + ), + IconButton( + icon: const Icon(Icons.close), + onPressed: () { + _viewerBloc.add(CloseDocument()); + Navigator.of(context).pop(); + }, + ), + ], + ), + body: BlocBuilder( + builder: (context, state) { + if (state is ViewerLoading) { + return const Center(child: CircularProgressIndicator()); + } + if (state is ViewerError) { + return Center(child: Text('Error: ${state.error}')); + } + if (state is ViewerReady) { + return Container( + color: Colors.grey, + child: Center( + child: Text( + 'Document Viewer Placeholder\n(Backend URL: ${state.viewUrl})', + textAlign: TextAlign.center, + style: const TextStyle(color: Colors.white), + ), + ), + ); + } + return const Center(child: Text('No document loaded')); + }, + ), + ), + ); + } + + @override + void dispose() { + _viewerBloc.close(); + super.dispose(); + } +} diff --git a/b0esche_cloud/lib/pages/file_explorer.dart b/b0esche_cloud/lib/pages/file_explorer.dart new file mode 100644 index 0000000..c77ddcd --- /dev/null +++ b/b0esche_cloud/lib/pages/file_explorer.dart @@ -0,0 +1,249 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:file_picker/file_picker.dart' hide FileType; +import 'package:go_router/go_router.dart'; +import '../blocs/file_browser/file_browser_bloc.dart'; +import '../blocs/file_browser/file_browser_event.dart'; +import '../blocs/file_browser/file_browser_state.dart'; +import '../blocs/permission/permission_bloc.dart'; +import '../blocs/permission/permission_state.dart'; +import '../blocs/upload/upload_bloc.dart'; +import '../blocs/upload/upload_event.dart'; +import '../models/file_item.dart'; + +class FileExplorer extends StatefulWidget { + const FileExplorer({super.key}); + + @override + State createState() => _FileExplorerState(); +} + +class _FileExplorerState extends State { + @override + void initState() { + super.initState(); + // Assume org1 for now + context.read().add( + LoadDirectory(orgId: 'org1', path: '/'), + ); + } + + @override + Widget build(BuildContext context) { + return BlocBuilder( + builder: (context, state) { + if (state is DirectoryLoading) { + return const Center(child: CircularProgressIndicator()); + } + if (state is DirectoryError) { + return Center( + child: Text( + 'Error: ${state.error}', + style: const TextStyle(color: Colors.white), + ), + ); + } + if (state is DirectoryEmpty) { + return Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'Drive', + style: TextStyle(fontSize: 24, color: Colors.white), + ), + const SizedBox(height: 16), + // Back button + Row( + children: [ + IconButton( + icon: const Icon(Icons.arrow_back, color: Colors.white), + onPressed: () { + context.read().add( + LoadDirectory(orgId: 'org1', path: '/'), + ); + }, + ), + const Text( + 'Empty Folder', + style: TextStyle(color: Colors.white), + ), + ], + ), + const SizedBox(height: 16), + BlocBuilder( + builder: (context, permState) { + if (permState is PermissionLoaded && + permState.capabilities.canWrite) { + return ElevatedButton( + onPressed: () async { + final result = await FilePicker.platform.pickFiles(); + if (result != null && result.files.isNotEmpty) { + final files = result.files + .map( + (file) => FileItem( + name: file.name, + path: '/${file.name}', + type: FileType.file, + size: file.size, + lastModified: DateTime.now(), + ), + ) + .toList(); + context.read().add( + StartUpload( + files: files, + targetPath: '/', + orgId: 'org1', + ), + ); + } + }, + child: const Text('Upload File'), + ); + } + return const SizedBox.shrink(); + }, + ), + ], + ), + ); + } + if (state is DirectoryLoaded) { + return Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'Drive', + style: TextStyle(fontSize: 24, color: Colors.white), + ), + const SizedBox(height: 16), + // Breadcrumbs and back button + Visibility( + visible: state.breadcrumbs.isNotEmpty, + child: Column( + children: [ + Row( + children: [ + IconButton( + icon: const Icon( + Icons.arrow_back, + color: Colors.white, + ), + onPressed: () { + context.read().add( + LoadDirectory(orgId: 'org1', path: '/'), + ); + }, + ), + Expanded( + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: state.breadcrumbs.map((breadcrumb) { + return TextButton( + onPressed: () { + context.read().add( + NavigateToFolder(breadcrumb.path), + ); + }, + child: Text( + '${breadcrumb.name}/', + style: const TextStyle( + color: Colors.white70, + ), + ), + ); + }).toList(), + ), + ), + ), + ], + ), + const SizedBox(height: 16), + ], + ), + ), + BlocBuilder( + builder: (context, permState) { + if (permState is PermissionLoaded && + permState.capabilities.canWrite) { + return ElevatedButton( + onPressed: () async { + final result = await FilePicker.platform.pickFiles(); + if (result != null && result.files.isNotEmpty) { + final files = result.files + .map( + (file) => FileItem( + name: file.name, + path: '/${file.name}', + type: FileType.file, + size: file.size, + lastModified: DateTime.now(), + ), + ) + .toList(); + context.read().add( + StartUpload( + files: files, + targetPath: '/', + orgId: 'org1', + ), + ); + } + }, + child: const Text('Upload File'), + ); + } + return const SizedBox.shrink(); + }, + ), + const SizedBox(height: 16), + Expanded( + child: ListView.builder( + itemCount: state.files.length, + itemBuilder: (context, index) { + final file = state.files[index]; + return ListTile( + leading: Icon( + file.type == FileType.folder + ? Icons.folder + : Icons.insert_drive_file, + color: Colors.white, + ), + title: Text( + file.name, + style: const TextStyle(color: Colors.white), + ), + subtitle: Text( + file.type == FileType.folder + ? 'Folder' + : 'File - ${file.size} bytes', + style: const TextStyle(color: Colors.white70), + ), + onTap: () { + if (file.type == FileType.folder) { + context.read().add( + NavigateToFolder(file.path), + ); + } else { + // Open viewer + context.go('/viewer/${file.name}'); + } + }, + ); + }, + ), + ), + ], + ), + ); + } + return const SizedBox.shrink(); + }, + ); + } +} diff --git a/b0esche_cloud/lib/pages/home_page.dart b/b0esche_cloud/lib/pages/home_page.dart new file mode 100644 index 0000000..e2f2f07 --- /dev/null +++ b/b0esche_cloud/lib/pages/home_page.dart @@ -0,0 +1,175 @@ +import 'dart:ui'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:go_router/go_router.dart'; +import '../blocs/auth/auth_bloc.dart'; +import '../blocs/auth/auth_state.dart'; +import 'login_form.dart'; +import 'file_explorer.dart'; + +class HomePage extends StatefulWidget { + const HomePage({super.key}); + + @override + State createState() => _HomePageState(); +} + +class _HomePageState extends State with TickerProviderStateMixin { + late String _selectedTab = 'Drive'; + late AnimationController _animationController; + + @override + void initState() { + super.initState(); + _animationController = AnimationController( + duration: const Duration(milliseconds: 400), + vsync: this, + ); + } + + @override + void dispose() { + _animationController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.black, + body: Stack( + children: [ + Center( + child: BlocBuilder( + builder: (context, state) { + final isLoggedIn = state is AuthAuthenticated; + if (isLoggedIn && !_animationController.isAnimating) { + _animationController.forward(); + } else if (!isLoggedIn) { + _animationController.reverse(); + } + return AnimatedContainer( + duration: const Duration(milliseconds: 350), + curve: Curves.easeInOut, + width: isLoggedIn + ? MediaQuery.of(context).size.width * 0.9 + : 340, + height: isLoggedIn + ? MediaQuery.of(context).size.height * 0.9 + : 280, + child: ClipRRect( + borderRadius: BorderRadius.circular(16), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 10, sigmaY: 10), + child: Container( + decoration: BoxDecoration( + color: Colors.white.withValues(alpha: 0.1), + borderRadius: BorderRadius.circular(16), + border: Border.all( + color: Colors.white.withValues(alpha: 0.2), + ), + ), + child: isLoggedIn + ? const FileExplorer() + : const LoginForm(), + ), + ), + ), + ); + }, + ), + ), + Positioned( + top: 10, + left: 0, + right: 0, + child: Center( + child: Text( + 'b0esche.cloud', + style: TextStyle( + fontFamily: 'PixelatedElegance', + fontSize: 42, + color: Colors.white, + decoration: TextDecoration.underline, + decorationColor: Colors.white, + fontFeatures: [const FontFeature.slashedZero()], + ), + ), + ), + ), + Positioned( + top: 10, + right: 20, + child: BlocBuilder( + builder: (context, state) { + final isLoggedIn = state is AuthAuthenticated; + if (!isLoggedIn) { + return const SizedBox.shrink(); + } + return ScaleTransition( + scale: Tween(begin: 0, end: 1).animate( + CurvedAnimation( + parent: _animationController, + curve: Curves.easeOutBack, + ), + ), + child: Row( + children: [ + _buildNavButton('Drive', Icons.cloud), + const SizedBox(width: 16), + _buildNavButton('Mail', Icons.mail), + const SizedBox(width: 16), + _buildNavButton('Add', Icons.add), + const SizedBox(width: 16), + _buildNavButton('Profile', Icons.person, isAvatar: true), + ], + ), + ); + }, + ), + ), + ], + ), + ); + } + + Widget _buildNavButton(String label, IconData icon, {bool isAvatar = false}) { + final isSelected = _selectedTab == label; + final highlightColor = Color.fromARGB(255, 100, 200, 255); + final defaultColor = Colors.white70; + + return GestureDetector( + onTap: () { + setState(() { + _selectedTab = label; + }); + }, + child: isAvatar + ? CircleAvatar( + backgroundColor: isSelected ? highlightColor : defaultColor, + child: Icon(icon, color: Colors.black), + ) + : Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + icon, + color: isSelected ? highlightColor : defaultColor, + size: 24, + ), + const SizedBox(height: 4), + Text( + label, + style: TextStyle( + color: isSelected ? highlightColor : defaultColor, + fontSize: 12, + fontWeight: isSelected + ? FontWeight.bold + : FontWeight.normal, + ), + ), + ], + ), + ); + } +} diff --git a/b0esche_cloud/lib/pages/login_form.dart b/b0esche_cloud/lib/pages/login_form.dart new file mode 100644 index 0000000..87e3330 --- /dev/null +++ b/b0esche_cloud/lib/pages/login_form.dart @@ -0,0 +1,97 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import '../blocs/auth/auth_bloc.dart'; +import '../blocs/auth/auth_event.dart'; +import '../blocs/auth/auth_state.dart'; +import '../blocs/session/session_bloc.dart'; +import '../blocs/session/session_event.dart'; + +class LoginForm extends StatefulWidget { + const LoginForm({super.key}); + + @override + State createState() => _LoginFormState(); +} + +class _LoginFormState extends State { + final _emailController = TextEditingController(); + final _passwordController = TextEditingController(); + + @override + Widget build(BuildContext context) { + return BlocListener( + listener: (context, state) { + if (state is AuthFailure) { + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(state.error))); + } else if (state is AuthAuthenticated) { + // Start session + context.read().add(SessionStarted(state.token)); + } + }, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Text( + 'sign in', + style: TextStyle(fontSize: 24, color: Colors.white), + ), + const SizedBox(height: 16), + TextField( + controller: _emailController, + decoration: const InputDecoration( + labelText: 'email', + labelStyle: TextStyle(color: Colors.white), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: Colors.white), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: Colors.white), + ), + ), + style: const TextStyle(color: Colors.white), + ), + const SizedBox(height: 16), + TextField( + controller: _passwordController, + decoration: const InputDecoration( + labelText: 'password', + labelStyle: TextStyle(color: Colors.white), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: Colors.white), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: Colors.white), + ), + ), + obscureText: true, + style: const TextStyle(color: Colors.white), + ), + const SizedBox(height: 16), + BlocBuilder( + builder: (context, state) { + if (state is AuthLoading) { + return const CircularProgressIndicator(); + } + return ElevatedButton( + onPressed: () { + context.read().add( + LoginRequested( + _emailController.text, + _passwordController.text, + ), + ); + }, + child: const Text('sign in'), + ); + }, + ), + ], + ), + ), + ); + } +} diff --git a/b0esche_cloud/lib/repositories/auth_repository.dart b/b0esche_cloud/lib/repositories/auth_repository.dart new file mode 100644 index 0000000..dab4fb1 --- /dev/null +++ b/b0esche_cloud/lib/repositories/auth_repository.dart @@ -0,0 +1,7 @@ +import '../models/user.dart'; + +abstract class AuthRepository { + Future login(String email, String password); + Future logout(); + Future getCurrentUser(); +} diff --git a/b0esche_cloud/lib/repositories/file_repository.dart b/b0esche_cloud/lib/repositories/file_repository.dart new file mode 100644 index 0000000..0f4d6b0 --- /dev/null +++ b/b0esche_cloud/lib/repositories/file_repository.dart @@ -0,0 +1,8 @@ +import '../models/file_item.dart'; + +abstract class FileRepository { + Future> getFiles(String orgId, String path); + Future getFile(String orgId, String path); + Future uploadFile(String orgId, FileItem file); + Future deleteFile(String orgId, String path); +} diff --git a/b0esche_cloud/lib/repositories/mock_auth_repository.dart b/b0esche_cloud/lib/repositories/mock_auth_repository.dart new file mode 100644 index 0000000..a493720 --- /dev/null +++ b/b0esche_cloud/lib/repositories/mock_auth_repository.dart @@ -0,0 +1,25 @@ +import '../models/user.dart'; +import '../repositories/auth_repository.dart'; + +class MockAuthRepository implements AuthRepository { + @override + Future login(String email, String password) async { + await Future.delayed(const Duration(seconds: 1)); + if (email.isNotEmpty && password.isNotEmpty) { + return User(email: email); + } else { + throw Exception('Invalid credentials'); + } + } + + @override + Future logout() async { + // Mock logout + } + + @override + Future getCurrentUser() async { + // Mock: return null or a user + return null; + } +} diff --git a/b0esche_cloud/lib/repositories/mock_file_repository.dart b/b0esche_cloud/lib/repositories/mock_file_repository.dart new file mode 100644 index 0000000..d40e614 --- /dev/null +++ b/b0esche_cloud/lib/repositories/mock_file_repository.dart @@ -0,0 +1,63 @@ +import '../models/file_item.dart'; +import '../repositories/file_repository.dart'; + +class MockFileRepository implements FileRepository { + final List _files = [ + FileItem( + name: 'Documents', + path: '/Documents', + type: FileType.folder, + lastModified: DateTime.now(), + ), + FileItem( + name: 'Images', + path: '/Images', + type: FileType.folder, + lastModified: DateTime.now(), + ), + FileItem( + name: 'report.pdf', + path: '/report.pdf', + type: FileType.file, + size: 1024, + lastModified: DateTime.now(), + ), + FileItem( + name: 'code.dart', + path: '/code.dart', + type: FileType.file, + size: 512, + lastModified: DateTime.now(), + ), + ]; + + @override + Future> getFiles(String orgId, String path) async { + await Future.delayed(const Duration(seconds: 1)); + if (path == '/') { + return _files; + } else { + // For subfolders, return empty for simplicity + return []; + } + } + + @override + Future getFile(String orgId, String path) async { + return _files.firstWhere( + (f) => f.path == path, + orElse: () => null as FileItem, + ); + } + + @override + Future uploadFile(String orgId, FileItem file) async { + await Future.delayed(const Duration(seconds: 1)); + _files.add(file); + } + + @override + Future deleteFile(String orgId, String path) async { + _files.removeWhere((f) => f.path == path); + } +} diff --git a/b0esche_cloud/lib/services/auth_service.dart b/b0esche_cloud/lib/services/auth_service.dart new file mode 100644 index 0000000..d3c0739 --- /dev/null +++ b/b0esche_cloud/lib/services/auth_service.dart @@ -0,0 +1,26 @@ +import '../models/user.dart'; +import '../repositories/auth_repository.dart'; + +class AuthService { + final AuthRepository _authRepository; + + AuthService(this._authRepository); + + Future login(String email, String password) async { + if (email.isEmpty || password.isEmpty) { + throw Exception('Email and password are required'); + } + if (!email.contains('@')) { + throw Exception('Invalid email format'); + } + return await _authRepository.login(email, password); + } + + Future logout() async { + await _authRepository.logout(); + } + + Future getCurrentUser() async { + return await _authRepository.getCurrentUser(); + } +} diff --git a/b0esche_cloud/lib/services/file_service.dart b/b0esche_cloud/lib/services/file_service.dart new file mode 100644 index 0000000..bff4f12 --- /dev/null +++ b/b0esche_cloud/lib/services/file_service.dart @@ -0,0 +1,36 @@ +import '../models/file_item.dart'; +import '../repositories/file_repository.dart'; + +class FileService { + final FileRepository _fileRepository; + + FileService(this._fileRepository); + + Future> getFiles(String orgId, String path) async { + if (path.isEmpty) { + throw Exception('Path cannot be empty'); + } + return await _fileRepository.getFiles(orgId, path); + } + + Future getFile(String orgId, String path) async { + if (path.isEmpty) { + return null; + } + return await _fileRepository.getFile(orgId, path); + } + + Future uploadFile(String orgId, FileItem file) async { + if (file.name.isEmpty) { + throw Exception('File name cannot be empty'); + } + await _fileRepository.uploadFile(orgId, file); + } + + Future deleteFile(String orgId, String path) async { + if (path.isEmpty) { + throw Exception('Path cannot be empty'); + } + await _fileRepository.deleteFile(orgId, path); + } +} diff --git a/b0esche_cloud/lib/viewmodels/file_explorer_view_model.dart b/b0esche_cloud/lib/viewmodels/file_explorer_view_model.dart new file mode 100644 index 0000000..7740f9d --- /dev/null +++ b/b0esche_cloud/lib/viewmodels/file_explorer_view_model.dart @@ -0,0 +1,56 @@ +import 'package:flutter/foundation.dart'; +import '../models/file_item.dart'; +import '../services/file_service.dart'; + +class FileExplorerViewModel extends ChangeNotifier { + final FileService _fileService; + + FileExplorerViewModel(this._fileService); + + List _files = []; + bool _isLoading = false; + String? _error; + String _currentPath = '/'; + + List get files => _files; + bool get isLoading => _isLoading; + String? get error => _error; + String get currentPath => _currentPath; + + Future loadFiles([String? path]) async { + _isLoading = true; + _error = null; + if (path != null) _currentPath = path; + notifyListeners(); + + try { + _files = await _fileService.getFiles("", _currentPath); + } catch (e) { + _error = e.toString(); + _files = []; + } finally { + _isLoading = false; + notifyListeners(); + } + } + + Future uploadFile(FileItem file) async { + try { + await _fileService.uploadFile("", file); + await loadFiles(); // Reload files + } catch (e) { + _error = e.toString(); + notifyListeners(); + } + } + + Future deleteFile(String path) async { + try { + await _fileService.deleteFile("", path); + await loadFiles(); // Reload files + } catch (e) { + _error = e.toString(); + notifyListeners(); + } + } +} diff --git a/b0esche_cloud/lib/viewmodels/login_view_model.dart b/b0esche_cloud/lib/viewmodels/login_view_model.dart new file mode 100644 index 0000000..fc7dac7 --- /dev/null +++ b/b0esche_cloud/lib/viewmodels/login_view_model.dart @@ -0,0 +1,65 @@ +import 'package:flutter/foundation.dart'; +import '../models/user.dart'; +import '../services/auth_service.dart'; + +class LoginViewModel extends ChangeNotifier { + final AuthService _authService; + + LoginViewModel(this._authService); + + bool _isLoading = false; + String? _error; + User? _currentUser; + + bool get isLoading => _isLoading; + String? get error => _error; + User? get currentUser => _currentUser; + bool get isLoggedIn => _currentUser != null; + + Future login(String email, String password) async { + _isLoading = true; + _error = null; + notifyListeners(); + + try { + _currentUser = await _authService.login(email, password); + _error = null; + } catch (e) { + _error = e.toString(); + _currentUser = null; + } finally { + _isLoading = false; + notifyListeners(); + } + } + + Future logout() async { + _isLoading = true; + notifyListeners(); + + try { + await _authService.logout(); + _currentUser = null; + _error = null; + } catch (e) { + _error = e.toString(); + } finally { + _isLoading = false; + notifyListeners(); + } + } + + Future checkCurrentUser() async { + _isLoading = true; + notifyListeners(); + + try { + _currentUser = await _authService.getCurrentUser(); + } catch (e) { + _error = e.toString(); + } finally { + _isLoading = false; + notifyListeners(); + } + } +} diff --git a/b0esche_cloud/linux/flutter/generated_plugin_registrant.cc b/b0esche_cloud/linux/flutter/generated_plugin_registrant.cc index e71a16d..26415c8 100644 --- a/b0esche_cloud/linux/flutter/generated_plugin_registrant.cc +++ b/b0esche_cloud/linux/flutter/generated_plugin_registrant.cc @@ -6,6 +6,26 @@ #include "generated_plugin_registrant.h" +#include +#include +#include +#include +#include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) desktop_drop_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "DesktopDropPlugin"); + desktop_drop_plugin_register_with_registrar(desktop_drop_registrar); + g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin"); + flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar); + g_autoptr(FlPluginRegistrar) irondash_engine_context_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "IrondashEngineContextPlugin"); + irondash_engine_context_plugin_register_with_registrar(irondash_engine_context_registrar); + g_autoptr(FlPluginRegistrar) super_native_extensions_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "SuperNativeExtensionsPlugin"); + super_native_extensions_plugin_register_with_registrar(super_native_extensions_registrar); + g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); + url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); } diff --git a/b0esche_cloud/linux/flutter/generated_plugins.cmake b/b0esche_cloud/linux/flutter/generated_plugins.cmake index 2e1de87..4a6db20 100644 --- a/b0esche_cloud/linux/flutter/generated_plugins.cmake +++ b/b0esche_cloud/linux/flutter/generated_plugins.cmake @@ -3,6 +3,11 @@ # list(APPEND FLUTTER_PLUGIN_LIST + desktop_drop + flutter_secure_storage_linux + irondash_engine_context + super_native_extensions + url_launcher_linux ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/b0esche_cloud/macos/Flutter/Flutter-Debug.xcconfig b/b0esche_cloud/macos/Flutter/Flutter-Debug.xcconfig index c2efd0b..4b81f9b 100644 --- a/b0esche_cloud/macos/Flutter/Flutter-Debug.xcconfig +++ b/b0esche_cloud/macos/Flutter/Flutter-Debug.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "ephemeral/Flutter-Generated.xcconfig" diff --git a/b0esche_cloud/macos/Flutter/Flutter-Release.xcconfig b/b0esche_cloud/macos/Flutter/Flutter-Release.xcconfig index c2efd0b..5caa9d1 100644 --- a/b0esche_cloud/macos/Flutter/Flutter-Release.xcconfig +++ b/b0esche_cloud/macos/Flutter/Flutter-Release.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "ephemeral/Flutter-Generated.xcconfig" diff --git a/b0esche_cloud/macos/Flutter/GeneratedPluginRegistrant.swift b/b0esche_cloud/macos/Flutter/GeneratedPluginRegistrant.swift index cccf817..27b1cdc 100644 --- a/b0esche_cloud/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/b0esche_cloud/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,6 +5,30 @@ import FlutterMacOS import Foundation +import connectivity_plus +import desktop_drop +import device_info_plus +import file_picker +import flutter_secure_storage_macos +import irondash_engine_context +import path_provider_foundation +import shared_preferences_foundation +import sqflite_darwin +import super_native_extensions +import syncfusion_pdfviewer_macos +import url_launcher_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin")) + DesktopDropPlugin.register(with: registry.registrar(forPlugin: "DesktopDropPlugin")) + DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) + FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin")) + FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) + IrondashEngineContextPlugin.register(with: registry.registrar(forPlugin: "IrondashEngineContextPlugin")) + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) + SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) + SuperNativeExtensionsPlugin.register(with: registry.registrar(forPlugin: "SuperNativeExtensionsPlugin")) + SyncfusionFlutterPdfViewerPlugin.register(with: registry.registrar(forPlugin: "SyncfusionFlutterPdfViewerPlugin")) + UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) } diff --git a/b0esche_cloud/macos/Podfile b/b0esche_cloud/macos/Podfile new file mode 100644 index 0000000..ff5ddb3 --- /dev/null +++ b/b0esche_cloud/macos/Podfile @@ -0,0 +1,42 @@ +platform :osx, '10.15' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + end +end diff --git a/b0esche_cloud/pubspec.lock b/b0esche_cloud/pubspec.lock index befc80c..6444d9f 100644 --- a/b0esche_cloud/pubspec.lock +++ b/b0esche_cloud/pubspec.lock @@ -1,6 +1,30 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7" + url: "https://pub.dev" + source: hosted + version: "67.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d" + url: "https://pub.dev" + source: hosted + version: "6.4.1" + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" async: dependency: transitive description: @@ -9,6 +33,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.13.0" + bloc: + dependency: "direct main" + description: + name: bloc + sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e" + url: "https://pub.dev" + source: hosted + version: "8.1.4" + bloc_test: + dependency: "direct dev" + description: + name: bloc_test + sha256: "165a6ec950d9252ebe36dc5335f2e6eb13055f33d56db0eeb7642768849b43d2" + url: "https://pub.dev" + source: hosted + version: "9.1.7" boolean_selector: dependency: transitive description: @@ -17,6 +57,94 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.2" + build: + dependency: transitive + description: + name: build + sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + build_config: + dependency: transitive + description: + name: build_config + sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: bf05f6e12cfea92d3c09308d7bcdab1906cd8a179b023269eed00c071004b957 + url: "https://pub.dev" + source: hosted + version: "4.1.1" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a" + url: "https://pub.dev" + source: hosted + version: "2.4.2" + build_runner: + dependency: "direct dev" + description: + name: build_runner + sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d" + url: "https://pub.dev" + source: hosted + version: "2.4.13" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0 + url: "https://pub.dev" + source: hosted + version: "7.3.2" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: "426cf75afdb23aa74bd4e471704de3f9393f3c7b04c1e2d9c6f1073ae0b8b139" + url: "https://pub.dev" + source: hosted + version: "8.12.1" + cached_network_image: + dependency: "direct main" + description: + name: cached_network_image + sha256: "7c1183e361e5c8b0a0f21a28401eecdbde252441106a9816400dd4c2b2424916" + url: "https://pub.dev" + source: hosted + version: "3.4.1" + cached_network_image_platform_interface: + dependency: transitive + description: + name: cached_network_image_platform_interface + sha256: "35814b016e37fbdc91f7ae18c8caf49ba5c88501813f73ce8a07027a395e2829" + url: "https://pub.dev" + source: hosted + version: "4.1.1" + cached_network_image_web: + dependency: transitive + description: + name: cached_network_image_web + sha256: "980842f4e8e2535b8dbd3d5ca0b1f0ba66bf61d14cc3a17a9b4788a3685ba062" + url: "https://pub.dev" + source: hosted + version: "1.3.1" characters: dependency: transitive description: @@ -25,6 +153,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" + url: "https://pub.dev" + source: hosted + version: "2.0.4" + cli_config: + dependency: transitive + description: + name: cli_config + sha256: ac20a183a07002b700f0c25e61b7ee46b23c309d76ab7b7640a028f18e4d99ec + url: "https://pub.dev" + source: hosted + version: "0.2.0" clock: dependency: transitive description: @@ -33,14 +177,142 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.2" - collection: + code_builder: dependency: transitive + description: + name: code_builder + sha256: "11654819532ba94c34de52ff5feb52bd81cba1de00ef2ed622fd50295f9d4243" + url: "https://pub.dev" + source: hosted + version: "4.11.0" + collection: + dependency: "direct main" description: name: collection sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" url: "https://pub.dev" source: hosted version: "1.19.1" + connectivity_plus: + dependency: "direct main" + description: + name: connectivity_plus + sha256: "224a77051d52a11fbad53dd57827594d3bd24f945af28bd70bab376d68d437f0" + url: "https://pub.dev" + source: hosted + version: "5.0.2" + connectivity_plus_platform_interface: + dependency: transitive + description: + name: connectivity_plus_platform_interface + sha256: cf1d1c28f4416f8c654d7dc3cd638ec586076255d407cef3ddbdaf178272a71a + url: "https://pub.dev" + source: hosted + version: "1.2.4" + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + coverage: + dependency: transitive + description: + name: coverage + sha256: "5da775aa218eaf2151c721b16c01c7676fbfdd99cebba2bf64e8b807a28ff94d" + url: "https://pub.dev" + source: hosted + version: "1.15.0" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "701dcfc06da0882883a2657c445103380e53e647060ad8d9dfb710c100996608" + url: "https://pub.dev" + source: hosted + version: "0.3.5+1" + crypto: + dependency: transitive + description: + name: crypto + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf + url: "https://pub.dev" + source: hosted + version: "3.0.7" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9" + url: "https://pub.dev" + source: hosted + version: "2.3.6" + dbus: + dependency: transitive + description: + name: dbus + sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" + url: "https://pub.dev" + source: hosted + version: "0.7.11" + desktop_drop: + dependency: "direct main" + description: + name: desktop_drop + sha256: d55a010fe46c8e8fcff4ea4b451a9ff84a162217bdb3b2a0aa1479776205e15d + url: "https://pub.dev" + source: hosted + version: "0.4.4" + device_info_plus: + dependency: transitive + description: + name: device_info_plus + sha256: "77f757b789ff68e4eaf9c56d1752309bd9f7ad557cb105b938a7f8eb89e59110" + url: "https://pub.dev" + source: hosted + version: "9.1.2" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f + url: "https://pub.dev" + source: hosted + version: "7.0.3" + diff_match_patch: + dependency: transitive + description: + name: diff_match_patch + sha256: "2efc9e6e8f449d0abe15be240e2c2a3bcd977c8d126cfd70598aee60af35c0a4" + url: "https://pub.dev" + source: hosted + version: "0.4.1" + dio: + dependency: "direct main" + description: + name: dio + sha256: d90ee57923d1828ac14e492ca49440f65477f4bb1263575900be731a3dac66a9 + url: "https://pub.dev" + source: hosted + version: "5.9.0" + dio_web_adapter: + dependency: transitive + description: + name: dio_web_adapter + sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + equatable: + dependency: "direct main" + description: + name: equatable + sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7" + url: "https://pub.dev" + source: hosted + version: "2.0.7" fake_async: dependency: transitive description: @@ -49,11 +321,83 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.3" + ffi: + dependency: transitive + description: + name: ffi + sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + file_picker: + dependency: "direct main" + description: + name: file_picker + sha256: ab13ae8ef5580a411c458d6207b6774a6c237d77ac37011b13994879f68a8810 + url: "https://pub.dev" + source: hosted + version: "8.3.7" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" flutter: dependency: "direct main" description: flutter source: sdk version: "0.0.0" + flutter_bloc: + dependency: "direct main" + description: + name: flutter_bloc + sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a + url: "https://pub.dev" + source: hosted + version: "8.1.6" + flutter_cache_manager: + dependency: transitive + description: + name: flutter_cache_manager + sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386" + url: "https://pub.dev" + source: hosted + version: "3.4.1" + flutter_dropzone: + dependency: "direct main" + description: + name: flutter_dropzone + sha256: d0917c4e366ebb3a98c9c02faac79223d119af5e236967c70e7e4002cdfb20d3 + url: "https://pub.dev" + source: hosted + version: "4.2.1" + flutter_dropzone_platform_interface: + dependency: transitive + description: + name: flutter_dropzone_platform_interface + sha256: "96d2c51c86063ba150551c3b40fd26c5a18785bee071c0c751502d28a545df3b" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + flutter_dropzone_web: + dependency: transitive + description: + name: flutter_dropzone_web + sha256: "03b216f9443add6ad1d075ab513a354a47edf3d1b87d830a8ed314f0d3a2beac" + url: "https://pub.dev" + source: hosted + version: "4.2.0" flutter_lints: dependency: "direct dev" description: @@ -62,11 +406,256 @@ packages: url: "https://pub.dev" source: hosted version: "6.0.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: ee8068e0e1cd16c4a82714119918efdeed33b3ba7772c54b5d094ab53f9b7fd1 + url: "https://pub.dev" + source: hosted + version: "2.0.33" + flutter_secure_storage: + dependency: "direct main" + description: + name: flutter_secure_storage + sha256: "9cad52d75ebc511adfae3d447d5d13da15a55a92c9410e50f67335b6d21d16ea" + url: "https://pub.dev" + source: hosted + version: "9.2.4" + flutter_secure_storage_linux: + dependency: transitive + description: + name: flutter_secure_storage_linux + sha256: be76c1d24a97d0b98f8b54bce6b481a380a6590df992d0098f868ad54dc8f688 + url: "https://pub.dev" + source: hosted + version: "1.2.3" + flutter_secure_storage_macos: + dependency: transitive + description: + name: flutter_secure_storage_macos + sha256: "6c0a2795a2d1de26ae202a0d78527d163f4acbb11cde4c75c670f3a0fc064247" + url: "https://pub.dev" + source: hosted + version: "3.1.3" + flutter_secure_storage_platform_interface: + dependency: transitive + description: + name: flutter_secure_storage_platform_interface + sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_secure_storage_web: + dependency: transitive + description: + name: flutter_secure_storage_web + sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + flutter_secure_storage_windows: + dependency: transitive + description: + name: flutter_secure_storage_windows + sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + flutter_staggered_grid_view: + dependency: transitive + description: + name: flutter_staggered_grid_view + sha256: "19e7abb550c96fbfeb546b23f3ff356ee7c59a019a651f8f102a4ba9b7349395" + url: "https://pub.dev" + source: hosted + version: "0.7.0" + flutter_svg: + dependency: "direct main" + description: + name: flutter_svg + sha256: "87fbd7c534435b6c5d9d98b01e1fd527812b82e68ddd8bd35fc45ed0fa8f0a95" + url: "https://pub.dev" + source: hosted + version: "2.2.3" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" + source: hosted + version: "4.0.0" + get_it: + dependency: "direct main" + description: + name: get_it + sha256: d85128a5dae4ea777324730dc65edd9c9f43155c109d5cc0a69cab74139fbac1 + url: "https://pub.dev" + source: hosted + version: "7.7.0" + glob: + dependency: transitive + description: + name: glob + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.dev" + source: hosted + version: "2.1.3" + go_router: + dependency: "direct main" + description: + name: go_router + sha256: c5fa45fa502ee880839e3b2152d987c44abae26d064a2376d4aad434cf0f7b15 + url: "https://pub.dev" + source: hosted + version: "12.1.3" + graphs: + dependency: transitive + description: + name: graphs + sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + hive: + dependency: "direct main" + description: + name: hive + sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941" + url: "https://pub.dev" + source: hosted + version: "2.2.3" + hive_flutter: + dependency: "direct main" + description: + name: hive_flutter + sha256: dca1da446b1d808a51689fb5d0c6c9510c0a2ba01e22805d492c73b68e33eecc + url: "https://pub.dev" + source: hosted + version: "1.1.0" + hive_generator: + dependency: "direct dev" + description: + name: hive_generator + sha256: "06cb8f58ace74de61f63500564931f9505368f45f98958bd7a6c35ba24159db4" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + http: + dependency: transitive + description: + name: http + sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" + url: "https://pub.dev" + source: hosted + version: "1.6.0" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 + url: "https://pub.dev" + source: hosted + version: "3.2.2" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" + infinite_scroll_pagination: + dependency: "direct main" + description: + name: infinite_scroll_pagination + sha256: "4047eb8191e8b33573690922a9e995af64c3949dc87efc844f936b039ea279df" + url: "https://pub.dev" + source: hosted + version: "4.1.0" + injectable: + dependency: "direct main" + description: + name: injectable + sha256: "29559f7e3daebf0084597de86a825ae7f149d9e30264b7fbc71d1069ae82697d" + url: "https://pub.dev" + source: hosted + version: "2.6.0" + injectable_generator: + dependency: "direct dev" + description: + name: injectable_generator + sha256: af403d76c7b18b4217335e0075e950cd0579fd7f8d7bd47ee7c85ada31680ba1 + url: "https://pub.dev" + source: hosted + version: "2.6.2" + intl: + dependency: "direct main" + description: + name: intl + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + url: "https://pub.dev" + source: hosted + version: "0.19.0" + io: + dependency: transitive + description: + name: io + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b + url: "https://pub.dev" + source: hosted + version: "1.0.5" + irondash_engine_context: + dependency: transitive + description: + name: irondash_engine_context + sha256: "2bb0bc13dfda9f5aaef8dde06ecc5feb1379f5bb387d59716d799554f3f305d7" + url: "https://pub.dev" + source: hosted + version: "0.5.5" + irondash_message_channel: + dependency: transitive + description: + name: irondash_message_channel + sha256: dd581214215dca054bd9873209d690ec3609288c28774cb509dbd86b21180cf8 + url: "https://pub.dev" + source: hosted + version: "0.6.0" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + url: "https://pub.dev" + source: hosted + version: "4.9.0" + json_serializable: + dependency: "direct dev" + description: + name: json_serializable + sha256: ea1432d167339ea9b5bb153f0571d0039607a873d6e04e0117af043f14a1fd4b + url: "https://pub.dev" + source: hosted + version: "6.8.0" leak_tracker: dependency: transitive description: @@ -99,6 +688,22 @@ packages: url: "https://pub.dev" source: hosted version: "6.0.0" + logger: + dependency: "direct main" + description: + name: logger + sha256: a7967e31b703831a893bbc3c3dd11db08126fe5f369b5c648a36f821979f5be3 + url: "https://pub.dev" + source: hosted + version: "2.6.2" + logging: + dependency: transitive + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" matcher: dependency: transitive description: @@ -123,6 +728,70 @@ packages: url: "https://pub.dev" source: hosted version: "1.17.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + mockito: + dependency: "direct dev" + description: + name: mockito + sha256: "6841eed20a7befac0ce07df8116c8b8233ed1f4486a7647c7fc5a02ae6163917" + url: "https://pub.dev" + source: hosted + version: "5.4.4" + mocktail: + dependency: transitive + description: + name: mocktail + sha256: "890df3f9688106f25755f26b1c60589a92b3ab91a22b8b224947ad041bf172d8" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + nm: + dependency: transitive + description: + name: nm + sha256: "2c9aae4127bdc8993206464fcc063611e0e36e72018696cd9631023a31b24254" + url: "https://pub.dev" + source: hosted + version: "0.5.0" + node_preamble: + dependency: transitive + description: + name: node_preamble + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + octo_image: + dependency: transitive + description: + name: octo_image + sha256: "34faa6639a78c7e3cbe79be6f9f96535867e879748ade7d17c9b1ae7536293bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" path: dependency: transitive description: @@ -131,11 +800,275 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.1" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + path_provider: + dependency: "direct main" + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: f2c65e21139ce2c3dad46922be8272bb5963516045659e71bb16e151c93b580e + url: "https://pub.dev" + source: hosted + version: "2.2.22" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "6d13aece7b3f5c5a9731eaf553ff9dcbc2eff41087fd2df587fd0fed9a3eb0c4" + url: "https://pub.dev" + source: hosted + version: "2.5.1" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: "1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1" + url: "https://pub.dev" + source: hosted + version: "7.0.1" + pixel_snap: + dependency: transitive + description: + name: pixel_snap + sha256: "677410ea37b07cd37ecb6d5e6c0d8d7615a7cf3bd92ba406fd1ac57e937d1fb0" + url: "https://pub.dev" + source: hosted + version: "0.1.5" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pool: + dependency: transitive + description: + name: pool + sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d" + url: "https://pub.dev" + source: hosted + version: "1.5.2" + provider: + dependency: "direct main" + description: + name: provider + sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272" + url: "https://pub.dev" + source: hosted + version: "6.1.5+1" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + recase: + dependency: transitive + description: + name: recase + sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213 + url: "https://pub.dev" + source: hosted + version: "4.1.0" + rxdart: + dependency: transitive + description: + name: rxdart + sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" + url: "https://pub.dev" + source: hosted + version: "0.28.0" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + sha256: "2939ae520c9024cb197fc20dee269cd8cdbf564c8b5746374ec6cacdc5169e64" + url: "https://pub.dev" + source: hosted + version: "2.5.4" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "83af5c682796c0f7719c2bbf74792d113e40ae97981b8f266fa84574573556bc" + url: "https://pub.dev" + source: hosted + version: "2.4.18" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f" + url: "https://pub.dev" + source: hosted + version: "2.5.6" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 + url: "https://pub.dev" + source: hosted + version: "2.4.3" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shelf: + dependency: transitive + description: + name: shelf + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 + url: "https://pub.dev" + source: hosted + version: "1.4.2" + shelf_packages_handler: + dependency: transitive + description: + name: shelf_packages_handler + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + shelf_static: + dependency: transitive + description: + name: shelf_static + sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3 + url: "https://pub.dev" + source: hosted + version: "1.1.3" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67 + url: "https://pub.dev" + source: hosted + version: "2.0.1" sky_engine: dependency: transitive description: flutter source: sdk version: "0.0.0" + sliver_tools: + dependency: transitive + description: + name: sliver_tools + sha256: eae28220badfb9d0559207badcbbc9ad5331aac829a88cb0964d330d2a4636a6 + url: "https://pub.dev" + source: hosted + version: "0.2.12" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + source_helper: + dependency: transitive + description: + name: source_helper + sha256: "86d247119aedce8e63f4751bd9626fc9613255935558447569ad42f9f5b48b3c" + url: "https://pub.dev" + source: hosted + version: "1.3.5" + source_map_stack_trace: + dependency: transitive + description: + name: source_map_stack_trace + sha256: c0713a43e323c3302c2abe2a1cc89aa057a387101ebd280371d6a6c9fa68516b + url: "https://pub.dev" + source: hosted + version: "2.1.2" + source_maps: + dependency: transitive + description: + name: source_maps + sha256: "190222579a448b03896e0ca6eca5998fa810fda630c1d65e2f78b3f638f54812" + url: "https://pub.dev" + source: hosted + version: "0.10.13" source_span: dependency: transitive description: @@ -144,6 +1077,46 @@ packages: url: "https://pub.dev" source: hosted version: "1.10.1" + sqflite: + dependency: transitive + description: + name: sqflite + sha256: e2297b1da52f127bc7a3da11439985d9b536f75070f3325e62ada69a5c585d03 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + sqflite_android: + dependency: transitive + description: + name: sqflite_android + sha256: ecd684501ebc2ae9a83536e8b15731642b9570dc8623e0073d227d0ee2bfea88 + url: "https://pub.dev" + source: hosted + version: "2.4.2+2" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + sha256: "6ef422a4525ecc601db6c0a2233ff448c731307906e92cabc9ba292afaae16a6" + url: "https://pub.dev" + source: hosted + version: "2.5.6" + sqflite_darwin: + dependency: transitive + description: + name: sqflite_darwin + sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" + url: "https://pub.dev" + source: hosted + version: "2.4.2" + sqflite_platform_interface: + dependency: transitive + description: + name: sqflite_platform_interface + sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" + url: "https://pub.dev" + source: hosted + version: "2.4.0" stack_trace: dependency: transitive description: @@ -160,6 +1133,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 + url: "https://pub.dev" + source: hosted + version: "2.1.1" string_scanner: dependency: transitive description: @@ -168,6 +1149,94 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.1" + super_context_menu: + dependency: "direct main" + description: + name: super_context_menu + sha256: a8e8d813ed109b6c76ea5ed37ed7d4ac371e2989825edb1b214a2296f0951df6 + url: "https://pub.dev" + source: hosted + version: "0.8.5" + super_native_extensions: + dependency: transitive + description: + name: super_native_extensions + sha256: f96db6b137a0b135e43034289bb55ca6447b65225076036e81f97ebb6381ffeb + url: "https://pub.dev" + source: hosted + version: "0.8.5" + syncfusion_flutter_core: + dependency: transitive + description: + name: syncfusion_flutter_core + sha256: "7666506885ebc8f62bb928ad4588a73e20caaff2b2cf2b2b56f67d98f4113525" + url: "https://pub.dev" + source: hosted + version: "24.2.9" + syncfusion_flutter_pdf: + dependency: transitive + description: + name: syncfusion_flutter_pdf + sha256: a9e85bbfd574bb262733b33494240fda38bfeb58553537560ba4b3f54a31418b + url: "https://pub.dev" + source: hosted + version: "24.2.9" + syncfusion_flutter_pdfviewer: + dependency: "direct main" + description: + name: syncfusion_flutter_pdfviewer + sha256: "90bb093838a4a2b3f59f5aa1167325185ee83aa7bc8c5857e73b9a978c1fe299" + url: "https://pub.dev" + source: hosted + version: "24.2.8" + syncfusion_flutter_signaturepad: + dependency: transitive + description: + name: syncfusion_flutter_signaturepad + sha256: "2ab2c81176ed6779a0e5f7724645c9af2a1656eec3f53ef6b10d67d9d65f0b4a" + url: "https://pub.dev" + source: hosted + version: "24.2.9" + syncfusion_pdfviewer_macos: + dependency: transitive + description: + name: syncfusion_pdfviewer_macos + sha256: "6dad65d36d32e679e7666be438a5a75d870e0b1b9cd010ddcfc7475b9063a89d" + url: "https://pub.dev" + source: hosted + version: "24.2.9" + syncfusion_pdfviewer_platform_interface: + dependency: transitive + description: + name: syncfusion_pdfviewer_platform_interface + sha256: "6a1bf9fe0648daa77e3c76052f7d02b50f1208ae1d751f648100e46100bf8711" + url: "https://pub.dev" + source: hosted + version: "24.2.9" + syncfusion_pdfviewer_web: + dependency: transitive + description: + name: syncfusion_pdfviewer_web + sha256: c69720a884b0faa2c42bc2c98596db18dd2747123fdd6f7f398da1120a7d21b3 + url: "https://pub.dev" + source: hosted + version: "24.2.8" + syncfusion_pdfviewer_windows: + dependency: transitive + description: + name: syncfusion_pdfviewer_windows + sha256: "6e33562967828feeebc1b5cb0e5f1ec23abb86007dce37773501f9f18bfe3a36" + url: "https://pub.dev" + source: hosted + version: "24.2.9" + synchronized: + dependency: transitive + description: + name: synchronized + sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0 + url: "https://pub.dev" + source: hosted + version: "3.4.0" term_glyph: dependency: transitive description: @@ -176,6 +1245,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.2" + test: + dependency: transitive + description: + name: test + sha256: "75906bf273541b676716d1ca7627a17e4c4070a3a16272b7a3dc7da3b9f3f6b7" + url: "https://pub.dev" + source: hosted + version: "1.26.3" test_api: dependency: transitive description: @@ -184,6 +1261,126 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.7" + test_core: + dependency: transitive + description: + name: test_core + sha256: "0cc24b5ff94b38d2ae73e1eb43cc302b77964fbf67abad1e296025b78deb53d0" + url: "https://pub.dev" + source: hosted + version: "0.6.12" + timing: + dependency: transitive + description: + name: timing + sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + url_launcher: + dependency: transitive + description: + name: url_launcher + sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 + url: "https://pub.dev" + source: hosted + version: "6.3.2" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "767344bf3063897b5cf0db830e94f904528e6dd50a6dfaf839f0abf509009611" + url: "https://pub.dev" + source: hosted + version: "6.3.28" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: cfde38aa257dae62ffe79c87fab20165dfdf6988c1d31b58ebf59b9106062aad + url: "https://pub.dev" + source: hosted + version: "6.3.6" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a + url: "https://pub.dev" + source: hosted + version: "3.2.2" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" + url: "https://pub.dev" + source: hosted + version: "3.2.5" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" + url: "https://pub.dev" + source: hosted + version: "3.1.5" + uuid: + dependency: transitive + description: + name: uuid + sha256: a11b666489b1954e01d992f3d601b1804a33937b5a8fe677bd26b8a9f96f96e8 + url: "https://pub.dev" + source: hosted + version: "4.5.2" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: a4f059dc26fc8295b5921376600a194c4ec7d55e72f2fe4c7d2831e103d461e6 + url: "https://pub.dev" + source: hosted + version: "1.1.19" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146" + url: "https://pub.dev" + source: hosted + version: "1.1.13" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: d354a7ec6931e6047785f4db12a1f61ec3d43b207fc0790f863818543f8ff0dc + url: "https://pub.dev" + source: hosted + version: "1.1.19" vector_math: dependency: transitive description: @@ -200,6 +1397,86 @@ packages: url: "https://pub.dev" source: hosted version: "15.0.2" + watcher: + dependency: transitive + description: + name: watcher + sha256: f52385d4f73589977c80797e60fe51014f7f2b957b5e9a62c3f6ada439889249 + url: "https://pub.dev" + source: hosted + version: "1.2.0" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 + url: "https://pub.dev" + source: hosted + version: "3.0.3" + webkit_inspection_protocol: + dependency: transitive + description: + name: webkit_inspection_protocol + sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + win32: + dependency: transitive + description: + name: win32 + sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e + url: "https://pub.dev" + source: hosted + version: "5.15.0" + win32_registry: + dependency: transitive + description: + name: win32_registry + sha256: "21ec76dfc731550fd3e2ce7a33a9ea90b828fdf19a5c3bcf556fa992cfa99852" + url: "https://pub.dev" + source: hosted + version: "1.1.5" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + xml: + dependency: transitive + description: + name: xml + sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" + url: "https://pub.dev" + source: hosted + version: "6.6.1" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" sdks: dart: ">=3.10.4 <4.0.0" - flutter: ">=3.18.0-18.0.pre.54" + flutter: ">=3.35.0" diff --git a/b0esche_cloud/pubspec.yaml b/b0esche_cloud/pubspec.yaml index f47eb64..3675dca 100644 --- a/b0esche_cloud/pubspec.yaml +++ b/b0esche_cloud/pubspec.yaml @@ -1,6 +1,6 @@ name: b0esche_cloud description: "A new Flutter project." -publish_to: 'none' +publish_to: "none" version: 0.1.0 environment: @@ -10,10 +10,85 @@ dependencies: flutter: sdk: flutter + # State Management + flutter_bloc: ^8.1.3 + bloc: ^8.1.2 + + # Networking + dio: ^5.3.2 + + # Routing + go_router: ^12.1.1 + + # Dependency Injection + get_it: ^7.6.4 + injectable: ^2.3.2 + + # Local Storage + hive: ^2.2.3 + hive_flutter: ^1.1.0 + shared_preferences: ^2.2.2 + flutter_secure_storage: ^9.0.0 + + # Internationalization + intl: ^0.19.0 + + # Logging + logger: ^2.0.2 + + # Image Handling + cached_network_image: ^3.3.0 + + # SVG Support + flutter_svg: ^2.0.9 + + # Utilities + equatable: ^2.0.5 + path_provider: ^2.1.2 + connectivity_plus: ^5.0.2 + provider: ^6.1.1 + file_picker: ^8.1.2 + flutter_dropzone: ^4.0.0 + desktop_drop: ^0.4.4 + super_context_menu: ^0.8.5 + infinite_scroll_pagination: ^4.0.0 + collection: ^1.18.0 + syncfusion_flutter_pdfviewer: ^24.2.2 + dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^6.0.0 + # Code Generation + build_runner: ^2.4.6 + json_serializable: ^6.7.1 + injectable_generator: ^2.4.1 + hive_generator: ^2.0.1 + + # Testing + mockito: ^5.4.4 + bloc_test: ^9.1.5 + flutter: uses-material-design: true + + assets: + - assets/fonts/ + + fonts: + - family: VeteranTypewriter + fonts: + - asset: assets/fonts/veteran-typewriter/veteran_typewriter.ttf + - family: AnimalPark + fonts: + - asset: assets/fonts/animal-park/animal_park.otf + - family: RenoireDemo + fonts: + - asset: assets/fonts/renoire-demo/renoire_demo.otf + - family: SparkyStones + fonts: + - asset: assets/fonts/sparky-stones/SparkyStonesRegular-BW6ld.ttf + - family: PixelatedElegance + fonts: + - asset: assets/fonts/pixelated-elegance/PixelatedEleganceRegular-ovyAA.ttf diff --git a/b0esche_cloud/web/index.html b/b0esche_cloud/web/index.html index 7e08cd7..564911d 100644 --- a/b0esche_cloud/web/index.html +++ b/b0esche_cloud/web/index.html @@ -1,5 +1,6 @@ + - + + + + + + + + b0esche_cloud + - + + \ No newline at end of file diff --git a/b0esche_cloud/windows/flutter/generated_plugin_registrant.cc b/b0esche_cloud/windows/flutter/generated_plugin_registrant.cc index 8b6d468..f0b8be2 100644 --- a/b0esche_cloud/windows/flutter/generated_plugin_registrant.cc +++ b/b0esche_cloud/windows/flutter/generated_plugin_registrant.cc @@ -6,6 +6,27 @@ #include "generated_plugin_registrant.h" +#include +#include +#include +#include +#include +#include +#include void RegisterPlugins(flutter::PluginRegistry* registry) { + ConnectivityPlusWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin")); + DesktopDropPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("DesktopDropPlugin")); + FlutterSecureStorageWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin")); + IrondashEngineContextPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("IrondashEngineContextPluginCApi")); + SuperNativeExtensionsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("SuperNativeExtensionsPluginCApi")); + SyncfusionPdfviewerWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("SyncfusionPdfviewerWindowsPlugin")); + UrlLauncherWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UrlLauncherWindows")); } diff --git a/b0esche_cloud/windows/flutter/generated_plugins.cmake b/b0esche_cloud/windows/flutter/generated_plugins.cmake index b93c4c3..12161d9 100644 --- a/b0esche_cloud/windows/flutter/generated_plugins.cmake +++ b/b0esche_cloud/windows/flutter/generated_plugins.cmake @@ -3,6 +3,13 @@ # list(APPEND FLUTTER_PLUGIN_LIST + connectivity_plus + desktop_drop + flutter_secure_storage_windows + irondash_engine_context + super_native_extensions + syncfusion_pdfviewer_windows + url_launcher_windows ) list(APPEND FLUTTER_FFI_PLUGIN_LIST