Skip to content

Commit 14d78de

Browse files
Merge pull request #49 from acs-upb-mobile/icons_using_path
Show images from Firebase Storage in the web version
2 parents 13b456a + 0ef6655 commit 14d78de

File tree

16 files changed

+116
-113
lines changed

16 files changed

+116
-113
lines changed
File renamed without changes.

assets/icons/websites/lsac.png

-8.77 KB
Binary file not shown.

assets/icons/websites/moodle.png

-29.3 KB
Binary file not shown.

assets/icons/websites/msp.png

-138 KB
Binary file not shown.

assets/icons/websites/ocw.png

-302 KB
Binary file not shown.

assets/icons/websites/studenti.png

-19.2 KB
Binary file not shown.

lib/pages/home/home_page.dart

Lines changed: 11 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,8 @@ import 'package:acs_upb_mobile/pages/faq/model/question.dart';
77
import 'package:acs_upb_mobile/pages/faq/service/question_provider.dart';
88
import 'package:acs_upb_mobile/pages/portal/model/website.dart';
99
import 'package:acs_upb_mobile/pages/portal/service/website_provider.dart';
10-
import 'package:acs_upb_mobile/resources/locale_provider.dart';
11-
import 'package:acs_upb_mobile/resources/storage_provider.dart';
10+
import 'package:acs_upb_mobile/pages/portal/view/website_view.dart';
1211
import 'package:acs_upb_mobile/resources/utils.dart';
13-
import 'package:acs_upb_mobile/widgets/circle_image.dart';
1412
import 'package:acs_upb_mobile/widgets/info_card.dart';
1513
import 'package:acs_upb_mobile/widgets/scaffold.dart';
1614
import 'package:auto_size_text/auto_size_text.dart';
@@ -49,32 +47,16 @@ class HomePage extends StatelessWidget {
4947
.take(3)
5048
.map((website) => Expanded(
5149
child: Padding(
52-
padding: const EdgeInsets.all(8),
53-
child: FutureBuilder<ImageProvider<dynamic>>(
54-
future:
55-
StorageProvider.imageFromPath(website.iconPath),
56-
builder: (context, snapshot) {
57-
ImageProvider<dynamic> image = const AssetImage(
58-
'assets/icons/websites/globe.png');
59-
if (snapshot.hasData) {
60-
image = snapshot.data;
61-
}
62-
return CircleImage(
63-
label: website.label,
64-
onTap: () {
65-
Provider.of<WebsiteProvider>(context,
66-
listen: false)
67-
.incrementNumberOfVisits(website);
68-
Utils.launchURL(website.link,
69-
context: context);
70-
},
71-
image: image,
72-
tooltip: website
73-
.infoByLocale[LocaleProvider.localeString],
74-
);
75-
},
76-
),
77-
),
50+
padding: const EdgeInsets.all(8),
51+
child: WebsiteIcon(
52+
website: website,
53+
onTap: () {
54+
Provider.of<WebsiteProvider>(context,
55+
listen: false)
56+
.incrementNumberOfVisits(website);
57+
Utils.launchURL(website.link, context: context);
58+
},
59+
)),
7860
))
7961
.toList(),
8062
),

lib/pages/portal/view/portal_page.dart

Lines changed: 27 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ import 'package:acs_upb_mobile/pages/portal/model/website.dart';
1111
import 'package:acs_upb_mobile/pages/portal/service/website_provider.dart';
1212
import 'package:acs_upb_mobile/pages/portal/view/website_view.dart';
1313
import 'package:acs_upb_mobile/resources/custom_icons.dart';
14-
import 'package:acs_upb_mobile/resources/locale_provider.dart';
15-
import 'package:acs_upb_mobile/resources/storage_provider.dart';
1614
import 'package:acs_upb_mobile/resources/utils.dart';
1715
import 'package:acs_upb_mobile/widgets/circle_image.dart';
1816
import 'package:acs_upb_mobile/widgets/scaffold.dart';
@@ -76,51 +74,35 @@ class _PortalPageState extends State<PortalPage> {
7674
}
7775

7876
Widget websiteCircle(Website website, double size) {
77+
final bool canEdit = editingEnabled &&
78+
(website.isPrivate || (user.canEditPublicWebsite ?? false));
7979
return Padding(
80-
padding: const EdgeInsets.all(8),
81-
child: FutureBuilder<ImageProvider<dynamic>>(
82-
future: StorageProvider.imageFromPath(website.iconPath),
83-
builder: (context, snapshot) {
84-
ImageProvider image;
85-
if (snapshot.hasData) {
86-
image = snapshot.data;
87-
} else {
88-
image = AssetImage('assets/${website.iconPath}') ??
89-
const AssetImage('assets/images/white.png');
90-
}
91-
92-
final bool canEdit = editingEnabled &&
93-
(website.isPrivate || (user.canEditPublicWebsite ?? false));
94-
return CircleImage(
95-
label: website.label,
96-
tooltip: website.infoByLocale[LocaleProvider.localeString],
97-
image: image,
98-
enableOverlay: canEdit,
99-
circleSize: size,
100-
onTap: () {
101-
if (canEdit) {
102-
Navigator.of(context)
103-
.push(MaterialPageRoute<ChangeNotifierProvider>(
104-
builder: (_) => ChangeNotifierProvider<FilterProvider>(
105-
create: (_) => FilterProvider(
106-
defaultDegree: website.degree,
107-
defaultRelevance: website.relevance),
108-
child: WebsiteView(
109-
website: website,
110-
updateExisting: true,
111-
),
80+
padding: const EdgeInsets.all(8),
81+
child: WebsiteIcon(
82+
website: website,
83+
canEdit: canEdit,
84+
size: size,
85+
onTap: () {
86+
if (canEdit) {
87+
Navigator.of(context)
88+
.push(MaterialPageRoute<ChangeNotifierProvider>(
89+
builder: (_) => ChangeNotifierProvider<FilterProvider>(
90+
create: (_) => FilterProvider(
91+
defaultDegree: website.degree,
92+
defaultRelevance: website.relevance),
93+
child: WebsiteView(
94+
website: website,
95+
updateExisting: true,
11296
),
113-
));
114-
} else {
115-
Provider.of<WebsiteProvider>(context, listen: false)
116-
.incrementNumberOfVisits(website);
117-
Utils.launchURL(website.link);
118-
}
119-
},
120-
);
121-
},
122-
),
123-
);
97+
),
98+
));
99+
} else {
100+
Provider.of<WebsiteProvider>(context, listen: false)
101+
.incrementNumberOfVisits(website);
102+
Utils.launchURL(website.link);
103+
}
104+
},
105+
));
124106
}
125107

126108
Widget listCategory(WebsiteCategory category, List<Website> websites) {

lib/pages/portal/view/website_view.dart

Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import 'package:acs_upb_mobile/pages/portal/model/website.dart';
77
import 'package:acs_upb_mobile/pages/portal/service/website_provider.dart';
88
import 'package:acs_upb_mobile/resources/custom_icons.dart';
99
import 'package:acs_upb_mobile/resources/locale_provider.dart';
10-
import 'package:acs_upb_mobile/resources/storage_provider.dart';
10+
import 'package:acs_upb_mobile/resources/storage/storage_provider.dart';
1111
import 'package:acs_upb_mobile/resources/utils.dart';
1212
import 'package:acs_upb_mobile/widgets/button.dart';
1313
import 'package:acs_upb_mobile/widgets/circle_image.dart';
@@ -134,26 +134,12 @@ class _WebsiteViewState extends State<WebsiteView> {
134134
mainAxisAlignment: MainAxisAlignment.center,
135135
children: <Widget>[
136136
Expanded(
137-
child: FutureBuilder<ImageProvider<dynamic>>(
138-
future:
139-
StorageProvider.imageFromPath(website.iconPath),
140-
builder: (context, snapshot) {
141-
ImageProvider<dynamic> image = const AssetImage(
142-
'assets/icons/websites/globe.png');
143-
if (snapshot.hasData) {
144-
image = snapshot.data;
145-
}
146-
return CircleImage(
147-
label: website.label,
148-
onTap: () => Utils.launchURL(website.link,
149-
context: context),
150-
image: image,
151-
tooltip: website
152-
.infoByLocale[LocaleProvider.localeString],
153-
);
154-
},
155-
),
156-
),
137+
child: WebsiteIcon(
138+
website: website,
139+
onTap: () {
140+
Utils.launchURL(website.link, context: context);
141+
},
142+
)),
157143
],
158144
),
159145
),
@@ -342,3 +328,34 @@ class _WebsiteViewState extends State<WebsiteView> {
342328
);
343329
}
344330
}
331+
332+
class WebsiteIcon extends StatelessWidget {
333+
const WebsiteIcon({this.website, this.canEdit, this.size, this.onTap});
334+
335+
final Website website;
336+
final bool canEdit;
337+
final double size;
338+
final Function onTap;
339+
340+
@override
341+
Widget build(BuildContext context) {
342+
return FutureBuilder(
343+
future: StorageProvider.findImageUrl(context, website.iconPath),
344+
builder: (context, snapshot) {
345+
ImageProvider image;
346+
image = const AssetImage('assets/icons/globe.png');
347+
if (snapshot.hasData) {
348+
image = NetworkImage(snapshot.data.toString());
349+
}
350+
351+
return CircleImage(
352+
label: website.label,
353+
tooltip: website.infoByLocale[LocaleProvider.localeString],
354+
image: image,
355+
enableOverlay: canEdit,
356+
circleSize: size,
357+
onTap: onTap);
358+
},
359+
);
360+
}
361+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import 'package:firebase_storage/firebase_storage.dart';
2+
import 'package:flutter/cupertino.dart';
3+
4+
class StorageProvider {
5+
static Future<dynamic> findImageUrl(
6+
BuildContext context, String image) async {
7+
final String url =
8+
await FirebaseStorage.instance.ref().child(image).getDownloadURL();
9+
return url;
10+
}
11+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
///call the correct method depending on the platform used
2+
export 'unsupported_storage.dart'
3+
if (dart.library.html) 'web_storage.dart'
4+
if (dart.library.io) 'mobile_storage.dart';
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import 'package:flutter/cupertino.dart';
2+
3+
class StorageProvider extends ChangeNotifier {
4+
static Future<dynamic> findImageUrl(
5+
BuildContext context, String image) async {
6+
final Error error = ArgumentError('Platform not found!');
7+
throw error;
8+
}
9+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import 'package:firebase/firebase.dart';
2+
import 'package:flutter/cupertino.dart';
3+
4+
class StorageProvider {
5+
static Future<dynamic> findImageUrl(
6+
BuildContext context, String image) async {
7+
final url = await storage().ref(image).getDownloadURL();
8+
return url;
9+
}
10+
}

lib/resources/storage_provider.dart

Lines changed: 0 additions & 13 deletions
This file was deleted.

lib/widgets/circle_image.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,13 @@ class CircleImage extends StatelessWidget {
3232
this.onTap,
3333
this.label,
3434
this.tooltip,
35-
this.circleSize = 80,
36-
this.enableOverlay = false,
35+
double circleSize,
36+
bool enableOverlay,
3737
this.overlayIcon,
3838
this.overlayColor})
39-
: super(key: key);
39+
: circleSize = circleSize ?? 80,
40+
enableOverlay = enableOverlay ?? false,
41+
super(key: key);
4042

4143
final ImageProvider<dynamic> image;
4244

pubspec.yaml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ description: A mobile application for students at ACS UPB.
1313
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
1414
#
1515
# ACS UPB Mobile uses semantic versioning. You can read more in the CONTRIBUTING.md file.
16-
version: 0.8.0+3
16+
version: 0.8.1+3
1717

1818
environment:
1919
sdk: ">=2.6.0 <3.0.0"
@@ -143,7 +143,6 @@ flutter:
143143

144144
assets:
145145
- assets/icons/
146-
- assets/icons/websites/
147146
- assets/illustrations/
148147
- assets/images/
149148
- packages/time_machine/data/cultures/cultures.bin

0 commit comments

Comments
 (0)