Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions lib/data/getFile.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';

void downloadFile(String url, String savePath) async {
Dio dio = Dio();
try {
Response response = await dio.download(url, savePath);
} catch (error) {
debugPrint(error as String?);
}
}
66 changes: 66 additions & 0 deletions lib/data/interactor/ticket_list_interactor.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import 'dart:async';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:surf_flutter_study_jam_2023/data/ticket.dart';

class TicketListInteractor extends ChangeNotifier {
String dirLink = '';
String dirLoad = '';
String dirLoaded = '';

Future<void> createDir() async {
Directory appDocDir = await getApplicationDocumentsDirectory();

await Directory('${appDocDir.path}/link')
.create(recursive: true)
.then((value) => dirLink = value.path);
await Directory('${appDocDir.path}/load')
.create(recursive: true)
.then((value) => dirLoad = value.path);
await Directory('${appDocDir.path}/loaded')
.create(recursive: true)
.then((value) => dirLoaded = value.path);
}

Future<List<Ticket>> loadListTicket() async {
List<Ticket> ret = [];

//var getFiles();

for (int i = 0; i < 20; i++) {
ret.add(Ticket(TypeTicketEnum.show, i.toString(), StatusEnum.linkSaved));
}

return ret;
}
}



List<FileInfo> getFiles(Directory directory) {
List<FileInfo> files = [];

directory.listSync(recursive: true).forEach((FileSystemEntity entity) {
if (entity is File) {
files.add(FileInfo(entity.path.split('/').last, entity.lastAccessedSync(),
entity.parent.path));
}
});

return files;
}

class FileInfo {
final String name;
final DateTime createdAt;
final String parentDirectory;

FileInfo(this.name, this.createdAt, this.parentDirectory);

@override
String toString() {
return '$name: $createdAt $parentDirectory';
}
}
39 changes: 39 additions & 0 deletions lib/data/ticket.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
class Ticket {



late TypeTicketEnum typeTicketEnum;
String downloadLink = '';
late StatusEnum statusTicket;

/// Получить имя файла из ссылки.
String getNameTicketFromLink(String fullPath) => fullPath.split('/').last;

Ticket(this.typeTicketEnum, this.downloadLink, this.statusTicket);
}

///Статус ссылки.
enum StatusEnum {
///Есть путь к файлу билета
linkSaved,

///Скачиваем по ссылке
downloadFromLink,

///Файл скачен по ссылке
downloadedFromLink,
}

enum TypeTicketEnum {
///Билеты на самолет
air,

///Билеты на поезд
train,

///Билеты на развлекательные мероприятия
show,

///Билеты котрый нельзя отнести к предыдущим категорям
other
}
5 changes: 5 additions & 0 deletions lib/features/res/color_palette.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import 'package:flutter/material.dart';

class ColorPalette {
static const Color greenColor = Color(0xFF4CAF50);
}
15 changes: 15 additions & 0 deletions lib/features/res/multi_bloc_providers.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:surf_flutter_study_jam_2023/data/interactor/ticket_list_interactor.dart';
import 'package:surf_flutter_study_jam_2023/features/ticket_storage/bloc/ticket_storage_bloc.dart';
import 'package:surf_flutter_study_jam_2023/features/ticket_storage/widget/ticket/bloc/ticket_item_bloc.dart';

/// Список подключенных провадеров
List<BlocProvider> listMultiBlocProviders = <BlocProvider>[
BlocProvider<TicketStorageBloc>(
create: (context) => TicketStorageBloc(context.read<TicketListInteractor>())
..add(TicketListLoadEvent()),
),
BlocProvider<TicketItemBloc>(
create: (context) => TicketItemBloc(context.read<TicketListInteractor>()),
),
];
13 changes: 13 additions & 0 deletions lib/features/res/multi_providers.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import 'package:flutter/material.dart';

import 'package:provider/provider.dart';
import 'package:surf_flutter_study_jam_2023/data/interactor/ticket_list_interactor.dart';

/// Список подключенных провадеров
List<ChangeNotifierProvider<ChangeNotifier>> listMultiProviders =
<ChangeNotifierProvider<TicketListInteractor>>[
ChangeNotifierProvider(create: (context) {
return TicketListInteractor()..createDir();
},
)
];
11 changes: 11 additions & 0 deletions lib/features/res/svg_icons.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
class SvgIcons {
static const String catalog = 'res/icon/';
static const String air = '${catalog}air.svg';
static const String checkbox = '${catalog}checkbox.svg';
static const String checkboxSign = '${catalog}checkbox_sign.svg';
static const String cloud = '${catalog}cloud.svg';
static const String cloudCheck = '${catalog}cloud_check.svg';
static const String other = '${catalog}other.svg';
static const String show = '${catalog}show.svg';
static const String train = '${catalog}train.svg';
}
75 changes: 75 additions & 0 deletions lib/features/ticket_storage/bloc/ticket_storage_bloc.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import 'package:equatable/equatable.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:surf_flutter_study_jam_2023/data/interactor/ticket_list_interactor.dart';
import 'package:surf_flutter_study_jam_2023/data/ticket.dart';


part 'ticket_storage_event.dart';

part 'ticket_storage_state.dart';

class TicketStorageBloc extends Bloc<TicketStorageEvent, TicketStorageState> {
final TicketListInteractor ticketListInteractor;

//ticket_storage_interactor

TicketStorageBloc(this.ticketListInteractor)
: super(TicketListLoadState()) {
///Обработка события загрузка экрана
on<TicketListLoadEvent>(_onTicketListLoad);

///Обработка события окончание загрузки экрана
on<TicketListShowEvent>(_onTicketListShow);

///Обработка события удаление меств из списка "Посещенные"
on<TicketSelectEvent>(_onTicketSelect);

///Нажали на карточку места
on<TicketRemoveEvent>(_onTicketRemove);
}

Future<void> _onTicketListLoad(
TicketStorageEvent event,
Emitter<TicketStorageState> emit,
) async {
debugPrint('Начало загрузки');
emit(TicketListLoadState());

final future = await ticketListInteractor.loadListTicket();

emit(TicketShowListState(future));

debugPrint(' после загрузки');
}

Future<void> _onTicketListShow(
TicketStorageEvent event,
Emitter<TicketStorageState> emit,
) async {
debugPrint(' до загрузки');
emit(TicketListLoadState());
debugPrint(' после загрузки');
final future = ticketListInteractor.loadListTicket();
}

Future<void> _onTicketSelect(
TicketStorageEvent event,
Emitter<TicketStorageState> emit,
) async {
debugPrint(' до загрузки');
emit(TicketListLoadState());
debugPrint(' после загрузки');
final future = ticketListInteractor.loadListTicket();
}

Future<void> _onTicketRemove(
TicketStorageEvent event,
Emitter<TicketStorageState> emit,
) async {
debugPrint(' до загрузки');
emit(TicketListLoadState());
debugPrint(' после загрузки');
final future = ticketListInteractor.loadListTicket();
}
}
37 changes: 37 additions & 0 deletions lib/features/ticket_storage/bloc/ticket_storage_event.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
part of 'ticket_storage_bloc.dart';

abstract class TicketStorageEvent extends Equatable {
const TicketStorageEvent();
}

class TicketListLoadEvent extends TicketStorageEvent {
@override
List<Object> get props => [];
}

class TicketListShowEvent extends TicketStorageEvent {
final List<Ticket> listTicket;

@override
List<Object> get props => [];

const TicketListShowEvent(this.listTicket);
}

class TicketSelectEvent extends TicketStorageEvent {
final Ticket ticket;

@override
List<Object> get props => [];

const TicketSelectEvent(this.ticket);
}

class TicketRemoveEvent extends TicketStorageEvent {
final Ticket ticket;

@override
List<Object> get props => [];

const TicketRemoveEvent(this.ticket);
}
38 changes: 38 additions & 0 deletions lib/features/ticket_storage/bloc/ticket_storage_state.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
part of 'ticket_storage_bloc.dart';

abstract class TicketStorageState extends Equatable {
const TicketStorageState();
}

class TicketListLoadState extends TicketStorageState {
@override
List<Object?> get props => [];
}

class TicketShowListState extends TicketStorageState {
final List<Ticket> listTicket;

@override
List<Object?> get props => [listTicket];

const TicketShowListState(this.listTicket);

@override
String toString() {
return 'Показать список билетов. Количество билетов = ${listTicket.length}';
}
}

class TicketSelectedState extends TicketStorageState {
final Ticket ticket;

@override
List<Object?> get props => [ticket];

const TicketSelectedState(this.ticket);

@override
String toString() {
return 'Выбран билет. Полный путь к билету = ${ticket.downloadLink}';
}
}
14 changes: 11 additions & 3 deletions lib/features/ticket_storage/ticket_storage_page.dart
Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
import 'package:flutter/material.dart';
import 'package:surf_flutter_study_jam_2023/features/ticket_storage/widget/app_bar_title.dart';
import 'package:surf_flutter_study_jam_2023/features/ticket_storage/widget/body.dart';

/// Экран “Хранения билетов”.
class TicketStoragePage extends StatelessWidget {
const TicketStoragePage({Key? key}) : super(key: key);

@override
Widget build(BuildContext context) {
return const FlutterLogo();
}
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(
automaticallyImplyLeading: false,
centerTitle: false,
title: const AppBarTitle(),
),
//bottomSheet: const ButtonShow(),
body: const Body(),
);
}
13 changes: 13 additions & 0 deletions lib/features/ticket_storage/widget/app_bar_title.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import 'package:flutter/material.dart';

///AppBarTitle
class AppBarTitle extends StatelessWidget {
///
const AppBarTitle({Key? key}) : super(key: key);

@override
Widget build(BuildContext context) => Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: const <Widget>[Text('Хранение билетов')],
);
}
28 changes: 28 additions & 0 deletions lib/features/ticket_storage/widget/body.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:surf_flutter_study_jam_2023/features/ticket_storage/bloc/ticket_storage_bloc.dart';
import 'package:surf_flutter_study_jam_2023/features/ticket_storage/widget/list_empty.dart';
import 'package:surf_flutter_study_jam_2023/features/ticket_storage/widget/list_full.dart';

class Body extends StatelessWidget {
const Body({Key? key}) : super(key: key);

@override
Widget build(BuildContext context) {
return MultiBlocListener(
listeners: [
BlocListener<TicketStorageBloc, TicketStorageState>(
listenWhen: (previousState, state) {
return true;
},
listener: (context, state) {},
),
],
child: BlocBuilder<TicketStorageBloc, TicketStorageState>(
builder: (context, state) {
return state.props.isEmpty ? const ListEmpty() : const ListFull();
},
),
);
}
}
Loading