Compare commits
2 Commits
Author | SHA1 | Date | |
---|---|---|---|
eff1ea0812 | |||
6f6fbb3897 |
@ -9,8 +9,9 @@ class TokenT {
|
||||
String token;
|
||||
String domain;
|
||||
String videoPath;
|
||||
String tvPath;
|
||||
|
||||
TokenT(this.token, this.domain, this.videoPath);
|
||||
TokenT(this.token, this.domain, this.videoPath, this.tvPath);
|
||||
}
|
||||
|
||||
class Token {
|
||||
@ -20,6 +21,7 @@ class Token {
|
||||
String _tokenval = "";
|
||||
String _domain = "";
|
||||
String _vPath = "";
|
||||
String _tvPath = "";
|
||||
|
||||
static Token getInstance() {
|
||||
return _token;
|
||||
@ -31,29 +33,33 @@ class Token {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
final token = await _storage.read(key: 'jwt');
|
||||
final domain = await _storage.read(key: 'domain');
|
||||
// todo paths should be loaded on each app start
|
||||
final vPath = await _storage.read(key: 'videoPath');
|
||||
final tvPath = await _storage.read(key: 'tvPath');
|
||||
|
||||
// check if value is defined in phone store
|
||||
if (token != null && domain != null && vPath != null) {
|
||||
_tokenval = token;
|
||||
_domain = domain;
|
||||
return TokenT(token, domain, vPath);
|
||||
return TokenT(token, domain, vPath, tvPath ?? "");
|
||||
} else {
|
||||
Log.d("no token defined");
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
return TokenT(_tokenval, _domain, _vPath);
|
||||
return TokenT(_tokenval, _domain, _vPath, _tvPath);
|
||||
}
|
||||
}
|
||||
|
||||
void setToken(String token, String domain, String videoPath) {
|
||||
void setToken(String token, String domain, String videoPath, String tvPath) {
|
||||
_tokenval = token;
|
||||
_domain = domain;
|
||||
_vPath = videoPath;
|
||||
_tvPath = tvPath;
|
||||
_storage.write(key: 'jwt', value: token);
|
||||
_storage.write(key: 'domain', value: domain);
|
||||
_storage.write(key: 'videoPath', value: videoPath);
|
||||
_storage.write(key: 'tvPath', value: tvPath);
|
||||
}
|
||||
|
||||
Token._();
|
||||
|
10
lib/app.dart
10
lib/app.dart
@ -3,6 +3,7 @@ import 'dart:ui';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:openmediacentermobile/log/log.dart';
|
||||
import 'package:openmediacentermobile/login/login_screen.dart';
|
||||
import 'package:openmediacentermobile/utils/feature_context.dart';
|
||||
|
||||
import 'drawer/drawer_page.dart';
|
||||
import 'login/login_context.dart';
|
||||
@ -21,18 +22,21 @@ class App extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
var loginCtx = LoginContext.of(context);
|
||||
final loginCtx = LoginContext.of(context);
|
||||
|
||||
Log.d("We are logged in: ${loginCtx.loggedIn}");
|
||||
|
||||
if (!loginCtx.loggedIn) {
|
||||
return const MaterialApp(home: LoginScreen());
|
||||
} else {
|
||||
return MaterialApp(
|
||||
return FeatureContainer(
|
||||
child: MaterialApp(
|
||||
scrollBehavior: AppScrollBehavior(),
|
||||
home: DrawerPage(
|
||||
title: 'OpenMediaCenter',
|
||||
));
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3,6 +3,7 @@ import 'package:openmediacentermobile/navigation/settings_screen.dart';
|
||||
import '../navigation/actor_screen.dart';
|
||||
import '../navigation/categorie_screen.dart';
|
||||
import '../navigation/shuffle_screen.dart';
|
||||
import '../navigation/tv_show_screen.dart';
|
||||
import '../navigation/video_feed.dart';
|
||||
import 'drawer_context.dart';
|
||||
|
||||
@ -15,7 +16,7 @@ class DrawerPage extends StatefulWidget {
|
||||
_DrawerPageState createState() => _DrawerPageState();
|
||||
}
|
||||
|
||||
enum Section { HOME, SHUFFLE, SETTING, CATEGORIE, ACTOR }
|
||||
enum Section { HOME, SHUFFLE, SETTING, CATEGORIE, ACTOR, TVSHOW }
|
||||
|
||||
class _DrawerPageState extends State<DrawerPage> {
|
||||
Section _sec = Section.HOME;
|
||||
@ -50,6 +51,11 @@ class _DrawerPageState extends State<DrawerPage> {
|
||||
body = ActorScreen();
|
||||
title = "Actors";
|
||||
break;
|
||||
|
||||
case Section.TVSHOW:
|
||||
body = TVShowScreen();
|
||||
title = "TV Shows";
|
||||
break;
|
||||
}
|
||||
|
||||
return DrawerContext(
|
||||
|
@ -1,4 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:openmediacentermobile/utils/feature_context.dart';
|
||||
|
||||
import 'drawer_context.dart';
|
||||
import 'drawer_page.dart';
|
||||
@ -9,6 +10,7 @@ class MyDrawer extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final ctx = DrawerContext.of(context);
|
||||
final featureCtx = FeatureContext.of(context);
|
||||
|
||||
return Drawer(
|
||||
child: ListView(children: [
|
||||
@ -44,6 +46,15 @@ class MyDrawer extends StatelessWidget {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
if (featureCtx.tvShowEnabled)
|
||||
ListTile(
|
||||
title: const Text('TV Shows'),
|
||||
leading: const Icon(Icons.tv),
|
||||
onTap: () {
|
||||
ctx.onChangePage(Section.TVSHOW);
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
title: const Text('Settings'),
|
||||
leading: const Icon(Icons.settings),
|
||||
|
@ -45,10 +45,11 @@ class _LoginScreenState extends State<LoginScreen> {
|
||||
final token = json["Token"];
|
||||
|
||||
// todo bit hacky
|
||||
Token.getInstance().setToken(token, domain, "temp");
|
||||
Token.getInstance().setToken(token, domain, "temp", "temp");
|
||||
// we need to call this twice because we need for the loadInitialData an api token
|
||||
final initalData = await loadInitialData();
|
||||
Token.getInstance()
|
||||
.setToken(token, domain, (await loadInitialData()).videoPath);
|
||||
.setToken(token, domain, initalData.videoPath, initalData.tvShowPath);
|
||||
LoginContext.of(context).onLoggin(true);
|
||||
|
||||
return "";
|
||||
|
@ -53,7 +53,7 @@ class _SettingsScreenState extends State<SettingsScreen> {
|
||||
ElevatedButton(
|
||||
onPressed: () {
|
||||
loginCtx.onLoggin(false);
|
||||
Token.getInstance().setToken("", "", "");
|
||||
Token.getInstance().setToken("", "", "", "");
|
||||
Db().clear();
|
||||
},
|
||||
child: Text("Logout"))
|
||||
|
15
lib/navigation/tv_show_screen.dart
Normal file
15
lib/navigation/tv_show_screen.dart
Normal file
@ -0,0 +1,15 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class TVShowScreen extends StatefulWidget {
|
||||
const TVShowScreen({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<TVShowScreen> createState() => _TVShowScreenState();
|
||||
}
|
||||
|
||||
class _TVShowScreenState extends State<TVShowScreen> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container();
|
||||
}
|
||||
}
|
92
lib/utils/feature_context.dart
Normal file
92
lib/utils/feature_context.dart
Normal file
@ -0,0 +1,92 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:openmediacentermobile/login/login_context.dart';
|
||||
import '../api/settings_api.dart';
|
||||
|
||||
// todo maybe instead of feature context a context for all settings?
|
||||
class FeatureContext extends InheritedWidget {
|
||||
const FeatureContext(this.tvShowEnabled, this.fullDeleteEnabled,
|
||||
{Key? key, required Widget child})
|
||||
: super(key: key, child: child);
|
||||
|
||||
final bool tvShowEnabled;
|
||||
final bool fullDeleteEnabled;
|
||||
|
||||
static FeatureContext of(BuildContext context) {
|
||||
final FeatureContext? result =
|
||||
context.dependOnInheritedWidgetOfExactType<FeatureContext>();
|
||||
assert(result != null, 'No LoginContext found in context');
|
||||
return result!;
|
||||
}
|
||||
|
||||
@override
|
||||
bool updateShouldNotify(FeatureContext old) {
|
||||
return tvShowEnabled != old.tvShowEnabled ||
|
||||
fullDeleteEnabled != old.fullDeleteEnabled;
|
||||
}
|
||||
}
|
||||
|
||||
class FeatureContainer extends StatefulWidget {
|
||||
const FeatureContainer({Key? key, required this.child}) : super(key: key);
|
||||
final Widget child;
|
||||
|
||||
@override
|
||||
State<FeatureContainer> createState() => _FeatureContainerState();
|
||||
}
|
||||
|
||||
class _FeatureContainerState extends State<FeatureContainer> {
|
||||
bool? tvShowEnabled;
|
||||
bool? fullDeleteEnabled;
|
||||
bool fetcherror = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
loadInitialData()
|
||||
.then((value) => setState(
|
||||
() {
|
||||
fullDeleteEnabled = value.fullDeleteEnabled;
|
||||
tvShowEnabled = value.tvShowEnabled;
|
||||
},
|
||||
))
|
||||
.catchError((err) => setState(() => fetcherror = true));
|
||||
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (fetcherror) {
|
||||
final loginctx = LoginContext.of(context);
|
||||
|
||||
return MaterialApp(
|
||||
home: Scaffold(
|
||||
body: Center(
|
||||
child:
|
||||
Column(mainAxisAlignment: MainAxisAlignment.center, children: [
|
||||
Text("Fetch error"),
|
||||
MaterialButton(
|
||||
onPressed: () => loginctx.onLoggin(false),
|
||||
child: Text("Logout"),
|
||||
)
|
||||
]),
|
||||
),
|
||||
),
|
||||
);
|
||||
} else if (tvShowEnabled == null || fullDeleteEnabled == null) {
|
||||
return MaterialApp(
|
||||
home: Scaffold(
|
||||
body: Container(
|
||||
color: Colors.white,
|
||||
child: Center(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [CircularProgressIndicator(), Text("loading features")],
|
||||
)),
|
||||
),
|
||||
),
|
||||
);
|
||||
} else {
|
||||
return FeatureContext(tvShowEnabled!, fullDeleteEnabled!,
|
||||
child: widget.child);
|
||||
}
|
||||
}
|
||||
}
|
@ -19,6 +19,7 @@ class _VideoScreenDesktopState extends State<VideoScreenDesktop> {
|
||||
Widget build(BuildContext context) {
|
||||
return Video(
|
||||
player: _player,
|
||||
showFullscreenButton: true,
|
||||
scale: 1.0, // default
|
||||
showControls: true);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user