Compare commits
44 Commits
dev_faiz
...
developmen
| Author | SHA1 | Date |
|---|---|---|
|
|
2dfaf356ff | 1 year ago |
|
|
49d69ab809 | 1 year ago |
|
|
366541f20f | 1 year ago |
|
|
ca664cda0f | 1 year ago |
|
|
686f73a98b | 1 year ago |
|
|
291215907c | 2 years ago |
|
|
6e5234ec07 | 2 years ago |
|
|
6bf23c9ca4 | 2 years ago |
|
|
759e9d388a | 2 years ago |
|
|
582fb4ca86 | 2 years ago |
|
|
341337e566 | 2 years ago |
|
|
6a60090f9a | 2 years ago |
|
|
ffd9c8c990 | 2 years ago |
|
|
07b337ba70 | 2 years ago |
|
|
3982491386 | 2 years ago |
|
|
8bc4b08646 | 2 years ago |
|
|
1205ae060b | 2 years ago |
|
|
1bd1abe01d | 2 years ago |
|
|
66010e4f5d | 2 years ago |
|
|
2398a67465 | 2 years ago |
|
|
6852ed87a9 | 2 years ago |
|
|
ee3ff98b5d | 2 years ago |
|
|
867e2779e3 | 2 years ago |
|
|
3b1966f819 | 2 years ago |
|
|
74ab4d5f84 | 2 years ago |
|
|
87ba49fe54 | 2 years ago |
|
|
1c199f6351 | 2 years ago |
|
|
1da3bcf843 | 2 years ago |
|
|
98888a32f0 | 2 years ago |
|
|
5262af379e | 2 years ago |
|
|
eea3394461 | 2 years ago |
|
|
74aefd4b05 | 2 years ago |
|
|
3025c26d94 | 2 years ago |
|
|
0027f88df5 | 2 years ago |
|
|
f524cee132 | 2 years ago |
|
|
1a3ed42951 | 2 years ago |
|
|
0ac7d68a65 | 2 years ago |
|
|
941ca2ff0e | 3 years ago |
|
|
017f01621e | 3 years ago |
|
|
01bf6736c6 | 3 years ago |
|
|
e82f908885 | 3 years ago |
|
|
14f1268f66 | 3 years ago |
|
|
a15aaa4db9 | 3 years ago |
|
|
a6537f1658 | 3 years ago |
@ -0,0 +1 @@
|
||||
/Users/zik/fvm/versions/3.7.5
|
||||
@ -0,0 +1,4 @@
|
||||
{
|
||||
"flutterSdkVersion": "3.7.5",
|
||||
"flavors": {}
|
||||
}
|
||||
@ -1,31 +1,40 @@
|
||||
buildscript {
|
||||
ext.kotlin_version = '1.6.0'
|
||||
ext.kotlin_version = '1.9.10'
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:4.1.0'
|
||||
classpath 'com.android.tools.build:gradle:8.7.0'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
}
|
||||
}
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
}
|
||||
subprojects {
|
||||
afterEvaluate { project ->
|
||||
if (project.hasProperty('android')) {
|
||||
project.android {
|
||||
if (namespace == null) {
|
||||
namespace project.group
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
rootProject.buildDir = '../build'
|
||||
subprojects {
|
||||
project.buildDir = "${rootProject.buildDir}/${project.name}"
|
||||
}
|
||||
subprojects {
|
||||
project.evaluationDependsOn(':app')
|
||||
}
|
||||
|
||||
task clean(type: Delete) {
|
||||
tasks.register("clean", Delete) {
|
||||
delete rootProject.buildDir
|
||||
}
|
||||
}
|
||||
@ -1,11 +1,26 @@
|
||||
include ':app'
|
||||
pluginManagement {
|
||||
def flutterSdkPath = {
|
||||
def properties = new Properties()
|
||||
file("local.properties").withInputStream { properties.load(it) }
|
||||
def flutterSdkPath = properties.getProperty("flutter.sdk")
|
||||
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
|
||||
return flutterSdkPath
|
||||
}()
|
||||
|
||||
def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
|
||||
def properties = new Properties()
|
||||
includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
|
||||
|
||||
assert localPropertiesFile.exists()
|
||||
localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
gradlePluginPortal()
|
||||
}
|
||||
}
|
||||
|
||||
def flutterSdkPath = properties.getProperty("flutter.sdk")
|
||||
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
|
||||
apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
|
||||
plugins {
|
||||
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
|
||||
id "com.android.application" version '8.7.0' apply false
|
||||
id "org.jetbrains.kotlin.android" version "1.8.22" apply false
|
||||
|
||||
}
|
||||
|
||||
include ":app"
|
||||
@ -0,0 +1,33 @@
|
||||
<svg fill="none" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-rule="evenodd" fill-rule="evenodd">
|
||||
<path
|
||||
d="m10.5714 5.7738c-2.78119 0-5.03576 2.25457-5.03576 5.0357 0 .8311.20189 1.6171.55995 2.3098.12879.2491.3858.4056.66624.4056h8.09527c.4142 0 .75-.3358.75-.75v-1.4892-.4762c0-2.78113-2.2546-5.0357-5.0357-5.0357z"
|
||||
fill="#E5B045" />
|
||||
<path
|
||||
d="m10.5 5.77429v7.22571h-4.46407c-.32074-.6631-.50029-1.4068-.50029-2.1905 0-2.75731 2.21611-4.99704 4.96436-5.03521z"
|
||||
fill="#e5b045" />
|
||||
<path
|
||||
d="m11.5831 9.58331c-3.37338 0-6.18137 2.53149-6.39207 5.78539-1.68658.3293-2.98888 1.7661-2.98888 3.536 0 2.0208 1.69742 3.6072 3.72619 3.6072h1.78571 10.11905c.5478 0 1.0705-.1149 1.5418-.3225 1.9561-.7122 3.3749-2.5408 3.3749-4.7132 0-2.8097-2.3637-5.0357-5.2143-5.0357-.18 0-.358.0088-.5336.0261-1.1384-1.7391-3.1458-2.88329-5.4188-2.88329z"
|
||||
fill="#cfd8dc" />
|
||||
<path
|
||||
d="m12 9.59621v12.91569h-4.28595-1.78571c-2.02877 0-3.72619-1.5864-3.72619-3.6072 0-1.7699 1.3023-3.2067 2.98888-3.536.2107-3.2539 3.01869-5.78539 6.39207-5.78539.14 0 .279.00435.4169.0129z"
|
||||
fill="#cfd8dc" />
|
||||
<path
|
||||
d="m10.5714 1.4881c.4142 0 .75.33578.75.75v1.90476c0 .41421-.3358.75-.75.75s-.74997-.33579-.74997-.75v-1.90476c0-.41422.33577-.75.74997-.75z"
|
||||
fill="#ff884d" />
|
||||
<g fill="#e57a45">
|
||||
<path
|
||||
d="m10.5 1.49146v3.39805c-.3807-.03596-.67859-.35652-.67859-.74665v-1.90476c0-.39013.29789-.71068.67859-.74664z" />
|
||||
<path
|
||||
d="m1.25 10.3333c0-.41417.33579-.74996.75-.74996h1.90476c.41422 0 .75.33579.75.74996 0 .4143-.33578.75-.75.75h-1.90476c-.41421 0-.75-.3357-.75-.75z" />
|
||||
<path
|
||||
d="m3.85063 4.08872c.29289-.29289.76776-.29289 1.06066 0l1.34687 1.34687c.29289.29289.29289.76777 0 1.06066-.2929.29289-.76777.29289-1.06066 0l-1.34687-1.34687c-.2929-.29289-.2929-.76777 0-1.06066z" />
|
||||
</g>
|
||||
<path
|
||||
d="m17.2104 4.08872c-.2929-.29289-.7678-.29289-1.0607 0l-1.3468 1.34687c-.2929.29289-.2929.76777 0 1.06066s.7677.29289 1.0606 0l1.3469-1.34687c.2929-.29289.2929-.76777 0-1.06066z"
|
||||
fill="#ff884d" />
|
||||
<path
|
||||
d="m16.4881 10.3333c0-.41417.3358-.74996.75-.74996h1.9048c.4142 0 .75.33579.75.74996 0 .4143-.3358.75-.75.75h-1.9048c-.4142 0-.75-.3357-.75-.75z"
|
||||
fill="#ff884d" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.4 KiB |
@ -0,0 +1 @@
|
||||
<svg fill="none" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><g clip-rule="evenodd" fill-rule="evenodd"><g fill="#45B0E5"><path d="m12.0003 1.25c.4142 0 .75.33579.75.75v20c0 .4142-.3358.75-.75.75s-.75-.3358-.75-.75v-20c0-.41421.3358-.75.75-.75z"/><path d="m8.69303 1.87619c.33138-.24852.80148-.18137 1.05.15l2.25717 3.00953 2.2571-3.00953c.2485-.33137.7186-.39852 1.05-.15.3314.24853.3985.71863.15 1.05l-2.8467 3.79562c-.0237.03322-.0504.06479-.08.09431-.0627.06281-.1346.11257-.2119.14874-.1014.04773-.2103.07099-.3185.0709-.1082.00009-.2171-.02317-.3186-.0709-.0773-.03616-.1492-.08593-.2118-.14874-.0296-.02952-.0563-.06109-.08-.0943l-2.84677-3.79563c-.24852-.33137-.18137-.80147.15-1.05z"/><path d="m8.69303 22.1238c.33138.2485.80148.1814 1.05-.15l2.25717-3.0095 2.2571 3.0095c.2485.3314.7186.3985 1.05.15s.3985-.7186.15-1.05l-2.8467-3.7956c-.0237-.0332-.0504-.0648-.08-.0943-.0627-.0628-.1346-.1126-.2119-.1488-.1014-.0477-.2103-.0709-.3185-.0709s-.2171.0232-.3186.0709c-.0773.0362-.1492.086-.2118.1488-.0296.0295-.0563.0611-.08.0943l-2.84677 3.7956c-.24852.3314-.18137.8015.15 1.05z"/><path d="m2.69035 6.625c.2071-.35872.6658-.48162 1.02451-.27452l17.32054 10.00002c.3587.2071.4816.6658.2745 1.0245s-.6658.4816-1.0245.2745l-17.32054-9.99998c-.35871-.20711-.48162-.6658-.27451-1.02452z"/><path d="m1.57915 9.80218c-.04955-.41124.24366-.78478.6549-.83433l3.7349-.44998-1.47775-3.45951c-.16271-.38091.01418-.82161.39509-.98432.38092-.16272.82162.01418.98433.39509l1.86374 4.36314c.0169.03717.03089.07607.04166.11646.02307.08567.03022.17281.0229.25782-.0094.11175-.0437.21766-.09788.31134-.05404.09376-.12861.17642-.22069.24044-.06996.04884-.149.08622-.23473.10907-.04036.01087-.08104.01821-.12168.02216l-4.71046.56754c-.41124.0495-.78478-.2437-.83433-.65492z"/><path d="m19.1137 19.926c.3809-.1627.5578-.6034.3951-.9843l-1.4777-3.4596 3.7348-.4499c.4113-.0496.7045-.4231.655-.8344-.0496-.4112-.4231-.7044-.8344-.6549l-4.7104.5676c-.0407.0039-.0814.0112-.1217.0221-.0857.0229-.1648.0602-.2347.1091-.0921.064-.1667.1467-.2207.2404-.0542.0937-.0885.1996-.0979.3114-.0073.085-.0002.1721.0229.2578.0108.0404.0247.0793.0416.1164l1.8638 4.3632c.1627.3809.6034.5578.9843.3951z"/><path d="m2.69035 17.375c.2071.3587.6658.4816 1.02451.2745l17.32054-10.00001c.3587-.20711.4816-.6658.2745-1.02452s-.6658-.48163-1.0245-.27452l-17.32054 9.99995c-.35871.2072-.48162.6658-.27451 1.0246z"/><path d="m1.57915 14.1978c-.04955.4113.24366.7848.6549.8344l3.7349.4499-1.47775 3.4595c-.16271.381.01418.8217.39509.9844.38092.1627.82162-.0142.98433-.3951l1.86374-4.3632c.0169-.0371.03089-.076.04166-.1164.02307-.0857.03022-.1728.0229-.2578-.0094-.1118-.0437-.2177-.09788-.3114-.05404-.0938-.12861-.1764-.22069-.2404-.06996-.0489-.149-.0862-.23473-.1091-.04036-.0109-.08104-.0182-.12168-.0222l-4.71046-.5675c-.41124-.0495-.78478.2437-.83433.6549z"/><path d="m19.1137 4.07402c.3809.16271.5578.60341.3951.98433l-1.4777 3.4595 3.7348.44998c.4113.04955.7045.42309.655.83433-.0496.41124-.4231.70444-.8344.65494l-4.7104-.56756c-.0407-.00395-.0814-.01128-.1217-.02215-.0857-.02286-.1648-.06024-.2347-.10908-.0921-.06402-.1667-.14667-.2207-.24044-.0542-.09368-.0885-.19959-.0979-.31134-.0073-.08501-.0002-.17215.0229-.25782.0108-.04038.0247-.07928.0416-.11645l1.8638-4.36314c.1627-.38092.6034-.55781.9843-.3951z"/></g><path d="m12 1.25v21.5c-.4141-.0002-.7497-.3359-.7497-.75v-2.0358l-1.50726 2.0096c-.24853.3314-.71863.3985-1.05.15s-.39853-.7186-.15-1.05l2.70726-3.6096v-4.1653l-3.60728 2.0827-1.7724 4.1493c-.16271.3809-.60341.5578-.98433.3951-.38091-.1627-.5578-.6034-.39509-.9844l.98676-2.31-1.76308 1.0179c-.35872.2071-.81741.0842-1.02452-.2745-.20711-.3588-.0842-.8174.27452-1.0245l1.76296-1.0179-2.49378-.3004c-.41124-.0496-.70445-.4231-.65491-.8344.04955-.4112.42309-.7044.83433-.6549l4.47943.5397 3.60719-2.0826-3.60715-2.08261-4.47947.53971c-.41124.0495-.78478-.2437-.83433-.65493-.04954-.41124.24367-.78478.65491-.83432l2.49383-.30046-1.76301-1.01787c-.35872-.20711-.48163-.6658-.27452-1.02452s.6658-.48163 1.02452-.27452l1.76306 1.0179-.98674-2.31002c-.16271-.38092.01418-.82161.39509-.98432.38092-.16272.82162.01417.98433.39509l1.77238 4.14925 3.6073 2.08262v-4.16515l-2.70726-3.60965c-.24853-.33137-.18137-.80148.15-1.05.33137-.24853.80147-.18137 1.05.15l1.50726 2.00965v-2.03585c0-.41411.3356-.74984.7497-.75z" fill="#45b0e5"/></g></svg>
|
||||
|
After Width: | Height: | Size: 4.3 KiB |
@ -0,0 +1 @@
|
||||
<svg fill="none" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><g clip-rule="evenodd" fill-rule="evenodd"><path d="m7.39024 1.73781c-2.03065 0-3.67683 1.64617-3.67683 3.67683v8.60306c-.90458.9259-1.46341 2.1941-1.46341 3.5921 0 2.8388 2.30137 5.1402 5.14024 5.1402 2.83886 0 5.14026-2.3014 5.14026-5.1402 0-1.398-.5588-2.6662-1.4634-3.5921v-8.60306c0-2.03066-1.6462-3.67683-3.67686-3.67683z" fill="#cfd8dc"/><path d="m7.5 1.73942v21.00948c-.03649.0007-.07308.0011-.10976.0011-2.83887 0-5.14024-2.3014-5.14024-5.1402 0-1.398.55883-2.6662 1.46341-3.5921v-8.60306c0-2.03066 1.64618-3.67683 3.67683-3.67683.03672 0 .07331.00054.10976.00161z" fill="#cfd8dc"/><path d="m7.39018 14.9085c-1.49184 0-2.70122 1.2094-2.70122 2.7013 0 1.4918 1.20938 2.7012 2.70122 2.7012 1.49185 0 2.70122-1.2094 2.70122-2.7012 0-1.4919-1.20937-2.7013-2.70122-2.7013z" fill="#ee4d4d"/><path d="m7.5 14.9107v5.3981c-.03642.0014-.07303.0022-.10982.0022-1.49184 0-2.70122-1.2094-2.70122-2.7012 0-1.4919 1.20938-2.7013 2.70122-2.7013.03679 0 .0734.0008.10982.0022z" fill="#d64545"/><path d="m15.1954 5.64024c-1.4919 0-2.7013 1.20938-2.7013 2.70122 0 1.49185 1.2094 2.70124 2.7013 2.70124 1.4918 0 2.7012-1.20939 2.7012-2.70124 0-1.49184-1.2094-2.70122-2.7012-2.70122z" fill="#E5B045"/><path d="m17.892 8.5h-5.3933c.0821 1.41805 1.258 2.5427 2.6967 2.5427 1.4386 0 2.6145-1.12465 2.6966-2.5427z" fill="#e5b045"/><path d="m15.1951 1.25c.4142 0 .75.33579.75.75v1.95122c0 .41421-.3358.75-.75.75s-.75-.33579-.75-.75v-1.95122c0-.41421.3358-.75.75-.75z" fill="#ff884d"/><path d="m15.1951 11.9817c.4142 0 .75.3358.75.75v1.9512c0 .4142-.3358.75-.75.75s-.75-.3358-.75-.75v-1.9512c0-.4142.3358-.75.75-.75z" fill="#e57a45"/><path d="m17.7693 10.9155c.2929-.2929.7678-.2929 1.0607 0l1.3797 1.3797c.2929.2929.2929.7678 0 1.0607s-.7678.2929-1.0607 0l-1.3797-1.3797c-.2929-.2929-.2929-.7678 0-1.0607z" fill="#e57a45"/><path d="m20.2095 3.32705c-.2929-.2929-.7677-.2929-1.0606 0l-1.3797 1.37972c-.2929.29289-.2929.76776 0 1.06066.2929.29289.7677.29289 1.0606 0l1.3797-1.37972c.2929-.2929.2929-.76777 0-1.06066z" fill="#ff884d"/><path d="m18.8354 8.34146c0-.41421.3357-.75.75-.75h1.9512c.4142 0 .75.33579.75.75s-.3358.75-.75.75h-1.9512c-.4143 0-.75-.33579-.75-.75z" fill="#ff884d"/><path d="m22.2698 8.5c-.0727.33807-.3734.59146-.7332.59146h-1.9512c-.3598 0-.6605-.25339-.7332-.59146z" fill="#e57a45"/></g></svg>
|
||||
|
After Width: | Height: | Size: 2.3 KiB |
@ -0,0 +1 @@
|
||||
<svg height="512" viewBox="0 0 64 64" width="512" xmlns="http://www.w3.org/2000/svg"><g id="Ka_bah" data-name="Ka'bah"><path d="m57 12v39l-25 8-25-8v-39l25-7z" fill="#1a1a1a"/><path d="m7 12 25-7 25 7-25 8z" fill="#4d4d4d"/><path d="m32 20-18.33-5.87 18.33-5.13 18.33 5.13z" fill="#333"/><path d="m57 12v39l-12 3.84-9 2.88-4 1.28v-39z"/><path d="m45 38v16.84l-7.83 2.51-1.17.37v-16.72z" fill="#f8be31"/><path d="m36 29.62-4 1.28-4-1.28v4l4 1.28 4-1.28z" fill="#fbd63b"/><path d="m36 29.62-4 1.28v4l4-1.28z" fill="#f8be31"/><path d="m42 27.75-2 2.25 2 2 2-2z" fill="#f8be31"/><path d="m22 27.75-2 2.25 2 2 2-2z" fill="#fbd63b"/><path d="m54 23.86v4l-6 1.92v-4z" fill="#f8be31"/><path d="m10 23.86v4l6 1.92v-4z" fill="#fbd63b"/><path d="m57 14.9v4l-25 8-25-8v-4l25 8z" fill="#fbd63b"/><path d="m57 19-25 8v-4.1l25-7.9z" fill="#f8be31"/><path d="m45 38v16.84l-7.83 2.51a15.3966 15.3966 0 0 0 4.83-4.67 15.5638 15.5638 0 0 0 2.56-7.61z" fill="#f7a62b"/></g></svg>
|
||||
|
After Width: | Height: | Size: 959 B |
@ -0,0 +1 @@
|
||||
<svg fill="none" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><g clip-rule="evenodd" fill-rule="evenodd"><path d="m11.1071 1.25c-3.37334 0-6.18133 2.53144-6.39203 5.78536-1.68658.32932-2.98888 1.76608-2.98888 3.53604 0 2.0208 1.69742 3.6072 3.72619 3.6072h1.78571 10.11901c.5479 0 1.0705-.1149 1.5419-.3225 1.956-.7122 3.3748-2.5408 3.3748-4.71324 0-2.80971-2.3637-5.03572-5.2143-5.03572-.1799 0-.358.00883-.5336.0261-1.1383-1.73901-3.1458-2.88324-5.4188-2.88324z" fill="#cfd8dc"/><path d="m12 1.30962v12.86898h-4.76191-1.78571c-2.02877 0-3.72619-1.5864-3.72619-3.6072 0-1.76996 1.3023-3.20672 2.98888-3.53604.2107-3.25392 3.01869-5.78536 6.39203-5.78536.3028 0 .6009.02031.8929.05962z" fill="#cfd8dc"/><path d="m7.57334 15.1387c.37049.1853.52065.6358.33541 1.0063l-1.42857 2.8571c-.18524.3705-.63575.5207-1.00623.3354-.37048-.1852-.52065-.6357-.33541-1.0062l1.42857-2.8572c.18524-.3704.63575-.5206 1.00623-.3354z" fill="#45b0e5"/><path d="m12.3356 15.1387c.3705.1853.5207.6358.3354 1.0063l-1.4285 2.8571c-.1853.3705-.6358.5207-1.0063.3354-.37044-.1852-.52061-.6357-.33537-1.0062l1.42857-2.8572c.1852-.3704.6357-.5206 1.0062-.3354z" fill="#4dc4ff"/><path d="m17.0975 15.1387c.3704.1853.5206.6358.3354 1.0063l-1.4286 2.8571c-.1853.3705-.6358.5207-1.0062.3354-.3705-.1852-.5207-.6357-.3355-1.0062l1.4286-2.8572c.1853-.3704.6358-.5206 1.0063-.3354z" fill="#4dc4ff"/><path d="m8.52609 18.472c.37048.1853.52065.6358.33541 1.0062l-1.42858 2.8572c-.18524.3705-.63574.5206-1.00623.3354-.37048-.1852-.52065-.6357-.33541-1.0062l1.42858-2.8572c.18524-.3705.63574-.5206 1.00623-.3354z" fill="#45b0e5"/><path d="m13.2879 18.472c.3705.1853.5207.6358.3354 1.0062l-1.4286 2.8572c-.1852.3705-.6357.5206-1.0062.3354s-.5206-.6357-.3354-1.0062l1.4286-2.8572c.1852-.3705.6357-.5206 1.0062-.3354z" fill="#4dc4ff"/><path d="m12 19.3708v3.209c-.2218.1819-.5384.2276-.8115.091-.3705-.1852-.5206-.6357-.3354-1.0062zm0-4.3114v2.4277l-.7575 1.515c-.1853.3705-.6358.5207-1.0063.3354-.37044-.1852-.52061-.6357-.33537-1.0062l1.42857-2.8572c.1313-.2625.3958-.4144.6706-.4147z" fill="#45b0e5"/><path d="m18.0497 18.472c.3705.1853.5207.6358.3354 1.0062l-1.4285 2.8572c-.1853.3705-.6358.5206-1.0063.3354s-.5206-.6357-.3354-1.0062l1.4286-2.8572c.1852-.3705.6357-.5206 1.0062-.3354z" fill="#4dc4ff"/></g></svg>
|
||||
|
After Width: | Height: | Size: 2.3 KiB |
@ -0,0 +1 @@
|
||||
<svg fill="none" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><g clip-rule="evenodd" fill-rule="evenodd"><path d="m12 1.25c.4142 0 .75.33579.75.75v4.54545c0 .41422-.3358.75-.75.75s-.75-.33578-.75-.75v-4.54545c0-.41421.3358-.75.75-.75z" fill="#ff884d"/><path d="m12 16.7046c.4142 0 .75.3357.75.75v4.5454c0 .4142-.3358.75-.75.75s-.75-.3358-.75-.75v-4.5454c0-.4143.3358-.75.75-.75z" fill="#ff884d"/><g fill="#e57a45"><path d="m12 1.25c-.4142 0-.75.33579-.75.75v4.27273c0 .41421.3358.75.75.75z"/><path d="m12 16.9773c-.4142 0-.75.3358-.75.75v4.2727c0 .4142.3358.75.75.75z"/><path d="m4.39843 4.39859c.2929-.29289.76777-.29289 1.06066 0l3.21413 3.21413c.29289.29289.29289.76776 0 1.06066-.2929.29289-.76777.29289-1.06066 0l-3.21413-3.21413c-.29289-.29289-.29289-.76776 0-1.06066z"/></g><path d="m15.3266 15.3266c.2929-.2929.7678-.2929 1.0607 0l3.2141 3.2141c.2929.2929.2929.7678 0 1.0607-.2929.2928-.7678.2928-1.0607 0l-3.2141-3.2142c-.2929-.2929-.2929-.7677 0-1.0606z" fill="#ff884d"/><path d="m19.6011 4.39859c-.2929-.29289-.7678-.29289-1.0607 0l-3.2141 3.21413c-.2929.29289-.2929.76776 0 1.06066.2929.29289.7678.29289 1.0607 0l3.2141-3.21413c.2929-.29289.2929-.76776 0-1.06066z" fill="#ff884d"/><path d="m8.67337 15.3266c-.29289-.2929-.76776-.2929-1.06066 0l-3.21412 3.2141c-.29289.2929-.29289.7678 0 1.0607.2929.2928.76777.2928 1.06066 0l3.21412-3.2142c.2929-.2929.2929-.7677 0-1.0606z" fill="#e57a45"/><path d="m1.25 12c0-.4142.33579-.75.75-.75h4.54545c.41422 0 .75.3358.75.75s-.33578.75-.75.75h-4.54545c-.41421 0-.75-.3358-.75-.75z" fill="#e57a45"/><path d="m16.7043 12c0-.4142.3358-.75.75-.75h4.5455c.4142 0 .75.3358.75.75s-.3358.75-.75.75h-4.5455c-.4142 0-.75-.3358-.75-.75z" fill="#ff884d"/><path d="m12.0004 5.79544c-3.42663 0-6.2045 2.77787-6.2045 6.20456 0 3.4267 2.77787 6.2045 6.2045 6.2045 3.4267 0 6.2046-2.7778 6.2046-6.2045 0-3.42669-2.7779-6.20456-6.2046-6.20456z" fill="#E5B045"/><path d="m12 5.79547v12.40913c-3.42672 0-6.20459-2.7779-6.20459-6.2046 0-3.42666 2.77787-6.20453 6.20459-6.20453z" fill="#e5b045"/></g></svg>
|
||||
|
After Width: | Height: | Size: 2.0 KiB |
@ -0,0 +1 @@
|
||||
<svg fill="none" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><g clip-rule="evenodd" fill-rule="evenodd"><path d="m10.5714 5.7738c-2.78119 0-5.03576 2.25457-5.03576 5.0357 0 .8311.20189 1.6171.55995 2.3098.12879.2491.3858.4056.66624.4056h8.09527c.4142 0 .75-.3358.75-.75v-1.4892-.4762c0-2.78113-2.2546-5.0357-5.0357-5.0357z" fill="#E5B045"/><path d="m10.5 5.77429v7.22571h-4.46407c-.32074-.6631-.50029-1.4068-.50029-2.1905 0-2.75731 2.21611-4.99704 4.96436-5.03521z" fill="#e5b045"/><path d="m11.5831 9.58331c-3.37338 0-6.18137 2.53149-6.39207 5.78539-1.68658.3293-2.98888 1.7661-2.98888 3.536 0 2.0208 1.69742 3.6072 3.72619 3.6072h1.78571 10.11905c.5478 0 1.0705-.1149 1.5418-.3225 1.9561-.7122 3.3749-2.5408 3.3749-4.7132 0-2.8097-2.3637-5.0357-5.2143-5.0357-.18 0-.358.0088-.5336.0261-1.1384-1.7391-3.1458-2.88329-5.4188-2.88329z" fill="#cfd8dc"/><path d="m12 9.59621v12.91569h-4.28595-1.78571c-2.02877 0-3.72619-1.5864-3.72619-3.6072 0-1.7699 1.3023-3.2067 2.98888-3.536.2107-3.2539 3.01869-5.78539 6.39207-5.78539.14 0 .279.00435.4169.0129z" fill="#cfd8dc"/><path d="m10.5714 1.4881c.4142 0 .75.33578.75.75v1.90476c0 .41421-.3358.75-.75.75s-.74997-.33579-.74997-.75v-1.90476c0-.41422.33577-.75.74997-.75z" fill="#ff884d"/><g fill="#e57a45"><path d="m10.5 1.49146v3.39805c-.3807-.03596-.67859-.35652-.67859-.74665v-1.90476c0-.39013.29789-.71068.67859-.74664z"/><path d="m1.25 10.3333c0-.41417.33579-.74996.75-.74996h1.90476c.41422 0 .75.33579.75.74996 0 .4143-.33578.75-.75.75h-1.90476c-.41421 0-.75-.3357-.75-.75z"/><path d="m3.85063 4.08872c.29289-.29289.76776-.29289 1.06066 0l1.34687 1.34687c.29289.29289.29289.76777 0 1.06066-.2929.29289-.76777.29289-1.06066 0l-1.34687-1.34687c-.2929-.29289-.2929-.76777 0-1.06066z"/></g><path d="m17.2104 4.08872c-.2929-.29289-.7678-.29289-1.0607 0l-1.3468 1.34687c-.2929.29289-.2929.76777 0 1.06066s.7677.29289 1.0606 0l1.3469-1.34687c.2929-.29289.2929-.76777 0-1.06066z" fill="#ff884d"/><path d="m16.4881 10.3333c0-.41417.3358-.74996.75-.74996h1.9048c.4142 0 .75.33579.75.74996 0 .4143-.3358.75-.75.75h-1.9048c-.4142 0-.75-.3357-.75-.75z" fill="#ff884d"/></g></svg>
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
@ -0,0 +1 @@
|
||||
<svg fill="none" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><g clip-rule="evenodd" fill-rule="evenodd"><path d="m14.1957 16.8961c-.394 0-.7135.3194-.7135.7134 0 .3941.3195.7135.7135.7135h7.3174c.4143 0 .75.3358.75.75s-.3357.75-.75.75h-7.3174c-1.2225 0-2.2135-.991-2.2135-2.2135 0-1.2224.991-2.2134 2.2135-2.2134h.4878c.4143 0 .75.3357.75.75 0 .4142-.3357.75-.75.75z" fill="#8b98a6"/><path d="m17.6105 21.25c-.394 0-.7135-.3194-.7135-.7135 0-.394.3195-.7135.7135-.7135h4.3905c.4142 0 .75-.3358.75-.75s-.3358-.75-.75-.75h-4.3905c-1.2225 0-2.2135.991-2.2135 2.2135s.991 2.2135 2.2135 2.2135h.4878c.4143 0 .75-.3358.75-.75s-.3357-.75-.75-.75z" fill="#8b98a6"/><path d="m12 17.8913v-.5635c.1384-1.0894 1.0687-1.9317 2.1957-1.9317h.4879c.4142 0 .75.3357.75.75 0 .4142-.3358.75-.75.75h-.4879c-.394 0-.7135.3194-.7135.7134 0 .3941.3195.7135.7135.7135h3.4119.0029 1.3895v1.5h-1.3911c-.3933.0009-.7119.32-.7119.7135 0 .3941.3195.7135.7135.7135h.4878c.4143 0 .75.3358.75.75s-.3357.75-.75.75h-.4878c-1.2225 0-2.2135-.991-2.2135-2.2135 0-.2496.0414-.4896.1175-.7135h-1.3188c-1.127 0-2.0573-.8423-2.1957-1.9317z" fill="#7d8995"/><path d="m3.70066 15.9224c.39295.131.60532.5557.47434.9487l-.97566 2.9269c-.13098.393-.55572.6054-.94868.4744s-.60533-.5558-.47434-.9487l.97565-2.927c.13099-.3929.55573-.6053.94869-.4743z" fill="#45b0e5"/><path d="m7.11546 15.9224c.39296.131.60533.5557.47434.9487l-.97566 2.9269c-.13098.393-.55572.6054-.94868.4744s-.60533-.5558-.47434-.9487l.97566-2.927c.13098-.3929.55572-.6053.94868-.4743z" fill="#4dc4ff"/><path d="m6.5 15.9863v4.0284c-.1889.2487-.52178.3619-.83452.2577-.39296-.131-.60533-.5558-.47434-.9487l.97565-2.927c.05995-.1798.18142-.3218.33321-.4104z" fill="#45b0e5"/><path d="m10.5303 15.9224c.3929.131.6053.5557.4743.9487l-.9757 2.9269c-.13094.393-.55568.6054-.94864.4744s-.60533-.5558-.47434-.9487l.97565-2.927c.13099-.3929.55573-.6053.94873-.4743z" fill="#4dc4ff"/><path d="m16.6342 1.24902c-3.647.00029-6.6034 2.95687-6.6034 6.60395 0 .18488.0076.36815.0225.54949.0094.11306.0442.22252.102.32016l2.5968 4.39048c.0575.0972.1363.1802.2303.2427 1.0464.6957 2.3032 1.1011 3.6523 1.1011 2.7484 0 5.103-1.6787 6.0976-4.0639.1243-.2981.0438-.64238-.1999-.85442-.2437-.21205-.5958-.24423-.8739-.07988-.614.36283-1.3299.5712-2.0968.5712-.1399 0-.2779-.0069-.4137-.0204-2.0854-.20702-3.7146-1.96764-3.7146-4.10785 0-1.34996.6472-2.54855 1.6513-3.30301.258-.19384.3631-.53101.2609-.83712s-.3887-.51252-.7114-.5125z" fill="#E5B045"/><path d="m16.3634 8.5h-6.2928c.0173.07382.0458.14481.0846.21044l2.5969 4.39046c.0575.0972.1362.1802.2303.2427 1.0464.6958 2.3031 1.1011 3.6523 1.1011 2.7484 0 5.103-1.6787 6.0975-4.0638.1244-.2982.0438-.64245-.1999-.8545-.2437-.21204-.5958-.24422-.8739-.07987-.6139.36282-1.3298.57127-2.0967.57127-.1399 0-.2779-.007-.4138-.02045-1.1205-.11126-2.1094-.67109-2.7845-1.49735z" fill="#e5b045"/><path d="m7.30514 6.1273c-2.11887 0-3.94284 1.49742-4.19586 3.51307-1.04955.29212-1.85928 1.20703-1.85928 2.35913 0 1.4051 1.2044 2.4574 2.57936 2.4574h1.09761 6.21983c.371 0 .7265-.075 1.0487-.2116 1.2952-.4623 2.2624-1.6542 2.2624-3.0995 0-1.87656-1.6139-3.3111-3.494-3.3111-.0636 0-.1268.00162-.1897.00481-.77-1.0448-2.04614-1.71221-3.46906-1.71221z" fill="#cfd8dc"/><path d="m8 6.16899v8.27571h-3.07303-1.09761c-1.37496 0-2.57936-1.0523-2.57936-2.4574 0-1.152.80973-2.06697 1.85928-2.35909.25302-2.01565 2.07699-3.51307 4.19586-3.51307.23621 0 .46838.0184.69486.05385z" fill="#cfd8dc"/></g></svg>
|
||||
|
After Width: | Height: | Size: 3.4 KiB |
@ -0,0 +1,6 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="28.704" height="36.818" viewBox="0 0 28.704 36.818">
|
||||
<g id="doctor_10_" data-name="doctor (10)" transform="translate(-5.291)">
|
||||
<path id="Path_5102" data-name="Path 5102" d="M21.572,0a8,8,0,1,0,7.994,8A8,8,0,0,0,21.572,0Z" transform="translate(-1.931)" fill="#52964f"/>
|
||||
<path id="Path_5103" data-name="Path 5103" d="M25.819,23.474a17.6,17.6,0,0,1,.584,4.767c1.176,1.042,4.261,4.115,3.59,7.147a3.551,3.551,0,0,1-2.485,2.52.767.767,0,0,1-.5-1.452,2.072,2.072,0,0,0,1.477-1.362c.459-2.079-1.842-4.6-3.122-5.726-1.531.743-4.426,2.567-4.538,4.654a2.057,2.057,0,0,0,1.055,1.742.767.767,0,1,1-.863,1.269A3.545,3.545,0,0,1,19.3,33.9c.174-3.241,4.41-5.449,5.592-6a20.9,20.9,0,0,0-.759-4.869.855.855,0,0,1-.008-.125,13.292,13.292,0,0,0-3.5-.48H18.657a13.318,13.318,0,0,0-3.9.585.7.7,0,0,1-.043.164,33.366,33.366,0,0,0-2.471,8.754,3.142,3.142,0,1,1-1.546-.035,37.409,37.409,0,0,1,2.081-8.085A13.373,13.373,0,0,0,5.291,35.793v5.482a.766.766,0,0,0,.767.767h27.17A.776.776,0,0,0,34,41.264V35.793a13.392,13.392,0,0,0-8.177-12.319Z" transform="translate(0 -5.223)" fill="#52964f"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
@ -0,0 +1,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="36.818" height="36.818" viewBox="0 0 36.818 36.818">
|
||||
<g id="_x30_6" transform="translate(-2 -2)">
|
||||
<path id="Path_5097" data-name="Path 5097" d="M7.26,16.753a3.945,3.945,0,1,1,5.26,0v3.389c4.5-.973,5.26-4.465,5.26-6.683C17.779,8.9,14.633,2,9.89,2S2,8.9,2,13.459c0,2.218.761,5.71,5.26,6.683Z" transform="translate(0 0)" fill="#3c86d0"/>
|
||||
<path id="Path_5098" data-name="Path 5098" d="M19.149,31.354a2.63,2.63,0,1,0-2.264-3.945H12.575a2.632,2.632,0,0,1-2.63-2.63V23.464a1.315,1.315,0,0,0,1.315-1.315V19.52A1.315,1.315,0,0,0,9.945,18.2V14.26a1.267,1.267,0,0,0-.067-.33,2.63,2.63,0,1,0-2.5,0,1.267,1.267,0,0,0-.067.33V18.2A1.315,1.315,0,0,0,6,19.52v2.63a1.315,1.315,0,0,0,1.315,1.315v1.315a5.266,5.266,0,0,0,5.26,5.26h4.311A2.621,2.621,0,0,0,19.149,31.354Z" transform="translate(1.26 2.205)" fill="#3c86d0"/>
|
||||
<path id="Path_5099" data-name="Path 5099" d="M31.409,18H16.945A3.949,3.949,0,0,0,13,21.945V23.26h1.026a3.945,3.945,0,1,1,0,5.26H13v1.315a3.949,3.949,0,0,0,3.945,3.945H31.409a3.949,3.949,0,0,0,3.945-3.945v-7.89A3.949,3.949,0,0,0,31.409,18Zm-5.26,10.52a2.63,2.63,0,1,1,2.63-2.63A2.632,2.632,0,0,1,26.149,28.52Zm5.26-.657a.657.657,0,0,1-1.315,0V23.917a.657.657,0,0,1,1.315,0Zm2.63,0a.657.657,0,0,1-1.315,0V23.917a.657.657,0,1,1,1.315,0Z" transform="translate(3.464 5.039)" fill="#3c86d0"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
@ -0,0 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="34.908" height="36.818" viewBox="0 0 34.908 36.818">
|
||||
<path id="blood-test" d="M33.07,14.711H24.688v3.537H26.1a.522.522,0,0,1,0,1.043H24.688v2.618H27.95a.522.522,0,0,1,0,1.043H24.688V25.57H26.1a.522.522,0,0,1,0,1.043H24.688V30.6h4.62a10.235,10.235,0,0,0,4.806,5.97v4.011a5.235,5.235,0,0,1-10.47,0V14.7a2.079,2.079,0,0,1-1.829-2.06V11.075A2.078,2.078,0,0,1,23.89,9h9.978a2.078,2.078,0,0,1,2.075,2.075v1.562a2.079,2.079,0,0,1-1.829,2.06v4.042a10.224,10.224,0,0,0-1.043.669v-4.7ZM46.976,36.933l1.384-1.384a1.179,1.179,0,0,1,1.662,0l6.359,6.359a1.179,1.179,0,0,1,0,1.662L55,44.954a1.179,1.179,0,0,1-1.662,0l-6.359-6.359a1.179,1.179,0,0,1,0-1.662ZM39.082,21.193a6.463,6.463,0,1,0,6.463,6.463,6.463,6.463,0,0,0-6.463-6.463Zm1.5,9.109a2.125,2.125,0,0,1-3,0c-.824-.824-.609-2.474,0-3.468l1.5-2.442,1.5,2.442c.609.993.824,2.644,0,3.468Zm7.666-2.646a9.163,9.163,0,1,0-3.653,7.322l1.446,1.446a2.223,2.223,0,0,1,.2-.228l1.384-1.384a2.213,2.213,0,0,1,.228-.2L46.4,33.167a9.123,9.123,0,0,0,1.842-5.511Zm-9.164,7.506a7.506,7.506,0,1,1,7.506-7.506,7.506,7.506,0,0,1-7.506,7.506Z" transform="translate(-21.815 -9)" fill="#c99609" fill-rule="evenodd"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
@ -0,0 +1,6 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="36.819" height="36.819" viewBox="0 0 36.819 36.819">
|
||||
<g id="syringe_3_" data-name="syringe (3)" transform="translate(0.002 0)">
|
||||
<path id="Path_5100" data-name="Path 5100" d="M20.326,80.649A1.079,1.079,0,1,0,18.8,82.175l1.548,1.548L17.83,86.241l1.733,1.733A1.079,1.079,0,1,1,18.038,89.5L16.3,87.767l-2.518,2.518,1.733,1.733a1.079,1.079,0,1,1-1.525,1.525l-1.733-1.733L9.743,94.329l1.733,1.733A1.079,1.079,0,0,1,9.95,97.588L8.217,95.854,6.768,97.3a3.367,3.367,0,0,0-.993,2.4v4.373L.314,109.534A1.079,1.079,0,0,0,1.84,111.06L7.3,105.6h4.373a3.368,3.368,0,0,0,2.4-.993l13.58-13.581L29.2,92.573a1.079,1.079,0,0,0,1.525-1.525Z" transform="translate(0 -74.556)" fill="#ea2864"/>
|
||||
<path id="Path_5101" data-name="Path 5101" d="M375.793,7.669,368.441.316a1.079,1.079,0,1,0-1.526,1.525l2.914,2.914L365.58,9l1.525,1.525,4.249-4.249,2.914,2.914a1.079,1.079,0,0,0,1.526-1.526Z" transform="translate(-339.292 0)" fill="#ea2864"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 985 B |
@ -0,0 +1,8 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="58" height="36.818" viewBox="0 0 58 36.818">
|
||||
<g id="heart-rate" transform="translate(-6.46 -15.787)">
|
||||
<path id="Path_5093" data-name="Path 5093" d="M45.091,35.4,39.9,28.233l-5.416,6.781a2.626,2.626,0,0,1-3.743.364l-4.858-4.1L23.814,35.64a4.3,4.3,0,0,1-3.869,2.446H19.16l12.88,12.88L46.422,36.584A4.254,4.254,0,0,1,45.091,35.4Z" transform="translate(1.694 1.639)" fill="#d02127"/>
|
||||
<path id="Path_5094" data-name="Path 5094" d="M23.617,31.245A3.427,3.427,0,0,1,28.93,30.1l4.255,3.6,4.927-6.167a3.427,3.427,0,0,1,5.462.125l5.518,7.623h1.183a11.817,11.817,0,0,0-17.352-16.02A11.819,11.819,0,0,0,16.21,35.966l.228.228h4.824Z" transform="translate(0.866 0)" fill="#d02127"/>
|
||||
<path id="Path_5095" data-name="Path 5095" d="M8.258,33.723a1.8,1.8,0,0,0,0,3.607H20.91L17.3,33.723Z" transform="translate(0 2.425)" fill="#d02127"/>
|
||||
<path id="Path_5096" data-name="Path 5096" d="M57.729,32.913H46.09l-2.97,3.027a4.208,4.208,0,0,0,2.128.58H57.729a1.8,1.8,0,0,0,0-3.607Z" transform="translate(4.933 2.316)" fill="#d02127"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
@ -1,9 +0,0 @@
|
||||
|
||||
class BaseService {
|
||||
String error;
|
||||
bool hasError = false;
|
||||
|
||||
|
||||
BaseService() {
|
||||
}
|
||||
}
|
||||
@ -1,50 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import 'base_view_model.dart';
|
||||
import 'locater.dart';
|
||||
|
||||
class BaseView<T extends BaseViewModel> extends StatefulWidget {
|
||||
final Widget Function(BuildContext context, T model, Widget child) builder;
|
||||
final Function(T) onModelReady;
|
||||
|
||||
BaseView({
|
||||
this.builder,
|
||||
this.onModelReady,
|
||||
});
|
||||
|
||||
@override
|
||||
_BaseViewState<T> createState() => _BaseViewState<T>();
|
||||
}
|
||||
|
||||
class _BaseViewState<T extends BaseViewModel> extends State<BaseView<T>> {
|
||||
T model = locator<T>();
|
||||
|
||||
bool isLogin = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
if (widget.onModelReady != null) {
|
||||
widget.onModelReady(model);
|
||||
}
|
||||
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return ChangeNotifierProvider<T>.value(
|
||||
value: model,
|
||||
child: Consumer<T>(builder: widget.builder),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
if (model != null) {
|
||||
model = null;
|
||||
}
|
||||
|
||||
super.dispose();
|
||||
}
|
||||
}
|
||||
@ -1,40 +0,0 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:connectivity/connectivity.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:queuing_system/core/base/view_state.dart';
|
||||
|
||||
class BaseViewModel extends ChangeNotifier {
|
||||
|
||||
ViewState _state = ViewState.Idle;
|
||||
bool isInternetConnection = true;
|
||||
StreamSubscription subscription;
|
||||
|
||||
ViewState get state => _state;
|
||||
|
||||
String error = "";
|
||||
void setState(ViewState viewState) {
|
||||
_state = viewState;
|
||||
|
||||
notifyListeners();
|
||||
}
|
||||
BaseViewModel(){
|
||||
subscription = Connectivity()
|
||||
.onConnectivityChanged
|
||||
.listen((ConnectivityResult result) {
|
||||
switch (result) {
|
||||
case ConnectivityResult.wifi:
|
||||
isInternetConnection = true;
|
||||
break;
|
||||
case ConnectivityResult.mobile:
|
||||
isInternetConnection = true;
|
||||
break;
|
||||
case ConnectivityResult.none:
|
||||
isInternetConnection = false;
|
||||
break;
|
||||
}
|
||||
notifyListeners();
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,11 +0,0 @@
|
||||
import 'package:get_it/get_it.dart';
|
||||
|
||||
GetIt locator = GetIt.instance;
|
||||
|
||||
///di
|
||||
void setupLocator() {
|
||||
/// Services
|
||||
|
||||
/// View Model
|
||||
|
||||
}
|
||||
@ -1,40 +0,0 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:queuing_system/core/base/view_state.dart';
|
||||
import 'package:queuing_system/widget/app_loader_widget.dart';
|
||||
import 'package:queuing_system/widget/errors/error_message.dart';
|
||||
|
||||
import 'base_view_model.dart';
|
||||
|
||||
class NetworkBaseView extends StatelessWidget {
|
||||
final BaseViewModel baseViewModel;
|
||||
final Widget child;
|
||||
|
||||
NetworkBaseView({Key key, this.baseViewModel, this.child});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
color: Colors.grey[100],
|
||||
child: buildBaseViewWidget(),
|
||||
);
|
||||
}
|
||||
|
||||
buildBaseViewWidget() {
|
||||
switch (baseViewModel.state) {
|
||||
case ViewState.ErrorLocal:
|
||||
case ViewState.Idle:
|
||||
case ViewState.BusyLocal:
|
||||
return child;
|
||||
break;
|
||||
case ViewState.Busy:
|
||||
return AppLoaderWidget();
|
||||
break;
|
||||
case ViewState.Error:
|
||||
return ErrorMessage(
|
||||
error: baseViewModel.error,
|
||||
);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,51 +0,0 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:connectivity/connectivity.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:queuing_system/core/base/base_app_client.dart';
|
||||
|
||||
|
||||
class ProjectViewModel with ChangeNotifier {
|
||||
Locale _appLocale;
|
||||
String currentLanguage = 'ar';
|
||||
bool _isArabic = false;
|
||||
bool isInternetConnection = true;
|
||||
bool isLoading = false;
|
||||
bool isError = false;
|
||||
String error = '';
|
||||
BaseAppClient baseAppClient = BaseAppClient();
|
||||
|
||||
Locale get appLocal => _appLocale;
|
||||
|
||||
bool get isArabic => _isArabic;
|
||||
StreamSubscription subscription;
|
||||
|
||||
ProjectViewModel() {
|
||||
|
||||
subscription = Connectivity()
|
||||
.onConnectivityChanged
|
||||
.listen((ConnectivityResult result) {
|
||||
switch (result) {
|
||||
case ConnectivityResult.wifi:
|
||||
isInternetConnection = true;
|
||||
break;
|
||||
case ConnectivityResult.mobile:
|
||||
isInternetConnection = true;
|
||||
break;
|
||||
case ConnectivityResult.none:
|
||||
isInternetConnection = false;
|
||||
break;
|
||||
}
|
||||
notifyListeners();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
if (subscription != null) subscription.cancel();
|
||||
super.dispose();
|
||||
}
|
||||
}
|
||||
@ -1 +0,0 @@
|
||||
enum ViewState { Idle, Busy, Error, BusyLocal, ErrorLocal }
|
||||
@ -1,16 +0,0 @@
|
||||
const TOKEN = 'token';
|
||||
const PROJECT_ID = 'projectID';
|
||||
const VIDA_AUTH_TOKEN_ID = 'VidaAuthTokenID';
|
||||
const VIDA_REFRESH_TOKEN_ID = 'VidaRefreshTokenID';
|
||||
const LOGIN_TOKEN_ID = 'LogInToken';
|
||||
const DOCTOR_ID = 'doctorID';
|
||||
const SLECTED_PATIENT_TYPE = 'slectedPatientType';
|
||||
const APP_Language = 'language';
|
||||
const DOCTOR_PROFILE = 'doctorProfile';
|
||||
const LIVE_CARE_PATIENT = 'livecare-patient-profile';
|
||||
const LOGGED_IN_USER = 'loggedUser';
|
||||
const EMPLOYEE_ID = 'EmployeeID';
|
||||
const DASHBOARD_DATA = 'dashboard-data';
|
||||
const OTP_TYPE = 'otp-type';
|
||||
const LAST_LOGIN_USER = 'last-login-user';
|
||||
const CLINIC_NAME = 'clinic-name';
|
||||
@ -1,101 +0,0 @@
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:queuing_system/utils/call_type.dart';
|
||||
|
||||
class Tickets {
|
||||
int id;
|
||||
int patientID;
|
||||
String mobileNo;
|
||||
String doctorName;
|
||||
String doctorNameN;
|
||||
int patientGender;
|
||||
int callType;
|
||||
String roomNo;
|
||||
String createdOn;
|
||||
String editedOn;
|
||||
String queueNo;
|
||||
String callNoStr;
|
||||
bool isQueueNurse;
|
||||
bool isQueueDr;
|
||||
bool isToneReq;
|
||||
bool isVoiceReq;
|
||||
String queueDuration;
|
||||
bool callUpdated = false;
|
||||
|
||||
Tickets(
|
||||
{this.id,
|
||||
this.patientID,
|
||||
this.mobileNo,
|
||||
this.doctorName,
|
||||
this.doctorNameN,
|
||||
this.patientGender,
|
||||
this.callType,
|
||||
this.roomNo,
|
||||
this.createdOn,
|
||||
this.editedOn,
|
||||
this.queueNo,
|
||||
this.callNoStr,
|
||||
this.isQueueNurse,
|
||||
this.isQueueDr,
|
||||
this.isToneReq,
|
||||
this.isVoiceReq,
|
||||
this.queueDuration});
|
||||
|
||||
int getRandomNum() {
|
||||
return Random().nextInt(1);
|
||||
}
|
||||
|
||||
Tickets.fromJson(Map<String, dynamic> json) {
|
||||
id = json['id'];
|
||||
patientID = json['patientID'];
|
||||
mobileNo = json['mobileNo'];
|
||||
doctorName = json['doctorName'];
|
||||
doctorNameN = json['doctorNameN'];
|
||||
patientGender = json['patientGender'];
|
||||
callType = json['callType'];
|
||||
roomNo = json['roomNo'];
|
||||
createdOn = json['createdOn'];
|
||||
editedOn = json['editedOn'];
|
||||
queueNo = json['queueNo'];
|
||||
callNoStr = json['callNoStr'];
|
||||
isQueueNurse = json['isQueueNurse'];
|
||||
isQueueDr = json['isQueueDr'];
|
||||
isToneReq = json['isToneReq'];
|
||||
isVoiceReq = json['isVoiceReq'];
|
||||
queueDuration = json['queueDuration'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['id'] = id;
|
||||
data['patientID'] = patientID;
|
||||
data['mobileNo'] = mobileNo;
|
||||
data['doctorName'] = doctorName;
|
||||
data['doctorNameN'] = doctorNameN;
|
||||
data['patientGender'] = patientGender;
|
||||
data['callType'] = callType;
|
||||
data['roomNo'] = roomNo;
|
||||
data['createdOn'] = createdOn;
|
||||
data['editedOn'] = editedOn;
|
||||
data['queueNo'] = queueNo;
|
||||
data['callNoStr'] = callNoStr;
|
||||
data['isQueueNurse'] = isQueueNurse;
|
||||
data['isQueueDr'] = isQueueDr;
|
||||
data['isToneReq'] = isToneReq;
|
||||
data['isVoiceReq'] = isVoiceReq;
|
||||
data['queueDuration'] = queueDuration;
|
||||
return data;
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return (queueNo).toString();
|
||||
}
|
||||
|
||||
CallType getCallType() {
|
||||
if (callType == 3) return CallType.RECEPTION;
|
||||
if (callType == 1) return CallType.NURSE;
|
||||
if (callType == 2) return CallType.DOCTOR;
|
||||
return CallType.NONE;
|
||||
}
|
||||
}
|
||||
@ -1,59 +0,0 @@
|
||||
import 'dart:convert';
|
||||
Xyz xyzFromJson(String str) => Xyz.fromJson(json.decode(str));
|
||||
String xyzToJson(Xyz data) => json.encode(data.toJson());
|
||||
class Xyz {
|
||||
Xyz({
|
||||
this.callNo,
|
||||
this.roomNo,
|
||||
this.callType,
|
||||
this.createdON,
|
||||
this.doctorName,
|
||||
this.doctorNameN,
|
||||
this.editedON,
|
||||
this.mobileNo,
|
||||
this.patientGender,
|
||||
this.patientID,
|
||||
this.queueNo,});
|
||||
|
||||
Xyz.fromJson(dynamic json) {
|
||||
callNo = json['CallNo'];
|
||||
roomNo = json['RoomNo'];
|
||||
callType = json['CallType'];
|
||||
createdON = json['CreatedON'];
|
||||
doctorName = json['DoctorName'];
|
||||
doctorNameN = json['DoctorNameN'];
|
||||
editedON = json['EditedON'];
|
||||
mobileNo = json['MobileNo'];
|
||||
patientGender = json['PatientGender'];
|
||||
patientID = json['PatientID'];
|
||||
queueNo = json['QueueNo'];
|
||||
}
|
||||
int callNo;
|
||||
String roomNo;
|
||||
int callType;
|
||||
String createdON;
|
||||
String doctorName;
|
||||
String doctorNameN;
|
||||
String editedON;
|
||||
String mobileNo;
|
||||
int patientGender;
|
||||
int patientID;
|
||||
String queueNo;
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final map = <String, dynamic>{};
|
||||
map['CallNo'] = callNo;
|
||||
map['RoomNo'] = roomNo;
|
||||
map['CallType'] = callType;
|
||||
map['CreatedON'] = createdON;
|
||||
map['DoctorName'] = doctorName;
|
||||
map['DoctorNameN'] = doctorNameN;
|
||||
map['EditedON'] = editedON;
|
||||
map['MobileNo'] = mobileNo;
|
||||
map['PatientGender'] = patientGender;
|
||||
map['PatientID'] = patientID;
|
||||
map['QueueNo'] = queueNo;
|
||||
return map;
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,216 @@
|
||||
import 'dart:ui';
|
||||
|
||||
var data = {
|
||||
"roomText": "غرفة",
|
||||
"queueNoText": "رقم قائمة الانتظار",
|
||||
"callForText": "يدعو إلى",
|
||||
"currentServeText": "العرض الحالي",
|
||||
"callTypeVitalSignText": "علامة حيوية",
|
||||
"callTypeDoctorText": "طبيب",
|
||||
"callTypeProcedureText": "إجراء",
|
||||
"callTypeVaccinationText": "تلقيح",
|
||||
"callTypeNebulizationText": "الإرذاذ",
|
||||
};
|
||||
|
||||
class CallConfig {
|
||||
late int id;
|
||||
late bool globalClinicPrefixReq;
|
||||
late bool clinicPrefixReq;
|
||||
late int concurrentCallDelaySec;
|
||||
late int voiceType;
|
||||
late int screenLanguage;
|
||||
late int voiceLanguage;
|
||||
late int screenMaxDisplayPatients;
|
||||
late int prioritySMS;
|
||||
late int priorityWhatsApp;
|
||||
late int priorityEmail;
|
||||
late String vitalSignText;
|
||||
late String doctorText;
|
||||
late String procedureText;
|
||||
late String vaccinationText;
|
||||
late String nebulizationText;
|
||||
late int createdBy;
|
||||
late String createdOn;
|
||||
late int editedBy;
|
||||
late String editedOn;
|
||||
late String preVoiceText;
|
||||
late String roomText;
|
||||
late String queueNoText;
|
||||
late String callForText;
|
||||
late String currentServeText;
|
||||
late String nextPrayerText;
|
||||
late String weatherText;
|
||||
late String minText;
|
||||
late String maxText;
|
||||
late String fajrText;
|
||||
late String dhuhrText;
|
||||
late String asrText;
|
||||
late String maghribText;
|
||||
late String ishaText;
|
||||
late String callTypeVitalSignText;
|
||||
late String callTypeDoctorText;
|
||||
late String callTypeProcedureText;
|
||||
late String callTypeVaccinationText;
|
||||
late String callTypeNebulizationText;
|
||||
late TextDirection textDirection;
|
||||
late ScreenOrientationEnum screenRotationEnum;
|
||||
|
||||
CallConfig({
|
||||
this.id = 0,
|
||||
this.globalClinicPrefixReq = false,
|
||||
this.clinicPrefixReq = false,
|
||||
this.concurrentCallDelaySec = 8,
|
||||
this.voiceType = 0,
|
||||
this.screenLanguage = 1,
|
||||
this.voiceLanguage = 1,
|
||||
this.screenMaxDisplayPatients = 5,
|
||||
this.prioritySMS = 1,
|
||||
this.priorityWhatsApp = 1,
|
||||
this.priorityEmail = 1,
|
||||
this.vitalSignText = "",
|
||||
this.doctorText = "",
|
||||
this.procedureText = "",
|
||||
this.vaccinationText = "",
|
||||
this.nebulizationText = "",
|
||||
this.createdBy = 0,
|
||||
this.createdOn = "",
|
||||
this.editedBy = 0,
|
||||
this.editedOn = "",
|
||||
this.preVoiceText = "",
|
||||
this.roomText = "",
|
||||
this.queueNoText = "",
|
||||
this.callForText = "",
|
||||
this.currentServeText = "Current Serving",
|
||||
this.nextPrayerText = "Next Prayer",
|
||||
this.weatherText = "Weather",
|
||||
this.minText = "Min",
|
||||
this.maxText = "Max",
|
||||
this.fajrText = "Fajar",
|
||||
this.dhuhrText = "Dhuhr",
|
||||
this.asrText = "Asr",
|
||||
this.maghribText = "Maghrib",
|
||||
this.ishaText = "Isha",
|
||||
this.callTypeDoctorText = "",
|
||||
this.callTypeProcedureText = "",
|
||||
this.callTypeVaccinationText = "",
|
||||
this.callTypeNebulizationText = "",
|
||||
this.textDirection = TextDirection.ltr,
|
||||
this.screenRotationEnum = ScreenOrientationEnum.portraitUp,
|
||||
});
|
||||
|
||||
CallConfig.fromJson(Map<String, dynamic> json) {
|
||||
id = json['id'];
|
||||
globalClinicPrefixReq = json['globalClinicPrefixReq'];
|
||||
clinicPrefixReq = json['clinicPrefixReq'];
|
||||
concurrentCallDelaySec = json['concurrentCallDelaySec'];
|
||||
voiceType = json['voiceType'];
|
||||
screenLanguage = json['screenLanguage'] ?? 1;
|
||||
voiceLanguage = screenLanguage; // json['voiceLanguage'] ?? 1;
|
||||
screenMaxDisplayPatients = json['screenMaxDisplayPatients'];
|
||||
// screenMaxDisplayPatients = 3;
|
||||
prioritySMS = json['prioritySMS'];
|
||||
priorityWhatsApp = json['priorityWhatsApp'];
|
||||
priorityEmail = json['priorityEmail'];
|
||||
vitalSignText = json['callForVitalSignText'];
|
||||
doctorText = json['callForDoctorText'];
|
||||
procedureText = json['callForProcedureText'];
|
||||
vaccinationText = json['callForVaccinationText'];
|
||||
nebulizationText = json['callForNebulizationText'];
|
||||
createdBy = json['createdBy'];
|
||||
createdOn = json['createdOn'];
|
||||
editedBy = json['editedBy'];
|
||||
editedOn = json['editedOn'];
|
||||
preVoiceText = json['preVoiceText'] ?? (json['textDirection'] == 2 ? "رقم التذكرة" : "Ticket Number");
|
||||
roomText = json['roomText'];
|
||||
queueNoText = json['queueNoText'];
|
||||
callForText = json['callForText'];
|
||||
nextPrayerText = json['nextPrayerText'];
|
||||
weatherText = json['weatherText'] ?? "Weather";
|
||||
maxText = json['maxText'];
|
||||
minText = json['minText'];
|
||||
fajrText = json['fajarText'];
|
||||
dhuhrText = json['dhuhrText'];
|
||||
asrText = json['asarText'];
|
||||
maghribText = json['maghribText'];
|
||||
ishaText = json['ishaText'];
|
||||
currentServeText = json['currentServeText'];
|
||||
callTypeVitalSignText = json['vitalSignText'];
|
||||
callTypeDoctorText = json['doctorText'];
|
||||
callTypeProcedureText = json['procedureText'];
|
||||
callTypeVaccinationText = json['vaccinationText'];
|
||||
callTypeNebulizationText = json['nebulizationText'];
|
||||
textDirection = json['textDirection'] == 2 ? TextDirection.rtl : TextDirection.ltr;
|
||||
screenRotationEnum = ((json['orientationType'] ?? 1) as int).toScreenOrientationEnum();
|
||||
// screenRotationEnum = (json['screenRotationId'] as int).toScreenOrientationEnum();
|
||||
}
|
||||
|
||||
static var data = {
|
||||
"id": 1,
|
||||
"globalClinicPrefixReq": true,
|
||||
"clinicPrefixReq": true,
|
||||
"concurrentCallDelaySec": 1,
|
||||
"voiceType": 1,
|
||||
"voiceTypeText": "Male",
|
||||
"screenLanguage": 1,
|
||||
"screenLanguageText": "English",
|
||||
"voiceLanguage": 1,
|
||||
"voiceLanguageText": "English",
|
||||
"screenMaxDisplayPatients": 6,
|
||||
"isNotiReq": true,
|
||||
"prioritySMS": 2,
|
||||
"priorityWhatsApp": 3,
|
||||
"priorityEmail": 1,
|
||||
"textDirection": 1,
|
||||
"vitalSignText": "VitalSign",
|
||||
"doctorText": "Doctor",
|
||||
"procedureText": "Procedure",
|
||||
"vaccinationText": "Vaccination",
|
||||
"nebulizationText": "Nebulization",
|
||||
"callForVitalSignText": "Call For VitalSign",
|
||||
"callForDoctorText": "Call For Doctor",
|
||||
"callForProcedureText": "Call For Procedure",
|
||||
"callForVaccinationText": "Call For Vaccination",
|
||||
"callForNebulizationText": "Call For Nebulization",
|
||||
"roomText": "Room",
|
||||
"queueNoText": "Queue No",
|
||||
"callForText": "Call For",
|
||||
"currentServeText": "Current Serving",
|
||||
"maxText": "Max",
|
||||
"minText": "Min",
|
||||
"nextPrayerText": "Next Prayer",
|
||||
"fajarText": "Fajar",
|
||||
"dhuhrText": "Dhuhr",
|
||||
"asarText": "Asar",
|
||||
"maghribText": "Maghrib",
|
||||
"ishaText": "Isha",
|
||||
"createdBy": 101,
|
||||
"createdOn": "2023-08-08T00:00:00",
|
||||
"editedBy": 101,
|
||||
"editedOn": "2023-10-08T10:07:12.5"
|
||||
};
|
||||
|
||||
static CallConfig testCallConfig = CallConfig.fromJson(data);
|
||||
}
|
||||
|
||||
enum ScreenOrientationEnum {
|
||||
landscapeRight,
|
||||
landscapeLeft,
|
||||
portraitUp,
|
||||
portraitDown,
|
||||
}
|
||||
|
||||
extension ScreenOrientationEnumExt on int {
|
||||
ScreenOrientationEnum toScreenOrientationEnum() {
|
||||
if (this == 1) {
|
||||
return ScreenOrientationEnum.portraitUp;
|
||||
} else if (this == 2) {
|
||||
return ScreenOrientationEnum.portraitDown;
|
||||
} else if (this == 3) {
|
||||
return ScreenOrientationEnum.landscapeRight;
|
||||
} else if (this == 4) {
|
||||
return ScreenOrientationEnum.landscapeLeft;
|
||||
} else {
|
||||
return ScreenOrientationEnum.portraitUp;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,248 @@
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:queuing_system/core/response_models/call_config_model.dart';
|
||||
import 'package:queuing_system/utils/call_type.dart';
|
||||
|
||||
class PatientTicketModel {
|
||||
late int id;
|
||||
late int patientID;
|
||||
late String mobileNo;
|
||||
late String doctorName;
|
||||
late String doctorNameN;
|
||||
late int patientGender;
|
||||
late int callType;
|
||||
late int editedOnTimeStamp;
|
||||
late int concurrentCallDelaySec;
|
||||
late String roomNo;
|
||||
late String createdOn;
|
||||
late String editedOn;
|
||||
late String queueNo;
|
||||
late String callNoStr;
|
||||
late bool isQueue;
|
||||
late bool isToneReq;
|
||||
late bool isVoiceReq;
|
||||
late int voiceLanguage;
|
||||
late String voiceLanguageText;
|
||||
late String ticketNoText;
|
||||
late String vitalSignText;
|
||||
late String doctorText;
|
||||
late String procedureText;
|
||||
late String vaccinationText;
|
||||
late String nebulizationText;
|
||||
late String callForVitalSignText;
|
||||
late String callForDoctorText;
|
||||
late String callForProcedureText;
|
||||
late String callForVaccinationText;
|
||||
late String callForNebulizationText;
|
||||
late String roomText;
|
||||
late String queueNoText;
|
||||
late String callForText;
|
||||
late int orientationType;
|
||||
late ScreenOrientationEnum screenRotationEnum;
|
||||
|
||||
late bool callUpdated = false;
|
||||
|
||||
PatientTicketModel({
|
||||
this.id = 0,
|
||||
this.patientID = 0,
|
||||
this.mobileNo = "",
|
||||
this.doctorName = "",
|
||||
this.doctorNameN = "",
|
||||
this.patientGender = 1,
|
||||
this.callType = 1,
|
||||
this.editedOnTimeStamp = 0,
|
||||
this.roomNo = "",
|
||||
this.createdOn = "",
|
||||
this.editedOn = "",
|
||||
this.queueNo = "",
|
||||
this.callNoStr = "",
|
||||
this.isQueue = false,
|
||||
this.isToneReq = false,
|
||||
this.isVoiceReq = false,
|
||||
this.concurrentCallDelaySec = 1,
|
||||
this.voiceLanguage = 1,
|
||||
this.voiceLanguageText = "English",
|
||||
this.ticketNoText = "Ticket Number",
|
||||
this.vitalSignText = "VitalSign",
|
||||
this.doctorText = "Doctor",
|
||||
this.procedureText = "Procedure",
|
||||
this.vaccinationText = "Vaccination",
|
||||
this.nebulizationText = "Nebulization",
|
||||
this.callForVitalSignText = "Call For VitalSign",
|
||||
this.callForDoctorText = "Call For Doctor",
|
||||
this.callForProcedureText = "Call For Procedure",
|
||||
this.callForVaccinationText = "Call For Vaccination",
|
||||
this.callForNebulizationText = "Call For Nebulization",
|
||||
this.roomText = "Room",
|
||||
this.queueNoText = "Queue No",
|
||||
this.callForText = "Call For",
|
||||
this.orientationType = 1,
|
||||
this.screenRotationEnum = ScreenOrientationEnum.portraitUp,
|
||||
});
|
||||
|
||||
int getRandomNum() {
|
||||
return Random().nextInt(9);
|
||||
}
|
||||
|
||||
PatientTicketModel.fromJson(Map<String, dynamic> json) {
|
||||
id = json['id'];
|
||||
patientID = json['patientID'];
|
||||
mobileNo = json['mobileNo'] ?? "";
|
||||
doctorName = json['doctorName'] ?? "";
|
||||
doctorNameN = json['doctorNameN'] ?? "";
|
||||
patientGender = json['patientGender'] ?? "";
|
||||
callType = json['callType'];
|
||||
editedOnTimeStamp = DateTime.parse(json['editedOn']).millisecondsSinceEpoch;
|
||||
roomNo = json['roomNo'];
|
||||
createdOn = json['createdOn'];
|
||||
editedOn = json['editedOn'];
|
||||
queueNo = json['queueNoM'];
|
||||
callNoStr = json['callNoStr'];
|
||||
isQueue = json['isQueue'];
|
||||
isToneReq = json['isToneReq'];
|
||||
isVoiceReq = json['isVoiceReq'];
|
||||
voiceLanguage = json['voiceLanguage'];
|
||||
voiceLanguageText = json['voiceLanguageText'] ?? "English";
|
||||
ticketNoText = json['ticketNoText'];
|
||||
vitalSignText = json['vitalSignText'];
|
||||
doctorText = json['doctorText'];
|
||||
procedureText = json['procedureText'];
|
||||
vaccinationText = json['vaccinationText'];
|
||||
nebulizationText = json['nebulizationText'];
|
||||
callForVitalSignText = json['callForVitalSignText'];
|
||||
callForDoctorText = json['callForDoctorText'];
|
||||
callForProcedureText = json['callForProcedureText'];
|
||||
callForVaccinationText = json['callForVaccinationText'];
|
||||
callForNebulizationText = json['callForNebulizationText'];
|
||||
roomText = json['roomText'];
|
||||
queueNoText = json['queueNoText'];
|
||||
callForText = json['callForText'];
|
||||
orientationType = json['orientationType'] ?? 1;
|
||||
screenRotationEnum = ((json['orientationType'] ?? 1) as int).toScreenOrientationEnum();
|
||||
}
|
||||
|
||||
// "voiceLanguage": 1,
|
||||
// "voiceLanguageText": null,
|
||||
// "ticketNoText": "Ticket Number",
|
||||
// "vitalSignText": "VitalSign",
|
||||
// "doctorText": "Doctor",
|
||||
// "procedureText": "Procedure",
|
||||
// "vaccinationText": "Vaccination",
|
||||
// "nebulizationText": "Nebulization",
|
||||
// "callForVitalSignText": "Call For VitalSign",
|
||||
// "callForDoctorText": "Call For Doctor",
|
||||
// "callForProcedureText": "Call For Procedure",
|
||||
// "callForVaccinationText": "Call For Vaccination",
|
||||
// "callForNebulizationText": "Call For Nebulization",
|
||||
// "roomText": "Room",
|
||||
// "queueNoText": "Queue No",
|
||||
// "callForText": "Call For"
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return (queueNo).toString();
|
||||
}
|
||||
|
||||
CallType getCallType() {
|
||||
if (callType == 1) return CallType.vitalSign;
|
||||
if (callType == 2) return CallType.doctor;
|
||||
if (callType == 3) return CallType.procedure;
|
||||
if (callType == 4) return CallType.vaccination;
|
||||
if (callType == 5) return CallType.nebulization;
|
||||
return CallType.vitalSign;
|
||||
}
|
||||
//
|
||||
// static List<PatientTicketModel> testCallPatients = [
|
||||
// PatientTicketModel(
|
||||
// id: 1,
|
||||
// patientID: 112,
|
||||
// mobileNo: "112",
|
||||
// doctorName: "name",
|
||||
// doctorNameN: "nameN",
|
||||
// patientGender: 1,
|
||||
// callType: 1,
|
||||
// roomNo: "617",
|
||||
// createdOn: DateTime.now().millisecondsSinceEpoch.toString(),
|
||||
// editedOn: DateTime.now().millisecondsSinceEpoch.toString(),
|
||||
// editedOnTimeStamp: DateTime.now().millisecondsSinceEpoch,
|
||||
// queueNo: "B-89",
|
||||
// callNoStr: "B-89",
|
||||
// isQueue: true,
|
||||
// isToneReq: true,
|
||||
// isVoiceReq: true,
|
||||
// concurrentCallDelaySec: 8,
|
||||
// ),
|
||||
// PatientTicketModel(
|
||||
// id: 1,
|
||||
// patientID: 112,
|
||||
// mobileNo: "112",
|
||||
// doctorName: "name",
|
||||
// doctorNameN: "nameN",
|
||||
// patientGender: 1,
|
||||
// callType: 1,
|
||||
// roomNo: "617",
|
||||
// createdOn: DateTime.now().millisecondsSinceEpoch.toString(),
|
||||
// editedOn: DateTime.now().millisecondsSinceEpoch.toString(),
|
||||
// queueNo: "B-89",
|
||||
// callNoStr: "B-89",
|
||||
// isQueue: true,
|
||||
// isToneReq: true,
|
||||
// isVoiceReq: true,
|
||||
// concurrentCallDelaySec: 8,
|
||||
// ),
|
||||
// PatientTicketModel(
|
||||
// id: 1,
|
||||
// patientID: 112,
|
||||
// mobileNo: "112",
|
||||
// doctorName: "name",
|
||||
// doctorNameN: "nameN",
|
||||
// patientGender: 1,
|
||||
// callType: 1,
|
||||
// roomNo: "617",
|
||||
// createdOn: DateTime.now().millisecondsSinceEpoch.toString(),
|
||||
// editedOn: DateTime.now().millisecondsSinceEpoch.toString(),
|
||||
// queueNo: "B-89",
|
||||
// callNoStr: "B-89",
|
||||
// isQueue: true,
|
||||
// isToneReq: true,
|
||||
// isVoiceReq: true,
|
||||
// concurrentCallDelaySec: 8,
|
||||
// ),
|
||||
// PatientTicketModel(
|
||||
// id: 1,
|
||||
// patientID: 112,
|
||||
// mobileNo: "112",
|
||||
// doctorName: "name",
|
||||
// doctorNameN: "nameN",
|
||||
// patientGender: 1,
|
||||
// callType: 1,
|
||||
// roomNo: "617",
|
||||
// createdOn: DateTime.now().millisecondsSinceEpoch.toString(),
|
||||
// editedOn: DateTime.now().millisecondsSinceEpoch.toString(),
|
||||
// queueNo: "B-89",
|
||||
// callNoStr: "B-89",
|
||||
// isQueue: true,
|
||||
// isToneReq: true,
|
||||
// isVoiceReq: true,
|
||||
// concurrentCallDelaySec: 8,
|
||||
// ),
|
||||
// PatientTicketModel(
|
||||
// id: 1,
|
||||
// patientID: 112,
|
||||
// mobileNo: "112",
|
||||
// doctorName: "name",
|
||||
// doctorNameN: "nameN",
|
||||
// patientGender: 1,
|
||||
// callType: 1,
|
||||
// roomNo: "617",
|
||||
// createdOn: DateTime.now().millisecondsSinceEpoch.toString(),
|
||||
// editedOn: DateTime.now().millisecondsSinceEpoch.toString(),
|
||||
// queueNo: "B-89",
|
||||
// callNoStr: "B-89",
|
||||
// isQueue: true,
|
||||
// isToneReq: true,
|
||||
// isVoiceReq: true,
|
||||
// concurrentCallDelaySec: 8,
|
||||
// ),
|
||||
// ];
|
||||
}
|
||||
@ -0,0 +1,49 @@
|
||||
import 'package:intl/intl.dart';
|
||||
|
||||
class PrayersWidgetModel {
|
||||
int? fajr;
|
||||
String? sunrise;
|
||||
int? dhuhr;
|
||||
int? asr;
|
||||
String? sunset;
|
||||
int? maghrib;
|
||||
int? isha;
|
||||
String? imsak;
|
||||
String? midnight;
|
||||
String? firstthird;
|
||||
String? lastthird;
|
||||
String? dateFor;
|
||||
|
||||
PrayersWidgetModel({this.fajr, this.sunrise, this.dhuhr, this.asr, this.sunset, this.maghrib, this.isha, this.imsak, this.midnight, this.firstthird, this.lastthird, this.dateFor});
|
||||
|
||||
PrayersWidgetModel.fromJson(Map<String, dynamic> json) {
|
||||
fajr = dateTimeConversion(json['dateFor'], json['fajr']);
|
||||
sunrise = json['sunrise'];
|
||||
dhuhr = dateTimeConversion(json['dateFor'], getDhuhrData(json), isForDhuhr: true);
|
||||
asr = dateTimeConversion(json['dateFor'], json['asr']);
|
||||
sunset = json['sunset'];
|
||||
maghrib = dateTimeConversion(json['dateFor'], json['maghrib']);
|
||||
isha = dateTimeConversion(json['dateFor'], json['isha']);
|
||||
imsak = json['imsak'];
|
||||
midnight = json['midnight'];
|
||||
firstthird = json['firstthird'];
|
||||
lastthird = json['lastthird'];
|
||||
dateFor = json['dateFor'];
|
||||
}
|
||||
|
||||
static String getDhuhrData(dynamic json) {
|
||||
return (json['dhuhr'] as String).contains('PM') ? json['dhuhr'] : json['dhuhr'] + ' PM';
|
||||
}
|
||||
|
||||
static dateTimeConversion(String date, String time, {bool isForDhuhr = false}) {
|
||||
if (isForDhuhr) {
|
||||
return DateFormat('DD MMM yyyy hh:mm a').parse("$date $time").millisecondsSinceEpoch;
|
||||
}
|
||||
return DateFormat('DD MMM yyyy hh:mm').parse("$date $time").millisecondsSinceEpoch;
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'PrayersWidgetModel{fajr: $fajr, sunrise: $sunrise, dhuhr: $dhuhr, asr: $asr, sunset: $sunset, maghrib: $maghrib, isha: $isha, imsak: $imsak, midnight: $midnight, firstthird: $firstthird, lastthird: $lastthird, dateFor: $dateFor}';
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,15 @@
|
||||
class RssFeedModel {
|
||||
String? rssFeed;
|
||||
|
||||
RssFeedModel({this.rssFeed});
|
||||
|
||||
RssFeedModel.fromJson(Map<String, dynamic> json) {
|
||||
rssFeed = json['rssFeed'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['rssFeed'] = rssFeed;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,378 @@
|
||||
var testPatientsData = {
|
||||
"totalItemsCount": null,
|
||||
"data": {
|
||||
"callPatients": [
|
||||
{
|
||||
"id": 3,
|
||||
"patientID": 109436,
|
||||
"mobileNo": null,
|
||||
"doctorName": "",
|
||||
"doctorNameN": null,
|
||||
"patientGender": 1,
|
||||
"callType": 1,
|
||||
"roomNo": "1",
|
||||
"createdOn": "2023-12-27T10:40:27.693",
|
||||
"editedOn": "2023-12-27T10:46:32.86",
|
||||
"queueNo": "IMD A-41",
|
||||
"callNoStr": "A-41",
|
||||
"patientEmail": "unknown@unknown.com",
|
||||
"preferredLang": "1",
|
||||
"isQueue": true,
|
||||
"isToneReq": true,
|
||||
"isVoiceReq": true,
|
||||
"orientationType": 1,
|
||||
"isTurnOn": true,
|
||||
"concurrentCallDelaySec": 1,
|
||||
"crVerifiedIP": null,
|
||||
"crTypeAckIP": "10.20.10.42",
|
||||
"voiceLanguage": 1,
|
||||
"voiceLanguageText": null,
|
||||
"ticketNoText": "Ticket Number",
|
||||
"vitalSignText": "VitalSign",
|
||||
"doctorText": "Doctor",
|
||||
"procedureText": "Procedure",
|
||||
"vaccinationText": "Vaccination",
|
||||
"nebulizationText": "Nebulization",
|
||||
"callForVitalSignText": "Call For VitalSign",
|
||||
"callForDoctorText": "Call For Doctor",
|
||||
"callForProcedureText": "Call For Procedure",
|
||||
"callForVaccinationText": "Call For Vaccination",
|
||||
"callForNebulizationText": "Call For Nebulization",
|
||||
"roomText": "Room",
|
||||
"queueNoText": "Queue No",
|
||||
"callForText": "Call For"
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"patientID": 3120504,
|
||||
"mobileNo": "0550004569",
|
||||
"doctorName": "",
|
||||
"doctorNameN": null,
|
||||
"patientGender": 1,
|
||||
"callType": 1,
|
||||
"roomNo": "1",
|
||||
"createdOn": "2023-12-27T10:45:45.15",
|
||||
"editedOn": "2023-12-27T10:46:48.373",
|
||||
"queueNo": "IMD A-43",
|
||||
"callNoStr": "A-43",
|
||||
"patientEmail": "unknown@unknown.com",
|
||||
"preferredLang": "2",
|
||||
"isQueue": false,
|
||||
"isToneReq": true,
|
||||
"isVoiceReq": true,
|
||||
"orientationType": 1,
|
||||
"isTurnOn": true,
|
||||
"concurrentCallDelaySec": 1,
|
||||
"crVerifiedIP": null,
|
||||
"crTypeAckIP": null,
|
||||
"voiceLanguage": 2,
|
||||
"voiceLanguageText": null,
|
||||
"ticketNoText": "رقم التذكرة",
|
||||
"vitalSignText": "علامة حيوية",
|
||||
"doctorText": "الطبيب",
|
||||
"procedureText": "الاجراءات",
|
||||
"vaccinationText": "المطاعيم",
|
||||
"nebulizationText": "التنفس",
|
||||
"callForVitalSignText": "التوجه الى غرفة قياس العلامات الحيوية",
|
||||
"callForDoctorText": "التوجه الى الطبيب",
|
||||
"callForProcedureText": "التوجه الى غرفة الإجراءات",
|
||||
"callForVaccinationText": "التوجه الى غرفة المطاعيم",
|
||||
"callForNebulizationText": "التوجه الى غرفة التنفس",
|
||||
"roomText": "غرفة",
|
||||
"queueNoText": "رقم الانتظار",
|
||||
"callForText": "التوجه الى"
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"patientID": 3120505,
|
||||
"mobileNo": "0550004569",
|
||||
"doctorName": "",
|
||||
"doctorNameN": null,
|
||||
"patientGender": 1,
|
||||
"callType": 1,
|
||||
"roomNo": "1",
|
||||
"createdOn": "2023-12-27T10:45:45.15",
|
||||
"editedOn": "2023-12-27T10:46:48.373",
|
||||
"queueNo": "IMD A-43",
|
||||
"callNoStr": "A-43",
|
||||
"patientEmail": "unknown@unknown.com",
|
||||
"preferredLang": "2",
|
||||
"isQueue": false,
|
||||
"isToneReq": true,
|
||||
"isVoiceReq": true,
|
||||
"orientationType": 1,
|
||||
"isTurnOn": true,
|
||||
"concurrentCallDelaySec": 1,
|
||||
"crVerifiedIP": null,
|
||||
"crTypeAckIP": null,
|
||||
"voiceLanguage": 2,
|
||||
"voiceLanguageText": null,
|
||||
"ticketNoText": "رقم التذكرة",
|
||||
"vitalSignText": "علامة حيوية",
|
||||
"doctorText": "الطبيب",
|
||||
"procedureText": "الاجراءات",
|
||||
"vaccinationText": "المطاعيم",
|
||||
"nebulizationText": "التنفس",
|
||||
"callForVitalSignText": "التوجه الى غرفة قياس العلامات الحيوية",
|
||||
"callForDoctorText": "التوجه الى الطبيب",
|
||||
"callForProcedureText": "التوجه الى غرفة الإجراءات",
|
||||
"callForVaccinationText": "التوجه الى غرفة المطاعيم",
|
||||
"callForNebulizationText": "التوجه الى غرفة التنفس",
|
||||
"roomText": "غرفة",
|
||||
"queueNoText": "رقم الانتظار",
|
||||
"callForText": "التوجه الى"
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"patientID": 3120506,
|
||||
"mobileNo": "0550004569",
|
||||
"doctorName": "",
|
||||
"doctorNameN": null,
|
||||
"patientGender": 1,
|
||||
"callType": 1,
|
||||
"roomNo": "1",
|
||||
"createdOn": "2023-12-27T10:45:45.15",
|
||||
"editedOn": "2023-12-27T10:46:48.373",
|
||||
"queueNo": "IMD A-43",
|
||||
"callNoStr": "A-43",
|
||||
"patientEmail": "unknown@unknown.com",
|
||||
"preferredLang": "2",
|
||||
"isQueue": false,
|
||||
"isToneReq": true,
|
||||
"isVoiceReq": true,
|
||||
"orientationType": 1,
|
||||
"isTurnOn": true,
|
||||
"concurrentCallDelaySec": 1,
|
||||
"crVerifiedIP": null,
|
||||
"crTypeAckIP": null,
|
||||
"voiceLanguage": 2,
|
||||
"voiceLanguageText": null,
|
||||
"ticketNoText": "رقم التذكرة",
|
||||
"vitalSignText": "علامة حيوية",
|
||||
"doctorText": "الطبيب",
|
||||
"procedureText": "الاجراءات",
|
||||
"vaccinationText": "المطاعيم",
|
||||
"nebulizationText": "التنفس",
|
||||
"callForVitalSignText": "التوجه الى غرفة قياس العلامات الحيوية",
|
||||
"callForDoctorText": "التوجه الى الطبيب",
|
||||
"callForProcedureText": "التوجه الى غرفة الإجراءات",
|
||||
"callForVaccinationText": "التوجه الى غرفة المطاعيم",
|
||||
"callForNebulizationText": "التوجه الى غرفة التنفس",
|
||||
"roomText": "غرفة",
|
||||
"queueNoText": "رقم الانتظار",
|
||||
"callForText": "التوجه الى"
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"patientID": 3120507,
|
||||
"mobileNo": "0550004569",
|
||||
"doctorName": "",
|
||||
"doctorNameN": null,
|
||||
"patientGender": 1,
|
||||
"callType": 1,
|
||||
"roomNo": "1",
|
||||
"createdOn": "2023-12-27T10:45:45.15",
|
||||
"editedOn": "2023-12-27T10:46:48.373",
|
||||
"queueNo": "IMD A-43",
|
||||
"callNoStr": "A-43",
|
||||
"patientEmail": "unknown@unknown.com",
|
||||
"preferredLang": "2",
|
||||
"isQueue": false,
|
||||
"isToneReq": true,
|
||||
"isVoiceReq": true,
|
||||
"orientationType": 1,
|
||||
"isTurnOn": true,
|
||||
"concurrentCallDelaySec": 1,
|
||||
"crVerifiedIP": null,
|
||||
"crTypeAckIP": null,
|
||||
"voiceLanguage": 2,
|
||||
"voiceLanguageText": null,
|
||||
"ticketNoText": "رقم التذكرة",
|
||||
"vitalSignText": "علامة حيوية",
|
||||
"doctorText": "الطبيب",
|
||||
"procedureText": "الاجراءات",
|
||||
"vaccinationText": "المطاعيم",
|
||||
"nebulizationText": "التنفس",
|
||||
"callForVitalSignText": "التوجه الى غرفة قياس العلامات الحيوية",
|
||||
"callForDoctorText": "التوجه الى الطبيب",
|
||||
"callForProcedureText": "التوجه الى غرفة الإجراءات",
|
||||
"callForVaccinationText": "التوجه الى غرفة المطاعيم",
|
||||
"callForNebulizationText": "التوجه الى غرفة التنفس",
|
||||
"roomText": "غرفة",
|
||||
"queueNoText": "رقم الانتظار",
|
||||
"callForText": "التوجه الى"
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"patientID": 3120508,
|
||||
"mobileNo": "0550004569",
|
||||
"doctorName": "",
|
||||
"doctorNameN": null,
|
||||
"patientGender": 1,
|
||||
"callType": 1,
|
||||
"roomNo": "1",
|
||||
"createdOn": "2023-12-27T10:45:45.15",
|
||||
"editedOn": "2023-12-27T10:46:48.373",
|
||||
"queueNo": "IMD A-43",
|
||||
"callNoStr": "A-43",
|
||||
"patientEmail": "unknown@unknown.com",
|
||||
"preferredLang": "2",
|
||||
"isQueue": false,
|
||||
"isToneReq": true,
|
||||
"isVoiceReq": true,
|
||||
"orientationType": 1,
|
||||
"isTurnOn": true,
|
||||
"concurrentCallDelaySec": 1,
|
||||
"crVerifiedIP": null,
|
||||
"crTypeAckIP": null,
|
||||
"voiceLanguage": 2,
|
||||
"voiceLanguageText": null,
|
||||
"ticketNoText": "رقم التذكرة",
|
||||
"vitalSignText": "علامة حيوية",
|
||||
"doctorText": "الطبيب",
|
||||
"procedureText": "الاجراءات",
|
||||
"vaccinationText": "المطاعيم",
|
||||
"nebulizationText": "التنفس",
|
||||
"callForVitalSignText": "التوجه الى غرفة قياس العلامات الحيوية",
|
||||
"callForDoctorText": "التوجه الى الطبيب",
|
||||
"callForProcedureText": "التوجه الى غرفة الإجراءات",
|
||||
"callForVaccinationText": "التوجه الى غرفة المطاعيم",
|
||||
"callForNebulizationText": "التوجه الى غرفة التنفس",
|
||||
"roomText": "غرفة",
|
||||
"queueNoText": "رقم الانتظار",
|
||||
"callForText": "التوجه الى"
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"patientID": 3120509,
|
||||
"mobileNo": "0550004569",
|
||||
"doctorName": "",
|
||||
"doctorNameN": null,
|
||||
"patientGender": 1,
|
||||
"callType": 1,
|
||||
"roomNo": "1",
|
||||
"createdOn": "2023-12-27T10:45:45.15",
|
||||
"editedOn": "2023-12-27T10:46:48.373",
|
||||
"queueNo": "IMD A-43",
|
||||
"callNoStr": "A-43",
|
||||
"patientEmail": "unknown@unknown.com",
|
||||
"preferredLang": "2",
|
||||
"isQueue": false,
|
||||
"isToneReq": true,
|
||||
"isVoiceReq": true,
|
||||
"orientationType": 1,
|
||||
"isTurnOn": true,
|
||||
"concurrentCallDelaySec": 1,
|
||||
"crVerifiedIP": null,
|
||||
"crTypeAckIP": null,
|
||||
"voiceLanguage": 2,
|
||||
"voiceLanguageText": null,
|
||||
"ticketNoText": "رقم التذكرة",
|
||||
"vitalSignText": "علامة حيوية",
|
||||
"doctorText": "الطبيب",
|
||||
"procedureText": "الاجراءات",
|
||||
"vaccinationText": "المطاعيم",
|
||||
"nebulizationText": "التنفس",
|
||||
"callForVitalSignText": "التوجه الى غرفة قياس العلامات الحيوية",
|
||||
"callForDoctorText": "التوجه الى الطبيب",
|
||||
"callForProcedureText": "التوجه الى غرفة الإجراءات",
|
||||
"callForVaccinationText": "التوجه الى غرفة المطاعيم",
|
||||
"callForNebulizationText": "التوجه الى غرفة التنفس",
|
||||
"roomText": "غرفة",
|
||||
"queueNoText": "رقم الانتظار",
|
||||
"callForText": "التوجه الى"
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"patientID": 109510,
|
||||
"mobileNo": null,
|
||||
"doctorName": "",
|
||||
"doctorNameN": null,
|
||||
"patientGender": 1,
|
||||
"callType": 1,
|
||||
"roomNo": "1",
|
||||
"createdOn": "2023-12-27T10:40:27.693",
|
||||
"editedOn": "2023-12-27T10:46:32.86",
|
||||
"queueNo": "IMD A-41",
|
||||
"callNoStr": "A-41",
|
||||
"patientEmail": "unknown@unknown.com",
|
||||
"preferredLang": "1",
|
||||
"isQueue": true,
|
||||
"isToneReq": true,
|
||||
"isVoiceReq": true,
|
||||
"orientationType": 1,
|
||||
"isTurnOn": true,
|
||||
"concurrentCallDelaySec": 1,
|
||||
"crVerifiedIP": null,
|
||||
"crTypeAckIP": "10.20.10.42",
|
||||
"voiceLanguage": 1,
|
||||
"voiceLanguageText": null,
|
||||
"ticketNoText": "Ticket Number",
|
||||
"vitalSignText": "VitalSign",
|
||||
"doctorText": "Doctor",
|
||||
"procedureText": "Procedure",
|
||||
"vaccinationText": "Vaccination",
|
||||
"nebulizationText": "Nebulization",
|
||||
"callForVitalSignText": "Call For VitalSign",
|
||||
"callForDoctorText": "Call For Doctor",
|
||||
"callForProcedureText": "Call For Procedure",
|
||||
"callForVaccinationText": "Call For Vaccination",
|
||||
"callForNebulizationText": "Call For Nebulization",
|
||||
"roomText": "Room",
|
||||
"queueNoText": "Queue No",
|
||||
"callForText": "Call For"
|
||||
},
|
||||
],
|
||||
"drCallPatients": [],
|
||||
"nurseCallPatients": [],
|
||||
"callConfig": {
|
||||
"id": 1,
|
||||
"globalClinicPrefixReq": true,
|
||||
"clinicPrefixReq": true,
|
||||
"concurrentCallDelaySec": 1,
|
||||
"voiceType": 1,
|
||||
"voiceTypeText": "Male",
|
||||
"screenLanguage": 1,
|
||||
"screenLanguageText": "English",
|
||||
"voiceLanguage": 2,
|
||||
"voiceLanguageText": "Arabic",
|
||||
"screenMaxDisplayPatients": 7,
|
||||
"isNotiReq": false,
|
||||
"prioritySMS": 2,
|
||||
"priorityWhatsApp": 3,
|
||||
"priorityEmail": 1,
|
||||
"textDirection": 1,
|
||||
"orientationType": 1,
|
||||
"ticketNoText": "Ticket Number",
|
||||
"vitalSignText": "VitalSign",
|
||||
"doctorText": "Doctor",
|
||||
"procedureText": "Procedure",
|
||||
"vaccinationText": "Vaccination",
|
||||
"nebulizationText": "Nebulization",
|
||||
"callForVitalSignText": "Call For VitalSign",
|
||||
"callForDoctorText": "Call For Doctor",
|
||||
"callForProcedureText": "Call For Procedure",
|
||||
"callForVaccinationText": "Call For Vaccination",
|
||||
"callForNebulizationText": "Call For Nebulization",
|
||||
"roomText": "Room",
|
||||
"queueNoText": "Queue No",
|
||||
"callForText": "Call For",
|
||||
"currentServeText": "Current Serving",
|
||||
"maxText": "Max",
|
||||
"minText": "Min",
|
||||
"nextPrayerText": "Next Prayer",
|
||||
"fajarText": "Fajar",
|
||||
"dhuhrText": "Dhuhr",
|
||||
"asarText": "Asar",
|
||||
"maghribText": "Maghrib",
|
||||
"ishaText": "Isha",
|
||||
"lastPatientServedTimeMin": 5,
|
||||
"createdBy": 101,
|
||||
"createdOn": "2023-08-08T00:00:00",
|
||||
"editedBy": 101,
|
||||
"editedOn": "2023-12-26T17:30:47.62"
|
||||
}
|
||||
},
|
||||
"messageStatus": 1,
|
||||
"message": "Success"
|
||||
};
|
||||
@ -0,0 +1,87 @@
|
||||
import 'package:queuing_system/core/config/config.dart';
|
||||
|
||||
class WeathersWidgetModel {
|
||||
int? id;
|
||||
String? headline;
|
||||
double? maxTemp;
|
||||
double? minTemp;
|
||||
String? iconPhrase;
|
||||
String? forecastDate;
|
||||
int? cityID;
|
||||
String? forecastDay;
|
||||
String? createDateTime;
|
||||
double? windSpeed;
|
||||
String? windDirection;
|
||||
double? windDegrees;
|
||||
String? weatherIconPath;
|
||||
|
||||
WeathersWidgetModel({
|
||||
this.id,
|
||||
this.headline,
|
||||
this.maxTemp,
|
||||
this.minTemp,
|
||||
this.iconPhrase,
|
||||
this.forecastDate,
|
||||
this.cityID,
|
||||
this.forecastDay,
|
||||
this.createDateTime,
|
||||
this.windSpeed,
|
||||
this.windDirection,
|
||||
this.windDegrees,
|
||||
this.weatherIconPath,
|
||||
});
|
||||
|
||||
WeathersWidgetModel.fromJson(Map<String, dynamic> json) {
|
||||
id = json['id'];
|
||||
headline = json['headline'];
|
||||
maxTemp = json['maxTemp'];
|
||||
minTemp = json['minTemp'];
|
||||
iconPhrase = json['iconPhrase'];
|
||||
forecastDate = json['forecastDate'];
|
||||
cityID = json['cityID'];
|
||||
forecastDay = json['forecastDay'];
|
||||
createDateTime = json['createDateTime'];
|
||||
windSpeed = json['windSpeed'];
|
||||
windDirection = json['windDirection'];
|
||||
windDegrees = json['windDegrees'];
|
||||
weatherIconPath = getWeatherIconPath(json['iconPhrase']);
|
||||
}
|
||||
|
||||
String getWeatherIconPath(String iconPhrase) {
|
||||
if (iconPhrase == "Rain" || iconPhrase == "Showers" || iconPhrase == "ThunderStorms") {
|
||||
return AppGlobal.rainIcon;
|
||||
} else if (iconPhrase == "Hot") {
|
||||
return AppGlobal.hotIcon;
|
||||
} else if (iconPhrase == "Windy") {
|
||||
return AppGlobal.windIcon;
|
||||
} else if (iconPhrase == "Cloudy" || iconPhrase == "Mostly cloudy" || iconPhrase == "Intermittent clouds") {
|
||||
return AppGlobal.cloudIcon;
|
||||
} else if (iconPhrase == "Sunny" || iconPhrase == "Mostly sunny" || iconPhrase == "Partly sunny" || iconPhrase == "Hazy sunshine") {
|
||||
return AppGlobal.sunnyIcon;
|
||||
} else {
|
||||
return AppGlobal.weatherIcon;
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['id'] = id;
|
||||
data['headline'] = headline;
|
||||
data['maxTemp'] = maxTemp;
|
||||
data['minTemp'] = minTemp;
|
||||
data['iconPhrase'] = iconPhrase;
|
||||
data['forecastDate'] = forecastDate;
|
||||
data['cityID'] = cityID;
|
||||
data['forecastDay'] = forecastDay;
|
||||
data['createDateTime'] = createDateTime;
|
||||
data['windSpeed'] = windSpeed;
|
||||
data['windDirection'] = windDirection;
|
||||
data['windDegrees'] = windDegrees;
|
||||
return data;
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'WeathersWidgetModel{id: $id, headline: $headline, maxTemp: $maxTemp, minTemp: $minTemp, iconPhrase: $iconPhrase, forecastDate: $forecastDate, cityID: $cityID, forecastDay: $forecastDay, createDateTime: $createDateTime, windSpeed: $windSpeed, windDirection: $windDirection, windDegrees: $windDegrees}';
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,56 @@
|
||||
class WidgetsConfigModel {
|
||||
int? waitingAreaID;
|
||||
String? waitingAreaName;
|
||||
bool? isWeatherReq;
|
||||
bool? isPrayerTimeReq;
|
||||
bool? isRssFeedReq;
|
||||
int? projectID;
|
||||
double? projectLatitude;
|
||||
double? projectLongitude;
|
||||
int? cityKey;
|
||||
|
||||
WidgetsConfigModel({
|
||||
this.waitingAreaID,
|
||||
this.waitingAreaName,
|
||||
this.isWeatherReq,
|
||||
this.isPrayerTimeReq,
|
||||
this.isRssFeedReq,
|
||||
this.projectID,
|
||||
this.projectLatitude,
|
||||
this.projectLongitude,
|
||||
this.cityKey,
|
||||
});
|
||||
|
||||
WidgetsConfigModel.fromJson(Map<String, dynamic> json) {
|
||||
waitingAreaID = json['waitingAreaID'];
|
||||
waitingAreaName = json['waitingAreaName'];
|
||||
// isWeatherReq = true;
|
||||
// isPrayerTimeReq = true;
|
||||
// isRssFeedReq = true;
|
||||
isRssFeedReq = json['isRssFeedReq'];
|
||||
isWeatherReq = json['isWeatherReq'];
|
||||
isPrayerTimeReq = json['isPrayerTimeReq'];
|
||||
projectID = json['projectID'];
|
||||
projectLatitude = json['projectLatitude'];
|
||||
projectLongitude = json['projectLongitude'];
|
||||
cityKey = json['cityKey'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['waitingAreaID'] = waitingAreaID;
|
||||
data['waitingAreaName'] = waitingAreaName;
|
||||
data['isWeatherReq'] = isWeatherReq;
|
||||
data['isPrayerTimeReq'] = isPrayerTimeReq;
|
||||
data['projectID'] = projectID;
|
||||
data['projectLatitude'] = projectLatitude;
|
||||
data['projectLongitude'] = projectLongitude;
|
||||
data['cityKey'] = cityKey;
|
||||
return data;
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'WidgetsConfigModel{waitingAreaID: $waitingAreaID, waitingAreaName: $waitingAreaName, isWeatherReq: $isWeatherReq, isPrayerTimeReq: $isPrayerTimeReq, projectLatitude: $projectLatitude,projectLongitude: $projectLongitude, cityKey: $cityKey}';
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,104 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:marquee/marquee.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:queuing_system/core/config/size_config.dart';
|
||||
import 'package:queuing_system/core/response_models/call_config_model.dart';
|
||||
import 'package:queuing_system/home/app_provider.dart';
|
||||
import 'package:queuing_system/utils/Utils.dart';
|
||||
import 'package:queuing_system/widget/data_display/app_texts_widget.dart';
|
||||
|
||||
class AppFooter extends StatelessWidget {
|
||||
const AppFooter({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Consumer(builder: (BuildContext context, AppProvider appProvider, Widget? child) {
|
||||
return Container(
|
||||
color: Colors.grey.withOpacity(0.1),
|
||||
height: Utils.getHeight() * 0.95,
|
||||
width: double.infinity,
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
const SizedBox(width: 20),
|
||||
Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
InkWell(
|
||||
onTap: () async {
|
||||
// await context.read<AppProvider>().callPatientsAPI();
|
||||
},
|
||||
child: AppText(
|
||||
"Powered By",
|
||||
fontSize: SizeConfig.getWidthMultiplier() * 2.6,
|
||||
fontFamily: 'Poppins-Medium.ttf',
|
||||
),
|
||||
),
|
||||
Text(appProvider.currentDeviceIp,
|
||||
style: TextStyle(fontWeight: FontWeight.w500, fontSize: SizeConfig.getWidthMultiplier() * 2.2)),
|
||||
Row(
|
||||
children: [
|
||||
InkWell(
|
||||
onTap: () {
|
||||
appProvider.updateCurrentScreenRotation(ScreenOrientationEnum.portraitUp);
|
||||
},
|
||||
child: const Icon(Icons.arrow_upward),
|
||||
),
|
||||
InkWell(
|
||||
onTap: () {
|
||||
appProvider.updateCurrentScreenRotation(ScreenOrientationEnum.landscapeRight);
|
||||
},
|
||||
child: const Icon(Icons.arrow_forward),
|
||||
),
|
||||
InkWell(
|
||||
onTap: () {
|
||||
appProvider.updateCurrentScreenRotation(ScreenOrientationEnum.portraitDown);
|
||||
},
|
||||
child: const Icon(Icons.arrow_downward),
|
||||
),
|
||||
InkWell(
|
||||
onTap: () {
|
||||
appProvider.updateCurrentScreenRotation(ScreenOrientationEnum.landscapeLeft);
|
||||
},
|
||||
child: const Icon(Icons.arrow_back),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(width: 10),
|
||||
Image.asset(
|
||||
"assets/images/cloud_logo.png",
|
||||
height: SizeConfig.getHeightMultiplier() * 4,
|
||||
),
|
||||
],
|
||||
),
|
||||
Expanded(
|
||||
child: (appProvider.currentRssFeedModel.rssFeed == null || appProvider.currentRssFeedModel.rssFeed!.isEmpty)
|
||||
? const SizedBox()
|
||||
: Container(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 10),
|
||||
child: Marquee(
|
||||
text: appProvider.currentRssFeedModel.rssFeed ?? "",
|
||||
style: TextStyle(fontWeight: FontWeight.w500, fontSize: SizeConfig.getHeightMultiplier() * 2),
|
||||
scrollAxis: Axis.horizontal,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
blankSpace: 20.0,
|
||||
velocity: 100.0,
|
||||
pauseAfterRound: const Duration(seconds: 1),
|
||||
startPadding: 10.0,
|
||||
accelerationDuration: const Duration(seconds: 1),
|
||||
accelerationCurve: Curves.linear,
|
||||
decelerationDuration: const Duration(milliseconds: 500),
|
||||
decelerationCurve: Curves.easeOut,
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
));
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,581 @@
|
||||
import 'dart:async';
|
||||
import 'dart:developer';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:connectivity_plus/connectivity_plus.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter_tts/flutter_tts.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:just_audio/just_audio.dart';
|
||||
import 'package:queuing_system/core/api.dart';
|
||||
import 'package:queuing_system/core/response_models/call_config_model.dart';
|
||||
import 'package:queuing_system/core/response_models/patient_ticket_model.dart';
|
||||
import 'package:queuing_system/core/response_models/prayers_widget_model.dart';
|
||||
import 'package:queuing_system/core/response_models/rss_feed_model.dart';
|
||||
import 'package:queuing_system/core/response_models/weathers_widget_model.dart';
|
||||
import 'package:queuing_system/core/response_models/widgets_config_model.dart';
|
||||
import 'package:queuing_system/main.dart';
|
||||
import 'package:queuing_system/utils/call_by_voice.dart';
|
||||
import 'package:queuing_system/utils/call_type.dart';
|
||||
import 'package:queuing_system/utils/signalR_utils.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'package:signalr_core/signalr_core.dart';
|
||||
|
||||
bool isVoiceActualCompletedGlobally = false;
|
||||
|
||||
class AppProvider extends ChangeNotifier {
|
||||
AppProvider() {
|
||||
waitForIPAndCallInitializations();
|
||||
}
|
||||
|
||||
Future<void> waitForIPAndCallInitializations() async {
|
||||
while (currentDeviceIp == "") {
|
||||
await getCurrentIP();
|
||||
if (currentDeviceIp != "") {
|
||||
await callInitializations();
|
||||
} else {
|
||||
await Future.delayed(const Duration(seconds: 2));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> callInitializations() async {
|
||||
await startSignalHubConnection();
|
||||
await getInfoWidgetsDetailsFromServer();
|
||||
await getLastTimeUpdatedFromCache();
|
||||
listenNetworkConnectivity();
|
||||
listenAudioPlayerEvents();
|
||||
getTheWidgetsConfigurationsEveryMidnight();
|
||||
initializeFlutterTTS();
|
||||
// await callPatientsAPI();
|
||||
}
|
||||
|
||||
SignalRHelper signalRHelper = SignalRHelper();
|
||||
|
||||
final AudioPlayer audioPlayer = AudioPlayer();
|
||||
FlutterTts flutterTts = FlutterTts();
|
||||
|
||||
CallConfig patientCallConfigurations = CallConfig();
|
||||
List<PatientTicketModel> patientTickets = [];
|
||||
List<PatientTicketModel> isQueuePatients = [];
|
||||
|
||||
String currentDeviceIp = "";
|
||||
bool isCallingInProgress = false;
|
||||
bool isInternetConnectionAvailable = true;
|
||||
bool isApiCallNeeded = false;
|
||||
|
||||
initializeFlutterTTS() async {
|
||||
flutterTts.setCompletionHandler(() => onVoiceCompleted());
|
||||
}
|
||||
|
||||
Future<void> onVoiceCompleted() async {
|
||||
logger.i("My Value is in setCompletionHandler: $isVoiceActualCompletedGlobally");
|
||||
logger.i("isQueuePatients.length in setCompletionHandler: ${isQueuePatients.length}");
|
||||
if (!isVoiceActualCompletedGlobally) {
|
||||
return;
|
||||
}
|
||||
if (isQueuePatients.isNotEmpty) {
|
||||
await Future.delayed(Duration(seconds: patientCallConfigurations.concurrentCallDelaySec)).whenComplete(
|
||||
() async {
|
||||
PatientTicketModel temp = PatientTicketModel();
|
||||
if (patientTickets.isNotEmpty && isQueuePatients.length > 1) {
|
||||
temp = patientTickets.elementAt(0);
|
||||
patientTickets.removeAt(0);
|
||||
}
|
||||
notifyListeners();
|
||||
if (isQueuePatients.isNotEmpty) {
|
||||
isQueuePatients.removeAt(0);
|
||||
}
|
||||
if (patientTickets.isNotEmpty && isQueuePatients.length > 1) {
|
||||
patientTickets.add(temp);
|
||||
}
|
||||
notifyListeners();
|
||||
if (isQueuePatients.isNotEmpty) {
|
||||
await voiceCallPatientTicket(patientTickets.first, "setCompletionHandler");
|
||||
updatePatientTicket(patientTickets.first);
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
logger.i("here logger.ig: ${isQueuePatients.length}");
|
||||
|
||||
if (isQueuePatients.isEmpty) {
|
||||
isCallingInProgress = false;
|
||||
}
|
||||
if (isApiCallNeeded && isQueuePatients.isEmpty) {
|
||||
logger.i("Setting isCallingInProgress : $isCallingInProgress");
|
||||
Timer(Duration(seconds: patientCallConfigurations.concurrentCallDelaySec), () async {
|
||||
await callPatientsAPI();
|
||||
isApiCallNeeded = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
updateInternetConnection(bool value) {
|
||||
isInternetConnectionAvailable = value;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
ScreenOrientationEnum currentScreenRotation = ScreenOrientationEnum.portraitUp;
|
||||
|
||||
updateCurrentScreenRotation(ScreenOrientationEnum value) {
|
||||
currentScreenRotation = value;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> getCurrentIP() async {
|
||||
final ips = await NetworkInterface.list(type: InternetAddressType.IPv4);
|
||||
for (var interface in ips) {
|
||||
if (interface.name == "eth0") {
|
||||
for (var address in interface.addresses) {
|
||||
currentDeviceIp = address.address;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
if (interface.name == "wlan0") {
|
||||
for (var address in interface.addresses) {
|
||||
currentDeviceIp = address.address;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
WidgetsConfigModel? currentWidgetsConfigModel;
|
||||
|
||||
Future<void> getInfoWidgetsConfigurationsFromServer() async {
|
||||
log(" errorHellpo:");
|
||||
WidgetsConfigModel? widgetsConfigModel = await API.getWidgetConfigsFromServer(currentDeviceIp, onFailure: (error) {
|
||||
logger.i("Api call failed with this error: ${error.toString()}");
|
||||
});
|
||||
|
||||
if (widgetsConfigModel != null) currentWidgetsConfigModel = widgetsConfigModel;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
WeathersWidgetModel currentWeathersWidgetModel = WeathersWidgetModel();
|
||||
|
||||
Future<void> getWeatherDetailsFromServer() async {
|
||||
WeathersWidgetModel? weathersWidgetModel = await API.getWeatherDetailsFromServer(
|
||||
(currentWidgetsConfigModel!.cityKey ?? "").toString(),
|
||||
onFailure: (error) => logger.i("Api call failed with this error: ${error.toString()}"),
|
||||
);
|
||||
|
||||
if (weathersWidgetModel != null) {
|
||||
currentWeathersWidgetModel = weathersWidgetModel;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
String nextPrayerToShowWithTime = '';
|
||||
|
||||
void getNextPrayerToShow() {
|
||||
final current = DateTime.now();
|
||||
logger.i("Checking Namaz time Locally at ${current.toString()} and ${current.timeZoneName} ");
|
||||
|
||||
if (DateTime.fromMillisecondsSinceEpoch(currentPrayersWidgetModel.fajr!).isAfter(current)) {
|
||||
final namazTime = DateFormat('hh:mm a').format(DateTime.fromMillisecondsSinceEpoch(currentPrayersWidgetModel.fajr!));
|
||||
nextPrayerToShowWithTime = "${patientCallConfigurations.fajrText} at $namazTime";
|
||||
notifyListeners();
|
||||
return;
|
||||
}
|
||||
if (DateTime.fromMillisecondsSinceEpoch(currentPrayersWidgetModel.dhuhr!).isAfter(current)) {
|
||||
final namazTime = DateFormat('hh:mm a').format(DateTime.fromMillisecondsSinceEpoch(currentPrayersWidgetModel.dhuhr!));
|
||||
nextPrayerToShowWithTime = "${patientCallConfigurations.dhuhrText} at $namazTime";
|
||||
notifyListeners();
|
||||
return;
|
||||
}
|
||||
if (DateTime.fromMillisecondsSinceEpoch(currentPrayersWidgetModel.asr!).isAfter(current)) {
|
||||
final namazTime = DateFormat('hh:mm a').format(DateTime.fromMillisecondsSinceEpoch(currentPrayersWidgetModel.asr!));
|
||||
nextPrayerToShowWithTime = "${patientCallConfigurations.asrText} at $namazTime";
|
||||
notifyListeners();
|
||||
return;
|
||||
}
|
||||
if (DateTime.fromMillisecondsSinceEpoch(currentPrayersWidgetModel.maghrib!).isAfter(current)) {
|
||||
final namazTime = DateFormat('hh:mm a').format(DateTime.fromMillisecondsSinceEpoch(currentPrayersWidgetModel.maghrib!));
|
||||
nextPrayerToShowWithTime = "${patientCallConfigurations.maghribText} at $namazTime";
|
||||
notifyListeners();
|
||||
return;
|
||||
}
|
||||
if (DateTime.fromMillisecondsSinceEpoch(currentPrayersWidgetModel.isha!).isAfter(current)) {
|
||||
final namazTime = DateFormat('hh:mm a').format(DateTime.fromMillisecondsSinceEpoch(currentPrayersWidgetModel.isha!));
|
||||
nextPrayerToShowWithTime = "${patientCallConfigurations.ishaText} at $namazTime";
|
||||
notifyListeners();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
PrayersWidgetModel currentPrayersWidgetModel = PrayersWidgetModel();
|
||||
|
||||
Future<void> getPrayerDetailsFromServer() async {
|
||||
PrayersWidgetModel? prayersWidgetModel = await API.getPrayerDetailsFromServer(
|
||||
latitude: currentWidgetsConfigModel!.projectLatitude ?? 0,
|
||||
longitude: currentWidgetsConfigModel!.projectLongitude ?? 0,
|
||||
onFailure: (error) => logger.i("Api call failed with this error: ${error.toString()}"));
|
||||
|
||||
if (prayersWidgetModel != null) {
|
||||
currentPrayersWidgetModel = prayersWidgetModel;
|
||||
logger.i("I got this data from Prayers: ${prayersWidgetModel.toString()}");
|
||||
getNextPrayerToShow();
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
RssFeedModel currentRssFeedModel = RssFeedModel();
|
||||
|
||||
Future<void> getRssFeedDetailsFromServer() async {
|
||||
RssFeedModel? rssFeedModel = await API.getRssFeedDetailsFromServer(languageId: 0, onFailure: (error) => logger.i("Api call failed with this error: ${error.toString()}"));
|
||||
|
||||
if (rssFeedModel != null) {
|
||||
currentRssFeedModel = rssFeedModel;
|
||||
logger.i("I got this data from RssFeed: ${currentRssFeedModel.rssFeed}");
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> getInfoWidgetsDetailsFromServer() async {
|
||||
// if (currentWidgetsConfigModel == null) return;
|
||||
|
||||
await getInfoWidgetsConfigurationsFromServer().whenComplete(() async {
|
||||
if (currentWidgetsConfigModel == null) {
|
||||
return;
|
||||
}
|
||||
if (currentWidgetsConfigModel!.isWeatherReq != null && currentWidgetsConfigModel!.isWeatherReq!) {
|
||||
await getWeatherDetailsFromServer();
|
||||
}
|
||||
if (currentWidgetsConfigModel!.isPrayerTimeReq != null && currentWidgetsConfigModel!.isPrayerTimeReq!) {
|
||||
await getPrayerDetailsFromServer();
|
||||
}
|
||||
if (currentWidgetsConfigModel!.isRssFeedReq != null && currentWidgetsConfigModel!.isRssFeedReq!) {
|
||||
await getRssFeedDetailsFromServer();
|
||||
}
|
||||
});
|
||||
|
||||
int currentDate = DateTime.now().millisecondsSinceEpoch;
|
||||
await setLastTimeUpdatedInCache(lasTimeUpdated: currentDate.toString());
|
||||
}
|
||||
|
||||
int counter = 0;
|
||||
|
||||
Future<void> getTheWidgetsConfigurationsEveryMidnight() async {
|
||||
if (currentWidgetsConfigModel == null) return;
|
||||
if (!(currentWidgetsConfigModel!.isWeatherReq ?? false) && !(currentWidgetsConfigModel!.isPrayerTimeReq ?? false) && !(currentWidgetsConfigModel!.isRssFeedReq ?? false)) {
|
||||
return;
|
||||
}
|
||||
if (!currentWidgetsConfigModel!.isWeatherReq! && !currentWidgetsConfigModel!.isPrayerTimeReq! && !currentWidgetsConfigModel!.isRssFeedReq!) {
|
||||
return;
|
||||
}
|
||||
|
||||
DateTime current = DateTime.now();
|
||||
Stream timer = Stream.periodic(const Duration(minutes: 1), (i) {
|
||||
current = current.add(const Duration(minutes: 1));
|
||||
return current;
|
||||
});
|
||||
|
||||
timer.listen((data) async {
|
||||
DateTime dateTime = DateTime.parse(data.toString());
|
||||
|
||||
counter++;
|
||||
|
||||
logger.i("counterValue: $counter");
|
||||
|
||||
if (counter == 60 && currentWidgetsConfigModel!.isRssFeedReq!) {
|
||||
await getRssFeedDetailsFromServer();
|
||||
}
|
||||
|
||||
if (currentWidgetsConfigModel!.isWeatherReq!) {
|
||||
if (dateTime.day > currentLastTimeUpdated.day) {
|
||||
await getWeatherDetailsFromServer();
|
||||
}
|
||||
}
|
||||
|
||||
if (currentWidgetsConfigModel!.isPrayerTimeReq!) {
|
||||
if (dateTime.day > currentLastTimeUpdated.day) {
|
||||
await getPrayerDetailsFromServer();
|
||||
}
|
||||
}
|
||||
|
||||
if (currentWidgetsConfigModel!.isRssFeedReq!) {
|
||||
if (dateTime.day > currentLastTimeUpdated.day) {
|
||||
await getRssFeedDetailsFromServer();
|
||||
}
|
||||
}
|
||||
getNextPrayerToShow();
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> startSignalHubConnection() async {
|
||||
if (!signalRHelper.getConnectionState()) {
|
||||
await getCurrentIP().whenComplete(() => signalRHelper.startSignalRConnection(
|
||||
currentDeviceIp,
|
||||
onUpdateAvailable: onPingReceived,
|
||||
onConnect: onConnect,
|
||||
onConnecting: onConnecting,
|
||||
onDisconnect: onDisconnect,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> callPatientsAPI() async {
|
||||
logger.i("calling callPatientsAPI");
|
||||
patientTickets.clear();
|
||||
API.getCallRequestInfoByClinicInfo(currentDeviceIp,
|
||||
onSuccess: (waitingCalls, isQueuePatientsCalls, callConfigs) async {
|
||||
patientCallConfigurations = callConfigs;
|
||||
if (waitingCalls.length > patientCallConfigurations.screenMaxDisplayPatients) {
|
||||
patientTickets = waitingCalls.sublist(0, patientCallConfigurations.screenMaxDisplayPatients);
|
||||
} else {
|
||||
patientTickets = waitingCalls;
|
||||
}
|
||||
if (isQueuePatientsCalls.length > patientCallConfigurations.screenMaxDisplayPatients) {
|
||||
isQueuePatients = isQueuePatientsCalls.sublist(0, patientCallConfigurations.screenMaxDisplayPatients);
|
||||
} else {
|
||||
isQueuePatients = isQueuePatientsCalls;
|
||||
}
|
||||
notifyListeners();
|
||||
if (patientTickets.isNotEmpty) {
|
||||
updateCurrentScreenRotation(patientTickets.first.screenRotationEnum);
|
||||
await voiceCallPatientTicket(patientTickets.first, "callPatientsAPI");
|
||||
updatePatientTicket(patientTickets.first);
|
||||
}
|
||||
},
|
||||
onFailure: (error) => logger.i("Api call failed with this error: ${error.toString()}"));
|
||||
}
|
||||
|
||||
onPingReceived(data) async {
|
||||
logger.i("A new Ping Received when isQueuePatients: ${isQueuePatients.length}");
|
||||
logger.i("isCallingInProgress from onPingReceived: $isCallingInProgress");
|
||||
logger.i("isApiCallNeeded: $isApiCallNeeded");
|
||||
if (patientTickets.isNotEmpty) {
|
||||
if (isCallingInProgress) {
|
||||
isApiCallNeeded = true;
|
||||
} else {
|
||||
await callPatientsAPI();
|
||||
}
|
||||
} else {
|
||||
await callPatientsAPI();
|
||||
}
|
||||
}
|
||||
|
||||
String getCallTypeText(PatientTicketModel ticket) {
|
||||
final callType = ticket.getCallType();
|
||||
switch (callType) {
|
||||
case CallType.vitalSign:
|
||||
return ticket.callForVitalSignText;
|
||||
case CallType.doctor:
|
||||
return ticket.callForDoctorText;
|
||||
case CallType.procedure:
|
||||
return ticket.callForProcedureText;
|
||||
case CallType.vaccination:
|
||||
return ticket.callForVaccinationText;
|
||||
case CallType.nebulization:
|
||||
return ticket.callForNebulizationText;
|
||||
default:
|
||||
return ticket.callForVitalSignText;
|
||||
}
|
||||
}
|
||||
|
||||
CallByVoice? voiceCaller;
|
||||
PatientTicketModel currentPatient = PatientTicketModel();
|
||||
|
||||
// testCalling() async {
|
||||
// voiceCaller = CallByVoice(
|
||||
// preVoice: "رقم التذكرة",
|
||||
// ticketNo: "AMG A-78",
|
||||
// postVoice: "دعوة للتطعيم",
|
||||
// lang: "ar",
|
||||
// flutterTts: flutterTts,
|
||||
// );
|
||||
// await voiceCaller!.startCalling(true);
|
||||
// }
|
||||
|
||||
voiceCallPatientTicket(PatientTicketModel patientTicket, String calledFrom) async {
|
||||
logger.i("voiceCallPatientTicket calledFrom : $calledFrom");
|
||||
|
||||
currentPatient = patientTicket;
|
||||
isCallingInProgress = true;
|
||||
logger.i("Setting isCallingInProgress : $isCallingInProgress");
|
||||
|
||||
logger.i("isVoiceReq: ${patientTicket.isVoiceReq}");
|
||||
logger.i("voiceCaller: ${voiceCaller == null}");
|
||||
logger.i("isQueue: ${patientTicket.isQueue}");
|
||||
logger.i("isToneReq: ${patientTicket.isToneReq}");
|
||||
|
||||
if (patientTicket.isToneReq && !patientTicket.isQueue) {
|
||||
audioPlayer.setAsset("assets/tones/call_tone.mp3");
|
||||
await audioPlayer.play();
|
||||
await Future.delayed(const Duration(seconds: 2));
|
||||
}
|
||||
|
||||
if (patientTicket.isVoiceReq && voiceCaller == null && !patientTicket.isQueue) {
|
||||
logger.i("patientTicket.voiceLanguage: ${patientTicket.voiceLanguage}");
|
||||
final postVoice = getCallTypeText(patientTicket);
|
||||
voiceCaller = CallByVoice(
|
||||
preVoice: patientTicket.ticketNoText,
|
||||
ticketNo: patientTicket.queueNo.trim().toString(),
|
||||
postVoice: postVoice,
|
||||
lang: patientTicket.voiceLanguage == 1 ? "en" : "ar",
|
||||
flutterTts: flutterTts,
|
||||
);
|
||||
await voiceCaller!.startCalling(patientTicket.queueNo.trim().toString() != patientTicket.callNoStr.trim().toString()).whenComplete(() {
|
||||
voiceCaller = null;
|
||||
onVoiceCompleted();
|
||||
logger.i("Completed Calling!! ${isQueuePatients.length}");
|
||||
});
|
||||
} else {
|
||||
isCallingInProgress = false;
|
||||
logger.i("Setting isCallingInProgress : $isCallingInProgress");
|
||||
if (isApiCallNeeded) {
|
||||
Timer(Duration(seconds: patientCallConfigurations.concurrentCallDelaySec), () async {
|
||||
await callPatientsAPI();
|
||||
isApiCallNeeded = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> listenAudioPlayerEvents() async {
|
||||
audioPlayer.playerStateStream.listen((playerState) async {
|
||||
if (playerState.processingState == ProcessingState.completed) {
|
||||
logger.i("Tone Completed");
|
||||
|
||||
if (currentPatient.isVoiceReq) {
|
||||
isCallingInProgress = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (isQueuePatients.isNotEmpty) {
|
||||
isCallingInProgress = true;
|
||||
|
||||
logger.i("isQueuePatients.length 1: ${isQueuePatients.length}");
|
||||
// for (int i = 0; i < length; i++) {
|
||||
await Future.delayed(Duration(seconds: patientCallConfigurations.concurrentCallDelaySec)).whenComplete(() async {
|
||||
PatientTicketModel temp = PatientTicketModel();
|
||||
if (patientTickets.isNotEmpty && isQueuePatients.length > 1) {
|
||||
temp = patientTickets.elementAt(0);
|
||||
patientTickets.removeAt(0);
|
||||
}
|
||||
notifyListeners();
|
||||
if (isQueuePatients.isNotEmpty) {
|
||||
isQueuePatients.removeAt(0);
|
||||
}
|
||||
if (patientTickets.isNotEmpty && isQueuePatients.length > 1) {
|
||||
patientTickets.add(temp);
|
||||
}
|
||||
notifyListeners();
|
||||
logger.i("isQueuePatients.length 2: ${isQueuePatients.length}");
|
||||
|
||||
if (isQueuePatients.isNotEmpty) {
|
||||
await voiceCallPatientTicket(patientTickets.first, "listenAudioPlayerEvents");
|
||||
updatePatientTicket(patientTickets.first);
|
||||
}
|
||||
});
|
||||
// }
|
||||
}
|
||||
if (isQueuePatients.isEmpty) {
|
||||
isCallingInProgress = false;
|
||||
}
|
||||
if (isApiCallNeeded && isQueuePatients.isEmpty) {
|
||||
logger.i("Setting isCallingInProgress : $isCallingInProgress");
|
||||
Timer(Duration(seconds: patientCallConfigurations.concurrentCallDelaySec), () async {
|
||||
await callPatientsAPI();
|
||||
isApiCallNeeded = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// updatePatientTickets() {
|
||||
// if (patientTickets.isNotEmpty) {
|
||||
// List<Tickets> _ticketsToUpdate = patientTickets.where((t) => t.callUpdated == false).toList();
|
||||
// API.callUpdateNotIsQueueRecordByIDAsync(currentDeviceIp, ticket: _ticketsToUpdate.first, onSuccess: (ticketsUpdated) {
|
||||
// logger.i("[${ticketsUpdated.length}] Tickets Updated: $ticketsUpdated");
|
||||
// }, onFailure: (e) {
|
||||
// logger.i(" Tickets Update Failed with : ${e.toString()}");
|
||||
// });
|
||||
// }
|
||||
// }
|
||||
|
||||
updatePatientTicket(PatientTicketModel patientTicket) {
|
||||
if (!patientTicket.isQueue) {
|
||||
API.callUpdateNotIsQueueRecordByIDAsync(currentDeviceIp, ticket: patientTicket, onSuccess: (ticketsUpdated) {
|
||||
logger.i("[${patientTicket.callNoStr}] Ticket Updated: $ticketsUpdated");
|
||||
}, onFailure: (e) {
|
||||
logger.i(" Tickets Update ${patientTicket.callNoStr} Failed with Error : ${e.toString()}");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
onConnect() {
|
||||
logger.i("SignalR: onConnect");
|
||||
}
|
||||
|
||||
onDisconnect(exception) {
|
||||
logger.i("SignalR: onDisconnect");
|
||||
signalRHelper.startSignalRConnection(
|
||||
currentDeviceIp,
|
||||
onUpdateAvailable: onPingReceived,
|
||||
onConnect: onConnect,
|
||||
onConnecting: onConnecting,
|
||||
onDisconnect: onDisconnect,
|
||||
);
|
||||
}
|
||||
|
||||
onConnecting() {
|
||||
logger.i("SignalR: onConnecting");
|
||||
}
|
||||
|
||||
listenNetworkConnectivity() async {
|
||||
Connectivity().onConnectivityChanged.listen((List<ConnectivityResult> event) async {
|
||||
switch (event.first) {
|
||||
case ConnectivityResult.wifi:
|
||||
case ConnectivityResult.ethernet:
|
||||
updateInternetConnection(true);
|
||||
await getCurrentIP();
|
||||
if (signalRHelper.connection != null) {
|
||||
if (signalRHelper.connection!.state != HubConnectionState.connected) signalRHelper.connection!.start();
|
||||
}
|
||||
break;
|
||||
case ConnectivityResult.none:
|
||||
updateInternetConnection(false);
|
||||
signalRHelper.closeConnection();
|
||||
break;
|
||||
case ConnectivityResult.mobile:
|
||||
break;
|
||||
case ConnectivityResult.bluetooth:
|
||||
// TODO: Handle this case.
|
||||
break;
|
||||
// TODO: Handle this case.
|
||||
case ConnectivityResult.vpn:
|
||||
// TODO: Handle this case.
|
||||
break;
|
||||
case ConnectivityResult.other:
|
||||
// TODO: Handle this case.
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//SHARED PREFERENCE HANDLING
|
||||
|
||||
DateTime currentLastTimeUpdated = DateTime.now();
|
||||
|
||||
Future<String?> getLastTimeUpdatedFromCache() async {
|
||||
final SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||
|
||||
if (prefs.containsKey("lastTimeUpdated")) {
|
||||
String? lastTimeUpdated = prefs.getString("lastTimeUpdated");
|
||||
currentLastTimeUpdated = DateTime.fromMillisecondsSinceEpoch(int.parse(lastTimeUpdated!));
|
||||
return lastTimeUpdated;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> setLastTimeUpdatedInCache({required String lasTimeUpdated}) async {
|
||||
final SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||
await prefs.setString("lastTimeUpdated", lasTimeUpdated);
|
||||
}
|
||||
}
|
||||
@ -1,32 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:queuing_system/core/config/size_config.dart';
|
||||
import 'package:queuing_system/home/que_item/que_item.dart';
|
||||
|
||||
class FirstColumn extends StatelessWidget {
|
||||
final bool have3Patient;
|
||||
final bool have2Patient;
|
||||
|
||||
const FirstColumn({Key key, this.have3Patient = false, this.have2Patient = false}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
const TicketItem(queNo: "OBG-T45", isFirstLine: true, isNurseVisit: true, haveListOfPatient: true,),
|
||||
SizedBox(
|
||||
height: SizeConfig.getHeightMultiplier() * 5,),
|
||||
if(have3Patient ||have2Patient )
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
children: [
|
||||
if(have2Patient || have3Patient)
|
||||
const TicketItem(queNo: "OBG-T45", isSecondLine: true, isNurseVisit: false, haveListOfPatient: true,),
|
||||
if(have3Patient)
|
||||
const TicketItem(queNo: "OBG-T45", isSecondLine: true, isNurseVisit: true, haveListOfPatient: true,),
|
||||
],
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -1,289 +1,174 @@
|
||||
import 'dart:async';
|
||||
import 'dart:developer';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:connectivity/connectivity.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:just_audio/just_audio.dart';
|
||||
import 'package:queuing_system/core/api.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:queuing_system/core/base/app_scaffold_widget.dart';
|
||||
import 'package:queuing_system/core/config/config.dart';
|
||||
import 'package:queuing_system/core/config/size_config.dart';
|
||||
import 'package:queuing_system/core/response_model/patient_call.dart';
|
||||
import 'package:queuing_system/core/response_models/call_config_model.dart';
|
||||
import 'package:queuing_system/footer/app_footer.dart';
|
||||
import 'package:queuing_system/header/app_header.dart';
|
||||
import 'package:queuing_system/home/home_screen_components.dart';
|
||||
import 'package:queuing_system/utils/call_by_voice.dart';
|
||||
import 'package:queuing_system/utils/call_type.dart';
|
||||
import 'package:queuing_system/utils/signalR_utils.dart';
|
||||
import 'package:queuing_system/utils/utils.dart';
|
||||
import 'package:queuing_system/home/app_provider.dart';
|
||||
import 'package:queuing_system/home/priority_calls_components.dart';
|
||||
import 'package:queuing_system/widget/data_display/app_texts_widget.dart';
|
||||
|
||||
var deviceIPGlobal = "10.10.15.11"; // Testing IP
|
||||
class MyHomePage extends StatelessWidget {
|
||||
const MyHomePage({Key? key}) : super(key: key);
|
||||
|
||||
// var DEVICE_IP = "10.10.14.11"; // Testing IP
|
||||
// var DEVICE_IP = "10.10.15.11";
|
||||
|
||||
// var DEVICE_IP = "10.70.249.21"; // (Make sure by Haroon before use it) Production IP
|
||||
|
||||
class MyHomePage extends StatefulWidget {
|
||||
final String title = "MyHomePage";
|
||||
|
||||
const MyHomePage({Key key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<MyHomePage> createState() => _MyHomePageState();
|
||||
}
|
||||
|
||||
class _MyHomePageState extends State<MyHomePage> {
|
||||
SignalRHelper signalRHelper = SignalRHelper();
|
||||
|
||||
List<Tickets> waitings = [];
|
||||
List<Tickets> isQueuePatients = [];
|
||||
|
||||
bool isLoading = false;
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
Future<String> getCurrentIP() async {
|
||||
for (var interface in await NetworkInterface.list(type: InternetAddressType.IPv4)) {
|
||||
log("interfaces: ${interface.name}");
|
||||
if (interface.name == "eth0") {
|
||||
for (var address in interface.addresses) {
|
||||
deviceIPGlobal = address.address;
|
||||
return deviceIPGlobal;
|
||||
}
|
||||
getWeatherWidget() {
|
||||
return Consumer(builder: (BuildContext context, AppProvider appProvider, Widget? child) {
|
||||
if (appProvider.currentWeathersWidgetModel.maxTemp == null || appProvider.currentWeathersWidgetModel.minTemp == null || appProvider.currentWeathersWidgetModel.iconPhrase == null) {
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
return "";
|
||||
}
|
||||
return "";
|
||||
return Container(
|
||||
height: (appProvider.currentScreenRotation == ScreenOrientationEnum.portraitUp || appProvider.currentScreenRotation == ScreenOrientationEnum.portraitDown) ? SizeConfig.getHeightMultiplier() * 8 : SizeConfig.getHeightMultiplier() * 5,
|
||||
padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 10),
|
||||
decoration: AppGlobal.configWidgetDecoration,
|
||||
child: Directionality(
|
||||
textDirection: appProvider.patientCallConfigurations.textDirection,
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
AppText(
|
||||
appProvider.patientCallConfigurations.weatherText,
|
||||
color: Colors.grey,
|
||||
fontSize: SizeConfig.getWidthMultiplier() * 1.5,
|
||||
),
|
||||
AppText(
|
||||
// "Max: 40C , Min: 38C",
|
||||
"${appProvider.patientCallConfigurations.maxText}: ${appProvider.currentWeathersWidgetModel.maxTemp}°C , ${appProvider.patientCallConfigurations.minText}: ${appProvider.currentWeathersWidgetModel.minTemp}°C",
|
||||
fontSize: SizeConfig.getHeightMultiplier() * 1.3,
|
||||
fontHeight: 1,
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(width: 15),
|
||||
SvgPicture.asset(
|
||||
appProvider.currentWeathersWidgetModel.weatherIconPath ?? AppGlobal.weatherIcon,
|
||||
height: SizeConfig.getHeightMultiplier() * 3,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
listenNetworkConnectivity();
|
||||
scheduleMicrotask(() async {
|
||||
if (!signalRHelper.getConnectionState()) {
|
||||
signalRHelper.startSignalRConnection(await getCurrentIP(), onUpdateAvailable: onUpdateAvailable, onConnect: onConnect, onConnecting: onConnecting, onDisconnect: onDisconnect);
|
||||
getPrayerWidget() {
|
||||
return Consumer(builder: (BuildContext context, AppProvider appProvider, Widget? child) {
|
||||
if (appProvider.nextPrayerToShowWithTime.isEmpty) {
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
return Container(
|
||||
height: (appProvider.currentScreenRotation == ScreenOrientationEnum.portraitUp || appProvider.currentScreenRotation == ScreenOrientationEnum.portraitDown) ? SizeConfig.getHeightMultiplier() * 8 : SizeConfig.getHeightMultiplier() * 5,
|
||||
padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 10),
|
||||
decoration: AppGlobal.configWidgetDecoration,
|
||||
child: Directionality(
|
||||
textDirection: appProvider.patientCallConfigurations.textDirection,
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
AppText(
|
||||
appProvider.patientCallConfigurations.nextPrayerText,
|
||||
color: Colors.grey,
|
||||
fontSize: SizeConfig.getWidthMultiplier() * 1.5,
|
||||
),
|
||||
AppText(
|
||||
appProvider.nextPrayerToShowWithTime,
|
||||
fontSize: SizeConfig.getHeightMultiplier() * 1.3,
|
||||
fontHeight: 1,
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(width: 15),
|
||||
SvgPicture.asset(
|
||||
AppGlobal.mosqueIcon,
|
||||
height: SizeConfig.getHeightMultiplier() * 3,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
super.initState();
|
||||
getBody(AppProvider appProvider, context) {
|
||||
return Column(
|
||||
children: [
|
||||
const SizedBox(height: 12),
|
||||
Expanded(
|
||||
flex: 1,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 40),
|
||||
child: Row(
|
||||
children: [
|
||||
getWeatherWidget(),
|
||||
const SizedBox(width: 35),
|
||||
getPrayerWidget(),
|
||||
],
|
||||
),
|
||||
)),
|
||||
const SizedBox(height: 20),
|
||||
Expanded(
|
||||
flex: 9,
|
||||
child: dataContent(appProvider: appProvider, context: context),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
TextEditingController controller = TextEditingController();
|
||||
int getTurnsByOrientation(ScreenOrientationEnum screenOrientationEnum) {
|
||||
switch (screenOrientationEnum) {
|
||||
case ScreenOrientationEnum.portraitUp:
|
||||
return 0;
|
||||
case ScreenOrientationEnum.portraitDown:
|
||||
return 2;
|
||||
case ScreenOrientationEnum.landscapeRight:
|
||||
return 1;
|
||||
case ScreenOrientationEnum.landscapeLeft:
|
||||
return 3;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return AppScaffold(
|
||||
appBar: AppHeader(),
|
||||
body: content(),
|
||||
bottomNavigationBar: Container(
|
||||
color: Colors.grey.withOpacity(0.1),
|
||||
height: Utils.getHeight(),
|
||||
width: double.infinity,
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
const SizedBox(width: 20),
|
||||
Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
AppText(
|
||||
"Powered By",
|
||||
fontSize: SizeConfig.getWidthMultiplier() * 2.6,
|
||||
fontFamily: 'Poppins-Medium.ttf',
|
||||
),
|
||||
Text(deviceIPGlobal, style: TextStyle(fontWeight: FontWeight.w500, fontSize: SizeConfig.getWidthMultiplier() * 2.2)),
|
||||
],
|
||||
),
|
||||
const SizedBox(width: 10),
|
||||
Image.asset(
|
||||
"assets/images/cloud_logo.png",
|
||||
height: SizeConfig.getHeightMultiplier() * 4,
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
final appProvider = context.watch<AppProvider>();
|
||||
log(appProvider.currentScreenRotation.toString());
|
||||
// appProvider.isCallingInProgress = false;
|
||||
return RotatedBox(
|
||||
// quarterTurns: 3,
|
||||
quarterTurns: getTurnsByOrientation(appProvider.currentScreenRotation),
|
||||
child: AppScaffold(
|
||||
appProvider: appProvider,
|
||||
appBar: const AppHeader(),
|
||||
body: getBody(appProvider, context),
|
||||
bottomNavigationBar: const AppFooter(),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
onUpdateIPPressed() async {
|
||||
// if (controller.text.isNotEmpty) {
|
||||
// isLoading = true;
|
||||
// setState(() {});
|
||||
// DEVICE_IP = controller.text;
|
||||
//
|
||||
// await signalRHelper.connection.stop();
|
||||
// if (!signalRHelper.getConnectionState()) {
|
||||
// await signalRHelper.startSignalRConnection(DEVICE_IP, onUpdateAvailable: onUpdateAvailable, onConnect: onConnect, onConnecting: onConnecting, onDisconnect: onDisconnect);
|
||||
// }
|
||||
//
|
||||
// controller.clear();
|
||||
// waitings.clear();
|
||||
// isLoading = false;
|
||||
// setState(() {});
|
||||
// }
|
||||
}
|
||||
|
||||
Widget content() {
|
||||
// waitings.removeAt(0);
|
||||
// waitings = waitings.sublist(0,3);
|
||||
voiceCall();
|
||||
|
||||
if (waitings.isEmpty) {
|
||||
Widget dataContent({required AppProvider appProvider, required BuildContext context}) {
|
||||
log("isCallingInProgress from HomeScreen: ${appProvider.isCallingInProgress}");
|
||||
// appProvider.voiceCallPatientTicket(appProvider.patientTickets.first);
|
||||
// appProvider.testCalling();
|
||||
if (appProvider.patientTickets.isEmpty) {
|
||||
// No Patient in Queue
|
||||
return noPatientInQueue();
|
||||
} else if (waitings.length > 3) {
|
||||
return noPatientInQueue(screenOrientationEnum: appProvider.currentScreenRotation);
|
||||
} else if (appProvider.patientTickets.length > 3) {
|
||||
// Return Content With Side List
|
||||
return priorityTicketsWithSideList(waitings);
|
||||
return priorityTicketsWithSideList(tickets: appProvider.patientTickets, callConfig: appProvider.patientCallConfigurations, context: context);
|
||||
} else {
|
||||
// Return Content In Center Aligned
|
||||
return priorityTickets(waitings);
|
||||
return PriorityTickets(tickets: appProvider.patientTickets, callConfig: appProvider.patientCallConfigurations);
|
||||
}
|
||||
}
|
||||
|
||||
String getCallTypeText(Tickets ticket) {
|
||||
final callType = ticket.getCallType();
|
||||
switch (callType) {
|
||||
case CallType.RECEPTION:
|
||||
return "Please Visit Doctor";
|
||||
break;
|
||||
case CallType.NURSE:
|
||||
return "Please Visit Nurse";
|
||||
break;
|
||||
case CallType.DOCTOR:
|
||||
return "Please Visit Doctor";
|
||||
break;
|
||||
case CallType.NONE:
|
||||
return "";
|
||||
break;
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
CallByVoice voiceCaller;
|
||||
final AudioPlayer audioPlayer = AudioPlayer();
|
||||
int callFlag = 0;
|
||||
|
||||
voiceCall() async {
|
||||
//DONE: After calling this voice call, we should delay for milliseconds that is given by API. After that we will check if there are more patients in isQueuePatients we will remove the patient from waiting list and then update the state
|
||||
|
||||
if (waitings.isNotEmpty) {
|
||||
if (waitings.first.isToneReq) {
|
||||
audioPlayer.setAsset("assets/tones/call_tone.mp3");
|
||||
await audioPlayer.play();
|
||||
await Future.delayed(const Duration(seconds: 2));
|
||||
}
|
||||
if (waitings.first.isVoiceReq && voiceCaller == null) {
|
||||
final postVoice = getCallTypeText(waitings.first);
|
||||
voiceCaller = CallByVoice(waitings.first.queueNo.trim().toString(), preVoice: "Ticket Number", postVoice: postVoice, lang: 'en');
|
||||
await voiceCaller.startCalling(waitings.first.queueNo.trim().toString() != waitings.first.callNoStr.trim().toString());
|
||||
voiceCaller = null;
|
||||
}
|
||||
}
|
||||
if (isQueuePatients.isNotEmpty) {
|
||||
await Future.delayed(Duration(milliseconds: int.parse(isQueuePatients.first.queueDuration) * 10)).whenComplete(() async {
|
||||
if (isQueuePatients.isNotEmpty) {
|
||||
isQueuePatients.removeAt(0);
|
||||
}
|
||||
if (waitings.isNotEmpty) {
|
||||
Tickets ticket = waitings.elementAt(0);
|
||||
waitings.removeAt(0);
|
||||
waitings.add(ticket);
|
||||
}
|
||||
if (isQueuePatients.isNotEmpty) {
|
||||
setState(() {});
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// if (isQueuePatients.isEmpty && callFlag == 1) {
|
||||
// callFlag == 0;
|
||||
// await Future.delayed(const Duration(seconds: 3));
|
||||
// waitings.clear();
|
||||
// API.getCallRequestInfoByClinicInfo(DEVICE_IP, onSuccess: (waitingCalls, isQueuePatientsCalls) {
|
||||
// setState(() {
|
||||
// waitings = waitingCalls;
|
||||
// isQueuePatients = isQueuePatientsCalls;
|
||||
// // currents = currentInClinic;
|
||||
// });
|
||||
//
|
||||
// log("--------------------");
|
||||
// log("waiting: $waitings");
|
||||
// log("isQueuePatients: $isQueuePatients");
|
||||
// log("--------------------");
|
||||
//
|
||||
// updateTickets();
|
||||
// }, onFailure: (error) {});
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
onUpdateAvailable(data) async {
|
||||
if (isQueuePatients.isNotEmpty && callFlag == 0) {
|
||||
callFlag = 1;
|
||||
return;
|
||||
}
|
||||
waitings.clear();
|
||||
API.getCallRequestInfoByClinicInfo(deviceIPGlobal, onSuccess: (waitingCalls, isQueuePatientsCalls) {
|
||||
setState(() {
|
||||
waitings = waitingCalls;
|
||||
isQueuePatients = isQueuePatientsCalls;
|
||||
// currents = currentInClinic;
|
||||
});
|
||||
|
||||
log("--------------------");
|
||||
log("waiting: $waitings");
|
||||
log("isQueuePatients: $isQueuePatients");
|
||||
log("--------------------");
|
||||
|
||||
updateTickets();
|
||||
}, onFailure: (error) {});
|
||||
}
|
||||
|
||||
updateTickets() {
|
||||
if (waitings != null && waitings.isNotEmpty) {
|
||||
List<Tickets> _ticketsToUpdate = waitings.where((t) => t.callUpdated == false).toList();
|
||||
API.callUpdateNotIsQueueRecordByIDAsync(deviceIPGlobal, ticket: _ticketsToUpdate.first, onSuccess: (tickets_updated) {
|
||||
log("[${tickets_updated.length}] Tickets Updated: $tickets_updated");
|
||||
}, onFailure: (e) {
|
||||
log("API UPDate Tickets Failed with : ${e.toString()}");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
onConnect() {
|
||||
log("SignalR: onConnect");
|
||||
}
|
||||
|
||||
onDisconnect(exception) {
|
||||
log("SignalR: onDisconnect");
|
||||
signalRHelper.startSignalRConnection(deviceIPGlobal, onUpdateAvailable: onUpdateAvailable, onConnect: onConnect, onConnecting: onConnecting, onDisconnect: onDisconnect);
|
||||
}
|
||||
|
||||
onConnecting() {
|
||||
log("SignalR: onConnecting");
|
||||
}
|
||||
|
||||
listenNetworkConnectivity() async {
|
||||
Connectivity().onConnectivityChanged.listen((event) {
|
||||
switch (event) {
|
||||
case ConnectivityResult.wifi:
|
||||
signalRHelper.connection.start();
|
||||
break;
|
||||
case ConnectivityResult.none:
|
||||
signalRHelper.closeConnection(context);
|
||||
break;
|
||||
case ConnectivityResult.mobile:
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,205 +0,0 @@
|
||||
// import 'dart:async';
|
||||
// import 'package:flutter/material.dart';
|
||||
// import 'package:queuing_system/core/api.dart';
|
||||
// import 'package:queuing_system/core/base/app_scaffold_widget.dart';
|
||||
// import 'package:queuing_system/core/base/base_app_client.dart';
|
||||
// import 'package:queuing_system/core/config/config.dart';
|
||||
// import 'package:queuing_system/core/config/size_config.dart';
|
||||
// import 'package:queuing_system/header/app_header.dart';
|
||||
// import 'package:queuing_system/home/que_item_list.dart';
|
||||
// import 'package:queuing_system/utils/signalR_utils.dart';
|
||||
// import 'package:queuing_system/utils/utils.dart';
|
||||
// import 'package:queuing_system/widget/data_display/app_texts_widget.dart';
|
||||
// import 'first_column.dart';
|
||||
//
|
||||
//
|
||||
// var DEVICE_IP = "10.70.249.21";
|
||||
//
|
||||
// class MyHomePage extends StatefulWidget {
|
||||
// String title = "MyHomePage";
|
||||
// bool have0Patient = true;
|
||||
// bool have1Patient = false;
|
||||
// bool have2Patient = false;
|
||||
// bool have3Patient = false;
|
||||
// bool haveListOfPatient = false;
|
||||
//
|
||||
// @override
|
||||
// State<MyHomePage> createState() => _MyHomePageState();
|
||||
// }
|
||||
//
|
||||
// class _MyHomePageState extends State<MyHomePage> {
|
||||
// Timer _timer;
|
||||
// int remainingTime = 30;
|
||||
//
|
||||
// @override
|
||||
// void dispose() {
|
||||
// _timer.cancel();
|
||||
// super.dispose();
|
||||
// }
|
||||
//
|
||||
// startTimer() {
|
||||
// Timer.periodic(const Duration(seconds: 1), (timer) {
|
||||
// if (remainingTime == 0) {
|
||||
// setState(() {
|
||||
// remainingTime = 30;
|
||||
// });
|
||||
// } else {
|
||||
// setState(() {
|
||||
// remainingTime--;
|
||||
// if (remainingTime > 25) {
|
||||
//
|
||||
// /// for 0 patinet
|
||||
// widget.have0Patient = true;
|
||||
// widget.have1Patient = false;
|
||||
// widget.have2Patient = false;
|
||||
// widget.have3Patient = false;
|
||||
// widget.haveListOfPatient = false;
|
||||
// } else if (remainingTime > 20) {
|
||||
// /// for 1 patinet
|
||||
//
|
||||
// widget.have0Patient = false;
|
||||
// widget.have1Patient = true;
|
||||
// widget.have2Patient = false;
|
||||
// widget.have3Patient = false;
|
||||
// widget.haveListOfPatient = false;
|
||||
// } else if (remainingTime > 15) {
|
||||
//
|
||||
// /// for 2 patinet
|
||||
//
|
||||
// widget.have0Patient = false;
|
||||
// widget.have1Patient = false;
|
||||
// widget.have2Patient = true;
|
||||
// widget.have3Patient = false;
|
||||
// widget.haveListOfPatient = false;
|
||||
// } else if (remainingTime > 10) {
|
||||
// /// for 3 only patinet
|
||||
// widget.have0Patient = false;
|
||||
// widget.have1Patient = false;
|
||||
// widget.have2Patient = false;
|
||||
// widget.have3Patient = true;
|
||||
// widget.haveListOfPatient = false;
|
||||
// } else {
|
||||
// /// for 3+ only patinet
|
||||
//
|
||||
// widget.have0Patient = false;
|
||||
// widget.have1Patient = false;
|
||||
// widget.have2Patient = false;
|
||||
// widget.have3Patient = true;
|
||||
// widget.haveListOfPatient = true;
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
//
|
||||
// @override
|
||||
// void initState() {
|
||||
// startTimer();
|
||||
// // Get Ticket Info
|
||||
// // http://10.200.204.11:2222/Services/Nurses.svc/REST/GetCallRequestInfoByClinincInfo
|
||||
//
|
||||
// SignalRHelper signalRHelper = SignalRHelper();
|
||||
// if (!signalRHelper.getConnectionState()) {
|
||||
// signalRHelper.startSignalRConnection(DEVICE_IP, onUpdateAvailable: onUpdateAvailable);
|
||||
// }
|
||||
// super.initState();
|
||||
// }
|
||||
//
|
||||
// @override
|
||||
// Widget build(BuildContext context) {
|
||||
//
|
||||
//
|
||||
// return AppScaffold(
|
||||
// appBar: AppHeader(),
|
||||
// body: Column(
|
||||
// children: [
|
||||
// SizedBox(
|
||||
// height: SizeConfig.getHeightMultiplier() *
|
||||
// (widget.haveListOfPatient
|
||||
// ? 2
|
||||
// : widget.have1Patient || widget.have0Patient
|
||||
// ? 20
|
||||
// : 10)),
|
||||
// widget.have0Patient
|
||||
// ? Column(
|
||||
// mainAxisAlignment: MainAxisAlignment.center,
|
||||
// children: [
|
||||
// Center(
|
||||
// child: AppText("Awaiting Patients Arrival",
|
||||
// fontFamily: 'Poppins-SemiBold.ttf',
|
||||
// fontSize: SizeConfig.getWidthMultiplier() * 9),
|
||||
// ),
|
||||
// ],
|
||||
// )
|
||||
// : widget.haveListOfPatient
|
||||
// ? Row(
|
||||
// children: [
|
||||
// FirstColumn(
|
||||
// have3Patient: widget.have3Patient,
|
||||
// have2Patient: widget.have2Patient,
|
||||
// ),
|
||||
// const SizedBox(
|
||||
// width: 40,
|
||||
// ),
|
||||
// if (widget.haveListOfPatient)
|
||||
// Container(
|
||||
// width: 10,
|
||||
// height: SizeConfig.getHeightMultiplier() * 40,
|
||||
// color: AppGlobal.appLightGreyColor,
|
||||
// ),
|
||||
// if (widget.haveListOfPatient)
|
||||
// const SizedBox(
|
||||
// width: 40,
|
||||
// ),
|
||||
// if (widget.haveListOfPatient) const QueItemList()
|
||||
// ],
|
||||
// )
|
||||
// : FirstColumn(
|
||||
// have3Patient: widget.have3Patient,
|
||||
// have2Patient: widget.have2Patient,
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// bottomSheet: Container(
|
||||
// color: Colors.transparent,
|
||||
// height: Utils.getHeight(),
|
||||
// width: double.infinity,
|
||||
// child: Row(
|
||||
// children: [
|
||||
// Padding(
|
||||
// padding: const EdgeInsets.only(top: 30, left: 30),
|
||||
// child: AppText(
|
||||
// "Powered By",
|
||||
// fontSize: SizeConfig.getWidthMultiplier() * 2.6,
|
||||
// fontFamily: 'Poppins-Medium.ttf',
|
||||
// ),
|
||||
// ),
|
||||
// Padding(
|
||||
// padding: const EdgeInsets.only(top: 40, left: 18),
|
||||
// child: Image.asset(
|
||||
// "assets/images/cloud_logo.png",
|
||||
// height: SizeConfig.getHeightMultiplier() * 6,
|
||||
// ),
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// ), // This trailing comma makes auto-formatting nicer for build methods.
|
||||
// );
|
||||
// }
|
||||
//
|
||||
//
|
||||
// onUpdateAvailable(data) async{
|
||||
// API.GetCallRequestInfoByClinincInfo(
|
||||
// DEVICE_IP,
|
||||
// onSuccess: (waitingCalls, currentInClinic){
|
||||
// print("\n\n");
|
||||
// print("--------------------");
|
||||
// print("Current: $currentInClinic");
|
||||
// print("Waiting: $waitingCalls");
|
||||
// print("--------------------");
|
||||
// print("\n\n");
|
||||
// }, onFailure: (error){
|
||||
//
|
||||
// });
|
||||
// }
|
||||
// }
|
||||
@ -1,98 +0,0 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:queuing_system/core/config/size_config.dart';
|
||||
import 'package:queuing_system/core/response_model/patient_call.dart';
|
||||
import 'package:queuing_system/home/priority_calls.dart';
|
||||
import 'package:queuing_system/utils/call_type.dart';
|
||||
import 'package:queuing_system/widget/data_display/app_texts_widget.dart';
|
||||
|
||||
Widget noPatientInQueue() {
|
||||
return Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Center(
|
||||
child: AppText("Awaiting Patients Arrival", fontFamily: 'Poppins-SemiBold.ttf', fontSize: SizeConfig.getWidthMultiplier() * 9),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Widget priorityTickets(List<Tickets> tickets) {
|
||||
return PriorityTickets(tickets);
|
||||
}
|
||||
|
||||
Widget priorityTicketsWithSideList(List<Tickets> tickets) {
|
||||
final priorityTickets = tickets.sublist(0, 3);
|
||||
final otherTickets = tickets.sublist(3, tickets.length);
|
||||
return Row(
|
||||
children: [
|
||||
Expanded(flex: 4, child: PriorityTickets(priorityTickets)),
|
||||
Container(color: Colors.grey.withOpacity(0.1), width: 10, margin: const EdgeInsets.symmetric(horizontal: 10, vertical: 50)),
|
||||
Expanded(
|
||||
flex: 4,
|
||||
child: ListView.builder(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 50),
|
||||
itemCount: otherTickets.length,
|
||||
itemBuilder: (ctx, idx) {
|
||||
final itm = otherTickets[idx];
|
||||
|
||||
return Padding(
|
||||
padding: const EdgeInsets.all(8),
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
SizedBox(
|
||||
width: SizeConfig.getWidthMultiplier() * 21,
|
||||
child: AppText(
|
||||
itm.queueNo.toString(),
|
||||
letterSpacing: -2,
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: SizeConfig.getWidthMultiplier() * 4,
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 5),
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
SizedBox(
|
||||
width: SizeConfig.getWidthMultiplier() * 3.3,
|
||||
child: itm.getCallType().icon(SizeConfig.getHeightMultiplier() * 2.5),
|
||||
),
|
||||
const SizedBox(width: 10),
|
||||
SizedBox(
|
||||
width: SizeConfig.getWidthMultiplier() * 28,
|
||||
child: AppText(
|
||||
itm.getCallType().message('en'),
|
||||
color: itm.getCallType().color(),
|
||||
letterSpacing: -1.5,
|
||||
fontSize: SizeConfig.getWidthMultiplier() * 3.3,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontHeight: 0.5,
|
||||
),
|
||||
),
|
||||
Container(
|
||||
color: Colors.grey.withOpacity(0.3),
|
||||
width: 6,
|
||||
height: SizeConfig.getHeightMultiplier() * 3,
|
||||
margin: const EdgeInsets.symmetric(horizontal: 10),
|
||||
),
|
||||
AppText(
|
||||
"Room: ${itm.roomNo}",
|
||||
color: itm.getCallType().color(),
|
||||
letterSpacing: -1.5,
|
||||
fontSize: SizeConfig.getWidthMultiplier() * 3.3,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontHeight: 0.5,
|
||||
),
|
||||
],
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
@ -1,134 +0,0 @@
|
||||
import 'package:blinking_text/blinking_text.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:queuing_system/core/config/size_config.dart';
|
||||
import 'package:queuing_system/core/response_model/patient_call.dart';
|
||||
import 'package:queuing_system/utils/call_type.dart';
|
||||
import 'package:queuing_system/widget/data_display/app_texts_widget.dart';
|
||||
|
||||
class PriorityTickets extends StatelessWidget {
|
||||
final List<Tickets> tickets;
|
||||
|
||||
const PriorityTickets(this.tickets, {Key key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final firstTicket = tickets[0];
|
||||
final otherTickets = tickets.sublist(1, tickets.length);
|
||||
|
||||
return Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
const SizedBox(height: 20),
|
||||
TicketItem(
|
||||
ticketNo: firstTicket.queueNo ?? '',
|
||||
callType: firstTicket.getCallType(),
|
||||
scale: 1,
|
||||
blink: true,
|
||||
roomNo: firstTicket.roomNo,
|
||||
isClinicAdded: firstTicket.callNoStr != firstTicket.queueNo,
|
||||
),
|
||||
const SizedBox(height: 40),
|
||||
if (tickets.length > 1) ...[
|
||||
SizedBox(height: SizeConfig.getHeightMultiplier() * 1.5),
|
||||
Column(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
children: otherTickets
|
||||
.map((ticket) => Padding(
|
||||
padding: EdgeInsets.only(top: SizeConfig.getHeightMultiplier() * 2),
|
||||
child: TicketItem(
|
||||
ticketNo: ticket.queueNo ?? '',
|
||||
callType: ticket.getCallType(),
|
||||
scale: 0.7,
|
||||
roomNo: ticket.roomNo,
|
||||
isClinicAdded: ticket.callNoStr != ticket.queueNo,
|
||||
),
|
||||
))
|
||||
.toList(),
|
||||
)
|
||||
]
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class TicketItem extends StatelessWidget {
|
||||
final String ticketNo;
|
||||
final String roomNo;
|
||||
final CallType callType;
|
||||
final bool blink;
|
||||
final double scale;
|
||||
final bool isClinicAdded;
|
||||
|
||||
const TicketItem({Key key, @required this.isClinicAdded, @required this.ticketNo, @required this.roomNo, @required this.callType, this.scale, this.blink = false}) : super(key: key);
|
||||
|
||||
String getFormattedTicket(String ticketNo, bool isClinicAdded) {
|
||||
if (isClinicAdded) {
|
||||
var formattedString = ticketNo.split(" ");
|
||||
return formattedString[0] + " " + formattedString[1];
|
||||
}
|
||||
return ticketNo;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Transform.scale(
|
||||
scale: scale,
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
BlinkText(getFormattedTicket(ticketNo, isClinicAdded),
|
||||
style: TextStyle(
|
||||
fontSize: SizeConfig.getWidthMultiplier() * 10,
|
||||
letterSpacing: -9.32,
|
||||
height: 0.5,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
beginColor: Colors.black,
|
||||
endColor: blink ? Colors.black.withOpacity(0.1) : Colors.black,
|
||||
// endColor: blink ? AppGlobal.appRedColor : Colors.black,
|
||||
times: 0,
|
||||
duration: const Duration(seconds: 1)),
|
||||
// AppText(
|
||||
// ticketNo,
|
||||
// letterSpacing: -9.32,
|
||||
// fontSize: SizeConfig.getWidthMultiplier() * 16,
|
||||
// fontWeight: FontWeight.bold,
|
||||
// fontHeight: 0.7,
|
||||
// ),
|
||||
const SizedBox(height: 10),
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
callType.icon(SizeConfig.getHeightMultiplier() * 3),
|
||||
const SizedBox(width: 10),
|
||||
AppText(
|
||||
callType.message('en'),
|
||||
color: callType.color(),
|
||||
letterSpacing: -1.5,
|
||||
fontSize: SizeConfig.getWidthMultiplier() * 3.8,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontHeight: 0.5,
|
||||
),
|
||||
Container(
|
||||
color: Colors.grey.withOpacity(0.3),
|
||||
width: 6,
|
||||
height: SizeConfig.getHeightMultiplier() * 3,
|
||||
margin: const EdgeInsets.symmetric(horizontal: 10),
|
||||
),
|
||||
AppText(
|
||||
"Room: $roomNo",
|
||||
color: callType.color(),
|
||||
letterSpacing: -1.5,
|
||||
fontSize: SizeConfig.getWidthMultiplier() * 3.8,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontHeight: 0.5,
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,360 @@
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:blinking_text/blinking_text.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:queuing_system/core/config/size_config.dart';
|
||||
import 'package:queuing_system/core/response_models/call_config_model.dart';
|
||||
import 'package:queuing_system/core/response_models/patient_ticket_model.dart';
|
||||
import 'package:queuing_system/home/app_provider.dart';
|
||||
import 'package:queuing_system/utils/call_type.dart';
|
||||
import 'package:queuing_system/widget/data_display/app_texts_widget.dart';
|
||||
|
||||
class PriorityTickets extends StatelessWidget {
|
||||
final List<PatientTicketModel> tickets;
|
||||
final CallConfig callConfig;
|
||||
|
||||
const PriorityTickets({required this.tickets, required this.callConfig, Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final firstTicket = tickets[0];
|
||||
final otherTickets = tickets.sublist(1, tickets.length);
|
||||
return Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
const SizedBox(height: 50),
|
||||
TicketItem(
|
||||
ticketNo: firstTicket.queueNo ?? '',
|
||||
callType: firstTicket.getCallType(),
|
||||
scale: 1.2,
|
||||
blink: true,
|
||||
roomNo: firstTicket.roomNo,
|
||||
isClinicAdded: firstTicket.callNoStr != firstTicket.queueNo,
|
||||
callConfig: callConfig,
|
||||
),
|
||||
const SizedBox(height: 50),
|
||||
if (tickets.length > 1) ...[
|
||||
SizedBox(height: SizeConfig.getHeightMultiplier() * 1.8),
|
||||
Column(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
children: otherTickets
|
||||
.map((ticket) => Padding(
|
||||
padding: EdgeInsets.only(top: SizeConfig.getHeightMultiplier() * 2),
|
||||
child: TicketItem(
|
||||
ticketNo: ticket.queueNo ?? '',
|
||||
callType: ticket.getCallType(),
|
||||
scale: 0.8,
|
||||
roomNo: ticket.roomNo,
|
||||
isClinicAdded: ticket.callNoStr != ticket.queueNo,
|
||||
callConfig: callConfig,
|
||||
),
|
||||
))
|
||||
.toList(),
|
||||
)
|
||||
]
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class TicketItem extends StatelessWidget {
|
||||
final String ticketNo;
|
||||
final String roomNo;
|
||||
final CallType callType;
|
||||
final bool blink;
|
||||
final double scale;
|
||||
final bool isClinicAdded;
|
||||
final CallConfig callConfig;
|
||||
|
||||
const TicketItem({
|
||||
Key? key,
|
||||
required this.isClinicAdded,
|
||||
required this.ticketNo,
|
||||
required this.roomNo,
|
||||
required this.callType,
|
||||
required this.callConfig,
|
||||
required this.scale,
|
||||
this.blink = false,
|
||||
}) : super(key: key);
|
||||
|
||||
String getFormattedTicket(String ticketNo, bool isClinicAdded) {
|
||||
if (isClinicAdded) {
|
||||
var formattedString = ticketNo.split(" ");
|
||||
return formattedString[0] + " " + formattedString[1];
|
||||
}
|
||||
return ticketNo;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Transform.scale(
|
||||
scale: scale,
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
BlinkText(getFormattedTicket(ticketNo, isClinicAdded),
|
||||
style: TextStyle(
|
||||
fontSize: SizeConfig.getWidthMultiplier() * 10,
|
||||
letterSpacing: -1,
|
||||
height: 0.5,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
beginColor: Colors.black,
|
||||
endColor: blink ? Colors.black.withOpacity(0.1) : Colors.black,
|
||||
// endColor: blink ? AppGlobal.appRedColor : Colors.black,
|
||||
times: 0,
|
||||
duration: const Duration(seconds: 1)),
|
||||
const SizedBox(height: 13),
|
||||
Directionality(
|
||||
textDirection: callConfig.textDirection,
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Padding(
|
||||
padding: EdgeInsets.only(bottom: callType == CallType.vitalSign ? 0 : 8),
|
||||
child: callType.icon(SizeConfig.getHeightMultiplier() * 3),
|
||||
),
|
||||
const SizedBox(width: 13),
|
||||
AppText(
|
||||
callType.message(callConfig),
|
||||
color: callType.color(),
|
||||
letterSpacing: -1,
|
||||
fontSize: SizeConfig.getWidthMultiplier() * 3.8,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontHeight: 1,
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(bottom: 8.0),
|
||||
child: Container(
|
||||
color: Colors.grey.withOpacity(0.5),
|
||||
width: 5,
|
||||
height: SizeConfig.getHeightMultiplier() * 2,
|
||||
margin: const EdgeInsets.symmetric(horizontal: 15),
|
||||
),
|
||||
),
|
||||
AppText(
|
||||
callConfig.textDirection == TextDirection.ltr ? "${callConfig.roomText}: $roomNo" : " $roomNo : ${callConfig.roomText}",
|
||||
color: callType.color(),
|
||||
letterSpacing: -1,
|
||||
fontSize: SizeConfig.getWidthMultiplier() * 3.8,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontHeight: 1,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Widget noPatientInQueue({required ScreenOrientationEnum screenOrientationEnum}) {
|
||||
return Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Center(
|
||||
child: AppText(
|
||||
"Awaiting Patients Arrival",
|
||||
fontFamily: 'Poppins-SemiBold.ttf',
|
||||
fontSize: (screenOrientationEnum == ScreenOrientationEnum.portraitDown || screenOrientationEnum == ScreenOrientationEnum.portraitUp) ? SizeConfig.getWidthMultiplier() * 9 : SizeConfig.getWidthMultiplier() * 7,
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Widget qamarsBirthdayWidget() {
|
||||
return Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
AppText("Happy Birthday", fontFamily: 'Poppins-SemiBold.ttf', fontSize: SizeConfig.getWidthMultiplier() * 15),
|
||||
Center(
|
||||
child: AppText("Syed Qamar 🎉", fontFamily: 'Poppins-SemiBold.ttf', fontSize: SizeConfig.getWidthMultiplier() * 11),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Widget priorityTicketsWithSideList({required List<PatientTicketModel> tickets, required CallConfig callConfig, required BuildContext context}) {
|
||||
final priorityTickets = tickets.sublist(0, 3);
|
||||
final otherTickets = tickets.sublist(3, tickets.length);
|
||||
final AppProvider appProvider = context.watch<AppProvider>();
|
||||
log("appProvider.currentScreenRotation: ${appProvider.currentScreenRotation}");
|
||||
|
||||
final List<Widget> children = [
|
||||
Expanded(flex: 7, child: PriorityTickets(callConfig: callConfig, tickets: priorityTickets)),
|
||||
Container(color: Colors.grey.withOpacity(0.1), width: 10, margin: const EdgeInsets.symmetric(horizontal: 10, vertical: 50)),
|
||||
Expanded(
|
||||
flex: 6,
|
||||
child: ListView(
|
||||
children: [
|
||||
Padding(
|
||||
padding: EdgeInsets.fromLTRB(10, SizeConfig.getHeightMultiplier() * 3.3, 10, 10),
|
||||
child: Directionality(
|
||||
textDirection: callConfig.textDirection,
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
children: [
|
||||
Expanded(
|
||||
flex: 5,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
AppText(
|
||||
callConfig.queueNoText,
|
||||
letterSpacing: -2,
|
||||
fontHeight: 0.5,
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: SizeConfig.getWidthMultiplier() * 3.8,
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Container(
|
||||
color: Colors.grey.withOpacity(0.5),
|
||||
width: 5,
|
||||
height: SizeConfig.getHeightMultiplier() * 2,
|
||||
margin: const EdgeInsets.symmetric(horizontal: 15),
|
||||
),
|
||||
Expanded(
|
||||
flex: 5,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
AppText(
|
||||
callConfig.callForText,
|
||||
letterSpacing: -2,
|
||||
fontHeight: 0.5,
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: SizeConfig.getWidthMultiplier() * 3.8,
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Container(
|
||||
color: Colors.grey.withOpacity(0.5),
|
||||
width: 5,
|
||||
height: SizeConfig.getHeightMultiplier() * 2,
|
||||
margin: const EdgeInsets.symmetric(horizontal: 15),
|
||||
),
|
||||
Expanded(
|
||||
flex: 3,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
AppText(
|
||||
callConfig.roomText,
|
||||
letterSpacing: -2,
|
||||
fontHeight: 0.5,
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: SizeConfig.getWidthMultiplier() * 3.8,
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
ListView.builder(
|
||||
shrinkWrap: true,
|
||||
itemCount: otherTickets.length,
|
||||
itemBuilder: (ctx, idx) {
|
||||
final itm = otherTickets[idx];
|
||||
return Padding(
|
||||
padding: const EdgeInsets.all(8),
|
||||
child: Directionality(
|
||||
textDirection: callConfig.textDirection,
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
Expanded(
|
||||
flex: 5,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
AppText(
|
||||
itm.queueNo.toString(),
|
||||
letterSpacing: -1,
|
||||
fontHeight: 0.5,
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: SizeConfig.getWidthMultiplier() * 3.5,
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Container(
|
||||
color: Colors.grey.withOpacity(0.5),
|
||||
width: 5,
|
||||
height: SizeConfig.getHeightMultiplier() * 2,
|
||||
margin: const EdgeInsets.symmetric(horizontal: 15),
|
||||
),
|
||||
Expanded(
|
||||
flex: 5,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(bottom: 10),
|
||||
child: SizedBox(
|
||||
width: SizeConfig.getWidthMultiplier() * 3.5,
|
||||
child: itm.getCallType().icon(SizeConfig.getHeightMultiplier() * 2.5),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 15),
|
||||
AppText(
|
||||
itm.getCallType().message(callConfig, isListView: true),
|
||||
color: itm.getCallType().color(),
|
||||
letterSpacing: -1,
|
||||
fontSize: SizeConfig.getWidthMultiplier() * 3,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontHeight: 0.5,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Container(
|
||||
color: Colors.grey.withOpacity(0.5),
|
||||
width: 5,
|
||||
height: SizeConfig.getHeightMultiplier() * 2,
|
||||
margin: const EdgeInsets.symmetric(horizontal: 15),
|
||||
),
|
||||
Expanded(
|
||||
flex: 3,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
AppText(
|
||||
itm.roomNo,
|
||||
// callConfig.textDirection == TextDirection.ltr ? "${callConfig.roomText}: ${itm.roomNo}" : " ${itm.roomNo} ${callConfig.roomText}: ",
|
||||
color: itm.getCallType().color(),
|
||||
letterSpacing: -1.5,
|
||||
fontSize: SizeConfig.getWidthMultiplier() * 3.3,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontHeight: 0.5,
|
||||
),
|
||||
],
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
)
|
||||
];
|
||||
return (appProvider.currentScreenRotation == ScreenOrientationEnum.portraitUp || appProvider.currentScreenRotation == ScreenOrientationEnum.portraitDown) ? Row(children: children) : Column(children: children);
|
||||
}
|
||||
@ -1,88 +0,0 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:queuing_system/core/config/config.dart';
|
||||
import 'package:queuing_system/core/config/size_config.dart';
|
||||
import 'package:queuing_system/home/que_item/que_item_widget.dart';
|
||||
import 'package:queuing_system/widget/data_display/app_texts_widget.dart';
|
||||
|
||||
class TicketItem extends StatelessWidget {
|
||||
const TicketItem({
|
||||
Key key,
|
||||
this.isFirstLine = false,
|
||||
this.isSecondLine = false,
|
||||
this.isInListLine = false,
|
||||
this.queNo,
|
||||
this.isNurseVisit = false,
|
||||
this.idDoctorVisit = false, this.haveListOfPatient
|
||||
}) : super(key: key);
|
||||
final bool isFirstLine;
|
||||
final bool isSecondLine;
|
||||
final bool isInListLine;
|
||||
final bool isNurseVisit;
|
||||
final bool idDoctorVisit;
|
||||
final String queNo;
|
||||
final bool haveListOfPatient;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return haveListOfPatient?
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(45.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
QueItemWidget(
|
||||
isFirstLine: isFirstLine,
|
||||
isNurseVisit: isNurseVisit,
|
||||
isSecondLine: isSecondLine,
|
||||
queNo: queNo,
|
||||
),
|
||||
],
|
||||
),
|
||||
)
|
||||
:Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(right: 20.0, left: 20.0),
|
||||
child: AppText(
|
||||
queNo,
|
||||
fontSize: SizeConfig.getWidthMultiplier() *
|
||||
(isFirstLine
|
||||
? 13
|
||||
: isSecondLine
|
||||
? 8.5
|
||||
: 4.7),
|
||||
letterSpacing: -3.26,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontFamily: 'Poppins',
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 30,),
|
||||
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
SvgPicture.asset(
|
||||
isNurseVisit
|
||||
? "assets/images/nurseicon.svg"
|
||||
: "assets/images/doctoricon.svg", height:SizeConfig.getHeightMultiplier()*2.5 ,),
|
||||
const SizedBox(width: 4,),
|
||||
AppText(
|
||||
isNurseVisit ? " Please Visit Nurse" : " Please Visit Doctor",
|
||||
color: AppGlobal.appGreyColor,
|
||||
fontSize: SizeConfig.getWidthMultiplier() * (isFirstLine
|
||||
? 3.3
|
||||
: isSecondLine
|
||||
? 3.3
|
||||
: 3.3),
|
||||
letterSpacing: -1.6,
|
||||
fontFamily: 'Poppins-Medium.ttf',
|
||||
),
|
||||
],
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -1,67 +0,0 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:queuing_system/core/config/config.dart';
|
||||
import 'package:queuing_system/core/config/size_config.dart';
|
||||
import 'package:queuing_system/widget/data_display/app_texts_widget.dart';
|
||||
|
||||
///TODO Roaa we have dublicated code between this and the que item widget we need to make it customize
|
||||
|
||||
class QueItemWidget extends StatelessWidget {
|
||||
const QueItemWidget({
|
||||
Key key,
|
||||
this.isFirstLine = false,
|
||||
this.isSecondLine = false,
|
||||
this.queNo,
|
||||
this.isNurseVisit = false,
|
||||
}) : super(key: key);
|
||||
final bool isFirstLine;
|
||||
final bool isSecondLine;
|
||||
final bool isNurseVisit;
|
||||
final String queNo;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
AppText(
|
||||
queNo,
|
||||
fontSize: SizeConfig.getWidthMultiplier() *
|
||||
(isFirstLine
|
||||
? 14
|
||||
: isSecondLine
|
||||
? 8.5
|
||||
: 5.5),
|
||||
letterSpacing: -13.72,
|
||||
fontWeight: FontWeight.bold,
|
||||
// fontFamily: 'Poppins-Bold.ttf',
|
||||
),
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
SvgPicture.asset(
|
||||
isNurseVisit
|
||||
? "assets/images/nurseicon.svg"
|
||||
: "assets/images/doctoricon.svg", height:SizeConfig.getHeightMultiplier()*2.5 ,),
|
||||
const SizedBox(width: 25,),
|
||||
AppText(
|
||||
isNurseVisit ? "Please Visit Nurse" : "Please Visit Doctor",
|
||||
color: isNurseVisit
|
||||
? AppGlobal.appGreenColor
|
||||
: AppGlobal.appRedColor,
|
||||
fontSize: SizeConfig.getWidthMultiplier() * (isFirstLine
|
||||
? 3.3
|
||||
: isSecondLine
|
||||
? 3.3
|
||||
: 3.3),
|
||||
letterSpacing: -3.25,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontFamily: 'Poppins-Medium.ttf',
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -1,27 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:queuing_system/core/config/size_config.dart';
|
||||
import 'package:queuing_system/home/que_item/que_item.dart';
|
||||
|
||||
class QueItemList extends StatelessWidget {
|
||||
const QueItemList({Key key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SizedBox(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
SizedBox(height: SizeConfig.getHeightMultiplier() *2.3,),
|
||||
const TicketItem(queNo: "OBG-T45", isInListLine: true, isNurseVisit: true, haveListOfPatient: false,),
|
||||
const TicketItem(queNo: "OBG-T45", isInListLine: true, isNurseVisit: true, haveListOfPatient: false,),
|
||||
const TicketItem(queNo: "OBG-T45", isInListLine: true, isNurseVisit: false, haveListOfPatient: false,),
|
||||
const TicketItem(queNo: "OBG-T45", isInListLine: true, isNurseVisit: true, haveListOfPatient: false,),
|
||||
const TicketItem(queNo: "OBG-T45", isInListLine: true, isNurseVisit: true, haveListOfPatient: false,),
|
||||
const TicketItem(queNo: "OBG-T45", isInListLine: true, isNurseVisit: false, haveListOfPatient: false,),
|
||||
const TicketItem(queNo: "OBG-T45", isInListLine: true, isNurseVisit: true, haveListOfPatient: false,),
|
||||
const TicketItem(queNo: "OBG-T45", isInListLine: true, isNurseVisit: false, haveListOfPatient: false,),
|
||||
|
||||
],),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -1,33 +1,32 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'loader/gif_loader_container.dart';
|
||||
|
||||
class AppLoaderWidget extends StatefulWidget {
|
||||
AppLoaderWidget({Key key, this.title, this.containerColor}) : super(key: key);
|
||||
|
||||
final String title;
|
||||
final Color containerColor;
|
||||
|
||||
@override
|
||||
_AppLoaderWidgetState createState() => new _AppLoaderWidgetState();
|
||||
}
|
||||
|
||||
class _AppLoaderWidgetState extends State<AppLoaderWidget> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
height: MediaQuery.of(context).size.height,
|
||||
child: Stack(
|
||||
children: [
|
||||
Container(
|
||||
color: widget.containerColor ?? Colors.grey.withOpacity(0.6),
|
||||
),
|
||||
Container(
|
||||
child: GifLoaderContainer(),
|
||||
margin: EdgeInsets.only(
|
||||
bottom: MediaQuery.of(context).size.height * 0.09))
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
// import 'package:flutter/material.dart';
|
||||
// import 'package:queuing_system/widget/loader/gif_loader_container.dart';
|
||||
//
|
||||
// class AppLoaderWidget extends StatefulWidget {
|
||||
// AppLoaderWidget({Key? key, this.title, this.containerColor}) : super(key: key);
|
||||
//
|
||||
// final String title;
|
||||
// final Color containerColor;
|
||||
//
|
||||
// @override
|
||||
// _AppLoaderWidgetState createState() => _AppLoaderWidgetState();
|
||||
// }
|
||||
//
|
||||
// class _AppLoaderWidgetState extends State<AppLoaderWidget> {
|
||||
// @override
|
||||
// Widget build(BuildContext context) {
|
||||
// return SizedBox(
|
||||
// height: MediaQuery.of(context).size.height,
|
||||
// child: Stack(
|
||||
// children: [
|
||||
// Container(
|
||||
// color: widget.containerColor ?? Colors.grey.withOpacity(0.6),
|
||||
// ),
|
||||
// Container(
|
||||
// child: GifLoaderContainer(),
|
||||
// margin: EdgeInsets.only(
|
||||
// bottom: MediaQuery.of(context).size.height * 0.09))
|
||||
// ],
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
|
||||
@ -1,43 +1,36 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:queuing_system/widget/data_display/app_texts_widget.dart';
|
||||
|
||||
|
||||
class ErrorMessage extends StatelessWidget {
|
||||
const ErrorMessage({
|
||||
Key key,
|
||||
@required this.error,
|
||||
}) : super(key: key);
|
||||
|
||||
final String error;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SingleChildScrollView(
|
||||
child: Center(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
SizedBox(
|
||||
height: 100,
|
||||
),
|
||||
SvgPicture.asset('assets/images/svgs/no data.svg'),
|
||||
Center(
|
||||
child: Center(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
top: 12, bottom: 12, right: 20, left: 30),
|
||||
child: Center(
|
||||
child: AppText(
|
||||
error ?? '',
|
||||
textAlign: TextAlign.center,
|
||||
)),
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
// import 'package:flutter/material.dart';
|
||||
// import 'package:flutter_svg/flutter_svg.dart';
|
||||
// import 'package:queuing_system/widget/data_display/app_texts_widget.dart';
|
||||
//
|
||||
// class ErrorMessage extends StatelessWidget {
|
||||
// const ErrorMessage({Key? key, this.error = ''}) : super(key: key);
|
||||
//
|
||||
// final String error;
|
||||
//
|
||||
// @override
|
||||
// Widget build(BuildContext context) {
|
||||
// return SingleChildScrollView(
|
||||
// child: Center(
|
||||
// child: Column(
|
||||
// crossAxisAlignment: CrossAxisAlignment.center,
|
||||
// children: [
|
||||
// const SizedBox(height: 100),
|
||||
// SvgPicture.asset('assets/images/svgs/no data.svg'),
|
||||
// Center(
|
||||
// child: Center(
|
||||
// child: Padding(
|
||||
// padding: const EdgeInsets.only(top: 12, bottom: 12, right: 20, left: 30),
|
||||
// child: Center(
|
||||
// child: AppText(
|
||||
// error ?? '',
|
||||
// textAlign: TextAlign.center,
|
||||
// )),
|
||||
// ),
|
||||
// ),
|
||||
// )
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
|
||||
@ -1,43 +1,43 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter_gifimage/flutter_gifimage.dart';
|
||||
|
||||
class GifLoaderContainer extends StatefulWidget {
|
||||
@override
|
||||
_GifLoaderContainerState createState() => _GifLoaderContainerState();
|
||||
}
|
||||
|
||||
class _GifLoaderContainerState extends State<GifLoaderContainer>
|
||||
with TickerProviderStateMixin {
|
||||
GifController controller1;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
controller1 = GifController(vsync: this);
|
||||
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
controller1.repeat(
|
||||
min: 0, max: 11, period: Duration(milliseconds: 750), reverse: true);
|
||||
});
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
controller1.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Center(
|
||||
//progress-loading.gif
|
||||
child: Container(
|
||||
// margin: EdgeInsets.only(bottom: 40),
|
||||
child: GifImage(
|
||||
controller: controller1,
|
||||
image: AssetImage(
|
||||
"assets/images/progress-loading-red.gif"), //NetworkImage("http://img.mp.itc.cn/upload/20161107/5cad975eee9e4b45ae9d3c1238ccf91e.jpg"),
|
||||
),
|
||||
));
|
||||
}
|
||||
}
|
||||
// import 'package:flutter/cupertino.dart';
|
||||
// import 'package:flutter_gifimage/flutter_gifimage.dart';
|
||||
//
|
||||
// class GifLoaderContainer extends StatefulWidget {
|
||||
// @override
|
||||
// _GifLoaderContainerState createState() => _GifLoaderContainerState();
|
||||
// }
|
||||
//
|
||||
// class _GifLoaderContainerState extends State<GifLoaderContainer>
|
||||
// with TickerProviderStateMixin {
|
||||
// GifController controller1;
|
||||
//
|
||||
// @override
|
||||
// void initState() {
|
||||
// controller1 = GifController(vsync: this);
|
||||
//
|
||||
// WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
// controller1.repeat(
|
||||
// min: 0, max: 11, period: Duration(milliseconds: 750), reverse: true);
|
||||
// });
|
||||
// super.initState();
|
||||
// }
|
||||
//
|
||||
// @override
|
||||
// void dispose() {
|
||||
// controller1.dispose();
|
||||
// super.dispose();
|
||||
// }
|
||||
//
|
||||
// @override
|
||||
// Widget build(BuildContext context) {
|
||||
// return Center(
|
||||
// //progress-loading.gif
|
||||
// child: Container(
|
||||
// // margin: EdgeInsets.only(bottom: 40),
|
||||
// child: GifImage(
|
||||
// controller: controller1,
|
||||
// image: AssetImage(
|
||||
// "assets/images/progress-loading-red.gif"), //NetworkImage("http://img.mp.itc.cn/upload/20161107/5cad975eee9e4b45ae9d3c1238ccf91e.jpg"),
|
||||
// ),
|
||||
// ));
|
||||
// }
|
||||
// }
|
||||
|
||||
@ -1,13 +1,11 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'gif_loader_container.dart';
|
||||
|
||||
class GifLoaderDialogUtils {
|
||||
static showMyDialog(BuildContext context) {
|
||||
showDialog(context: context, builder: (ctx) => GifLoaderContainer());
|
||||
}
|
||||
|
||||
static hideDialog(BuildContext context) {
|
||||
if (Navigator.canPop(context)) Navigator.of(context).pop();
|
||||
}
|
||||
}
|
||||
// import 'package:flutter/material.dart';
|
||||
// import 'gif_loader_container.dart';
|
||||
// class GifLoaderDialogUtils {
|
||||
// static showMyDialog(BuildContext context) {
|
||||
// showDialog(context: context, builder: (ctx) => GifLoaderContainer());
|
||||
// }
|
||||
//
|
||||
// static hideDialog(BuildContext context) {
|
||||
// if (Navigator.canPop(context)) Navigator.of(context).pop();
|
||||
// }
|
||||
// }
|
||||
|
||||
@ -1,594 +0,0 @@
|
||||
# Generated by pub
|
||||
# See https://dart.dev/tools/pub/glossary#lockfile
|
||||
packages:
|
||||
async:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: async
|
||||
sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.10.0"
|
||||
audio_session:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: audio_session
|
||||
sha256: e4acc4e9eaa32436dfc5d7aed7f0a370f2d7bb27ee27de30d6c4f220c2a05c73
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.1.13"
|
||||
blinking_text:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: blinking_text
|
||||
sha256: "3f0c300f9f67ff3455e303a7dea7825bd96965d17295e4e831f29040c0379e69"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.2"
|
||||
boolean_selector:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: boolean_selector
|
||||
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.1"
|
||||
characters:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: characters
|
||||
sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.1"
|
||||
charcode:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: charcode
|
||||
sha256: fb98c0f6d12c920a02ee2d998da788bca066ca5f148492b7085ee23372b12306
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.1"
|
||||
clock:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: clock
|
||||
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
collection:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: collection
|
||||
sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.17.0"
|
||||
connectivity:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: connectivity
|
||||
sha256: a8e91263cf3e25fb5cc95e19dfde4999e32a648ac3b9e8a558a28165731678f8
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.6"
|
||||
connectivity_for_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: connectivity_for_web
|
||||
sha256: "01a390c1d5adc2ed1fa1f52d120c07fe9fd01166a93f965a832fd6cfc0ea6482"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.4.0+1"
|
||||
connectivity_macos:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: connectivity_macos
|
||||
sha256: "51ae08d5162eca9669b9d8951ed83ce19c5355a81149f94e4dee2740beb93628"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.2.1+2"
|
||||
connectivity_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: connectivity_platform_interface
|
||||
sha256: "2d82e942df9d49f29a24bb07fb5ce085d4a53e47818c62364d2b6deb9e0d7a8e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.1"
|
||||
crypto:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: crypto
|
||||
sha256: cf75650c66c0316274e21d7c43d3dea246273af5955bd94e8184837cd577575c
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.1"
|
||||
equatable:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: equatable
|
||||
sha256: c6094fd1efad3046334a9c40bee022147e55c25401ccd89b94e373e3edadd375
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.3"
|
||||
fake_async:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: fake_async
|
||||
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.1"
|
||||
ffi:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: ffi
|
||||
sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.1"
|
||||
file:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: file
|
||||
sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.1.4"
|
||||
flutter:
|
||||
dependency: "direct main"
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
flutter_gifimage:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_gifimage
|
||||
sha256: "2c1b59e0b96d64ee0e073b70a376d6651d369b87880cdd1bf29f8466d5b0ad46"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
flutter_lints:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: flutter_lints
|
||||
sha256: b543301ad291598523947dc534aaddc5aaad597b709d2426d3a0e0d44c5cb493
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.4"
|
||||
flutter_svg:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_svg
|
||||
sha256: c9bb2757b8a0bbf8e45f4069a90d2b9dbafc80b1a5e28d43e29088be533e6df4
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.3"
|
||||
flutter_test:
|
||||
dependency: "direct dev"
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
flutter_tts:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_tts
|
||||
sha256: e91ad17793ad12cca9c3066accf99ceb353bf0355ad06b767176f178b5c428f6
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.6.3"
|
||||
flutter_web_plugins:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
get_it:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: get_it
|
||||
sha256: "290fde3a86072e4b37dbb03c07bec6126f0ecc28dad403c12ffe2e5a2d751ab7"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.2.0"
|
||||
http:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: http
|
||||
sha256: "2ed163531e071c2c6b7c659635112f24cb64ecbebf6af46b550d536c0b1aa112"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.13.4"
|
||||
http_parser:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: http_parser
|
||||
sha256: e362d639ba3bc07d5a71faebb98cde68c05bfbcfbbb444b60b6f60bb67719185
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.0"
|
||||
js:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: js
|
||||
sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.6.5"
|
||||
just_audio:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: just_audio
|
||||
sha256: "7a5057a4d05c8f88ee968cec6fdfe1015577d5184e591d5ac15ab16d8f5ecb17"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.9.31"
|
||||
just_audio_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: just_audio_platform_interface
|
||||
sha256: eff112d5138bea3ba544b6338b1e0537a32b5e1425e4d0dc38f732771cda7c84
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.2.0"
|
||||
just_audio_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: just_audio_web
|
||||
sha256: "89d8db6f19f3821bb6bf908c4bfb846079afb2ab575b783d781a6bf119e3abaf"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.4.7"
|
||||
lints:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: lints
|
||||
sha256: a2c3d198cb5ea2e179926622d433331d8b58374ab8f29cdda6e863bd62fd369c
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
logging:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: logging
|
||||
sha256: "293ae2d49fd79d4c04944c3a26dfd313382d5f52e821ec57119230ae16031ad4"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.2"
|
||||
matcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: matcher
|
||||
sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.12.13"
|
||||
material_color_utilities:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: material_color_utilities
|
||||
sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.2.0"
|
||||
meta:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: meta
|
||||
sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.8.0"
|
||||
nested:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: nested
|
||||
sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.0"
|
||||
path:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path
|
||||
sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.8.2"
|
||||
path_drawing:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_drawing
|
||||
sha256: a19347362f85a45aadf6bdfa3c04f18ff6676c445375eecd6251f9e09b9db551
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.0"
|
||||
path_parsing:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_parsing
|
||||
sha256: "9508ebdf1c3ac3a68ad5fb15edab8b026382999f18f77352349e56fbd74183ac"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.0"
|
||||
path_provider:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider
|
||||
sha256: "04890b994ee89bfa80bf3080bfec40d5a92c5c7a785ebb02c13084a099d2b6f9"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.13"
|
||||
path_provider_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_android
|
||||
sha256: "019f18c9c10ae370b08dce1f3e3b73bc9f58e7f087bb5e921f06529438ac0ae7"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.24"
|
||||
path_provider_foundation:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_foundation
|
||||
sha256: "026b97a6c29da75181a37aae2eba9227f5fe13cb2838c6b975ce209328b8ab4e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.3"
|
||||
path_provider_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_linux
|
||||
sha256: "2ae08f2216225427e64ad224a24354221c2c7907e448e6e0e8b57b1eb9f10ad1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.10"
|
||||
path_provider_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_platform_interface
|
||||
sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.6"
|
||||
path_provider_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_windows
|
||||
sha256: f53720498d5a543f9607db4b0e997c4b5438884de25b0f73098cc2671a51b130
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.5"
|
||||
petitparser:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: petitparser
|
||||
sha256: "1a914995d4ef10c94ff183528c120d35ed43b5eaa8713fc6766a9be4570782e2"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.4.0"
|
||||
platform:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: platform
|
||||
sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.0"
|
||||
plugin_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: plugin_platform_interface
|
||||
sha256: "075f927ebbab4262ace8d0b283929ac5410c0ac4e7fc123c76429564facfb757"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.2"
|
||||
process:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: process
|
||||
sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.2.4"
|
||||
provider:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: provider
|
||||
sha256: "7896193cf752c40ba7f7732a95264319a787871e5d628225357f5c909182bc06"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.0.2"
|
||||
quiver:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: quiver
|
||||
sha256: "616b691d1c8f5c53b7b39ce3542f6a25308d7900bf689d0210e72a644a10387e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.1+1"
|
||||
rxdart:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: rxdart
|
||||
sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.27.7"
|
||||
signalr_core:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: signalr_core
|
||||
sha256: dca676372a00c051511591ed0e24521ff7aa4e9320a7fa778a1007f7f522c8c0
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
sky_engine:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.99"
|
||||
source_span:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_span
|
||||
sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.9.1"
|
||||
sse_client:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: sse_client
|
||||
sha256: "71bd826430b41ab20a69d85bf2dfe9f11cfe222938e681ada1aea71fc8adf348"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.1.0"
|
||||
stack_trace:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stack_trace
|
||||
sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.11.0"
|
||||
stream_channel:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stream_channel
|
||||
sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.1"
|
||||
string_scanner:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: string_scanner
|
||||
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
term_glyph:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: term_glyph
|
||||
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.1"
|
||||
test_api:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test_api
|
||||
sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.4.16"
|
||||
tuple:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: tuple
|
||||
sha256: fe3ae4f0dca3f9aac0888e2e0d117b642ce283a82d7017b54136290c0a3b0dd3
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.0"
|
||||
typed_data:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: typed_data
|
||||
sha256: "53bdf7e979cfbf3e28987552fd72f637e63f3c8724c9e56d9246942dc2fa36ee"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.0"
|
||||
uuid:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: uuid
|
||||
sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.7"
|
||||
vector_math:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vector_math
|
||||
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.4"
|
||||
wakelock:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: wakelock
|
||||
sha256: "769ecf42eb2d07128407b50cb93d7c10bd2ee48f0276ef0119db1d25cc2f87db"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.6.2"
|
||||
wakelock_macos:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: wakelock_macos
|
||||
sha256: "047c6be2f88cb6b76d02553bca5a3a3b95323b15d30867eca53a19a0a319d4cd"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.4.0"
|
||||
wakelock_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: wakelock_platform_interface
|
||||
sha256: "1f4aeb81fb592b863da83d2d0f7b8196067451e4df91046c26b54a403f9de621"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.3.0"
|
||||
wakelock_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: wakelock_web
|
||||
sha256: "1b256b811ee3f0834888efddfe03da8d18d0819317f20f6193e2922b41a501b5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.4.0"
|
||||
wakelock_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: wakelock_windows
|
||||
sha256: "857f77b3fe6ae82dd045455baa626bc4b93cb9bb6c86bf3f27c182167c3a5567"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.2.1"
|
||||
web_socket_channel:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: web_socket_channel
|
||||
sha256: "0c2ada1b1aeb2ad031ca81872add6be049b8cb479262c6ad3c4b0f9c24eaab2f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
win32:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: win32
|
||||
sha256: c9ebe7ee4ab0c2194e65d3a07d8c54c5d00bb001b76081c4a04cdb8448b59e46
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.3"
|
||||
xdg_directories:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: xdg_directories
|
||||
sha256: ee1505df1426458f7f60aac270645098d318a8b4766d85fde75f76f2e21807d1
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.0"
|
||||
xml:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: xml
|
||||
sha256: baa23bcba1ba4ce4b22c0c7a1d9c861e7015cb5169512676da0b85138e72840c
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.3.1"
|
||||
sdks:
|
||||
dart: ">=2.18.0 <3.0.0"
|
||||
flutter: ">=3.0.0"
|
||||