Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add note analyzer #24

Merged
merged 13 commits into from
Apr 7, 2024
6 changes: 3 additions & 3 deletions lib/core/shared/presentation/pages/homepage_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class HomepageScreen extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
return AutoTabsScaffold(
routes: const [ReviewRoute(), NotebooksRoute()],
routes: const [NotebooksRoute(), ReviewRoute()],
extendBody: true,
bottomNavigationBuilder: (_, tabsRouter) {
// TODO: make this sht look like the bottom nav bar in the figma
Expand All @@ -20,9 +20,9 @@ class HomepageScreen extends ConsumerWidget {
fixedColor: Colors.grey,
unselectedItemColor: Colors.black,
items: const [
BottomNavigationBarItem(label: 'Notes', icon: Icon(Icons.home)),
BottomNavigationBarItem(
label: 'Review Page', icon: Icon(Icons.home)),
BottomNavigationBarItem(label: 'Notes', icon: Icon(Icons.folder)),
label: 'Review Methods', icon: Icon(Icons.folder)),
BottomNavigationBarItem(
label: 'Analytics', icon: Icon(Icons.bar_chart)),
BottomNavigationBarItem(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:image_picker/image_picker.dart';
import 'package:u_do_note/core/firestore_collection_enum.dart';

import 'package:u_do_note/core/firestore_collection_enum.dart';
import 'package:u_do_note/core/logger/logger.dart';
import 'package:u_do_note/core/shared/data/models/note.dart';
import 'package:u_do_note/features/note_taking/data/models/notebook.dart';
Expand All @@ -16,8 +16,7 @@ class NoteRemoteDataSource {

const NoteRemoteDataSource(this._firestore, this._auth);

Future<NotebookModel> createNotebook(
String name, String coverImgUrl, String coverImgFileName) async {
Future<NotebookModel> createNotebook(String name, XFile? coverImg) async {
logger.i('Creating notebook...');

var userId = _auth.currentUser!.uid;
Expand All @@ -33,9 +32,18 @@ class NoteRemoteDataSource {
.get();

if (notebook.docs.isNotEmpty) {
response = "Notebook with name $name already exists.";
return NotebookModel.fromFirestore(
notebook.docs.first.id, notebook.docs.first.data());
response = "Notebook with the name [$name] already exists.";
throw response;
}

var coverImgUrl = '';
var coverImgFileName = '';

if (coverImg != null) {
var urls = await uploadNotebookCover(coverImg);

coverImgUrl = urls[0];
coverImgFileName = urls[1];
}

var createdAt = Timestamp.now();
Expand All @@ -45,7 +53,7 @@ class NoteRemoteDataSource {
.collection('user_notes')
.add({
'subject': name.toLowerCase(),
'cover_url': coverImgUrl,
'cover_url': coverImgUrl.isEmpty ? '' : coverImgUrl,
'cover_file_name': coverImgFileName,
'created_at': FieldValue.serverTimestamp(),
});
Expand Down Expand Up @@ -90,7 +98,7 @@ class NoteRemoteDataSource {
}

// ? r treats the string as a raw string
const defaultContent = r'[{"insert":"Start taking notes\n"}]';
var defaultContent = r'[{"insert":"' '$title' r'\n"}]';
var newNote = NoteModel(
id: DateTime.now().millisecondsSinceEpoch.toString(),
title: title,
Expand Down Expand Up @@ -187,15 +195,15 @@ class NoteRemoteDataSource {
var userId = _auth.currentUser!.uid;

if (coverImg != null) {
var coverDownloadUrl = await uploadNotebookCover(coverImg);
var urls = await uploadNotebookCover(coverImg);

if (notebook.coverFileName.isNotEmpty) {
await deleteNotebookCover(notebook.coverFileName);
}

var updatedModel = notebook.copyWith(
coverUrl: coverDownloadUrl,
coverFileName: coverImg.name,
coverUrl: urls[0],
coverFileName: urls[1],
);

await _firestore
Expand Down Expand Up @@ -307,10 +315,13 @@ class NoteRemoteDataSource {
return true;
}

Future<String> uploadNotebookCover(XFile image) async {
Future<List<String>> uploadNotebookCover(XFile image) async {
FirebaseStorage storage = FirebaseStorage.instance;

final fileName = image.name;
final fileNameArr = image.name.split('.');
final fileName =
"${DateTime.now().millisecondsSinceEpoch.toString()}_${fileNameArr[0]}.${fileNameArr[1]}";

logger.i('Uploading notebook cover with name: $fileName...');

var fileReference = storage.ref().child('notebook_covers/$fileName');
Expand All @@ -320,6 +331,6 @@ class NoteRemoteDataSource {
var downloadUrl = await snapshot.ref.getDownloadURL();

logger.i('Notebook cover uploaded successfully with url: $downloadUrl');
return downloadUrl;
return [downloadUrl, fileName];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,9 @@ class NoteRepositoryImpl implements NoteRepository {

@override
Future<Either<Failure, NotebookModel>> createNotebook(
String name, String coverImgUrl, String coverImgFileName) async {
String name, XFile? coverImg) async {
try {
var nbModel = await _noteRemoteDataSource.createNotebook(
name, coverImgUrl, coverImgFileName);
var nbModel = await _noteRemoteDataSource.createNotebook(name, coverImg);

return Right(nbModel);
} catch (e) {
Expand Down Expand Up @@ -85,12 +84,13 @@ class NoteRepositoryImpl implements NoteRepository {
}

@override
Future<Either<Failure, String>> uploadNotebookCover(XFile coverImg) async {
Future<Either<Failure, List<String>>> uploadNotebookCover(
XFile coverImg) async {
try {
var downloadUrl =
var downloadUrls =
await _noteRemoteDataSource.uploadNotebookCover(coverImg);

return Right(downloadUrl);
return Right(downloadUrls);
} catch (e) {
return Left(GenericFailure(message: e.toString()));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@ abstract class NoteRepository {
Future<Either<Failure, NoteModel>> createNote(
{required String notebookId, required String title});
Future<Either<Failure, NotebookModel>> createNotebook(
String name, String coverImgUrl, String coverImgFileName);
String name, XFile? coverImg);
Future<Either<Failure, List<NotebookModel>>> getNotebooks();
Future<Either<Failure, String>> uploadNotebookCover(XFile coverImg);

Future<Either<Failure, List<String>>> uploadNotebookCover(XFile coverImg);
Future<Either<Failure, bool>> updateNote(
{required String notebookId, required NoteModel note});
Future<Either<Failure, NotebookModel>> updateNotebook(
Expand Down
5 changes: 3 additions & 2 deletions lib/features/note_taking/domain/usecases/create_notebook.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:dartz/dartz.dart';
import 'package:image_picker/image_picker.dart';

import 'package:u_do_note/core/error/failures.dart';
import 'package:u_do_note/features/note_taking/data/models/notebook.dart';
Expand All @@ -9,7 +10,7 @@ class CreateNotebook {

CreateNotebook(this._noteRepository);

Future<Either<Failure, NotebookModel>> call(String name, String coverImgUrl, String coverImgFileName) async {
return await _noteRepository.createNotebook(name, coverImgUrl, coverImgFileName);
Future<Either<Failure, NotebookModel>> call(String name, XFile? coverImg) async {
return await _noteRepository.createNotebook(name, coverImg);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ class UploadNotebookCover {

UploadNotebookCover(this.noteRepository);

Future<Either<Failure, String>> call(XFile coverImg) async {
Future<Either<Failure, List<String>>> call(XFile coverImg) async {
return await noteRepository.uploadNotebookCover(coverImg);
}
}
Loading