Skip to content

Commit

Permalink
Merge pull request #28 from eban12/refactor-api
Browse files Browse the repository at this point in the history
Code refactor
  • Loading branch information
dagmawibabi authored Sep 4, 2024
2 parents eeb858b + 4b2e506 commit c9d6126
Show file tree
Hide file tree
Showing 10 changed files with 255 additions and 125 deletions.
110 changes: 110 additions & 0 deletions lib/apis/arxiv.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
import 'dart:convert';
import 'dart:math';

import 'package:arxiv/models/paper.dart';
import 'package:dio/dio.dart';
import 'package:xml2json/xml2json.dart';

class Arxiv {
static const _baseUrl = "http://export.arxiv.org/api/query?search_query=all";

static final _dio = Dio();

static const _topics = [
"acid",
"atheory of justice",
"attention is all you need",
"augmented",
"behavioural",
"books",
"black hole",
"brain",
"cats",
"computer",
"creative",
"dog",
"dna sequencing",
"dysonsphere",
"ecg",
"emotional",
"entanglement",
"fear",
"fuzzy sets",
"fidgeting",
"glucose",
"garbage",
"gonad",
"hands",
"heart",
"higgs boson",
"hydron",
"identity",
"industrial",
"isolation",
"laptop",
"love",
"labratory",
"machine learning",
"mathematical theory of communication",
"mental state",
"micro",
"microchip",
"mobile",
"molecular cloning",
"neural network",
"negative",
"numbers",
"pc",
"planet",
"protein measurement",
"psychology",
"quantum",
"quasar",
"qubit",
"reading",
"relationship",
"relativity",
"robotics",
"rocket",
"sitting",
"spider",
"spiritual",
"sulpher",
"television",
"tiered reward",
"transport",
"virtual reality",
"volcano",
"vision",
];

/// Fetches papers for the requested [term].
/// [page] and [pageSize] are optional. If missing, 0 and 30 are used as defaults respectively.
static Future<List<Paper>> search(
String term, {
int page = 0,
int pageSize = 30,
}) async {
final xml2json = Xml2Json();

try {
var response = await _dio.get(
"$_baseUrl:$term&start=$page&max_results=$pageSize",
);
xml2json.parse(response.data);
var jsonData = await json.decode(xml2json.toParker());
return jsonData["feed"]["entry"].map<Paper>((entry) => Paper.fromJson(entry)).toList();
} catch (e) {
return [];
}
}

/// Fetches papers for a random topic.
static Future<List<Paper>> suggest({int pageSize = 30}) {
Random random = Random();
int randomIndex = random.nextInt(_topics.length);
String topic = _topics[randomIndex];

return search(topic, pageSize: pageSize);
}
}
34 changes: 15 additions & 19 deletions lib/components/each_paper_card.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// ignore_for_file: file_names
import 'package:arxiv/components/id_and_date.dart';
import 'package:arxiv/components/summary_bottom_sheet.dart';
import 'package:arxiv/models/paper.dart';
import 'package:arxiv/pages/ai_chat_page.dart';
import 'package:flutter/material.dart';
import 'package:flutter_tex/flutter_tex.dart';
Expand All @@ -23,7 +24,7 @@ class EachPaperCard extends StatefulWidget {
required this.isBookmarked,
});

final dynamic eachPaper;
final Paper eachPaper;
final Function downloadPaper;
final Function parseAndLaunchURL;
final bool isBookmarked;
Expand Down Expand Up @@ -72,7 +73,7 @@ class _EachPaperCardState extends State<EachPaperCard> {
List bookmarks = await bookmarksBox.get("bookmarks") ?? [];
List newBookmarks = [];
for (var eachBookmark in bookmarks) {
if (eachBookmark["id"] != widget.eachPaper["id"]) {
if (eachBookmark.id != widget.eachPaper.id) {
newBookmarks.add(eachBookmark);
}
}
Expand All @@ -88,12 +89,7 @@ class _EachPaperCardState extends State<EachPaperCard> {
List bookmarks = await bookmarksBox.get("bookmarks") ?? [];
await Hive.close();

for (var eachBookmark in bookmarks) {
if (eachBookmark["id"] == widget.eachPaper["id"]) {
isBookmarked = true;
break;
}
}
isBookmarked = bookmarks.where((bookmark) => bookmark.id == widget.eachPaper.id).isNotEmpty;
setState(() {});
}

Expand All @@ -105,7 +101,7 @@ class _EachPaperCardState extends State<EachPaperCard> {

@override
Widget build(BuildContext context) {
String title = widget.eachPaper["title"]
String title = widget.eachPaper.title
.toString()
.replaceAll(RegExp(r'\\n'), '')
.replaceAll(RegExp(r'\\ '), '');
Expand Down Expand Up @@ -144,17 +140,17 @@ class _EachPaperCardState extends State<EachPaperCard> {
children: [
// ID and Published Date
IDAndDate(
id: widget.eachPaper["id"].toString().substring(
widget.eachPaper["id"].lastIndexOf("/") + 1,
widget.eachPaper["id"].length),
date: widget.eachPaper["published"].toString().substring(0, 10),
id: widget.eachPaper.id.substring(
widget.eachPaper.id.lastIndexOf("/") + 1,
widget.eachPaper.id.length),
date: widget.eachPaper.publishedAt.substring(0, 10),
),

// TITLE
GestureDetector(
onTap: () => widget.parseAndLaunchURL(
widget.eachPaper["id"].toString(),
widget.eachPaper["title"].toString(),
widget.eachPaper.id,
widget.eachPaper.title,
),
child: Container(
padding: const EdgeInsets.only(bottom: 5.0),
Expand Down Expand Up @@ -187,7 +183,7 @@ class _EachPaperCardState extends State<EachPaperCard> {
Padding(
padding: const EdgeInsets.only(bottom: 2.0),
child: Text(
"Published: ${widget.eachPaper["published"].toString().substring(0, 10)}",
"Published: ${widget.eachPaper.publishedAt.toString().substring(0, 10)}",
style: const TextStyle(
fontSize: 12.0,
),
Expand All @@ -196,7 +192,7 @@ class _EachPaperCardState extends State<EachPaperCard> {
Padding(
padding: const EdgeInsets.only(bottom: 10.0),
child: Text(
"Authors: ${widget.eachPaper["author"].toString().replaceAll("name:", "").replaceAll(RegExp("[\\[\\]\\{\\}]"), "")}",
"Authors: ${widget.eachPaper.authors}",
style: const TextStyle(
fontSize: 13.0,
),
Expand Down Expand Up @@ -274,7 +270,7 @@ class _EachPaperCardState extends State<EachPaperCard> {
IconButton(
onPressed: () {
shareLink(
widget.eachPaper["id"].toString(),
widget.eachPaper.id,
);
},
icon: Icon(
Expand All @@ -289,7 +285,7 @@ class _EachPaperCardState extends State<EachPaperCard> {
IconButton(
onPressed: () {
widget.downloadPaper(
widget.eachPaper["id"].toString(),
widget.eachPaper.id,
);
},
icon: Icon(
Expand Down
11 changes: 6 additions & 5 deletions lib/components/summary_bottom_sheet.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// ignore_for_file: file_names
import 'package:arxiv/models/paper.dart';
import 'package:arxiv/pages/full_screen_summary_page.dart';
import 'package:flutter/material.dart';
import 'package:flutter_tts/flutter_tts.dart';
Expand All @@ -16,7 +17,7 @@ class SummaryBottomSheet extends StatefulWidget {
required this.parseAndLaunchURL,
});

final dynamic paperData;
final Paper paperData;
final Function parseAndLaunchURL;

@override
Expand Down Expand Up @@ -86,7 +87,7 @@ class _SummaryBottomSheetState extends State<SummaryBottomSheet> {
isSpeaking = false;
setState(() {});
});
summary = widget.paperData["summary"]
summary = widget.paperData.summary
.trim()
.replaceAll(RegExp(r'\\n'), ' ')
.replaceAll(
Expand All @@ -97,7 +98,7 @@ class _SummaryBottomSheetState extends State<SummaryBottomSheet> {

@override
Widget build(BuildContext context) {
String summary = widget.paperData["summary"]
String summary = widget.paperData.summary
.trim()
.replaceAll(RegExp(r'\\n'), ' ')
.replaceAll(RegExp(r'\\'), '');
Expand Down Expand Up @@ -240,8 +241,8 @@ class _SummaryBottomSheetState extends State<SummaryBottomSheet> {
child: IconButton(
onPressed: () {
widget.parseAndLaunchURL(
widget.paperData["id"].toString(),
widget.paperData["title"].toString(),
widget.paperData.id,
widget.paperData.title,
);
},
icon: const Icon(
Expand Down
2 changes: 2 additions & 0 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import "package:arxiv/models/bookmarks.dart";
import "package:arxiv/models/paper.dart";
import "package:arxiv/pages/home_page.dart";
import "package:flutter/material.dart";
import "package:hive_flutter/hive_flutter.dart";
Expand All @@ -8,6 +9,7 @@ void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Hive.initFlutter();
Hive.registerAdapter(BookmarkAdapter());
Hive.registerAdapter(PaperAdapter());
runApp(const MyApp());
}

Expand Down
3 changes: 2 additions & 1 deletion lib/models/bookmarks.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import 'package:arxiv/models/paper.dart';
import 'package:hive/hive.dart';

part 'bookmarks.g.dart';

@HiveType(typeId: 0)
class Bookmark extends HiveObject {
@HiveField(0)
late dynamic paperData;
late Paper paperData;
}
2 changes: 1 addition & 1 deletion lib/models/bookmarks.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

50 changes: 50 additions & 0 deletions lib/models/paper.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@

import 'package:hive/hive.dart';

part 'paper.g.dart';

@HiveType(typeId: 1)
class Paper {
@HiveField(0)
final String id;
@HiveField(1)
final String title;
@HiveField(2)
final String summary;
@HiveField(3)
final String publishedAt;
@HiveField(4)
final String authors;

Paper(
this.id,
this.title,
this.summary,
this.publishedAt,
this.authors,
);

@override
String toString() {
return 'Paper(id: $id, title: $title, summary: $summary, publishedAt: $publishedAt, authors: $authors)';
}

factory Paper.fromJson(Map<String, dynamic> jsonData) => Paper(
jsonData["id"].toString(),
jsonData["title"].toString(),
jsonData["summary"].toString(),
jsonData["published"].toString(),
jsonData["author"]
.toString()
.replaceAll("name:", "")
.replaceAll(RegExp("[\\[\\]\\{\\}]"), ""),
);

Map<String, dynamic> toJson() => {
"id": id,
"title": title,
"summary": summary,
"published": publishedAt,
"author": authors,
};
}
Loading

0 comments on commit c9d6126

Please sign in to comment.