Skip to content
This repository was archived by the owner on Jan 26, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 9 additions & 8 deletions lib/api/client.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
//
// provider.dart
// figures
//
//
// Author: Wess Cope (me@wess.io)
// Created: 06/15/2021
//
//
// Copywrite (c) 2021 Wess.io
//

Expand All @@ -15,18 +15,19 @@ class ApiClient {
Client client = Client();

client
.setEndpoint('https://demo.appwrite.io/v1')
.setProject('almostNetflix2')
.setSelfSigned();
.setEndpoint('https://demo.appwrite.io/v1')
.setProject('almostNetflix2')
.setSelfSigned();

return client;
}

static Account get account => Account(_instance._client);
static Database get database => Database(_instance._client);
static Databases get database =>
Databases(_instance._client, databaseId: 'default');
static Storage get storage => Storage(_instance._client);

static final ApiClient _instance = ApiClient._internal();
ApiClient._internal();
factory ApiClient() => _instance;
}
}
4 changes: 2 additions & 2 deletions lib/extensions/color.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ Color _colorFromHex(String hex) {

switch(hex.length) {
case 3:
hex = "FF" + hex + hex;
hex = "FF$hex$hex";
break;
case 6:
hex = "FF" + hex;
hex = "FF$hex";
break;
case 8:
break;
Expand Down
4 changes: 3 additions & 1 deletion lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,14 @@ Future<void> main() async {
ChangeNotifierProvider(create: (context) => EntryProvider()),
ChangeNotifierProvider(create: (context) => WatchListProvider()),
],
child: Main(),
child: const Main(),
)
);
}

class Main extends StatelessWidget {
const Main({Key? key}) : super(key: key);

@override
Widget build(BuildContext context) {
return MaterialApp(
Expand Down
22 changes: 10 additions & 12 deletions lib/providers/account.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
//
// account.dart
// appflix
//
//
// Author: wess (me@wess.io)
// Created: 01/03/2022
//
//
// Copywrite (c) 2022 Wess.io
//

Expand Down Expand Up @@ -49,31 +49,29 @@ class AccountProvider extends ChangeNotifier {
Future<void> register(String email, String password, String? name) async {
try {
final result = await ApiClient.account.create(
userId: 'unique()',
email: email,
password: password,
name: name
);
userId: 'unique()', email: email, password: password, name: name);

_current = result;

notifyListeners();
} catch(_e) {
} catch (e) {
throw Exception("Failed to register");
}
}

Future<void> login(String email, String password) async {
try {
final result = await ApiClient.account.createSession(email: email, password: password);
final result = await ApiClient.account.createEmailSession(
email: email,
password: password,
);
_session = result;

Store.set("session", json.encode(result.toMap()));

notifyListeners();
} catch(e) {
} catch (e) {
_session = null;
}
}

}
}
36 changes: 23 additions & 13 deletions lib/providers/entry.dart
Original file line number Diff line number Diff line change
@@ -1,28 +1,27 @@
//
// entry.dart
// appflix
//
//
// Author: wess (me@wess.io)
// Created: 01/03/2022
//
//
// Copywrite (c) 2022 Wess.io
//

import 'dart:async';
import 'dart:typed_data';

import 'package:appwrite/appwrite.dart';
import 'package:netflix_clone/api/client.dart';
import 'package:netflix_clone/data/entry.dart';
import 'package:flutter/material.dart';

class EntryProvider extends ChangeNotifier {
final Map<String, Uint8List> _imageCache = {};

Map<String, Uint8List> _imageCache = {};
static const String _collectionId = "movies";
static const String _bucketId = "default";

static String _collectionId = "movies";

Entry? _selected = null;
Entry? _selected;
Entry? get selected => _selected;

Entry _featured = Entry.empty();
Expand All @@ -31,9 +30,14 @@ class EntryProvider extends ChangeNotifier {
List<Entry> _entries = [];
List<Entry> get entries => _entries;
List<Entry> get originals => _entries.where((e) => e.isOriginal).toList();
List<Entry> get animations => _entries.where((e) => e.genres.toLowerCase().contains('animation')).toList();
List<Entry> get newReleases => _entries.where((e) => e.releaseDate != null && e.releaseDate!.isAfter(DateTime.parse('2018-01-01'))).toList();

List<Entry> get animations => _entries
.where((e) => e.genres.toLowerCase().contains('animation'))
.toList();
List<Entry> get newReleases => _entries
.where((e) =>
e.releaseDate != null &&
e.releaseDate!.isAfter(DateTime.parse('2018-01-01')))
.toList();

List<Entry> get trending {
var trending = _entries;
Expand All @@ -50,9 +54,12 @@ class EntryProvider extends ChangeNotifier {
}

Future<void> list() async {
var result = await ApiClient.database.listDocuments(collectionId: _collectionId);
var result =
await ApiClient.database.listDocuments(collectionId: _collectionId);

_entries = result.documents.map((document) => Entry.fromJson(document.data)).toList();
_entries = result.documents
.map((document) => Entry.fromJson(document.data))
.toList();
_featured = _entries.isEmpty ? Entry.empty() : _entries[0];

notifyListeners();
Expand All @@ -63,7 +70,10 @@ class EntryProvider extends ChangeNotifier {
return _imageCache[entry.thumbnailImageId]!;
}

final result = await ApiClient.storage.getFileView(fileId: entry.thumbnailImageId);
final result = await ApiClient.storage.getFileView(
bucketId: _bucketId,
fileId: entry.thumbnailImageId,
);

_imageCache[entry.thumbnailImageId] = result;

Expand Down
60 changes: 33 additions & 27 deletions lib/providers/watchlist.dart
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
//
// watchlist.dart
// Netflix Clone
//
//
// Author: wess (wess@appwrite.io)
// Created: 01/19/2022
//
//
// Copywrite (c) 2022 Appwrite.io
//


import 'dart:async';
import 'dart:typed_data';
import 'package:appwrite/appwrite.dart';
Expand All @@ -19,6 +18,7 @@ import 'package:flutter/material.dart';

class WatchListProvider extends ChangeNotifier {
final String _collectionId = "watchlists";
static const String _bucketId = "default";

List<Entry> _entries = [];
List<Entry> get entries => _entries;
Expand All @@ -34,12 +34,19 @@ class WatchListProvider extends ChangeNotifier {
collectionId: _collectionId,
);

final movieIds = watchlist.documents.map((document) => document.data["movieId"]).toList();
final entries = (await ApiClient.database.listDocuments(collectionId: 'movies')).documents.map((document) => Entry.fromJson(document.data)).toList();
final filtered = entries.where((entry) => movieIds.contains(entry.id)).toList();
final movieIds = watchlist.documents
.map((document) => document.data["movieId"])
.toList();
final entries =
(await ApiClient.database.listDocuments(collectionId: 'movies'))
.documents
.map((document) => Entry.fromJson(document.data))
.toList();
final filtered =
entries.where((entry) => movieIds.contains(entry.id)).toList();

_entries = filtered;

notifyListeners();

return _entries;
Expand All @@ -49,14 +56,13 @@ class WatchListProvider extends ChangeNotifier {
final user = await this.user;

var result = await ApiClient.database.createDocument(
collectionId: _collectionId,
documentId: 'unique()',
data: {
"userId": user.$id,
"movieId": entry.id,
"createdAt": (DateTime.now().second / 1000).round()
}
);
collectionId: _collectionId,
documentId: 'unique()',
data: {
"userId": user.$id,
"movieId": entry.id,
"createdAt": (DateTime.now().second / 1000).round()
});

_entries.add(Entry.fromJson(result.data));

Expand All @@ -67,26 +73,26 @@ class WatchListProvider extends ChangeNotifier {
final user = await this.user;

final result = await ApiClient.database.listDocuments(
collectionId: _collectionId,
queries: [
Query.equal("userId", user.$id),
Query.equal("movieId", entry.id)
]
);
collectionId: _collectionId,
queries: [
Query.equal("userId", user.$id),
Query.equal("movieId", entry.id)
]);

final id = result.documents.first.$id;

await ApiClient.database.deleteDocument(
collectionId: _collectionId,
documentId: id
);
await ApiClient.database
.deleteDocument(collectionId: _collectionId, documentId: id);

list();
}

Future<Uint8List> imageFor(Entry entry) async {
return await ApiClient.storage.getFileView(fileId: entry.thumbnailImageId);
return await ApiClient.storage.getFileView(
bucketId: _bucketId,
fileId: entry.thumbnailImageId,
);
}

bool isOnList(Entry entry) => _entries.any((e) => e.id == entry.id);
}
}
5 changes: 2 additions & 3 deletions lib/screens/details.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:netflix_clone/providers/watchlist.dart';
import 'package:netflix_clone/widgets/buttons/icon.dart';
import 'package:netflix_clone/widgets/content/header.dart';
import 'package:provider/provider.dart';
import 'package:netflix_clone/data/entry.dart';
import 'package:netflix_clone/providers/entry.dart';
Expand All @@ -23,10 +22,10 @@ import 'package:netflix_clone/providers/entry.dart';
class DetailsScreen extends StatefulWidget {
final Entry _entry;

DetailsScreen({Key? key, required Entry entry}) : _entry = entry, super(key: key);
const DetailsScreen({Key? key, required Entry entry,}) : _entry = entry, super(key: key);

@override
_DetailsScreenState createState() => _DetailsScreenState();
State<DetailsScreen> createState() => _DetailsScreenState();
}

class _DetailsScreenState extends State<DetailsScreen> {
Expand Down
2 changes: 1 addition & 1 deletion lib/screens/home.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class HomeScreen extends StatefulWidget {
const HomeScreen({required Key key}) : super(key: key);

@override
_HomeScreenState createState() => _HomeScreenState();
State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
Expand Down
3 changes: 1 addition & 2 deletions lib/screens/navigation.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
//

import 'package:flutter/material.dart';
import 'package:adaptive_dialog/adaptive_dialog.dart';
import 'package:netflix_clone/data/entry.dart';
import 'package:netflix_clone/screens/watchlist.dart';
import 'package:provider/provider.dart';
Expand All @@ -21,7 +20,7 @@ class NavScreen extends StatefulWidget {
const NavScreen({Key? key}) : super(key: key);

@override
_NavScreenState createState() => _NavScreenState();
State<NavScreen> createState() => _NavScreenState();
}

class _NavScreenState extends State<NavScreen> {
Expand Down
2 changes: 1 addition & 1 deletion lib/screens/onboarding.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class OnboardingScreen extends StatefulWidget {
const OnboardingScreen({Key? key}) : super(key: key);

@override
_OnboardingScreenState createState() => _OnboardingScreenState();
State<OnboardingScreen> createState() => _OnboardingScreenState();
}

class _OnboardingScreenState extends State<OnboardingScreen> {
Expand Down
4 changes: 2 additions & 2 deletions lib/screens/watchlist.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class WatchlistScreen extends StatefulWidget {
const WatchlistScreen({Key? key}) : super(key: key);

@override
_WatchlistScreenState createState() => _WatchlistScreenState();
State<WatchlistScreen> createState() => _WatchlistScreenState();
}

class _WatchlistScreenState extends State<WatchlistScreen> {
Expand Down Expand Up @@ -72,7 +72,7 @@ class _WatchlistScreenState extends State<WatchlistScreen> {
),
),
Text(
(entry.description ?? "").substring(0, 50) + "...",
"${(entry.description ?? "").substring(0, 50)}...",
style: const TextStyle(
color: Colors.grey,
fontSize: 14,
Expand Down
1 change: 0 additions & 1 deletion lib/widgets/content/header.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import 'package:netflix_clone/screens/details.dart';
import 'package:netflix_clone/widgets/buttons/icon.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:adaptive_dialog/adaptive_dialog.dart';

class ContentHeader extends StatelessWidget {
final Entry featured;
Expand Down
Loading