Skip to content

Commit db9c29a

Browse files
committed
Cache, video and pdf support
1 parent 052259d commit db9c29a

25 files changed

+598
-128
lines changed

lib/data.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ enum Pref<T> {
3333
currentProfile('Current Profile', '', null),
3434
//INTERFACE
3535
autoCapitalise('Auto Capitalise', false, Icons.text_fields_rounded, ui: true),
36-
sheetBlobs('Sheet blobs', false, Icons.border_bottom_rounded);
36+
sheetBlobs('Sheet blobs', false, Icons.border_bottom_rounded),
37+
//CACHE
38+
cachePath(null, '', null);
3739

3840
final T initial;
3941
final List<T>? all;
@@ -76,6 +78,8 @@ List<Tile> get settings {
7678

7779
enum BlobType {
7880
image,
81+
pdf,
82+
video,
7983
text;
8084

8185
static BlobType fromExtension(String ext) {
@@ -89,5 +93,7 @@ enum BlobType {
8993
}
9094

9195
const extensions = {
92-
BlobType.image: ['jpg', 'png', 'gif'],
96+
BlobType.image: ['jpg', 'png', 'gif', 'webp'],
97+
BlobType.video: ['mp4'],
98+
BlobType.pdf: ['pdf'],
9399
};

lib/main.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import 'package:path_provider/path_provider.dart';
12
import 'package:flutter/material.dart';
3+
import 'data.dart';
24
import 'template/class/prefs.dart';
35
import 'template/widget/app.dart';
46
import 'services/profile.dart';
@@ -7,6 +9,9 @@ import 'pages/root.dart';
79
Future<void> main() async {
810
WidgetsFlutterBinding.ensureInitialized();
911
await Preferences().init();
12+
if (Pref.cachePath.value == '') {
13+
Pref.cachePath.set((await getApplicationCacheDirectory()).path);
14+
}
1015
Profiles().init();
1116
runApp(const App(title: 'S3', child: RootPage()));
1217
}

lib/pages/root.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import 'package:flutter/material.dart';
2+
import '../services/storage/storage.dart';
23
import '../../template/functions.dart';
34
import '../template/widget/frame.dart';
45
import '../services/nodes/root.dart';
5-
import '../services/endpoint.dart';
66
import '../widgets/node_list.dart';
77
import '../layers/profiles.dart';
88
import '../widgets/loading.dart';
@@ -28,7 +28,7 @@ class _RootPageState extends State<RootPage> {
2828
return ListenableBuilder(
2929
listenable: root,
3030
builder: (context, child) => Frame(
31-
title: Text(EndPoint().profile.name),
31+
title: Text(Storage().profile.name),
3232
actions: [
3333
LoadingCircle(
3434
show: !root.loaded,

lib/services/nodes/blob.dart

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,22 @@ import 'dart:convert';
66
import 'group.dart';
77
import 'node.dart';
88
import '../../template/class/tile.dart';
9+
import '../../widgets/nodes/image.dart';
10+
import '../../widgets/nodes/video.dart';
11+
import '../../widgets/nodes/text.dart';
912
import '../../template/functions.dart';
13+
import '../../widgets/nodes/pdf.dart';
1014
import '../../pages/nodes/blobs.dart';
1115
import '../../layers/nodes/blob.dart';
1216
import '../../sheets/node/blobs.dart';
1317
import '../transfers/transfer.dart';
1418
import '../../template/data.dart';
15-
import '../../sheets/image.dart';
16-
import '../../sheets/text.dart';
19+
import '../storage/storage.dart';
1720
import '../../functions.dart';
18-
import '../endpoint.dart';
1921
import '../../data.dart';
2022

2123
class BlobNode extends Node {
22-
Uint8List data = Uint8List(0);
24+
Uint8List _data = Uint8List(0);
2325
final textController = TextEditingController();
2426

2527
BlobNode({
@@ -30,14 +32,21 @@ class BlobNode extends Node {
3032
});
3133

3234
String get textData {
35+
if (blobType == BlobType.image) return 'IMAGE';
3336
try {
3437
return utf8.decode(data);
3538
} catch (e) {
36-
showSnack('$e', false);
3739
return 'ERROR';
3840
}
3941
}
4042

43+
Uint8List get data => _data;
44+
set data(Uint8List u) {
45+
_data = u;
46+
textController.text = textData;
47+
notify();
48+
}
49+
4150
String get extension => extensionFromPath(path);
4251
set textData(String s) => data = utf8.encode(s);
4352

@@ -65,20 +74,16 @@ class BlobNode extends Node {
6574
}
6675
}, onHold: () => BlobNodeLayer(node: this).show());
6776

68-
IconData get icon => {
69-
BlobType.text: Icons.list_alt_rounded,
70-
BlobType.image: Icons.crop_original_rounded,
71-
}[blobType]!;
77+
IconData get icon =>
78+
{
79+
BlobType.pdf: Icons.picture_as_pdf_rounded,
80+
BlobType.image: Icons.crop_original_rounded,
81+
BlobType.video: Icons.movie_rounded,
82+
}[blobType] ??
83+
Icons.list_alt_rounded;
7284

7385
@override
74-
Future<void> refresh() async {
75-
loaded = false;
76-
notifyListeners();
77-
data = await EndPoint().loadBlobNode(this);
78-
textController.text = textData;
79-
loaded = true;
80-
notifyListeners();
81-
}
86+
Future<void> refresh() => Storage().loadBlobNode(this);
8287

8388
void openLayer() => showModalBottomSheet(
8489
barrierLabel: 'Barrier',
@@ -91,16 +96,16 @@ class BlobNode extends Node {
9196
),
9297
);
9398

94-
bool get hasData => data.isNotEmpty;
99+
bool get hasData => loaded || data.isNotEmpty;
95100
BlobType get blobType => BlobType.fromExtension(extension);
96101

97-
Widget get subWidget {
98-
if (!hasData) return Container();
99-
return {
100-
BlobType.image: ImageNodeSheet(blobNode: this),
101-
BlobType.text: TextNodeSheet(blobNode: this),
102-
}[blobType]!;
103-
}
102+
Widget get subWidget =>
103+
{
104+
BlobType.image: ImageNodeWidget(blobNode: this),
105+
BlobType.video: VideoNodeWidget(blobNode: this),
106+
BlobType.pdf: PDFNodeWidget(blobNode: this),
107+
}[blobType] ??
108+
TextNodeWidget(blobNode: this);
104109

105110
Future<void> saveChanges() async {
106111
if (blobType == BlobType.text) {
@@ -112,7 +117,7 @@ class BlobNode extends Node {
112117
Transfer copyTo(String dest) => Transfer(
113118
'Copying $name to $dest',
114119
future: () async {
115-
await EndPoint().copyBlobNode(this, dest);
120+
await Storage().copyBlobNode(this, dest);
116121
await parent?.refresh();
117122
}.call(),
118123
);
@@ -129,17 +134,17 @@ class BlobNode extends Node {
129134
Transfer get upload => Transfer(
130135
'Uploading $name',
131136
future: () async {
132-
await EndPoint().uploadNode(this);
137+
await Storage().uploadNode(this);
133138
await parent!.refresh();
134139
}.call(),
135140
);
136141

137142
@override
138143
Transfer get forceRemove =>
139-
Transfer('Removing $name', future: EndPoint().removeBlobNode(this));
144+
Transfer('Removing $name', future: Storage().removeBlobNode(this));
140145

141146
Transfer get update =>
142-
Transfer('Update $path', future: EndPoint().updateBlobNode(this));
147+
Transfer('Update $path', future: Storage().updateBlobNode(this));
143148

144149
Transfer get download => Transfer(
145150
'Downloading $name',

lib/services/nodes/bucket.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import '../../layers/nodes/bucket.dart';
77
import '../../template/functions.dart';
88
import '../../pages/nodes/group.dart';
99
import '../transfers/transfer.dart';
10-
import '../endpoint.dart';
10+
import '../storage/storage.dart';
1111

1212
class BucketNode extends GroupNode {
1313
final Bucket bucket;
@@ -31,7 +31,7 @@ class BucketNode extends GroupNode {
3131
Transfer get forceRemove => Transfer(
3232
'Removing $name',
3333
future: () async {
34-
await EndPoint().removeBucket(this);
34+
await Storage().removeBucket(this);
3535
await RootNode().refresh();
3636
}.call(),
3737
);

lib/services/nodes/group.dart

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
import 'blob.dart';
22
import 'node.dart';
33
import '../transfers/transfer.dart';
4-
import '../endpoint.dart';
4+
import '../storage/storage.dart';
55
import '../../data.dart';
66

77
abstract class GroupNode extends Node {
8-
List<Node> nodes = [];
8+
List<Node> _nodes = [];
99

1010
GroupNode({required super.path, super.parent});
1111

12+
List<Node> get nodes => _nodes;
13+
set nodes(List<Node> list) {
14+
_nodes = list;
15+
notifyListeners();
16+
}
17+
1218
List<GroupNode> get groups => nodes.whereType<GroupNode>().toList();
1319
List<BlobNode> get blobs => nodes.whereType<BlobNode>().toList();
1420

@@ -50,18 +56,12 @@ abstract class GroupNode extends Node {
5056
List<BlobNode> get shownBlobs => shownNodes.whereType<BlobNode>().toList();
5157

5258
@override
53-
Future<void> refresh() async {
54-
loaded = false;
55-
notifyListeners();
56-
nodes = await EndPoint().listNodes(this);
57-
loaded = true;
58-
notifyListeners();
59-
}
59+
Future refresh() => Storage().refreshGroup(this);
6060

6161
Transfer uploadFiles(List<String?> files) => Transfer(
6262
'Uploading ${files.length} files',
6363
future: () async {
64-
await EndPoint().uploadPaths(this, files);
64+
await Storage().uploadPaths(this, files);
6565
await refresh();
6666
}.call(),
6767
);

lib/services/nodes/node.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import '../../data.dart';
99

1010
abstract class Node with ChangeNotifier {
1111
String path; //Path inside the bucket
12-
bool loaded = false;
12+
bool _loaded = false;
1313
GroupNode? parent;
1414
DateTime? date;
1515
int? size;
@@ -23,12 +23,19 @@ abstract class Node with ChangeNotifier {
2323
}
2424
}
2525

26+
bool get loaded => _loaded;
27+
set loaded(bool b) {
28+
_loaded = b;
29+
notifyListeners();
30+
}
31+
2632
String get fullPath => '${bucketNode.name}/$path';
2733

2834
Node({required this.path, this.parent, this.date, this.size});
2935

3036
Future<void> refresh();
3137
Transfer get forceRemove;
38+
void notify() => notifyListeners();
3239

3340
void tryRemove() =>
3441
showSnack('Press to confirm', false, onTap: () => forceRemove.call());

lib/services/nodes/prefix.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import '../../layers/nodes/prefix.dart';
66
import '../../template/functions.dart';
77
import '../../pages/nodes/group.dart';
88
import '../transfers/transfer.dart';
9-
import '../endpoint.dart';
9+
import '../storage/storage.dart';
1010

1111
class PrefixNode extends GroupNode {
1212
PrefixNode({required super.parent, required super.path});
@@ -78,6 +78,6 @@ class PrefixNode extends GroupNode {
7878

7979
Transfer removeNodes(List<BlobNode> collected) => Transfer(
8080
'Removing nodes in $name',
81-
future: EndPoint().removeBlobNodes(collected),
81+
future: Storage().removeBlobNodes(collected),
8282
);
8383
}

lib/services/nodes/root.dart

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,40 @@
11
import 'package:flutter/material.dart';
2+
import 'package:minio/models.dart';
23
import 'bucket.dart';
3-
import '../../template/functions.dart';
44
import '../transfers/transfer.dart';
5-
import '../endpoint.dart';
5+
import '../storage/storage.dart';
66

77
class RootNode extends ChangeNotifier {
88
static final instance = RootNode.internal();
99
factory RootNode() => instance;
1010
RootNode.internal();
1111

1212
List<BucketNode> buckets = [];
13-
bool loaded = false;
13+
bool _loaded = false;
1414

15-
Future<void> refresh() async {
16-
try {
17-
loaded = false;
18-
final result = await EndPoint().listBuckets();
19-
buckets = result.map((bucket) {
20-
return BucketNode(bucket: bucket);
21-
}).toList();
22-
buckets.sort((a, b) => a.name.compareTo(b.name));
23-
} catch (e) {
24-
showSnack('$e', false);
25-
}
26-
loaded = true;
15+
bool get loaded => _loaded;
16+
set loaded(bool b) {
17+
_loaded = b;
2718
notifyListeners();
2819
}
2920

30-
Transfer createBucket(String name) =>
31-
Transfer('Creating bucket $name', future: EndPoint().createBucket(name));
21+
void loadBuckets(List<Bucket> list) {
22+
buckets = list.map((bucket) {
23+
return BucketNode(bucket: bucket);
24+
}).toList();
25+
buckets.sort((a, b) => a.name.compareTo(b.name));
26+
notifyListeners();
27+
}
28+
29+
void notify() => notifyListeners();
30+
31+
Future<void> refresh() => Storage().refreshRoot(this);
32+
33+
Transfer createBucket(String name) => Transfer(
34+
'Creating bucket $name',
35+
future: () async {
36+
await Storage().createBucket(name);
37+
refresh();
38+
}.call(),
39+
);
3240
}

lib/services/profile.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class Profile {
3434
};
3535

3636
static Profile get empty =>
37-
Profile(name: 'Hold to edit', endPoint: '', accessKey: '', secretKey: '');
37+
Profile(name: 'Edit profile', endPoint: '', accessKey: '', secretKey: '');
3838

3939
@override
4040
String toString() => jsonEncode(toMap);

0 commit comments

Comments
 (0)