Skip to content

Commit f009973

Browse files
committed
saving design resources is done now
1 parent 2681ce0 commit f009973

File tree

5 files changed

+179
-36
lines changed

5 files changed

+179
-36
lines changed

lib/appwrite_service/databases_service.dart

Lines changed: 51 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
1-
import 'dart:convert';
21
import 'dart:developer';
32

43
import 'package:appwrite/appwrite.dart';
54
import 'package:appwrite/models.dart';
6-
// import 'package:help_me_design/appwrite_service/appwrite_constants.dart';
75
import 'package:help_me_design/models/design_resources_model.dart';
8-
import 'package:help_me_design/providers/snippet_tab_provider/snippet_tab_provider.dart';
96
import 'package:help_me_design/utility/utility_helper.dart';
10-
import 'package:help_me_design/views/screens/tabs/components_tab/widgets/add_component_collection_alert.dart';
117

128
import 'appwrite_constants_all.dart';
139

@@ -171,6 +167,37 @@ class Example{
171167
return false;
172168
}
173169
}
170+
171+
Future<bool> saveDesignResource({
172+
required String userId,
173+
required String url,
174+
required String title,
175+
required String description,
176+
required String originalResourceId,
177+
}) async {
178+
final databases = Databases(client);
179+
try {
180+
final document = await databases.createDocument(
181+
databaseId: AppWriteConst.usersDataDatabaseID,
182+
collectionId: AppWriteConst.savedDesignResourcesId,
183+
documentId: ID.unique(),
184+
data: {
185+
"title": title,
186+
"url": url,
187+
"userId": userId,
188+
"description": description,
189+
"originalResourceId": originalResourceId,
190+
},
191+
);
192+
UtilityHelper.toastMessage(message: "Design Resource Saved");
193+
194+
return true;
195+
} on AppwriteException catch (e) {
196+
UtilityHelper.toastMessage(message: e.message ?? "add.saveDesignResource() null message");
197+
log(e.toString());
198+
return false;
199+
}
200+
}
174201
}
175202

176203
class Get {
@@ -277,6 +304,26 @@ class Get {
277304
return [];
278305
}
279306
}
307+
308+
Future<List<Document>> savedDesignResource({required String userId}) async {
309+
final databases = Databases(client);
310+
try {
311+
final data = await databases.listDocuments(
312+
databaseId: AppWriteConst.usersDataDatabaseID,
313+
collectionId: AppWriteConst.savedDesignResourcesId,
314+
queries: [
315+
Query.equal('userId', userId),
316+
Query.orderDesc('\$createdAt'),
317+
],
318+
);
319+
log("Get.savedDesignResource");
320+
return data.documents;
321+
} on AppwriteException catch (e) {
322+
print(e);
323+
UtilityHelper.toastMessage(message: e.message ?? "get.savedDesignResource() null message");
324+
return [];
325+
}
326+
}
280327
}
281328

282329
class Update {
@@ -366,13 +413,3 @@ class DeleteData {
366413
}
367414
}
368415
}
369-
370-
String code = ''' Positioned(
371-
top: 8,
372-
left: 8,
373-
child: Text(
374-
"Preview",
375-
maxLines: 2,
376-
style: themeData.textTheme.titleSmall,
377-
),
378-
),''';
Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
import 'package:appwrite/models.dart';
12
import 'package:flutter/material.dart';
3+
import 'package:help_me_design/appwrite_service/databases_service.dart';
24

3-
class SavedTabProvider with ChangeNotifier {}
5+
class SavedTabProvider with ChangeNotifier {
6+
List<Document> listOfSavedDesignResources = [];
7+
8+
getSavedDesignResources(String userId) async {
9+
listOfSavedDesignResources = await DatabasesService.get.savedDesignResource(userId: userId);
10+
11+
notifyListeners();
12+
}
13+
}

lib/views/screens/tabs/explore_tab/widgets/cards/explore_resource_card.dart

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,44 @@ import 'package:help_me_design/theme/my_theme.dart';
44
import 'package:help_me_design/utility/utility_helper.dart';
55
import 'package:help_me_design/views/widgets/button_tap_effect.dart';
66

7-
class ExploreResourceCard extends StatelessWidget {
7+
class ExploreResourceCard extends StatefulWidget {
88
const ExploreResourceCard({
99
Key? key,
1010
required this.title,
1111
required this.description,
1212
required this.resourceUrl,
1313
required this.onTap,
14+
required this.onTapSave,
15+
required this.onTapSaveIconData,
1416
}) : super(key: key);
1517

1618
final String title;
1719
final String description;
1820
final String resourceUrl;
1921
final VoidCallback onTap;
22+
final VoidCallback onTapSave;
23+
final IconData onTapSaveIconData;
24+
25+
@override
26+
State<ExploreResourceCard> createState() => _ExploreResourceCardState();
27+
}
28+
29+
class _ExploreResourceCardState extends State<ExploreResourceCard> {
30+
bool showSaveButton = false;
2031

2132
@override
2233
Widget build(BuildContext context) {
2334
var themeData = Theme.of(context);
2435
return ButtonTapEffect(
25-
onTap: onTap,
36+
onTap: widget.onTap,
37+
onHover: (isHover) {
38+
if (isHover) {
39+
showSaveButton = true;
40+
} else {
41+
showSaveButton = false;
42+
}
43+
setState(() {});
44+
},
2645
child: Container(
2746
height: 240,
2847
width: 220,
@@ -47,32 +66,43 @@ class ExploreResourceCard extends StatelessWidget {
4766
child: ClipRRect(
4867
borderRadius: BorderRadius.circular(4),
4968
child: Image.network(
50-
"http://t2.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=${resourceUrl}&size=128",
69+
"http://t2.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=${widget.resourceUrl}&size=128",
5170
errorBuilder: (context, error, stackTrace) => Icon(Icons.design_services),
5271
),
5372
),
5473
),
55-
ButtonTapEffect(
56-
child: Icon(Icons.open_in_new_rounded, color: themeData.colorScheme.primary),
57-
onTap: () {
58-
UtilityHelper.launchUrlNow(resourceUrl);
59-
},
60-
)
74+
Column(
75+
children: [
76+
ButtonTapEffect(
77+
child: Icon(Icons.open_in_new_rounded, color: themeData.colorScheme.primary),
78+
onTap: () {
79+
UtilityHelper.launchUrlNow(widget.resourceUrl);
80+
},
81+
),
82+
ButtonTapEffect(
83+
margin: EdgeInsets.only(top: MySpaceSystem.spaceX3),
84+
child: Icon(widget.onTapSaveIconData, size: 27, color: themeData.colorScheme.primary),
85+
onTap: () {
86+
widget.onTapSave();
87+
},
88+
)
89+
],
90+
),
6191
],
6292
),
6393
Column(
6494
crossAxisAlignment: CrossAxisAlignment.start,
6595
children: [
6696
Text(
67-
title,
97+
widget.title,
6898
overflow: TextOverflow.ellipsis,
6999
maxLines: 1,
70100
style: themeData.textTheme.titleMedium,
71101
),
72102
SizedBox(height: MySpaceSystem.spaceX2),
73103
SizedBox(
74104
child: Text(
75-
description,
105+
widget.description,
76106
maxLines: 2,
77107
style: themeData.textTheme.bodyMedium,
78108
),

lib/views/screens/tabs/explore_tab/widgets/explore_list_item_view.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter_animate/flutter_animate.dart';
3+
import 'package:help_me_design/appwrite_service/auth_service.dart';
4+
import 'package:help_me_design/appwrite_service/databases_service.dart';
35
import 'package:help_me_design/providers/explore_tab_provider/explore_tab_provider.dart';
46
import 'package:help_me_design/theme/my_design_system.dart';
57
import 'package:help_me_design/theme/my_theme.dart';
@@ -16,6 +18,7 @@ class ExploreListItemView extends StatelessWidget {
1618
@override
1719
Widget build(BuildContext context) {
1820
var exploreTapProvider = Provider.of<ExploreTabProvider>(context);
21+
var authProvider = Provider.of<AuthService>(context);
1922
var activeItemData = exploreTapProvider.designResourcesCollection!.data[exploreTapProvider.showListItemViewIndex];
2023
return Container(
2124
margin: EdgeInsets.only(left: MySpaceSystem.spaceX3),
@@ -37,7 +40,18 @@ class ExploreListItemView extends StatelessWidget {
3740
),
3841
for (var i = 0; i < activeItemData.resourcesList.length; i++)
3942
ExploreResourceCard(
43+
onTapSave: () {
44+
// save design resources
45+
DatabasesService.add.saveDesignResource(
46+
userId: authProvider.currentUser.$id,
47+
originalResourceId: "", // it's a string based data saved in database so no id
48+
url: activeItemData.resourcesList[i].url,
49+
title: activeItemData.resourcesList[i].title,
50+
description: activeItemData.resourcesList[i].description,
51+
);
52+
},
4053
onTap: () {},
54+
onTapSaveIconData: Icons.bookmark_add_rounded,
4155
title: activeItemData.resourcesList[i].title,
4256
description: activeItemData.resourcesList[i].description,
4357
resourceUrl: activeItemData.resourcesList[i].url,

lib/views/screens/tabs/saved_tab/saved_tab.dart

Lines changed: 62 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,76 @@
11
import 'package:flutter/material.dart';
2+
import 'package:flutter_animate/flutter_animate.dart';
3+
import 'package:help_me_design/appwrite_service/auth_service.dart';
4+
import 'package:help_me_design/appwrite_service/databases_service.dart';
25
import 'package:help_me_design/constants/text_constants.dart';
6+
import 'package:help_me_design/providers/saved_tab_provider/saved_tab_provider.dart';
7+
import 'package:help_me_design/theme/my_design_system.dart';
8+
import 'package:help_me_design/views/screens/tabs/explore_tab/widgets/cards/explore_resource_card.dart';
39
import 'package:help_me_design/views/widgets/container_pattern_painter.dart';
10+
import 'package:provider/provider.dart';
411

512
import '../widgets/tab_view_hero_card.dart';
613

7-
class SavedDesignResourceTab extends StatelessWidget {
14+
class SavedDesignResourceTab extends StatefulWidget {
815
const SavedDesignResourceTab({Key? key}) : super(key: key);
916

17+
@override
18+
State<SavedDesignResourceTab> createState() => _SavedDesignResourceTabState();
19+
}
20+
21+
class _SavedDesignResourceTabState extends State<SavedDesignResourceTab> {
22+
@override
23+
void initState() {
24+
// TODO: implement initState
25+
var savedTabProvider = Provider.of<SavedTabProvider>(context, listen: false);
26+
var authProvider = Provider.of<AuthService>(context, listen: false);
27+
savedTabProvider.getSavedDesignResources(authProvider.currentUser.$id);
28+
super.initState();
29+
}
30+
1031
@override
1132
Widget build(BuildContext context) {
33+
var savedTabProvider = Provider.of<SavedTabProvider>(context);
1234
return Container(
13-
child: Column(
14-
children: [
15-
TabViewHeroCard(
16-
title: MyTextConstants.savedTabHeadline,
17-
shortDescription: MyTextConstants.savedTabShortDescription,
18-
posterImage: 'assets/images/settings-poster.png',
19-
bgPattern: SavedTabPatternPainter(44, context),
20-
),
21-
],
35+
child: SingleChildScrollView(
36+
child: Column(
37+
children: [
38+
TabViewHeroCard(
39+
title: MyTextConstants.savedTabHeadline,
40+
shortDescription: MyTextConstants.savedTabShortDescription,
41+
posterImage: 'assets/images/settings-poster.png',
42+
bgPattern: SavedTabPatternPainter(44, context),
43+
),
44+
Wrap(
45+
spacing: MySpaceSystem.spaceX3,
46+
runSpacing: MySpaceSystem.spaceX3,
47+
// direction: Axis.vertical,
48+
children: [
49+
for (var i = 0; i < savedTabProvider.listOfSavedDesignResources.length; i++)
50+
ExploreResourceCard(
51+
onTapSave: () {
52+
// save design resources
53+
// DatabasesService.delete;
54+
},
55+
onTap: () {},
56+
onTapSaveIconData: Icons.delete_rounded,
57+
title: savedTabProvider.listOfSavedDesignResources[i].data['title'],
58+
description: savedTabProvider.listOfSavedDesignResources[i].data['description'],
59+
resourceUrl: savedTabProvider.listOfSavedDesignResources[i].data['url'],
60+
)
61+
.animate()
62+
.scaleXY(
63+
begin: 0.2,
64+
alignment: Alignment.bottomLeft,
65+
)
66+
.then()
67+
.saturate(begin: 0, delay: 100.ms, duration: 400.ms)
68+
.animate(target: i == 1 ? 1 : 0)
69+
.shake(delay: 800.ms, hz: 5)
70+
],
71+
),
72+
],
73+
),
2274
),
2375
);
2476
}

0 commit comments

Comments
 (0)