Line data Source code
1 : // ignore_for_file: prefer-first
2 :
3 : library folly_fields;
4 :
5 : import 'dart:io';
6 :
7 : import 'package:connectivity_plus/connectivity_plus.dart';
8 : import 'package:flutter/foundation.dart';
9 : import 'package:flutter/widgets.dart';
10 : import 'package:folly_fields/responsive/responsive.dart';
11 :
12 : ///
13 : ///
14 : ///
15 : class FollyFields implements _InternalConfig {
16 6 : static final FollyFields _singleton = FollyFields._internal();
17 :
18 : ///
19 : ///
20 : ///
21 2 : static void start(
22 : AbstractConfig holder, {
23 : String modelIdKey = 'id',
24 : String modelUpdatedAtKey = 'updatedAt',
25 : String modelDeletedAtKey = 'deletedAt',
26 : List<double> responsiveSizes = const <double>[540, 720, 960, 1140],
27 : FollyDateParse? dateParseUpdate,
28 : FollyDateParse? dateParseDelete,
29 : Connectivity? connectivity,
30 : }) =>
31 4 : FollyFields()._holder = holder
32 2 : .._start(
33 : modelIdKey: modelIdKey,
34 : modelUpdatedAtKey: modelUpdatedAtKey,
35 : modelDeletedAtKey: modelDeletedAtKey,
36 : dateParseUpdate: dateParseUpdate,
37 : dateParseDelete: dateParseDelete,
38 : responsiveSizes: responsiveSizes,
39 : connectivity: connectivity,
40 : );
41 :
42 : late AbstractConfig _holder;
43 :
44 : ///
45 : ///
46 : ///
47 2 : factory FollyFields() {
48 2 : return _singleton;
49 : }
50 :
51 : ///
52 : ///
53 : ///
54 2 : FollyFields._internal();
55 :
56 : ///
57 : ///
58 : ///
59 0 : @override
60 0 : bool get isOffline => _holder.isOffline;
61 :
62 : ///
63 : ///
64 : ///
65 0 : @override
66 0 : bool get isOnline => _holder.isOnline;
67 :
68 : ///
69 : ///
70 : ///
71 0 : @override
72 0 : bool get isWeb => _holder.isWeb;
73 :
74 : ///
75 : ///
76 : ///
77 0 : @override
78 0 : bool get isNotWeb => _holder.isNotWeb;
79 :
80 : ///
81 : ///
82 : ///
83 0 : @override
84 0 : bool get isMobile => _holder.isMobile;
85 :
86 : ///
87 : ///
88 : ///
89 0 : @override
90 0 : bool get isNotMobile => _holder.isNotMobile;
91 :
92 : ///
93 : ///
94 : ///
95 0 : @override
96 0 : bool get isDesktop => _holder.isDesktop;
97 :
98 : ///
99 : ///
100 : ///
101 0 : @override
102 0 : bool get isNotDesktop => _holder.isNotDesktop;
103 :
104 : ///
105 : ///
106 : ///
107 0 : @override
108 0 : String get platform => _holder.platform;
109 :
110 : ///
111 : ///
112 : ///
113 2 : @override
114 4 : String get modelIdKey => _holder.modelIdKey;
115 :
116 : ///
117 : ///
118 : ///
119 2 : @override
120 4 : String get modelUpdatedAtKey => _holder.modelUpdatedAtKey;
121 :
122 : ///
123 : ///
124 : ///
125 2 : @override
126 4 : String get modelDeletedAtKey => _holder.modelDeletedAtKey;
127 :
128 : ///
129 : ///
130 : ///
131 0 : @override
132 0 : FollyDateParse? get dateParseUpdate => _holder.dateParseUpdate;
133 :
134 : ///
135 : ///
136 : ///
137 0 : @override
138 0 : FollyDateParse? get dateParseDelete => _holder.dateParseDelete;
139 :
140 : ///
141 : ///
142 : ///
143 0 : @override
144 0 : List<double> get responsiveSizes => _holder.responsiveSizes;
145 :
146 : ///
147 : ///
148 : ///
149 0 : ResponsiveSize checkResponsiveSize(BuildContext context) {
150 0 : double width = MediaQuery.of(context).size.width;
151 :
152 0 : if (width < responsiveSizes[0]) {
153 : return ResponsiveSize.extraSmall;
154 : }
155 :
156 0 : if (width >= responsiveSizes[0] && width < responsiveSizes[1]) {
157 : return ResponsiveSize.small;
158 : }
159 :
160 0 : if (width >= responsiveSizes[1] && width < responsiveSizes[2]) {
161 : return ResponsiveSize.medium;
162 : }
163 :
164 0 : if (width >= responsiveSizes[2] && width < responsiveSizes[3]) {
165 : return ResponsiveSize.large;
166 : }
167 :
168 : return ResponsiveSize.extraLarge;
169 : }
170 : }
171 :
172 : ///
173 : ///
174 : ///
175 : enum RunningPlatform {
176 : unknown,
177 : web,
178 : android,
179 : ios,
180 : linux,
181 : windows,
182 : macos,
183 : fuchsia,
184 : }
185 :
186 : ///
187 : ///
188 : ///
189 : extension RunningPlatformExt on RunningPlatform {
190 : ///
191 : ///
192 : ///
193 0 : String get name => toString().split('.').last.toLowerCase();
194 : }
195 :
196 : ///
197 : ///
198 : ///
199 : typedef FollyDateParse = int? Function(dynamic value);
200 :
201 : ///
202 : ///
203 : ///
204 : abstract class _InternalConfig {
205 : ///
206 : ///
207 : ///
208 : bool get isOnline;
209 :
210 : ///
211 : ///
212 : ///
213 : bool get isOffline;
214 :
215 : ///
216 : ///
217 : ///
218 : bool get isWeb;
219 :
220 : ///
221 : ///
222 : ///
223 : bool get isNotWeb;
224 :
225 : ///
226 : ///
227 : ///
228 : bool get isMobile;
229 :
230 : ///
231 : ///
232 : ///
233 : bool get isNotMobile;
234 :
235 : ///
236 : ///
237 : ///
238 : bool get isDesktop;
239 :
240 : ///
241 : ///
242 : ///
243 : bool get isNotDesktop;
244 :
245 : ///
246 : ///
247 : ///
248 : String get platform;
249 :
250 : ///
251 : ///
252 : ///
253 : String get modelIdKey;
254 :
255 : ///
256 : ///
257 : ///
258 : String get modelUpdatedAtKey;
259 :
260 : ///
261 : ///
262 : ///
263 : String get modelDeletedAtKey;
264 :
265 : ///
266 : ///
267 : ///
268 : FollyDateParse? get dateParseUpdate;
269 :
270 : ///
271 : ///
272 : ///
273 : FollyDateParse? get dateParseDelete;
274 :
275 : ///
276 : ///
277 : ///
278 : List<double> get responsiveSizes;
279 : }
280 :
281 : ///
282 : ///
283 : ///
284 : abstract class AbstractConfig implements _InternalConfig {
285 : bool _started = false;
286 : bool _online = false;
287 : RunningPlatform _platform = RunningPlatform.unknown;
288 : String _modelIdKey = 'id';
289 : String _modelUpdatedAtKey = 'updatedAt';
290 : String _modelDeletedAtKey = 'deletedAt';
291 : FollyDateParse? _dateParseUpdate;
292 : FollyDateParse? _dateParseDelete;
293 : List<double> _responsiveSizes = const <double>[540, 720, 960, 1140];
294 :
295 : ///
296 : ///
297 : ///
298 0 : @override
299 0 : bool get isOnline => _online;
300 :
301 : ///
302 : ///
303 : ///
304 0 : @override
305 0 : bool get isOffline => !_online;
306 :
307 : ///
308 : ///
309 : ///
310 0 : @override
311 0 : bool get isWeb => _platform == RunningPlatform.web;
312 :
313 : ///
314 : ///
315 : ///
316 0 : @override
317 0 : bool get isNotWeb => !isWeb;
318 :
319 : ///
320 : ///
321 : ///
322 0 : @override
323 : bool get isMobile =>
324 0 : _platform == RunningPlatform.android || _platform == RunningPlatform.ios;
325 :
326 : ///
327 : ///
328 : ///
329 0 : @override
330 0 : bool get isNotMobile => !isMobile;
331 :
332 : ///
333 : ///
334 : ///
335 0 : @override
336 0 : bool get isDesktop => !isWeb && !isMobile;
337 :
338 : ///
339 : ///
340 : ///
341 0 : @override
342 0 : bool get isNotDesktop => !isDesktop;
343 :
344 : ///
345 : ///
346 : ///
347 0 : @override
348 0 : String get platform => _platform.name;
349 :
350 : ///
351 : ///
352 : ///
353 2 : @override
354 2 : String get modelIdKey => _modelIdKey;
355 :
356 : ///
357 : ///
358 : ///
359 2 : @override
360 2 : String get modelUpdatedAtKey => _modelUpdatedAtKey;
361 :
362 : ///
363 : ///
364 : ///
365 2 : @override
366 2 : String get modelDeletedAtKey => _modelDeletedAtKey;
367 :
368 : ///
369 : ///
370 : ///
371 0 : @override
372 0 : FollyDateParse? get dateParseUpdate => _dateParseUpdate;
373 :
374 : ///
375 : ///
376 : ///
377 0 : @override
378 0 : FollyDateParse? get dateParseDelete => _dateParseDelete;
379 :
380 : ///
381 : ///
382 : ///
383 0 : @override
384 0 : List<double> get responsiveSizes => _responsiveSizes;
385 :
386 : ///
387 : ///
388 : ///
389 2 : Future<void> _start({
390 : required String modelIdKey,
391 : required String modelUpdatedAtKey,
392 : required String modelDeletedAtKey,
393 : required List<double> responsiveSizes,
394 : FollyDateParse? dateParseUpdate,
395 : FollyDateParse? dateParseDelete,
396 : Connectivity? connectivity,
397 : }) async {
398 2 : if (_started) {
399 : if (kDebugMode) {
400 0 : print('Folly Fields already started, ignoring...');
401 : }
402 : } else {
403 2 : _started = true;
404 : if (kDebugMode) {
405 2 : print('Folly Fields Started.');
406 : }
407 :
408 2 : _modelIdKey = modelIdKey;
409 2 : _modelUpdatedAtKey = modelUpdatedAtKey;
410 2 : _modelDeletedAtKey = modelDeletedAtKey;
411 :
412 2 : _dateParseUpdate = dateParseUpdate;
413 2 : _dateParseDelete = dateParseDelete;
414 :
415 2 : _responsiveSizes = responsiveSizes;
416 :
417 : if (kIsWeb) {
418 0 : _platform = RunningPlatform.web;
419 2 : } else if (Platform.isAndroid) {
420 0 : _platform = RunningPlatform.android;
421 2 : } else if (Platform.isIOS) {
422 0 : _platform = RunningPlatform.ios;
423 2 : } else if (Platform.isLinux) {
424 2 : _platform = RunningPlatform.linux;
425 0 : } else if (Platform.isWindows) {
426 0 : _platform = RunningPlatform.windows;
427 0 : } else if (Platform.isMacOS) {
428 0 : _platform = RunningPlatform.macos;
429 0 : } else if (Platform.isFuchsia) {
430 0 : _platform = RunningPlatform.fuchsia;
431 : }
432 :
433 0 : connectivity ??= Connectivity();
434 :
435 2 : ConnectivityResult result = await connectivity.checkConnectivity();
436 :
437 4 : _online = result != ConnectivityResult.none;
438 :
439 6 : connectivity.onConnectivityChanged.listen((ConnectivityResult result) {
440 4 : _online = result != ConnectivityResult.none;
441 : if (kDebugMode) {
442 6 : print('Connectivity Changed: $_online');
443 : }
444 : });
445 : }
446 : }
447 : }
|