Added AppViews

This commit is contained in:
Aman Ahmed Zahir 2024-04-20 16:59:36 +00:00
parent 2c011a6c34
commit 558a9abecc
21 changed files with 602 additions and 71 deletions

5
apps/__init__.py Normal file
View File

@ -0,0 +1,5 @@
from .apps import Apps
__all__ = [
"Apps"
]

358
apps/apps.py Normal file
View File

@ -0,0 +1,358 @@
import flet as ft
from utils import AppView, Title
from modules.settings import config
from modules.home import AppRow
def Apps(page: ft.Page):
AppRow.controls = []
appsContainer = ft.ListView(
expand=True,
)
appList = ft.Container(
content=ft.Column(
controls=[],
),
)
appsContainer.controls.append(
appList,
)
if config.getint('apps', 'dhiraagu') == 1:
appList.content.controls.append(
ft.Card(
content=ft.Container(
ink=True,
content=ft.Column(
[
ft.ListTile(
leading=ft.Image(
border_radius=ft.border_radius.all(10),
fit=ft.ImageFit.CONTAIN,
src='https://asset.brandfetch.io/idZJsIaold/id9-VJM_HU.png',
),
title=ft.Text('Dhiraagu'),
subtitle=ft.Text(
'An ISP Service.',
),
),
],
),
padding=10,
on_click=lambda _: page.go('/apps/dhiraagu'),
),
),
)
AppRow.controls.append(
ft.Text('Dhiraagu')
)
AppRow.controls.append(
ft.Container(
margin=10,
padding=10,
bgcolor=ft.colors.with_opacity(0.1, '#000000'),
border_radius=10,
content=ft.Row(
[
ft.Column(
controls=[
ft.Container(
content=ft.Icon(ft.icons.ACCOUNT_BOX, color=ft.colors.WHITE),
margin=10,
padding=10,
alignment=ft.alignment.center,
bgcolor=ft.colors.GREY_700,
width=60,
height=60,
border_radius=10,
ink=True,
on_click=None,
),
ft.Container(
content=ft.Text("Gift",text_align=ft.TextAlign.CENTER),
alignment=ft.alignment.center,
width=80
)
]
),
ft.Column(
controls=[
ft.Container(
content=ft.Icon(ft.icons.ELECTRIC_BOLT, color=ft.colors.WHITE),
margin=10,
padding=10,
alignment=ft.alignment.center,
bgcolor=ft.colors.GREY_700,
width=60,
height=60,
border_radius=10,
ink=True,
on_click=None,
),
ft.Container(
content=ft.Text("Reload",text_align=ft.TextAlign.CENTER),
alignment=ft.alignment.center,
width=80
)
]
),
ft.Column(
controls=[
ft.Container(
content=ft.Icon(ft.icons.DASHBOARD, color=ft.colors.WHITE),
margin=10,
padding=10,
alignment=ft.alignment.center,
bgcolor=ft.colors.GREY_700,
width=60,
height=60,
border_radius=10,
ink=True,
on_click=None,
),
ft.Container(
content=ft.Text("Usage",text_align=ft.TextAlign.CENTER),
alignment=ft.alignment.center,
width=80
)
]
),
ft.Column(
controls=[
ft.Container(
content=ft.Icon(ft.icons.RECEIPT, color=ft.colors.WHITE),
margin=10,
padding=10,
alignment=ft.alignment.center,
bgcolor=ft.colors.GREY_700,
width=60,
height=60,
border_radius=10,
ink=True,
on_click=None,
),
ft.Container(
content=ft.Text("Bills",text_align=ft.TextAlign.CENTER),
alignment=ft.alignment.center,
width=80
)
]
),
],
alignment=ft.MainAxisAlignment.CENTER,
),
)
)
if config.getint('apps', 'ooredoo') == 1:
appList.content.controls.append(
ft.Card(
content=ft.Container(
ink=True,
content=ft.Column(
[
ft.ListTile(
leading=ft.Image(
border_radius=ft.border_radius.all(10),
fit=ft.ImageFit.CONTAIN,
src='https://asset.brandfetch.io/idR1xFKHLD/idu6J-WQsm.jpeg',
),
title=ft.Text('Ooredoo'),
subtitle=ft.Text(
'An ISP Service.',
),
),
],
),
padding=10,
on_click=lambda _: page.go('/apps/ooredoo'),
),
)
)
AppRow.controls.append(
ft.Text('Ooredoo')
)
AppRow.controls.append(
ft.Container(
margin=10,
padding=10,
bgcolor=ft.colors.with_opacity(0.1, '#000000'),
border_radius=10,
content=ft.Row(
[
ft.Column(
controls=[
ft.Container(
content=ft.Icon(ft.icons.SETTINGS_PHONE, color=ft.colors.WHITE),
margin=10,
padding=10,
alignment=ft.alignment.center,
bgcolor=ft.colors.GREY_700,
width=60,
height=60,
border_radius=10,
ink=True,
on_click=None,
),
ft.Container(
content=ft.Text("Add-ons",text_align=ft.TextAlign.CENTER),
alignment=ft.alignment.center,
width=80
)
]
),
ft.Column(
controls=[
ft.Container(
content=ft.Icon(ft.icons.ELECTRIC_BOLT, color=ft.colors.WHITE),
margin=10,
padding=10,
alignment=ft.alignment.center,
bgcolor=ft.colors.GREY_700,
width=60,
height=60,
border_radius=10,
ink=True,
on_click=None,
),
ft.Container(
content=ft.Text("Raastas",text_align=ft.TextAlign.CENTER),
alignment=ft.alignment.center,
width=80
)
]
),
ft.Column(
controls=[
ft.Container(
content=ft.Icon(ft.icons.DASHBOARD, color=ft.colors.WHITE),
margin=10,
padding=10,
alignment=ft.alignment.center,
bgcolor=ft.colors.GREY_700,
width=60,
height=60,
border_radius=10,
ink=True,
on_click=None,
),
ft.Container(
content=ft.Text("Balance",text_align=ft.TextAlign.CENTER),
alignment=ft.alignment.center,
width=80
)
]
),
ft.Column(
controls=[
ft.Container(
content=ft.Icon(ft.icons.RECEIPT, color=ft.colors.WHITE),
margin=10,
padding=10,
alignment=ft.alignment.center,
bgcolor=ft.colors.GREY_700,
width=60,
height=60,
border_radius=10,
ink=True,
on_click=None,
),
ft.Container(
content=ft.Text("Bills",text_align=ft.TextAlign.CENTER),
alignment=ft.alignment.center,
width=80
)
]
),
],
alignment=ft.MainAxisAlignment.CENTER,
),
)
)
if config.getint('apps', 'mwsc') == 1:
appList.content.controls.append(
ft.Card(
content=ft.Container(
ink=True,
content=ft.Column(
[
ft.ListTile(
leading=ft.Image(
border_radius=ft.border_radius.all(10),
fit=ft.ImageFit.CONTAIN,
src='https://asset.brandfetch.io/idOZWUOUm-/idNastd9Bg.jpeg',
),
title=ft.Text('MWSC'),
subtitle=ft.Text(
'Water Bills',
),
),
],
),
padding=10,
on_click=lambda _: page.go('/apps/mwsc'),
),
),
)
if config.getint('apps', 'stelco') == 1:
appList.content.controls.append(
ft.Card(
content=ft.Container(
ink=True,
content=ft.Column(
[
ft.ListTile(
leading=ft.Image(
border_radius=ft.border_radius.all(10),
fit=ft.ImageFit.CONTAIN,
src='https://www.stelco.com.mv/wp-content/uploads/2022/02/unnamed.png',
),
title=ft.Text('STELCO'),
subtitle=ft.Text(
'Electricity Bills',
),
),
],
),
padding=10,
on_click=lambda _:page.go('/apps/stelco'),
),
),
)
if config.getint('apps', 'medianet') == 1:
appList.content.controls.append(
ft.Card(
content=ft.Container(
ink=True,
content=ft.Column(
[
ft.ListTile(
leading=ft.Image(
border_radius=ft.border_radius.all(10),
fit=ft.ImageFit.CONTAIN,
src='https://asset.brandfetch.io/idLMZnv5SC/iduyX4keYN.jpeg',
),
title=ft.Text('Dhiraagu'),
subtitle=ft.Text(
'Online Television Service',
),
),
],
),
padding=10,
on_click=lambda _: page.go('/apps/medianet'),
),
),
)
return AppView(
'/apps',
[
ft.AppBar(
leading=ft.IconButton(
ft.icons.ARROW_BACK_IOS_NEW_ROUNDED,
on_click=lambda _: page.go('/'),
),
title=ft.Text(Title(str(__file__))),
bgcolor=ft.colors.TRANSPARENT,
),
appsContainer
],
)

13
apps/plugins/__init__.py Normal file
View File

@ -0,0 +1,13 @@
from .dhiraagu import Dhiraagu
from .ooredoo import Ooredoo
from .medianet import Medianet
from .mwsc import Mwsc
from .stelco import Stelco
__all__ = [
'Dhiraagu',
'Ooredoo',
'Medianet',
'Stelco',
'Mwsc'
]

View File

@ -0,0 +1,5 @@
from .app import App as Dhiraagu
__all__ = [
'Dhiraagu'
]

View File

@ -0,0 +1,18 @@
import flet as ft
from utils import AppView
def App(page: ft.Page):
return AppView(
'/apps/dhiraagu',
[
ft.AppBar(
leading=ft.IconButton(
ft.icons.ARROW_BACK_IOS_NEW_ROUNDED,
on_click=lambda _: page.go('/apps'),
),
title=ft.Text("Dhiraagu"),
bgcolor=ft.colors.TRANSPARENT,
),
],
)

View File

@ -0,0 +1,5 @@
from .app import App as Medianet
__all__ = [
"Medianet"
]

View File

@ -0,0 +1,18 @@
import flet as ft
from utils import AppView
def App(page: ft.Page):
return AppView(
'/apps/medianet',
[
ft.AppBar(
leading=ft.IconButton(
ft.icons.ARROW_BACK_IOS_NEW_ROUNDED,
on_click=lambda _: page.go('/apps'),
),
title=ft.Text("Medianet"),
bgcolor=ft.colors.TRANSPARENT,
),
],
)

View File

@ -0,0 +1,5 @@
from .app import App as Mwsc
__all__ = [
'Mwsc'
]

18
apps/plugins/mwsc/app.py Normal file
View File

@ -0,0 +1,18 @@
import flet as ft
from utils import AppView
def App(page: ft.Page):
return AppView(
'/apps/mwsc',
[
ft.AppBar(
leading=ft.IconButton(
ft.icons.ARROW_BACK_IOS_NEW_ROUNDED,
on_click=lambda _: page.go('/apps'),
),
title=ft.Text("MWSC"),
bgcolor=ft.colors.TRANSPARENT,
),
],
)

View File

@ -0,0 +1,5 @@
from .app import App as Ooredoo
__all__ = [
'Ooredoo'
]

View File

@ -0,0 +1,18 @@
import flet as ft
from utils import AppView
def App(page: ft.Page):
return AppView(
'/apps/ooredoo',
[
ft.AppBar(
leading=ft.IconButton(
ft.icons.ARROW_BACK_IOS_NEW_ROUNDED,
on_click=lambda _: page.go('/apps'),
),
title=ft.Text("Ooredoo"),
bgcolor=ft.colors.TRANSPARENT,
),
],
)

View File

@ -0,0 +1,5 @@
from .app import App as Stelco
__all__ = [
'Stelco'
]

View File

@ -0,0 +1,18 @@
import flet as ft
from utils import AppView
def App(page: ft.Page):
return AppView(
'/apps/stelco',
[
ft.AppBar(
leading=ft.IconButton(
ft.icons.ARROW_BACK_IOS_NEW_ROUNDED,
on_click=lambda _: page.go('/apps'),
),
title=ft.Text("STELCO"),
bgcolor=ft.colors.TRANSPARENT,
),
],
)

View File

@ -2,6 +2,7 @@ import flet as ft
from utils import views_handler from utils import views_handler
from modules.settings.functions import config from modules.settings.functions import config
def main(page: ft.Page): def main(page: ft.Page):
page.title = 'BillPay' page.title = 'BillPay'
print('Initial route:', page.route) print('Initial route:', page.route)

View File

@ -2,4 +2,4 @@ from .home import Home
from .settings import Settings from .settings import Settings
__all__ = ['Home', 'Settings'] __all__ = ['Home', 'Settings', 'Apps']

View File

@ -13,6 +13,11 @@ def greet(time: datetime):
return 'Goodevening,' return 'Goodevening,'
AppRow = ft.ResponsiveRow(
alignment=ft.MainAxisAlignment.CENTER,
)
def Home(page: ft.Page): def Home(page: ft.Page):
contentColumn = ft.Container( contentColumn = ft.Container(
padding=10, padding=10,
@ -21,50 +26,15 @@ def Home(page: ft.Page):
ft.Text( ft.Text(
greet(datetime.now()), greet(datetime.now()),
size=50, size=50,
weight=ft.FontWeight.W_200, weight=ft.FontWeight.W_500,
), ),
ft.Text( ft.Text(
config.get('general', 'name').split(' ')[0], config.get('general', 'name').split(' ')[0],
size=40, size=40,
weight=ft.FontWeight.W_200, weight=ft.FontWeight.W_300,
), ),
ft.Divider(), ft.Divider(),
ft.ResponsiveRow( AppRow,
[
ft.Container(
content=ft.Text('A'),
margin=10,
padding=10,
bgcolor=ft.colors.with_opacity(0.1, '#000000'),
border_radius=10,
),
ft.Divider(),
ft.Container(
content=ft.Text('B'),
margin=10,
padding=10,
bgcolor=ft.colors.with_opacity(0.1, '#000000'),
border_radius=10,
),
ft.Divider(),
ft.Container(
content=ft.Text('C'),
margin=10,
padding=10,
bgcolor=ft.colors.with_opacity(0.1, '#000000'),
border_radius=10,
),
ft.Divider(),
ft.Container(
content=ft.Text('D'),
margin=10,
padding=10,
bgcolor=ft.colors.with_opacity(0.1, '#000000'),
border_radius=10,
),
],
alignment=ft.MainAxisAlignment.CENTER,
),
ft.Divider(), ft.Divider(),
ft.Container( ft.Container(
margin=10, margin=10,
@ -74,7 +44,23 @@ def Home(page: ft.Page):
content=ft.Row( content=ft.Row(
[ [
ft.Container( ft.Container(
content=ft.Icon(ft.icons.APPS, color=ft.colors.WHITE), content=ft.Icon(
ft.icons.APPS, color=ft.colors.WHITE,
),
margin=10,
padding=10,
alignment=ft.alignment.center,
bgcolor=ft.colors.GREY_700,
width=60,
height=60,
border_radius=10,
ink=True,
on_click=lambda _: page.go('/apps'),
),
ft.Container(
content=ft.Icon(
ft.icons.HISTORY, color=ft.colors.WHITE,
),
margin=10, margin=10,
padding=10, padding=10,
alignment=ft.alignment.center, alignment=ft.alignment.center,
@ -85,18 +71,9 @@ def Home(page: ft.Page):
on_click=None, on_click=None,
), ),
ft.Container( ft.Container(
content=ft.Icon(ft.icons.HISTORY, color=ft.colors.WHITE), content=ft.Icon(
margin=10, ft.icons.SETTINGS, color=ft.colors.WHITE,
padding=10,
alignment=ft.alignment.center,
bgcolor=ft.colors.GREY_700,
width=60,
height=60,
border_radius=10,
on_click=None,
), ),
ft.Container(
content=ft.Icon(ft.icons.SETTINGS, color=ft.colors.WHITE),
margin=10, margin=10,
padding=10, padding=10,
alignment=ft.alignment.center, alignment=ft.alignment.center,
@ -108,7 +85,9 @@ def Home(page: ft.Page):
on_click=lambda _: page.go('/settings'), on_click=lambda _: page.go('/settings'),
), ),
ft.Container( ft.Container(
content=ft.Icon(ft.icons.LIST, color=ft.colors.WHITE), content=ft.Icon(
ft.icons.LIST, color=ft.colors.WHITE,
),
margin=10, margin=10,
padding=10, padding=10,
alignment=ft.alignment.center, alignment=ft.alignment.center,

View File

@ -10,17 +10,18 @@ email =
theme = dark theme = dark
[apps] [apps]
dhiraagu = true dhiraagu = 1
ooredoo = true ooredoo = 1
hdc = true hdc = 1
mwsc = true mwsc = 1
stelco = true stelco = 1
medianet = true medianet = 1
[dhiraagu] [dhiraagu]
phone = phone =
otp = otp =
cookie = token =
account =
[ooredoo] [ooredoo]
phone = phone =

View File

@ -31,7 +31,7 @@ def Settings(page: ft.Page):
ft.CupertinoButton( ft.CupertinoButton(
'Close', on_click=lambda _: ( 'Close', on_click=lambda _: (
setattr(dlg, 'open', False), setattr(dlg, 'open', False),
page.update() page.update(),
), ),
), ),
], ],
@ -62,7 +62,7 @@ def Settings(page: ft.Page):
ft.CupertinoButton( ft.CupertinoButton(
'Close', on_click=lambda _: ( 'Close', on_click=lambda _: (
setattr(dlg, 'open', False), setattr(dlg, 'open', False),
page.update() page.update(),
), ),
), ),
], ],
@ -93,7 +93,7 @@ def Settings(page: ft.Page):
ft.CupertinoButton( ft.CupertinoButton(
'Close', on_click=lambda _: ( 'Close', on_click=lambda _: (
setattr(dlg, 'open', False), setattr(dlg, 'open', False),
page.update() page.update(),
), ),
), ),
], ],
@ -124,7 +124,7 @@ def Settings(page: ft.Page):
ft.CupertinoButton( ft.CupertinoButton(
'Close', on_click=lambda _: ( 'Close', on_click=lambda _: (
setattr(dlg, 'open', False), setattr(dlg, 'open', False),
page.update() page.update(),
), ),
), ),
], ],
@ -267,7 +267,7 @@ def Settings(page: ft.Page):
], ],
), ),
padding=10, padding=10,
on_click=lambda _: print('clicked dhiraagu'), on_click=None,
), ),
), ),
ft.Card( ft.Card(
@ -368,10 +368,10 @@ def Settings(page: ft.Page):
def _on_theme_change(e): def _on_theme_change(e):
if page.theme_mode == ft.ThemeMode.LIGHT: if page.theme_mode == ft.ThemeMode.LIGHT:
e.value = False e.value = False
config.save('general', 'theme', 'light') config.save('general', 'theme', 'dark')
else: else:
e.value = True e.value = True
config.save('general', 'theme', 'dark') config.save('general', 'theme', 'light')
Theme(page).change( Theme(page).change(
ft.ThemeMode.DARK if page.theme_mode == ft.ThemeMode.DARK if page.theme_mode ==
ft.ThemeMode.LIGHT else ft.ThemeMode.LIGHT, ft.ThemeMode.LIGHT else ft.ThemeMode.LIGHT,

View File

@ -1,8 +1,20 @@
from modules import Home, Settings from modules import Home, Settings
from apps import Apps
from apps.plugins import Ooredoo, Dhiraagu, Medianet, Mwsc, Stelco
def views_handler(page): def views_handler(page):
return { views = {}
'/': Home(page), # root
'/settings': Settings(page), views['/'] = Home(page)
}
# settings
views['/settings'] = Settings(page)
# apps
views['/apps'] = Apps(page)
views['/apps/dhiraagu'] = Dhiraagu(page)
views['/apps/ooredoo'] = Ooredoo(page)
views['/apps/medianet'] = Medianet(page)
views['/apps/mwsc'] = Mwsc(page)
views['/apps/stelco'] = Stelco(page)
return views

5
wrappers/__init__.py Normal file
View File

@ -0,0 +1,5 @@
from .dhiraagu import DhiraaguAPI
__all__ = [
'DhiraaguAPI'
]

42
wrappers/dhiraagu.py Normal file
View File

@ -0,0 +1,42 @@
import requests
class DhiraaguAPI:
def __init__(
self,
phone: str = None,
otp: str = None,
token: str = None,
account: str = None,
) -> None:
self.phone = phone
self.otp = otp
self.token = token
self.account = account
self.headers = {
'Host': 'app-production.dhiraagu.com.mv',
'Content-Type': 'application/json',
'Connection': 'keep-alive',
'Accept': '*/*',
'User-Agent': 'MyDhiraagu/5.0 (mv.com.dhiraagu.app; build:1; iOS 17.5.0) Alamofire/5.6.1',
'Accept-Language': 'en-US;q=1.0, dv-MV;q=0.9, ar-MV;q=0.8',
# 'Content-Length': '33',
# 'Accept-Encoding': 'br;q=1.0, gzip;q=0.9, deflate;q=0.8',
}
if self.token:
self.headers['Authorization'] = f'Bearer {self.token}'
def login(self):
data = requests.post(
'https://app-production.dhiraagu.com.mv/auth',
json={
'number': self.phone,
'otp': self.otp
}
)
return data.json()
def bills(self):
return requests.get(
f'https://app-production.dhiraagu.com.mv/io/v1/info/subscribers/{self.account}/liberate/billinfo',
headers=self.headers
).json()