diff --git a/android/app/build.gradle b/android/app/build.gradle index c99a51cd..8537d176 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,113 +1,9 @@ -// def localProperties = new Properties() -// def localPropertiesFile = rootProject.file('local.properties') -// if (localPropertiesFile.exists()) { -// localPropertiesFile.withReader('UTF-8') { reader -> -// localProperties.load(reader) -// } -// } - -// def flutterRoot = localProperties.getProperty('flutter.sdk') -// if (flutterRoot == null) { -// throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -// } - -// def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -// if (flutterVersionCode == null) { -// flutterVersionCode = '1' -// } - -// def flutterVersionName = localProperties.getProperty('flutter.versionName') -// if (flutterVersionName == null) { -// flutterVersionName = '1.0' -// } - -// def keystoreProperties = new Properties() -// def keystorePropertiesFile = rootProject.file('key.properties') -// if (keystorePropertiesFile.exists()) { -// keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) -// } - - - -// apply plugin: 'com.android.application' -// apply plugin: 'kotlin-android' -// apply plugin:'com.google.gms.google-services' -// apply plugin: 'com.google.firebase.crashlytics' -// apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - -// android { -// compileSdkVersion 33 - -// compileOptions { -// sourceCompatibility JavaVersion.VERSION_1_8 -// targetCompatibility JavaVersion.VERSION_1_8 -// } - -// kotlinOptions { -// jvmTarget = '1.8' -// } - -// sourceSets { -// main.java.srcDirs += 'src/main/kotlin' -// } - -// defaultConfig { -// // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). -// applicationId "com.caelitechnologies.rotary_nl_rye" -// minSdkVersion 23 -// targetSdkVersion 31 -// // TODO before release ensure to shrink file size and delete multiDex (https://developer.android.com/studio/build/multidex) -// multiDexEnabled true -// versionCode flutterVersionCode.toInteger() -// versionName flutterVersionName -// } - -// signingConfigs { -// release { -// keyAlias keystoreProperties['keyAlias'] -// keyPassword keystoreProperties['keyPassword'] -// storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null -// storePassword keystoreProperties['storePassword'] -// } -// } -// buildTypes { -// debug{ -// signingConfig signingConfigs.debug -// } -// profile { -// signingConfig signingConfigs.debug -// } -// release { -// // TODO: Add your own signing config for the release build. -// // Signing with the debug keys for now, so `flutter run --release` works. -// signingConfig signingConfigs.release -// // signingConfig signingConfigs.debug -// minifyEnabled false -// shrinkResources false -// firebaseCrashlytics { -// mappingFileUploadEnabled false -// } -// } -// } -// buildToolsVersion '30.0.3' -// } - -// flutter { -// source '../..' -// } - -// dependencies { -// implementation "androidx.multidex:multidex:2.0.1" -// implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" -// // // Required for firebase messaging -// // implementation 'com.google.firebase:firebase-messaging:20.1.6' -// } - - plugins { id "com.android.application" id "kotlin-android" + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. id "dev.flutter.flutter-gradle-plugin" + id "com.google.firebase.crashlytics" } def localProperties = new Properties() @@ -128,6 +24,11 @@ if (flutterVersionName == null) { flutterVersionName = '1.0' } +def flutterMinSdkVersion = localProperties.getProperty('flutter.minSdkVersion') +if (flutterMinSdkVersion == null) { + flutterMinSdkVersion = 30 +} + def keystoreProperties = new Properties() def keystorePropertiesFile = rootProject.file('key.properties') if (keystorePropertiesFile.exists()) { @@ -135,8 +36,6 @@ if (keystorePropertiesFile.exists()) { } - -apply plugin: 'com.google.firebase.crashlytics' apply plugin: 'com.google.gms.google-services' android { @@ -149,26 +48,15 @@ android { targetCompatibility JavaVersion.VERSION_1_8 } - kotlinOptions { - jvmTarget = '1.8' - } - - sourceSets { - main.java.srcDirs += 'src/main/kotlin' - } - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.caelitechnologies.rotary_nl_rye" - // You can update the following values to match your application needs. - // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. - minSdkVersion flutter.minSdkVersion + minSdkVersion flutterMinSdkVersion targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName } - signingConfigs { + signingConfigs { release { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] @@ -204,4 +92,5 @@ flutter { dependencies { implementation "androidx.multidex:multidex:2.0.1" -} + implementation 'com.google.android.play:integrity:1.4.0' +} \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle index 334c5087..d2ffbffa 100755 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,26 +1,3 @@ -buildscript { - ext.kotlin_version = '1.7.10' - repositories { - google() - mavenCentral() - } - - - // dependencies { - // classpath 'com.android.tools.build:gradle:4.2.2' - // classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - // classpath 'com.google.gms:google-services:4.3.13' - // classpath 'com.google.firebase:firebase-crashlytics-gradle:2.8.1' - // } - - dependencies { - classpath 'com.android.tools.build:gradle:7.3.0' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'com.google.gms:google-services:4.3.15' - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.8.1' - } -} - allprojects { repositories { google() @@ -28,12 +5,12 @@ allprojects { } } -rootProject.buildDir = '../build' +rootProject.buildDir = "../build" subprojects { project.buildDir = "${rootProject.buildDir}/${project.name}" } subprojects { - project.evaluationDependsOn(':app') + project.evaluationDependsOn(":app") } tasks.register("clean", Delete) { diff --git a/android/gradle.properties b/android/gradle.properties index 38c8d454..3b5b324f 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,4 +1,3 @@ -org.gradle.jvmargs=-Xmx1536M -android.enableR8=true +org.gradle.jvmargs=-Xmx4G -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 3c472b99..a48a0b30 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Sun Jun 23 15:39:52 CEST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip diff --git a/android/settings.gradle b/android/settings.gradle index 55c4ca8b..8190b0f0 100755 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -5,16 +5,23 @@ pluginManagement { def flutterSdkPath = properties.getProperty("flutter.sdk") assert flutterSdkPath != null, "flutter.sdk not set in local.properties" return flutterSdkPath - } - settings.ext.flutterSdkPath = flutterSdkPath() + }() - includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - plugins { - id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false + repositories { + google() + mavenCentral() + gradlePluginPortal() } } -include ":app" +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "8.1.0" apply false + id "org.jetbrains.kotlin.android" version "1.7.10" apply false + id "com.google.firebase.crashlytics" version "3.0.2" apply false + id "com.google.gms.google-services" version "4.4.2" apply false +} -apply from: "${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle/app_plugin_loader.gradle" +include ":app" diff --git a/assets/image/homepage/Cream_Black.jpg b/assets/image/homepage/Cream_Black.jpg deleted file mode 100644 index 15bacfe1..00000000 Binary files a/assets/image/homepage/Cream_Black.jpg and /dev/null differ diff --git a/assets/image/homepage/Digitale_infomarkt_25_mei_2024.jpg b/assets/image/homepage/Digitale_infomarkt_25_mei_2024.jpg deleted file mode 100644 index 89f433a0..00000000 Binary files a/assets/image/homepage/Digitale_infomarkt_25_mei_2024.jpg and /dev/null differ diff --git a/assets/image/homepage/Farewell_Inbounds_2023-2024_mei_2024.jpg b/assets/image/homepage/Farewell_Inbounds_2023-2024_mei_2024.jpg new file mode 100644 index 00000000..34a06c69 Binary files /dev/null and b/assets/image/homepage/Farewell_Inbounds_2023-2024_mei_2024.jpg differ diff --git a/assets/image/homepage/Inbounds_Bezoek_Beurs_van_Berlage.jpg b/assets/image/homepage/Inbounds_Bezoek_Beurs_van_Berlage.jpg new file mode 100644 index 00000000..5d7ac822 Binary files /dev/null and b/assets/image/homepage/Inbounds_Bezoek_Beurs_van_Berlage.jpg differ diff --git a/assets/image/homepage/Informatiedag_14_september_2024.jpg b/assets/image/homepage/Informatiedag_14_september_2024.jpg new file mode 100644 index 00000000..cfd44385 Binary files /dev/null and b/assets/image/homepage/Informatiedag_14_september_2024.jpg differ diff --git a/assets/image/homepage/Koningsdag_Emmen_27_april_2024.png b/assets/image/homepage/Koningsdag_Emmen_27_april_2024.png new file mode 100644 index 00000000..7124ff93 Binary files /dev/null and b/assets/image/homepage/Koningsdag_Emmen_27_april_2024.png differ diff --git a/assets/image/homepage/Nederland_herdenkt-inbounds_4_mei_2024.png b/assets/image/homepage/Nederland_herdenkt-inbounds_4_mei_2024.png new file mode 100644 index 00000000..a229f862 Binary files /dev/null and b/assets/image/homepage/Nederland_herdenkt-inbounds_4_mei_2024.png differ diff --git a/assets/image/homepage/Testimonial_Schouwen-Duiveland.png b/assets/image/homepage/Testimonial_Schouwen-Duiveland.png new file mode 100644 index 00000000..6d1ec390 Binary files /dev/null and b/assets/image/homepage/Testimonial_Schouwen-Duiveland.png differ diff --git a/assets/image/homepage/afscheid_bestuur_rotex.jpg b/assets/image/homepage/afscheid_bestuur_rotex.jpg deleted file mode 100644 index 0787a9fd..00000000 Binary files a/assets/image/homepage/afscheid_bestuur_rotex.jpg and /dev/null differ diff --git a/assets/image/homepage/archive/barbara_with_students.jpg b/assets/image/homepage/archive/barbara_with_students.jpg deleted file mode 100644 index eb7f70af..00000000 Binary files a/assets/image/homepage/archive/barbara_with_students.jpg and /dev/null differ diff --git a/assets/image/homepage/archive/digitale_informatie_ochtend_2024.jpg b/assets/image/homepage/archive/digitale_informatie_ochtend_2024.jpg deleted file mode 100644 index 3447388c..00000000 Binary files a/assets/image/homepage/archive/digitale_informatie_ochtend_2024.jpg and /dev/null differ diff --git a/assets/image/homepage/archive/saying_goodby.jpg b/assets/image/homepage/archive/saying_goodby.jpg deleted file mode 100644 index ccaf0958..00000000 Binary files a/assets/image/homepage/archive/saying_goodby.jpg and /dev/null differ diff --git a/assets/image/homepage/archive/saying_goodby_2.jpeg b/assets/image/homepage/archive/saying_goodby_2.jpeg deleted file mode 100644 index 1f026cee..00000000 Binary files a/assets/image/homepage/archive/saying_goodby_2.jpeg and /dev/null differ diff --git a/assets/image/homepage/archive/selectiedag_8_oktober.png b/assets/image/homepage/archive/selectiedag_8_oktober.png deleted file mode 100644 index 9485338f..00000000 Binary files a/assets/image/homepage/archive/selectiedag_8_oktober.png and /dev/null differ diff --git a/assets/image/homepage/archive/shelterbox.jpg b/assets/image/homepage/archive/shelterbox.jpg deleted file mode 100644 index 5c56c4e0..00000000 Binary files a/assets/image/homepage/archive/shelterbox.jpg and /dev/null differ diff --git a/assets/image/homepage/archive/together.jpg b/assets/image/homepage/archive/together.jpg deleted file mode 100644 index a50ed186..00000000 Binary files a/assets/image/homepage/archive/together.jpg and /dev/null differ diff --git a/assets/image/homepage/class_2024.jpg b/assets/image/homepage/class_2024.jpg deleted file mode 100644 index 50496a23..00000000 Binary files a/assets/image/homepage/class_2024.jpg and /dev/null differ diff --git a/assets/image/homepage/prebounds_in_action.jpg b/assets/image/homepage/prebounds_in_action.jpg deleted file mode 100644 index e1cb3d2f..00000000 Binary files a/assets/image/homepage/prebounds_in_action.jpg and /dev/null differ diff --git a/assets/lang/de.json b/assets/lang/de.json index 9f8d8cfe..dc610c95 100644 --- a/assets/lang/de.json +++ b/assets/lang/de.json @@ -3,6 +3,7 @@ "settingsTitle": "Additional", "account": "Account", "social": "Social", + "Development": "Development", "language": "Language", "privacyAndSecurity": "Privacy and security", "notifications": "Notifications", @@ -12,13 +13,10 @@ "victorStormBio": "Ik ben Victor, en ik ben hoofd van commissie extern.\n\nWij regelen de social media accounts en houden ons bezig met de media-taken van Rotex.\n\nIk ben zelf in het jaar 2017-2018 naar Taiwan geweest. Ik zat in het dorpje Huwei in de provincie Yunlin.\n\nTijdens mijn exchange heb ik veel van Taiwan kunnen zien, en heb ik door het exchange programma vrienden van over de hele wereld gemaakt.\n\nOnderhand studeer ik Psychologie in Amsterdam, en hoop ik dat we als Rotex zo snel mogelijk weer nieuwe exchange studenten het jaar van hun leven kunnen geven!", "fleurHeupersBio": "Hey, ik ben Fleur, ik ben lid van de commissie PR/Extern. In 2018/2019 ben ik naar Brazilië geweest en hoe gaaf was dat!!! Ik heb hier twee fantastische gezinnen gehad, heb veel mogen reizen en heb veel mensen leren kennen die ik nu nog spreek. Op dit moment ben ik in opleiding voor Officier Vlieger aan de Koninklijke Militare Academie in Breda. Ook hier heb ik het enorm naar mijn zijn. Zelfs nu merk ik nog elke dag dat mijn Exchange Year bijdraagt aan mijn persoonlijk ontwikkeling, iets waar ik in mijn opleiding veel mee bezig ben. Ik kan daarom iedereen aanraden om zo’n geweldig avontuur niet te laten liggen. Heb je vragen over mij, mijn Exchange Year of mijn opleiding? Schroom dan niet om mij een berichtje te sturen!", "juliaBrokBio": "Hallo, ik ben Julia en lid van de comissie Extern binnen Rotex en studeer op dit moment International Business in Enschede. In ben in het jaar 2019/2020 naar de USA vertrokken: de tijd van mijn leven! Naast een nieuwe cultuur en taal heb ik heel wat nieuwe vrienden mogen leren kennen. Voor altijd dankbaar dat Rotary deze programmas organiseert!", - "nikkiMureauBio": "Ik ben Nikki, en ik ben hoofd van commissie inbound bij Rotex!\n\nIn 2017-2018 ben ik op exchange geweest naar de mooiste plek van de wereld; Colombia! 🇨🇴 Ik woonde op een super klein eiland in de Caribische zee genaamd San Andres. Het is echt een paradijs en jullie kunnen je vast wel inbeelden hoe veel ik heb genoten van het lekkere weer, de prachtige stranden, de warmhartige mensen, en de levendige cultuur. Ik heb ook prachtige reizen mogen maken door het vaste land, en heb dus veel gezien van verschillende grote steden, kleine dorpjes, en de prachtige natuur zoals de amazone en Valle de cocora.\n\nEr gaat zelfs nu nog geen dag voorbij dat ik niet aan Colombia denk, en heb nog steeds veel contact met mijn gastfamilie. Ik merk dat Colombia echt een deel van mij is geworden, en ook altijd zal blijven!\n\nNu studeer ik Industrial Design aan de TU in Eindhoven. Ik vind het super leuk dat ik nog steeds zo betrokken ben bij het RYE programma via Rotex. Zeker bij commissie inbound zijn we veel in contact met de exchange studenten die in Nederland op exchange zijn. De weekenden die we organiseren voor de inbounders zijn echt super super gezellig, en ik ben blij dat ik de studenten weer nieuwe stukjes van Nederland kan laten zien, terwijl ik óók nog eens weer wat van hun nationaliteiten leer! (En het is natuurlijk super leuk om weer Spaans met ze te spreken 😉)\n\nKomend jaar mag ik de rol van voorzitter van rotex overnemen. Ik heb erg veel zin om het exchange programma komend jaar weer op te starten, en mensen het mooiste jaar van hun leven helpen verwerkelijken!", "daniekKoningBio": "Hii! Ik ben Daniek, 19 jaar en studeer momenteel Toegepaste Gerontologie op het Windesheim in Zwolle. \n\nIk ben in 2018/2019 op exchange geweest naar Canada. 🇨🇦 Ik zat in een heel klein plaatsje genaamd High River. Hier had ik super mooi uitzicht op de Rocky Mountains! 🏔Op uitwisseling gaan was één van de mooiste ervaringen die ik tot nu toe heb mogen mee maken. Super veel leuke mensen ontmoet, mooie plekken gezien en ontzettend veel geleerd. \n\nMomenteel zit ik in commissie inbound, waarbij we leuke activiteiten organiseren voor de uitwisseling studenten die naar Nederland komen.", "kevinKooistraBio": "Hallo allemaal, ik ben Kevin en ben 18 jaar. Ik studeer op dit moment International Business in Leeuwarden. Ik ben in het jaar 2019-2020 naar Juneau in Alaska geweest. Ik heb in dat jaar speciale, prachtige en leerzame ervaringen gehad en meegemaakt die mij altijd dierbaar blijven! Ik zou het iedereen aanraden om op Exchange te gaan, je zult er absoluut geen spijt van krijgen!", - "timoHomburgBio": "Mijn naam is Timo Homburg en ik ben sinds 2018 lid van Rotex Nederland. In 2017/2018 heb ik een jaar via Rotary Youth exchange een jaar in Brazilië gewoond. Samen met andere Rotexers probeer ik uitwisselingsstudenten te ondersteunen en inspireren op welke manier dan ook. Mijn doel is om ervoor te zorgen dat de uitwisseling van Rotary uitwisselingsstudenten een van de beste jaren van hun leven wordt.", - "sannePippingBio": "Hey Hey! Mijn naam is Sanne en ik ben samen met Timo het hoofd van de pre-rebound commissie. Ik help graag nieuwe uitwisselaars die net zo'n geweldige reis gaan maken als wij allemaal hebben gedaan! Ook helpen we terugkerende uitwisselaars om weer te wennen aan het Nederlandse leven.\n\nIk ben in 2017-2018 naar Canada geweest! Ik zat aan de grens met Amerika, dus ik mocht vaak van twee landen genieten. Ik woonde in een klein dorpje genaamd Burford. Dit ligt tussen de Niagara Falls en Toronto in. Hierdoor heb ik veel van dit prachtige land kunnen zien. \n\nBuiten Rotex zit ik in het vierde jaar van mijn bachelor Human Resource Management. Ik vind het heel leuk om mensen op te leiden en te helpen, ook toekomstige uitwisselingsstudenten!\n\nAarzel niet om contact met me op te nemen voor vragen over het geweldige avontuur dat je kunt hebben!", "anneLucasBio": "Ik ben Anne, 20 jaar. Op dit moment studeer ik Aviation ✈️ in Amsterdam. In 2019/2020 ben ik naar Te Kuiti, Nieuw-Zeeland geweest 🇳🇿.\n\nIk heb zo intens genoten van de tijd die ik heb mogen doorbrengen. Daarnaast heb ik door het hele land gereisd, en dus veel van Aotearoa mogen zien! Take it easy is wel het gene wat ik heb mee terug genomen naar Nederland, alles komt op z’n goed; she’ll be right zeggen Kiwi’s dan. \n\nHet leukste van de exchange vind ik, de vrienden die je voor altijd maakt en ik nog bijna dagelijks spreek! ❤️", "pascalStompBio": "Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source.", "emileLaitervoBio": "Mijn naam is Emil Laitervo, 19 jaar oud en ik heb net het gymnasium afgerond. Ik ben na mijn uitwisselingsjaar naar Chili veel bezig geweest met goede doelen en vooral veel lol hebben! Stuur mij gerust een berichtje via mijn sociale media als je meer wilt weten over mij en/of mijn uitwisselingsjaar.", "tiesKraaiBio": "...." -} +} \ No newline at end of file diff --git a/assets/lang/en.json b/assets/lang/en.json index d67a04b5..a169b1f1 100644 --- a/assets/lang/en.json +++ b/assets/lang/en.json @@ -3,6 +3,7 @@ "settingsTitle": "Additional", "account": "Account", "social": "Social", + "Development": "Development", "language": "Language", "privacyAndSecurity": "Privacy and security", "notifications": "Notifications", @@ -12,13 +13,10 @@ "victorStormBio": "Ik ben Victor, en ik ben hoofd van commissie extern.\n\nWij regelen de social media accounts en houden ons bezig met de media-taken van Rotex.\n\nIk ben zelf in het jaar 2017-2018 naar Taiwan geweest. Ik zat in het dorpje Huwei in de provincie Yunlin.\n\nTijdens mijn exchange heb ik veel van Taiwan kunnen zien, en heb ik door het exchange programma vrienden van over de hele wereld gemaakt.\n\nOnderhand studeer ik Psychologie in Amsterdam, en hoop ik dat we als Rotex zo snel mogelijk weer nieuwe exchange studenten het jaar van hun leven kunnen geven!", "fleurHeupersBio": "Hey, I'm Fleur, I'm a member of the PR/External committee. In 2018/2019 I went to Brazil and how cool was that!!! I had two amazing families here, got to travel a lot and met a lot of people that I still talk to today. At the moment I am training to be an Officer Pilot at the Royal Military Academy in Breda. Here too I am enjoying myself immensely. Even now I notice every day that my Exchange Year contributes to my personal development, something I am very busy with in my training. I can therefore recommend everyone not to miss out on such a great adventure. Do you have questions about me, my Exchange Year or my education? Do not hesitate to send me a message!", "juliaBrokBio": "Hello, I am Julia and a member of the External Committee within Rotex and am currently studying International Business in Enschede. In left for the USA in the year 2019/2020: the time of my life! Besides a new culture and language, I had the opportunity to meet a lot of new friends. Forever grateful that Rotary organizes these programs!", - "nikkiMureauBio": "I am Nikki, head of the inbound committee of Rotex!\n\nIn 2017-2018 I did my exchange in the most beautiful place of the world: Colombia! I lived on the tiny island called San Andres, located in the Caribbean sea. It's an absolutely beautiful place, where I got to enjoy the nice weather, beaches, warm-heartedness of the people, and the bright and lively culture. I also got to explore the mainland of Colombia, and saw a lot of different big cities, small villages and the gorgeous nature like the Amazon and Valle de Cocora.\n\nNot a day passes by where I don't think of Colombia, and I continue to talk to my hostfamily. I can notice Colombia really became a part of me, and will always be for the rest of my life.\n\nCurrently I am studying Industrial Design at the Technical University of Eindhoven. I really love that I am still involved in the RYE program through Rotex. Especially in the Inbound committee I stay in contact with exchange students in the Netherlands. The weekends we organize with Rotex for the inbounders are super fun, and I am happy that I get to show the Netherlands to the students, while I also continue to learn from their nationalities!\n\nThis coming year I get to be the next chairman of Rotex. I am super excited to set up the RYE program again for next year and help students realize the most amazing year of their lives!\n\nFor any questions, comments, suggestions, or collaborations I am happy to contact with you through LinkedIn, or you can call me", "daniekKoningBio": "Hii! Im Daniek, 19 years old and I’m currently studying age friendly design and innovation at Windesheim in Zwolle. In 2018/2019 I went on exchange to Canada 🇨🇦. I lived in a really small town called High River. Here I had a beautiful view of the Rocky Mountains!🏔 Going on exchange was one of the best experiences of my life. I met so many great people, I saw some awesome places and learned a lot! I am currently on the inbound committee where we organize fun activities for exchange students who are coming to the Netherlands.", "kevinKooistraBio": "Hello all, my name is Kevin and I am 18 years old. I am currently studying International Business in Leeuwarden. I went to Juneau in Alaska in the year 2019-2020. I had and experienced special, wonderful and educational experiences in that year that will always be dear to me! I would recommend it to everyone to go on Exchange, you will absolutely not regret it!", - "timoHomburgBio": "My name is Timo Homburg and I am a proud member of Rotex since 2018. In 2017/2018 I participated in Rotary Youth exchange programme and lived a year in Curitiba, Brazil. With Rotex I try to support and inspire future exchange students in any way possible. My goal is make sure that exchange students can enjoy their year of adventure to their full potential. ", - "sannePippingBio": "Hey Hey! My name is Sanne and I am the head of the pre-rebound committee together with Timo. I am happy to help new exchangers who are going to have a great journey like we all did! We also help returning exchangers to get used to Dutch life again.\n\nI went to Canada in 2017-2018! I was on the border with America, so I was often allowed to enjoy two countries. I lived in a small village called Burford. This is located between Niagara Falls and Toronto. This allowed me to see a lot of this beautiful country.\n\nOutside of Rotex I am in my fourth year of my bachelor degree in Human Resource Management. I really enjoy training and helping people, including future exchange students!\n\nDon’t hesitate to contact me for any questions about the amazing adventure you can have!", "anneLucasBio": "I am Anne, 20 years old. I am currently studying Aviation ✈️ in Amsterdam. In 2019/2020, I went to Te Kuiti, New Zealand 🇳🇿.\n\nI enjoyed the time so intensely that I got to spend there. In addition, I got to travel all over the country, so I got to see a lot of Aotearoa! Take it easy is the thing I took back to the Netherlands, everything will be alright; she'll be right they say. \n\nThe best thing of the exchange, I think, the friends you make forever and I still talk almost daily! ❤️", "pascalStompBio": "Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source.", "emileLaitervoBio": "My name is Emil Laitervo, 19 years old and I recently graduated from high school. After my exchange year to Chile I’ve been doing a lot with charities and having a lot of fun of course. Feel free to send me a message via social media if you want to know more about me and/or my exchange year.", "tiesKraaiBio": "...." -} +} \ No newline at end of file diff --git a/assets/lang/nl.json b/assets/lang/nl.json index beadf3c9..66cd8664 100644 --- a/assets/lang/nl.json +++ b/assets/lang/nl.json @@ -3,6 +3,7 @@ "settingsTitle": "Overig", "account": "Account", "social": "Social", + "Development": "Development", "language": "Taal", "privacyAndSecurity": "Privacy and security", "notifications": "Notifications", @@ -12,13 +13,10 @@ "victorStormBio": "Ik ben Victor, en ik ben hoofd van commissie extern.\n\nWij regelen de social media accounts en houden ons bezig met de media-taken van Rotex.\n\nIk ben zelf in het jaar 2017-2018 naar Taiwan geweest. Ik zat in het dorpje Huwei in de provincie Yunlin.\n\nTijdens mijn exchange heb ik veel van Taiwan kunnen zien, en heb ik door het exchange programma vrienden van over de hele wereld gemaakt.\n\nOnderhand studeer ik Psychologie in Amsterdam, en hoop ik dat we als Rotex zo snel mogelijk weer nieuwe exchange studenten het jaar van hun leven kunnen geven!", "fleurHeupersBio": "Hey, ik ben Fleur, ik ben lid van de commissie PR/Extern. In 2018/2019 ben ik naar Brazilië geweest en hoe gaaf was dat!!! Ik heb hier twee fantastische gezinnen gehad, heb veel mogen reizen en heb veel mensen leren kennen die ik nu nog spreek. Op dit moment ben ik in opleiding voor Officier Vlieger aan de Koninklijke Militare Academie in Breda. Ook hier heb ik het enorm naar mijn zijn. Zelfs nu merk ik nog elke dag dat mijn Exchange Year bijdraagt aan mijn persoonlijk ontwikkeling, iets waar ik in mijn opleiding veel mee bezig ben. Ik kan daarom iedereen aanraden om zo’n geweldig avontuur niet te laten liggen. Heb je vragen over mij, mijn Exchange Year of mijn opleiding? Schroom dan niet om mij een berichtje te sturen!", "juliaBrokBio": "Hallo, ik ben Julia en lid van de comissie Extern binnen Rotex en studeer op dit moment International Business in Enschede. In ben in het jaar 2019/2020 naar de USA vertrokken: de tijd van mijn leven! Naast een nieuwe cultuur en taal heb ik heel wat nieuwe vrienden mogen leren kennen. Voor altijd dankbaar dat Rotary deze programmas organiseert!", - "nikkiMureauBio": "Ik ben Nikki, en ik ben hoofd van commissie inbound bij Rotex!\n\nIn 2017-2018 ben ik op exchange geweest naar de mooiste plek van de wereld; Colombia! 🇨🇴 Ik woonde op een super klein eiland in de Caribische zee genaamd San Andres. Het is echt een paradijs en jullie kunnen je vast wel inbeelden hoe veel ik heb genoten van het lekkere weer, de prachtige stranden, de warmhartige mensen, en de levendige cultuur. Ik heb ook prachtige reizen mogen maken door het vaste land, en heb dus veel gezien van verschillende grote steden, kleine dorpjes, en de prachtige natuur zoals de amazone en Valle de cocora.\n\nEr gaat zelfs nu nog geen dag voorbij dat ik niet aan Colombia denk, en heb nog steeds veel contact met mijn gastfamilie. Ik merk dat Colombia echt een deel van mij is geworden, en ook altijd zal blijven!\n\nNu studeer ik Industrial Design aan de TU in Eindhoven. Ik vind het super leuk dat ik nog steeds zo betrokken ben bij het RYE programma via Rotex. Zeker bij commissie inbound zijn we veel in contact met de exchange studenten die in Nederland op exchange zijn. De weekenden die we organiseren voor de inbounders zijn echt super super gezellig, en ik ben blij dat ik de studenten weer nieuwe stukjes van Nederland kan laten zien, terwijl ik óók nog eens weer wat van hun nationaliteiten leer! (En het is natuurlijk super leuk om weer Spaans met ze te spreken 😉)\n\nKomend jaar mag ik de rol van voorzitter van rotex overnemen. Ik heb erg veel zin om het exchange programma komend jaar weer op te starten, en mensen het mooiste jaar van hun leven helpen verwerkelijken!", "daniekKoningBio": "Hii! Ik ben Daniek, 19 jaar en studeer momenteel Toegepaste Gerontologie op het Windesheim in Zwolle. \n\nIk ben in 2018/2019 op exchange geweest naar Canada. 🇨🇦 Ik zat in een heel klein plaatsje genaamd High River. Hier had ik super mooi uitzicht op de Rocky Mountains! 🏔Op uitwisseling gaan was één van de mooiste ervaringen die ik tot nu toe heb mogen mee maken. Super veel leuke mensen ontmoet, mooie plekken gezien en ontzettend veel geleerd. \n\nMomenteel zit ik in commissie inbound, waarbij we leuke activiteiten organiseren voor de uitwisseling studenten die naar Nederland komen.", "kevinKooistraBio": "Hallo allemaal, ik ben Kevin en ben 18 jaar. Ik studeer op dit moment International Business in Leeuwarden. Ik ben in het jaar 2019-2020 naar Juneau in Alaska geweest. Ik heb in dat jaar speciale, prachtige en leerzame ervaringen gehad en meegemaakt die mij altijd dierbaar blijven! Ik zou het iedereen aanraden om op Exchange te gaan, je zult er absoluut geen spijt van krijgen!", - "timoHomburgBio": "Mijn naam is Timo Homburg en ik ben sinds 2018 lid van Rotex Nederland. In 2017/2018 heb ik een jaar via Rotary Youth exchange een jaar in Brazilië gewoond. Samen met andere Rotexers probeer ik uitwisselingsstudenten te ondersteunen en inspireren op welke manier dan ook. Mijn doel is om ervoor te zorgen dat de uitwisseling van Rotary uitwisselingsstudenten een van de beste jaren van hun leven wordt.", - "sannePippingBio": "Hey Hey! Mijn naam is Sanne en ik ben samen met Timo het hoofd van de pre-rebound commissie. Ik help graag nieuwe uitwisselaars die net zo'n geweldige reis gaan maken als wij allemaal hebben gedaan! Ook helpen we terugkerende uitwisselaars om weer te wennen aan het Nederlandse leven.\n\nIk ben in 2017-2018 naar Canada geweest! Ik zat aan de grens met Amerika, dus ik mocht vaak van twee landen genieten. Ik woonde in een klein dorpje genaamd Burford. Dit ligt tussen de Niagara Falls en Toronto in. Hierdoor heb ik veel van dit prachtige land kunnen zien. \n\nBuiten Rotex zit ik in het vierde jaar van mijn bachelor Human Resource Management. Ik vind het heel leuk om mensen op te leiden en te helpen, ook toekomstige uitwisselingsstudenten!\n\nAarzel niet om contact met me op te nemen voor vragen over het geweldige avontuur dat je kunt hebben!", "anneLucasBio": "Ik ben Anne, 20 jaar. Op dit moment studeer ik Aviation ✈️ in Amsterdam. In 2019/2020 ben ik naar Te Kuiti, Nieuw-Zeeland geweest 🇳🇿.\n\nIk heb zo intens genoten van de tijd die ik heb mogen doorbrengen. Daarnaast heb ik door het hele land gereisd, en dus veel van Aotearoa mogen zien! Take it easy is wel het gene wat ik heb mee terug genomen naar Nederland, alles komt op z’n goed; she’ll be right zeggen Kiwi’s dan. \n\nHet leukste van de exchange vind ik, de vrienden die je voor altijd maakt en ik nog bijna dagelijks spreek! ❤️", "pascalStompBio": "Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source.", "emileLaitervoBio": "Mijn naam is Emil Laitervo, 19 jaar oud en ik heb net het gymnasium afgerond. Ik ben na mijn uitwisselingsjaar naar Chili veel bezig geweest met goede doelen en vooral veel lol hebben! Stuur mij gerust een berichtje via mijn sociale media als je meer wilt weten over mij en/of mijn uitwisselingsjaar.", "tiesKraaiBio": "...." -} +} \ No newline at end of file diff --git a/assets/students/list.json b/assets/students/list.json index dce3700b..ea002dc2 100644 --- a/assets/students/list.json +++ b/assets/students/list.json @@ -619,6 +619,206 @@ "to": "Italy", "toFlag": "it" } + ], + "2023-2024": [ + { + "name": "Norah van de Vegte", + "description": "Long Exchange Year 2023-2024", + "bio": "Hey! My name is Norah van der Vegte and I am currently 17 years old. I live in Zwolle (for now) and once I am back from my exchange I would love to study Creative Writing at Artez.\n\n My exchange year will be in Vichy, the south of France! I am as curious as excited and I am very much looking forward to my year in France. Not only the language, but the customs and people are what drawn me to the country.\n\nI think it will be a totally different world from my own, not just because of the language and customs I mentioned just now, but also the idea of living with new people and creating new connections with people I otherwise never would have met.", + "imageUrl": "https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/norah-van-de-vegte.jpg", + "videoUrl": null, + "from": "Netherlands", + "fromFlag": "nl", + "to": "France", + "toFlag": "fr" + }, + { + "name": "Jesse Talens", + "description": "Long Exchange Year 2023-2024", + "bio": "Hoi! Ik ben Jesse en ik ga volgend jaar naar Finland!\n\nMijn nieuwe woonplaats is Klaukkala, een dorp 20 kilometer ten noorden van Helsinki. Ik houd van avontuur en dingen ontdekken en ik hoop dat veel te kunnen doen volgend jaar! De Finse taal is best moeilijk, dus ik ben al begonnen met leren, en ik hoop dat ik het snel onder de knie krijg! Verder hoop ik volgend jaar nog veel andere dingen te leren, zoals ijshockey en hoe je van een sauna kan genieten!", + "imageUrl": "https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/jesse-talens.jpg", + "videoUrl": null, + "from": "Netherlands", + "fromFlag": "nl", + "to": "Finland", + "toFlag": "fi" + }, + { + "name": "Sander van Dam", + "description": "Long Exchange Year 2023-2024", + "bio": "Ik ben Sander van Dam, ik ben 17 jaar en woon in Lochem. \n\n Mijn hobby’s zijn sporten, zoals naar de sportschool en mountainbiken, met vrienden afspreken en reizen. \n\n Ik ga op exchange naar Argentinië! Ik hoop dat ik een goede band opbouw met de gastfamillies en vrienden die ik daar maak. Ook heb ik heel veel zin om de Argentijnse cultuur te leren kennen en vloeiend Spaans te leren spreken.\n\nIk heb er heel veel zin in en kan niet wachten om in het vliegtuig te stappen en dit avontuur te beginnen!", + "imageUrl": "https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/sander-van-dam.jpg", + "videoUrl": null, + "from": "Netherlands", + "fromFlag": "nl", + "to": "Argentina", + "toFlag": "ar" + }, + { + "name": "Leonie Poland", + "description": "Long Exchange Year 2023-2024", + "bio": "Hi there, \n\n Mijn naam is Leonie Poland. Ik ben 17 jaar oud. Ik woon in Wervershoof en zit in het 2 de jaar van mijn mbo opleiding.\n\n Ik ga op uitwisseling naar Amerika! Ik ga wonen in de staat Kansas dat is in het bijna het middelste punt van Amerika. Mijn dorpje heet Council grove en ligt een uur rijden van de hoofdstad Topeka. Ik heb contact met mijn gastgezin en met mijn district de mensen zijn allemaal heel lief en verwelkomend en zijn super enthousiast om een Nederlands iemand te hosten aangezien ik de eerst ooit uit Nederland zal zijn.\n\n Ik kijk uit naar de hele ervaring en om zoveel nieuwe mensen te ontmoeten en vriendschapen voor het leven te sluiten. Ik heb de selectie procedure twee keer mogen doorlopen en voel mij helemaal klaar voor dit te gekke avontuur. Ik vind het natuurlijk ook spannend maar ik ben al zo welkom ontvangen dat moet wel goedkomen. Ik vind het ook heel leuk om nu al het proces van de andere uitwisselingsstudenten te volgen van zowel die uit Nederland als de uitwisselingstudenten uit mijn district. Ik heb er zin in!", + "imageUrl": "https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/leonie-poland.jpg", + "videoUrl": null, + "from": "Netherlands", + "fromFlag": "nl", + "to": "USA", + "toFlag": "us" + }, + { + "name": "Mirthe Vereecken", + "description": "Long Exchange Year 2023-2024", + "bio": "Hoi ik ben Mirthe Vereecken 15 jaar oud en ik mag in 2023/2024 Rotary Nederland vertegenwoordigen.\n Ik ga naar de plaats Campbell River op Vancouver Island in Canada. \n\n Behalve naar de highschool kan ik hier mijn 2 grote hobby’s beoefenen, veld hockey en skiën. \n\n Ik kom uit Zwolle maar mijn sponsor club is Rotary Club Dronten. \n\n Ik kan niet wachten om naar Canada te gaan. Ik hoop dat ik daar veel vrienden maak en een jaar heb om nooit meer te vergeten. \n\n Het selectie weekend en de trainingsdag in Utrecht was ook super leuk en leerzaam.", + "imageUrl": "https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/mirthe-vereecken.png", + "videoUrl": null, + "from": "Netherlands", + "fromFlag": "nl", + "to": "Canada", + "toFlag": "ca" + }, + { + "name": "Sophie Linssen", + "description": "Long Exchange Year 2023-2024", + "bio": "Hee! Ik ben Sophie, ik ben 17 jaar en ik woon in Maarssen. In mijn vrije tijd doe ik graag dingen met vrienden, werk ik in de horeca en volg ik danslessen. \n\n Dit jaar ga ik naar Santos in Brazilië. Santos ligt aan de kust in de buurt van de stad Sao Paulo. Ik heb super veel zin om de Braziliaanse cultuur te ontdekken. Ik kijk er naar uit om nieuwe mensen te leren kennen en hopelijk heel snel Portugees te kunnen spreken. Ook lijkt het me super leuk om de nationale dansen te leren en Brazilië feesten mee te maken. Ik heb inmiddels contact met mijn eerste gastgezin en daardoor krijg ik extra veel zin om te gaan. In het voortraject heb al veel leuke mensen ontmoet en wens iedereen een heel tof uitwisselingsjaar!!\n\n Groetjes van Sophie!", + "imageUrl": "https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/sophie-linssen.jpg", + "videoUrl": null, + "from": "Netherlands", + "fromFlag": "nl", + "to": "Brazil", + "toFlag": "br" + }, + { + "name": "Esmyra Waar", + "description": "Long Exchange Year 2023-2024", + "bio": "Hii ik ben Esmyra Waar, 18 jaar oud en woon in Harlingen Friesland.\n\n Ik verhuis dit jaar voor een jaar lang naar Sandpoint Idaho in de Verenigde Staten, bij de grens van Canada. Het is een heel mooi plekje, met een strand en skipiste.\n Sandpoint is erg sportief, ze doen er graag aan onderandere wandelen door de bergen, kajakken, zwemmen en skiën/ snowboarden dus ik hoop daar het sportieve meer op te pakken. \n\n Ik ben super benieuwd naar het avontuur dat staat te wachten op mij en alle nieuwe mensen die ik ga ontmoeten!", + "imageUrl": "https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/esmyra-waar.png", + "videoUrl": null, + "from": "Netherlands", + "fromFlag": "nl", + "to": "USA", + "toFlag": "us" + }, + { + "name": "Philipien van Waveren Hogervorst", + "description": "Long Exchange Year 2023-2024", + "bio": "Hoi allemaal! \n Ik ben Philipien.\n Ik ben 17 jaar oud, ik zit nu in 5 havo. \n En ik ga in 2023/2024 naar Mexico!!! \n Ik ga naar district 4170, wat in de omgeving van Mexico-stad ligt. \n\n In 2012 heb ik al voor 3 weken rondgereisd in Mexico. Ik heb heel veel gezien maar omdat ik zo jong was weet ik daar niet alles meer van. Dus nu, 11 jaar later, hoop ik heel wat nieuwe avonturen aan mijn Mexico herinneringen toe te kunnen voegen. \n\n Ik vind het heel leuk dat ik daar zoveel nieuwe dingen ga meemaken en mensen ga ontmoeten. Ook heb ik heel veel zin in het lekkere Mexicaanse eten! En het spaans leren natuurlijk. \n\n Wel vind ik het gek om straks opeens een jaar geen nederlands te spreken maar hoe kan je leuker een nieuwe taal leren dan via een uitwisseling! Dus ook daar kijk ik erg naar uit.\n\n Alles bij elkaar heb ik er super veel zin in en kan ik niet wachten tot het avontuur begint.\n\n Adiósss!", + "imageUrl": "https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/philipien-van-waveren-hogervorst.jpg", + "videoUrl": null, + "from": "Netherlands", + "fromFlag": "nl", + "to": "Mexico", + "toFlag": "mx" + }, + { + "name": "Zomer Dijkstra", + "description": "Long Exchange Year 2023-2024", + "bio": "Hallo allemaal! Ik ben Zomer Dijkstra en ik ben 17 jaar oud. \n Tijdens het leren voor mijn examens van havo 5 ben ik ook al druk bezig met mijn vertrek naar Brazilië! \n\n De eerste woordjes worden met Duolingo al geleerd en als ik terug kom kan ik natuurlijk een goed gesprek voeren in het Portugees! Ik ga in Brazilië heel veel mensen leren kennen en natuurlijk ontzettend veel leren over van alles. Van andere gewoontes en eten tot aan zelfstandig dingen regelen en volwassen worden. Ik verwacht vooral dat ik het heel erg leuk ga hebben en een tweede thuis van Brazilië kan maken. \n\n Naast dat ik toch wel een beetje zenuwachtig ben om aan het eind van dit jaar te gaan, heb ik er ook echt ontzettend veel zin in en ben benieuwd wat er allemaal op mijn pad zal komen!", + "imageUrl": "https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/zomer-dijkstra.png", + "videoUrl": null, + "from": "Netherlands", + "fromFlag": "nl", + "to": "Brazil", + "toFlag": "br" + }, + { + "name": "Annefleur Derksen", + "description": "Long Exchange Year 2023-2024", + "bio": "Hoi!\n\n Ik ben Annefleur, 15 jaar en zit in HAVO 5. Voor mijn exchange mag ik naar district 5060! Dit is een 2-landen district. Dit houdt in dat ik of in Washington state, Amerika terechtkom of in het zuiden van British Columbia, Canada.\n\n Ik wilde al op exchange sinds dat ik 10 ben en kan daarom ook niet wachten om dit leuke avontuur te laten beginnen. Tijdens mijn exchange hoop ik nieuwe mensen te ontmoeten, veel kennis op te doen en mooie plekken te mogen bezoeken. Ook ben ik erg benieuwd naar het schoolleven.\n\n Kortom, ik heb enorm veel zin in ‘my lifetime in a year’.", + "imageUrl": "https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/annefleur-derksen.png", + "videoUrl": null, + "from": "Netherlands", + "fromFlag": "nl", + "to": "Canada", + "toFlag": "ca" + }, + { + "name": "Paco Dijkstra", + "description": "Long Exchange Year 2023-2024", + "bio": "Hallo ik ben Paco Dijkstra ik zit op hockey. Ik ben 16 jaar oud en ik word 17 in Spanje, het land waar ik op exchange ga. Ik hoop dat ik veel nieuwe dingen ga leren, waaronder de cultuur en de taal, maar hopelijk nog veel meer. Ik wil graag in Spanje veel nieuwe mensen leren kennen en nieuwe vriendschappen aangaan.\n\n De weg naar de Exchange toe was leuk waaronder de activiteiten. Bij de activiteiten hebben we eigenlijk alleen maar leuke dingen gedaan en heb ik de kans gekregen om al veel nieuwe kinderen te leren kennen in Nederland.", + "imageUrl": "https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/paco-dijkstra.jpg", + "videoUrl": null, + "from": "Netherlands", + "fromFlag": "nl", + "to": "Spain", + "toFlag": "es" + }, + { + "name": "Jackie-Li Molenaar", + "description": "Long Exchange Year 2023-2024", + "bio": "Hii, ik ben Jackie-Li Molenaar en ik woon in Utrecht. En ik ben 17 jaar oud. Ik ga op Exchange naar Florida, de verenigde Staten. \n\n Het was al een droom van kinds af aan om naar Amerika toe te gaan en dit mag ik nu gaan doen!\n\n Ik hoop dat ik een heel leuk jaar zal hebben en ook nieuwe vrienden ga maken met wie ik voor heel lang nog contact mee zal houden. En daarnaast kijk ik er naar uit om nog zelfstandiger te worden en mezelf wat beter te leren kennen.", + "imageUrl": "https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/jackie-li-molenaar.jpg", + "videoUrl": null, + "from": "Netherlands", + "fromFlag": "nl", + "to": "USA", + "toFlag": "us" + }, + { + "name": "Rachel van Dijk", + "description": "Long Exchange Year 2023-2024", + "bio": "Hoii, ik ben Rachel, ik ben 17 jaar en ik kom uit Gouda. Ik hou erg van dansen (modern/jazz) en afspreken met vrienden. \n\n Volgend jaar ga ik in mijn tussenjaar op Exchange naar district 2042 in Italië. Dat is het district boven Milaan. Ik heb heel veel zin om naar Italië te gaan en om de Italiaanse cultuur te leren kennen en de taal te leren. \n\n De voorbereiding van het Exchange jaar is tot nu toe erg leuk. We hebben laatst ook een erg gezellige dag gehad in Utrecht met alle toekomstige Exchange studenten. Iedereen is erg aardig en erg enthousiast. \n\n Arrivederci!", + "imageUrl": "https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/rachel-van-dijk.jpg", + "videoUrl": null, + "from": "Netherlands", + "fromFlag": "nl", + "to": "Italy", + "toFlag": "it" + }, + { + "name": "Taco van Hooijdonk", + "description": "Long Exchange Year 2023-2024", + "bio": "Ik ben Taco van Hooijdonk, 16 jaar uit Etten-Leur. \n\n Binnenkort vertrek ik naar Curitiba, Brazilië, voor een uitwisselingsjaar! Ik kijk ernaar uit om nieuwe ervaringen op te doen, de Braziliaanse cultuur te ontdekken en het lokale sportleven te verkennen. Het traject om hier te komen verliep soepel en ik heb al leuke tijd gehad met mijn mede 'prebounds'. Ik wens hen allemaal een fantastisch jaar vol mooie avonturen toe.\n\n Wil je mijn tijd daar volgen? Neem dan een kijkje op mijn Instagram-account @taco_vh\n\n Groetjes,\n Taco van Hooijdonk", + "imageUrl": "https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/taco-van-hooijdonk.png", + "videoUrl": null, + "from": "Netherlands", + "fromFlag": "nl", + "to": "Brazil", + "toFlag": "br" + }, + { + "name": "Pepijn Kimmels", + "description": "Long Exchange Year 2023-2024", + "bio": "Ik ben Pepijn Kimmels en ik ben 18 jaar oud. Ik woon in Winterswijk, een dorp in het oosten van Gelderland, hier woon ik met mijn ouders, oudere zus Sennah en tweelingbroer Julian. Ik zit op dit moment nog op het Gerrit Komrij College, waar ik de HAVO volg. Ook speel ik voetbal, dit doe ik al bijna 12 jaar en ik hoop dat ik dat in mijn Exchange jaar kan blijven doen maar het lijkt me ook leuk om iets anders te proberen. \n\n Toen ik 12 was hadden wij een meisje uit India in huis via de Rotary Youth Exchange. Dit vond ik heel leuk en interessant en daardoor ben ik mij er ook in gaan verdiepen. Nu, bijna 6 jaar later ben ik erg blij om te zeggen dat ik ook via de Rotary op Exchange mag. \n\n Ik ga in Augustus naar de Verenigde Staten, naar het zuiden van de staat Californië naar de kleine stad genaamd Carlsbad, gelegen aan de kust. De afgelopen weken bestonden voor mij vooral uit het ontdekken op Google van de regio waar ik kom te wonen en het regelen van mijn visum. Dit heb ik nu ook bijna afgerond en dat betekent dat ik zo goed als klaar ben om op het vliegtuig te stappen en een compleet nieuwe ervaring op te doen.\n\n Ik krijg vaak de vraag of ik het spannend vind om een jaar weg te gaan maar op dit moment ben ik vooral enthousiast maar wie weet komt de spanning nog wel.", + "imageUrl": "https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/pepijn-kimmels.jpg", + "videoUrl": null, + "from": "Netherlands", + "fromFlag": "nl", + "to": "USA", + "toFlag": "us" + }, + { + "name": "Sem Weenk", + "description": "Long Exchange Year 2023-2024", + "bio": "Hoi, ik ben Sem en ik ben 17 jaar oud. Ik zit nu in 5 havo en ik ga na dit schooljaar een tussenjaar nemen om een exchange student te worden. \n\n Ik ga op exchange naar de Verenigde Staten waar ik kom te wonen in het plaatsje Middlebury in Vermont. Ik heb al twee van mijn komende gastgezinnen ontmoet via Zoom. Het was heel leuk om ze zo alvast even te kunnen ontmoeten en ik kijk erna uit om ze in het echt te kunnen gaan zien. \n\n Ik kijk heel erg uit naar dit onvergetelijke avontuur en ik hoop in dit jaar allemaal geweldige vrienden en herinneringen te gaan maken. Ik hoop ook veel nieuwe dingen te gaan leren en om mezelf als persoon verder te gaan ontwikkelen. \n\n Ik heb tot nu toe al veel plezier gehad tijdens alle voorbereidingen en ik kan niet wachten tot dat het echte avontuur gaat beginnen.", + "imageUrl": "https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/sem-weenk.png", + "videoUrl": null, + "from": "Netherlands", + "fromFlag": "nl", + "to": "USA", + "toFlag": "us" + }, + { + "name": "Marre Kroese", + "description": "Long Exchange Year 2023-2024", + "bio": "Hallo, ik ben Marre Kroese en ik ga komend schooljaar naar Mexico!! Ik heb er super veel zin in en kijk er erg naar uit om nieuwe mensen te leren kennen en leuke herinneringen te maken. \n\n Ik heb vanaf kleins af aan al gezegd dat ik high school wil gaan doen, want eigenlijk wilde ik altijd naar Amerika. Op de informatiedag van Rotary in september heb ik mij meer laten vertellen over Mexico en vanaf dat moment wist ik het zeker dat ik naar Mexico wilde.\n\n Ik wil heel graag Spaans kunnen spreken, dus dit is een geweldige kans om deze taal te gaan leren. Ik kan niet wachten om naar Mexico te gaan!\n\n Ik zal vast veel gaan delen op mijn instagram, dus als je mij wilt volgen: marre.kroese.", + "imageUrl": "https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/marre-kroese.jpg", + "videoUrl": null, + "from": "Netherlands", + "fromFlag": "nl", + "to": "Mexico", + "toFlag": "mx" + }, + { + "name": "Boet Mostert", + "description": "Long Exchange Year 2023-2024", + "bio": "Hallo ik ben Boet Mostert en ik ben 17 jaar oud.\n Ik woon al mijn hele leven in Weesp. Daar ga ik ook naar school en sport ik.\n\n Mijn favoriete sport is voetbal dat doe ik nu al zo'n 10 jaar. Ik vind mijn sociale leven ook erg belangrijk dus ben ik vaak met vrienden iets aan het doen.\n\n Ik ga dit jaar naar Indonesië en daar heb ik erg veel zin in. Ik kijk uit nar de prachtige cultuur, landschap en mensen maar ook naar het gewone dagelijks leven daar.", + "imageUrl": "https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/boet-mostert.png", + "videoUrl": null, + "from": "Netherlands", + "fromFlag": "nl", + "to": "Indonesia", + "toFlag": "id" + } ] } } \ No newline at end of file diff --git a/ios/Podfile b/ios/Podfile index d42a12ff..2d122814 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project - platform :ios, '12.0' + platform :ios, '13.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' @@ -47,7 +47,7 @@ post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_ios_build_settings(target) target.build_configurations.each do |config| - config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0' + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0' end end end diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 00490799..c09eba7e 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,110 +1,156 @@ PODS: - - abseil/algorithm (1.20220623.0): - - abseil/algorithm/algorithm (= 1.20220623.0) - - abseil/algorithm/container (= 1.20220623.0) - - abseil/algorithm/algorithm (1.20220623.0): + - abseil/algorithm (1.20240116.2): + - abseil/algorithm/algorithm (= 1.20240116.2) + - abseil/algorithm/container (= 1.20240116.2) + - abseil/algorithm/algorithm (1.20240116.2): - abseil/base/config - - abseil/algorithm/container (1.20220623.0): + - abseil/xcprivacy + - abseil/algorithm/container (1.20240116.2): - abseil/algorithm/algorithm - abseil/base/core_headers + - abseil/base/nullability - abseil/meta/type_traits - - abseil/base (1.20220623.0): - - abseil/base/atomic_hook (= 1.20220623.0) - - abseil/base/base (= 1.20220623.0) - - abseil/base/base_internal (= 1.20220623.0) - - abseil/base/config (= 1.20220623.0) - - abseil/base/core_headers (= 1.20220623.0) - - abseil/base/dynamic_annotations (= 1.20220623.0) - - abseil/base/endian (= 1.20220623.0) - - abseil/base/errno_saver (= 1.20220623.0) - - abseil/base/fast_type_id (= 1.20220623.0) - - abseil/base/log_severity (= 1.20220623.0) - - abseil/base/malloc_internal (= 1.20220623.0) - - abseil/base/prefetch (= 1.20220623.0) - - abseil/base/pretty_function (= 1.20220623.0) - - abseil/base/raw_logging_internal (= 1.20220623.0) - - abseil/base/spinlock_wait (= 1.20220623.0) - - abseil/base/strerror (= 1.20220623.0) - - abseil/base/throw_delegate (= 1.20220623.0) - - abseil/base/atomic_hook (1.20220623.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/base/base (1.20220623.0): + - abseil/xcprivacy + - abseil/base (1.20240116.2): + - abseil/base/atomic_hook (= 1.20240116.2) + - abseil/base/base (= 1.20240116.2) + - abseil/base/base_internal (= 1.20240116.2) + - abseil/base/config (= 1.20240116.2) + - abseil/base/core_headers (= 1.20240116.2) + - abseil/base/cycleclock_internal (= 1.20240116.2) + - abseil/base/dynamic_annotations (= 1.20240116.2) + - abseil/base/endian (= 1.20240116.2) + - abseil/base/errno_saver (= 1.20240116.2) + - abseil/base/fast_type_id (= 1.20240116.2) + - abseil/base/log_severity (= 1.20240116.2) + - abseil/base/malloc_internal (= 1.20240116.2) + - abseil/base/no_destructor (= 1.20240116.2) + - abseil/base/nullability (= 1.20240116.2) + - abseil/base/prefetch (= 1.20240116.2) + - abseil/base/pretty_function (= 1.20240116.2) + - abseil/base/raw_logging_internal (= 1.20240116.2) + - abseil/base/spinlock_wait (= 1.20240116.2) + - abseil/base/strerror (= 1.20240116.2) + - abseil/base/throw_delegate (= 1.20240116.2) + - abseil/base/atomic_hook (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/xcprivacy + - abseil/base/base (1.20240116.2): - abseil/base/atomic_hook - abseil/base/base_internal - abseil/base/config - abseil/base/core_headers + - abseil/base/cycleclock_internal - abseil/base/dynamic_annotations - abseil/base/log_severity + - abseil/base/nullability - abseil/base/raw_logging_internal - abseil/base/spinlock_wait - abseil/meta/type_traits - - abseil/base/base_internal (1.20220623.0): + - abseil/xcprivacy + - abseil/base/base_internal (1.20240116.2): - abseil/base/config - abseil/meta/type_traits - - abseil/base/config (1.20220623.0) - - abseil/base/core_headers (1.20220623.0): + - abseil/xcprivacy + - abseil/base/config (1.20240116.2): + - abseil/xcprivacy + - abseil/base/core_headers (1.20240116.2): + - abseil/base/config + - abseil/xcprivacy + - abseil/base/cycleclock_internal (1.20240116.2): + - abseil/base/base_internal - abseil/base/config - - abseil/base/dynamic_annotations (1.20220623.0): + - abseil/xcprivacy + - abseil/base/dynamic_annotations (1.20240116.2): - abseil/base/config - abseil/base/core_headers - - abseil/base/endian (1.20220623.0): + - abseil/xcprivacy + - abseil/base/endian (1.20240116.2): - abseil/base/base - abseil/base/config - abseil/base/core_headers - - abseil/base/errno_saver (1.20220623.0): + - abseil/base/nullability + - abseil/xcprivacy + - abseil/base/errno_saver (1.20240116.2): - abseil/base/config - - abseil/base/fast_type_id (1.20220623.0): + - abseil/xcprivacy + - abseil/base/fast_type_id (1.20240116.2): - abseil/base/config - - abseil/base/log_severity (1.20220623.0): + - abseil/xcprivacy + - abseil/base/log_severity (1.20240116.2): - abseil/base/config - abseil/base/core_headers - - abseil/base/malloc_internal (1.20220623.0): + - abseil/xcprivacy + - abseil/base/malloc_internal (1.20240116.2): - abseil/base/base - abseil/base/base_internal - abseil/base/config - abseil/base/core_headers - abseil/base/dynamic_annotations - abseil/base/raw_logging_internal - - abseil/base/prefetch (1.20220623.0): + - abseil/xcprivacy + - abseil/base/no_destructor (1.20240116.2): - abseil/base/config - - abseil/base/pretty_function (1.20220623.0) - - abseil/base/raw_logging_internal (1.20220623.0): + - abseil/xcprivacy + - abseil/base/nullability (1.20240116.2): + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/base/prefetch (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/xcprivacy + - abseil/base/pretty_function (1.20240116.2): + - abseil/xcprivacy + - abseil/base/raw_logging_internal (1.20240116.2): - abseil/base/atomic_hook - abseil/base/config - abseil/base/core_headers - abseil/base/errno_saver - abseil/base/log_severity - - abseil/base/spinlock_wait (1.20220623.0): + - abseil/xcprivacy + - abseil/base/spinlock_wait (1.20240116.2): - abseil/base/base_internal - abseil/base/core_headers - abseil/base/errno_saver - - abseil/base/strerror (1.20220623.0): + - abseil/xcprivacy + - abseil/base/strerror (1.20240116.2): - abseil/base/config - abseil/base/core_headers - abseil/base/errno_saver - - abseil/base/throw_delegate (1.20220623.0): + - abseil/xcprivacy + - abseil/base/throw_delegate (1.20240116.2): - abseil/base/config - abseil/base/raw_logging_internal - - abseil/cleanup/cleanup (1.20220623.0): + - abseil/xcprivacy + - abseil/cleanup/cleanup (1.20240116.2): - abseil/base/config - abseil/base/core_headers - abseil/cleanup/cleanup_internal - - abseil/cleanup/cleanup_internal (1.20220623.0): + - abseil/xcprivacy + - abseil/cleanup/cleanup_internal (1.20240116.2): - abseil/base/base_internal - abseil/base/core_headers - abseil/utility/utility - - abseil/container/common (1.20220623.0): + - abseil/xcprivacy + - abseil/container/common (1.20240116.2): - abseil/meta/type_traits - abseil/types/optional - - abseil/container/compressed_tuple (1.20220623.0): + - abseil/xcprivacy + - abseil/container/common_policy_traits (1.20240116.2): + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/container/compressed_tuple (1.20240116.2): - abseil/utility/utility - - abseil/container/container_memory (1.20220623.0): + - abseil/xcprivacy + - abseil/container/container_memory (1.20240116.2): - abseil/base/config - abseil/memory/memory - abseil/meta/type_traits - abseil/utility/utility - - abseil/container/fixed_array (1.20220623.0): + - abseil/xcprivacy + - abseil/container/fixed_array (1.20240116.2): - abseil/algorithm/algorithm - abseil/base/config - abseil/base/core_headers @@ -112,92 +158,159 @@ PODS: - abseil/base/throw_delegate - abseil/container/compressed_tuple - abseil/memory/memory - - abseil/container/flat_hash_map (1.20220623.0): + - abseil/xcprivacy + - abseil/container/flat_hash_map (1.20240116.2): - abseil/algorithm/container - abseil/base/core_headers - abseil/container/container_memory - abseil/container/hash_function_defaults - abseil/container/raw_hash_map - abseil/memory/memory - - abseil/container/flat_hash_set (1.20220623.0): + - abseil/xcprivacy + - abseil/container/flat_hash_set (1.20240116.2): - abseil/algorithm/container - abseil/base/core_headers - abseil/container/container_memory - abseil/container/hash_function_defaults - abseil/container/raw_hash_set - abseil/memory/memory - - abseil/container/hash_function_defaults (1.20220623.0): + - abseil/xcprivacy + - abseil/container/hash_function_defaults (1.20240116.2): - abseil/base/config - abseil/hash/hash - abseil/strings/cord - abseil/strings/strings - - abseil/container/hash_policy_traits (1.20220623.0): + - abseil/xcprivacy + - abseil/container/hash_policy_traits (1.20240116.2): + - abseil/container/common_policy_traits - abseil/meta/type_traits - - abseil/container/hashtable_debug_hooks (1.20220623.0): + - abseil/xcprivacy + - abseil/container/hashtable_debug_hooks (1.20240116.2): - abseil/base/config - - abseil/container/hashtablez_sampler (1.20220623.0): + - abseil/xcprivacy + - abseil/container/hashtablez_sampler (1.20240116.2): - abseil/base/base - abseil/base/config - abseil/base/core_headers + - abseil/base/raw_logging_internal - abseil/debugging/stacktrace - abseil/memory/memory - abseil/profiling/exponential_biased - abseil/profiling/sample_recorder - abseil/synchronization/synchronization + - abseil/time/time - abseil/utility/utility - - abseil/container/inlined_vector (1.20220623.0): + - abseil/xcprivacy + - abseil/container/inlined_vector (1.20240116.2): - abseil/algorithm/algorithm - abseil/base/core_headers - abseil/base/throw_delegate - abseil/container/inlined_vector_internal - abseil/memory/memory - - abseil/container/inlined_vector_internal (1.20220623.0): + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/container/inlined_vector_internal (1.20240116.2): + - abseil/base/config - abseil/base/core_headers - abseil/container/compressed_tuple - abseil/memory/memory - abseil/meta/type_traits - abseil/types/span - - abseil/container/layout (1.20220623.0): + - abseil/xcprivacy + - abseil/container/layout (1.20240116.2): - abseil/base/config - abseil/base/core_headers + - abseil/debugging/demangle_internal - abseil/meta/type_traits - abseil/strings/strings - abseil/types/span - abseil/utility/utility - - abseil/container/raw_hash_map (1.20220623.0): + - abseil/xcprivacy + - abseil/container/raw_hash_map (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers - abseil/base/throw_delegate - abseil/container/container_memory - abseil/container/raw_hash_set - - abseil/container/raw_hash_set (1.20220623.0): + - abseil/xcprivacy + - abseil/container/raw_hash_set (1.20240116.2): - abseil/base/config - abseil/base/core_headers + - abseil/base/dynamic_annotations - abseil/base/endian - abseil/base/prefetch + - abseil/base/raw_logging_internal - abseil/container/common - abseil/container/compressed_tuple - abseil/container/container_memory - abseil/container/hash_policy_traits - abseil/container/hashtable_debug_hooks - abseil/container/hashtablez_sampler + - abseil/hash/hash - abseil/memory/memory - abseil/meta/type_traits - abseil/numeric/bits - abseil/utility/utility - - abseil/debugging/debugging_internal (1.20220623.0): + - abseil/xcprivacy + - abseil/crc/cpu_detect (1.20240116.2): + - abseil/base/base + - abseil/base/config + - abseil/xcprivacy + - abseil/crc/crc32c (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/prefetch + - abseil/crc/cpu_detect + - abseil/crc/crc_internal + - abseil/crc/non_temporal_memcpy + - abseil/strings/str_format + - abseil/strings/strings + - abseil/xcprivacy + - abseil/crc/crc_cord_state (1.20240116.2): + - abseil/base/config + - abseil/crc/crc32c + - abseil/numeric/bits + - abseil/strings/strings + - abseil/xcprivacy + - abseil/crc/crc_internal (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/prefetch + - abseil/base/raw_logging_internal + - abseil/crc/cpu_detect + - abseil/memory/memory + - abseil/numeric/bits + - abseil/xcprivacy + - abseil/crc/non_temporal_arm_intrinsics (1.20240116.2): + - abseil/base/config + - abseil/xcprivacy + - abseil/crc/non_temporal_memcpy (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/crc/non_temporal_arm_intrinsics + - abseil/xcprivacy + - abseil/debugging/debugging_internal (1.20240116.2): - abseil/base/config - abseil/base/core_headers - abseil/base/dynamic_annotations - abseil/base/errno_saver - abseil/base/raw_logging_internal - - abseil/debugging/demangle_internal (1.20220623.0): + - abseil/xcprivacy + - abseil/debugging/demangle_internal (1.20240116.2): - abseil/base/base - abseil/base/config - abseil/base/core_headers - - abseil/debugging/stacktrace (1.20220623.0): + - abseil/xcprivacy + - abseil/debugging/stacktrace (1.20240116.2): - abseil/base/config - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/raw_logging_internal - abseil/debugging/debugging_internal - - abseil/debugging/symbolize (1.20220623.0): + - abseil/xcprivacy + - abseil/debugging/symbolize (1.20240116.2): - abseil/base/base - abseil/base/config - abseil/base/core_headers @@ -207,26 +320,114 @@ PODS: - abseil/debugging/debugging_internal - abseil/debugging/demangle_internal - abseil/strings/strings - - abseil/functional/any_invocable (1.20220623.0): + - abseil/xcprivacy + - abseil/flags/commandlineflag (1.20240116.2): + - abseil/base/config + - abseil/base/fast_type_id + - abseil/flags/commandlineflag_internal + - abseil/strings/strings + - abseil/types/optional + - abseil/xcprivacy + - abseil/flags/commandlineflag_internal (1.20240116.2): + - abseil/base/config + - abseil/base/fast_type_id + - abseil/xcprivacy + - abseil/flags/config (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/flags/path_util + - abseil/flags/program_name + - abseil/strings/strings + - abseil/synchronization/synchronization + - abseil/xcprivacy + - abseil/flags/flag (1.20240116.2): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/flags/config + - abseil/flags/flag_internal + - abseil/flags/reflection + - abseil/strings/strings + - abseil/xcprivacy + - abseil/flags/flag_internal (1.20240116.2): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/flags/commandlineflag + - abseil/flags/commandlineflag_internal + - abseil/flags/config + - abseil/flags/marshalling + - abseil/flags/reflection + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/strings/strings + - abseil/synchronization/synchronization + - abseil/utility/utility + - abseil/xcprivacy + - abseil/flags/marshalling (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/log_severity + - abseil/numeric/int128 + - abseil/strings/str_format + - abseil/strings/strings + - abseil/types/optional + - abseil/xcprivacy + - abseil/flags/path_util (1.20240116.2): + - abseil/base/config + - abseil/strings/strings + - abseil/xcprivacy + - abseil/flags/private_handle_accessor (1.20240116.2): + - abseil/base/config + - abseil/flags/commandlineflag + - abseil/flags/commandlineflag_internal + - abseil/strings/strings + - abseil/xcprivacy + - abseil/flags/program_name (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/flags/path_util + - abseil/strings/strings + - abseil/synchronization/synchronization + - abseil/xcprivacy + - abseil/flags/reflection (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/no_destructor + - abseil/container/flat_hash_map + - abseil/flags/commandlineflag + - abseil/flags/commandlineflag_internal + - abseil/flags/config + - abseil/flags/private_handle_accessor + - abseil/strings/strings + - abseil/synchronization/synchronization + - abseil/xcprivacy + - abseil/functional/any_invocable (1.20240116.2): - abseil/base/base_internal - abseil/base/config - abseil/base/core_headers - abseil/meta/type_traits - abseil/utility/utility - - abseil/functional/bind_front (1.20220623.0): + - abseil/xcprivacy + - abseil/functional/bind_front (1.20240116.2): - abseil/base/base_internal - abseil/container/compressed_tuple - abseil/meta/type_traits - abseil/utility/utility - - abseil/functional/function_ref (1.20220623.0): + - abseil/xcprivacy + - abseil/functional/function_ref (1.20240116.2): - abseil/base/base_internal - abseil/base/core_headers + - abseil/functional/any_invocable - abseil/meta/type_traits - - abseil/hash/city (1.20220623.0): + - abseil/xcprivacy + - abseil/hash/city (1.20240116.2): - abseil/base/config - abseil/base/core_headers - abseil/base/endian - - abseil/hash/hash (1.20220623.0): + - abseil/xcprivacy + - abseil/hash/hash (1.20240116.2): - abseil/base/config - abseil/base/core_headers - abseil/base/endian @@ -235,43 +436,62 @@ PODS: - abseil/hash/city - abseil/hash/low_level_hash - abseil/meta/type_traits + - abseil/numeric/bits - abseil/numeric/int128 - abseil/strings/strings - abseil/types/optional - abseil/types/variant - abseil/utility/utility - - abseil/hash/low_level_hash (1.20220623.0): + - abseil/xcprivacy + - abseil/hash/low_level_hash (1.20240116.2): - abseil/base/config - abseil/base/endian - - abseil/numeric/bits + - abseil/base/prefetch - abseil/numeric/int128 - - abseil/memory (1.20220623.0): - - abseil/memory/memory (= 1.20220623.0) - - abseil/memory/memory (1.20220623.0): + - abseil/xcprivacy + - abseil/memory (1.20240116.2): + - abseil/memory/memory (= 1.20240116.2) + - abseil/memory/memory (1.20240116.2): - abseil/base/core_headers - abseil/meta/type_traits - - abseil/meta (1.20220623.0): - - abseil/meta/type_traits (= 1.20220623.0) - - abseil/meta/type_traits (1.20220623.0): + - abseil/xcprivacy + - abseil/meta (1.20240116.2): + - abseil/meta/type_traits (= 1.20240116.2) + - abseil/meta/type_traits (1.20240116.2): - abseil/base/config - - abseil/numeric/bits (1.20220623.0): + - abseil/base/core_headers + - abseil/xcprivacy + - abseil/numeric/bits (1.20240116.2): - abseil/base/config - abseil/base/core_headers - - abseil/numeric/int128 (1.20220623.0): + - abseil/xcprivacy + - abseil/numeric/int128 (1.20240116.2): - abseil/base/config - abseil/base/core_headers - abseil/numeric/bits - - abseil/numeric/representation (1.20220623.0): + - abseil/xcprivacy + - abseil/numeric/representation (1.20240116.2): - abseil/base/config - - abseil/profiling/exponential_biased (1.20220623.0): + - abseil/xcprivacy + - abseil/profiling/exponential_biased (1.20240116.2): - abseil/base/config - abseil/base/core_headers - - abseil/profiling/sample_recorder (1.20220623.0): + - abseil/xcprivacy + - abseil/profiling/sample_recorder (1.20240116.2): - abseil/base/config - abseil/base/core_headers - abseil/synchronization/synchronization - abseil/time/time - - abseil/random/distributions (1.20220623.0): + - abseil/xcprivacy + - abseil/random/bit_gen_ref (1.20240116.2): + - abseil/base/core_headers + - abseil/base/fast_type_id + - abseil/meta/type_traits + - abseil/random/internal/distribution_caller + - abseil/random/internal/fast_uniform_bits + - abseil/random/random + - abseil/xcprivacy + - abseil/random/distributions (1.20240116.2): - abseil/base/base_internal - abseil/base/config - abseil/base/core_headers @@ -286,25 +506,31 @@ PODS: - abseil/random/internal/uniform_helper - abseil/random/internal/wide_multiply - abseil/strings/strings - - abseil/random/internal/distribution_caller (1.20220623.0): + - abseil/xcprivacy + - abseil/random/internal/distribution_caller (1.20240116.2): - abseil/base/config - abseil/base/fast_type_id - abseil/utility/utility - - abseil/random/internal/fast_uniform_bits (1.20220623.0): + - abseil/xcprivacy + - abseil/random/internal/fast_uniform_bits (1.20240116.2): - abseil/base/config - abseil/meta/type_traits - abseil/random/internal/traits - - abseil/random/internal/fastmath (1.20220623.0): + - abseil/xcprivacy + - abseil/random/internal/fastmath (1.20240116.2): - abseil/numeric/bits - - abseil/random/internal/generate_real (1.20220623.0): + - abseil/xcprivacy + - abseil/random/internal/generate_real (1.20240116.2): - abseil/meta/type_traits - abseil/numeric/bits - abseil/random/internal/fastmath - abseil/random/internal/traits - - abseil/random/internal/iostream_state_saver (1.20220623.0): + - abseil/xcprivacy + - abseil/random/internal/iostream_state_saver (1.20240116.2): - abseil/meta/type_traits - abseil/numeric/int128 - - abseil/random/internal/nonsecure_base (1.20220623.0): + - abseil/xcprivacy + - abseil/random/internal/nonsecure_base (1.20240116.2): - abseil/base/core_headers - abseil/container/inlined_vector - abseil/meta/type_traits @@ -312,16 +538,19 @@ PODS: - abseil/random/internal/salted_seed_seq - abseil/random/internal/seed_material - abseil/types/span - - abseil/random/internal/pcg_engine (1.20220623.0): + - abseil/xcprivacy + - abseil/random/internal/pcg_engine (1.20240116.2): - abseil/base/config - abseil/meta/type_traits - abseil/numeric/bits - abseil/numeric/int128 - abseil/random/internal/fastmath - abseil/random/internal/iostream_state_saver - - abseil/random/internal/platform (1.20220623.0): + - abseil/xcprivacy + - abseil/random/internal/platform (1.20240116.2): - abseil/base/config - - abseil/random/internal/pool_urbg (1.20220623.0): + - abseil/xcprivacy + - abseil/random/internal/pool_urbg (1.20240116.2): - abseil/base/base - abseil/base/config - abseil/base/core_headers @@ -332,38 +561,45 @@ PODS: - abseil/random/internal/traits - abseil/random/seed_gen_exception - abseil/types/span - - abseil/random/internal/randen (1.20220623.0): + - abseil/xcprivacy + - abseil/random/internal/randen (1.20240116.2): - abseil/base/raw_logging_internal - abseil/random/internal/platform - abseil/random/internal/randen_hwaes - abseil/random/internal/randen_slow - - abseil/random/internal/randen_engine (1.20220623.0): + - abseil/xcprivacy + - abseil/random/internal/randen_engine (1.20240116.2): - abseil/base/endian - abseil/meta/type_traits - abseil/random/internal/iostream_state_saver - abseil/random/internal/randen - - abseil/random/internal/randen_hwaes (1.20220623.0): + - abseil/xcprivacy + - abseil/random/internal/randen_hwaes (1.20240116.2): - abseil/base/config - abseil/random/internal/platform - abseil/random/internal/randen_hwaes_impl - - abseil/random/internal/randen_hwaes_impl (1.20220623.0): + - abseil/xcprivacy + - abseil/random/internal/randen_hwaes_impl (1.20240116.2): - abseil/base/config - abseil/base/core_headers - abseil/numeric/int128 - abseil/random/internal/platform - - abseil/random/internal/randen_slow (1.20220623.0): + - abseil/xcprivacy + - abseil/random/internal/randen_slow (1.20240116.2): - abseil/base/config - abseil/base/core_headers - abseil/base/endian - abseil/numeric/int128 - abseil/random/internal/platform - - abseil/random/internal/salted_seed_seq (1.20220623.0): + - abseil/xcprivacy + - abseil/random/internal/salted_seed_seq (1.20240116.2): - abseil/container/inlined_vector - abseil/meta/type_traits - abseil/random/internal/seed_material - abseil/types/optional - abseil/types/span - - abseil/random/internal/seed_material (1.20220623.0): + - abseil/xcprivacy + - abseil/random/internal/seed_material (1.20240116.2): - abseil/base/core_headers - abseil/base/dynamic_annotations - abseil/base/raw_logging_internal @@ -371,66 +607,90 @@ PODS: - abseil/strings/strings - abseil/types/optional - abseil/types/span - - abseil/random/internal/traits (1.20220623.0): + - abseil/xcprivacy + - abseil/random/internal/traits (1.20240116.2): - abseil/base/config - abseil/numeric/bits - abseil/numeric/int128 - - abseil/random/internal/uniform_helper (1.20220623.0): + - abseil/xcprivacy + - abseil/random/internal/uniform_helper (1.20240116.2): - abseil/base/config - abseil/meta/type_traits - abseil/numeric/int128 - abseil/random/internal/traits - - abseil/random/internal/wide_multiply (1.20220623.0): + - abseil/xcprivacy + - abseil/random/internal/wide_multiply (1.20240116.2): - abseil/base/config - abseil/numeric/bits - abseil/numeric/int128 - abseil/random/internal/traits - - abseil/random/random (1.20220623.0): + - abseil/xcprivacy + - abseil/random/random (1.20240116.2): - abseil/random/distributions - abseil/random/internal/nonsecure_base - abseil/random/internal/pcg_engine - abseil/random/internal/pool_urbg - abseil/random/internal/randen_engine - abseil/random/seed_sequences - - abseil/random/seed_gen_exception (1.20220623.0): + - abseil/xcprivacy + - abseil/random/seed_gen_exception (1.20240116.2): - abseil/base/config - - abseil/random/seed_sequences (1.20220623.0): + - abseil/xcprivacy + - abseil/random/seed_sequences (1.20240116.2): - abseil/base/config - abseil/random/internal/pool_urbg - abseil/random/internal/salted_seed_seq - abseil/random/internal/seed_material - abseil/random/seed_gen_exception - abseil/types/span - - abseil/status/status (1.20220623.0): + - abseil/xcprivacy + - abseil/status/status (1.20240116.2): - abseil/base/atomic_hook + - abseil/base/config - abseil/base/core_headers + - abseil/base/no_destructor + - abseil/base/nullability - abseil/base/raw_logging_internal - abseil/base/strerror - abseil/container/inlined_vector - abseil/debugging/stacktrace - abseil/debugging/symbolize - abseil/functional/function_ref + - abseil/memory/memory - abseil/strings/cord - abseil/strings/str_format - abseil/strings/strings - abseil/types/optional - - abseil/status/statusor (1.20220623.0): + - abseil/types/span + - abseil/xcprivacy + - abseil/status/statusor (1.20240116.2): - abseil/base/base + - abseil/base/config - abseil/base/core_headers + - abseil/base/nullability - abseil/base/raw_logging_internal - abseil/meta/type_traits - abseil/status/status + - abseil/strings/has_ostream_operator + - abseil/strings/str_format - abseil/strings/strings - abseil/types/variant - abseil/utility/utility - - abseil/strings/cord (1.20220623.0): + - abseil/xcprivacy + - abseil/strings/charset (1.20240116.2): + - abseil/base/core_headers + - abseil/strings/string_view + - abseil/xcprivacy + - abseil/strings/cord (1.20240116.2): - abseil/base/base - abseil/base/config - abseil/base/core_headers - abseil/base/endian + - abseil/base/nullability - abseil/base/raw_logging_internal - - abseil/container/fixed_array - abseil/container/inlined_vector + - abseil/crc/crc32c + - abseil/crc/crc_cord_state - abseil/functional/function_ref - abseil/meta/type_traits - abseil/numeric/bits @@ -441,11 +701,11 @@ PODS: - abseil/strings/cordz_update_scope - abseil/strings/cordz_update_tracker - abseil/strings/internal - - abseil/strings/str_format - abseil/strings/strings - abseil/types/optional - abseil/types/span - - abseil/strings/cord_internal (1.20220623.0): + - abseil/xcprivacy + - abseil/strings/cord_internal (1.20240116.2): - abseil/base/base_internal - abseil/base/config - abseil/base/core_headers @@ -453,23 +713,28 @@ PODS: - abseil/base/raw_logging_internal - abseil/base/throw_delegate - abseil/container/compressed_tuple + - abseil/container/container_memory - abseil/container/inlined_vector - abseil/container/layout + - abseil/crc/crc_cord_state - abseil/functional/function_ref - abseil/meta/type_traits - abseil/strings/strings - abseil/types/span - - abseil/strings/cordz_functions (1.20220623.0): + - abseil/xcprivacy + - abseil/strings/cordz_functions (1.20240116.2): - abseil/base/config - abseil/base/core_headers - abseil/base/raw_logging_internal - abseil/profiling/exponential_biased - - abseil/strings/cordz_handle (1.20220623.0): + - abseil/xcprivacy + - abseil/strings/cordz_handle (1.20240116.2): - abseil/base/base - abseil/base/config - abseil/base/raw_logging_internal - abseil/synchronization/synchronization - - abseil/strings/cordz_info (1.20220623.0): + - abseil/xcprivacy + - abseil/strings/cordz_info (1.20240116.2): - abseil/base/base - abseil/base/config - abseil/base/core_headers @@ -482,29 +747,46 @@ PODS: - abseil/strings/cordz_statistics - abseil/strings/cordz_update_tracker - abseil/synchronization/synchronization + - abseil/time/time - abseil/types/span - - abseil/strings/cordz_statistics (1.20220623.0): + - abseil/xcprivacy + - abseil/strings/cordz_statistics (1.20240116.2): - abseil/base/config - abseil/strings/cordz_update_tracker - - abseil/strings/cordz_update_scope (1.20220623.0): + - abseil/xcprivacy + - abseil/strings/cordz_update_scope (1.20240116.2): - abseil/base/config - abseil/base/core_headers - abseil/strings/cord_internal - abseil/strings/cordz_info - abseil/strings/cordz_update_tracker - - abseil/strings/cordz_update_tracker (1.20220623.0): + - abseil/xcprivacy + - abseil/strings/cordz_update_tracker (1.20240116.2): - abseil/base/config - - abseil/strings/internal (1.20220623.0): + - abseil/xcprivacy + - abseil/strings/has_ostream_operator (1.20240116.2): + - abseil/base/config + - abseil/xcprivacy + - abseil/strings/internal (1.20240116.2): - abseil/base/config - abseil/base/core_headers - abseil/base/endian - abseil/base/raw_logging_internal - abseil/meta/type_traits - - abseil/strings/str_format (1.20220623.0): + - abseil/xcprivacy + - abseil/strings/str_format (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/nullability - abseil/strings/str_format_internal - - abseil/strings/str_format_internal (1.20220623.0): + - abseil/strings/string_view + - abseil/types/span + - abseil/xcprivacy + - abseil/strings/str_format_internal (1.20240116.2): - abseil/base/config - abseil/base/core_headers + - abseil/container/fixed_array + - abseil/container/inlined_vector - abseil/functional/function_ref - abseil/meta/type_traits - abseil/numeric/bits @@ -514,30 +796,46 @@ PODS: - abseil/types/optional - abseil/types/span - abseil/utility/utility - - abseil/strings/strings (1.20220623.0): + - abseil/xcprivacy + - abseil/strings/string_view (1.20240116.2): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/nullability + - abseil/base/throw_delegate + - abseil/xcprivacy + - abseil/strings/strings (1.20240116.2): - abseil/base/base - abseil/base/config - abseil/base/core_headers - abseil/base/endian + - abseil/base/nullability - abseil/base/raw_logging_internal - abseil/base/throw_delegate - abseil/memory/memory - abseil/meta/type_traits - abseil/numeric/bits - abseil/numeric/int128 + - abseil/strings/charset - abseil/strings/internal - - abseil/synchronization/graphcycles_internal (1.20220623.0): + - abseil/strings/string_view + - abseil/xcprivacy + - abseil/synchronization/graphcycles_internal (1.20240116.2): - abseil/base/base - abseil/base/base_internal - abseil/base/config - abseil/base/core_headers - abseil/base/malloc_internal - abseil/base/raw_logging_internal - - abseil/synchronization/kernel_timeout_internal (1.20220623.0): + - abseil/xcprivacy + - abseil/synchronization/kernel_timeout_internal (1.20240116.2): + - abseil/base/base + - abseil/base/config - abseil/base/core_headers - abseil/base/raw_logging_internal - abseil/time/time - - abseil/synchronization/synchronization (1.20220623.0): + - abseil/xcprivacy + - abseil/synchronization/synchronization (1.20240116.2): - abseil/base/atomic_hook - abseil/base/base - abseil/base/base_internal @@ -551,219 +849,243 @@ PODS: - abseil/synchronization/graphcycles_internal - abseil/synchronization/kernel_timeout_internal - abseil/time/time - - abseil/time (1.20220623.0): - - abseil/time/internal (= 1.20220623.0) - - abseil/time/time (= 1.20220623.0) - - abseil/time/internal (1.20220623.0): - - abseil/time/internal/cctz (= 1.20220623.0) - - abseil/time/internal/cctz (1.20220623.0): - - abseil/time/internal/cctz/civil_time (= 1.20220623.0) - - abseil/time/internal/cctz/time_zone (= 1.20220623.0) - - abseil/time/internal/cctz/civil_time (1.20220623.0): - - abseil/base/config - - abseil/time/internal/cctz/time_zone (1.20220623.0): + - abseil/xcprivacy + - abseil/time (1.20240116.2): + - abseil/time/internal (= 1.20240116.2) + - abseil/time/time (= 1.20240116.2) + - abseil/time/internal (1.20240116.2): + - abseil/time/internal/cctz (= 1.20240116.2) + - abseil/time/internal/cctz (1.20240116.2): + - abseil/time/internal/cctz/civil_time (= 1.20240116.2) + - abseil/time/internal/cctz/time_zone (= 1.20240116.2) + - abseil/time/internal/cctz/civil_time (1.20240116.2): + - abseil/base/config + - abseil/xcprivacy + - abseil/time/internal/cctz/time_zone (1.20240116.2): - abseil/base/config - abseil/time/internal/cctz/civil_time - - abseil/time/time (1.20220623.0): + - abseil/xcprivacy + - abseil/time/time (1.20240116.2): - abseil/base/base + - abseil/base/config - abseil/base/core_headers - abseil/base/raw_logging_internal - abseil/numeric/int128 - abseil/strings/strings - abseil/time/internal/cctz/civil_time - abseil/time/internal/cctz/time_zone - - abseil/types (1.20220623.0): - - abseil/types/any (= 1.20220623.0) - - abseil/types/bad_any_cast (= 1.20220623.0) - - abseil/types/bad_any_cast_impl (= 1.20220623.0) - - abseil/types/bad_optional_access (= 1.20220623.0) - - abseil/types/bad_variant_access (= 1.20220623.0) - - abseil/types/compare (= 1.20220623.0) - - abseil/types/optional (= 1.20220623.0) - - abseil/types/span (= 1.20220623.0) - - abseil/types/variant (= 1.20220623.0) - - abseil/types/any (1.20220623.0): + - abseil/types/optional + - abseil/xcprivacy + - abseil/types (1.20240116.2): + - abseil/types/any (= 1.20240116.2) + - abseil/types/bad_any_cast (= 1.20240116.2) + - abseil/types/bad_any_cast_impl (= 1.20240116.2) + - abseil/types/bad_optional_access (= 1.20240116.2) + - abseil/types/bad_variant_access (= 1.20240116.2) + - abseil/types/compare (= 1.20240116.2) + - abseil/types/optional (= 1.20240116.2) + - abseil/types/span (= 1.20240116.2) + - abseil/types/variant (= 1.20240116.2) + - abseil/types/any (1.20240116.2): - abseil/base/config - abseil/base/core_headers - abseil/base/fast_type_id - abseil/meta/type_traits - abseil/types/bad_any_cast - abseil/utility/utility - - abseil/types/bad_any_cast (1.20220623.0): + - abseil/xcprivacy + - abseil/types/bad_any_cast (1.20240116.2): - abseil/base/config - abseil/types/bad_any_cast_impl - - abseil/types/bad_any_cast_impl (1.20220623.0): + - abseil/xcprivacy + - abseil/types/bad_any_cast_impl (1.20240116.2): - abseil/base/config - abseil/base/raw_logging_internal - - abseil/types/bad_optional_access (1.20220623.0): + - abseil/xcprivacy + - abseil/types/bad_optional_access (1.20240116.2): - abseil/base/config - abseil/base/raw_logging_internal - - abseil/types/bad_variant_access (1.20220623.0): + - abseil/xcprivacy + - abseil/types/bad_variant_access (1.20240116.2): - abseil/base/config - abseil/base/raw_logging_internal - - abseil/types/compare (1.20220623.0): + - abseil/xcprivacy + - abseil/types/compare (1.20240116.2): + - abseil/base/config - abseil/base/core_headers - abseil/meta/type_traits - - abseil/types/optional (1.20220623.0): + - abseil/xcprivacy + - abseil/types/optional (1.20240116.2): - abseil/base/base_internal - abseil/base/config - abseil/base/core_headers + - abseil/base/nullability - abseil/memory/memory - abseil/meta/type_traits - abseil/types/bad_optional_access - abseil/utility/utility - - abseil/types/span (1.20220623.0): + - abseil/xcprivacy + - abseil/types/span (1.20240116.2): - abseil/algorithm/algorithm - abseil/base/core_headers + - abseil/base/nullability - abseil/base/throw_delegate - abseil/meta/type_traits - - abseil/types/variant (1.20220623.0): + - abseil/xcprivacy + - abseil/types/variant (1.20240116.2): - abseil/base/base_internal - abseil/base/config - abseil/base/core_headers - abseil/meta/type_traits - abseil/types/bad_variant_access - abseil/utility/utility - - abseil/utility/utility (1.20220623.0): + - abseil/xcprivacy + - abseil/utility/utility (1.20240116.2): - abseil/base/base_internal - abseil/base/config - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/xcprivacy (1.20240116.2) - audioplayers_darwin (0.0.1): - Flutter - - BoringSSL-GRPC (0.0.24): - - BoringSSL-GRPC/Implementation (= 0.0.24) - - BoringSSL-GRPC/Interface (= 0.0.24) - - BoringSSL-GRPC/Implementation (0.0.24): - - BoringSSL-GRPC/Interface (= 0.0.24) - - BoringSSL-GRPC/Interface (0.0.24) - - cloud_firestore (4.15.4): - - Firebase/Firestore (= 10.20.0) + - BoringSSL-GRPC (0.0.32): + - BoringSSL-GRPC/Implementation (= 0.0.32) + - BoringSSL-GRPC/Interface (= 0.0.32) + - BoringSSL-GRPC/Implementation (0.0.32): + - BoringSSL-GRPC/Interface (= 0.0.32) + - BoringSSL-GRPC/Interface (0.0.32) + - cloud_firestore (5.2.1): + - Firebase/Firestore (= 10.29.0) - firebase_core - Flutter - - nanopb (< 2.30910.0, >= 2.30908.0) - - Firebase/Analytics (10.20.0): + - connectivity_plus (0.0.1): + - Flutter + - FlutterMacOS + - Firebase/Analytics (10.29.0): - Firebase/Core - - Firebase/Auth (10.20.0): + - Firebase/Auth (10.29.0): - Firebase/CoreOnly - - FirebaseAuth (~> 10.20.0) - - Firebase/Core (10.20.0): + - FirebaseAuth (~> 10.29.0) + - Firebase/Core (10.29.0): - Firebase/CoreOnly - - FirebaseAnalytics (~> 10.20.0) - - Firebase/CoreOnly (10.20.0): - - FirebaseCore (= 10.20.0) - - Firebase/Crashlytics (10.20.0): + - FirebaseAnalytics (~> 10.29.0) + - Firebase/CoreOnly (10.29.0): + - FirebaseCore (= 10.29.0) + - Firebase/Crashlytics (10.29.0): - Firebase/CoreOnly - - FirebaseCrashlytics (~> 10.20.0) - - Firebase/DynamicLinks (10.20.0): + - FirebaseCrashlytics (~> 10.29.0) + - Firebase/DynamicLinks (10.29.0): - Firebase/CoreOnly - - FirebaseDynamicLinks (~> 10.20.0) - - Firebase/Firestore (10.20.0): + - FirebaseDynamicLinks (~> 10.29.0) + - Firebase/Firestore (10.29.0): - Firebase/CoreOnly - - FirebaseFirestore (~> 10.20.0) - - Firebase/Messaging (10.20.0): + - FirebaseFirestore (~> 10.29.0) + - Firebase/Messaging (10.29.0): - Firebase/CoreOnly - - FirebaseMessaging (~> 10.20.0) - - Firebase/RemoteConfig (10.20.0): + - FirebaseMessaging (~> 10.29.0) + - Firebase/RemoteConfig (10.29.0): - Firebase/CoreOnly - - FirebaseRemoteConfig (~> 10.20.0) - - firebase_analytics (10.8.5): - - Firebase/Analytics (= 10.20.0) + - FirebaseRemoteConfig (~> 10.29.0) + - firebase_analytics (11.2.1): + - Firebase/Analytics (= 10.29.0) - firebase_core - Flutter - - firebase_auth (4.17.4): - - Firebase/Auth (= 10.20.0) + - firebase_auth (5.1.4): + - Firebase/Auth (= 10.29.0) - firebase_core - Flutter - - firebase_core (2.25.4): - - Firebase/CoreOnly (= 10.20.0) + - firebase_core (3.3.0): + - Firebase/CoreOnly (= 10.29.0) - Flutter - - firebase_crashlytics (3.4.14): - - Firebase/Crashlytics (= 10.20.0) + - firebase_crashlytics (4.0.4): + - Firebase/Crashlytics (= 10.29.0) - firebase_core - Flutter - - firebase_dynamic_links (5.4.13): - - Firebase/DynamicLinks (= 10.20.0) + - firebase_dynamic_links (6.0.4): + - Firebase/DynamicLinks (= 10.29.0) - firebase_core - Flutter - - firebase_messaging (14.7.15): - - Firebase/Messaging (= 10.20.0) + - firebase_messaging (15.0.4): + - Firebase/Messaging (= 10.29.0) - firebase_core - Flutter - - firebase_remote_config (4.3.13): - - Firebase/RemoteConfig (= 10.20.0) + - firebase_remote_config (5.0.4): + - Firebase/RemoteConfig (= 10.29.0) - firebase_core - Flutter - - FirebaseABTesting (10.21.0): + - FirebaseABTesting (10.29.0): - FirebaseCore (~> 10.0) - - FirebaseAnalytics (10.20.0): - - FirebaseAnalytics/AdIdSupport (= 10.20.0) + - FirebaseAnalytics (10.29.0): + - FirebaseAnalytics/AdIdSupport (= 10.29.0) - FirebaseCore (~> 10.0) - FirebaseInstallations (~> 10.0) - GoogleUtilities/AppDelegateSwizzler (~> 7.11) - GoogleUtilities/MethodSwizzler (~> 7.11) - GoogleUtilities/Network (~> 7.11) - "GoogleUtilities/NSData+zlib (~> 7.11)" - - nanopb (< 2.30910.0, >= 2.30908.0) - - FirebaseAnalytics/AdIdSupport (10.20.0): + - nanopb (< 2.30911.0, >= 2.30908.0) + - FirebaseAnalytics/AdIdSupport (10.29.0): - FirebaseCore (~> 10.0) - FirebaseInstallations (~> 10.0) - - GoogleAppMeasurement (= 10.20.0) + - GoogleAppMeasurement (= 10.29.0) - GoogleUtilities/AppDelegateSwizzler (~> 7.11) - GoogleUtilities/MethodSwizzler (~> 7.11) - GoogleUtilities/Network (~> 7.11) - "GoogleUtilities/NSData+zlib (~> 7.11)" - - nanopb (< 2.30910.0, >= 2.30908.0) - - FirebaseAppCheckInterop (10.21.0) - - FirebaseAuth (10.20.0): + - nanopb (< 2.30911.0, >= 2.30908.0) + - FirebaseAppCheckInterop (10.29.0) + - FirebaseAuth (10.29.0): - FirebaseAppCheckInterop (~> 10.17) - FirebaseCore (~> 10.0) - GoogleUtilities/AppDelegateSwizzler (~> 7.8) - GoogleUtilities/Environment (~> 7.8) - GTMSessionFetcher/Core (< 4.0, >= 2.1) - RecaptchaInterop (~> 100.0) - - FirebaseCore (10.20.0): + - FirebaseCore (10.29.0): - FirebaseCoreInternal (~> 10.0) - GoogleUtilities/Environment (~> 7.12) - GoogleUtilities/Logger (~> 7.12) - - FirebaseCoreExtension (10.21.0): + - FirebaseCoreExtension (10.29.0): - FirebaseCore (~> 10.0) - - FirebaseCoreInternal (10.21.0): + - FirebaseCoreInternal (10.29.0): - "GoogleUtilities/NSData+zlib (~> 7.8)" - - FirebaseCrashlytics (10.20.0): + - FirebaseCrashlytics (10.29.0): - FirebaseCore (~> 10.5) - FirebaseInstallations (~> 10.0) + - FirebaseRemoteConfigInterop (~> 10.23) - FirebaseSessions (~> 10.5) - GoogleDataTransport (~> 9.2) - GoogleUtilities/Environment (~> 7.8) - - nanopb (< 2.30910.0, >= 2.30908.0) + - nanopb (< 2.30911.0, >= 2.30908.0) - PromisesObjC (~> 2.1) - - FirebaseDynamicLinks (10.20.0): + - FirebaseDynamicLinks (10.29.0): - FirebaseCore (~> 10.0) - - FirebaseFirestore (10.20.0): + - FirebaseFirestore (10.29.0): - FirebaseCore (~> 10.0) - FirebaseCoreExtension (~> 10.0) - - FirebaseFirestoreInternal (~> 10.17) + - FirebaseFirestoreInternal (= 10.29.0) - FirebaseSharedSwift (~> 10.0) - - FirebaseFirestoreInternal (10.21.0): - - abseil/algorithm (~> 1.20220623.0) - - abseil/base (~> 1.20220623.0) - - abseil/container/flat_hash_map (~> 1.20220623.0) - - abseil/memory (~> 1.20220623.0) - - abseil/meta (~> 1.20220623.0) - - abseil/strings/strings (~> 1.20220623.0) - - abseil/time (~> 1.20220623.0) - - abseil/types (~> 1.20220623.0) + - FirebaseFirestoreInternal (10.29.0): + - abseil/algorithm (~> 1.20240116.1) + - abseil/base (~> 1.20240116.1) + - abseil/container/flat_hash_map (~> 1.20240116.1) + - abseil/memory (~> 1.20240116.1) + - abseil/meta (~> 1.20240116.1) + - abseil/strings/strings (~> 1.20240116.1) + - abseil/time (~> 1.20240116.1) + - abseil/types (~> 1.20240116.1) - FirebaseAppCheckInterop (~> 10.17) - FirebaseCore (~> 10.0) - - "gRPC-C++ (~> 1.49.1)" + - "gRPC-C++ (~> 1.62.0)" + - gRPC-Core (~> 1.62.0) - leveldb-library (~> 1.22) - - nanopb (< 2.30910.0, >= 2.30908.0) - - FirebaseInstallations (10.21.0): + - nanopb (< 2.30911.0, >= 2.30908.0) + - FirebaseInstallations (10.29.0): - FirebaseCore (~> 10.0) - GoogleUtilities/Environment (~> 7.8) - GoogleUtilities/UserDefaults (~> 7.8) - PromisesObjC (~> 2.1) - - FirebaseMessaging (10.20.0): + - FirebaseMessaging (10.29.0): - FirebaseCore (~> 10.0) - FirebaseInstallations (~> 10.0) - GoogleDataTransport (~> 9.3) @@ -771,23 +1093,26 @@ PODS: - GoogleUtilities/Environment (~> 7.8) - GoogleUtilities/Reachability (~> 7.8) - GoogleUtilities/UserDefaults (~> 7.8) - - nanopb (< 2.30910.0, >= 2.30908.0) - - FirebaseRemoteConfig (10.20.0): + - nanopb (< 2.30911.0, >= 2.30908.0) + - FirebaseRemoteConfig (10.29.0): - FirebaseABTesting (~> 10.0) - FirebaseCore (~> 10.0) - FirebaseInstallations (~> 10.0) + - FirebaseRemoteConfigInterop (~> 10.23) - FirebaseSharedSwift (~> 10.0) - GoogleUtilities/Environment (~> 7.8) - "GoogleUtilities/NSData+zlib (~> 7.8)" - - FirebaseSessions (10.21.0): + - FirebaseRemoteConfigInterop (10.29.0) + - FirebaseSessions (10.29.0): - FirebaseCore (~> 10.5) - FirebaseCoreExtension (~> 10.0) - FirebaseInstallations (~> 10.0) - GoogleDataTransport (~> 9.2) - - GoogleUtilities/Environment (~> 7.10) - - nanopb (< 2.30910.0, >= 2.30908.0) + - GoogleUtilities/Environment (~> 7.13) + - GoogleUtilities/UserDefaults (~> 7.13) + - nanopb (< 2.30911.0, >= 2.30908.0) - PromisesSwift (~> 2.1) - - FirebaseSharedSwift (10.21.0) + - FirebaseSharedSwift (10.29.0) - Flutter (1.0.0) - flutter_app_badger (1.3.0): - Flutter @@ -797,127 +1122,155 @@ PODS: - Flutter - flutter_pdfview (1.0.2): - Flutter - - GoogleAppMeasurement (10.20.0): - - GoogleAppMeasurement/AdIdSupport (= 10.20.0) + - geocoding_ios (1.0.5): + - Flutter + - GoogleAppMeasurement (10.29.0): + - GoogleAppMeasurement/AdIdSupport (= 10.29.0) - GoogleUtilities/AppDelegateSwizzler (~> 7.11) - GoogleUtilities/MethodSwizzler (~> 7.11) - GoogleUtilities/Network (~> 7.11) - "GoogleUtilities/NSData+zlib (~> 7.11)" - - nanopb (< 2.30910.0, >= 2.30908.0) - - GoogleAppMeasurement/AdIdSupport (10.20.0): - - GoogleAppMeasurement/WithoutAdIdSupport (= 10.20.0) + - nanopb (< 2.30911.0, >= 2.30908.0) + - GoogleAppMeasurement/AdIdSupport (10.29.0): + - GoogleAppMeasurement/WithoutAdIdSupport (= 10.29.0) - GoogleUtilities/AppDelegateSwizzler (~> 7.11) - GoogleUtilities/MethodSwizzler (~> 7.11) - GoogleUtilities/Network (~> 7.11) - "GoogleUtilities/NSData+zlib (~> 7.11)" - - nanopb (< 2.30910.0, >= 2.30908.0) - - GoogleAppMeasurement/WithoutAdIdSupport (10.20.0): + - nanopb (< 2.30911.0, >= 2.30908.0) + - GoogleAppMeasurement/WithoutAdIdSupport (10.29.0): - GoogleUtilities/AppDelegateSwizzler (~> 7.11) - GoogleUtilities/MethodSwizzler (~> 7.11) - GoogleUtilities/Network (~> 7.11) - "GoogleUtilities/NSData+zlib (~> 7.11)" - - nanopb (< 2.30910.0, >= 2.30908.0) - - GoogleDataTransport (9.3.0): + - nanopb (< 2.30911.0, >= 2.30908.0) + - GoogleDataTransport (9.4.1): - GoogleUtilities/Environment (~> 7.7) - - nanopb (< 2.30910.0, >= 2.30908.0) + - nanopb (< 2.30911.0, >= 2.30908.0) - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/AppDelegateSwizzler (7.12.0): + - GoogleUtilities/AppDelegateSwizzler (7.13.3): - GoogleUtilities/Environment - GoogleUtilities/Logger - GoogleUtilities/Network - - GoogleUtilities/Environment (7.12.0): + - GoogleUtilities/Privacy + - GoogleUtilities/Environment (7.13.3): + - GoogleUtilities/Privacy - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/Logger (7.12.0): + - GoogleUtilities/Logger (7.13.3): - GoogleUtilities/Environment - - GoogleUtilities/MethodSwizzler (7.12.0): + - GoogleUtilities/Privacy + - GoogleUtilities/MethodSwizzler (7.13.3): - GoogleUtilities/Logger - - GoogleUtilities/Network (7.12.0): + - GoogleUtilities/Privacy + - GoogleUtilities/Network (7.13.3): - GoogleUtilities/Logger - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Privacy - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (7.12.0)" - - GoogleUtilities/Reachability (7.12.0): + - "GoogleUtilities/NSData+zlib (7.13.3)": + - GoogleUtilities/Privacy + - GoogleUtilities/Privacy (7.13.3) + - GoogleUtilities/Reachability (7.13.3): - GoogleUtilities/Logger - - GoogleUtilities/UserDefaults (7.12.0): + - GoogleUtilities/Privacy + - GoogleUtilities/UserDefaults (7.13.3): - GoogleUtilities/Logger - - "gRPC-C++ (1.49.1)": - - "gRPC-C++/Implementation (= 1.49.1)" - - "gRPC-C++/Interface (= 1.49.1)" - - "gRPC-C++/Implementation (1.49.1)": - - abseil/base/base (= 1.20220623.0) - - abseil/base/core_headers (= 1.20220623.0) - - abseil/cleanup/cleanup (= 1.20220623.0) - - abseil/container/flat_hash_map (= 1.20220623.0) - - abseil/container/flat_hash_set (= 1.20220623.0) - - abseil/container/inlined_vector (= 1.20220623.0) - - abseil/functional/any_invocable (= 1.20220623.0) - - abseil/functional/bind_front (= 1.20220623.0) - - abseil/functional/function_ref (= 1.20220623.0) - - abseil/hash/hash (= 1.20220623.0) - - abseil/memory/memory (= 1.20220623.0) - - abseil/meta/type_traits (= 1.20220623.0) - - abseil/random/random (= 1.20220623.0) - - abseil/status/status (= 1.20220623.0) - - abseil/status/statusor (= 1.20220623.0) - - abseil/strings/cord (= 1.20220623.0) - - abseil/strings/str_format (= 1.20220623.0) - - abseil/strings/strings (= 1.20220623.0) - - abseil/synchronization/synchronization (= 1.20220623.0) - - abseil/time/time (= 1.20220623.0) - - abseil/types/optional (= 1.20220623.0) - - abseil/types/span (= 1.20220623.0) - - abseil/types/variant (= 1.20220623.0) - - abseil/utility/utility (= 1.20220623.0) - - "gRPC-C++/Interface (= 1.49.1)" - - gRPC-Core (= 1.49.1) - - "gRPC-C++/Interface (1.49.1)" - - gRPC-Core (1.49.1): - - gRPC-Core/Implementation (= 1.49.1) - - gRPC-Core/Interface (= 1.49.1) - - gRPC-Core/Implementation (1.49.1): - - abseil/base/base (= 1.20220623.0) - - abseil/base/core_headers (= 1.20220623.0) - - abseil/container/flat_hash_map (= 1.20220623.0) - - abseil/container/flat_hash_set (= 1.20220623.0) - - abseil/container/inlined_vector (= 1.20220623.0) - - abseil/functional/any_invocable (= 1.20220623.0) - - abseil/functional/bind_front (= 1.20220623.0) - - abseil/functional/function_ref (= 1.20220623.0) - - abseil/hash/hash (= 1.20220623.0) - - abseil/memory/memory (= 1.20220623.0) - - abseil/meta/type_traits (= 1.20220623.0) - - abseil/random/random (= 1.20220623.0) - - abseil/status/status (= 1.20220623.0) - - abseil/status/statusor (= 1.20220623.0) - - abseil/strings/cord (= 1.20220623.0) - - abseil/strings/str_format (= 1.20220623.0) - - abseil/strings/strings (= 1.20220623.0) - - abseil/synchronization/synchronization (= 1.20220623.0) - - abseil/time/time (= 1.20220623.0) - - abseil/types/optional (= 1.20220623.0) - - abseil/types/span (= 1.20220623.0) - - abseil/types/variant (= 1.20220623.0) - - abseil/utility/utility (= 1.20220623.0) - - BoringSSL-GRPC (= 0.0.24) - - gRPC-Core/Interface (= 1.49.1) - - gRPC-Core/Interface (1.49.1) - - GTMSessionFetcher/Core (3.3.1) - - leveldb-library (1.22.3) - - maps_launcher (0.0.1): + - GoogleUtilities/Privacy + - "gRPC-C++ (1.62.5)": + - "gRPC-C++/Implementation (= 1.62.5)" + - "gRPC-C++/Interface (= 1.62.5)" + - "gRPC-C++/Implementation (1.62.5)": + - abseil/algorithm/container (~> 1.20240116.2) + - abseil/base/base (~> 1.20240116.2) + - abseil/base/config (~> 1.20240116.2) + - abseil/base/core_headers (~> 1.20240116.2) + - abseil/cleanup/cleanup (~> 1.20240116.2) + - abseil/container/flat_hash_map (~> 1.20240116.2) + - abseil/container/flat_hash_set (~> 1.20240116.2) + - abseil/container/inlined_vector (~> 1.20240116.2) + - abseil/flags/flag (~> 1.20240116.2) + - abseil/flags/marshalling (~> 1.20240116.2) + - abseil/functional/any_invocable (~> 1.20240116.2) + - abseil/functional/bind_front (~> 1.20240116.2) + - abseil/functional/function_ref (~> 1.20240116.2) + - abseil/hash/hash (~> 1.20240116.2) + - abseil/memory/memory (~> 1.20240116.2) + - abseil/meta/type_traits (~> 1.20240116.2) + - abseil/random/bit_gen_ref (~> 1.20240116.2) + - abseil/random/distributions (~> 1.20240116.2) + - abseil/random/random (~> 1.20240116.2) + - abseil/status/status (~> 1.20240116.2) + - abseil/status/statusor (~> 1.20240116.2) + - abseil/strings/cord (~> 1.20240116.2) + - abseil/strings/str_format (~> 1.20240116.2) + - abseil/strings/strings (~> 1.20240116.2) + - abseil/synchronization/synchronization (~> 1.20240116.2) + - abseil/time/time (~> 1.20240116.2) + - abseil/types/optional (~> 1.20240116.2) + - abseil/types/span (~> 1.20240116.2) + - abseil/types/variant (~> 1.20240116.2) + - abseil/utility/utility (~> 1.20240116.2) + - "gRPC-C++/Interface (= 1.62.5)" + - "gRPC-C++/Privacy (= 1.62.5)" + - gRPC-Core (= 1.62.5) + - "gRPC-C++/Interface (1.62.5)" + - "gRPC-C++/Privacy (1.62.5)" + - gRPC-Core (1.62.5): + - gRPC-Core/Implementation (= 1.62.5) + - gRPC-Core/Interface (= 1.62.5) + - gRPC-Core/Implementation (1.62.5): + - abseil/algorithm/container (~> 1.20240116.2) + - abseil/base/base (~> 1.20240116.2) + - abseil/base/config (~> 1.20240116.2) + - abseil/base/core_headers (~> 1.20240116.2) + - abseil/cleanup/cleanup (~> 1.20240116.2) + - abseil/container/flat_hash_map (~> 1.20240116.2) + - abseil/container/flat_hash_set (~> 1.20240116.2) + - abseil/container/inlined_vector (~> 1.20240116.2) + - abseil/flags/flag (~> 1.20240116.2) + - abseil/flags/marshalling (~> 1.20240116.2) + - abseil/functional/any_invocable (~> 1.20240116.2) + - abseil/functional/bind_front (~> 1.20240116.2) + - abseil/functional/function_ref (~> 1.20240116.2) + - abseil/hash/hash (~> 1.20240116.2) + - abseil/memory/memory (~> 1.20240116.2) + - abseil/meta/type_traits (~> 1.20240116.2) + - abseil/random/bit_gen_ref (~> 1.20240116.2) + - abseil/random/distributions (~> 1.20240116.2) + - abseil/random/random (~> 1.20240116.2) + - abseil/status/status (~> 1.20240116.2) + - abseil/status/statusor (~> 1.20240116.2) + - abseil/strings/cord (~> 1.20240116.2) + - abseil/strings/str_format (~> 1.20240116.2) + - abseil/strings/strings (~> 1.20240116.2) + - abseil/synchronization/synchronization (~> 1.20240116.2) + - abseil/time/time (~> 1.20240116.2) + - abseil/types/optional (~> 1.20240116.2) + - abseil/types/span (~> 1.20240116.2) + - abseil/types/variant (~> 1.20240116.2) + - abseil/utility/utility (~> 1.20240116.2) + - BoringSSL-GRPC (= 0.0.32) + - gRPC-Core/Interface (= 1.62.5) + - gRPC-Core/Privacy (= 1.62.5) + - gRPC-Core/Interface (1.62.5) + - gRPC-Core/Privacy (1.62.5) + - GTMSessionFetcher/Core (3.5.0) + - leveldb-library (1.22.5) + - map_launcher (0.0.1): - Flutter - - nanopb (2.30909.1): - - nanopb/decode (= 2.30909.1) - - nanopb/encode (= 2.30909.1) - - nanopb/decode (2.30909.1) - - nanopb/encode (2.30909.1) + - nanopb (2.30910.0): + - nanopb/decode (= 2.30910.0) + - nanopb/encode (= 2.30910.0) + - nanopb/decode (2.30910.0) + - nanopb/encode (2.30910.0) - package_info_plus (0.4.5): - Flutter - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS - - PromisesObjC (2.3.1) - - PromisesSwift (2.3.1): - - PromisesObjC (= 2.3.1) + - PromisesObjC (2.4.0) + - PromisesSwift (2.4.0): + - PromisesObjC (= 2.4.0) - RecaptchaInterop (100.0.0) - share_plus (0.0.1): - Flutter @@ -938,6 +1291,7 @@ PODS: DEPENDENCIES: - audioplayers_darwin (from `.symlinks/plugins/audioplayers_darwin/ios`) - cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`) + - connectivity_plus (from `.symlinks/plugins/connectivity_plus/darwin`) - firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) - firebase_auth (from `.symlinks/plugins/firebase_auth/ios`) - firebase_core (from `.symlinks/plugins/firebase_core/ios`) @@ -950,7 +1304,8 @@ DEPENDENCIES: - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) - flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`) - flutter_pdfview (from `.symlinks/plugins/flutter_pdfview/ios`) - - maps_launcher (from `.symlinks/plugins/maps_launcher/ios`) + - geocoding_ios (from `.symlinks/plugins/geocoding_ios/ios`) + - map_launcher (from `.symlinks/plugins/map_launcher/ios`) - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - share_plus (from `.symlinks/plugins/share_plus/ios`) @@ -979,6 +1334,7 @@ SPEC REPOS: - FirebaseInstallations - FirebaseMessaging - FirebaseRemoteConfig + - FirebaseRemoteConfigInterop - FirebaseSessions - FirebaseSharedSwift - GoogleAppMeasurement @@ -998,6 +1354,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/audioplayers_darwin/ios" cloud_firestore: :path: ".symlinks/plugins/cloud_firestore/ios" + connectivity_plus: + :path: ".symlinks/plugins/connectivity_plus/darwin" firebase_analytics: :path: ".symlinks/plugins/firebase_analytics/ios" firebase_auth: @@ -1022,8 +1380,10 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/flutter_native_splash/ios" flutter_pdfview: :path: ".symlinks/plugins/flutter_pdfview/ios" - maps_launcher: - :path: ".symlinks/plugins/maps_launcher/ios" + geocoding_ios: + :path: ".symlinks/plugins/geocoding_ios/ios" + map_launcher: + :path: ".symlinks/plugins/map_launcher/ios" package_info_plus: :path: ".symlinks/plugins/package_info_plus/ios" path_provider_foundation: @@ -1042,60 +1402,63 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/wakelock_plus/ios" SPEC CHECKSUMS: - abseil: 926fb7a82dc6d2b8e1f2ed7f3a718bce691d1e46 + abseil: d121da9ef7e2ff4cab7666e76c5a3e0915ae08c3 audioplayers_darwin: 877d9a4d06331c5c374595e46e16453ac7eafa40 - BoringSSL-GRPC: 3175b25143e648463a56daeaaa499c6cb86dad33 - cloud_firestore: ba576bee785a05ff952e4da7fa4e23c196917436 - Firebase: 10c8cb12fb7ad2ae0c09ffc86cd9c1ab392a0031 - firebase_analytics: 2e82fd84ce13f8321aa7b99336d6ee0e6cc7b984 - firebase_auth: 29a10d4129d53aa690c10dbd838ed1a059ef0c9b - firebase_core: a46c312d8bae4defa3d009b2aa7b5b413aeb394e - firebase_crashlytics: 3d12285fcbd865d576b9965bd4090cd8b68e11fd - firebase_dynamic_links: 58354c4228a25d8c77185baafafaffa2debcc076 - firebase_messaging: 40d7dd2f3e88a6367c7326cf601f84633d477582 - firebase_remote_config: e9e018e59700ab678c254cc9f36897ee53c15f94 - FirebaseABTesting: 40774deef367dcc7b736b6c26dd59ce0fab42f41 - FirebaseAnalytics: a2731bf3670747ce8f65368b118d18aa8e368246 - FirebaseAppCheckInterop: 69fc7d8f6a1cbfa973efb8d1723651de30d12525 - FirebaseAuth: 9c5c400d2c3055d8ae3a0284944c86fa95d48dac - FirebaseCore: 28045c1560a2600d284b9c45a904fe322dc890b6 - FirebaseCoreExtension: 1c044fd46e95036cccb29134757c499613f3f564 - FirebaseCoreInternal: 43c1788eaeee9d1b97caaa751af567ce11010d00 - FirebaseCrashlytics: 81530595edb6d99f1918f723a6c33766a24a4c86 - FirebaseDynamicLinks: 61a82d43b81cd74a3cdbb1d65f07fb0241aaa553 - FirebaseFirestore: 21be9ea244830f6cac15464550c2975c43f9dffc - FirebaseFirestoreInternal: 7ac1e0c5b4e75aeb898dfe4b1d6d77abbac9eca3 - FirebaseInstallations: 390ea1d10a4d02b20c965cbfd527ee9b3b412acb - FirebaseMessaging: 06c414a21b122396a26847c523d5c370f8325df5 - FirebaseRemoteConfig: b873a427a48159082361343a85649eed3f5377ea - FirebaseSessions: 80c2bbdd28166267b3d132debe5f7531efdb00bc - FirebaseSharedSwift: 19b3f709993d6fa1d84941d41c01e3c4c11eab93 + BoringSSL-GRPC: 1e2348957acdbcad360b80a264a90799984b2ba6 + cloud_firestore: 8a2ff2bb050f87d0ca996866625cefbe2395a83b + connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db + Firebase: cec914dab6fd7b1bd8ab56ea07ce4e03dd251c2d + firebase_analytics: 04491d1ee74c8e7c2330c96afc54188a969b06ee + firebase_auth: 8dbfcdd635cc4fb2ea213aeee8c9a979b3d3373b + firebase_core: 57aeb91680e5d5e6df6b888064be7c785f146efb + firebase_crashlytics: e3d3e0c99bad5aaab5908385133dea8ec344693f + firebase_dynamic_links: 550e8cefbdee7b6e74adfebb3cc4d340fa72f6c8 + firebase_messaging: c862b3d2b973ecc769194dc8de09bd22c77ae757 + firebase_remote_config: 622c7e72a9349b7db48658ea902d9f2f1f2d7aaa + FirebaseABTesting: d87f56707159bae64e269757a6e963d490f2eebe + FirebaseAnalytics: 23717de130b779aa506e757edb9713d24b6ffeda + FirebaseAppCheckInterop: 6a1757cfd4067d8e00fccd14fcc1b8fd78cfac07 + FirebaseAuth: e2ebfaf9fb4638a1c9a3b0efd17d1b90943987cd + FirebaseCore: 30e9c1cbe3d38f5f5e75f48bfcea87d7c358ec16 + FirebaseCoreExtension: 705ca5b14bf71d2564a0ddc677df1fc86ffa600f + FirebaseCoreInternal: df84dd300b561c27d5571684f389bf60b0a5c934 + FirebaseCrashlytics: 34647b41e18de773717fdd348a22206f2f9bc774 + FirebaseDynamicLinks: 83c278fcae48ac2cf8c3fb10f64f3d469dadcf9b + FirebaseFirestore: f258936f52d712337233182b90042a76ff48dce0 + FirebaseFirestoreInternal: f43d25cc04835ec3aa1885f4fc946a1a4f9e1c56 + FirebaseInstallations: 913cf60d0400ebd5d6b63a28b290372ab44590dd + FirebaseMessaging: 7b5d8033e183ab59eb5b852a53201559e976d366 + FirebaseRemoteConfig: 48ef3f243742a8d72422ccfc9f986e19d7de53fd + FirebaseRemoteConfigInterop: 6efda51fb5e2f15b16585197e26eaa09574e8a4d + FirebaseSessions: dbd14adac65ce996228652c1fc3a3f576bdf3ecc + FirebaseSharedSwift: 20530f495084b8d840f78a100d8c5ee613375f6e Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 - flutter_app_badger: b87fc231847b03b92ce1412aa351842e7e97932f + flutter_app_badger: 824f956e8d58c7d9153ba0bf519423be4204e0ae flutter_local_notifications: 4cde75091f6327eb8517fa068a0a5950212d2086 - flutter_native_splash: 52501b97d1c0a5f898d687f1646226c1f93c56ef + flutter_native_splash: edf599c81f74d093a4daf8e17bd7a018854bc778 flutter_pdfview: 25f53dd6097661e6395b17de506e6060585946bd - GoogleAppMeasurement: bb3c564c3efb933136af0e94899e0a46167466a8 - GoogleDataTransport: 57c22343ab29bc686febbf7cbb13bad167c2d8fe - GoogleUtilities: 0759d1a57ebb953965c2dfe0ba4c82e95ccc2e34 - "gRPC-C++": 2df8cba576898bdacd29f0266d5236fa0e26ba6a - gRPC-Core: a21a60aefc08c68c247b439a9ef97174b0c54f96 - GTMSessionFetcher: 8a1b34ad97ebe6f909fb8b9b77fba99943007556 - leveldb-library: e74c27d8fbd22854db7cb467968a0b8aa1db7126 - maps_launcher: 2e5b6a2d664ec6c27f82ffa81b74228d770ab203 - nanopb: d4d75c12cd1316f4a64e3c6963f879ecd4b5e0d5 - package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85 - path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c - PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4 - PromisesSwift: 28dca69a9c40779916ac2d6985a0192a5cb4a265 + geocoding_ios: d7460f56e80e118d57678efe5c2cdc888739ff18 + GoogleAppMeasurement: f9de05ee17401e3355f68e8fc8b5064d429f5918 + GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a + GoogleUtilities: ea963c370a38a8069cc5f7ba4ca849a60b6d7d15 + "gRPC-C++": e725ef63c4475d7cdb7e2cf16eb0fde84bd9ee51 + gRPC-Core: eee4be35df218649fe66d721a05a7f27a28f069b + GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 + leveldb-library: e8eadf9008a61f9e1dde3978c086d2b6d9b9dc28 + map_launcher: 5fde49ac9a52672bf99da746599f507b4490d7b5 + nanopb: 438bc412db1928dac798aa6fd75726007be04262 + package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c + path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 + PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 + PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851 RecaptchaInterop: 7d1a4a01a6b2cb1610a47ef3f85f0c411434cb21 - share_plus: c3fef564749587fc939ef86ffb283ceac0baf9f5 - shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695 + share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad + shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec - url_launcher_ios: bbd758c6e7f9fd7b5b1d4cde34d2b95fcce5e812 - video_player_avfoundation: 02011213dab73ae3687df27ce441fbbcc82b5579 - wakelock_plus: 8b09852c8876491e4b6d179e17dfe2a0b5f60d47 + url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe + video_player_avfoundation: 7c6c11d8470e1675df7397027218274b6d2360b3 + wakelock_plus: 78ec7c5b202cab7761af8e2b2b3d0671be6c4ae1 -PODFILE CHECKSUM: 8c3ffcc2013abf8a0dfcc70bbc412ea13ea169ab +PODFILE CHECKSUM: 7270adf6e8b663f57e97181ab4e46625bc1c6899 COCOAPODS: 1.14.2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index e8073ee1..6eb906ee 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -146,6 +146,7 @@ 799C36E39E610E1373C1F82C /* [CP] Embed Pods Frameworks */, 1D813BBD2663768100FB3CCB /* ShellScript */, 1D813BBE266376D800FB3CCB /* ShellScript */, + D0AAF1C9F5956B33A2B50244 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -163,7 +164,7 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; - LastUpgradeCheck = 1430; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -173,7 +174,7 @@ }; }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 12.0"; + compatibilityVersion = "Xcode 13.0"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( @@ -309,6 +310,23 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; + D0AAF1C9F5956B33A2B50244 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -347,6 +365,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; @@ -378,6 +397,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -386,7 +406,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; @@ -408,9 +428,10 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A8S2486A44; ENABLE_BITCODE = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.education"; - IPHONEOS_DEPLOYMENT_TARGET = 12.3; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -430,6 +451,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; @@ -461,6 +483,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -475,7 +498,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -487,6 +510,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; @@ -518,6 +542,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -526,7 +551,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; @@ -550,9 +575,10 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A8S2486A44; ENABLE_BITCODE = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.education"; - IPHONEOS_DEPLOYMENT_TARGET = 12.3; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -582,9 +608,10 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A8S2486A44; ENABLE_BITCODE = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.education"; - IPHONEOS_DEPLOYMENT_TARGET = 12.3; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 303a575f..68923119 100755 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ UIApplicationSupportsIndirectInputEvents + LSApplicationQueriesSchemes + + comgooglemaps + baidumap + iosamap + waze + yandexmaps + yandexnavi + citymapper + mapswithme + osmandmaps + dgis + qqmap + here-location + tomtomgo + copilot + com.sygic.aura + nmap + kakaomap + tmap + szn-mapy + diff --git a/lib/core/domain/exchangeStudents.dart b/lib/core/domain/StudentsBloc.dart similarity index 63% rename from lib/core/domain/exchangeStudents.dart rename to lib/core/domain/StudentsBloc.dart index 29eb24ef..0977567b 100644 --- a/lib/core/domain/exchangeStudents.dart +++ b/lib/core/domain/StudentsBloc.dart @@ -1,8 +1,5 @@ -// 🎯 Dart imports: import 'dart:async'; import 'dart:convert'; - -// 🌎 Project imports: import 'package:flutter/services.dart'; import 'entities/exchange_student.dart'; @@ -11,24 +8,21 @@ class StudentsBloc { Stream> get studentList => _studentListController.stream; - Future getExchangeStudentList() async { - String data = await rootBundle.loadString('assets/students/list.json'); - Map jsonResult = jsonDecode(data)['list']; - List students = []; + Future getExchangeStudentList() async { + final data = await rootBundle.loadString('assets/students/list.json'); + final jsonResult = jsonDecode(data)['list'] as Map; - // Loop through each year's list + final students = []; for (var yearList in jsonResult.values) { - // Loop through each student in the year's list for (var item in yearList) { students.add(ExchangeStudent.fromJson(item)); } } - _studentListController.sink.add(students); } - void disposeStudent() { + void dispose() { _studentListController.close(); } } diff --git a/lib/core/domain/entities/exchange_student.dart b/lib/core/domain/entities/exchange_student.dart index 1b3d1d36..9826ae95 100644 --- a/lib/core/domain/entities/exchange_student.dart +++ b/lib/core/domain/entities/exchange_student.dart @@ -3,7 +3,7 @@ class ExchangeStudent { final String description; final String bio; final String imageUrl; - String? video; + final String? video; final String from; final String fromFlag; final String to; @@ -21,28 +21,31 @@ class ExchangeStudent { required this.toFlag, }); - factory ExchangeStudent.fromJson(Map json) => - ExchangeStudent( - name: json['name'], - description: json['description'], - bio: json['bio'], - imageUrl: json['imageUrl'], - video: json['videoUrl'], - from: json['from'], - fromFlag: json['fromFlag'], - to: json['to'], - toFlag: json['toFlag'], - ); + factory ExchangeStudent.fromJson(Map json) { + return ExchangeStudent( + name: json['name'] as String, + description: json['description'] as String, + bio: json['bio'] as String, + imageUrl: json['imageUrl'] as String, + video: json['videoUrl'] as String?, + from: json['from'] as String, + fromFlag: json['fromFlag'] as String, + to: json['to'] as String, + toFlag: json['toFlag'] as String, + ); + } - Map toJson() => { - 'name': name, - 'description': bio, - 'bio': bio, - 'imageUrl': imageUrl, - 'videoUrl': video, - 'from': from, - 'fromFlag': fromFlag, - 'to': to, - 'toFlag': toFlag, - }; + Map toJson() { + return { + 'name': name, + 'description': description, + 'bio': bio, + 'imageUrl': imageUrl, + 'videoUrl': video, + 'from': from, + 'fromFlag': fromFlag, + 'to': to, + 'toFlag': toFlag, + }; + } } diff --git a/lib/core/firebase/firebase_dynamic_links.dart b/lib/core/firebase/firebase_dynamic_links.dart index afc01aad..50c10f14 100644 --- a/lib/core/firebase/firebase_dynamic_links.dart +++ b/lib/core/firebase/firebase_dynamic_links.dart @@ -13,7 +13,7 @@ import 'package:rotary_nl_rye/core/domain/news.dart'; import 'package:rotary_nl_rye/core/presentation/pages/pdf_viewer_share.dart'; import 'package:rotary_nl_rye/features/news/presentation/pages/non_pdf_news.dart'; import 'package:rotary_nl_rye/features/news/presentation/widgets/pdf_viewer.dart'; -import 'package:rotary_nl_rye/features/settings/presentation/pages/social.dart'; +import 'package:rotary_nl_rye/features/settings/presentation/pages/SocialPage.dart'; Future initDynamicLinks(BuildContext context) async { NewsBloc _repo = NewsBloc(); diff --git a/lib/core/presentation/pages/contributors_details_page.dart b/lib/core/presentation/pages/contributors_details_page.dart index ed1ea2f2..d91616f5 100644 --- a/lib/core/presentation/pages/contributors_details_page.dart +++ b/lib/core/presentation/pages/contributors_details_page.dart @@ -48,32 +48,33 @@ class ContributorsDetails extends StatelessWidget { Row( children: [ InkWell( - borderRadius: BorderRadius.circular(60), - onTap: () { - Navigator.of(context).push(PageRouteBuilder( - opaque: false, - pageBuilder: (BuildContext context, _, __) => - FullScreenImage(url: person.imageUrl))); - }, - child: CachedNetworkImage( - height: 60, - width: 60, - imageUrl: person.imageUrl, - imageBuilder: (context, imageProvider) => - Container( - decoration: BoxDecoration( - shape: BoxShape.circle, - image: DecorationImage( - image: imageProvider, - fit: BoxFit.cover, - ), + borderRadius: BorderRadius.circular(60), + onTap: () { + Navigator.of(context).push(PageRouteBuilder( + opaque: false, + pageBuilder: (BuildContext context, _, __) => + FullScreenImage(url: person.imageUrl), + )); + }, + child: CachedNetworkImage( + height: 60, + width: 60, + imageUrl: person.imageUrl, + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + shape: BoxShape.circle, + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, ), ), - placeholder: (context, url) => - CircularProgressIndicator(), - errorWidget: (context, url, error) => - Icon(Icons.error), - )), + ), + placeholder: (context, url) => + CircularProgressIndicator(), + errorWidget: (context, url, error) => + Icon(Icons.error), + ), + ), SizedBox( width: 12, ), @@ -126,89 +127,43 @@ class ContributorsDetails extends StatelessWidget { thickness: 2, ), ), - //TODO if he has one of the socials not. then it doen't need to show up! Padding( padding: const EdgeInsets.only(left: 15.0, right: 15), child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - person.instagramUrl == null - ? SizedBox.shrink() - : Padding( - padding: - const EdgeInsets.only(right: 10.0, left: 10.0), - child: Stack( - children: [ - TextButton( - child: FaIcon( - FontAwesomeIcons.instagram, - color: Color(0xFFbc2a8d), - ), - onPressed: () => - canLaunchUrlString(person.instagramUrl), - ), - ], - ), - ), - person.linkedinUrl == null - ? SizedBox.shrink() - : Padding( - padding: - const EdgeInsets.only(right: 10.0, left: 10.0), - child: Stack( - children: [ - TextButton( - child: FaIcon( - FontAwesomeIcons.linkedinIn, - color: Color(0xFF0e76a8), - ), - onPressed: () => - canLaunchUrlString(person.linkedinUrl), - ), - ], - ), - ), - person.githubUrl == null - ? SizedBox.shrink() - : Padding( - padding: - const EdgeInsets.only(right: 10.0, left: 10.0), - child: Stack( - children: [ - TextButton( - child: FaIcon( - FontAwesomeIcons.github, - color: Color(0xFF000333), - ), - onPressed: () => - canLaunchUrlString(person.githubUrl), - ), - ], - ), - ), - person.websiteUrl == null - ? SizedBox.shrink() - : Padding( - padding: - const EdgeInsets.only(right: 10.0, left: 10.0), - child: Stack( - children: [ - TextButton( - child: FaIcon( - FontAwesomeIcons.globe, - color: Color(0xFF0e76a8), - ), - onPressed: () => - canLaunchUrlString(person.websiteUrl), - ), - ], - ), - ), + if (person.instagramUrl != null) + _buildContactButton( + icon: FontAwesomeIcons.instagram, + color: Color(0xFFbc2a8d), + backgroundColor: Colors.transparent, + onPressed: () => launchUrlString(person.instagramUrl), + ), + if (person.linkedinUrl != null) + _buildContactButton( + icon: FontAwesomeIcons.linkedinIn, + color: Color(0xFF0e76a8), + backgroundColor: Colors.transparent, + onPressed: () => launchUrlString(person.linkedinUrl), + ), + if (person.githubUrl != null) + _buildContactButton( + icon: FontAwesomeIcons.github, + color: Color(0xFF000333), + backgroundColor: Colors.transparent, + onPressed: () => launchUrlString(person.githubUrl), + ), + if (person.websiteUrl != null) + _buildContactButton( + icon: FontAwesomeIcons.globe, + color: Color(0xFF0e76a8), + backgroundColor: Colors.transparent, + onPressed: () => launchUrlString(person.websiteUrl), + ), ], ), ), - person.websiteUrl == null && person.linkedinUrl == null && person.githubUrl == null && @@ -222,7 +177,6 @@ class ContributorsDetails extends StatelessWidget { thickness: 2, ), ), - Padding( padding: const EdgeInsets.only(top: 20.0, left: 30.0, bottom: 0.0), @@ -253,64 +207,55 @@ class ContributorsDetails extends StatelessWidget { SizedBox( height: 40, ), - - // Padding( - // padding: - // const EdgeInsets.only(top: 50.0, left: 30.0, right: 20.0), - // child: Row( - // mainAxisAlignment: MainAxisAlignment.spaceBetween, - // children: [ - // Container( - // height: 70.0, - // width: 70.0, - // decoration: BoxDecoration( - // borderRadius: BorderRadius.circular(30.0), - // color: Colors.grey[200], - // ), - // child: Center( - // child: Icon( - // Icons.present_to_all, - // color: Colors.black, - // size: 25, - // )), - // ), - // Container( - // height: 65.0, - // width: 240.0, - // decoration: BoxDecoration( - // borderRadius: BorderRadius.circular(35.0), - // border: - // Border.all(color: Colors.blue.shade100, width: 5), - // color: Colors.blue[400]), - // child: Center( - // child: Row( - // children: [ - // Padding( - // padding: const EdgeInsets.only(left: 25.0), - // child: Icon( - // Icons.call, - // color: Colors.white, - // ), - // ), - // Padding( - // padding: const EdgeInsets.only(left: 25.0), - // child: Text( - // 'Send a e-mail', - // style: TextStyle( - // color: Colors.white, fontSize: 18.0), - // ), - // ) - // ], - // ), - // ), - // ) - // ], - // ), - // ) ], ) ], ), ); } + + Widget _buildContactButton({ + required IconData icon, + required Color color, + required Color backgroundColor, + Color? borderColor, + required Function onPressed, + bool isWide = false, + String? text, + }) { + return Container( + height: 65.0, + width: isWide ? 180.0 : 70.0, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(isWide ? 35.0 : 30.0), + color: backgroundColor, + border: borderColor != null + ? Border.all(color: borderColor, width: 5) + : null, + ), + child: TextButton( + onPressed: () => onPressed(), + style: TextButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(isWide ? 35.0 : 30.0), + ), + padding: EdgeInsets.zero, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + FaIcon(icon, color: color, size: 30), + if (isWide && text != null) + Padding( + padding: const EdgeInsets.only(left: 10.0), + child: Text( + text, + style: TextStyle(color: color, fontSize: 18.0), + ), + ), + ], + ), + ), + ); + } } diff --git a/lib/core/presentation/pages/inbounds_students_details_page.dart b/lib/core/presentation/pages/inbounds_students_details_page.dart deleted file mode 100644 index d2eed3e5..00000000 --- a/lib/core/presentation/pages/inbounds_students_details_page.dart +++ /dev/null @@ -1,427 +0,0 @@ -//TODO this is just a test. maybe we can build on this. - -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 📦 Package imports: -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/presentation/widgets/full_screen_image.dart'; -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -class InboundsDetails extends StatelessWidget { - final person; - final int districtnumber; - final String year; - InboundsDetails( - {required this.person, required this.districtnumber, required this.year}); - - @override - Widget build(BuildContext context) { - double currentYear = double.parse(year.trim().replaceAll('-', '')); - - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Student Profile', - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - shrinkWrap: true, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: - const EdgeInsets.only(left: 20.0, right: 20.0, top: 20), - child: Row( - children: [ - InkWell( - borderRadius: BorderRadius.circular(60), - onTap: () { - Navigator.of(context).push(PageRouteBuilder( - opaque: false, - pageBuilder: (BuildContext context, _, __) => - FullScreenImage(url: person.imageUrl))); - }, - child: CachedNetworkImage( - height: 60, - width: 60, - imageUrl: person.imageUrl, - imageBuilder: (context, imageProvider) => Container( - decoration: BoxDecoration( - shape: BoxShape.circle, - image: DecorationImage( - image: imageProvider, - fit: BoxFit.cover, - ), - ), - ), - placeholder: (context, url) => - CircularProgressIndicator(), - errorWidget: (context, url, error) => - Icon(Icons.error), - )), - const SizedBox(width: 10.0), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: EdgeInsets.zero, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - SizedBox( - width: Device.width - 150, - child: Text(person.name, - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - inherit: true, - fontSize: 22.0, - fontWeight: FontWeight.bold, - )), - ), - SvgPicture.asset( - 'assets/icons/flags/${person.countryFlag}.svg', - height: 20) - ], - ), - ), - /* - Padding( - padding: - const EdgeInsets.only(top: 15.0, bottom: 0.0), - child: Text( - person.role, - style: TextStyle( - color: Colors.grey[400], fontSize: 15.0), - ), - ), - Padding( - padding: - const EdgeInsets.only(top: 2.0, bottom: 30.0), - child: Text( - "District ${person.district}", - style: TextStyle( - color: Colors.grey[400], fontSize: 15.0), - ), - ), - */ - ], - ), - ), - ], - ), - ), - person.websiteUrl == null && - person.facebookUrl == null && - person.instagramUrl == null - ? SizedBox.shrink() - : Padding( - padding: const EdgeInsets.only( - top: 0.0, left: 20.0, bottom: 0.0, right: 20), - child: Divider( - height: 15, - thickness: 2, - ), - ), - //TODO if he has one of the socials not. then it doen't need to show up! - Padding( - padding: const EdgeInsets.only(left: 15.0, right: 15), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - person.instagramUrl == null - ? SizedBox.shrink() - : Padding( - padding: - const EdgeInsets.only(right: 10.0, left: 10.0), - child: Stack( - children: [ - TextButton( - child: FaIcon( - FontAwesomeIcons.instagram, - color: Color(0xFFbc2a8d), - ), - onPressed: () => null, - ), - ], - ), - ), - person.twitterUrl == null - ? SizedBox.shrink() - : Padding( - padding: - const EdgeInsets.only(right: 10.0, left: 10.0), - child: Stack( - children: [ - TextButton( - child: FaIcon( - FontAwesomeIcons.twitter, - color: Color(0xFF00aced), - ), - onPressed: () => null, - ), - ], - ), - ), - person.facebookUrl == null - ? SizedBox.shrink() - : Padding( - padding: - const EdgeInsets.only(right: 10.0, left: 10.0), - child: Stack( - children: [ - TextButton( - child: FaIcon( - FontAwesomeIcons.facebookF, - color: Color(0xFF3b5998), - ), - onPressed: () => null, - ), - ], - ), - ), - person.websiteUrl == null - ? SizedBox.shrink() - : Padding( - padding: - const EdgeInsets.only(right: 10.0, left: 10.0), - child: Stack( - children: [ - TextButton( - child: FaIcon( - FontAwesomeIcons.globe, - color: Color(0xFF0e76a8), - ), - onPressed: () => null, - ), - ], - ), - ), - ], - ), - ), - - person.websiteUrl == null && - person.twitterUrl == null && - person.facebookUrl == null && - person.instagramUrl == null - ? SizedBox.shrink() - : Padding( - padding: const EdgeInsets.only( - top: 0.0, left: 20.0, bottom: 10.0, right: 20), - child: Divider( - height: 15, - thickness: 2, - ), - ), - Padding( - padding: const EdgeInsets.only(left: 30.0, top: 15.0), - child: Text( - 'Info', - style: TextStyle( - fontSize: 18.0, - color: Colors.grey[600], - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only( - top: 0.0, left: 30.0, bottom: 5.0, right: 300), - child: Divider( - height: 15, - thickness: 2, - ), - ), - // Padding( - // padding: - // const EdgeInsets.only(top: 0.0, left: 30.0, bottom: 0.0), - // child: Text( - // "District: $districtnumber - ${person.district}", - // style: TextStyle(color: Colors.grey[400], fontSize: 15.0), - // ), - // ), - Padding( - padding: - const EdgeInsets.only(top: 2.0, left: 30.0, bottom: 15.0), - child: Text( - 'From: ${person.place}', - style: TextStyle(fontSize: 15.0), - ), - ), - Padding( - padding: const EdgeInsets.only(left: 30.0, top: 15.0), - child: Text( - 'Rotary', - style: TextStyle( - fontSize: 18.0, - color: Colors.grey[600], - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only( - top: 0.0, left: 30.0, bottom: 5.0, right: 300), - child: Divider( - height: 15, - thickness: 2, - ), - ), - Padding( - padding: - const EdgeInsets.only(top: 0.0, left: 30.0, bottom: 0.0), - child: Text( - "Host Club: ${person.rotaryInfo["hostClub"]}", - style: TextStyle(fontSize: 15.0), - ), - ), - Padding( - padding: - const EdgeInsets.only(top: 2.0, left: 30.0, bottom: 15.0), - child: Text( - "Sponsor Club: ${person.rotaryInfo["sponsorClub"]}", - style: TextStyle(fontSize: 15.0), - ), - ), - - currentYear < 20222023.0 - ? SizedBox.shrink() - : Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only( - top: 20.0, left: 30.0, bottom: 0.0), - child: Text( - 'About me', - style: TextStyle( - color: Colors.grey[600], - fontSize: 18.0, - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only( - top: 0.0, left: 30.0, bottom: 0.0, right: 300), - child: Divider( - height: 15, - thickness: 2, - ), - ), - Padding( - padding: const EdgeInsets.only( - left: 30.0, right: 30.0, top: 5.0), - child: Text( - person.bio, - style: TextStyle(fontSize: 16.0), - ), - ), - ]), - - // Padding( - // padding: - // const EdgeInsets.only(top: 20.0, left: 30.0, bottom: 0.0), - // child: Text( - // "About me", - // style: TextStyle( - // color: Colors.grey[600], - // fontSize: 18.0, - // fontWeight: FontWeight.bold), - // ), - // ), - // Padding( - // padding: const EdgeInsets.only( - // top: 0.0, left: 30.0, bottom: 0.0, right: 300), - // child: Divider( - // height: 15, - // thickness: 2, - // ), - // ), - // Padding( - // padding: - // const EdgeInsets.only(left: 30.0, right: 30.0, top: 5.0), - // child: Text( - // person.bio, - // style: TextStyle(fontSize: 16.0), - // ), - // ), - // Padding( - // padding: - // const EdgeInsets.only(top: 50.0, left: 30.0, right: 20.0), - // child: Row( - // mainAxisAlignment: MainAxisAlignment.spaceBetween, - // children: [ - // Container( - // height: 70.0, - // width: 70.0, - // decoration: BoxDecoration( - // borderRadius: BorderRadius.circular(30.0), - // color: Colors.grey[200], - // ), - // child: Center( - // child: Icon( - // Icons.present_to_all, - // color: Colors.black, - // size: 25, - // )), - // ), - // Container( - // height: 65.0, - // width: 200.0, - // decoration: BoxDecoration( - // borderRadius: BorderRadius.circular(35.0), - // border: - // Border.all(color: Colors.blue.shade100, width: 5), - // color: Colors.blue[400]), - // child: Center( - // child: Row( - // children: [ - // Padding( - // padding: const EdgeInsets.only(left: 25.0), - // child: Icon( - // Icons.call, - // color: Colors.white, - // ), - // ), - // Padding( - // padding: const EdgeInsets.only(left: 25.0), - // child: Text( - // 'WhatsApp', - // style: TextStyle( - // color: Colors.white, fontSize: 18.0), - // ), - // ) - // ], - // ), - // ), - // ) - // ], - // ), - // ) - ], - ) - ], - ), - ); - } -} diff --git a/lib/core/presentation/pages/organization_contact_details_page.dart b/lib/core/presentation/pages/organization_contact_details_page.dart index 04eda870..59e6793a 100644 --- a/lib/core/presentation/pages/organization_contact_details_page.dart +++ b/lib/core/presentation/pages/organization_contact_details_page.dart @@ -1,9 +1,6 @@ -//TODO this is just a test. maybe we can build on this. - -// 🎯 Dart imports: +// 🐦 Flutter imports: import 'dart:io'; -// 🐦 Flutter imports: import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -26,8 +23,6 @@ class OrganizationDetails extends StatelessWidget { OrganizationDetails({required this.person}); - final List fx = []; - @override Widget build(BuildContext context) { return Scaffold( @@ -49,490 +44,303 @@ class OrganizationDetails extends StatelessWidget { shrinkWrap: true, scrollDirection: Axis.vertical, children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, + _buildHeader(context), + _buildDivider(), + _buildSocialIcons(context), + _buildDivider(), + _buildFunctions(), + _buildRotaryClubDetails(), + _buildAboutMe(), + _buildContactOptions(), + SizedBox(height: 40), + ], + ), + ); + } + + Widget _buildHeader(BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 16), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( children: [ - Padding( - padding: EdgeInsets.only( - left: 20, - right: 20, - top: 15, - bottom: 16, - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - InkWell( - borderRadius: BorderRadius.circular(60), - onTap: () { - Navigator.of(context).push(PageRouteBuilder( - opaque: false, - pageBuilder: (BuildContext context, _, __) => - FullScreenImage(url: person.imageUrl))); - }, - child: CachedNetworkImage( - height: 60, - width: 60, - imageUrl: person.imageUrl, - imageBuilder: (context, imageProvider) => - Container( - decoration: BoxDecoration( - shape: BoxShape.circle, - image: DecorationImage( - image: imageProvider, - fit: BoxFit.cover, - ), - ), - ), - placeholder: (context, url) => - CircularProgressIndicator(), - errorWidget: (context, url, error) => - Icon(Icons.error), - )), - SizedBox( - width: 12, - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - width: Device.width - 150, - child: Text(person.name, - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - inherit: true, - fontSize: 22.0, - fontWeight: FontWeight.bold, - )), - ), - SizedBox( - height: 4, - ), - SizedBox( - width: Device.width - 150, - child: Text(person.functions[0], - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - inherit: true, - fontSize: 14.0, - color: Colors.grey, - )), - ), - ], - ) - ], + InkWell( + borderRadius: BorderRadius.circular(60), + onTap: () { + Navigator.of(context).push(PageRouteBuilder( + opaque: false, + pageBuilder: (BuildContext context, _, __) => + FullScreenImage(url: person.imageUrl), + )); + }, + child: CachedNetworkImage( + height: 60, + width: 60, + imageUrl: person.imageUrl, + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + shape: BoxShape.circle, + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), ), - SvgPicture.asset('assets/icons/custom/rotary-logo-icon.svg', - color: Color(0xFFf7a81b), height: 30), - ], + ), + placeholder: (context, url) => CircularProgressIndicator(), + errorWidget: (context, url, error) => Icon(Icons.error), ), ), - - person.phoneNumber == null - ? SizedBox.shrink() - : Padding( - padding: const EdgeInsets.only( - top: 0.0, left: 20.0, bottom: 0.0, right: 20), - child: Divider( - height: 15, - thickness: 2, + SizedBox(width: 12), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + width: Device.width - 150, + child: Text( + person.name, + maxLines: 2, + overflow: TextOverflow.ellipsis, + softWrap: false, + style: TextStyle( + inherit: true, + fontSize: 22.0, + fontWeight: FontWeight.bold, ), ), - //TODO if he has one of the socials not. then it doen't need to show up! - Padding( - padding: const EdgeInsets.only(left: 15.0, right: 15), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - person.phoneNumber == null - ? SizedBox.shrink() - : Padding( - padding: EdgeInsets.zero, - child: Stack( - children: [ - Platform.isIOS == true - ? CupertinoButton( - child: FaIcon( - FontAwesomeIcons.whatsapp, - color: Color( - 0xFF25D366, - ), - size: 30, - ), - onPressed: () => openwhatsapp( - context, person.phoneNumber!), - padding: EdgeInsets.zero, - ) - : TextButton( - child: FaIcon( - FontAwesomeIcons.whatsapp, - color: Color(0xFF25D366), - ), - onPressed: () => openwhatsapp( - context, person.phoneNumber!), - ), - ], - ), - ), - // person.phoneNumber == null - // ? SizedBox.shrink() - // : Padding( - // padding: EdgeInsets.zero, - // child: Stack( - // children: [ - // Platform.isIOS == true - // ? CupertinoButton( - // child: FaIcon( - // FontAwesomeIcons.instagram, - // color: Color(0xFFbc2a8d), - // size: 30, - // ), - // onPressed: () => openwhatsapp( - // context, person.phoneNumber!), - // padding: EdgeInsets.zero, - // ) - // : TextButton( - // child: FaIcon( - // FontAwesomeIcons.whatsapp, - // color: Color(0xFF25D366), - // ), - // onPressed: () => openwhatsapp( - // context, person.phoneNumber!), - // ), - // ], - // ), - // ), - // person.phoneNumber == null - // ? SizedBox.shrink() - // : Padding( - // padding: EdgeInsets.zero, - // child: Stack( - // children: [ - // Platform.isIOS == true - // ? CupertinoButton( - // child: FaIcon( - // FontAwesomeIcons.whatsapp, - // color: Color( - // 0xFF25D366, - // ), - // size: 30, - // ), - // onPressed: () => openwhatsapp( - // context, person.phoneNumber!), - // padding: EdgeInsets.zero, - // ) - // : TextButton( - // child: FaIcon( - // FontAwesomeIcons.whatsapp, - // color: Color(0xFF25D366), - // ), - // onPressed: () => openwhatsapp( - // context, person.phoneNumber!), - // ), - // ], - // ), - // ), - // person.phoneNumber == null - // ? SizedBox.shrink() - // : Padding( - // padding: EdgeInsets.zero, - // child: Stack( - // children: [ - // Platform.isIOS == true - // ? CupertinoButton( - // child: FaIcon( - // FontAwesomeIcons.whatsapp, - // color: Color( - // 0xFF25D366, - // ), - // size: 30, - // ), - // onPressed: () => openwhatsapp( - // context, person.phoneNumber!), - // padding: EdgeInsets.zero, - // ) - // : TextButton( - // child: FaIcon( - // FontAwesomeIcons.whatsapp, - // color: Color(0xFF25D366), - // ), - // onPressed: () => openwhatsapp( - // context, person.phoneNumber!), - // ), - // ], - // ), - // ), - - // person.snapchatUrl == null - // ? SizedBox.shrink() - // : Padding( - // padding: - // const EdgeInsets.only(right: 10.0, left: 10.0), - // child: Stack( - // children: [ - // TextButton( - // child: FaIcon( - // FontAwesomeIcons.snapchatGhost, - // color: Color(0xFFFFFC00), - // ), - // onPressed: () => canLaunchUrlString(person.snapchatUrl), - // ), - // ], - // ), - // ), - // person.linkedinUrl == null - // ? SizedBox.shrink() - // : Padding( - // padding: - // const EdgeInsets.only(right: 10.0, left: 10.0), - // child: Stack( - // children: [ - // TextButton( - // child: FaIcon( - // FontAwesomeIcons.linkedinIn, - // color: Color(0xFF0e76a8), - // ), - // onPressed: () => canLaunchUrlString(person.linkedinUrl), - // ), - // ], - // ), - // ), - // person.facebookUrl == null - // ? SizedBox.shrink() - // : Padding( - // padding: - // const EdgeInsets.only(right: 10.0, left: 10.0), - // child: Stack( - // children: [ - // TextButton( - // child: FaIcon( - // FontAwesomeIcons.facebookF, - // color: Color(0xFF3b5998), - // ), - // onPressed: () => canLaunchUrlString(person.facebookUrl), - // ), - // ], - // ), - // ), - // person.websiteUrl == null - // ? SizedBox.shrink() - // : Padding( - // padding: - // const EdgeInsets.only(right: 10.0, left: 10.0), - // child: Stack( - // children: [ - // TextButton( - // child: FaIcon( - // FontAwesomeIcons.globe, - // color: Color(0xFF0e76a8), - // ), - // onPressed: () => canLaunchUrlString(person.websiteUrl), - // ), - // ], - // ), - // ), - ], - ), - ), - - person.phoneNumber == null - ? SizedBox.shrink() - : Padding( - padding: const EdgeInsets.only( - top: 0.0, left: 20.0, bottom: 10.0, right: 20), - child: Divider( - height: 15, - thickness: 2, + ), + SizedBox(height: 4), + SizedBox( + width: Device.width - 150, + child: Text( + person.functions.isNotEmpty ? person.functions[0] : '', + maxLines: 2, + overflow: TextOverflow.ellipsis, + softWrap: false, + style: TextStyle( + inherit: true, + fontSize: 14.0, + color: Colors.grey, ), ), - - Padding( - padding: const EdgeInsets.only(left: 30.0, top: 20.0), - child: Text( - 'Functions', - style: TextStyle( - fontSize: 18.0, - color: Colors.grey[600], - fontWeight: FontWeight.bold), - ), + ), + ], ), - Padding( - padding: const EdgeInsets.only( - top: 0.0, left: 30.0, bottom: 5.0, right: 300), - child: Divider( - height: 15, - thickness: 2, - ), - ), - Padding( - padding: const EdgeInsets.only( - top: 2.0, left: 30.0, bottom: 15.0, right: 20), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - for (var x in person.functions) - Text( - '- $x', - style: TextStyle(fontSize: 15.0), - ) - ], - ), - //Text( - // 'hi', - // style: TextStyle(fontSize: 15.0), - // ), - ), - Padding( - padding: const EdgeInsets.only(left: 30.0, top: 15.0), - child: Text( - 'Rotary Club', - style: TextStyle( - fontSize: 18.0, - color: Colors.grey[600], - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only( - top: 0.0, left: 30.0, bottom: 5.0, right: 250), - child: Divider( - height: 15, - thickness: 2, - ), - ), - Padding( - padding: - const EdgeInsets.only(top: 0.0, left: 30.0, bottom: 0.0), - child: Text( - 'Club District: ${person.district}', - style: TextStyle(fontSize: 15.0), - ), - ), - Padding( - padding: - const EdgeInsets.only(top: 2.0, left: 30.0, bottom: 15.0), - child: Text( - 'Club name: ${person.club}', - style: TextStyle(fontSize: 15.0), - ), - ), - Padding( - padding: - const EdgeInsets.only(top: 20.0, left: 30.0, bottom: 0.0), - child: Text( - 'About me', - style: TextStyle( - color: Colors.grey[600], - fontSize: 18.0, - fontWeight: FontWeight.bold), + ], + ), + SvgPicture.asset('assets/icons/custom/rotary-logo-icon.svg', + color: Color(0xFFf7a81b), height: 30), + ], + ), + ); + } + + Widget _buildDivider() { + return person.phoneNumber == null + ? SizedBox.shrink() + : Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Divider(height: 15, thickness: 2), + ); + } + + Widget _buildSocialIcons(BuildContext context) { + if (person.phoneNumber == null) return SizedBox.shrink(); + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 15), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _buildSocialIcon( + context, + icon: FontAwesomeIcons.whatsapp, + color: Color(0xFF25D366), + onPressed: () => openwhatsapp(context, person.phoneNumber!), + ), + // Add other social icons here as needed + ], + ), + ); + } + + Widget _buildSocialIcon(BuildContext context, + {required IconData icon, + required Color color, + required Function onPressed}) { + return Platform.isIOS + ? CupertinoButton( + child: FaIcon(icon, color: color, size: 30), + onPressed: () => onPressed(), + padding: EdgeInsets.zero, + ) + : TextButton( + child: FaIcon(icon, color: color), + onPressed: () => onPressed(), + ); + } + + Widget _buildFunctions() { + return Padding( + padding: const EdgeInsets.only(left: 30, top: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Functions', + style: TextStyle( + fontSize: 18.0, + color: Colors.grey[600], + fontWeight: FontWeight.bold), + ), + Divider(height: 15, thickness: 2, endIndent: 200), + Padding( + padding: const EdgeInsets.only(top: 2.0, bottom: 15.0, right: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: person.functions + .map((function) => + Text('- $function', style: TextStyle(fontSize: 15.0))) + .toList(), + ), + ), + ], + ), + ); + } + + Widget _buildRotaryClubDetails() { + return Padding( + padding: const EdgeInsets.only(left: 30, top: 15), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Rotary Club', + style: TextStyle( + fontSize: 18.0, + color: Colors.grey[600], + fontWeight: FontWeight.bold), + ), + Divider(height: 15, thickness: 2, endIndent: 250), + Text('Club District: ${person.district}', + style: TextStyle(fontSize: 15.0)), + Text('Club name: ${person.club}', style: TextStyle(fontSize: 15.0)), + ], + ), + ); + } + + Widget _buildAboutMe() { + return Padding( + padding: const EdgeInsets.only(left: 30, top: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'About me', + style: TextStyle( + color: Colors.grey[600], + fontSize: 18.0, + fontWeight: FontWeight.bold), + ), + Divider(height: 15, thickness: 2, endIndent: 280), + Padding( + padding: const EdgeInsets.only(right: 30, top: 5), + child: Text(person.bio, style: TextStyle(fontSize: 16.0)), + ), + ], + ), + ); + } + + Widget _buildContactOptions() { + return Padding( + padding: const EdgeInsets.only(top: 50, left: 30, right: 20), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + person.email == null + ? SizedBox.shrink() + : _buildContactButton( + icon: FontAwesomeIcons.envelope, + color: Colors.black, + backgroundColor: Colors.grey.shade200, + onPressed: () async { + final email = Uri.parse('mailto:${person.email}'); + if (await canLaunchUrl(email)) { + launchUrl(email); + } else { + throw 'Could not launch $email'; + } + }, ), - ), - Padding( - padding: const EdgeInsets.only( - top: 0.0, left: 30.0, bottom: 0.0, right: 200), - child: Divider( - height: 15, - thickness: 2, + person.phoneNumber == null + ? SizedBox.shrink() + : _buildContactButton( + icon: FontAwesomeIcons.phone, + color: Colors.white, + backgroundColor: Colors.blue.shade400, + borderColor: Colors.blue.shade100, + onPressed: () async { + final sms = Uri.parse('tel:${person.phoneNumber}'); + if (await canLaunchUrl(sms)) { + launchUrl(sms); + } else { + throw 'Could not launch $sms'; + } + }, + isWide: true, + text: 'Call me', ), - ), + ], + ), + ); + } + + Widget _buildContactButton({ + required IconData icon, + required Color color, + required Color backgroundColor, + Color? borderColor, + required VoidCallback onPressed, // Changed Function to VoidCallback + bool isWide = false, + String? text, + }) { + return Container( + height: 65.0, + width: isWide ? 180.0 : 70.0, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(isWide ? 35.0 : 30.0), + color: backgroundColor, + border: borderColor != null + ? Border.all(color: borderColor, width: 5) + : null, + ), + child: TextButton( + onPressed: onPressed, + style: TextButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(isWide ? 35.0 : 30.0), + ), + padding: EdgeInsets.zero, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + FaIcon(icon, color: color, size: 30), + if (isWide && text != null) Padding( - padding: - const EdgeInsets.only(left: 30.0, right: 30.0, top: 5.0), + padding: const EdgeInsets.only(left: 10.0), child: Text( - person.bio, - style: TextStyle(fontSize: 16.0), - ), - ), - Padding( - padding: - const EdgeInsets.only(top: 50.0, left: 30.0, right: 20.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - person.email == null - ? SizedBox.shrink() - : Container( - height: 70.0, - width: 70.0, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(30.0), - color: Colors.grey[200], - ), - child: RawMaterialButton( - onPressed: () async { - final email = - Uri.parse('mailto:${person.email}'); - if (await canLaunchUrl(email)) { - launchUrl(email); - } else { - throw 'Could not launch $email'; - } - }, - shape: new RoundedRectangleBorder( - borderRadius: BorderRadius.circular(30.0)), - child: FaIcon( - FontAwesomeIcons.envelope, - color: Colors.black, - size: 30, - ))), - person.phoneNumber == null - ? SizedBox.shrink() - : Container( - height: 65.0, - width: 180.0, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(35.0), - border: Border.all( - color: Colors.blue.shade100, width: 5), - color: Colors.blue[400]), - child: RawMaterialButton( - onPressed: () async { - final sms = - Uri.parse('tel:${person.phoneNumber}'); - if (await canLaunchUrl(sms)) { - launchUrl(sms); - } else { - throw 'Could not launch $sms'; - } - }, - shape: new RoundedRectangleBorder( - borderRadius: BorderRadius.circular(35.0)), - child: Row( - children: [ - Padding( - padding: const EdgeInsets.only(left: 25.0), - child: FaIcon( - FontAwesomeIcons.phone, - color: Colors.white, - ), - ), - Padding( - padding: const EdgeInsets.only(left: 20.0), - child: Text( - 'Call me ', - style: TextStyle( - color: Colors.white, fontSize: 18.0), - ), - ) - ], - ), - )) - ], + text, + style: TextStyle(color: color, fontSize: 18.0), ), ), - SizedBox( - height: 40, - ), - ], - ) - ], + ], + ), ), ); } diff --git a/lib/core/presentation/pages/pdf_viewer_share.dart b/lib/core/presentation/pages/pdf_viewer_share.dart index dd897894..1aba4846 100644 --- a/lib/core/presentation/pages/pdf_viewer_share.dart +++ b/lib/core/presentation/pages/pdf_viewer_share.dart @@ -25,6 +25,7 @@ class PDFPageWithShare extends StatefulWidget { final String pdfUrl; PDFPageWithShare({required this.pdfUrl}); + @override _PDFPageWithShareState createState() => _PDFPageWithShareState(pdfUrl: pdfUrl); @@ -35,25 +36,18 @@ class _PDFPageWithShareState extends State { _PDFPageWithShareState({required this.pdfUrl}); - String title = 'Loading'; - - FirebaseDynamicLinks dynamicLinks = FirebaseDynamicLinks.instance; - final Completer _pdfViewController = Completer(); final StreamController _pageCountController = StreamController(); + final FirebaseDynamicLinks dynamicLinks = FirebaseDynamicLinks.instance; String? _linkMessage; - String? id; @override void initState() { super.initState(); - - this._createDynamicLink(pdfUrl); - - print(pdfUrl); + _createDynamicLink(pdfUrl); SystemChrome.setPreferredOrientations([ DeviceOrientation.landscapeRight, DeviceOrientation.landscapeLeft, @@ -66,147 +60,130 @@ class _PDFPageWithShareState extends State { SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, ]); + _pageCountController.close(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - systemOverlayStyle: SystemUiOverlayStyle( - statusBarBrightness: MediaQuery.of(context).platformBrightness, - ), - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - actions: [ - Container( - // margin: EdgeInsets.only(right: 10, top: 5), - // width: 50, - // height: 50, - // decoration: BoxDecoration( - // color: Palette.themeShadeColor, - // borderRadius: BorderRadius.circular(40.0), - // ), - child: PopupMenuButton( - // color: Colors.black, - itemBuilder: (context) => [ - PopupMenuItem( - value: 0, - child: Row( - children: [ - Icon( - CupertinoIcons.share, - color: Palette.lightIndigo, - ), - const SizedBox( - width: 7, - ), - Text('Share in-app Link') - ], - )), - PopupMenuDivider(), - PopupMenuItem( - value: 1, - child: Row( - children: [ - FaIcon( - FontAwesomeIcons.filePdf, - color: Palette.lightIndigo, - ), - const SizedBox( - width: 7, - ), - Text('Share Document') - ], - )), - ], - onSelected: (item) => selectedItem(context, item), - icon: FaIcon( - FontAwesomeIcons.list, - color: Palette.indigo, - size: 22.0, + appBar: AppBar( + systemOverlayStyle: SystemUiOverlayStyle( + statusBarBrightness: MediaQuery.of(context).platformBrightness, + ), + backgroundColor: Colors.transparent, + elevation: 0.0, + leading: UniformBackButton(), + actions: [ + Container( + child: PopupMenuButton( + itemBuilder: (context) => [ + PopupMenuItem( + value: 0, + child: Row( + children: [ + Icon(CupertinoIcons.share, color: Palette.lightIndigo), + const SizedBox(width: 7), + Text('Share in-app Link'), + ], + ), ), - ), + PopupMenuDivider(), + PopupMenuItem( + value: 1, + child: Row( + children: [ + FaIcon(FontAwesomeIcons.filePdf, + color: Palette.lightIndigo), + const SizedBox(width: 7), + Text('Share Document'), + ], + ), + ), + ], + onSelected: (item) => _selectedItem(context, item), + icon: FaIcon(FontAwesomeIcons.list, + color: Palette.indigo, size: 22.0), ), - ], - ), - body: Stack( - children: [ - PDF( - onPageChanged: (int? current, int? total) => - _pageCountController.add('${current! + 1} / $total'), - onViewCreated: (PDFViewController pdfViewController) async { - _pdfViewController.complete(pdfViewController); - final int currentPage = - await pdfViewController.getCurrentPage() ?? 0; - final int? pageCount = await pdfViewController.getPageCount(); - _pageCountController.add('${currentPage + 1} / $pageCount'); - }, - ).cachedFromUrl( - pdfUrl, - placeholder: (progress) => Center( - child: Stack( - alignment: Alignment.center, - children: [ - new CircularPercentIndicator( - animation: true, - animateFromLastPercent: true, - radius: 80.0, - lineWidth: 8.0, - percent: (progress / 100), - center: new Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - '${(progress).round()}%', - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.black, - fontSize: 30.0, - fontWeight: FontWeight.bold), - ), - Text( - 'COMPLETED', - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.black, - fontSize: 15.0, - fontWeight: FontWeight.bold), - ), - ], - ), - progressColor: Colors.green, - ) + ), + ], + ), + body: Stack( + children: [ + PDF( + onPageChanged: (int? current, int? total) => + _pageCountController.add('${current! + 1} / $total'), + onViewCreated: (PDFViewController pdfViewController) async { + _pdfViewController.complete(pdfViewController); + final int currentPage = + await pdfViewController.getCurrentPage() ?? 0; + final int? pageCount = await pdfViewController.getPageCount(); + _pageCountController.add('${currentPage + 1} / $pageCount'); + }, + ).cachedFromUrl( + pdfUrl, + placeholder: (progress) => Center( + child: CircularPercentIndicator( + animation: true, + animateFromLastPercent: true, + radius: 80.0, + lineWidth: 8.0, + percent: progress / 100, + center: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + '${progress.round()}%', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.black, + fontSize: 30.0, + fontWeight: FontWeight.bold), + ), + Text( + 'COMPLETED', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.black, + fontSize: 15.0, + fontWeight: FontWeight.bold), + ), ], ), + progressColor: Colors.green, ), - errorWidget: (error) => Center(child: Text(error.toString())), - maxAgeCacheObject: const Duration(days: 10), ), - StreamBuilder( - stream: _pageCountController.stream, - builder: (_, AsyncSnapshot snapshot) { - if (snapshot.hasData) { - return Positioned( - top: 20, - right: 20, - child: Container( - padding: EdgeInsets.only( - top: 4.0, left: 16.0, bottom: 4.0, right: 16.0), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(4.0), - color: Colors.grey[400]), - child: Text(snapshot.data!, - style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.w400)))); - } - - return const SizedBox(); - }), - ], - )); + errorWidget: (error) => Center(child: Text(error.toString())), + maxAgeCacheObject: const Duration(days: 10), + ), + StreamBuilder( + stream: _pageCountController.stream, + builder: (_, AsyncSnapshot snapshot) { + if (snapshot.hasData) { + return Positioned( + top: 20, + right: 20, + child: Container( + padding: + EdgeInsets.symmetric(vertical: 4.0, horizontal: 16.0), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4.0), + color: Colors.grey[400], + ), + child: Text( + snapshot.data!, + style: TextStyle( + fontSize: 16.0, fontWeight: FontWeight.w400), + ), + ), + ); + } + return const SizedBox(); + }, + ), + ], + ), + ); } Future _createDynamicLink(String pdfUrl) async { @@ -214,8 +191,7 @@ class _PDFPageWithShareState extends State { final DynamicLinkParameters parameters = DynamicLinkParameters( uriPrefix: 'https://rotarynl.page.link', - link: Uri.parse( - 'https://rotarynl.page.link/pdfUrl?url=$pdfUrl'), //change this to the url in the main.dart + link: Uri.parse('https://rotarynl.page.link/pdfUrl?url=$pdfUrl'), androidParameters: AndroidParameters( packageName: 'com.caelitechnologies.rotary_nl_rye', minimumVersion: 1, @@ -225,60 +201,50 @@ class _PDFPageWithShareState extends State { minimumVersion: '1', appStoreId: '1567096118', ), - // socialMetaTagParameters: SocialMetaTagParameters( - // title: 'Example of a Dynamic Link', - // description: 'This link works whether app is installed or not!', - // imageUrl: Uri.parse( - // 'https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/6e/21/e4/6e21e45b-49cb-fa52-83c2-bb56ab288b49/AppIcon-0-0-1x_U007emarketing-0-0-0-4-0-0-sRGB-0-0-0-GLES2_U002c0-512MB-85-220-0-0.jpeg/1200x630wa.png'), - // ), ); - Uri url; final ShortDynamicLink shortLink = await dynamicLinks.buildShortLink(parameters); - url = shortLink.shortUrl; + final Uri url = shortLink.shortUrl; - if (this.mounted) { + if (mounted) { setState(() { _linkMessage = url.toString(); }); } } - Future selectedItem(BuildContext context, item) async { + Future _selectedItem(BuildContext context, int item) async { _createDynamicLink(pdfUrl); switch (item) { case 0: - if (await canLaunchUrlString(_linkMessage!)) { + if (_linkMessage != null && await canLaunchUrlString(_linkMessage!)) { await Share.share( - Platform.isIOS - ? 'Hierbij verstuur ik een linkje van een Document: $_linkMessage' // iOS - : 'Hierbij verstuur ik een linkje van een Document: $_linkMessage', //android - subject: 'look at this nice app :)'); + 'Hierbij verstuur ik een linkje van een Document: $_linkMessage', + subject: 'Look at this nice app :)', + ); } else { throw 'Could not launch $_linkMessage'; } - break; - case 1: Directory tempDir = await getTemporaryDirectory(); - String fielName = pdfUrl.split('/').last; - - final path = '${tempDir.path}/${fielName}'; + String fileName = pdfUrl.split('/').last; + final path = '${tempDir.path}/$fileName'; await Dio().download(pdfUrl, path); - if (await canLaunchUrlString(_linkMessage!)) { - await Share.shareXFiles([XFile(path)], - text: - 'Hierbij verstuur ik een linkje van een Document: $_linkMessage', - subject: fielName); + if (_linkMessage != null && await canLaunchUrlString(_linkMessage!)) { + await Share.shareXFiles( + [XFile(path)], + text: + 'Hierbij verstuur ik een linkje van een Document: $_linkMessage', + subject: fileName, + ); } else { throw 'Could not launch $_linkMessage'; } - break; } } diff --git a/lib/core/presentation/pages/rotex_contact_details_page.dart b/lib/core/presentation/pages/rotex_contact_details_page.dart index 25a428a8..5ab219b9 100644 --- a/lib/core/presentation/pages/rotex_contact_details_page.dart +++ b/lib/core/presentation/pages/rotex_contact_details_page.dart @@ -6,18 +6,16 @@ import 'package:flutter/services.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher_string.dart'; // 🌎 Project imports: import 'package:rotary_nl_rye/core/lang/languages.dart'; import 'package:rotary_nl_rye/core/presentation/widgets/full_screen_image.dart'; -import 'package:rotary_nl_rye/core/presentation/widgets/open_whatsapp.dart'; import 'package:rotary_nl_rye/core/prop.dart'; import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; class RotexDetails extends StatelessWidget { - final person; + final dynamic person; RotexDetails({required this.person}); @override @@ -45,357 +43,200 @@ class RotexDetails extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: EdgeInsets.only( - left: 20, - right: 20, - top: 15, - bottom: 16, - ), + padding: + const EdgeInsets.symmetric(horizontal: 20, vertical: 15), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row( children: [ InkWell( - borderRadius: BorderRadius.circular(60), - onTap: () { - Navigator.of(context).push(PageRouteBuilder( - opaque: false, - pageBuilder: (BuildContext context, _, __) => - FullScreenImage(url: person.imageUrl))); - }, - child: CachedNetworkImage( - height: 60, - width: 60, - imageUrl: person.imageUrl, - imageBuilder: (context, imageProvider) => - Container( - decoration: BoxDecoration( - shape: BoxShape.circle, - image: DecorationImage( - image: imageProvider, - fit: BoxFit.cover, - ), + borderRadius: BorderRadius.circular(60), + onTap: () { + Navigator.of(context).push(PageRouteBuilder( + opaque: false, + pageBuilder: (BuildContext context, _, __) => + FullScreenImage(url: person.imageUrl), + )); + }, + child: CachedNetworkImage( + height: 60, + width: 60, + imageUrl: person.imageUrl, + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + shape: BoxShape.circle, + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, ), ), - placeholder: (context, url) => - CircularProgressIndicator(), - errorWidget: (context, url, error) => - Icon(Icons.error), - )), - SizedBox( - width: 12, + ), + placeholder: (context, url) => + CircularProgressIndicator(), + errorWidget: (context, url, error) => + Icon(Icons.error), + ), ), + SizedBox(width: 12), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( - width: Device.width - 150, - child: Text(person.name, - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - inherit: true, - fontSize: 22.0, - fontWeight: FontWeight.bold, - )), - ), - SizedBox( - height: 4, + width: MediaQuery.of(context).size.width - 150, + child: Text( + person.name, + maxLines: 2, + overflow: TextOverflow.ellipsis, + softWrap: false, + style: TextStyle( + inherit: true, + fontSize: 22.0, + fontWeight: FontWeight.bold, + ), + ), ), + SizedBox(height: 4), SizedBox( - width: Device.width - 150, - child: Text(person.role, - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - inherit: true, - fontSize: 14.0, - color: Colors.grey, - )), + width: MediaQuery.of(context).size.width - 150, + child: Text( + person.role, + maxLines: 2, + overflow: TextOverflow.ellipsis, + softWrap: false, + style: TextStyle( + inherit: true, + fontSize: 14.0, + color: Colors.grey, + ), + ), ), ], - ) + ), ], ), SvgPicture.asset('assets/icons/custom/rotex_logo_light.svg', - // color: Color(0xFFf7a81b), height: 30), ], ), ), - person.websiteUrl == null && - person.facebookUrl == null && - person.instagramUrl == null && - person.snapchatUrl == null && - person.phoneNumber == null - ? SizedBox.shrink() - : Padding( - padding: const EdgeInsets.only( - top: 0.0, left: 20.0, bottom: 0.0, right: 20), - child: Divider( - height: 15, - thickness: 2, - ), - ), - //TODO if he has one of the socials not. then it doen't need to show up! - Padding( - padding: const EdgeInsets.only(left: 15.0, right: 15), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - person.instagramUrl == null - ? SizedBox.shrink() - : Padding( - padding: - const EdgeInsets.only(right: 10.0, left: 10.0), - child: Stack( - children: [ - TextButton( - child: FaIcon( - FontAwesomeIcons.instagram, - color: Color(0xFFbc2a8d), - ), - onPressed: () => - launchUrlString(person.instagramUrl), - ), - ], - ), - ), - person.snapchatUrl == null - ? SizedBox.shrink() - : Padding( - padding: - const EdgeInsets.only(right: 10.0, left: 10.0), - child: Stack( - children: [ - TextButton( - child: FaIcon( - FontAwesomeIcons.snapchat, - color: Color.fromARGB(221, 201, 198, 8), - ), - onPressed: () => - launchUrlString(person.snapchatUrl), - ), - ], - ), - ), - person.linkedinUrl == null - ? SizedBox.shrink() - : Padding( - padding: - const EdgeInsets.only(right: 10.0, left: 10.0), - child: Stack( - children: [ - TextButton( - child: FaIcon( - FontAwesomeIcons.linkedinIn, - color: Color(0xFF0e76a8), - ), - onPressed: () => - launchUrlString(person.linkedinUrl), - ), - ], - ), - ), - person.facebookUrl == null - ? SizedBox.shrink() - : Padding( - padding: - const EdgeInsets.only(right: 10.0, left: 10.0), - child: Stack( - children: [ - TextButton( - child: FaIcon( - FontAwesomeIcons.facebookF, - color: Color(0xFF3b5998), - ), - onPressed: () => - launchUrlString(person.facebookUrl), - ), - ], - ), - ), - person.websiteUrl == null - ? SizedBox.shrink() - : Padding( - padding: - const EdgeInsets.only(right: 10.0, left: 10.0), - child: Stack( - children: [ - TextButton( - child: FaIcon( - FontAwesomeIcons.globe, - color: Color(0xFF0e76a8), - ), - onPressed: () => - launchUrlString(person.websiteUrl), - ), - ], - ), - ), - ], - ), - ), - - person.websiteUrl == null && - person.linkedinUrl == null && - person.facebookUrl == null && - person.instagramUrl == null && - person.snapchatUrl == null - ? SizedBox.shrink() - : Padding( - padding: const EdgeInsets.only( - top: 0.0, left: 20.0, bottom: 10.0, right: 20), - child: Divider( - height: 15, - thickness: 2, - ), - ), - + _buildDivider(), + _buildSocialLinks(), + _buildDivider(), + _buildSectionTitle('About me'), + _buildDivider(), Padding( padding: - const EdgeInsets.only(top: 20.0, left: 30.0, bottom: 0.0), - child: Text( - 'About me', - style: TextStyle( - color: Colors.grey[600], - fontSize: 18.0, - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only( - top: 0.0, left: 30.0, bottom: 0.0, right: 300), - child: Divider( - height: 15, - thickness: 2, - ), - ), - Padding( - padding: - const EdgeInsets.only(left: 30.0, right: 30.0, top: 5.0), + const EdgeInsets.symmetric(horizontal: 30, vertical: 5), child: Text( DemoLocalizations.of(context)!.trans(person.bio), style: TextStyle(fontSize: 16.0), ), ), - person.websiteUrl == null && - person.linkedinUrl == null && - person.facebookUrl == null && - person.instagramUrl == null && - person.snapchatUrl == null - ? SizedBox( - height: 40, - ) - : SizedBox.shrink(), + _buildContactButtons(), + SizedBox(height: 40), + ], + ), + ], + ), + ); + } - Padding( - padding: - const EdgeInsets.only(top: 15.0, left: 30.0, right: 20.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - person.email == null - ? SizedBox.shrink() - : Container( - height: 70.0, - width: 70.0, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(30.0), - color: Colors.grey[200], - ), - child: RawMaterialButton( - onPressed: () async { - final sms = - Uri.parse('mailto:${person.email}'); - if (await canLaunchUrl(sms)) { - launchUrl(sms); - } else { - throw 'Could not launch $sms'; - } - }, - shape: new RoundedRectangleBorder( - borderRadius: BorderRadius.circular(30.0)), - child: FaIcon( - FontAwesomeIcons.envelope, - color: Colors.black, - size: 30, - ))), - person.phoneNumber == null - ? SizedBox.shrink() - : Container( - height: 70.0, - width: 70.0, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(30.0), - color: Colors.grey[200], - ), - child: RawMaterialButton( - onPressed: () => - openwhatsapp(context, person.phoneNumber!), - shape: new RoundedRectangleBorder( - borderRadius: BorderRadius.circular(30.0)), - child: FaIcon( - FontAwesomeIcons.whatsapp, - color: Color( - 0xFF25D366, - ), - size: 40, - ), - )), + Widget _buildDivider() { + return person.websiteUrl == null && + person.facebookUrl == null && + person.instagramUrl == null && + person.snapchatUrl == null && + person.phoneNumber == null + ? SizedBox.shrink() + : Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Divider(height: 15, thickness: 2), + ); + } - // Container( - // height: 65.0, - // width: 230.0, - // decoration: BoxDecoration( - // borderRadius: BorderRadius.circular(35.0), - // border: Border.all( - // color: Colors.blue.shade100, width: 5), - // color: Colors.blue[400]), - // child: RawMaterialButton( - // onPressed: () { - // launchUrlString("tel:${person.phoneNumber}"); - // }, - // shape: new RoundedRectangleBorder( - // borderRadius: BorderRadius.circular(35.0)), - // child: Row( - // children: [ - // Padding( - // padding: const EdgeInsets.only(left: 25.0), - // child: FaIcon( - // FontAwesomeIcons.whatsapp, - // color: Color( - // 0xFF25D366, - // ), - // size: 30, - // ), - // ), - // Padding( - // padding: const EdgeInsets.only(left: 20.0), - // child: Text( - // 'Whatsapp me ', - // style: TextStyle( - // color: Colors.white, fontSize: 18.0), - // ), - // ) - // ], - // ), - // )) - ], - ), - ), + Widget _buildSocialLinks() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 15), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + if (person.instagramUrl != null) + _buildSocialIconButton(FontAwesomeIcons.instagram, + person.instagramUrl, Color(0xFFbc2a8d)), + if (person.snapchatUrl != null) + _buildSocialIconButton(FontAwesomeIcons.snapchat, + person.snapchatUrl, Color.fromARGB(221, 201, 198, 8)), + if (person.linkedinUrl != null) + _buildSocialIconButton(FontAwesomeIcons.linkedinIn, + person.linkedinUrl, Color(0xFF0e76a8)), + if (person.facebookUrl != null) + _buildSocialIconButton(FontAwesomeIcons.facebookF, + person.facebookUrl, Color(0xFF3b5998)), + if (person.websiteUrl != null) + _buildSocialIconButton( + FontAwesomeIcons.globe, person.websiteUrl, Color(0xFF0e76a8)), + ], + ), + ); + } - SizedBox( - height: 40, - ), - ], - ) + Widget _buildSocialIconButton(IconData icon, String url, Color color) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 10), + child: TextButton( + onPressed: () => launchUrlString(url), + child: FaIcon(icon, color: color), + ), + ); + } + + Widget _buildSectionTitle(String title) { + return Padding( + padding: const EdgeInsets.only(left: 30, top: 20), + child: Text( + title, + style: TextStyle( + color: Colors.grey[600], + fontSize: 18.0, + fontWeight: FontWeight.bold, + ), + ), + ); + } + + Widget _buildContactButtons() { + return Padding( + padding: const EdgeInsets.only(top: 15, left: 30, right: 20), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + if (person.email != null) + _buildContactButton(FontAwesomeIcons.envelope, + 'mailto:${person.email}', Colors.black), + if (person.phoneNumber != null) + _buildContactButton(FontAwesomeIcons.whatsapp, + 'tel:${person.phoneNumber}', Color(0xFF25D366)), ], ), ); } + + Widget _buildContactButton(IconData icon, String url, Color color) { + return Container( + height: 70, + width: 70, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(30), + color: Colors.grey[200], + ), + child: RawMaterialButton( + onPressed: () => launchUrlString(url), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30), + ), + child: FaIcon(icon, color: color, size: 30), + ), + ); + } } diff --git a/lib/core/presentation/widgets/full_screen_image.dart b/lib/core/presentation/widgets/full_screen_image.dart index b6c740c0..f326de6e 100644 --- a/lib/core/presentation/widgets/full_screen_image.dart +++ b/lib/core/presentation/widgets/full_screen_image.dart @@ -18,57 +18,64 @@ class FullScreenImage extends StatelessWidget { return Scaffold( backgroundColor: Colors.black12.withOpacity(0.8), appBar: AppBar( - systemOverlayStyle: SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: SizedBox.shrink(), - actions: [ - Container( - margin: EdgeInsets.only(right: 10, top: 5), - width: 40, - height: 40, - decoration: - BoxDecoration(borderRadius: BorderRadius.circular(40.0)), - child: RawMaterialButton( - onPressed: () { - Navigator.pop(context); - }, - child: new Icon( - Icons.close, - color: Palette.accentColor, - size: 30.0, - ), - shape: new CircleBorder(), - elevation: 2.0, - fillColor: Palette.themeShadeColor, - padding: const EdgeInsets.all(5.0), - ), - ) - ]), + systemOverlayStyle: SystemUiOverlayStyle.light, + backgroundColor: Colors.transparent, + elevation: 0.0, + leading: SizedBox.shrink(), + actions: [ + buildCloseButton(context), + ], + ), body: GestureDetector( - child: Hero( - tag: '', - child: Center( - child: CachedNetworkImage( - // height: 200, - width: MediaQuery.of(context).size.width, - imageUrl: url, - imageBuilder: (context, imageProvider) => Container( - decoration: BoxDecoration( - // shape: BoxShape.circle, - image: DecorationImage( - image: imageProvider, - // fit: BoxFit.cover, - ), - ), - ), - placeholder: (context, url) => CircularProgressIndicator(), - errorWidget: (context, url, error) => Icon(Icons.error), - ), // this is the main reason of transparency at next screen. I am ignoring rest implementation but what i have achieved is you can see. - )), - onTap: () { - // Navigator.pop(context); - }), + onTap: () { + Navigator.pop(context); + }, + child: buildHeroImage(context), + ), + ); + } + + Widget buildCloseButton(BuildContext context) { + return Container( + margin: EdgeInsets.only(right: 10, top: 5), + width: 40, + height: 40, + decoration: BoxDecoration(borderRadius: BorderRadius.circular(40.0)), + child: RawMaterialButton( + onPressed: () { + Navigator.pop(context); + }, + child: Icon( + Icons.close, + color: Palette.accentColor, + size: 30.0, + ), + shape: CircleBorder(), + elevation: 2.0, + fillColor: Palette.themeShadeColor, + padding: const EdgeInsets.all(5.0), + ), + ); + } + + Widget buildHeroImage(BuildContext context) { + return Hero( + tag: url, + child: Center( + child: CachedNetworkImage( + width: MediaQuery.of(context).size.width, + imageUrl: url, + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + image: DecorationImage( + image: imageProvider, + ), + ), + ), + placeholder: (context, url) => CircularProgressIndicator(), + errorWidget: (context, url, error) => Icon(Icons.error), + ), + ), ); } } diff --git a/lib/core/presentation/widgets/image_list_tile.dart b/lib/core/presentation/widgets/image_list_tile.dart deleted file mode 100644 index d3ad36a4..00000000 --- a/lib/core/presentation/widgets/image_list_tile.dart +++ /dev/null @@ -1,671 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; - -// 📦 Package imports: -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:flutter_svg/svg.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/domain/entities/exchange_student.dart'; -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/contact/presentation/models/organization.dart'; -import 'package:rotary_nl_rye/features/inbound/presentation/models/ClassOf.dart'; -import 'package:rotary_nl_rye/features/outbound/presentation/models/ClassOf.dart'; -import 'package:rotary_nl_rye/features/stories/models/country.dart'; -import 'package:rotary_nl_rye/features/stories/presentation/pages/exchange_students_List.dart'; -import '../../../features/uniform_widgets/uniform_circle_avatar.dart'; - -class SVGListTile extends StatelessWidget { - final descriptionPage; - final item; - - const SVGListTile({ - this.descriptionPage, - this.item, - Key? key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.symmetric(horizontal: 18, vertical: 8), - child: ListTile( - onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => descriptionPage), - ); - }, - contentPadding: EdgeInsets.all(0), - leading: ClipRRect( - child: Container( - height: 55, - width: 55, - child: SvgPicture.asset( - item.imageUrl, - height: 50, - width: 50, - fit: BoxFit.contain, - ), - ), - ), - title: Text(item.name, - style: TextStyle( - color: Palette.indigo, - )), - trailing: Icon( - Icons.keyboard_arrow_right, - size: 30, - color: Palette.indigo, - ), - ), - ); - } -} - -class CountryListTile extends StatelessWidget { - final ExchangeStudentsPage descriptionPage; - final Country country; - - const CountryListTile({ - required this.descriptionPage, - required this.country, - Key? key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.symmetric(horizontal: 18, vertical: 8), - child: ListTile( - onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => descriptionPage), - ); - }, - contentPadding: EdgeInsets.all(0), - leading: ClipRRect( - child: Container( - height: 55, - width: 55, - child: SvgPicture.asset( - country.imageUrl, - height: 50, - width: 50, - fit: BoxFit.contain, - ), - ), - ), - title: Text(country.name, - style: TextStyle( - color: Palette.indigo, - )), - trailing: Icon( - Icons.keyboard_arrow_right, - size: 30, - color: Palette.indigo, - ), - ), - ); - } -} - -class ImageListTile extends StatelessWidget { - final descriptionPage; - final item; - const ImageListTile({ - this.descriptionPage, - this.item, - Key? key, - }) : super(key: key); - @override - Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.symmetric(horizontal: 18, vertical: 8), - child: ListTile( - onTap: () { - print(item.name); - Navigator.push( - context, - MaterialPageRoute(builder: (context) => descriptionPage), - ); - }, - contentPadding: EdgeInsets.all(0), - leading: ClipRRect( - borderRadius: BorderRadius.all(Radius.circular(40)), - child: Container( - height: 55, - width: 55, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(40), - color: Palette - .imageBackgroundColor, //fill the image still needs to chagnge - ), - child: Image.asset( - item.imageUrl, - height: 50, - width: 50, - fit: BoxFit.contain, - ), - ), - ), - title: Text(item.name, - style: TextStyle( - color: Palette.indigo, - )), - subtitle: Text( - item.description, - style: TextStyle( - color: Palette.indigo, - ), - ), - trailing: Icon( - Icons.keyboard_arrow_right, - size: 30, - color: Palette.indigo, - ), - ), - ); - } -} - -class ContactListTile extends StatelessWidget { - final contactDetailsPage; - final Organization item; - - const ContactListTile({ - this.contactDetailsPage, - required this.item, - Key? key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.symmetric(horizontal: 18, vertical: 8), - child: ListTile( - onTap: () { - print(item.name); - Navigator.push( - context, - MaterialPageRoute(builder: (context) => contactDetailsPage), - ); - }, - contentPadding: EdgeInsets.all(0), - leading: UniformCircleAvatar( - imageUrl: item.imageUrl, - ), - title: Text(item.name, - style: TextStyle( - color: Palette.indigo, - fontWeight: FontWeight.w600, - )), - subtitle: Text( - item.functions[0], - style: TextStyle( - fontWeight: FontWeight.w500, - color: Palette.grey, - ), - ), - trailing: Icon( - Icons.keyboard_arrow_right, - size: 30, - color: Palette.indigo, - ), - ), - ); - } -} - -class RotexContactListTile extends StatelessWidget { - final rotexContactDetailsPage; - final item; - const RotexContactListTile({ - this.rotexContactDetailsPage, - this.item, - Key? key, - }) : super(key: key); - @override - Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.symmetric(horizontal: 18, vertical: 8), - child: ListTile( - onTap: () { - print(item.name); - Navigator.push( - context, - MaterialPageRoute(builder: (context) => rotexContactDetailsPage), - ); - }, - contentPadding: EdgeInsets.all(0), - leading: UniformCircleAvatar(imageUrl: item.imageUrl), - title: Text(item.name, - style: TextStyle( - color: Palette.indigo, - fontWeight: FontWeight.w600, - )), - subtitle: Text( - item.role, - style: TextStyle( - fontWeight: FontWeight.w500, - color: Palette.grey, - ), - ), - trailing: Icon( - Icons.keyboard_arrow_right, - size: 30, - color: Palette.indigo, - ), - ), - ); - } -} - -class OutboundStudentListTile extends StatelessWidget { - final classOfDetailsPage; - final Outbounds item; - const OutboundStudentListTile({ - this.classOfDetailsPage, - required this.item, - Key? key, - }) : super(key: key); - @override - Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.symmetric(horizontal: 18, vertical: 8), - child: ListTile( - onTap: () { - print(item.name); - Navigator.push( - context, - MaterialPageRoute(builder: (context) => classOfDetailsPage), - ); - }, - contentPadding: EdgeInsets.all(0), - leading: UniformCircleAvatar(imageUrl: item.imageUrl), - title: Text(item.name, - style: TextStyle( - color: Palette.indigo, - fontWeight: FontWeight.w600, - )), - subtitle: Row( - children: [ - Text(item.from, - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - fontWeight: FontWeight.w500, - inherit: true, - fontSize: 14.0, - color: Colors.grey[600], - )), - SizedBox( - width: 2, - ), - SvgPicture.asset('assets/icons/flags/${item.fromFlag}.svg', - height: 15), - SizedBox( - width: 5, - ), - FaIcon( - FontAwesomeIcons.arrowRightLong, - color: Colors.grey, - ), - SizedBox( - width: 5, - ), - Text(item.to, - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - fontWeight: FontWeight.w500, - inherit: true, - fontSize: 14.0, - color: Colors.grey[600], - )), - SizedBox( - width: 2, - ), - item.toFlag == null - ? SizedBox.shrink() - : SvgPicture.asset('assets/icons/flags/${item.toFlag}.svg', - height: 15) - ], - ), - // Text( - // item.from, - // style: TextStyle( - // fontWeight: FontWeight.w500, - // color: Palette.grey, - // ), - // ), - trailing: Icon( - Icons.keyboard_arrow_right, - size: 30, - color: Palette.indigo, - ), - ), - ); - } -} - -class InboundStudentListTile extends StatelessWidget { - final classOfDetailsPage; - final Inbounds item; - const InboundStudentListTile({ - this.classOfDetailsPage, - required this.item, - Key? key, - }) : super(key: key); - @override - Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.symmetric(horizontal: 18, vertical: 8), - child: ListTile( - onTap: () { - print(item.name); - Navigator.push( - context, - MaterialPageRoute(builder: (context) => classOfDetailsPage), - ); - }, - contentPadding: EdgeInsets.all(0), - leading: UniformCircleAvatar(imageUrl: item.imageUrl), - title: Text(item.name, - style: TextStyle( - color: Palette.indigo, - fontWeight: FontWeight.w600, - )), - subtitle: Row( - children: [ - Text(item.from, - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - fontWeight: FontWeight.w500, - inherit: true, - fontSize: 14.0, - color: Colors.grey[600], - )), - SizedBox( - width: 2, - ), - SvgPicture.asset('assets/icons/flags/${item.fromFlag}.svg', - height: 15), - SizedBox( - width: 5, - ), - FaIcon( - FontAwesomeIcons.arrowRightLong, - color: Colors.grey, - ), - SizedBox( - width: 5, - ), - Text(item.to, - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - fontWeight: FontWeight.w500, - inherit: true, - fontSize: 14.0, - color: Colors.grey[600], - )), - SizedBox( - width: 2, - ), - item.toFlag == null - ? SizedBox.shrink() - : SvgPicture.asset('assets/icons/flags/${item.toFlag}.svg', - height: 15) - ], - ), - // Text( - // item.from, - // style: TextStyle( - // fontWeight: FontWeight.w500, - // color: Palette.grey, - // ), - // ), - trailing: Icon( - Icons.keyboard_arrow_right, - size: 30, - color: Palette.indigo, - ), - ), - ); - } -} - -class InboundsStudentsListTile extends StatelessWidget { - final inboundsStudentsListPage; - final item; - - const InboundsStudentsListTile({ - this.inboundsStudentsListPage, - this.item, - Key? key, - }) : super(key: key); - @override - Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.symmetric(horizontal: 18, vertical: 8), - child: ListTile( - onTap: () { - print(item.name); - Navigator.push( - context, - MaterialPageRoute(builder: (context) => inboundsStudentsListPage), - ); - }, - contentPadding: EdgeInsets.all(0), - leading: CachedNetworkImage( - height: 55, - width: 55, - imageUrl: item.imageUrl, - imageBuilder: (context, imageProvider) => Container( - decoration: BoxDecoration( - shape: BoxShape.circle, - image: DecorationImage( - image: imageProvider, - fit: BoxFit.cover, - ), - ), - ), - placeholder: (context, url) => CircularProgressIndicator(), - errorWidget: (context, url, error) => Icon(Icons.error), - ), - title: Text(item.name, - style: TextStyle( - color: Palette.indigo, - fontWeight: FontWeight.w600, - )), - subtitle: Text( - 'From: ${item.place}', - style: TextStyle( - fontWeight: FontWeight.w500, - color: Palette.grey, - ), - ), - trailing: Icon( - Icons.keyboard_arrow_right, - size: 30, - color: Palette.indigo, - ), - ), - ); - } -} - -class ReboundsStudentsListTile extends StatelessWidget { - final reboundsStudentsListPage; - final ExchangeStudent item; - - const ReboundsStudentsListTile({ - this.reboundsStudentsListPage, - required this.item, - Key? key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.symmetric(horizontal: 18, vertical: 8), - child: ListTile( - onTap: () { - print(item.name); - Navigator.push( - context, - MaterialPageRoute(builder: (context) => reboundsStudentsListPage), - ); - }, - contentPadding: EdgeInsets.all(0), - leading: ClipRRect( - borderRadius: BorderRadius.all(Radius.circular(40)), - child: CachedNetworkImage( - height: 55, - width: 55, - imageUrl: item.imageUrl, - imageBuilder: (context, imageProvider) => Container( - decoration: BoxDecoration( - shape: BoxShape.circle, - image: DecorationImage( - image: imageProvider, - fit: BoxFit.cover, - ), - ), - ), - placeholder: (context, url) => CircularProgressIndicator(), - errorWidget: (context, url, error) => Icon(Icons.error), - ), - ), - title: Text(item.name, - style: TextStyle( - color: Palette.indigo, - fontWeight: FontWeight.w600, - )), - subtitle: Text( - item.description, - style: TextStyle( - fontWeight: FontWeight.w500, - color: Palette.grey, - ), - ), - trailing: Icon( - Icons.keyboard_arrow_right, - size: 30, - color: Palette.indigo, - ), - ), - ); - } -} - -class CounselorListTile extends StatelessWidget { - final counselorDetailsPage; - final item; - const CounselorListTile({ - this.counselorDetailsPage, - this.item, - Key? key, - }) : super(key: key); - @override - Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.symmetric(horizontal: 18, vertical: 8), - child: ListTile( - onTap: () { - print(item.name); - Navigator.push( - context, - MaterialPageRoute(builder: (context) => counselorDetailsPage), - ); - }, - contentPadding: EdgeInsets.all(0), - leading: CachedNetworkImage( - height: 55, - width: 55, - imageUrl: item.imageUrl, - imageBuilder: (context, imageProvider) => Container( - decoration: BoxDecoration( - shape: BoxShape.circle, - image: DecorationImage( - image: imageProvider, - fit: BoxFit.cover, - ), - ), - ), - placeholder: (context, url) => CircularProgressIndicator(), - errorWidget: (context, url, error) => Icon(Icons.error), - ), - title: Text(item.name, - style: TextStyle( - color: Palette.indigo, - fontWeight: FontWeight.w600, - )), - subtitle: Text( - item.functions, - style: TextStyle( - fontWeight: FontWeight.w500, - color: Palette.grey, - ), - ), - trailing: Icon( - Icons.keyboard_arrow_right, - size: 30, - color: Palette.indigo, - ), - ), - ); - } -} - -class ContributorsListTile extends StatelessWidget { - final contributorsDetailsPage; - final item; - const ContributorsListTile({ - this.contributorsDetailsPage, - this.item, - Key? key, - }) : super(key: key); - @override - Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.symmetric(horizontal: 18, vertical: 8), - child: ListTile( - onTap: () { - print(item.name); - Navigator.push( - context, - MaterialPageRoute(builder: (context) => contributorsDetailsPage), - ); - }, - contentPadding: EdgeInsets.all(0), - leading: UniformCircleAvatar(imageUrl: item.imageUrl), - title: Text(item.name, - style: TextStyle( - color: Palette.indigo, - fontWeight: FontWeight.w600, - )), - subtitle: Text( - item.description, - style: TextStyle( - fontWeight: FontWeight.w500, - color: Palette.grey, - ), - ), - trailing: Icon( - Icons.keyboard_arrow_right, - size: 30, - color: Palette.indigo, - ), - ), - ); - } -} diff --git a/lib/core/presentation/widgets/page_navigator.dart b/lib/core/presentation/widgets/page_navigator.dart index c79b8ecd..ccbe6412 100644 --- a/lib/core/presentation/widgets/page_navigator.dart +++ b/lib/core/presentation/widgets/page_navigator.dart @@ -4,7 +4,6 @@ import 'package:flutter/services.dart'; // 📦 Package imports: import 'package:flutter_app_badger/flutter_app_badger.dart'; -// import 'package:flutter_svg/flutter_svg.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; // 🌎 Project imports: @@ -16,7 +15,7 @@ import 'package:rotary_nl_rye/features/about/presentation/pages/about_page.dart' import 'package:rotary_nl_rye/features/contact/presentation/pages/contact_page.dart'; import 'package:rotary_nl_rye/features/emergency/presentation/pages/emergency_page.dart'; import 'package:rotary_nl_rye/features/home/presentation/pages/home_page.dart'; -import 'package:rotary_nl_rye/features/settings/presentation/pages/settings_page.dart'; +import 'package:rotary_nl_rye/features/settings/presentation/pages/SettingsPage.dart'; class PageNavigator extends StatefulWidget { @override @@ -25,174 +24,109 @@ class PageNavigator extends StatefulWidget { class _PageNavigatorState extends State { String _appBadgeSupported = 'Unknown'; - int _selectedindex = 0; + int _selectedIndex = 0; @override - initState() { - initDynamicLinks(context); - appBadgeSupportedState(); - //FCM start - getToken(); - getInitialMessages(context); + void initState() { + super.initState(); + _initializeApp(); + } + + Future _initializeApp() async { + await initDynamicLinks(context); + await _checkAppBadgeSupport(); + await _initializeFCM(); + _removeBadge(); + _checkVersion(); + } + + Future _initializeFCM() async { + await getToken(); + await getInitialMessages(context); onMessage(context); onMessageOpenedApp(context); - //FCm end - _removeBadge(); - super.initState(); - // versionCheck firebase remote config + } + + Future _checkVersion() async { try { - versionCheck(context); + await versionCheck(context); } catch (e) { print(e); } - -// render complex SVG - // Future.wait([ - // precachePicture( - // ExactAssetPicture( - // SvgPicture.svgStringDecoderBuilder, 'assets/icons/flags/ca.svg'), - // null, - // ), - // precachePicture( - // ExactAssetPicture( - // SvgPicture.svgStringDecoderBuilder, 'assets/icons/flags/mx.svg'), - // null, - // ), - // precachePicture( - // ExactAssetPicture( - // SvgPicture.svgStringDecoderBuilder, 'assets/icons/flags/pe.svg'), - // null, - // ), - // precachePicture( - // ExactAssetPicture( - // SvgPicture.svgStringDecoderBuilder, 'assets/icons/flags/ec.svg'), - // null, - // ), - // ]); - // end } -// app Badge Supported - appBadgeSupportedState() async { - String appBadgeSupported; + Future _checkAppBadgeSupport() async { try { - bool res = await FlutterAppBadger.isAppBadgeSupported(); - if (res) { - appBadgeSupported = 'Supported'; - } else { - appBadgeSupported = 'Not supported'; - } + bool isSupported = await FlutterAppBadger.isAppBadgeSupported(); + setState(() { + _appBadgeSupported = isSupported ? 'Supported' : 'Not supported'; + }); + print('Badge supported: $_appBadgeSupported\n'); } on PlatformException { - appBadgeSupported = 'Failed to get badge support.'; + setState(() { + _appBadgeSupported = 'Failed to get badge support.'; + }); } + } - // If the widget was removed from the tree while the asynchronous platform - // message was in flight, we want to discard the reply rather than calling - // setState to update our non-existent appearance. - if (!mounted) return; - - setState(() { - _appBadgeSupported = appBadgeSupported; - }); - - print('Badge supported: $_appBadgeSupported\n'); + void _removeBadge() { + FlutterAppBadger.removeBadge(); } -// end void _onItemTapped(int index) { setState(() { - _selectedindex = index; + _selectedIndex = index; }); - - // print(_selectedindex); } @override Widget build(BuildContext context) { - // TODO add it to theme data Device.width = MediaQuery.of(context).size.width; Device.height = MediaQuery.of(context).size.height; - Device.isDark = - MediaQuery.of(context).platformBrightness == Brightness.dark; - Palette.instance; + Palette.initialize( + MediaQuery.of(context).platformBrightness == Brightness.dark); return DefaultTabController( length: 5, child: Scaffold( - bottomNavigationBar: Container( - padding: EdgeInsets.only(top: 10, bottom: 20.0), - color: Palette.themeShadeColor, - child: TabBar( - tabs: [ - Tab( - icon: Icon( - FontAwesomeIcons.house, - size: 30, - color: (_selectedindex == 0) - ? Palette.indigo - : Palette.lightIndigo, - )), - Tab( - icon: Icon( - FontAwesomeIcons.userGroup, - size: 30, - color: (_selectedindex == 1) - ? Palette.indigo - : Palette.lightIndigo, - )), - Tab( - icon: Icon( - FontAwesomeIcons.triangleExclamation, - size: 30, - color: (_selectedindex == 2) ? Colors.red : Colors.red[200], - )), - Tab( - icon: Icon( - FontAwesomeIcons.addressBook, - size: 30, - color: (_selectedindex == 3) - ? Palette.indigo - : Palette.lightIndigo, - )), - Tab( - icon: Icon( - FontAwesomeIcons.gear, - size: 30, - color: (_selectedindex == 4) - ? Palette.indigo - : Palette.lightIndigo, - )), - ], - // unselectedLabelColor: - // (_selectedindex == 2) ? Palette.lightIndigo : Colors.red, - // labelColor: Palette.indigo, - indicatorColor: Colors.transparent, - onTap: _onItemTapped, - ), - ), + bottomNavigationBar: _buildBottomNavigationBar(), body: TabBarView( children: [ - // home HomePage(), - // About the organization page AboutPage(), - // Emergency EmergencyPage(), - // about us ContactPage(), - // settings SettingsPage(), ], ), ), ); } -} -void _removeBadge() { - FlutterAppBadger.removeBadge(); -} + Widget _buildBottomNavigationBar() { + return Container( + padding: const EdgeInsets.only(top: 10, bottom: 20), + color: Palette.themeShadeColor, + child: TabBar( + tabs: [ + _buildTabIcon(FontAwesomeIcons.house, 0), + _buildTabIcon(FontAwesomeIcons.userGroup, 1), + _buildTabIcon(FontAwesomeIcons.triangleExclamation, 2, + activeColor: Colors.red, inactiveColor: Colors.red[200]), + _buildTabIcon(FontAwesomeIcons.addressBook, 3), + _buildTabIcon(FontAwesomeIcons.gear, 4), + ], + indicatorColor: Colors.transparent, + onTap: _onItemTapped, + ), + ); + } -// void _addBadge() { -// FlutterAppBadger.updateBadgeCount(1); -// } + Widget _buildTabIcon(IconData icon, int index, + {Color? activeColor, Color? inactiveColor}) { + final Color color = _selectedIndex == index + ? (activeColor ?? Palette.indigo) + : (inactiveColor ?? Palette.lightIndigo); + return Tab(icon: Icon(icon, size: 30, color: color)); + } +} diff --git a/lib/core/presentation/widgets/settings_card_item.dart b/lib/core/presentation/widgets/settings_card_item.dart new file mode 100644 index 00000000..b5ca2a6a --- /dev/null +++ b/lib/core/presentation/widgets/settings_card_item.dart @@ -0,0 +1,48 @@ +// 🐦 Flutter imports: +import 'package:flutter/material.dart'; + +class SettingsCardItem extends StatelessWidget { + final String title; + final String subtitle; + final String cardTitle; + final String cardText; + final IconData icon; + + const SettingsCardItem({ + Key? key, + required this.title, + required this.icon, + required this.subtitle, + required this.cardTitle, + required this.cardText, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return ExpansionTile( + leading: Icon(icon), + title: Text(title), + subtitle: Text(subtitle), + children: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + cardTitle, + style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), + ), + SizedBox(height: 20), + Text( + cardText, + style: TextStyle(fontSize: 16), + textAlign: TextAlign.center, + ), + ], + ), + ), + ], + ); + } +} diff --git a/lib/core/prop.dart b/lib/core/prop.dart index 13ea9cd4..1ac6aa15 100644 --- a/lib/core/prop.dart +++ b/lib/core/prop.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; class Device { Device._(); + static final Device instance = Device._(); static double width = 0; @@ -10,9 +11,9 @@ class Device { static bool isDark = false; static String convert(int millisecondsSinceEpoch) { - String result = ''; - - List months = [ + final DateTime dateTime = + DateTime.fromMillisecondsSinceEpoch(millisecondsSinceEpoch); + const List months = [ 'January', 'February', 'March', @@ -20,112 +21,101 @@ class Device { 'May', 'June', 'July', + 'August', 'September', 'October', 'November', - 'December' + 'December', ]; - result += DateTime.fromMillisecondsSinceEpoch(millisecondsSinceEpoch) - .day - .toString(); - result += ' '; - result += months[ - DateTime.fromMillisecondsSinceEpoch(millisecondsSinceEpoch).month - 1]; - result += ' '; - result += DateTime.fromMillisecondsSinceEpoch(millisecondsSinceEpoch) - .year - .toString(); - - return result; + return '${dateTime.day} ${months[dateTime.month - 1]} ${dateTime.year}'; } } class Palette { Palette._(); - static final Palette _instance = Palette._(); - static Color indigo = 0 as Color; - static Color themeShadeColor = 0 as Color; - static Color themeContactTabShadeColor = 0 as Color; - static Color themeCardShadeColor = 0 as Color; - static Color accentColor = 0 as Color; - static Color grey = 0 as Color; - static Color lightIndigo = 0 as Color; - static Color imageBackgroundColor = 0 as Color; + static late Color indigo; + static late Color themeShadeColor; + static late Color themeContactTabShadeColor; + static late Color themeCardShadeColor; + static late Color accentColor; + static late Color grey; + static late Color lightIndigo; + static late Color imageBackgroundColor; + // text - static Color titleText = 0 as Color; - static Color bodyText = 0 as Color; + static late Color titleText; + static late Color bodyText; + // contact page - static Color selectedlabelColor = 0 as Color; - static Color unselectedLabelColor = 0 as Color; + static late Color selectedLabelColor; + static late Color unselectedLabelColor; + // FAQ page - static Color isExpandedNo = 0 as Color; - static Color isExpandedYes = 0 as Color; + static late Color isExpandedNo; + static late Color isExpandedYes; + // Settings Page - static Color emergencyRed = 0 as Color; - static Color socialBlue = 0 as Color; - // Calendar Page - static Color imageBlox = 0 as Color; - static Color imageShadowBox1 = 0 as Color; - static Color imageShadowBox2 = 0 as Color; - static Color descriptionText = 0 as Color; - static Color creatorText = 0 as Color; - static Color iconColor = 0 as Color; + static late Color emergencyRed; + static late Color socialBlue; - static Palette get instance { - _instance.set(); - return _instance; - } + // Calendar Page + static late Color imageBlox; + static late Color imageShadowBox1; + static late Color imageShadowBox2; + static late Color descriptionText; + static late Color creatorText; + static late Color iconColor; - set() { - accentColor = Color.fromRGBO(57, 182, 245, 1); - grey = Colors.grey[600]!; - lightIndigo = Colors.indigo[100]!; - imageBackgroundColor = Color.fromRGBO(70, 197, 212, 1); + static void initialize(bool isDarkMode) { + accentColor = const Color(0xFF39B6F5); + grey = Colors.grey.shade600; + lightIndigo = Colors.indigo.shade100; + imageBackgroundColor = const Color(0xFF46C5D4); - if (Device.isDark) { + if (isDarkMode) { // Dark - indigo = Colors.indigo[400]!; - themeShadeColor = Colors.grey[800]!; + indigo = Colors.indigo.shade400; + themeShadeColor = Colors.grey.shade800; themeContactTabShadeColor = Colors.grey[850]!; - themeCardShadeColor = Colors.grey[800]!; + themeCardShadeColor = Colors.grey.shade800; // text titleText = Colors.grey[350]!; - bodyText = Colors.grey[300]!; + bodyText = Colors.grey.shade300; // contact page - selectedlabelColor = Colors.indigo[400]!; - unselectedLabelColor = Colors.grey[500]!; + selectedLabelColor = Colors.indigo.shade400; + unselectedLabelColor = Colors.grey.shade500; // FAQ page - isExpandedNo = Colors.indigo[100]!; - isExpandedYes = Colors.indigoAccent[100]!; + isExpandedNo = Colors.indigo.shade100; + isExpandedYes = Colors.indigoAccent.shade100; // Settings Page - emergencyRed = Colors.red[600]!; + emergencyRed = Colors.red.shade600; socialBlue = Colors.blue; // Calendar Page - imageBlox = Colors.grey[700]!; + imageBlox = Colors.grey.shade700; imageShadowBox1 = Colors.grey[850]!; imageShadowBox2 = Colors.grey.shade700; - descriptionText = Colors.grey[300]!; - creatorText = Colors.grey[400]!; - iconColor = Colors.indigo[100]!; + descriptionText = Colors.grey.shade300; + creatorText = Colors.grey.shade400; + iconColor = Colors.indigo.shade100; } else { - // light - indigo = Colors.indigo[800]!; - themeShadeColor = Colors.grey[100]!; - themeContactTabShadeColor = Colors.grey[50]!; - themeCardShadeColor = Colors.grey[100]!; - //text + // Light + indigo = Colors.indigo.shade800; + themeShadeColor = Colors.grey.shade100; + themeContactTabShadeColor = Colors.grey.shade50; + themeCardShadeColor = Colors.grey.shade100; + // text titleText = Colors.black87; bodyText = Colors.black; - //contact page - selectedlabelColor = Color(0xff525c6e); - unselectedLabelColor = Color(0xffacb3bf); - //FAQ page - isExpandedNo = Colors.grey[700]!; - isExpandedYes = Colors.indigo[700]!; + // contact page + selectedLabelColor = const Color(0xFF525C6E); + unselectedLabelColor = const Color(0xFFACB3BF); + // FAQ page + isExpandedNo = Colors.grey.shade700; + isExpandedYes = Colors.indigo.shade700; // Settings Page - emergencyRed = Colors.red[900]!; + emergencyRed = Colors.red.shade900; socialBlue = Colors.blue; // Calendar Page imageBlox = Colors.white; @@ -133,22 +123,24 @@ class Palette { imageShadowBox2 = Colors.grey.shade400; descriptionText = Colors.black45; creatorText = Colors.black45; - iconColor = Colors.indigoAccent[100]!; + iconColor = Colors.indigoAccent.shade100; } } } -// 042a49 -Color kSecondaryBgColor = Colors.grey.shade100; -Color kSeperatorColor = Colors.grey.shade700; -double kBorderRadius = 10; -BoxShadow kBoxShadow = BoxShadow( - color: Colors.black.withOpacity(0.1), - offset: Offset(0, 7), - blurRadius: 30, - spreadRadius: 0); -BoxShadow kSubtleBoxShadow = BoxShadow( - color: Colors.black.withOpacity(0.08), - offset: Offset(0, 4), - blurRadius: 20, - spreadRadius: -2); +// Common constants for styling +const Color kSecondaryBgColor = Color(0xFFF5F5F5); +const Color kSeparatorColor = Color(0xFFBDBDBD); +const double kBorderRadius = 10.0; +const BoxShadow kBoxShadow = BoxShadow( + color: Color(0x1A000000), + offset: Offset(0, 7), + blurRadius: 30, + spreadRadius: 0, +); +const BoxShadow kSubtleBoxShadow = BoxShadow( + color: Color(0x14000000), + offset: Offset(0, 4), + blurRadius: 20, + spreadRadius: -2, +); diff --git a/lib/features/about/presentation/pages/about_page.dart b/lib/features/about/presentation/pages/about_page.dart index abc78c18..a2419ae7 100644 --- a/lib/features/about/presentation/pages/about_page.dart +++ b/lib/features/about/presentation/pages/about_page.dart @@ -11,6 +11,42 @@ class AboutPage extends StatefulWidget { } class _AboutPageState extends State { + final List> aboutSections = [ + { + 'title': 'Nederland MDJC : Multi district Jeugd Commissie', + 'content': + 'Internationale jeugduitwisselingen met Rotary worden al 55 jaar met succes georganiseerd. Jeugduitwisselingen zit in het DNA van Rotary. De jeugd heeft de toekomst, niet alleen voor de Rotary, maar ook voor de wereld. In 2010 is Jeugdzaken met jeugduitwisseling de vijfde Avenue binnen Rotary geworden. Jaarlijks zijn er 7000 Exchanges wereldwijd.', + 'isSubTitle': false, + }, + { + 'title': 'DOEL UITWISSELING', + 'content': 'Connecting your minds, share future beliefs', + 'isSubTitle': true, + 'subContent': [ + { + 'prefix': '‣ Missie: ', + 'body': 'wij stellen jeugd in staat om ', + 'highlight': 'persoonlijk leiderschap ', + 'suffix': 'te ontwikkelen.' + }, + { + 'prefix': '‣ Visie: ', + 'body': 'wij geloven dat leiderschap begint met ', + 'highlight': 'leiding geven aan jezelf ', + 'suffix': + 'om uiteindelijk anderen in staat te stellen zichzelf te ontwikkelen.' + }, + { + 'prefix': '‣ Strategie: ', + 'body': + 'wij doen dit door jonge mensen uit te dagen en te ondersteunen om zich ', + 'highlight': 'buiten hun comfortzone ', + 'suffix': 'te manifesteren.' + }, + ] + }, + ]; + @override Widget build(BuildContext context) { return Scaffold( @@ -30,181 +66,116 @@ class _AboutPageState extends State { ), body: ListView( shrinkWrap: true, - scrollDirection: Axis.vertical, children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(left: 16.0, right: 16.0), - // child: Container( - // child: ClipRRect( - // child: Image.asset( - // "assets/image/rotary_opens_opportunities_logo.png", - // ), - // )), - // ), - Padding( - padding: const EdgeInsets.only(left: 16.0, right: 16.0), - child: SizedBox( - child: Text('Nederland MDJC : Multi district Jeugd Commissie', - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - inherit: true, - fontSize: 20.0, - color: Palette.titleText, - fontWeight: FontWeight.bold, - )), - ), - ), - Padding( - padding: - const EdgeInsets.only(left: 16.5, right: 16.0, top: 20.0), - child: Text( - 'Internationale jeugduitwisselingen met Rotary worden al 55 jaar met succes georganiseerd. Jeugduitwisselingen zit in het DNA van Rotary. De jeugd heeft de toekomst, niet alleen voor de Rotary, maar ook voor de wereld. In 2010 is Jeugdzaken met jeugduitwisseling de vijfde Avenue binnen Rotary geworden. Jaarlijks zijn er 7000 Exchanges wereldwijd.', - style: TextStyle(color: Palette.bodyText, fontSize: 16.0), - ), - ), - Padding( - padding: - const EdgeInsets.only(left: 16.0, right: 16.0, top: 30.0), - child: Text( - 'DOEL UITWISSELING', - style: TextStyle( - color: Colors.blue[700], - fontSize: 16.0, - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: - const EdgeInsets.only(left: 16.0, right: 16.0, top: 5.0), - child: Text( - 'Connecting your minds, share future beliefs', - style: TextStyle( - color: Colors.yellow[700], - fontSize: 15.0, - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: - const EdgeInsets.only(left: 16.0, right: 16.0, top: 5.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 15), - children: [ - TextSpan( - text: '‣ Missie: ', - style: TextStyle( - color: Palette.titleText, - fontWeight: FontWeight.bold), - ), - TextSpan( - text: 'wij stellen jeugd in staat om ', - ), - TextSpan( - text: 'persoonlijk leiderschap ', - style: TextStyle(color: Colors.blue), - ), - TextSpan( - text: 'te ontwikkelen.', - ), - ]), - ), - ), - - Padding( - padding: - const EdgeInsets.only(left: 16.0, right: 16.0, top: 5.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 15), - children: [ - TextSpan( - text: '‣ Visie: ', - style: TextStyle( - color: Palette.titleText, - fontWeight: FontWeight.bold), - ), - TextSpan( - text: 'wij geloven dat leiderschap begint met ', - ), - TextSpan( - text: 'leiding geven aan jezelf ', - style: TextStyle(color: Colors.blue), - ), - TextSpan( - text: - 'om uiteindelijk anderen in staat te stellen zichzelf te ontwikkelen.', - ), - ]), - ), + children: aboutSections.map((section) { + return section['isSubTitle'] + ? _buildSubSection(section) + : _buildSection(section); + }).toList(), + ), + SizedBox(height: 30.0), + Center( + child: Image.asset( + 'assets/image/rotary_blue.png', + height: 55.0, + ), + ), + Center( + child: Padding( + padding: const EdgeInsets.only(top: 15.0), + child: Text( + 'Update: 10 Aug 2021', + style: TextStyle(color: Color(0xFF777777)), ), + ), + ), + SizedBox(height: 60), + ], + ), + ); + } - Padding( - padding: - const EdgeInsets.only(left: 16.0, right: 16.0, top: 5.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 15), - children: [ - TextSpan( - text: '‣ Strategie: ', - style: TextStyle( - color: Palette.titleText, - fontWeight: FontWeight.bold), - ), - TextSpan( - text: - 'wij doen dit door jonge mensen uit te dagen en te ondersteunen om zich ', - ), - TextSpan( - text: 'buiten hun comfortzone ', - style: TextStyle(color: Colors.blue), - ), - TextSpan( - text: 'te manifesteren.', - ), - ]), - ), - ), + Widget _buildSection(Map section) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 10.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + section['title'], + maxLines: 2, + overflow: TextOverflow.ellipsis, + softWrap: false, + style: TextStyle( + fontSize: 20.0, + color: Palette.titleText, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: 10.0), + Text( + section['content'], + style: TextStyle(color: Palette.bodyText, fontSize: 16.0), + ), + ], + ), + ); + } - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 10 Aug 2021', - style: TextStyle(color: Color(0xFF777777)), - ), + Widget _buildSubSection(Map section) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 10.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + section['title'], + style: TextStyle( + color: Colors.blue[700], + fontSize: 16.0, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: 5.0), + Text( + section['content'], + style: TextStyle( + color: Colors.yellow[700], + fontSize: 15.0, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: 5.0), + ...section['subContent'].map((sub) { + return Padding( + padding: const EdgeInsets.only(top: 5.0), + child: RichText( + text: TextSpan( + style: Theme.of(context) + .textTheme + .bodyMedium! + .copyWith(fontSize: 15), + children: [ + TextSpan( + text: sub['prefix'], + style: TextStyle( + color: Palette.titleText, + fontWeight: FontWeight.bold, + ), + ), + TextSpan(text: sub['body']), + TextSpan( + text: sub['highlight'], + style: TextStyle(color: Colors.blue), + ), + TextSpan(text: sub['suffix']), + ], ), ), - SizedBox( - height: 60, - ), - ], - ) + ); + }).toList(), ], ), ); diff --git a/lib/features/calendar/data/utils.dart b/lib/features/calendar/data/EventUtils.dart similarity index 67% rename from lib/features/calendar/data/utils.dart rename to lib/features/calendar/data/EventUtils.dart index d480e1b7..755660d4 100644 --- a/lib/features/calendar/data/utils.dart +++ b/lib/features/calendar/data/EventUtils.dart @@ -1,19 +1,19 @@ +// event_utils.dart + // 🎯 Dart imports: import 'dart:collection'; import 'dart:convert'; // 📦 Package imports: import 'package:http/http.dart' as http; +import 'package:rotary_nl_rye/features/calendar/models/EventModel.dart'; import 'package:table_calendar/table_calendar.dart'; -// 🌎 Project imports: -import 'package:rotary_nl_rye/features/calendar/models/event_result.dart'; - late Map data; -//late String _title; late List events; late LinkedHashMap> eventsData; var eventsHashMap = LinkedHashMap>(); + Future>> getData() async { http.Response? response; try { @@ -26,29 +26,37 @@ Future>> getData() async { ); } catch (e) { print(e); - throw 'unable to parse calendar api'; + throw 'Unable to parse calendar API'; } data = json.decode(response.body); events = EventResult.fromJson(data).events; - //This is n^2 in time. Find a better implementation? + eventsHashMap.clear(); - events.forEach((event) { - // eventsHashMap[event.start.dateTime] = [event]; - //if a day has more than one event the above implementation will replace the existing event - if (!eventsHashMap.containsKey(event.start.dateTime)) { - eventsHashMap[event.start.dateTime] = - []; //this line is to avoid null error and initialize the list - eventsHashMap[event.start.dateTime]!.add(event); - } else { - eventsHashMap[event.start.dateTime]!.add(event); + for (var event in events) { + DateTime eventStart = event.start.dateTime; + DateTime eventEnd = event.end.dateTime; + + if (eventStart.isBefore(eventEnd)) { + eventEnd = + eventEnd.subtract(Duration(days: 1)); // Ensure end date is exclusive } - }); + + for (DateTime date = eventStart; + date.isBefore(eventEnd) || isSameDay(date, eventEnd); + date = date.add(Duration(days: 1))) { + if (!eventsHashMap.containsKey(date)) { + eventsHashMap[date] = []; + } + eventsHashMap[date]!.add(event); + } + } final kEvents = LinkedHashMap>( equals: isSameDay, hashCode: getHashCode, )..addAll(eventsHashMap); + return kEvents; } @@ -67,5 +75,4 @@ List daysInRange(DateTime first, DateTime last) { final kNow = DateTime.now(); final kFirstDay = DateTime(kNow.year, kNow.month - 24, kNow.day); -// final kFirstDay = DateTime(kNow.year, kNow.month - 80, kNow.day); final kLastDay = DateTime(kNow.year, kNow.month + 24, kNow.day); diff --git a/lib/features/calendar/models/event_result.dart b/lib/features/calendar/models/EventModel.dart similarity index 86% rename from lib/features/calendar/models/event_result.dart rename to lib/features/calendar/models/EventModel.dart index ba69b78b..91a4fa8b 100644 --- a/lib/features/calendar/models/event_result.dart +++ b/lib/features/calendar/models/EventModel.dart @@ -1,6 +1,4 @@ -// To parse this JSON data, do -// -// final eventResult = eventResultFromJson(jsonString); +// event_model.dart // 🎯 Dart imports: import 'dart:convert'; @@ -20,7 +18,7 @@ class EventResult { EventResult.fromJson(Map json) { if (json['items'] != null) { json['items'].forEach((v) { - events.add(new Events.fromJson(v)); + events.add(Events.fromJson(v)); }); } } @@ -30,7 +28,6 @@ class EventResult { }; } -// String title, description, location, creator, organizer, startDate, endDate; class Events { Events({ required this.id, @@ -113,11 +110,15 @@ class End { }); DateTime dateTime; + factory End.fromJson(Map json) { - return End(dateTime: DateTime.parse(json['dateTime'] ?? json['date'])); + if (json.containsKey('dateTime')) { + return End(dateTime: DateTime.parse(json['dateTime'])); + } else if (json.containsKey('date')) { + // Handle date only fields as whole-day events + return End(dateTime: DateTime.parse(json['date'])); + } else { + throw Exception('Invalid date format'); + } } - - // Map toJson() => { - // "dateTime": dateTime.toIso8601String(), - // }; } diff --git a/lib/features/calendar/presentation/pages/events_page.dart b/lib/features/calendar/presentation/pages/events_page.dart index 42580e8f..18d99621 100644 --- a/lib/features/calendar/presentation/pages/events_page.dart +++ b/lib/features/calendar/presentation/pages/events_page.dart @@ -1,3 +1,5 @@ +// calendar_page.dart + // 🎯 Dart imports: import 'dart:collection'; import 'dart:io'; @@ -11,15 +13,16 @@ import 'package:flutter/services.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:intl/intl.dart'; -import 'package:maps_launcher/maps_launcher.dart'; +import 'package:map_launcher/map_launcher.dart'; +import 'package:geocoding/geocoding.dart'; +import 'package:rotary_nl_rye/features/calendar/data/EventUtils.dart'; +import 'package:rotary_nl_rye/features/calendar/models/EventModel.dart'; import 'package:table_calendar/table_calendar.dart'; import 'package:url_launcher/url_launcher_string.dart'; // 🌎 Project imports: import 'package:rotary_nl_rye/core/prop.dart'; import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; -import '../../data/utils.dart'; -import '../../models/event_result.dart'; class CalendarPage extends StatefulWidget { @override @@ -30,26 +33,19 @@ class _CalendarPageState extends State { late final ValueNotifier> _selectedEvents; final String localLanguage = Platform.localeName; CalendarFormat _calendarFormat = CalendarFormat.month; - RangeSelectionMode _rangeSelectionMode = RangeSelectionMode - .toggledOff; // Can be toggled on/off by longpressing a date + RangeSelectionMode _rangeSelectionMode = RangeSelectionMode.toggledOff; DateTime _focusedDay = DateTime.now(); DateTime? _selectedDay; DateTime? _rangeStart; DateTime? _rangeEnd; late Future>> getEvents; + @override void initState() { super.initState(); _selectedDay = _focusedDay; _selectedEvents = ValueNotifier(_getEventsForDay(_selectedDay!)); getEvents = getData(); -/* Testing - final String defaultLocale = Platform.localeName; - final clockString = DateFormat.yMMMMd(defaultLocale) - .format(DateTime.parse('2019-06-22T19:30:00+02:00')); - print(clockString); // 07:18 AM - print(defaultLocale); -*/ } @override @@ -62,17 +58,12 @@ class _CalendarPageState extends State { LinkedHashMap>(); List _getEventsForDay(DateTime day) { - // Implementation example return kEvents[day] ?? []; } List _getEventsForRange(DateTime start, DateTime end) { - // Implementation example final days = daysInRange(start, end); - - return [ - for (final d in days) ..._getEventsForDay(d), - ]; + return [for (final d in days) ..._getEventsForDay(d)]; } void _onDaySelected(DateTime selectedDay, DateTime focusedDay) { @@ -80,7 +71,7 @@ class _CalendarPageState extends State { setState(() { _selectedDay = selectedDay; _focusedDay = focusedDay; - _rangeStart = null; // Important to clean those + _rangeStart = null; _rangeEnd = null; _rangeSelectionMode = RangeSelectionMode.toggledOff; }); @@ -98,7 +89,6 @@ class _CalendarPageState extends State { _rangeSelectionMode = RangeSelectionMode.toggledOn; }); - // `start` or `end` could be null if (start != null && end != null) { _selectedEvents.value = _getEventsForRange(start, end); } else if (start != null) { @@ -110,381 +100,266 @@ class _CalendarPageState extends State { @override Widget build(BuildContext context) { - print('Initial kEvents is empty becuase its null.'); - print(kEvents.length); return Scaffold( - appBar: AppBar( - systemOverlayStyle: SystemUiOverlayStyle( - statusBarBrightness: MediaQuery.of(context).platformBrightness, + appBar: AppBar( + systemOverlayStyle: SystemUiOverlayStyle( + statusBarBrightness: MediaQuery.of(context).platformBrightness, + ), + backgroundColor: Colors.transparent, + elevation: 0.0, + leading: UniformBackButton(), + title: Text( + 'Calendar', + textScaler: TextScaler.linear(1.4), + style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), + ), + ), + body: FutureBuilder( + future: getEvents, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return Center(child: CircularProgressIndicator()); + } + if (snapshot.hasError) { + return Center(child: Text('Error fetching events')); + } + kEvents = snapshot.data as LinkedHashMap>; + return buildCalendarView(context); + }, + ), + ); + } + + Widget buildCalendarView(BuildContext context) { + return Column( + children: [ + TableCalendar( + firstDay: kFirstDay, + lastDay: kLastDay, + focusedDay: _focusedDay, + locale: localLanguage, + selectedDayPredicate: (day) => isSameDay(_selectedDay, day), + rangeStartDay: _rangeStart, + rangeEndDay: _rangeEnd, + calendarFormat: _calendarFormat, + rangeSelectionMode: _rangeSelectionMode, + eventLoader: _getEventsForDay, + startingDayOfWeek: StartingDayOfWeek.monday, + calendarStyle: CalendarStyle( + outsideTextStyle: const TextStyle(color: Colors.red), + outsideDaysVisible: false, + markerDecoration: const BoxDecoration( + color: Colors.red, + shape: BoxShape.circle, + ), ), - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Calendar', - textScaler: TextScaler.linear(1.4), - style: - TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), + availableCalendarFormats: const { + CalendarFormat.month: 'Month', + CalendarFormat.twoWeeks: '2 weeks', + CalendarFormat.week: 'Week', + }, + onDaySelected: _onDaySelected, + onRangeSelected: _onRangeSelected, + onFormatChanged: (format) { + if (_calendarFormat != format) { + setState(() { + _calendarFormat = format; + }); + } + }, + onPageChanged: (focusedDay) { + _focusedDay = focusedDay; + }, + calendarBuilders: CalendarBuilders( + dowBuilder: (context, day) { + final text = DateFormat.E(localLanguage).format(day); + return Center( + child: Text( + text, + style: TextStyle( + color: day.weekday == DateTime.saturday || + day.weekday == DateTime.sunday + ? Colors.red + : Colors.blue, + ), + ), + ); + }, ), ), - body: FutureBuilder( - future: getEvents, - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return Center(child: CircularProgressIndicator()); - } - kEvents = snapshot.data as LinkedHashMap>; - print('Got data for kEvents'); - print(kEvents.length); - print(localLanguage); - return Column( - children: [ - TableCalendar( - firstDay: kFirstDay, - lastDay: kLastDay, - focusedDay: _focusedDay, - locale: localLanguage, - selectedDayPredicate: (day) => isSameDay(_selectedDay, day), - rangeStartDay: _rangeStart, - rangeEndDay: _rangeEnd, - calendarFormat: _calendarFormat, - rangeSelectionMode: _rangeSelectionMode, - eventLoader: _getEventsForDay, - startingDayOfWeek: StartingDayOfWeek.monday, - calendarStyle: CalendarStyle( - // Use `CalendarStyle` to customize the UI - outsideTextStyle: const TextStyle(color: Colors.red), - // defaultTextStyle: const TextStyle(color: Colors.black54), - outsideDaysVisible: false, - - //TODO change colour dark mode - markerDecoration: const BoxDecoration( - color: Colors.red, shape: BoxShape.circle), - ), - - //TODO add this to the lang files - availableCalendarFormats: const { - CalendarFormat.month: 'Month', - CalendarFormat.twoWeeks: '2 weeks', - CalendarFormat.week: 'Week' - }, - onDaySelected: _onDaySelected, - onRangeSelected: _onRangeSelected, - onFormatChanged: (format) { - if (_calendarFormat != format) { - setState(() { - _calendarFormat = format; - }); - } - }, - onPageChanged: (focusedDay) { - _focusedDay = focusedDay; - }, - calendarBuilders: CalendarBuilders( - //TODO still needs to be added to the Color Pallete - dowBuilder: (context, day) { - if (day.weekday == DateTime.saturday) { - final text = DateFormat.E(localLanguage).format(day); + const SizedBox(height: 8.0), + Expanded( + child: ValueListenableBuilder>( + valueListenable: _selectedEvents, + builder: (context, value, _) { + return ListView.builder( + itemCount: value.isEmpty ? 1 : value.length, + itemBuilder: (context, index) { + if (value.isNotEmpty) { + return buildEventTile(context, value[index]); + } else { + return const Center(child: Text('No events found')); + } + }, + ); + }, + ), + ), + ], + ); + } - return Center( - child: Text( - text, - style: TextStyle(color: Colors.red), - ), - ); - } - if (day.weekday == DateTime.sunday) { - final text = DateFormat.E(localLanguage).format(day); + Widget buildEventTile(BuildContext context, Events event) { + final String defaultLocale = Platform.localeName; + return Container( + padding: EdgeInsets.all(8.0), + child: ListTile( + leading: Padding( + padding: const EdgeInsets.symmetric(horizontal: 4.0), + child: Container( + decoration: BoxDecoration( + color: Palette.imageBlox, + borderRadius: BorderRadius.circular(8.0), + boxShadow: [ + BoxShadow( + color: Palette.imageShadowBox2, + spreadRadius: 0.1, + blurRadius: 25.0, + offset: Offset(0.0, 1.0), + ), + BoxShadow( + color: Palette.imageShadowBox1, + spreadRadius: 0.1, + blurRadius: 25.0, + offset: Offset(0.0, 1.0), + ), + ], + ), + child: CachedNetworkImage( + height: 50, + width: 50, + imageUrl: + 'https://www.rotary.org/sites/all/themes/rotary_rotaryorg/images/favicons/favicon-194x194.png', + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + image: + DecorationImage(image: imageProvider, fit: BoxFit.cover), + ), + ), + placeholder: (context, url) => + Center(child: CircularProgressIndicator()), + errorWidget: (context, url, error) => Icon(Icons.error), + ), + ), + ), + title: buildEventTitle(event, defaultLocale), + subtitle: buildEventDescription(event), + onTap: () { + showDialog( + context: context, + builder: (context) => + EventDetailsDialog(event: event, defaultLocale: defaultLocale), + ); + }, + ), + ); + } - return Center( - child: Text( - text, - style: TextStyle(color: Colors.red), - ), - ); - } else { - final text = DateFormat.E(localLanguage).format(day); - return Center( - child: Text( - text, - style: TextStyle(color: Colors.blue), - ), - ); - } - }, - ), - ), - const SizedBox(height: 8.0), - Expanded( - child: ValueListenableBuilder>( - valueListenable: _selectedEvents, - builder: (context, value, _) { - return ListView.builder( - itemCount: value.isEmpty ? 1 : value.length, - itemBuilder: (context, index) { - final String defaultLocale = Platform.localeName; - if (value.isNotEmpty) { - return Container( - padding: EdgeInsets.all(8.0), - child: ListTile( - leading: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 4.0), - child: Container( - decoration: BoxDecoration( - color: Palette.imageBlox, - borderRadius: - BorderRadius.circular(8.0), - boxShadow: [ - BoxShadow( - color: - Palette.imageShadowBox2, - spreadRadius: 0.1, - blurRadius: 25.0, - offset: Offset(0.0, 1.0)), - BoxShadow( - color: - Palette.imageShadowBox1, - spreadRadius: 0.1, - blurRadius: 25.0, - offset: Offset(0.0, 1.0)) - ]), - child: CachedNetworkImage( - height: 50, - width: 50, - imageUrl: - 'https://www.rotary.org/sites/all/themes/rotary_rotaryorg/images/favicons/favicon-194x194.png', - imageBuilder: - (context, imageProvider) => - Container( - decoration: BoxDecoration( - borderRadius: - BorderRadius.circular(8), - image: DecorationImage( - image: imageProvider, - fit: BoxFit.cover), - ), - ), - placeholder: (context, url) => Center( - child: - CircularProgressIndicator()), - errorWidget: - (context, url, error) => - Icon(Icons.error), - )), - ), - title: Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - SizedBox( - width: Device.width - 260, - child: Text('${value[index].summary}', - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - inherit: true, - fontSize: 16.0, - fontWeight: FontWeight.w700)), - ), - Text( - '${DateFormat.yMMMMd(defaultLocale).format(value[index].start.dateTime)}', - style: TextStyle( - inherit: true, - fontSize: 14.0, - color: - Palette.descriptionText)), - ], - ), - subtitle: Padding( - padding: const EdgeInsets.only(top: 8.0), - child: Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - SizedBox( - width: Device.width - 150, - child: Text( - value[index].description ?? - 'there is no description', - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - inherit: true, - fontSize: 14.0, - color: Palette - .descriptionText)), - ), - ], - ), - ), + Widget buildEventTitle(Events event, String defaultLocale) { + bool isMultiDayEvent = !isSameDay(event.start.dateTime, event.end.dateTime); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + event.summary ?? 'No Title', + maxLines: 2, + overflow: TextOverflow.ellipsis, + softWrap: true, + style: TextStyle( + inherit: true, + fontSize: 16.0, + fontWeight: FontWeight.w700, + ), + ), + SizedBox(height: 4.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Text( + isMultiDayEvent + ? '${DateFormat.yMMMMd(defaultLocale).format(event.start.dateTime)} - ${DateFormat.yMMMMd(defaultLocale).format(event.end.dateTime)}' + : DateFormat.yMMMMd(defaultLocale) + .format(event.start.dateTime), + style: TextStyle( + inherit: true, + fontSize: 14.0, + color: Palette.descriptionText, + ), + ), + ), + ], + ), + ], + ); + } - //onTap: () => print('\nTitle: ${value[index].title} \ndescription: ${value[index].description}'), - onTap: () { - showDialog( - context: context, - builder: (context) => DialogPage1( - title: value[index].summary, - description: - value[index].description, - location: value[index].location, - startDate: value[index] - .start - .dateTime - .toIso8601String(), - endDate: value[index] - .end - .dateTime - .toIso8601String(), - defaultLocale: defaultLocale, - )); - }, - ), - ); - } else { - return const Center( - child: Text( - 'No events found')); //TODO add to lang file - } - }); - }, - ), - ), - ], - ); - })); + Widget buildEventDescription(Events event) { + return Padding( + padding: const EdgeInsets.only(top: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Text( + event.description ?? 'No description', + maxLines: 2, + overflow: TextOverflow.ellipsis, + softWrap: true, + style: TextStyle( + inherit: true, + fontSize: 14.0, + color: Palette.descriptionText, + ), + ), + ), + ], + ), + ); } } -class DialogPage1 extends StatelessWidget { - final String startDate, endDate, defaultLocale; - final String? description, title, location; - DialogPage1({ - this.description, - this.title, - required this.startDate, - required this.endDate, - this.location, +class EventDetailsDialog extends StatelessWidget { + final Events event; + final String defaultLocale; + + EventDetailsDialog({ + required this.event, required this.defaultLocale, }); @override Widget build(BuildContext context) { - final startFullDate = DateFormat.yMMMMd(defaultLocale) - .format(DateTime.parse(startDate).toLocal()); - // final endFullDate = DateFormat.yMMMMd(defaultLocale) - // .format(DateTime.parse(endDate).toLocal()); - final startWeekDay = DateFormat.EEEE(defaultLocale) - .format(DateTime.parse(startDate).toLocal()); - // final endWeekDay = DateFormat.EEEE(defaultLocale) - // .format(DateTime.parse(endDate).toLocal()); - final startTime = DateFormat.jm(defaultLocale) - .format(DateTime.parse(startDate).toLocal()); + final startFullDate = + DateFormat.yMMMMd(defaultLocale).format(event.start.dateTime.toLocal()); + final startWeekDay = + DateFormat.EEEE(defaultLocale).format(event.start.dateTime.toLocal()); + final startTime = + DateFormat.jm(defaultLocale).format(event.start.dateTime.toLocal()); final endTime = - DateFormat.jm(defaultLocale).format(DateTime.parse(endDate).toLocal()); + DateFormat.jm(defaultLocale).format(event.end.dateTime.toLocal()); - RegExp exp = - new RegExp(r'(?:(?:https?|ftp):\/\/)?[\w/\-?=%.]+\.[\w/\-?=%.]+'); - Iterable matches = exp.allMatches(description ?? ''); + RegExp exp = RegExp(r'(?:(?:https?|ftp):\/\/)?[\w/\-?=%.]+\.[\w/\-?=%.]+'); + Iterable matches = exp.allMatches(event.description ?? ''); return Platform.isIOS - ? new CupertinoAlertDialog( - title: Text(title ?? 'there is no Title'), - content: new Column( - // mainAxisSize: MainAxisSize.min, - // crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - startTime == endTime - // just add everything as a single - // ? "$startWeekDay, $startFullDate - \n$endWeekDay, $endFullDate" - ? '$startWeekDay, $startFullDate' - : '$startWeekDay, $startFullDate \n$startTime - $endTime', - style: TextStyle(color: Palette.bodyText, fontSize: 14.0), - ), - - // _detectMultipleDays(), - - //TODO fix padding location link - Padding( - padding: const EdgeInsets.only(top: 16.0), - child: AbsorbPointer( - absorbing: (location == null), - child: TextButton( - onPressed: () { - if (location != null) { - MapsLauncher.launchQuery(location!); - } - }, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Padding( - padding: const EdgeInsets.only(bottom: 0.0), - child: FaIcon( - FontAwesomeIcons.locationDot, - color: Palette.iconColor, - size: 20, - ), - ), - Expanded( - child: Padding( - padding: EdgeInsets.only(left: 12.0), - child: Text( - location ?? 'there is no location', - style: TextStyle(fontSize: 14.0), - ), - ), - ), - ], - ), - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Row( - children: [ - Padding( - padding: const EdgeInsets.only(left: 5.0), - child: FaIcon( - FontAwesomeIcons.alignLeft, - color: Palette.iconColor, - size: 20, - ), - ), - Expanded( - child: Text( - description ?? 'there is no description', - style: TextStyle(fontSize: 14.0), - ), - ), - ], - ), - ), - // ignore: unrelated_type_equality_checks - // (matches == ("Instance of '_RegExpMatch'")) - //? - exp.hasMatch(description ?? '') == true - ? CupertinoButton.filled( - minSize: 5, - child: Text('Link'), - onPressed: () { - matches.forEach((match) { - String sendLink = - description!.substring(match.start, match.end); - launchUrlString( - sendLink, - ); - }); - }) - : SizedBox.shrink(), - ], - ), + ? CupertinoAlertDialog( + title: Text(event.summary ?? 'No Title'), + content: buildDialogContent(context, startWeekDay, startFullDate, + startTime, endTime, exp, matches), actions: [ - new CupertinoDialogAction( + CupertinoDialogAction( onPressed: () { Navigator.of(context).pop(); }, @@ -492,112 +367,12 @@ class DialogPage1 extends StatelessWidget { ), ], ) - : new AlertDialog( - title: Text(title ?? 'there is no Title'), - content: new Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - startTime == endTime - // just add everything as a single - // ? "$startWeekDay, $startFullDate - $endWeekDay, $endFullDate" - ? '$startWeekDay, $startFullDate' - : '$startWeekDay, $startFullDate | $startTime - $endTime', - style: TextStyle(color: Palette.bodyText, fontSize: 12.0), - ), - // _detectMultipleDays(), - Padding( - padding: const EdgeInsets.only(top: 16.0), - child: AbsorbPointer( - absorbing: (location == null), - child: TextButton( - onPressed: () { - if (location != null) { - MapsLauncher.launchQuery(location!); - } - }, - child: Row( - children: [ - Padding( - padding: const EdgeInsets.only(bottom: 0.0), - child: FaIcon( - FontAwesomeIcons.locationDot, - color: Palette.lightIndigo, - size: 20, - ), - ), - Expanded( - child: Padding( - padding: EdgeInsets.only(left: 12.0), - child: Text( - location ?? 'there is no location', - style: TextStyle(fontSize: 12.0), - ), - ), - ), - ], - ), - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 16.0), - child: Row( - children: [ - Padding( - padding: const EdgeInsets.only(left: 5.0), - child: FaIcon( - FontAwesomeIcons.alignLeft, - color: Palette.lightIndigo, - size: 20, - ), - ), - Expanded( - child: Padding( - padding: EdgeInsets.only(left: 12.0), - child: Text( - description ?? 'there is no description', - style: TextStyle(fontSize: 12.0), - ), - ), - ), - ], - ), - ), - exp.hasMatch(description ?? '') == true - ? Row( - children: [ - Padding( - padding: const EdgeInsets.only(left: 5.0), - child: FaIcon( - FontAwesomeIcons.link, - color: Palette.lightIndigo, - size: 20, - ), - ), - Expanded( - child: Padding( - padding: EdgeInsets.only(), - child: TextButton( - onPressed: () { - matches.forEach((match) { - String sendLink = description! - .substring(match.start, match.end); - launchUrlString( - sendLink, - ); - }); - }, - child: Text('Link'))), - ), - ], - ) - : SizedBox.shrink(), - ], - ), + : AlertDialog( + title: Text(event.summary ?? 'No Title'), + content: buildDialogContent(context, startWeekDay, startFullDate, + startTime, endTime, exp, matches), actions: [ - new TextButton( + TextButton( onPressed: () { Navigator.of(context).pop(); }, @@ -606,4 +381,154 @@ class DialogPage1 extends StatelessWidget { ], ); } + + Widget buildDialogContent( + BuildContext context, + String startWeekDay, + String startFullDate, + String startTime, + String endTime, + RegExp exp, + Iterable matches) { + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + startTime == endTime + ? '$startWeekDay, $startFullDate' + : '$startWeekDay, $startFullDate | $startTime - $endTime', + style: TextStyle(color: Palette.bodyText, fontSize: 12.0), + ), + buildLocationButton(context), + buildDescription(), + buildLinkButton(exp, matches), + ], + ); + } + + Widget buildLocationButton(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(top: 16.0), + child: AbsorbPointer( + absorbing: (event.location == null), + child: TextButton( + onPressed: () async { + if (event.location != null) { + final availableMaps = await MapLauncher.installedMaps; + if (availableMaps.isNotEmpty) { + final coords = + await _getCoordinatesFromAddress(event.location!); + + if (coords != null) { + await availableMaps.first.showMarker( + coords: coords, + title: event.location!, + ); + } else { + // Handle the case where the address cannot be geocoded + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('Unable to find location coordinates.')), + ); + } + } + } + }, + child: Row( + children: [ + Padding( + padding: const EdgeInsets.only(bottom: 0.0), + child: FaIcon( + FontAwesomeIcons.locationDot, + color: Palette.lightIndigo, + size: 20, + ), + ), + Expanded( + child: Padding( + padding: EdgeInsets.only(left: 12.0), + child: Text( + event.location ?? 'No location', + style: TextStyle(fontSize: 12.0), + ), + ), + ), + ], + ), + ), + ), + ); + } + + Future _getCoordinatesFromAddress(String address) async { + try { + List locations = await locationFromAddress(address); + if (locations.isNotEmpty) { + return Coords(locations.first.latitude, locations.first.longitude); + } + } catch (e) { + print('Error getting coordinates: $e'); + } + return null; + } + + Widget buildDescription() { + return Padding( + padding: const EdgeInsets.only(top: 16.0), + child: Row( + children: [ + Padding( + padding: const EdgeInsets.only(left: 5.0), + child: FaIcon( + FontAwesomeIcons.alignLeft, + color: Palette.lightIndigo, + size: 20, + ), + ), + Expanded( + child: Padding( + padding: EdgeInsets.only(left: 12.0), + child: Text( + event.description ?? 'No description', + style: TextStyle(fontSize: 12.0), + ), + ), + ), + ], + ), + ); + } + + Widget buildLinkButton(RegExp exp, Iterable matches) { + return exp.hasMatch(event.description ?? '') + ? Row( + children: [ + Padding( + padding: const EdgeInsets.only(left: 5.0), + child: FaIcon( + FontAwesomeIcons.link, + color: Palette.lightIndigo, + size: 20, + ), + ), + Expanded( + child: Padding( + padding: EdgeInsets.only(), + child: TextButton( + onPressed: () { + matches.forEach((match) { + String sendLink = event.description! + .substring(match.start, match.end); + launchUrlString(sendLink); + }); + }, + child: Text('Link'), + ), + ), + ), + ], + ) + : SizedBox.shrink(); + } } diff --git a/lib/features/contact/data/MDJC.dart b/lib/features/contact/data/MDJC.dart index 71223947..e6ed4b6f 100644 --- a/lib/features/contact/data/MDJC.dart +++ b/lib/features/contact/data/MDJC.dart @@ -30,15 +30,16 @@ List mdjcList = [ ), Organization( name: 'Evert Marseille', - bio: '', + bio: + 'Sinds 1988 ben ik Rotary lid en ondanks mijn gevorderde leeftijd ben ik in juni 2023 door mijn clubgenoot Barbara gevraagd om penningmeester te worden. Bestuurlijk bezig zijn is mij met de paplepel ingegoten, dus ik vind het een hele eer om als oudje bezig te kunnen zijn met de ontwikkeling van jonge mensen die door een uitwisseling levenservaring kunnen opdoen.\n\n In mijn actieve beroepsperiode was ik accountant en heb ik ook nog 20 jaar deel uitgemaakt van de Lelystadse gemeenteraad.\n\n Ik ben gehuwd en heb 3 kinderen en 6 kleinkinderen. Wij hebben zelf ook veel mooie reizen gemaakt en daarmee ervaren hoe belangrijk het is om te zien hoe het leven in geheel andere landen is.\n Helaas is dit door de ziekte van mijn echtgenote niet meer mogelijk. Alle reden voor mij om mij naast mijn taak als mantelzorger ook op bestuurlijk gebied in te zetten.', imageUrl: 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', email: 'finance@rotaryyep.nl', phoneNumber: null, - club: '', - district: '', + club: 'RC Lelystad', + district: '1590 Noord Nederland', functions: [ - 'Treasurer', + 'Penningmeester', ], ), Organization( @@ -56,32 +57,22 @@ List mdjcList = [ 'Shortterm Chair', ], ), - Organization( - name: 'Pieter Postma', - bio: '', - imageUrl: - 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', - email: 'compliance@rotaryyep.nl', - phoneNumber: null, - club: '', - district: '', - functions: [ - 'Compliance Officer', - ], - ), + Organization( name: 'Ernst Ziengs', - bio: '', + bio: + 'Mijn naam is Ernst Ziengs. 53 jaar oud en woon in Weert samen met mijn vrouw Ellen en onze zonen Tijn (16) en Vigo. Ben ongeveer 10 jaar lid van Rotary Weert-Land van Horne. Daar ook voorzitter geweest en via Rotary en rechtstreeks doe ik veel vrijwilligerswerk. Zes jaar geleden heb ik wat tegenslag gehad met mijn gezondheid. Gevolg is dat ik opnieuw moest leren spreken, lopen en veel dingen opnieuw moest leren doen. In dit “terug komen” ben ik enorm geholpen door mijn gezin, vrienden en familie. Bij al die hulpvaardige mensen horen ook zeker mensen van de Rotery.\n\n In mijn wil terug te komen in het leven speelt jeugd een voorname rol. Ik werk 2 dagen per week bij Fontys in Eindhoven. Jonge mensen iets proberen over te dragen kennis en vaardigheden houdt mijzelf ook jong en actief in deze tijd. Precies mijn ambitie als DJC van district 1550.\n\n Naast de Exchanges is de vijfde Avenue Jeugd één van de leukste en meest uitgebreide Avenues. Als DJC mag ik deze ook, samen met alle clubs en regio’s tot een succes proberen te maken!', imageUrl: 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', email: 'youth@rotary-d1550.org', phoneNumber: null, - club: '', - district: '', + club: 'RC Weert-Land van Horne', + district: '1550', functions: [ 'DJC 1550', ], ), + Organization( name: 'Patty van Vierzen', bio: @@ -103,26 +94,13 @@ List mdjcList = [ imageUrl: 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/organization/long-term/erna-van-dijk.jpg', email: 'erna@vandijkmedischadvies.nl', - phoneNumber: null, + phoneNumber: '+31612300695', club: 'Scherpenzeel- Woudenberg', district: '', functions: [ 'DJC 1570', ], ), - Organization( - name: 'Peter Franssen', - bio: '', - imageUrl: - 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', - email: 'peterfranssenrotary@gmail.com', - phoneNumber: null, - club: '', - district: '', - functions: [ - 'DJC 1580', - ], - ), Organization( name: 'Marga Oosterveld', bio: @@ -152,44 +130,64 @@ List mdjcList = [ ], ), Organization( - name: 'Natasja Rensen', + name: 'Leoni Oude Nijhuis', bio: '', imageUrl: 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', - email: 'djc@rotary-d1610.nl', + email: 'leoni@helviro.com', phoneNumber: null, club: '', district: '', + functions: [ + 'Youth Protection Officer', + ], + ), + + Organization( + name: 'Thijs Kaas', + bio: + 'Sinds kort fungeer ik als DJC voor D1610, hierbij moet ik mijn weg nog wel een beetje vinden maar het is een leuke uitdaging. \n\n Al sinds 1999 met heel veel plezier lid van Rotary, en wel club Roosendaal, een organisatie die ook mij veel heeft gebracht onder meer ook door deel te nemen aan diverse programma’s en de verschillende commissies.\n Rotary is een krachtige organisatie waar ik graag mijn bijdrage lever waar mogelijk.\n Ik heb mogen deelnemen aan o.a. jeugd uitwisselingen, dat is toch iets wat mij heeft meeste voldoening heeft gebracht, een GSE-team mogen leiden naar India, Ryla’s, Wandelen voor Water, kleine en grotere fundraisingprojecten van onze club, organiseren van een Discon, NGSE programma’s en voorlichting geven aan clubs over de NGSE.\n\n Vele jaren ben ik werkzaam geweest in managementfuncties, sales en marketing en heb daar veel internationale ervaringen opgedaan. Dit bij zowel grote bedrijven als kleinere familieondernemingen.\n Ruim 20 jaar geleden heb ik het bedrijf overgenomen waar ik werkzaam was en was daarmee de franchisegever voor een groot aantal ondernemers in Nederland en België. Chem-Dry, een organisatie die zijn oorsprong heeft in de Verenigde Staten en in vele landen opereert. Enorm leuk om ondernemers te kunnen helpen succesvol te worden en marktleider te zijn in het segment van vloer en meubelonderhoud.\n\n Recent heb ik het bedrijf verkocht en geniet nu nog meer, want als redelijke Bourgondiër is dat een van mijn karaktertrekken, genieten, relativeren maar wel je verantwoordelijkheid nemen.\n\n Yvonne en ik hebben 4 zonen en 3 kleindochters en we genieten nog iedere dag van hen allemaal.', + imageUrl: + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', + email: null, + phoneNumber: null, + club: 'RC Roosendaal', + district: '1610 Zuidwest-Nederland', functions: [ 'DJC 1610', ], ), + Organization( - name: 'Leoni Oude Nijhuis', - bio: '', + name: 'Pieter Postma', + bio: + 'Sinds 2009 ben ik met veel plezier lid van Rotary. Als snel raakte ik betrokken bij de jeugduitwisseling. Ik kan me erg goed vinden in de gedachten achter de programma’s, namelijk de persoonlijke ontwikkeling van de jongeren, kennis maken met andere culturen en op die manier bijdragen aan wat meer internationaal begrip.\n Mijn kinderen zijn alle drie via Rotary een jaar weggeweest en zelf hebben we ook lange tijd jongeren in huis gehad die via het Rotary-programma in Nederland waren. Dat opvangen van die jongeren was voor ons gezin ook een mooie ervaring. Nadat ik eerst een tijd lang binnen de jeugdcommissie van onze club actief ben geweest, werd ik in 2016 District Jeugdcommissaris van district 1580. Daarmee belandde ik ook in de landelijke jeugdcommissie (MDJC) en daar ben ik nu nog steeds actief.\n In het dagelijks leven ben ik als fiscalist werkzaam bij een belastingadvieskantoor.', imageUrl: 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', - email: 'leoni@helviro.com', + email: 'compliance@rotaryyep.nl', phoneNumber: null, - club: '', - district: '', + club: 'RC Heiloo', + district: '1580 ', functions: [ - 'Youth Protection Officer', + 'Compliance Officer', ], ), + Organization( - name: 'Guido Rijninks', - bio: '', + name: 'Mario Meeuwse', + bio: + 'Mijn naam is Mario Meeuwse en ik ben District Jeugd Commissaris van District 1580.\n Gedurende mijn Rotaract lidmaatschap en later Rotary heb ik veel uitwisselingen meegemaakt.\n Daarnaast was ik actief in voor de Rotary Youth Leadership Award commissie in District 1610.\n Ook heb ik veel internationale activiteiten bijgewoond zoals (wereld)congressen en (district)conferenties.\n Zelf heb ik een Group Study Exchange gedaan naar Japan, waar ik met veel dankbaarheid en plezier op terugkijk.\n Een geweldige ervaring naar een land met een heel andere cultuur met enthousiaste mensen binnen de Rotary familie.\n Daarom wil ik ook een steentje bijdragen aan uitwisselingen en de jeugd een onvergetelijke ervaring bezorgen.\n\n Ik woon in Aalsmeer met Jikkemine en onze twee zonen.\n Wij hebben elkaar leren kennen toen wij Rotaracters waren op weg naar Santiago de Compostella tijdens het 100 jarige bestaan van Rotary.\n\n In het dagelijks leven ben ik accountmanager Grootzakelijk bij de Rabobank, gespecialiseerd in ICT & Zorg.\n Mijn hobby’s zijn: reizen, talen, skiën, zeilen & zwemmen.', imageUrl: 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', - email: 'educatour@home.nl', + email: null, phoneNumber: null, - club: '', - district: '', + club: 'RC Haarlemmermeer', + district: '1580', functions: [ - 'District Governor Youth', + 'DJC 1580', ], ), + // Organization( // name: 'Harry van Montfort', // bio: '', diff --git a/lib/features/contact/data/long_term_organization_list.dart b/lib/features/contact/data/long_term_organization_list.dart index a2dfb9f4..72c4945c 100644 --- a/lib/features/contact/data/long_term_organization_list.dart +++ b/lib/features/contact/data/long_term_organization_list.dart @@ -35,13 +35,14 @@ List longTermOrganizationList = [ ), Organization( name: 'Toon ter Ellen', - bio: '', + bio: + 'Mijn naam is Toon ter Ellen, coördinator inbound van het Rotary Longterm Exchange Program.\n\n Zelf ben ik in 2016-2017 een jaar op exchange geweest. Toen heb ik een jaar in Brazilië gewoond, de beste ervaring van mijn leven. Deze ervaring heeft me er ook toe gedreven me te blijven inzetten voor de Rotary Youth Exchange.\n\n Voor mijn tijd bij de MDJC ben ik vier jaar lid en bestuur geweest van Rotex, de vereniging van oud-uitwisselingsstudenten. \n\n Dit programma is een geweldig en voor iedereen die de kans krijgt heb ik maar één advies: doen!', imageUrl: 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/organization/long-term/toon-ter-ellen.jpg', email: 'longtermin@rotaryyep.nl', phoneNumber: null, - club: '', - district: '', + club: 'RC Leefklimaat', + district: '1560', functions: ['Inbound coördinator'], ), Organization( @@ -54,11 +55,7 @@ List longTermOrganizationList = [ phoneNumber: '+31629586813', club: 'Rotary Club Oosterwolde', district: '1590 NOORD-NEDERLAND', - functions: [ - 'Coördinator USAS & Canada', - 'Coördinator Europe', - 'Coördinator Azie' - ], + functions: ['Coördinator USAS & Canada', 'Coördinator Europe'], ), Organization( name: 'Judith Siebring', @@ -72,8 +69,7 @@ List longTermOrganizationList = [ district: '1590 NOORD-NEDERLAND', functions: [ 'Coördinator Europe', - 'Coördinator South & Central America', - 'Coördinator Zuid Amerika' + 'Coordinator Zuid-/Midden-Amerika', ], ), Organization( @@ -136,6 +132,18 @@ List longTermOrganizationList = [ phoneNumber: null, club: '', district: '', - functions: ['National Counselor'], + functions: ['Landelijk counselor'], + ), + Organization( + name: 'Carlo ter Ellen', + bio: + 'Mijn naam is Carlo ter Ellen en ik ben (samen met Hilleke van der Veer) landelijk counselor van de inbounds.\n\n Onze zoon Toon (inbound coördinator) is op zijn 15e een jaar op uitwisseling naar Brazilië geweest. Een prachtige ervaring voor Toon, maar ook erg leuk voor ons omdat we gastouder konden zijn voor meerdere uitwisselingsstudenten en een prachtige reis hebben gemaakt naar Brazilië. We hebben nog steeds warme contacten met een uitwisselingsgezin in Brazilië.\n\n Deze ervaring heeft ervoor gezorgd dat ik me graag wil inzetten om de uitwisselingsstudenten in Nederland een mooie en zorgeloze tijd te bezorgen. Ik woon in Oldenzaal samen met mijn vrouw Janet. Onze kinderen Toon en Margriet staan inmiddels op eigen benen en wonen niet meer thuis. Toon studeert nog en is daarnaast heel actief binnen Rotary als inboundcoördinator.\n\n In het dagelijks leven werk ik bij DPG Media, bekend van AD en in onze regio De Twentsche Courant Tubantia. Ik ben daar coördinator beeld en fotojournalist. Mijn hobby\'s zijn: wijn, wandelen, lekker eten en een beetje rondrijden met een oude cabrio.\n\n', + imageUrl: + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', + email: null, + phoneNumber: null, + club: 'Oldenzaal', + district: '1560', + functions: ['Landelijk counselor'], ), ]; diff --git a/lib/features/contact/data/rotex_list.dart b/lib/features/contact/data/rotex_list.dart index 48cc9867..88cd84b9 100644 --- a/lib/features/contact/data/rotex_list.dart +++ b/lib/features/contact/data/rotex_list.dart @@ -48,50 +48,6 @@ List rotexList = [ linkedinUrl: null, role: 'secretaris'), -// Sanne Pipping - Rotex( - name: 'Sanne Pipping', - bio: 'sannePippingBio', - imageUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/rotex/sanne-pipping.jpg', - email: null, - phoneNumber: null, - snapchatUrl: null, - facebookUrl: null, - instagramUrl: 'https://www.instagram.com/sannepipping/', - websiteUrl: null, - linkedinUrl: null, - role: 'Rotex adviescommissie'), - - // Nikki Mureau - Rotex( - name: 'Nikki Mureau', - bio: 'nikkiMureauBio', - imageUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/rotex/nikki-mureau.jpg', - email: null, - phoneNumber: '+31651756783', - facebookUrl: null, - snapchatUrl: null, - instagramUrl: 'https://www.instagram.com/nikkimureau/', - websiteUrl: 'https://www.nikkimureau.com', - linkedinUrl: 'https://www.linkedin.com/in/nikki-m-b60b7013a/', - role: 'Rotex adviescommissie'), -// Timo Homburg - Rotex( - name: 'Timo Homburg', - bio: 'timoHomburgBio', - imageUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/rotex/timo-homburg.jpg', - email: null, - phoneNumber: null, - snapchatUrl: null, - facebookUrl: 'https://www.facebook.com/timo.homburg', - instagramUrl: 'https://www.instagram.com/thtimo_/', - websiteUrl: null, - linkedinUrl: null, - role: 'Rotex adviescommissie'), - // Ties Kraai Rotex( name: 'Ties Kraai', diff --git a/lib/features/contact/data/short_term_organization_list.dart b/lib/features/contact/data/short_term_organization_list.dart index af1cbd60..9a49ad92 100644 --- a/lib/features/contact/data/short_term_organization_list.dart +++ b/lib/features/contact/data/short_term_organization_list.dart @@ -35,20 +35,6 @@ List shortTermOrganizationList = [ 'Outbound coordinator Camps and Tours', ], ), - Organization( - name: 'Gideon Roos', - bio: - 'Ik ben Gideon Roos, inbound coördinator camps & tours in Nederland. De Nederlandse clubs maken elk jaar weer fantastische programma’s om alle moois van Nederland te laten zien. Die programma’s zet ik uit bij mijn buitenlandse Rotary fellow inbound coördinatoren. Het is daarna genieten van alle mooie contacten en blije gezichten van de deelnemers aan de camps. Ze smeden door het intensieve contact een onderlinge band voor het leven en leren dat we allemaal van binnen uiteindelijk hetzelfde zijn, ongeacht afkomst, religie, geaardheid en persoonlijkheid. Als je het mij vraagt dè ultieme manier om wereldwijd begrip, samenwerking en vriendschap te bevorderen!', - imageUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/organization/short-term/gideon-roos.jpg', - email: 'campsandtours@rotaryyep.nl', - phoneNumber: '+31610930431', - club: 'RC Monnickendam', - district: '1580 NOORD-HOLLAND', - functions: [ - 'Inbound coordinator Camps and Tours', - ], - ), Organization( name: 'Jan van Aller', bio: @@ -64,20 +50,33 @@ List shortTermOrganizationList = [ ], ), Organization( - name: 'Hans Lodder', - bio: - 'Ik ben Hans Lodder, assistant voor het Short Term Exchnage Programma. Zelf ben ik sinds mei 2018 lid van de RC Delft Vrijhof. Tot 2017 was ik marine officier en heb in mijn carriere veel over de aardbol mogen zwerven en in diverse landen gewoond en gewerkt. Daardoor heb ik zelf kunnen zien wat zo een ervaring doet voor kinderen die ineens in een volledig andere omgeving en taal behoorlijk zelf hun weg moeten gaan vinden. Sinds 2017 ben ik met, wat heet, Functioneel leeftijds ontslag. \n\nMomenteel heb ik diverse functies. Ik ben in 2018 gevraagd om samen met een collega uit Sint Maarten de Integriteitskamer van Sint Maarten op te zetten. De eerste en tevens nog steeds enige, in ons Koninkrijk. Na dit opzetten ben ik sinds 2019 lid van de Integriteistkamer van Sint Maarten. Tevens ben ik voorzitter van de Raad van Toezicht van de Stichting Christelijk Onderwijs Delft en vice voorzitter van het medisch en farmaceutisch museum De Griffioen te Delft. Ik ben in 2020-2021 voorzitter van on ze RC geweest en nu secretaris van de club. \n\nThuis hebben we twee schoolgaande kinderen, een hond en een kat. Mijn hobbies zijn fietsen, golf en geschiedenis. \n\nIk ben lid geworden van de MDJC omdat door mijn vele ervarungen in het buitenland ik heb gezien hoe goed het is dat de jeugd, onze toekomst, al vroeg elkaar beter leert kennen. Ik heb jonegeren uit diverse landen welke zo ongeveer op voet van oorlog staan, prima met elkaar zien samenwerken, spelen en discusieren. Ergens tussen die jeugd en volwasen worden gaat het blijknaar fout. De programma\'s van het YEP kunnen zeker helpen daar verbetering in te brengen, hoe klein ook.', + name: 'Marja Hofland', + bio: '', imageUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/organization/short-term/hans-lodder.jpg', - email: 'shortterm@rotaryyep.nl', + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', + email: null, phoneNumber: null, - club: 'RC Delft Vrijhof', - district: '1600 ZUID-HOLLAND', + club: '', + district: '', functions: [ - 'Coordinator Family to Family', + 'Inbound coördinator Camps and Tours', ], ), // Organization( + // name: 'Hans Lodder', + // bio: + // 'Ik ben Hans Lodder, assistant voor het Short Term Exchnage Programma. Zelf ben ik sinds mei 2018 lid van de RC Delft Vrijhof. Tot 2017 was ik marine officier en heb in mijn carriere veel over de aardbol mogen zwerven en in diverse landen gewoond en gewerkt. Daardoor heb ik zelf kunnen zien wat zo een ervaring doet voor kinderen die ineens in een volledig andere omgeving en taal behoorlijk zelf hun weg moeten gaan vinden. Sinds 2017 ben ik met, wat heet, Functioneel leeftijds ontslag. \n\nMomenteel heb ik diverse functies. Ik ben in 2018 gevraagd om samen met een collega uit Sint Maarten de Integriteitskamer van Sint Maarten op te zetten. De eerste en tevens nog steeds enige, in ons Koninkrijk. Na dit opzetten ben ik sinds 2019 lid van de Integriteistkamer van Sint Maarten. Tevens ben ik voorzitter van de Raad van Toezicht van de Stichting Christelijk Onderwijs Delft en vice voorzitter van het medisch en farmaceutisch museum De Griffioen te Delft. Ik ben in 2020-2021 voorzitter van on ze RC geweest en nu secretaris van de club. \n\nThuis hebben we twee schoolgaande kinderen, een hond en een kat. Mijn hobbies zijn fietsen, golf en geschiedenis. \n\nIk ben lid geworden van de MDJC omdat door mijn vele ervarungen in het buitenland ik heb gezien hoe goed het is dat de jeugd, onze toekomst, al vroeg elkaar beter leert kennen. Ik heb jonegeren uit diverse landen welke zo ongeveer op voet van oorlog staan, prima met elkaar zien samenwerken, spelen en discusieren. Ergens tussen die jeugd en volwasen worden gaat het blijknaar fout. De programma\'s van het YEP kunnen zeker helpen daar verbetering in te brengen, hoe klein ook.', + // imageUrl: + // 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/organization/short-term/hans-lodder.jpg', + // email: 'shortterm@rotaryyep.nl', + // phoneNumber: null, + // club: 'RC Delft Vrijhof', + // district: '1600 ZUID-HOLLAND', + // functions: [ + // 'Coordinator Family to Family', + // ], + // ), + // Organization( // name: 'Sabine Vergroesen', // bio: // 'Hallo. Mijn naam is Sabine. Na ruim zes jaar actief meegedraaid te hebben bij het Long Term youth exchange programma van Rotary, heb ik een start gemaakt met het opzetten van een uitwisselingsprogramma voor jonge volwassenen binnen de kaders van Rotary: New Generation Service Exchange (NGSE). Dit programma is bedoeld om jongeren tussen 18 en 30 jaar een mogelijkheid te bieden in een ander land voor een stage, studie of buitenlandse werkervaring enkele weken (max 3 maanden) door te brengen. Een lokale Rotary club zorgt ter plaatse voor huisvesting, bij voorkeur in een of meer gastgezinnen. Deelname aan de service projecten van de Hostclub ter plaatse wordt ook zeer op prijs gesteld.\n\nZin om meer te weten? Mail me gerust met een korte omschrijving van jouw project. ', diff --git a/lib/features/contact/presentation/pages/contact_page.dart b/lib/features/contact/presentation/pages/contact_page.dart index 54c47528..82012ddb 100644 --- a/lib/features/contact/presentation/pages/contact_page.dart +++ b/lib/features/contact/presentation/pages/contact_page.dart @@ -5,25 +5,21 @@ import 'package:flutter/services.dart'; // 🌎 Project imports: import 'package:rotary_nl_rye/core/presentation/pages/organization_contact_details_page.dart'; import 'package:rotary_nl_rye/core/presentation/pages/rotex_contact_details_page.dart'; -import 'package:rotary_nl_rye/core/presentation/widgets/image_list_tile.dart'; import 'package:rotary_nl_rye/core/prop.dart'; import 'package:rotary_nl_rye/features/contact/data/MDJC.dart'; import 'package:rotary_nl_rye/features/contact/data/long_term_organization_list.dart'; import 'package:rotary_nl_rye/features/contact/data/rotex_list.dart'; import 'package:rotary_nl_rye/features/contact/data/short_term_organization_list.dart'; +import 'package:rotary_nl_rye/features/contact/presentation/models/organization.dart'; +import 'package:rotary_nl_rye/features/contact/presentation/models/rotex.dart'; +import 'package:rotary_nl_rye/features/widgets/list_tiles.dart'; class ContactPage extends StatefulWidget { @override _ContactPageState createState() => _ContactPageState(); } -//TODO needs to look like the story page. nut then only for contacts of the organication and Rotex (https://rotex.org/who-we-are/) class _ContactPageState extends State { - @override - initState() { - super.initState(); - } - @override Widget build(BuildContext context) { return DefaultTabController( @@ -38,91 +34,69 @@ class _ContactPageState extends State { centerTitle: false, title: Text( 'Contact List', - textScaler: TextScaler.linear(1.7), - style: - TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), + style: TextStyle( + color: Palette.indigo, + fontWeight: FontWeight.bold, + fontSize: 24, // Adjusted for readability + ), ), bottom: TabBar( - labelColor: Palette.selectedlabelColor, + labelColor: Palette.selectedLabelColor, unselectedLabelColor: Palette.unselectedLabelColor, - indicatorPadding: EdgeInsets.all(0.0), indicatorWeight: 4.0, - labelPadding: EdgeInsets.only(left: 0.0, right: 0.0), - indicator: ShapeDecoration( - shape: UnderlineInputBorder( - borderSide: BorderSide( - color: Colors.transparent, - width: 0, - style: BorderStyle.solid)), - gradient: LinearGradient( - colors: [Color(0xff0081ff), Color(0xff01ff80)])), - tabs: [ - Container( - height: 40, - alignment: Alignment.center, - color: Palette.themeContactTabShadeColor, - child: Text('MDJC'), - ), - Container( - height: 40, - alignment: Alignment.center, - color: Palette.themeContactTabShadeColor, - child: Text('Long Term'), - ), - Container( - height: 40, - alignment: Alignment.center, - color: Palette.themeContactTabShadeColor, - child: Text('Short Term'), - ), - Container( - height: 40, - alignment: Alignment.center, - color: Palette.themeContactTabShadeColor, - child: Text('Rotex'), + indicator: const UnderlineTabIndicator( + borderSide: BorderSide( + width: 4.0, + color: Color(0xff0081ff), ), + ), + tabs: const [ + Tab(text: 'MDJC'), + Tab(text: 'Long Term'), + Tab(text: 'Short Term'), + Tab(text: 'Rotex'), ], ), ), - body: Container( - //height: Device.height - 277, - margin: EdgeInsets.only(left: 5, right: 5), - child: TabBarView(children: [ - ListView.builder( - shrinkWrap: false, - itemBuilder: (context, index) => ContactListTile( - item: mdjcList[index], - contactDetailsPage: - OrganizationDetails(person: mdjcList[index])), - itemCount: mdjcList.length, - ), - ListView.builder( - shrinkWrap: false, - itemBuilder: (context, index) => ContactListTile( - item: longTermOrganizationList[index], - contactDetailsPage: OrganizationDetails( - person: longTermOrganizationList[index])), - itemCount: longTermOrganizationList.length, - ), - ListView.builder( - shrinkWrap: false, - itemBuilder: (context, index) => ContactListTile( - item: shortTermOrganizationList[index], - contactDetailsPage: OrganizationDetails( - person: shortTermOrganizationList[index])), - itemCount: shortTermOrganizationList.length, - ), - ListView.builder( - shrinkWrap: false, - itemBuilder: (context, index) => RotexContactListTile( - item: rotexList[index], - rotexContactDetailsPage: - RotexDetails(person: rotexList[index])), - itemCount: rotexList.length, - ), - ]), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 5.0), + child: TabBarView( + children: [ + _buildContactList( + mdjcList, (item) => OrganizationDetails(person: item)), + _buildContactList(longTermOrganizationList, + (item) => OrganizationDetails(person: item)), + _buildContactList(shortTermOrganizationList, + (item) => OrganizationDetails(person: item)), + _buildContactList( + rotexList, (item) => RotexDetails(person: item)), + ], + ), ), ), ); } + + Widget _buildContactList( + List list, Widget Function(dynamic) detailsPageBuilder) { + return ListView.builder( + itemCount: list.length, + itemBuilder: (context, index) { + final item = list[index]; + if (item is Organization) { + return ContactListTile( + item: item, + contactDetailsPage: detailsPageBuilder(item), + ); + } else if (item is Rotex) { + return RotexContactListTile( + item: item, + rotexContactDetailsPage: detailsPageBuilder(item), + ); + } else { + return SizedBox.shrink(); + } + }, + ); + } } diff --git a/lib/features/emergency/presentation/pages/emergency_page.dart b/lib/features/emergency/presentation/pages/emergency_page.dart index 7985f45d..9a78dc40 100644 --- a/lib/features/emergency/presentation/pages/emergency_page.dart +++ b/lib/features/emergency/presentation/pages/emergency_page.dart @@ -1,7 +1,6 @@ // 🐦 Flutter imports: import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; // 🌎 Project imports: import 'package:rotary_nl_rye/core/prop.dart'; @@ -16,180 +15,186 @@ class _EmergencyPageState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - systemOverlayStyle: SystemUiOverlayStyle( - statusBarBrightness: MediaQuery.of(context).platformBrightness, - ), - backgroundColor: Colors.transparent, - elevation: 0.0, - centerTitle: false, - title: Text( - 'Emergency', - textScaler: TextScaler.linear(1.7), - style: - TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), + appBar: AppBar( + systemOverlayStyle: SystemUiOverlayStyle( + statusBarBrightness: MediaQuery.of(context).platformBrightness, + ), + backgroundColor: Colors.transparent, + elevation: 0.0, + title: Text( + 'Emergency', + style: TextStyle( + color: Palette.indigo, + fontWeight: FontWeight.bold, + fontSize: 20, ), ), - body: ListView( - // padding: const EdgeInsets.only(top: 60), - padding: EdgeInsets.only(left: 16, top: 5, right: 16), - children: [ - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '112 for ambulance, fire brigade or police:', - style: TextStyle( - color: Palette.titleText, - fontSize: 18.0, - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Image( - image: AssetImage('assets/image/112_logo.png'), - fit: BoxFit.cover), - ), - - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: Text( + ), + body: ListView( + padding: const EdgeInsets.all(16), + children: [ + const EmergencySectionTitle( + title: '112 for ambulance, fire brigade or police:', + ), + const Image( + image: AssetImage('assets/image/112_logo.png'), + fit: BoxFit.cover, + ), + const SizedBox(height: 20), + const EmergencySectionTitle( + title: 'Neem direct contact op met Inbound coördinator en daaronder de Outbound coördinatoren:', - style: TextStyle( - color: Palette.bodyText, - fontSize: 15.0, - fontWeight: FontWeight.bold, - decoration: TextDecoration.underline, - ), - ), - ), + underline: true, + ), + const EmergencyCardItem( + title: 'Patty van Vierzen', + function: 'Inbound Coordinator', + mobileNumber: '06 34 02 14 03', + icon: Icons.phone, + index: 0, + ), + const EmergencyCardItem( + title: 'Toon ter Ellen', + function: 'Inbound Coordinator', + mobileNumber: '06 13 60 29 87', + icon: Icons.phone, + index: 0, + ), + const EmergencyCardItem( + title: 'Marga Oosterveld', + function: 'Outbound Coordinator', + mobileNumber: '06 29 58 68 13', + icon: Icons.phone, + index: 0, + ), + const EmergencyCardItem( + title: 'Judith Siebring', + function: 'Outbound Coordinator', + mobileNumber: '06 52 68 22 75', + icon: Icons.phone, + index: 0, + ), + const SizedBox(height: 20), + const EmergencySectionTitle( + title: 'Within Rotary Youth Exchange:', + underline: true, + ), + const EmergencyCardItem( + title: 'Barbara Tusveld', + function: 'Chair exchange program', + mobileNumber: '06 55 12 85 29', + icon: Icons.phone, + index: 0, + ), + const EmergencyCardItem( + title: 'Clasine Scheepers', + function: 'Secretary Board', + mobileNumber: '06 52 71 09 77', + icon: Icons.phone, + index: 0, + ), + const EmergencyCardItem( + title: 'Hilleke van der Veer', + function: 'National counselor', + mobileNumber: '06 38 30 04 27', + icon: Icons.phone, + index: 0, + ), + const EmergencyCardItem( + title: 'Carlo ter Ellen', + function: 'National Counselor', + mobileNumber: '06 53 40 14 77', + icon: Icons.phone, + index: 0, + ), + const SizedBox(height: 20), + const EmergencySectionTitle( + title: + 'Confidants (not connected to Rotary) in case of f.e. sexual harassment, Police could also be notified in case of breaking a law:', + underline: true, + ), + const EmergencyCardItem( + title: 'Pauline Memelink', + function: 'Lawyer', + mobileNumber: '06 24 23 56 24', + email: 'p.memelink@t-mobilethuis.nl', + icon: Icons.phone, + index: 1, + ), + const EmergencyCardItem( + title: 'Reinout Vriesendorp', + function: 'Doctor\'s office', + mobileNumber: '0182 612 676', + email: 'info@medischcentrumwest.org', + icon: Icons.phone, + index: 1, + ), + const SizedBox(height: 20), + const EmergencySectionTitle( + title: 'Note:', + underline: true, + ), + const EmergencyNote( + text: + 'Make sure you always have your present host parent\'s phone numbers and home address at hand!', + ), + const EmergencyNote( + text: + 'Also, your host parents know how to assist you in case you need to see a doctor, have to go to the hospital or visit a dentist.', + ), + const SizedBox(height: 40), + ], + ), + ); + } +} - EmergencyCardItem( - title: 'Patty van Vierzen', - function: 'Inbound Coordinator', - mobileNumber: '06 34 02 14 03', - icon: FontAwesomeIcons.phone, - index: 0, - ), - EmergencyCardItem( - title: 'Toon ter Ellen', - function: 'Inbound Coordinator', - mobileNumber: '06 13 60 29 87', - icon: FontAwesomeIcons.phone, - index: 0, - ), - EmergencyCardItem( - title: 'Marga Oosterveld', - function: 'Outbound Coordinator', - mobileNumber: '06 29 58 68 13', - icon: FontAwesomeIcons.phone, - index: 0, - ), - EmergencyCardItem( - title: 'Judith Siebring', - function: 'Outbound Coordinator', - mobileNumber: '06 52 68 22 75', - icon: FontAwesomeIcons.phone, - index: 0, - ), +class EmergencySectionTitle extends StatelessWidget { + final String title; + final bool underline; - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: Text( - 'Within Rotary Youth Exchange:', - style: TextStyle( - color: Palette.bodyText, - fontSize: 15.0, - fontWeight: FontWeight.bold, - decoration: TextDecoration.underline, - ), - ), - ), + const EmergencySectionTitle({ + Key? key, + required this.title, + this.underline = false, + }) : super(key: key); - EmergencyCardItem( - title: 'Barbara Tusveld', - function: 'Chair exchange program', - mobileNumber: '06 55 12 85 29', - icon: FontAwesomeIcons.phone, - index: 0, - ), - EmergencyCardItem( - title: 'Clasine Scheepers', - function: 'Secretary Board', - mobileNumber: '06 52 71 09 77', - icon: FontAwesomeIcons.phone, - index: 0, - ), + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(top: 5.0), + child: Text( + title, + style: TextStyle( + color: Palette.titleText, + fontSize: 18.0, + fontWeight: FontWeight.bold, + decoration: underline ? TextDecoration.underline : null, + ), + ), + ); + } +} - EmergencyCardItem( - title: 'Hilleke van der Veer', - function: 'National counselor', - mobileNumber: '06 38 30 04 27', - icon: FontAwesomeIcons.phone, - index: 0, - ), +class EmergencyNote extends StatelessWidget { + final String text; - // Confidants (not connected to Rotary) in case of f.e. sexual harassment: - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: Text( - 'Confidants (not connected to Rotary) in case of f.e. sexual harassment, Police could also be notified in case of breaking a law:', - style: TextStyle( - color: Palette.bodyText, - fontSize: 15.0, - fontWeight: FontWeight.bold, - decoration: TextDecoration.underline, - ), - ), - ), - EmergencyCardItem( - title: 'Pauline Memelink', - function: 'Lawyer', - mobileNumber: '06 24 23 56 24', - email: 'p.memelink@t-mobilethuis.nl', - icon: FontAwesomeIcons.phone, - index: 1, - ), - EmergencyCardItem( - title: 'Reinout Vriesendorp', - function: 'Doctor\'s office', - mobileNumber: '0182 612 676', - email: 'info@medischcentrumwest.org', - icon: FontAwesomeIcons.phone, - index: 1, - ), + const EmergencyNote({ + Key? key, + required this.text, + }) : super(key: key); - // - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: Text( - 'Note:', - style: TextStyle( - color: Palette.bodyText, - fontSize: 15.0, - fontWeight: FontWeight.bold, - decoration: TextDecoration.underline, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- Make sure you always have your present host parent\'s phone numbers and home address at hand!', - style: TextStyle(color: Palette.bodyText, fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- Also, your host parents know how to assist you in case you need to see a doctor, have to go to the hospital or visit a dentist.', - style: TextStyle(color: Palette.bodyText, fontSize: 14.0), - ), - ), - SizedBox( - height: 40, - ), - ], - )); + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(top: 5.0), + child: Text( + text, + style: TextStyle( + color: Palette.bodyText, + fontSize: 14.0, + ), + ), + ); } } diff --git a/lib/features/emergency/presentation/widgets/emergency_card_item.dart b/lib/features/emergency/presentation/widgets/emergency_card_item.dart index 939ff18f..30af81a5 100644 --- a/lib/features/emergency/presentation/widgets/emergency_card_item.dart +++ b/lib/features/emergency/presentation/widgets/emergency_card_item.dart @@ -3,129 +3,92 @@ import 'package:flutter/material.dart'; // 📦 Package imports: import 'package:font_awesome_flutter/font_awesome_flutter.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; import 'package:url_launcher/url_launcher.dart'; -class EmergencyCardItem extends StatefulWidget { - final String title, function, mobileNumber; - final String? email; - final IconData icon; - final int index; - - EmergencyCardItem( - {required this.title, - required this.icon, - required this.function, - required this.mobileNumber, - this.email, - required this.index}); - - @override - _EmergencyCardItemState createState() => _EmergencyCardItemState( - function: function, - mobileNumber: mobileNumber, - email: email, - title: title, - icon: icon, - index: index); -} - -class _EmergencyCardItemState extends State { - bool isExpanded = false; - +class EmergencyCardItem extends StatelessWidget { final String title, function, mobileNumber; final String? email; final IconData icon; final int index; - _EmergencyCardItemState( - {required this.title, - required this.icon, - required this.function, - required this.mobileNumber, - this.email, - required this.index}); + const EmergencyCardItem({ + Key? key, + required this.title, + required this.icon, + required this.function, + required this.mobileNumber, + this.email, + required this.index, + }) : super(key: key); @override Widget build(BuildContext context) { return Padding( - padding: EdgeInsets.only( - top: 15, - bottom: 16, - ), + padding: const EdgeInsets.symmetric(vertical: 16), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Row( - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - width: Device.width - 220, - child: Text(title, - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - inherit: true, - fontSize: 20.0, - fontWeight: FontWeight.bold, - )), - ), - SizedBox( - height: 4, + Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + fontSize: 20.0, + fontWeight: FontWeight.bold, ), - SizedBox( - width: Device.width - 220, - child: Text(function, - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - inherit: true, - fontSize: 14.0, - color: Colors.grey, - )), + ), + const SizedBox(height: 4), + Text( + function, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + fontSize: 14.0, + color: Colors.grey, ), - ], - ) - ], + ), + ], + ), ), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ElevatedButton.icon( + onPressed: () async { + final tel = + Uri.parse('tel:+31${mobileNumber.replaceAll(' ', '')}'); + if (!await launchUrl(tel)) { + throw 'Could not launch $tel'; + } + }, + icon: Icon( + icon, + size: 24.0, + ), + label: Text(mobileNumber), + ), + if (index != 0 && email != null) ...[ + const SizedBox(height: 8), + ElevatedButton.icon( onPressed: () async { - final tel = Uri.parse( - 'tel:+31${mobileNumber.toString().replaceAll(' ', '')}'); - if (!await launchUrl(tel)) { - throw 'Could not launch $tel'; + final mail = Uri.parse('mailto:$email'); + if (!await launchUrl(mail)) { + throw 'Could not launch $mail'; } }, - icon: Icon( - icon, + icon: const Icon( + FontAwesomeIcons.envelope, size: 24.0, ), - label: Text(mobileNumber)), - index == 0 - ? SizedBox.shrink() - : ElevatedButton.icon( - onPressed: () async { - final mail = Uri.parse('mailto:${email}'); - if (!await launchUrl(mail)) { - throw 'Could not launch $mail'; - } - }, - icon: Icon( - FontAwesomeIcons.envelope, - size: 24.0, - ), - label: Text('E-Mail')), + label: const Text('E-Mail'), + ), + ], ], - ) + ), ], ), ); diff --git a/lib/features/forRotaryClubs/presentation/pages/AlgemeneInformatie/algemeneInfo.dart b/lib/features/forRotaryClubs/presentation/pages/AlgemeneInformatie/algemeneInfo.dart index 5456b9f0..1daedcd0 100644 --- a/lib/features/forRotaryClubs/presentation/pages/AlgemeneInformatie/algemeneInfo.dart +++ b/lib/features/forRotaryClubs/presentation/pages/AlgemeneInformatie/algemeneInfo.dart @@ -12,6 +12,29 @@ class AlgemeneInfoPage extends StatefulWidget { } class _AlgemeneInfoPageState extends State { + final List> infoSections = [ + { + 'title': 'Sponsoring - wat houdt het in?', + 'content': + 'Het is de bedoeling dat een Rotary club als sponsor optreedt voor een scholier die graag als ambassadeur van Rotary International een schooljaar naar het buitenland uitgezonden wil worden. Dit is mogelijk voor alle jongeren, zowel uit Rotary als uit niet-Rotary gezinnen. In datzelfde jaar ontvangt de club een buitenlandse scholier in haar midden. Deze gaat hier naar school met leeftijdsgenoten en wordt tijdens het jaar bij twee tot maximaal vier gastgezinnen ondergebracht.\n\nLeeftijd - voor de uitzending en ontvangst van de scholier gelden indicatieve leeftijdsgrenzen. In principe is dit 15½ - 18½ jaar.' + }, + { + 'title': 'De uitwisseling', + 'content': + 'De uitwisseling vindt plaats op basis van wederkerigheid. Dit wil zeggen dat elke Rotary club die een scholier uitzendt, in hetzelfde jaar een het jaarkind ontvangt. Deze scholier wordt tijdens het jaar bij diverse gastgezinnen ondergebracht. De club bezoekt tevoren de gastgezinnen.' + }, + { + 'title': 'Kosten', + 'content': + 'Voor sponsoring van een Nederlandse scholier naar het buitenland zijn er geen kosten verbonden voor jullie club. Wel zijn er kosten voor de ontvangst van een jaarstudent. (Dit programma is op basis van wederkerigheid, dus het een kan niet zonder het ander plaatsvinden).\n\nDe maximaal totale kosten die hiermee gemoeid zijn voor jullie club bedragen € 2.000,-- voor een heel schooljaar/uitwisselingsjaar. De landelijke Rotary-organisatie MDJC vindt het Rotary uitwisselingsprogramma zo belangrijk, dat zij een tegemoetkoming in de kosten (subsidie) van € 1.250,-- betalen voor elke club die wil hosten. Dat betekent dat de feitelijke kosten voor jullie club voor een heel jaar dan nog maximaal € 750,- bedragen.' + }, + { + 'title': 'Gastgezinnen', + 'content': + 'De CJC zoekt samen met de student die uitgezonden wil worden naar drie gastgezinnen en een reservegezin. Het is prettig als er kinderen van dezelfde leeftijd in het gezin zijn, maar dat is beslist niet noodzakelijk. In gezinnen met kinderen van dezelfde leeftijd krijgen ze eerder aansluiting met leeftijdsgenoten, maar oudere echtparen zijn vaak fantastische gastouders en in gezinnen met kleine kinderen leren de studenten vaak eerder onze taal.\n\nSamenwerking met een andere Rotary club is dan mogelijk een leuke optie en biedt meer mogelijkheden voor het vinden van gastgezinnen.\n\nOm je als club goed te informeren (of te enthousiasmeren) over het meedoen aan deze jaaruitwisseling zijn er oud-exchange studenten in Nederland die graag over hun ervaringen komen vertellen. Daarnaast kun je als club ook meer informatie opvragen bij de leden van MDJC of je eigen District Jeugd Commissaris.' + } + ]; + @override Widget build(BuildContext context) { return Scaffold( @@ -29,107 +52,38 @@ class _AlgemeneInfoPageState extends State { style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), ), ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: true, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 5.0), - // child: Text( - // 'Sponsoring - wat houdt het in?', - // style: TextStyle( - // color: Palette.titleText, - // fontSize: 20.0, - // fontWeight: FontWeight.bold), - // ), - // ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - 'Sponsoring - wat houdt het in?', - style: TextStyle( - color: Palette.bodyText, - fontSize: 16.0, - fontWeight: FontWeight.bold), - ), - ), - - Padding( - padding: const EdgeInsets.only(top: 6.0), - child: Text( - 'Het is de bedoeling dat een Rotary club als sponsor optreedt voor een scholier die graag als ambassadeur van Rotary International een schooljaar naar het buitenland uitgezonden wil worden. Dit is mogelijk voor alle jongeren, zowel uit Rotary als uit niet-Rotary gezinnen. In datzelfde jaar ontvangt de club een buitenlandse scholier in haar midden. Deze gaat hier naar school met leeftijdsgenoten en wordt tijdens het jaar bij twee tot maximaal vier gastgezinnen ondergebracht.\n\nLeeftijd - voor de uitzending en ontvangst van de scholier gelden indicatieve leeftijdsgrenzen. In principe is dit 15½ - 18½ jaar.', - style: TextStyle(color: Palette.bodyText, fontSize: 14.0), - ), - ), - - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: Text( - 'De uitwisseling', - style: TextStyle( - color: Palette.bodyText, - fontSize: 16.0, - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 6.0), - child: Text( - 'De uitwisseling vindt plaats op basis van wederkerigheid. Dit wil zeggen dat elke Rotary club die een scholier uitzendt, in hetzelfde jaar een het jaarkind ontvangt. Deze scholier wordt tijdens het jaar bij diverse gastgezinnen ondergebracht. De club bezoekt tevoren de gastgezinnen.', - style: TextStyle(color: Palette.bodyText, fontSize: 14.0), - ), - ), - - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: Text( - 'Kosten', - style: TextStyle( - color: Palette.bodyText, - fontSize: 16.0, - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 6.0), - child: Text( - 'Voor sponsoring van een Nederlandse scholier naar het buitenland zijn er geen kosten verbonden voor jullie club. Wel zijn er kosten voor de ontvangst van een jaarstudent. (Dit programma is op basis van wederkerigheid, dus het een kan niet zonder het ander plaatsvinden). \n\nDe maximaal totale kosten die hiermee gemoeid zijn voor jullie club bedragen € 2.000,-- voor een heel schooljaar/uitwisselingsjaar. De landelijke Rotary-organisatie MDJC vindt het Rotary uitwisselingsprogramma zo belangrijk, dat zij een tegemoetkoming in de kosten (subsidie) van € 1.250,-- betalen voor elke club die wil hosten. Dat betekent dat de feitelijke kosten voor jullie club voor een heel jaar dan nog maximaal € 750,- bedragen.', - style: TextStyle(color: Palette.bodyText, fontSize: 14.0), - ), - ), - - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: Text( - 'Gastgezinnen', - style: TextStyle( - color: Palette.bodyText, - fontSize: 16.0, - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 6.0), - child: Text( - 'De CJC zoekt samen met de student die uitgezonden wil worden naar drie gastgezinnen en een reservegezin. Het is prettig als er kinderen van dezelfde leeftijd in het gezin zijn, maar dat is beslist niet noodzakelijk. In gezinnen met kinderen van dezelfde leeftijd krijgen ze eerder aansluiting met leeftijdsgenoten, maar oudere echtparen zijn vaak fantastische gastouders en in gezinnen met kleine kinderen leren de studenten vaak eerder onze taal. \n\nSamenwerking met een andere Rotary club is dan mogelijk een leuke optie en biedt meer mogelijkheden voor het vinden van gastgezinnen. \n\nOm je als club goed te informeren (of te enthousiasmeren) over het meedoen aan deze jaaruitwisseling zijn er oud-exchange studenten in Nederland die graag over hun ervaringen komen vertellen. Daarnaast kun je als club ook meer informatie opvragen bij de leden van MDJC of je eigen District Jeugd Commissaris.', - style: TextStyle(color: Palette.bodyText, fontSize: 14.0), - ), - ), - - SizedBox( - height: 10, - ), + body: ListView.builder( + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 15), + itemCount: infoSections.length, + itemBuilder: (context, index) { + return _buildInfoSection( + infoSections[index]['title']!, + infoSections[index]['content']!, + ); + }, + ), + ); + } - // the end - SizedBox( - height: 40, - ), - ], - ) + Widget _buildInfoSection(String title, String content) { + return Padding( + padding: const EdgeInsets.only(bottom: 20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + style: TextStyle( + color: Palette.bodyText, + fontSize: 16.0, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: 6.0), + Text( + content, + style: TextStyle(color: Palette.bodyText, fontSize: 14.0), + ), ], ), ); diff --git a/lib/features/forRotaryClubs/presentation/pages/InfoCounselor/InfoCounselor.dart b/lib/features/forRotaryClubs/presentation/pages/InfoCounselor/InfoCounselor.dart index 65b6f4c9..8ada79ae 100644 --- a/lib/features/forRotaryClubs/presentation/pages/InfoCounselor/InfoCounselor.dart +++ b/lib/features/forRotaryClubs/presentation/pages/InfoCounselor/InfoCounselor.dart @@ -1,14 +1,13 @@ // 🐦 Flutter imports: import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; - -// 📦 Package imports: import 'package:font_awesome_flutter/font_awesome_flutter.dart'; // 🌎 Project imports: import 'package:rotary_nl_rye/core/presentation/pages/pdf_viewer_share.dart'; import 'package:rotary_nl_rye/core/prop.dart'; import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; +import 'package:rotary_nl_rye/features/uniform_widgets/info_list_tile.dart'; class InfoCounselorPage extends StatefulWidget { @override @@ -38,7 +37,6 @@ class _InfoCounselorPageState extends State { pdfUrl: 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/rotary-club-info/2024/travel-rules-within-and-outside-the-netherlands-2024-2025.pdf'), }, - // Add more options as needed ]; @override @@ -60,19 +58,11 @@ class _InfoCounselorPageState extends State { body: ListView.builder( itemCount: infoOptions.length, itemBuilder: (BuildContext context, int index) { - Map option = infoOptions[index]; - return Column( - children: [ - ListTile( - leading: FaIcon(option['icon'], color: Palette.lightIndigo), - title: Text(option['title'], - style: TextStyle(color: Palette.grey)), - onTap: () => Navigator.push(context, - MaterialPageRoute(builder: (context) => option['page'])), - trailing: Icon(Icons.arrow_forward_ios, color: Palette.grey), - ), - Divider(height: 20, thickness: 2), - ], + final option = infoOptions[index]; + return InfoListTile( + title: option['title'], + icon: option['icon'], + page: option['page'], ); }, ), diff --git a/lib/features/forRotaryClubs/presentation/pages/InfoGastgezin/InfoGastgezin.dart b/lib/features/forRotaryClubs/presentation/pages/InfoGastgezin/InfoGastgezin.dart index 4061e386..79c72349 100644 --- a/lib/features/forRotaryClubs/presentation/pages/InfoGastgezin/InfoGastgezin.dart +++ b/lib/features/forRotaryClubs/presentation/pages/InfoGastgezin/InfoGastgezin.dart @@ -1,13 +1,12 @@ // 🐦 Flutter imports: import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; - -// 📦 Package imports: import 'package:font_awesome_flutter/font_awesome_flutter.dart'; // 🌎 Project imports: import 'package:rotary_nl_rye/core/presentation/pages/pdf_viewer_share.dart'; import 'package:rotary_nl_rye/core/prop.dart'; +import 'package:rotary_nl_rye/features/uniform_widgets/info_list_tile.dart'; import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; class InfoGastgezinPage extends StatefulWidget { @@ -38,7 +37,6 @@ class _InfoGastgezinPageState extends State { pdfUrl: 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/rotary-club-info/2024/travel-rules-within-and-outside-the-netherlands-2024-2025.pdf'), }, - // Add more options as needed ]; @override @@ -60,19 +58,11 @@ class _InfoGastgezinPageState extends State { body: ListView.builder( itemCount: infoOptions.length, itemBuilder: (BuildContext context, int index) { - Map option = infoOptions[index]; - return Column( - children: [ - ListTile( - leading: FaIcon(option['icon'], color: Palette.lightIndigo), - title: Text(option['title'], - style: TextStyle(color: Palette.grey)), - onTap: () => Navigator.push(context, - MaterialPageRoute(builder: (context) => option['page'])), - trailing: Icon(Icons.arrow_forward_ios, color: Palette.grey), - ), - Divider(height: 20, thickness: 2), - ], + final option = infoOptions[index]; + return InfoListTile( + title: option['title'], + icon: option['icon'], + page: option['page'], ); }, ), diff --git a/lib/features/forRotaryClubs/presentation/pages/Jeugdcommissaris/jeugd_commissaris.dart b/lib/features/forRotaryClubs/presentation/pages/Jeugdcommissaris/jeugd_commissaris.dart index 10e96559..a053c3cf 100644 --- a/lib/features/forRotaryClubs/presentation/pages/Jeugdcommissaris/jeugd_commissaris.dart +++ b/lib/features/forRotaryClubs/presentation/pages/Jeugdcommissaris/jeugd_commissaris.dart @@ -1,13 +1,12 @@ // 🐦 Flutter imports: import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; - -// 📦 Package imports: import 'package:font_awesome_flutter/font_awesome_flutter.dart'; // 🌎 Project imports: import 'package:rotary_nl_rye/core/presentation/pages/pdf_viewer_share.dart'; import 'package:rotary_nl_rye/core/prop.dart'; +import 'package:rotary_nl_rye/features/uniform_widgets/info_list_tile.dart'; import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; class InfoForJeugdcommissarisPage extends StatefulWidget { @@ -103,18 +102,10 @@ class _InfoForJeugdcommissarisPageState itemCount: infoOptions.length, itemBuilder: (context, index) { final option = infoOptions[index]; - return Column( - children: [ - ListTile( - leading: FaIcon(option['icon'], color: Palette.lightIndigo), - title: Text(option['title'], - style: TextStyle(color: Palette.grey)), - onTap: () => Navigator.push(context, - MaterialPageRoute(builder: (context) => option['page'])), - trailing: Icon(Icons.arrow_forward_ios, color: Palette.grey), - ), - Divider(height: 20, thickness: 2), - ], + return InfoListTile( + title: option['title'], + icon: option['icon'], + page: option['page'], ); }, ), diff --git a/lib/features/forRotaryClubs/presentation/pages/belangrijkeDocumenten/important_documents.dart b/lib/features/forRotaryClubs/presentation/pages/belangrijkeDocumenten/important_documents.dart index 34181539..de7bf589 100644 --- a/lib/features/forRotaryClubs/presentation/pages/belangrijkeDocumenten/important_documents.dart +++ b/lib/features/forRotaryClubs/presentation/pages/belangrijkeDocumenten/important_documents.dart @@ -7,9 +7,9 @@ import 'package:font_awesome_flutter/font_awesome_flutter.dart'; // 🌎 Project imports: import 'package:rotary_nl_rye/core/presentation/pages/pdf_viewer_share.dart'; -import 'package:rotary_nl_rye/core/presentation/widgets/show_alert_dialog.dart'; import 'package:rotary_nl_rye/core/prop.dart'; import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; +import 'package:rotary_nl_rye/features/uniform_widgets/info_list_tile.dart'; class ImportantDocumentsPage extends StatefulWidget { @override @@ -17,6 +17,30 @@ class ImportantDocumentsPage extends StatefulWidget { } class _ImportantDocumentsPageState extends State { + final List> infoOptions = [ + { + 'title': 'Code of Policies \'Regels en Interventies\'', + 'icon': FontAwesomeIcons.peopleRoof, + 'page': PDFPageWithShare( + pdfUrl: + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/rotary-club-info/jaaruitwisseling-regels-en-interventies-v7-1-2020.pdf'), + }, + { + 'title': "MDJC gedragscode - VJV - \n'Vrijwilliger Jeugd Verklaring'", + 'icon': FontAwesomeIcons.peopleGroup, + 'page': PDFPageWithShare( + pdfUrl: + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/rotary-club-info/2023/gedragscode-vrijwilligers-mdjc-2.pdf'), + }, + { + 'title': 'First Night Questions', + 'icon': FontAwesomeIcons.question, + 'page': PDFPageWithShare( + pdfUrl: + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/rotary-club-info/questions-first-night-host-family.pdf'), + }, + ]; + @override Widget build(BuildContext context) { return Scaffold( @@ -34,137 +58,17 @@ class _ImportantDocumentsPageState extends State { style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), ), ), - body: ListView( - shrinkWrap: true, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Divider( - height: 15, - thickness: 2, - ), - // buildInboundOptionRow( - // context, - // 'MDJC noodprocedure', - // FontAwesomeIcons.kitMedical, - // null, - // ), - // Divider( - // height: 15, - // thickness: 2, - // ), - buildInboundOptionRow( - context, - 'Code of Policies \'Regels en Interventies\'', - FontAwesomeIcons.peopleRoof, - PDFPageWithShare( - pdfUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/rotary-club-info/jaaruitwisseling-regels-en-interventies-v7-1-2020.pdf', - ), - ), - Divider( - height: 15, - thickness: 2, - ), - buildInboundOptionRow( - context, - "MDJC gedragscode - VJV - \n'Vrijwilliger Jeugd Verklaring'", - FontAwesomeIcons.peopleGroup, - PDFPageWithShare( - pdfUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/rotary-club-info/2023/gedragscode-vrijwilligers-mdjc-2.pdf', - ), - ), - Divider( - height: 15, - thickness: 2, - ), - - buildInboundOptionRow( - context, - 'First Night Questions', - FontAwesomeIcons.question, - PDFPageWithShare( - pdfUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/rotary-club-info/questions-first-night-host-family.pdf', - ), - ), - Divider( - height: 15, - thickness: 2, - ), - // the end - SizedBox( - height: 20, - ), - ], - ) - ], - ), - ); - } - - GestureDetector buildInboundOptionRow( - BuildContext context, - String title, - IconData icon, - pushTo, - ) { - return GestureDetector( - child: Padding( - padding: EdgeInsets.only(top: 8.0, bottom: 8.0, left: 8.0), - child: ListTile( - leading: Padding( - padding: EdgeInsets.zero, - child: Container( - child: FaIcon( - icon, - color: Palette.lightIndigo, - size: 27, - ), - ), - ), - title: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - SizedBox( - width: Device.width - 130, - child: Text(title, - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - fontSize: 15, - color: Palette.grey, - fontWeight: FontWeight.w500, - )), - ), - Icon( - Icons.arrow_forward_ios, - color: Palette.grey, - ), - ], - ), - onTap: () { - if (pushTo != null) { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => pushTo), - ); - } else { - String title = 'Comming soon'; - String message = 'This page is not yet ready'; - showMaterialDialog( - context, - title, - message, - null, - ); - } + body: ListView.builder( + itemCount: infoOptions.length, + itemBuilder: (BuildContext context, int index) { + final option = infoOptions[index]; + return InfoListTile( + title: option['title'], + icon: option['icon'], + page: option['page'], + ); }, ), - )); + ); } } diff --git a/lib/features/forRotaryClubs/presentation/pages/rotary_club_info_page.dart b/lib/features/forRotaryClubs/presentation/pages/rotary_club_info_page.dart index 6842c9cb..95873290 100644 --- a/lib/features/forRotaryClubs/presentation/pages/rotary_club_info_page.dart +++ b/lib/features/forRotaryClubs/presentation/pages/rotary_club_info_page.dart @@ -6,14 +6,14 @@ import 'package:flutter/services.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; // 🌎 Project imports: -// import 'package:rotary_nl_rye/core/presentation/pages/pdf_viewer_share.dart'; import 'package:rotary_nl_rye/core/prop.dart'; import 'package:rotary_nl_rye/features/forRotaryClubs/presentation/pages/InfoCounselor/InfoCounselor.dart'; import 'package:rotary_nl_rye/features/forRotaryClubs/presentation/pages/InfoGastgezin/InfoGastgezin.dart'; +import 'package:rotary_nl_rye/features/forRotaryClubs/presentation/pages/AlgemeneInformatie/algemeneInfo.dart'; +import 'package:rotary_nl_rye/features/forRotaryClubs/presentation/pages/Jeugdcommissaris/jeugd_commissaris.dart'; +import 'package:rotary_nl_rye/features/forRotaryClubs/presentation/pages/belangrijkeDocumenten/important_documents.dart'; import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; -import 'AlgemeneInformatie/algemeneInfo.dart'; -import 'Jeugdcommissaris/jeugd_commissaris.dart'; -import 'belangrijkeDocumenten/important_documents.dart'; +import 'package:rotary_nl_rye/features/forRotaryClubs/presentation/widgets/option_row_data.dart'; class ForRotaryClubsPage extends StatefulWidget { @override @@ -21,6 +21,19 @@ class ForRotaryClubsPage extends StatefulWidget { } class _ForRotaryClubsPageState extends State { + final List options = [ + OptionRowData( + 'Algemene Informatie', FontAwesomeIcons.info, AlgemeneInfoPage()), + OptionRowData('Info voor de Jeugdcommissaris', FontAwesomeIcons.solidUser, + InfoForJeugdcommissarisPage()), + OptionRowData( + 'Info Gastgezin', FontAwesomeIcons.peopleRoof, InfoGastgezinPage()), + OptionRowData('Info Counselor', FontAwesomeIcons.handsHoldingChild, + InfoCounselorPage()), + OptionRowData('Belangrijke Documenten', + FontAwesomeIcons.triangleExclamation, ImportantDocumentsPage()), + ]; + @override Widget build(BuildContext context) { return Scaffold( @@ -38,21 +51,8 @@ class _ForRotaryClubsPageState extends State { TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold)), ), body: ListView.builder( - itemCount: 5, + itemCount: options.length, itemBuilder: (context, index) { - final List options = [ - OptionRowData('Algemene Informatie', FontAwesomeIcons.info, - AlgemeneInfoPage()), - OptionRowData('Info voor de Jeugdcommissaris', - FontAwesomeIcons.solidUser, InfoForJeugdcommissarisPage()), - OptionRowData('Info Gastgezin', FontAwesomeIcons.peopleRoof, - InfoGastgezinPage()), - OptionRowData('Info Counselor', FontAwesomeIcons.handsHoldingChild, - InfoCounselorPage()), - OptionRowData('Belangrijke Documenten', - FontAwesomeIcons.triangleExclamation, ImportantDocumentsPage()), - ]; - return Column( children: [ if (index == 0) @@ -65,7 +65,7 @@ class _ForRotaryClubsPageState extends State { ), ), Divider(height: 20, thickness: 2), - buildInboundOptionRow(context, options[index]), + buildOptionRow(context, options[index]), ], ); }, @@ -73,8 +73,7 @@ class _ForRotaryClubsPageState extends State { ); } - GestureDetector buildInboundOptionRow( - BuildContext context, OptionRowData data) { + GestureDetector buildOptionRow(BuildContext context, OptionRowData data) { return GestureDetector( onTap: () => Navigator.push( context, MaterialPageRoute(builder: (context) => data.pushTo)), @@ -90,11 +89,3 @@ class _ForRotaryClubsPageState extends State { ); } } - -class OptionRowData { - final String title; - final IconData icon; - final Widget pushTo; - - OptionRowData(this.title, this.icon, this.pushTo); -} diff --git a/lib/features/forRotaryClubs/presentation/widgets/option_row_data.dart b/lib/features/forRotaryClubs/presentation/widgets/option_row_data.dart new file mode 100644 index 00000000..19ec2f29 --- /dev/null +++ b/lib/features/forRotaryClubs/presentation/widgets/option_row_data.dart @@ -0,0 +1,10 @@ +// 📦 Package imports: +import 'package:flutter/material.dart'; + +class OptionRowData { + final String title; + final IconData icon; + final Widget pushTo; + + OptionRowData(this.title, this.icon, this.pushTo); +} diff --git a/lib/features/home/presentation/pages/home_page.dart b/lib/features/home/presentation/pages/home_page.dart index 58689c69..58d4b7c2 100644 --- a/lib/features/home/presentation/pages/home_page.dart +++ b/lib/features/home/presentation/pages/home_page.dart @@ -20,7 +20,7 @@ import 'package:rotary_nl_rye/features/news/presentation/pages/news_page.dart'; import 'package:rotary_nl_rye/features/outbound/presentation/pages/outbound_page.dart'; import 'package:rotary_nl_rye/features/outbound/presentation/pages/short_term/camps_and_tours/widgets/loadCsv.dart'; import 'package:rotary_nl_rye/features/programs/presentation/pages/program_page.dart'; -import 'package:rotary_nl_rye/features/stories/presentation/pages/countries_page.dart'; +import 'package:rotary_nl_rye/features/rebounds/presentation/pages/CountriesPage.dart'; class HomePage extends StatefulWidget { @override @@ -28,48 +28,18 @@ class HomePage extends StatefulWidget { } class _HomePageState extends State with WidgetsBindingObserver { - // _HomePageState() { - // // FirebaseAuth.instance.signInAnonymously().then( - // // (UserCredential userCredential) => - // // _currentSubscription = data.loadNews().listen(_updateNews)); - // } - bool _isLoading = false; List exchangeStudents = []; SharedPreferences? sharedPreferences; int _currentNewsIndex = 0; - // Future readJson(String url) async { - // // final String response = - // // await rootBundle.loadString('assets/test/stories.json'); - // final data = await api.getDataStudentList(url); - // exchangeStudents = data; - // setState(() { - // _isLoading = false; - // }); - // } - - // _updateNews(DocumentSnapshot> snapshot) { - // _isLoading = false; - // _news = data.getNewsFromQuery(snapshot); - // readJson(_news.students); - // } - @override - initState() { + void initState() { super.initState(); - // TODO: implement dispose _loadBadge(); - - // whenever your initialization is completed, remove the splash screen: FlutterNativeSplash.remove(); } - @override - void dispose() { - super.dispose(); - } - void _loadBadge() async { final prefs = await SharedPreferences.getInstance(); setState(() { @@ -81,96 +51,96 @@ class _HomePageState extends State with WidgetsBindingObserver { Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.transparent, - body: _isLoading - ? Center( - child: CircularProgressIndicator(), - ) - : Container( - child: ListView( + body: SafeArea( + child: _isLoading + ? Center(child: CircularProgressIndicator()) + : ListView( physics: ClampingScrollPhysics(), + padding: const EdgeInsets.all(16), children: [ Container( height: 90, margin: EdgeInsets.only( - left: 16, right: 16, bottom: 24, top: 10), + left: 16, right: 16, bottom: 24, top: 16), child: SvgPicture.asset( - 'assets/image/rotary_rye_nl_logo_home.svg'), - ), - - // Slider images - Carousel(), - - // navigator buttons - Container( - margin: EdgeInsets.only(top: 24, left: 16, right: 16), - child: Column( - children: [ - Row( - children: [ - HomeCardItem( - icon: FontAwesomeIcons.list, - title: 'Programs', - pushTo: ProgramPage(), - currentNewsIndex: 0), - HomeCardItem( - icon: FontAwesomeIcons.newspaper, - title: 'News', - pushTo: NewsPage(), - currentNewsIndex: _currentNewsIndex, - ), - HomeCardItem( - icon: FontAwesomeIcons.calendarDays, - title: 'Calendar', - pushTo: CalendarPage(), - currentNewsIndex: 0, - ), - ], - ), - SizedBox( - height: 16, - ), - Row( - children: [ - HomeCardItem( - icon: FontAwesomeIcons.planeDeparture, - title: 'Op Exchange', - pushTo: OutboundPage(), - currentNewsIndex: 0), - HomeCardItemToNL( - icon: FontAwesomeIcons.planeArrival, - title: 'To ', - pushTo: InboundPage(), - currentNewsIndex: 0), - HomeCardItem( - icon: FontAwesomeIcons.rotateRight, - title: 'Rebound', - pushTo: CountriesPage(), - currentNewsIndex: 0), - ], - ), - SizedBox( - height: 16, - ), - Row( - children: [ - HomeCardItemSingle( - icon: FontAwesomeIcons.campground, - title: 'Camps & Tours List', - pushTo: LoadCsv(), - currentNewsIndex: 0), - HomeCardItemSingleRotary( - title: 'voor Rotary Clubs', - pushTo: ForRotaryClubsPage(), - currentNewsIndex: 0), - ], - ), - SizedBox(height: 30), - ], + 'assets/image/rotary_rye_nl_logo_home.svg', ), ), + Carousel(), + SizedBox(height: 16), + _buildNavigatorButtons(), ], ), + ), + ); + } + + Widget _buildNavigatorButtons() { + return Column( + children: [ + Row( + children: [ + HomeCardItem( + icon: FontAwesomeIcons.list, + title: 'Programs', + pushTo: ProgramPage(), + currentNewsIndex: 0, + ), + HomeCardItem( + icon: FontAwesomeIcons.newspaper, + title: 'News', + pushTo: NewsPage(), + currentNewsIndex: _currentNewsIndex, + ), + HomeCardItem( + icon: FontAwesomeIcons.calendarDays, + title: 'Calendar', + pushTo: CalendarPage(), + currentNewsIndex: 0, + ), + ], + ), + const SizedBox(height: 16), + Row( + children: [ + HomeCardItem( + icon: FontAwesomeIcons.planeDeparture, + title: 'Op Exchange', + pushTo: OutboundPage(), + currentNewsIndex: 0, + ), + HomeCardItemToNL( + icon: FontAwesomeIcons.planeArrival, + title: 'To', + pushTo: InboundPage(), + currentNewsIndex: 0, + ), + HomeCardItem( + icon: FontAwesomeIcons.rotateRight, + title: 'Rebound', + pushTo: CountriesPage(), + currentNewsIndex: 0, + ), + ], + ), + const SizedBox(height: 16), + Row( + children: [ + HomeCardItemSingle( + icon: FontAwesomeIcons.campground, + title: 'Camps & Tours List', + pushTo: LoadCsv(), + currentNewsIndex: 0, + ), + HomeCardItemSingleRotary( + title: 'voor Rotary Clubs', + pushTo: ForRotaryClubsPage(), + currentNewsIndex: 0, ), + ], + ), + const SizedBox(height: 30), + ], ); } } diff --git a/lib/features/home/presentation/widgets/carousel_display.dart b/lib/features/home/presentation/widgets/carousel_display.dart index 48d0555c..f581fbfa 100644 --- a/lib/features/home/presentation/widgets/carousel_display.dart +++ b/lib/features/home/presentation/widgets/carousel_display.dart @@ -20,17 +20,24 @@ class _CarouselState extends State { List carousels = [ CarouselModel( - image: 'assets/image/homepage/Digitale_infomarkt_25_mei_2024.jpg', + image: 'assets/image/homepage/Informatiedag_14_september_2024.jpg', text: null), CarouselModel( - image: 'assets/image/homepage/class_2024.jpg', text: 'Class of 2024'), + image: 'assets/image/homepage/Koningsdag_Emmen_27_april_2024.png', + text: null), + CarouselModel( + image: + 'assets/image/homepage/Nederland_herdenkt-inbounds_4_mei_2024.png', + text: null), CarouselModel( - image: 'assets/image/homepage/afscheid_bestuur_rotex.jpg', - text: 'Afscheid Rotex Bestuur'), - CarouselModel(image: 'assets/image/homepage/Cream_Black.jpg', text: null), + image: 'assets/image/homepage/Inbounds_Bezoek_Beurs_van_Berlage.jpg', + text: null), CarouselModel( - image: 'assets/image/homepage/prebounds_in_action.jpg', text: null), - CarouselModel(image: 'assets/image/homepage/Cream_Black.jpg', text: null) + image: 'assets/image/homepage/Farewell_Inbounds_2023-2024_mei_2024.jpg', + text: null), + CarouselModel( + image: 'assets/image/homepage/Testimonial_Schouwen-Duiveland.png', + text: null), ]; List map(List list, Function handler) { diff --git a/lib/features/inbound/presentation/pages/inbound_page.dart b/lib/features/inbound/presentation/pages/inbound_page.dart index 89ed96f2..53d1a0ab 100644 --- a/lib/features/inbound/presentation/pages/inbound_page.dart +++ b/lib/features/inbound/presentation/pages/inbound_page.dart @@ -39,291 +39,147 @@ class _InboundPageState extends State { ), body: ListView( shrinkWrap: true, - scrollDirection: Axis.vertical, children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: const EdgeInsets.only( - left: 16.0, right: 16.0, top: 20.0, bottom: 20), + padding: const EdgeInsets.symmetric( + horizontal: 16.0, vertical: 20.0), child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 16), - children: [ + text: TextSpan( + style: Theme.of(context) + .textTheme + .bodyMedium! + .copyWith(fontSize: 16), + children: [ TextSpan( - text: 'Inbounds', - style: TextStyle(fontWeight: FontWeight.bold), - ), - TextSpan( - text: - ' Wow, we’re so excited that you will be our inbound exchange student for the coming year. For this to happen we will need some extra information so please watch your email inbox on a regular basis. ', - ), + text: 'Inbounds', + style: TextStyle(fontWeight: FontWeight.bold)), TextSpan( - text: - 'Also you can find some further information in this app. If you have any questions that are not answered, please contact our inbound coordinator ', - ), - // TODO go to there contact page + text: + ' Wow, we’re so excited that you will be our inbound exchange student for the coming year. For this to happen we will need some extra information so please watch your email inbox on a regular basis. Also you can find some further information in this app. If you have any questions that are not answered, please contact our inbound coordinator '), TextSpan( text: 'Clasine Scheepers', style: TextStyle(color: Colors.blue), recognizer: TapGestureRecognizer() - ..onTap = () { - launchUrlString('mailto:longtermin@rotaryyep.nl'); - }, - ), - TextSpan( - text: ' and/or ', + ..onTap = () => + launchUrlString('mailto:longtermin@rotaryyep.nl'), ), + TextSpan(text: ' and/or '), TextSpan( text: 'Ben Mureau', style: TextStyle(color: Colors.blue), recognizer: TapGestureRecognizer() - ..onTap = () { - launchUrlString( - 'mailto:longtermadmin@rotaryyep.nl'); - }, + ..onTap = () => launchUrlString( + 'mailto:longtermadmin@rotaryyep.nl'), ), - ])), - ), - - Padding( - padding: const EdgeInsets.only(left: 16.0, right: 16.0), - child: Row( - children: [ - Text( - 'Long Term Exchange Program', - style: - TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - ), - ], + ], + ), ), ), - Padding( - padding: const EdgeInsets.only(left: 16.0, right: 16.0), - child: Divider( - height: 15, - thickness: 2, - ), - ), - + sectionHeader(context, 'Long Term Exchange Program'), buildInboundOptionRow( - context, - 'Long Term Exchange Program', - 'Year Exchange', - FontAwesomeIcons.hashtag, - LongTermExchangeInboundPage()), - SizedBox( - height: 10, - ), - Padding( - padding: const EdgeInsets.only(left: 16.0, right: 16.0), - child: Row( - children: [ - Text( - 'Short Term Exchange Program', - style: - TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - ), - ], - ), - ), - - Padding( - padding: const EdgeInsets.only(left: 16.0, right: 16.0), - child: Divider( - height: 15, - thickness: 2, - ), + context, + 'Long Term Exchange Program', + 'Year Exchange', + FontAwesomeIcons.hashtag, + LongTermExchangeInboundPage(), ), + sectionHeader(context, 'Short Term Exchange Program'), buildInboundOptionRow( - context, - 'NGSE', - 'New Generations Service Exchange', - FontAwesomeIcons.hashtag, - // NGSEInboundPage(), - null), + context, + 'NGSE', + 'New Generations Service Exchange', + FontAwesomeIcons.hashtag, + null, + ), buildInboundOptionRow( - context, - 'FAMILY TO FAMILY', - 'Exchange between families', - FontAwesomeIcons.hashtag, - // FamilyToFamilyInboundPage(), - null), + context, + 'FAMILY TO FAMILY', + 'Exchange between families', + FontAwesomeIcons.hashtag, + null, + ), buildInboundOptionRow( - context, - 'CAMPS & TOURS', - 'Summer Camps', - FontAwesomeIcons.hashtag, - // CampsAndToursInboundPage(), - null), - - // Divider( - // height: 15, - // thickness: 2, - // ), - // buildInboundOptionRowWhoIsWhere( - // context, - // 'Inbounds, Who is Where?', - // FontAwesomeIcons.streetView, - // WhoIsWherePage()), - // Divider( - // height: 15, - // thickness: 2, - // ), - // the end - SizedBox( - height: 20, + context, + 'CAMPS & TOURS', + 'Summer Camps', + FontAwesomeIcons.hashtag, + null, ), + SizedBox(height: 20), ], - ) + ), ], ), ); } - Container buildInboundOptionRow( - BuildContext context, - String title, - subtitle, - IconData icon, - pushTo, - ) { - return Container( - padding: EdgeInsets.all(8.0), - child: ListTile( - leading: Padding( - padding: const EdgeInsets.symmetric(horizontal: 0.0), - child: Container( - child: CachedNetworkImage( - height: 50, - width: 50, - imageUrl: - 'https://www.rotary.org/sites/all/themes/rotary_rotaryorg/images/favicons/favicon-194x194.png', - imageBuilder: (context, imageProvider) => Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - image: DecorationImage(image: imageProvider, fit: BoxFit.cover), - ), - ), - placeholder: (context, url) => - Center(child: CircularProgressIndicator()), - errorWidget: (context, url, error) => Icon(Icons.error), - )), - ), - title: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - SizedBox( - width: Device.width - 170, - child: Text( + Widget sectionHeader(BuildContext context, String title) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Column( + children: [ + Row( + children: [ + Text( title, - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - inherit: true, fontWeight: FontWeight.w700, fontSize: 16.0), - ), - ), - ], - ), - subtitle: Padding( - padding: const EdgeInsets.only(top: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - SizedBox( - width: Device.width - 170, - child: Text(subtitle, - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - inherit: true, - fontSize: 14.0, - color: Palette.descriptionText)), + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), ], ), - ), - // trailing: Icon( - // Icons.arrow_forward_ios, - // color: Palette.grey, - // ), - onTap: () { - if (pushTo != null) { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => pushTo), - ); - } else { - String title = 'Comming soon'; - String message = 'This page is not yet ready'; - showMaterialDialog( - context, - title, - message, - null, - ); - } - }, + Divider(height: 15, thickness: 2), + ], ), ); } - GestureDetector buildInboundOptionRowWhoIsWhere( - BuildContext context, - String title, - IconData icon, - pushTo, - ) { - return GestureDetector( - child: Padding( - padding: EdgeInsets.only(top: 8.0, bottom: 8.0, left: 8.0), + Widget buildInboundOptionRow(BuildContext context, String title, + String subtitle, IconData icon, Widget? pushTo) { + return Padding( + padding: const EdgeInsets.all(8.0), child: ListTile( - leading: Padding( - padding: EdgeInsets.zero, - child: Container( - child: FaIcon( - icon, - color: Palette.lightIndigo, - size: 27, + leading: CachedNetworkImage( + height: 50, + width: 50, + imageUrl: + 'https://www.rotary.org/sites/all/themes/rotary_rotaryorg/images/favicons/favicon-194x194.png', + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + image: DecorationImage(image: imageProvider, fit: BoxFit.cover), ), ), + placeholder: (context, url) => + Center(child: CircularProgressIndicator()), + errorWidget: (context, url, error) => Icon(Icons.error), ), - title: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - SizedBox( - width: Device.width - 120, - child: Text(title, - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - fontSize: 15, - color: Palette.grey, - fontWeight: FontWeight.w500, - )), - ), - Icon( - Icons.arrow_forward_ios, - color: Palette.grey, - ), - ], + title: Text( + title, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle(fontWeight: FontWeight.w700, fontSize: 16.0), + ), + subtitle: Padding( + padding: const EdgeInsets.only(top: 8.0), + child: Text( + subtitle, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle(fontSize: 14.0, color: Palette.descriptionText), + ), ), onTap: () { if (pushTo != null) { Navigator.push( - context, - MaterialPageRoute(builder: (context) => pushTo), - ); + context, MaterialPageRoute(builder: (context) => pushTo)); + } else { + showMaterialDialog( + context, 'Coming soon', 'This page is not yet ready', null); } }, ), - )); + ); } } diff --git a/lib/features/inbound/presentation/pages/information/flight_and_arrival.dart b/lib/features/inbound/presentation/pages/information/flight_and_arrival.dart deleted file mode 100644 index 8cc20d05..00000000 --- a/lib/features/inbound/presentation/pages/information/flight_and_arrival.dart +++ /dev/null @@ -1,136 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -class FlightAndArrivalPage extends StatefulWidget { - @override - _FlightAndArrivalPageState createState() => _FlightAndArrivalPageState(); -} - -class _FlightAndArrivalPageState extends State { - @override - initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Flight and Arrival', - textScaler: TextScaler.linear(1), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'Flight', - style: TextStyle( - decoration: TextDecoration.underline, - fontSize: 14.0, - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: '\u2022', - style: TextStyle(fontWeight: FontWeight.bold)), - TextSpan( - text: - ' You should obtain a changeable open return airline ticket', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: '\u2022', - style: TextStyle(fontWeight: FontWeight.bold)), - TextSpan( - text: - ' Your arrival airport is Amsterdam (Schiphol) Airport', - ), - ])), - ), - - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'Arrival', - style: TextStyle( - decoration: TextDecoration.underline, - fontSize: 14.0, - fontWeight: FontWeight.bold), - ), - ), - - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], - ), - ); - } - - @override - void dispose() { - super.dispose(); - } -} diff --git a/lib/features/inbound/presentation/pages/information/insurance.dart b/lib/features/inbound/presentation/pages/information/insurance.dart deleted file mode 100644 index 60cba191..00000000 --- a/lib/features/inbound/presentation/pages/information/insurance.dart +++ /dev/null @@ -1,104 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -class InsurancePage extends StatefulWidget { - @override - _InsurancePageState createState() => _InsurancePageState(); -} - -class _InsurancePageState extends State { - @override - initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Travel', - textScaler: TextScaler.linear(1), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'The insurance policy from the Netherlands is compulsory. We will pre-insure you, so you will be fully insured as soon as you will land at Amsterdam Schiphol airport up until you are leaving at the airport again. A copy of the Insurance Policy will be sent to you a few days before you leave your home country.', - ), - ])), - ), - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], - ), - ); - } - - @override - void dispose() { - super.dispose(); - } -} diff --git a/lib/features/inbound/presentation/pages/information/language.dart b/lib/features/inbound/presentation/pages/information/language.dart deleted file mode 100644 index 8b0e006f..00000000 --- a/lib/features/inbound/presentation/pages/information/language.dart +++ /dev/null @@ -1,119 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -class LanguagePage extends StatefulWidget { - @override - _LanguagePageState createState() => _LanguagePageState(); -} - -class _LanguagePageState extends State { - @override - initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Travel', - textScaler: TextScaler.linear(1), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'There’s no hiding it: Dutch is a very difficult language to learn. However, we do expect you to master the language and that within months after your arrival you will be fluent in our language. The MDJC will organize a DOC (Dutch Orientation Course) in September for the August group and one in Februari for the newbies. It will last 6 days and the program will focus on learning the Dutch language and will also give you an insight into our culture. You will work in small groups. Your fellow students will be all the other exchange students, so lots of fun included.', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'Your first host family will also help you to learn Dutch and you will receive books to start learning the language as soon as you are in the Netherlands.', - ), - ])), - ), - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], - ), - ); - } - - @override - void dispose() { - super.dispose(); - } -} diff --git a/lib/features/inbound/presentation/pages/information/travel.dart b/lib/features/inbound/presentation/pages/information/travel.dart deleted file mode 100644 index c5e03b99..00000000 --- a/lib/features/inbound/presentation/pages/information/travel.dart +++ /dev/null @@ -1,144 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -// 📦 Package imports: - -// ignore: unused_import - -class TravelPage extends StatefulWidget { - @override - _TravelPageState createState() => _TravelPageState(); -} - -class _TravelPageState extends State { - @override - initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Travel', - textScaler: TextScaler.linear(1), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'The rules of Rotary Youth Exchange do not allow travelling outside the scope of the Rotary program. However, you may travel with your host family or members of your host club or other Rotarians, or other authorized persons (for instance on a school trip), but ', - ), - TextSpan( - text: 'not alone.', - style: TextStyle(fontWeight: FontWeight.bold)), - TextSpan( - text: - ' This rule applies for both travelling inside the Netherlands as well as abroad.', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'Visits to family or friends abroad are not permitted!', - style: TextStyle(fontWeight: FontWeight.bold)), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'One of your host families might suggest to participate in a holiday somewhere abroad. This is usually OK when you will have a written approval from your parents.', - ), - ])), - ), - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], - ), - ); - } - - @override - void dispose() { - super.dispose(); - } -} diff --git a/lib/features/inbound/presentation/pages/information/welcome_in_the_netherlands.dart b/lib/features/inbound/presentation/pages/information/welcome_in_the_netherlands.dart deleted file mode 100644 index 82c5aaae..00000000 --- a/lib/features/inbound/presentation/pages/information/welcome_in_the_netherlands.dart +++ /dev/null @@ -1,139 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -class WelcomeInTheNetherlandsPage extends StatefulWidget { - @override - _WelcomeInTheNetherlandsPageState createState() => - _WelcomeInTheNetherlandsPageState(); -} - -class _WelcomeInTheNetherlandsPageState - extends State { - @override - initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Welcome to the Netherlands!', - textScaler: TextScaler.linear(1), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: 'Welcome to the Netherlands!', - style: TextStyle(fontWeight: FontWeight.bold)), - TextSpan( - text: - ' We are very excited about your upcoming stay with us and looking forward to meeting you. We hope and believe that you will enjoy your stay with us. We have an exciting and active Rotary International Youth Exchange Program with approx. 18 exchange students arriving in our country. You will make friends from all over the world, in addition to making many Dutch friends in your school and Rotary.', - ), - ])), - ), - - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'An exchange year is one of the best years of your life, a wonderful experience in a new culture, with a new language but also with some rules to make sure that your stay will be both enjoyable for you and us alike. These rules are consistent with the International Rotary rules.', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'Please remember that under all circumstances you are an ambassador of Rotary and will have to behave accordingly. Our motto: Be grateful, be on purpose, be of service, be here now, be first, be curious! Also you will be an ambassador of your country. Both functions will be with you at all times and you will be regarded and judged as such at all times during your exchange!', - ), - ])), - ), - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], - ), - ); - } - - @override - void dispose() { - super.dispose(); - } -} diff --git a/lib/features/inbound/presentation/pages/long_term/class_of/class_of.dart b/lib/features/inbound/presentation/pages/long_term/class_of/class_of.dart index d8f98e86..c815c2a8 100644 --- a/lib/features/inbound/presentation/pages/long_term/class_of/class_of.dart +++ b/lib/features/inbound/presentation/pages/long_term/class_of/class_of.dart @@ -3,10 +3,10 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; // 🌎 Project imports: -import 'package:rotary_nl_rye/core/presentation/widgets/image_list_tile.dart'; import 'package:rotary_nl_rye/core/prop.dart'; import 'package:rotary_nl_rye/features/inbound/data/inbound_list.dart'; import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; +import 'package:rotary_nl_rye/features/widgets/list_tiles.dart'; import 'class_of_details_page.dart'; class ClassOfPageInbounds extends StatefulWidget { diff --git a/lib/features/inbound/presentation/pages/long_term/class_of/class_of_details_page.dart b/lib/features/inbound/presentation/pages/long_term/class_of/class_of_details_page.dart index cbcda811..bb72be61 100644 --- a/lib/features/inbound/presentation/pages/long_term/class_of/class_of_details_page.dart +++ b/lib/features/inbound/presentation/pages/long_term/class_of/class_of_details_page.dart @@ -6,13 +6,13 @@ import 'package:flutter/services.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:rotary_nl_rye/features/inbound/presentation/models/ClassOf.dart'; import 'package:url_launcher/url_launcher_string.dart'; // 🌎 Project imports: import 'package:rotary_nl_rye/core/presentation/widgets/full_screen_image.dart'; import 'package:rotary_nl_rye/core/presentation/widgets/open_whatsapp.dart'; import 'package:rotary_nl_rye/core/prop.dart'; +import 'package:rotary_nl_rye/features/inbound/presentation/models/ClassOf.dart'; import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; class ClassOfDetailsInbounds extends StatelessWidget { @@ -37,338 +37,283 @@ class ClassOfDetailsInbounds extends StatelessWidget { ), ), body: ListView( - shrinkWrap: true, - scrollDirection: Axis.vertical, + padding: EdgeInsets.symmetric(vertical: 15), children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, + buildProfileHeader(context), + if (hasSocialMedia(person)) buildDivider(), + buildSocialMediaRow(), + if (hasSocialMedia(person)) buildDivider(), + buildSectionTitle('About me'), + buildSectionDivider(), + buildBio(), + if (!hasSocialMedia(person)) SizedBox(height: 40), + buildContactButtons(context), + SizedBox(height: 40), + ], + ), + ); + } + + Widget buildProfileHeader(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(left: 30), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( children: [ - Padding( - padding: EdgeInsets.only( - left: 20, - right: 20, - top: 15, - bottom: 16, - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - InkWell( - borderRadius: BorderRadius.circular(60), - onTap: () { - Navigator.of(context).push(PageRouteBuilder( - opaque: false, - pageBuilder: (BuildContext context, _, __) => - FullScreenImage(url: person.imageUrl))); - }, - child: CachedNetworkImage( - height: 60, - width: 60, - imageUrl: person.imageUrl, - imageBuilder: (context, imageProvider) => - Container( - decoration: BoxDecoration( - shape: BoxShape.circle, - image: DecorationImage( - image: imageProvider, - fit: BoxFit.cover, - ), - ), - ), - placeholder: (context, url) => - CircularProgressIndicator(), - errorWidget: (context, url, error) => - Icon(Icons.error), - )), - SizedBox( - width: 12, - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - width: Device.width - 150, - child: Text(person.name, - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - inherit: true, - fontSize: 22.0, - fontWeight: FontWeight.bold, - )), - ), - SizedBox( - height: 4, - ), - SizedBox( - width: Device.width - 150, - child: Row( - children: [ - Text(person.from, - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - fontWeight: FontWeight.w500, - inherit: true, - fontSize: 14.0, - color: Colors.grey[600], - )), - SizedBox( - width: 2, - ), - SvgPicture.asset( - 'assets/icons/flags/${person.fromFlag}.svg', - height: 15), - SizedBox( - width: 5, - ), - FaIcon( - FontAwesomeIcons.arrowRightLong, - color: Colors.grey, - ), - SizedBox( - width: 5, - ), - Text(person.to, - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - fontWeight: FontWeight.w500, - inherit: true, - fontSize: 14.0, - color: Colors.grey[600], - )), - SizedBox( - width: 2, - ), - person.toFlag == null - ? SizedBox.shrink() - : SvgPicture.asset( - 'assets/icons/flags/${person.toFlag}.svg', - height: 15) - ], - ), - ), - ], - ) - ], - ), - // SvgPicture.asset('assets/icons/flags/${person.flag}.svg', - // height: 20) - ], - ), - ), - person.websiteUrl == null && - person.facebookUrl == null && - person.instagramUrl == null && - person.snapchatUrl == null && - person.phoneNumber == null - ? SizedBox.shrink() - : Padding( - padding: const EdgeInsets.only( - top: 0.0, left: 20.0, bottom: 0.0, right: 20), - child: Divider( - height: 15, - thickness: 2, - ), - ), - //TODO if he has one of the socials not. then it doen't need to show up! - Padding( - padding: const EdgeInsets.only(left: 15.0, right: 15), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - person.instagramUrl == null - ? SizedBox.shrink() - : Padding( - padding: - const EdgeInsets.only(right: 10.0, left: 10.0), - child: Stack( - children: [ - TextButton( - child: FaIcon( - FontAwesomeIcons.instagram, - color: Color(0xFFbc2a8d), - ), - onPressed: () => - launchUrlString('${person.instagramUrl}'), - ), - ], - ), - ), - person.snapchatUrl == null - ? SizedBox.shrink() - : Padding( - padding: - const EdgeInsets.only(right: 10.0, left: 10.0), - child: Stack( - children: [ - TextButton( - child: FaIcon( - FontAwesomeIcons.snapchat, - color: Color.fromARGB(221, 201, 198, 8), - ), - onPressed: () => - launchUrlString('${person.snapchatUrl}'), - ), - ], - ), - ), - person.facebookUrl == null - ? SizedBox.shrink() - : Padding( - padding: - const EdgeInsets.only(right: 10.0, left: 10.0), - child: Stack( - children: [ - TextButton( - child: FaIcon( - FontAwesomeIcons.facebookF, - color: Color(0xFF3b5998), - ), - onPressed: () => - launchUrlString('${person.facebookUrl}'), - ), - ], - ), - ), - person.websiteUrl == null - ? SizedBox.shrink() - : Padding( - padding: - const EdgeInsets.only(right: 10.0, left: 10.0), - child: Stack( - children: [ - TextButton( - child: FaIcon( - FontAwesomeIcons.globe, - color: Color(0xFF0e76a8), - ), - onPressed: () => - launchUrlString('${person.websiteUrl}'), - ), - ], - ), - ), - ], - ), - ), + buildProfileImage(context), + SizedBox(width: 12), + buildProfileInfo(), + ], + ), + ], + ), + ); + } - person.websiteUrl == null && - person.facebookUrl == null && - person.instagramUrl == null && - person.snapchatUrl == null - ? SizedBox.shrink() - : Padding( - padding: const EdgeInsets.only( - top: 0.0, left: 20.0, bottom: 10.0, right: 20), - child: Divider( - height: 15, - thickness: 2, - ), - ), + Widget buildProfileImage(BuildContext context) { + return InkWell( + borderRadius: BorderRadius.circular(60), + onTap: () { + Navigator.of(context).push(PageRouteBuilder( + opaque: false, + pageBuilder: (BuildContext context, _, __) => + FullScreenImage(url: person.imageUrl))); + }, + child: CachedNetworkImage( + height: 60, + width: 60, + imageUrl: person.imageUrl, + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + shape: BoxShape.circle, + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), + ), + ), + placeholder: (context, url) => CircularProgressIndicator(), + errorWidget: (context, url, error) => Icon(Icons.error), + ), + ); + } - Padding( - padding: - const EdgeInsets.only(top: 20.0, left: 30.0, bottom: 0.0), - child: Text( - 'About me', - style: TextStyle( - color: Colors.grey[600], - fontSize: 18.0, - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only( - top: 0.0, left: 30.0, bottom: 0.0, right: 300), - child: Divider( - height: 15, - thickness: 2, - ), - ), - Padding( - padding: - const EdgeInsets.only(left: 30.0, right: 30.0, top: 5.0), - child: Text( - person.bio, - style: TextStyle(fontSize: 16.0), - ), - ), - person.websiteUrl == null && - person.facebookUrl == null && - person.instagramUrl == null && - person.snapchatUrl == null - ? SizedBox( - height: 40, - ) - : SizedBox.shrink(), + Widget buildProfileInfo() { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + width: Device.width - 150, + child: Text( + person.name, + maxLines: 2, + overflow: TextOverflow.ellipsis, + softWrap: false, + style: TextStyle( + fontSize: 22.0, + fontWeight: FontWeight.bold, + ), + ), + ), + SizedBox(height: 4), + buildLocationRow(), + ], + ); + } - Padding( - padding: - const EdgeInsets.only(top: 15.0, left: 30.0, right: 20.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - person.email == null - ? SizedBox.shrink() - : Container( - height: 70.0, - width: 70.0, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(30.0), - color: Colors.grey[200], - ), - child: RawMaterialButton( - onPressed: () { - launchUrlString('mailto:${person.email}'); - }, - shape: new RoundedRectangleBorder( - borderRadius: BorderRadius.circular(30.0)), - child: FaIcon( - FontAwesomeIcons.envelope, - color: Colors.black, - size: 30, - ))), - person.phoneNumber == null - ? SizedBox.shrink() - : Container( - height: 70.0, - width: 70.0, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(30.0), - color: Colors.grey[200], - ), - child: RawMaterialButton( - onPressed: () => - openwhatsapp(context, person.phoneNumber!), - shape: new RoundedRectangleBorder( - borderRadius: BorderRadius.circular(30.0)), - child: FaIcon( - FontAwesomeIcons.whatsapp, - color: Color( - 0xFF25D366, - ), - size: 40, - ), - )), - ], - ), - ), + Widget buildLocationRow() { + return SizedBox( + width: Device.width - 150, + child: Row( + children: [ + Text( + person.from, + maxLines: 2, + overflow: TextOverflow.ellipsis, + softWrap: false, + style: TextStyle( + fontWeight: FontWeight.w500, + fontSize: 14.0, + color: Colors.grey[600], + ), + ), + SizedBox(width: 2), + SvgPicture.asset( + 'assets/icons/flags/${person.fromFlag}.svg', + height: 15, + ), + SizedBox(width: 5), + FaIcon( + FontAwesomeIcons.arrowRightLong, + color: Colors.grey, + ), + SizedBox(width: 5), + Text( + person.to, + maxLines: 2, + overflow: TextOverflow.ellipsis, + softWrap: false, + style: TextStyle( + fontWeight: FontWeight.w500, + fontSize: 14.0, + color: Colors.grey[600], + ), + ), + SizedBox(width: 2), + if (person.toFlag != null) + SvgPicture.asset( + 'assets/icons/flags/${person.toFlag}.svg', + height: 15, + ), + ], + ), + ); + } - SizedBox( - height: 40, - ), - ], - ) + bool hasSocialMedia(Inbounds person) { + return person.websiteUrl != null || + person.facebookUrl != null || + person.instagramUrl != null || + person.snapchatUrl != null || + person.phoneNumber != null; + } + + Widget buildDivider() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Divider(height: 15, thickness: 2), + ); + } + + Widget buildSocialMediaRow() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 15), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + buildSocialMediaButton( + person.instagramUrl, + FontAwesomeIcons.instagram, + Color(0xFFbc2a8d), + ), + buildSocialMediaButton( + person.snapchatUrl, + FontAwesomeIcons.snapchat, + Color.fromARGB(221, 201, 198, 8), + ), + buildSocialMediaButton( + person.facebookUrl, + FontAwesomeIcons.facebookF, + Color(0xFF3b5998), + ), + buildSocialMediaButton( + person.websiteUrl, + FontAwesomeIcons.globe, + Color(0xFF0e76a8), + ), + ], + ), + ); + } + + Widget buildSocialMediaButton(String? url, IconData icon, Color color) { + if (url == null) return SizedBox.shrink(); + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 10), + child: TextButton( + child: FaIcon(icon, color: color), + onPressed: () => launchUrlString(url), + ), + ); + } + + Widget buildSectionTitle(String title) { + return Padding( + padding: const EdgeInsets.only(top: 20, left: 30, bottom: 0), + child: Text( + title, + style: TextStyle( + color: Colors.grey[600], + fontSize: 18.0, + fontWeight: FontWeight.bold, + ), + ), + ); + } + + Widget buildSectionDivider() { + return Padding( + padding: const EdgeInsets.only(left: 30, right: 300), + child: Divider(height: 15, thickness: 2), + ); + } + + Widget buildBio() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 5), + child: Text( + person.bio, + style: TextStyle(fontSize: 16.0), + ), + ); + } + + Widget buildContactButtons(context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 15), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + if (person.email != null) buildEmailButton(), + if (person.phoneNumber != null) buildWhatsAppButton(context), ], ), ); } + + Widget buildEmailButton() { + return buildContactButton( + onPressed: () => launchUrlString('mailto:${person.email}'), + icon: FontAwesomeIcons.envelope, + color: Colors.black, + ); + } + + Widget buildWhatsAppButton(context) { + return buildContactButton( + onPressed: () => openwhatsapp(context, person.phoneNumber!), + icon: FontAwesomeIcons.whatsapp, + color: Color(0xFF25D366), + iconSize: 40, + ); + } + + Widget buildContactButton({ + required VoidCallback onPressed, + required IconData icon, + required Color color, + double iconSize = 30, + }) { + return Container( + height: 70.0, + width: 70.0, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(30.0), + color: Colors.grey[200], + ), + child: RawMaterialButton( + onPressed: onPressed, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30.0), + ), + child: FaIcon( + icon, + color: color, + size: iconSize, + ), + ), + ); + } } diff --git a/lib/features/inbound/presentation/pages/long_term/information/flight_and_arrival.dart b/lib/features/inbound/presentation/pages/long_term/information/flight_and_arrival.dart index 8cc20d05..b797a355 100644 --- a/lib/features/inbound/presentation/pages/long_term/information/flight_and_arrival.dart +++ b/lib/features/inbound/presentation/pages/long_term/information/flight_and_arrival.dart @@ -12,11 +12,6 @@ class FlightAndArrivalPage extends StatefulWidget { } class _FlightAndArrivalPageState extends State { - @override - initState() { - super.initState(); - } - @override Widget build(BuildContext context) { return Scaffold( @@ -35,102 +30,80 @@ class _FlightAndArrivalPageState extends State { ), ), body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 15), children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'Flight', - style: TextStyle( - decoration: TextDecoration.underline, - fontSize: 14.0, - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: '\u2022', - style: TextStyle(fontWeight: FontWeight.bold)), - TextSpan( - text: - ' You should obtain a changeable open return airline ticket', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: '\u2022', - style: TextStyle(fontWeight: FontWeight.bold)), - TextSpan( - text: - ' Your arrival airport is Amsterdam (Schiphol) Airport', - ), - ])), - ), + buildSectionTitle('Flight'), + buildBulletPoint( + 'You should obtain a changeable open return airline ticket'), + buildBulletPoint( + 'Your arrival airport is Amsterdam (Schiphol) Airport'), + SizedBox(height: 25), + buildSectionTitle('Arrival'), + SizedBox(height: 30), + buildRotaryImage(), + buildUpdateText(), + SizedBox(height: 60), + ], + ), + ); + } - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'Arrival', - style: TextStyle( - decoration: TextDecoration.underline, - fontSize: 14.0, - fontWeight: FontWeight.bold), - ), - ), + Padding buildSectionTitle(String title) { + return Padding( + padding: const EdgeInsets.only(top: 25.0), + child: Text( + title, + style: TextStyle( + decoration: TextDecoration.underline, + fontSize: 14.0, + fontWeight: FontWeight.bold, + ), + ), + ); + } - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) + Padding buildBulletPoint(String text) { + return Padding( + padding: const EdgeInsets.only(top: 10.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('\u2022', style: TextStyle(fontWeight: FontWeight.bold)), + SizedBox(width: 5), + Expanded( + child: Text( + text, + style: Theme.of(context) + .textTheme + .bodyMedium! + .copyWith(fontSize: 14), + ), + ), ], ), ); } - @override - void dispose() { - super.dispose(); + Padding buildRotaryImage() { + return Padding( + padding: const EdgeInsets.only(top: 30.0), + child: Center( + child: Image.asset( + 'assets/image/rotary_blue.png', + height: 55.0, + ), + )); + } + + Padding buildUpdateText() { + return Padding( + padding: const EdgeInsets.only(top: 15.0), + child: Center( + child: Text( + 'Update: 31 May 2021', + style: TextStyle(color: Color(0xFF777777)), + ), + ), + ); } } diff --git a/lib/features/inbound/presentation/pages/long_term/information/insurance.dart b/lib/features/inbound/presentation/pages/long_term/information/insurance.dart index 60cba191..10c2a1b5 100644 --- a/lib/features/inbound/presentation/pages/long_term/information/insurance.dart +++ b/lib/features/inbound/presentation/pages/long_term/information/insurance.dart @@ -12,11 +12,6 @@ class InsurancePage extends StatefulWidget { } class _InsurancePageState extends State { - @override - initState() { - super.initState(); - } - @override Widget build(BuildContext context) { return Scaffold( @@ -29,76 +24,54 @@ class _InsurancePageState extends State { elevation: 0.0, leading: UniformBackButton(), title: Text( - 'Travel', + 'Insurance', textScaler: TextScaler.linear(1), style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), ), ), body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 15), children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'The insurance policy from the Netherlands is compulsory. We will pre-insure you, so you will be fully insured as soon as you will land at Amsterdam Schiphol airport up until you are leaving at the airport again. A copy of the Insurance Policy will be sent to you a few days before you leave your home country.', - ), - ])), - ), - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) + buildContentText( + 'The insurance policy from the Netherlands is compulsory. We will pre-insure you, so you will be fully insured as soon as you will land at Amsterdam Schiphol airport up until you are leaving at the airport again. A copy of the Insurance Policy will be sent to you a few days before you leave your home country.'), + buildRotaryImage(), + buildUpdateText(), + SizedBox(height: 60), ], ), ); } - @override - void dispose() { - super.dispose(); + Padding buildContentText(String text) { + return Padding( + padding: const EdgeInsets.only(top: 20.0), + child: Text( + text, + style: Theme.of(context).textTheme.bodyMedium!.copyWith(fontSize: 14), + ), + ); + } + + Padding buildRotaryImage() { + return Padding( + padding: const EdgeInsets.only(top: 30.0), + child: Center( + child: Image.asset( + 'assets/image/rotary_blue.png', + height: 55.0, + ), + )); + } + + Padding buildUpdateText() { + return Padding( + padding: const EdgeInsets.only(top: 15.0), + child: Center( + child: Text( + 'Update: 31 May 2021', + style: TextStyle(color: Color(0xFF777777)), + ), + ), + ); } } diff --git a/lib/features/inbound/presentation/pages/long_term/information/language.dart b/lib/features/inbound/presentation/pages/long_term/information/language.dart index 8b0e006f..5bb4f8b2 100644 --- a/lib/features/inbound/presentation/pages/long_term/information/language.dart +++ b/lib/features/inbound/presentation/pages/long_term/information/language.dart @@ -12,11 +12,6 @@ class LanguagePage extends StatefulWidget { } class _LanguagePageState extends State { - @override - initState() { - super.initState(); - } - @override Widget build(BuildContext context) { return Scaffold( @@ -29,91 +24,56 @@ class _LanguagePageState extends State { elevation: 0.0, leading: UniformBackButton(), title: Text( - 'Travel', + 'Language', textScaler: TextScaler.linear(1), style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), ), ), body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 15), children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'There’s no hiding it: Dutch is a very difficult language to learn. However, we do expect you to master the language and that within months after your arrival you will be fluent in our language. The MDJC will organize a DOC (Dutch Orientation Course) in September for the August group and one in Februari for the newbies. It will last 6 days and the program will focus on learning the Dutch language and will also give you an insight into our culture. You will work in small groups. Your fellow students will be all the other exchange students, so lots of fun included.', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'Your first host family will also help you to learn Dutch and you will receive books to start learning the language as soon as you are in the Netherlands.', - ), - ])), - ), - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) + buildContentText( + 'There’s no hiding it: Dutch is a very difficult language to learn. However, we do expect you to master the language and that within months after your arrival you will be fluent in our language. The MDJC will organize a DOC (Dutch Orientation Course) in September for the August group and one in February for the newbies. It will last 6 days and the program will focus on learning the Dutch language and will also give you an insight into our culture. You will work in small groups. Your fellow students will be all the other exchange students, so lots of fun included.'), + buildContentText( + 'Your first host family will also help you to learn Dutch and you will receive books to start learning the language as soon as you are in the Netherlands.'), + buildRotaryImage(), + buildUpdateText(), + SizedBox(height: 60), ], ), ); } - @override - void dispose() { - super.dispose(); + Padding buildContentText(String text) { + return Padding( + padding: const EdgeInsets.only(top: 20.0), + child: Text( + text, + style: Theme.of(context).textTheme.bodyMedium!.copyWith(fontSize: 14), + ), + ); + } + + Padding buildRotaryImage() { + return Padding( + padding: const EdgeInsets.only(top: 30.0), + child: Center( + child: Image.asset( + 'assets/image/rotary_blue.png', + height: 55.0, + ), + )); + } + + Padding buildUpdateText() { + return Padding( + padding: const EdgeInsets.only(top: 15.0), + child: Center( + child: Text( + 'Update: 31 May 2021', + style: TextStyle(color: Color(0xFF777777)), + ), + ), + ); } } diff --git a/lib/features/inbound/presentation/pages/long_term/information/travel.dart b/lib/features/inbound/presentation/pages/long_term/information/travel.dart index 07e29889..63143383 100644 --- a/lib/features/inbound/presentation/pages/long_term/information/travel.dart +++ b/lib/features/inbound/presentation/pages/long_term/information/travel.dart @@ -35,106 +35,60 @@ class _TravelPageState extends State { ), ), body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 15), children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'The rules of Rotary Youth Exchange do not allow travelling outside the scope of the Rotary program. However, you may travel with your host family or members of your host club or other Rotarians, or other authorized persons (for instance on a school trip), but ', - ), - TextSpan( - text: 'not alone.', - style: TextStyle(fontWeight: FontWeight.bold)), - TextSpan( - text: - ' This rule applies for both travelling inside the Netherlands as well as abroad.', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'Visits to family or friends abroad are not permitted!', - style: TextStyle(fontWeight: FontWeight.bold)), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'One of your host families might suggest to participate in a holiday somewhere abroad. This is usually OK when you will have a written approval from your parents.', - ), - ])), - ), - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) + buildContentText( + 'The rules of Rotary Youth Exchange do not allow travelling outside the scope of the Rotary program. However, you may travel with your host family or members of your host club or other Rotarians, or other authorized persons (for instance on a school trip), but not alone. This rule applies for both travelling inside the Netherlands as well as abroad.', + ), + buildContentText( + 'Visits to family or friends abroad are not permitted!', + isBold: true, + ), + buildContentText( + 'One of your host families might suggest to participate in a holiday somewhere abroad. This is usually OK when you will have a written approval from your parents.', + ), + buildRotaryImage(), + buildUpdateText(), + SizedBox(height: 60), ], ), ); } - @override - void dispose() { - super.dispose(); + Padding buildContentText(String text, {bool isBold = false}) { + return Padding( + padding: const EdgeInsets.only(top: 10.0), + child: Text( + text, + style: Theme.of(context).textTheme.bodyMedium!.copyWith( + fontSize: 14, + fontWeight: isBold ? FontWeight.bold : FontWeight.normal, + ), + ), + ); + } + + Padding buildRotaryImage() { + return Padding( + padding: const EdgeInsets.only(top: 30.0), + child: Center( + child: Image.asset( + 'assets/image/rotary_blue.png', + height: 55.0, + ), + ), + ); + } + + Padding buildUpdateText() { + return Padding( + padding: const EdgeInsets.only(top: 15.0), + child: Center( + child: Text( + 'Update: 31 May 2021', + style: TextStyle(color: Color(0xFF777777)), + ), + ), + ); } } diff --git a/lib/features/inbound/presentation/pages/long_term/information/welcome_in_the_netherlands.dart b/lib/features/inbound/presentation/pages/long_term/information/welcome_in_the_netherlands.dart index df2f275d..423d11d7 100644 --- a/lib/features/inbound/presentation/pages/long_term/information/welcome_in_the_netherlands.dart +++ b/lib/features/inbound/presentation/pages/long_term/information/welcome_in_the_netherlands.dart @@ -15,7 +15,7 @@ class WelcomeInTheNetherlandsPage extends StatefulWidget { class _WelcomeInTheNetherlandsPageState extends State { @override - initState() { + void initState() { super.initState(); } @@ -37,103 +37,63 @@ class _WelcomeInTheNetherlandsPageState ), ), body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 15), children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: 'Welcome to the Netherlands!', - style: TextStyle(fontWeight: FontWeight.bold)), - TextSpan( - text: - ' We are very excited about your upcoming stay with us and looking forward to meeting you. We hope and believe that you will enjoy your stay with us. We have an exciting and active Rotary International Youth Exchange Program with approx. 35-50 exchange students arriving in our country. You will make friends from all over the world, in addition to making many Dutch friends in your school and Rotary.', - ), - ])), - ), - - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'An exchange year is one of the best years of your life, a wonderful experience in a new culture, with a new language but also with some rules to make sure that your stay will be both enjoyable for you and us alike. These rules are consistent with the International Rotary rules.', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'Please remember that under all circumstances you are an ambassador of Rotary and will have to behave accordingly. Our motto: Be grateful, be on purpose, be of service, be here now, be first, be curious! Also you will be an ambassador of your country. Both functions will be with you at all times and you will be regarded and judged as such at all times during your exchange!', - ), - ])), - ), - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) + buildContentText( + 'Welcome to the Netherlands!', + isBold: true, + ), + buildContentText( + 'We are very excited about your upcoming stay with us and looking forward to meeting you. We hope and believe that you will enjoy your stay with us. We have an exciting and active Rotary International Youth Exchange Program with approx. 35-50 exchange students arriving in our country. You will make friends from all over the world, in addition to making many Dutch friends in your school and Rotary.', + ), + buildContentText( + 'An exchange year is one of the best years of your life, a wonderful experience in a new culture, with a new language but also with some rules to make sure that your stay will be both enjoyable for you and us alike. These rules are consistent with the International Rotary rules.', + ), + buildContentText( + 'Please remember that under all circumstances you are an ambassador of Rotary and will have to behave accordingly. Our motto: Be grateful, be on purpose, be of service, be here now, be first, be curious! Also you will be an ambassador of your country. Both functions will be with you at all times and you will be regarded and judged as such at all times during your exchange!', + ), + buildRotaryImage(), + buildUpdateText(), + SizedBox(height: 60), ], ), ); } - @override - void dispose() { - super.dispose(); + Padding buildContentText(String text, {bool isBold = false}) { + return Padding( + padding: const EdgeInsets.only(top: 10.0), + child: Text( + text, + style: Theme.of(context).textTheme.bodyMedium!.copyWith( + fontSize: 14, + fontWeight: isBold ? FontWeight.bold : FontWeight.normal, + ), + ), + ); + } + + Padding buildRotaryImage() { + return Padding( + padding: const EdgeInsets.only(top: 30.0), + child: Center( + child: Image.asset( + 'assets/image/rotary_blue.png', + height: 55.0, + ), + ), + ); + } + + Padding buildUpdateText() { + return Padding( + padding: const EdgeInsets.only(top: 15.0), + child: Center( + child: Text( + 'Update: 31 May 2021', + style: TextStyle(color: Color(0xFF777777)), + ), + ), + ); } } diff --git a/lib/features/inbound/presentation/pages/long_term/long_term_inbound_page.dart b/lib/features/inbound/presentation/pages/long_term/long_term_inbound_page.dart index e34ade54..69373f56 100644 --- a/lib/features/inbound/presentation/pages/long_term/long_term_inbound_page.dart +++ b/lib/features/inbound/presentation/pages/long_term/long_term_inbound_page.dart @@ -6,7 +6,6 @@ import 'package:flutter/services.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; // 🌎 Project imports: -import 'package:rotary_nl_rye/core/presentation/widgets/show_alert_dialog.dart'; import 'package:rotary_nl_rye/core/prop.dart'; import 'package:rotary_nl_rye/features/inbound/presentation/pages/long_term/class_of/class_of.dart'; import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; @@ -42,134 +41,71 @@ class _LongTermExchangeInboundPageState ), ), body: ListView( - shrinkWrap: true, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: - // const EdgeInsets.only(left: 20.0, right: 20.0, top: 20.0), - // child: Text( - // 'Kandidaten \n\nWat leuk dat je geïnteresseerd in de mogelijkheden van Rotary voor jaaruitwisseling. Wereldwijd gaan er jaarlijks zo’n 8.000 studenten via Rotary op jaaruitwisseling, een hele organisatie. Wie weet ben jij komend schooljaar een van die studenten.', - // style: TextStyle(fontSize: 16.0), - // ), - // ), - SizedBox( - height: 20, - ), - Divider( - height: 15, - thickness: 2, - ), - buildInboundOptionRow(context, 'Class of 2023-2024', - FontAwesomeIcons.peopleGroup, ClassOfPageInbounds()), - Divider( - height: 15, - thickness: 2, - ), - buildInboundOptionRow(context, 'Welcome to the Netherlands!', - FontAwesomeIcons.doorOpen, WelcomeInTheNetherlandsPage()), - Divider( - height: 15, - thickness: 2, - ), - buildInboundOptionRow(context, 'Flight and Arrival', - FontAwesomeIcons.plane, FlightAndArrivalPage()), - Divider( - height: 15, - thickness: 2, - ), - buildInboundOptionRow(context, 'Language', - FontAwesomeIcons.language, LanguagePage()), - Divider( - height: 15, - thickness: 2, - ), - - buildInboundOptionRow(context, 'Insurance', - FontAwesomeIcons.umbrella, InsurancePage()), - Divider( - height: 15, - thickness: 2, - ), - buildInboundOptionRow( - context, 'Travel', FontAwesomeIcons.passport, TravelPage()), - Divider( - height: 15, - thickness: 2, - ), - // the end - SizedBox( - height: 20, - ), - ], - ) + padding: EdgeInsets.symmetric(horizontal: 8.0, vertical: 20.0), + children: [ + Divider( + height: 15, + thickness: 2, + ), + buildInboundOptionRow(context, 'Class of 2023-2024', + FontAwesomeIcons.peopleGroup, ClassOfPageInbounds()), + Divider( + height: 15, + thickness: 2, + ), + buildInboundOptionRow(context, 'Welcome to the Netherlands!', + FontAwesomeIcons.doorOpen, WelcomeInTheNetherlandsPage()), + Divider( + height: 15, + thickness: 2, + ), + buildInboundOptionRow(context, 'Flight and Arrival', + FontAwesomeIcons.plane, FlightAndArrivalPage()), + Divider( + height: 15, + thickness: 2, + ), + buildInboundOptionRow( + context, 'Language', FontAwesomeIcons.language, LanguagePage()), + Divider( + height: 15, + thickness: 2, + ), + buildInboundOptionRow( + context, 'Insurance', FontAwesomeIcons.umbrella, InsurancePage()), + Divider( + height: 15, + thickness: 2, + ), + buildInboundOptionRow( + context, 'Travel', FontAwesomeIcons.passport, TravelPage()), + Divider( + height: 15, + thickness: 2, + ), ], ), ); } - GestureDetector buildInboundOptionRow( - BuildContext context, - String title, - IconData icon, - pushTo, - ) { + Widget buildInboundOptionRow( + BuildContext context, String title, IconData icon, Widget pushTo) { return GestureDetector( - child: Padding( - padding: EdgeInsets.only(top: 8.0, bottom: 8.0, left: 8.0), + onTap: () { + Navigator.push( + context, MaterialPageRoute(builder: (context) => pushTo)); + }, child: ListTile( - leading: Padding( - padding: EdgeInsets.zero, - child: Container( - child: FaIcon( - icon, - color: Palette.lightIndigo, - size: 27, - ), - ), - ), - title: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - SizedBox( - width: Device.width - 130, - child: Text(title, - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - fontSize: 15, - color: Palette.grey, - fontWeight: FontWeight.w500, - )), - ), - Icon( - Icons.arrow_forward_ios, - color: Palette.grey, - ), - ], + leading: FaIcon(icon, color: Palette.lightIndigo, size: 27), + title: Text( + title, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 15, color: Palette.grey, fontWeight: FontWeight.w500), ), - onTap: () { - if (pushTo != null) { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => pushTo), - ); - } else { - String title = 'Comming soon'; - String message = 'This page is not yet ready'; - showMaterialDialog( - context, - title, - message, - null, - ); - } - }, + trailing: Icon(Icons.arrow_forward_ios, color: Palette.grey), ), - )); + ); } } diff --git a/lib/features/inbound/presentation/pages/short_term/camps_and_tours/information/flight_and_arrival.dart b/lib/features/inbound/presentation/pages/short_term/camps_and_tours/information/flight_and_arrival.dart deleted file mode 100644 index 8cc20d05..00000000 --- a/lib/features/inbound/presentation/pages/short_term/camps_and_tours/information/flight_and_arrival.dart +++ /dev/null @@ -1,136 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -class FlightAndArrivalPage extends StatefulWidget { - @override - _FlightAndArrivalPageState createState() => _FlightAndArrivalPageState(); -} - -class _FlightAndArrivalPageState extends State { - @override - initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Flight and Arrival', - textScaler: TextScaler.linear(1), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'Flight', - style: TextStyle( - decoration: TextDecoration.underline, - fontSize: 14.0, - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: '\u2022', - style: TextStyle(fontWeight: FontWeight.bold)), - TextSpan( - text: - ' You should obtain a changeable open return airline ticket', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: '\u2022', - style: TextStyle(fontWeight: FontWeight.bold)), - TextSpan( - text: - ' Your arrival airport is Amsterdam (Schiphol) Airport', - ), - ])), - ), - - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'Arrival', - style: TextStyle( - decoration: TextDecoration.underline, - fontSize: 14.0, - fontWeight: FontWeight.bold), - ), - ), - - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], - ), - ); - } - - @override - void dispose() { - super.dispose(); - } -} diff --git a/lib/features/inbound/presentation/pages/short_term/camps_and_tours/information/insurance.dart b/lib/features/inbound/presentation/pages/short_term/camps_and_tours/information/insurance.dart deleted file mode 100644 index 60cba191..00000000 --- a/lib/features/inbound/presentation/pages/short_term/camps_and_tours/information/insurance.dart +++ /dev/null @@ -1,104 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -class InsurancePage extends StatefulWidget { - @override - _InsurancePageState createState() => _InsurancePageState(); -} - -class _InsurancePageState extends State { - @override - initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Travel', - textScaler: TextScaler.linear(1), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'The insurance policy from the Netherlands is compulsory. We will pre-insure you, so you will be fully insured as soon as you will land at Amsterdam Schiphol airport up until you are leaving at the airport again. A copy of the Insurance Policy will be sent to you a few days before you leave your home country.', - ), - ])), - ), - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], - ), - ); - } - - @override - void dispose() { - super.dispose(); - } -} diff --git a/lib/features/inbound/presentation/pages/short_term/camps_and_tours/information/language.dart b/lib/features/inbound/presentation/pages/short_term/camps_and_tours/information/language.dart deleted file mode 100644 index 8b0e006f..00000000 --- a/lib/features/inbound/presentation/pages/short_term/camps_and_tours/information/language.dart +++ /dev/null @@ -1,119 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -class LanguagePage extends StatefulWidget { - @override - _LanguagePageState createState() => _LanguagePageState(); -} - -class _LanguagePageState extends State { - @override - initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Travel', - textScaler: TextScaler.linear(1), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'There’s no hiding it: Dutch is a very difficult language to learn. However, we do expect you to master the language and that within months after your arrival you will be fluent in our language. The MDJC will organize a DOC (Dutch Orientation Course) in September for the August group and one in Februari for the newbies. It will last 6 days and the program will focus on learning the Dutch language and will also give you an insight into our culture. You will work in small groups. Your fellow students will be all the other exchange students, so lots of fun included.', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'Your first host family will also help you to learn Dutch and you will receive books to start learning the language as soon as you are in the Netherlands.', - ), - ])), - ), - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], - ), - ); - } - - @override - void dispose() { - super.dispose(); - } -} diff --git a/lib/features/inbound/presentation/pages/short_term/camps_and_tours/information/travel.dart b/lib/features/inbound/presentation/pages/short_term/camps_and_tours/information/travel.dart deleted file mode 100644 index 07e29889..00000000 --- a/lib/features/inbound/presentation/pages/short_term/camps_and_tours/information/travel.dart +++ /dev/null @@ -1,140 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -class TravelPage extends StatefulWidget { - @override - _TravelPageState createState() => _TravelPageState(); -} - -class _TravelPageState extends State { - @override - initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Travel', - textScaler: TextScaler.linear(1), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'The rules of Rotary Youth Exchange do not allow travelling outside the scope of the Rotary program. However, you may travel with your host family or members of your host club or other Rotarians, or other authorized persons (for instance on a school trip), but ', - ), - TextSpan( - text: 'not alone.', - style: TextStyle(fontWeight: FontWeight.bold)), - TextSpan( - text: - ' This rule applies for both travelling inside the Netherlands as well as abroad.', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'Visits to family or friends abroad are not permitted!', - style: TextStyle(fontWeight: FontWeight.bold)), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'One of your host families might suggest to participate in a holiday somewhere abroad. This is usually OK when you will have a written approval from your parents.', - ), - ])), - ), - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], - ), - ); - } - - @override - void dispose() { - super.dispose(); - } -} diff --git a/lib/features/inbound/presentation/pages/short_term/camps_and_tours/information/welcome_in_the_netherlands.dart b/lib/features/inbound/presentation/pages/short_term/camps_and_tours/information/welcome_in_the_netherlands.dart deleted file mode 100644 index df2f275d..00000000 --- a/lib/features/inbound/presentation/pages/short_term/camps_and_tours/information/welcome_in_the_netherlands.dart +++ /dev/null @@ -1,139 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -class WelcomeInTheNetherlandsPage extends StatefulWidget { - @override - _WelcomeInTheNetherlandsPageState createState() => - _WelcomeInTheNetherlandsPageState(); -} - -class _WelcomeInTheNetherlandsPageState - extends State { - @override - initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Welcome to the Netherlands!', - textScaler: TextScaler.linear(1), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: 'Welcome to the Netherlands!', - style: TextStyle(fontWeight: FontWeight.bold)), - TextSpan( - text: - ' We are very excited about your upcoming stay with us and looking forward to meeting you. We hope and believe that you will enjoy your stay with us. We have an exciting and active Rotary International Youth Exchange Program with approx. 35-50 exchange students arriving in our country. You will make friends from all over the world, in addition to making many Dutch friends in your school and Rotary.', - ), - ])), - ), - - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'An exchange year is one of the best years of your life, a wonderful experience in a new culture, with a new language but also with some rules to make sure that your stay will be both enjoyable for you and us alike. These rules are consistent with the International Rotary rules.', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'Please remember that under all circumstances you are an ambassador of Rotary and will have to behave accordingly. Our motto: Be grateful, be on purpose, be of service, be here now, be first, be curious! Also you will be an ambassador of your country. Both functions will be with you at all times and you will be regarded and judged as such at all times during your exchange!', - ), - ])), - ), - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], - ), - ); - } - - @override - void dispose() { - super.dispose(); - } -} diff --git a/lib/features/inbound/presentation/pages/short_term/family_to_family/information/flight_and_arrival.dart b/lib/features/inbound/presentation/pages/short_term/family_to_family/information/flight_and_arrival.dart deleted file mode 100644 index 8cc20d05..00000000 --- a/lib/features/inbound/presentation/pages/short_term/family_to_family/information/flight_and_arrival.dart +++ /dev/null @@ -1,136 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -class FlightAndArrivalPage extends StatefulWidget { - @override - _FlightAndArrivalPageState createState() => _FlightAndArrivalPageState(); -} - -class _FlightAndArrivalPageState extends State { - @override - initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Flight and Arrival', - textScaler: TextScaler.linear(1), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'Flight', - style: TextStyle( - decoration: TextDecoration.underline, - fontSize: 14.0, - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: '\u2022', - style: TextStyle(fontWeight: FontWeight.bold)), - TextSpan( - text: - ' You should obtain a changeable open return airline ticket', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: '\u2022', - style: TextStyle(fontWeight: FontWeight.bold)), - TextSpan( - text: - ' Your arrival airport is Amsterdam (Schiphol) Airport', - ), - ])), - ), - - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'Arrival', - style: TextStyle( - decoration: TextDecoration.underline, - fontSize: 14.0, - fontWeight: FontWeight.bold), - ), - ), - - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], - ), - ); - } - - @override - void dispose() { - super.dispose(); - } -} diff --git a/lib/features/inbound/presentation/pages/short_term/family_to_family/information/insurance.dart b/lib/features/inbound/presentation/pages/short_term/family_to_family/information/insurance.dart deleted file mode 100644 index 60cba191..00000000 --- a/lib/features/inbound/presentation/pages/short_term/family_to_family/information/insurance.dart +++ /dev/null @@ -1,104 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -class InsurancePage extends StatefulWidget { - @override - _InsurancePageState createState() => _InsurancePageState(); -} - -class _InsurancePageState extends State { - @override - initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Travel', - textScaler: TextScaler.linear(1), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'The insurance policy from the Netherlands is compulsory. We will pre-insure you, so you will be fully insured as soon as you will land at Amsterdam Schiphol airport up until you are leaving at the airport again. A copy of the Insurance Policy will be sent to you a few days before you leave your home country.', - ), - ])), - ), - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], - ), - ); - } - - @override - void dispose() { - super.dispose(); - } -} diff --git a/lib/features/inbound/presentation/pages/short_term/family_to_family/information/language.dart b/lib/features/inbound/presentation/pages/short_term/family_to_family/information/language.dart deleted file mode 100644 index 8b0e006f..00000000 --- a/lib/features/inbound/presentation/pages/short_term/family_to_family/information/language.dart +++ /dev/null @@ -1,119 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -class LanguagePage extends StatefulWidget { - @override - _LanguagePageState createState() => _LanguagePageState(); -} - -class _LanguagePageState extends State { - @override - initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Travel', - textScaler: TextScaler.linear(1), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'There’s no hiding it: Dutch is a very difficult language to learn. However, we do expect you to master the language and that within months after your arrival you will be fluent in our language. The MDJC will organize a DOC (Dutch Orientation Course) in September for the August group and one in Februari for the newbies. It will last 6 days and the program will focus on learning the Dutch language and will also give you an insight into our culture. You will work in small groups. Your fellow students will be all the other exchange students, so lots of fun included.', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'Your first host family will also help you to learn Dutch and you will receive books to start learning the language as soon as you are in the Netherlands.', - ), - ])), - ), - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], - ), - ); - } - - @override - void dispose() { - super.dispose(); - } -} diff --git a/lib/features/inbound/presentation/pages/short_term/family_to_family/information/travel.dart b/lib/features/inbound/presentation/pages/short_term/family_to_family/information/travel.dart deleted file mode 100644 index 07e29889..00000000 --- a/lib/features/inbound/presentation/pages/short_term/family_to_family/information/travel.dart +++ /dev/null @@ -1,140 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -class TravelPage extends StatefulWidget { - @override - _TravelPageState createState() => _TravelPageState(); -} - -class _TravelPageState extends State { - @override - initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Travel', - textScaler: TextScaler.linear(1), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'The rules of Rotary Youth Exchange do not allow travelling outside the scope of the Rotary program. However, you may travel with your host family or members of your host club or other Rotarians, or other authorized persons (for instance on a school trip), but ', - ), - TextSpan( - text: 'not alone.', - style: TextStyle(fontWeight: FontWeight.bold)), - TextSpan( - text: - ' This rule applies for both travelling inside the Netherlands as well as abroad.', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'Visits to family or friends abroad are not permitted!', - style: TextStyle(fontWeight: FontWeight.bold)), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'One of your host families might suggest to participate in a holiday somewhere abroad. This is usually OK when you will have a written approval from your parents.', - ), - ])), - ), - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], - ), - ); - } - - @override - void dispose() { - super.dispose(); - } -} diff --git a/lib/features/inbound/presentation/pages/short_term/family_to_family/information/welcome_in_the_netherlands.dart b/lib/features/inbound/presentation/pages/short_term/family_to_family/information/welcome_in_the_netherlands.dart deleted file mode 100644 index df2f275d..00000000 --- a/lib/features/inbound/presentation/pages/short_term/family_to_family/information/welcome_in_the_netherlands.dart +++ /dev/null @@ -1,139 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -class WelcomeInTheNetherlandsPage extends StatefulWidget { - @override - _WelcomeInTheNetherlandsPageState createState() => - _WelcomeInTheNetherlandsPageState(); -} - -class _WelcomeInTheNetherlandsPageState - extends State { - @override - initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Welcome to the Netherlands!', - textScaler: TextScaler.linear(1), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: 'Welcome to the Netherlands!', - style: TextStyle(fontWeight: FontWeight.bold)), - TextSpan( - text: - ' We are very excited about your upcoming stay with us and looking forward to meeting you. We hope and believe that you will enjoy your stay with us. We have an exciting and active Rotary International Youth Exchange Program with approx. 35-50 exchange students arriving in our country. You will make friends from all over the world, in addition to making many Dutch friends in your school and Rotary.', - ), - ])), - ), - - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'An exchange year is one of the best years of your life, a wonderful experience in a new culture, with a new language but also with some rules to make sure that your stay will be both enjoyable for you and us alike. These rules are consistent with the International Rotary rules.', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'Please remember that under all circumstances you are an ambassador of Rotary and will have to behave accordingly. Our motto: Be grateful, be on purpose, be of service, be here now, be first, be curious! Also you will be an ambassador of your country. Both functions will be with you at all times and you will be regarded and judged as such at all times during your exchange!', - ), - ])), - ), - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], - ), - ); - } - - @override - void dispose() { - super.dispose(); - } -} diff --git a/lib/features/inbound/presentation/pages/short_term/ngse/information/flight_and_arrival.dart b/lib/features/inbound/presentation/pages/short_term/ngse/information/flight_and_arrival.dart deleted file mode 100644 index 8cc20d05..00000000 --- a/lib/features/inbound/presentation/pages/short_term/ngse/information/flight_and_arrival.dart +++ /dev/null @@ -1,136 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -class FlightAndArrivalPage extends StatefulWidget { - @override - _FlightAndArrivalPageState createState() => _FlightAndArrivalPageState(); -} - -class _FlightAndArrivalPageState extends State { - @override - initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Flight and Arrival', - textScaler: TextScaler.linear(1), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'Flight', - style: TextStyle( - decoration: TextDecoration.underline, - fontSize: 14.0, - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: '\u2022', - style: TextStyle(fontWeight: FontWeight.bold)), - TextSpan( - text: - ' You should obtain a changeable open return airline ticket', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: '\u2022', - style: TextStyle(fontWeight: FontWeight.bold)), - TextSpan( - text: - ' Your arrival airport is Amsterdam (Schiphol) Airport', - ), - ])), - ), - - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'Arrival', - style: TextStyle( - decoration: TextDecoration.underline, - fontSize: 14.0, - fontWeight: FontWeight.bold), - ), - ), - - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], - ), - ); - } - - @override - void dispose() { - super.dispose(); - } -} diff --git a/lib/features/inbound/presentation/pages/short_term/ngse/information/insurance.dart b/lib/features/inbound/presentation/pages/short_term/ngse/information/insurance.dart deleted file mode 100644 index 60cba191..00000000 --- a/lib/features/inbound/presentation/pages/short_term/ngse/information/insurance.dart +++ /dev/null @@ -1,104 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -class InsurancePage extends StatefulWidget { - @override - _InsurancePageState createState() => _InsurancePageState(); -} - -class _InsurancePageState extends State { - @override - initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Travel', - textScaler: TextScaler.linear(1), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'The insurance policy from the Netherlands is compulsory. We will pre-insure you, so you will be fully insured as soon as you will land at Amsterdam Schiphol airport up until you are leaving at the airport again. A copy of the Insurance Policy will be sent to you a few days before you leave your home country.', - ), - ])), - ), - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], - ), - ); - } - - @override - void dispose() { - super.dispose(); - } -} diff --git a/lib/features/inbound/presentation/pages/short_term/ngse/information/language.dart b/lib/features/inbound/presentation/pages/short_term/ngse/information/language.dart deleted file mode 100644 index 8b0e006f..00000000 --- a/lib/features/inbound/presentation/pages/short_term/ngse/information/language.dart +++ /dev/null @@ -1,119 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -class LanguagePage extends StatefulWidget { - @override - _LanguagePageState createState() => _LanguagePageState(); -} - -class _LanguagePageState extends State { - @override - initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Travel', - textScaler: TextScaler.linear(1), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'There’s no hiding it: Dutch is a very difficult language to learn. However, we do expect you to master the language and that within months after your arrival you will be fluent in our language. The MDJC will organize a DOC (Dutch Orientation Course) in September for the August group and one in Februari for the newbies. It will last 6 days and the program will focus on learning the Dutch language and will also give you an insight into our culture. You will work in small groups. Your fellow students will be all the other exchange students, so lots of fun included.', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'Your first host family will also help you to learn Dutch and you will receive books to start learning the language as soon as you are in the Netherlands.', - ), - ])), - ), - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], - ), - ); - } - - @override - void dispose() { - super.dispose(); - } -} diff --git a/lib/features/inbound/presentation/pages/short_term/ngse/information/travel.dart b/lib/features/inbound/presentation/pages/short_term/ngse/information/travel.dart deleted file mode 100644 index 07e29889..00000000 --- a/lib/features/inbound/presentation/pages/short_term/ngse/information/travel.dart +++ /dev/null @@ -1,140 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -class TravelPage extends StatefulWidget { - @override - _TravelPageState createState() => _TravelPageState(); -} - -class _TravelPageState extends State { - @override - initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Travel', - textScaler: TextScaler.linear(1), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'The rules of Rotary Youth Exchange do not allow travelling outside the scope of the Rotary program. However, you may travel with your host family or members of your host club or other Rotarians, or other authorized persons (for instance on a school trip), but ', - ), - TextSpan( - text: 'not alone.', - style: TextStyle(fontWeight: FontWeight.bold)), - TextSpan( - text: - ' This rule applies for both travelling inside the Netherlands as well as abroad.', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'Visits to family or friends abroad are not permitted!', - style: TextStyle(fontWeight: FontWeight.bold)), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'One of your host families might suggest to participate in a holiday somewhere abroad. This is usually OK when you will have a written approval from your parents.', - ), - ])), - ), - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], - ), - ); - } - - @override - void dispose() { - super.dispose(); - } -} diff --git a/lib/features/inbound/presentation/pages/short_term/ngse/information/welcome_in_the_netherlands.dart b/lib/features/inbound/presentation/pages/short_term/ngse/information/welcome_in_the_netherlands.dart deleted file mode 100644 index df2f275d..00000000 --- a/lib/features/inbound/presentation/pages/short_term/ngse/information/welcome_in_the_netherlands.dart +++ /dev/null @@ -1,139 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -class WelcomeInTheNetherlandsPage extends StatefulWidget { - @override - _WelcomeInTheNetherlandsPageState createState() => - _WelcomeInTheNetherlandsPageState(); -} - -class _WelcomeInTheNetherlandsPageState - extends State { - @override - initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Welcome to the Netherlands!', - textScaler: TextScaler.linear(1), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: 'Welcome to the Netherlands!', - style: TextStyle(fontWeight: FontWeight.bold)), - TextSpan( - text: - ' We are very excited about your upcoming stay with us and looking forward to meeting you. We hope and believe that you will enjoy your stay with us. We have an exciting and active Rotary International Youth Exchange Program with approx. 35-50 exchange students arriving in our country. You will make friends from all over the world, in addition to making many Dutch friends in your school and Rotary.', - ), - ])), - ), - - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'An exchange year is one of the best years of your life, a wonderful experience in a new culture, with a new language but also with some rules to make sure that your stay will be both enjoyable for you and us alike. These rules are consistent with the International Rotary rules.', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'Please remember that under all circumstances you are an ambassador of Rotary and will have to behave accordingly. Our motto: Be grateful, be on purpose, be of service, be here now, be first, be curious! Also you will be an ambassador of your country. Both functions will be with you at all times and you will be regarded and judged as such at all times during your exchange!', - ), - ])), - ), - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], - ), - ); - } - - @override - void dispose() { - super.dispose(); - } -} diff --git a/lib/features/news/presentation/pages/news_page.dart b/lib/features/news/presentation/pages/news_page.dart index 187b8ddb..6eeaca39 100644 --- a/lib/features/news/presentation/pages/news_page.dart +++ b/lib/features/news/presentation/pages/news_page.dart @@ -9,59 +9,19 @@ import 'package:shared_preferences/shared_preferences.dart'; // 🌎 Project imports: import 'package:rotary_nl_rye/core/domain/news.dart'; import 'package:rotary_nl_rye/features/news/presentation/pages/non_pdf_news.dart'; +import 'package:rotary_nl_rye/features/news/presentation/widgets/news_card.dart'; import 'package:rotary_nl_rye/features/news/presentation/widgets/pdf_viewer.dart'; import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; import '../../../../core/domain/entities/news.dart'; import '../../../../core/prop.dart'; class NewsPage extends StatefulWidget { - // final News news; - -// NewsPage({required this.news}); - @override _NewsPageState createState() => _NewsPageState(); } class _NewsPageState extends State { final NewsBloc _newsBloc = NewsBloc(); - //_NewsPageState({required News news}) : _news = news; - //final News _news; - // List _stories = []; - // bool _isLoading = true; - - //Fetch content from the json file - // Future readJson(String url) async { - // final response = await data.getDataNews(url); - // //await rootBundle.loadString('assets/test/news.json'); - // final info = await json.decode(response); - // setState(() { - // _stories = info["news"]; - // _isLoading = false; - // }); - // } - // - // _updateNews(News news) { - // readJson(news.jsonUrl); - // } - - // late List data; - // late List imageList = []; - - // Future fetchDataFromApi() async { - // var jsonData = await http.get(Uri.parse( - // "https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/news/new-header.json")); - // var fetchData = jsonDecode(jsonData.body); - - // setState(() { - // data = fetchData; - // data.forEach((element) { - // imageList.add(element); - // }); - // }); - // // print(imageList); - // return "Success"; - // } @override void initState() { @@ -92,10 +52,11 @@ class _NewsPageState extends State { backgroundColor: Colors.transparent, elevation: 0.0, leading: UniformBackButton(), - title: Text('News', - textScaler: TextScaler.linear(1.2), - style: - TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold)), + title: Text( + 'News', + textScaler: TextScaler.linear(1.2), + style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), + ), ), body: SingleChildScrollView( padding: const EdgeInsets.symmetric(horizontal: 15), @@ -146,14 +107,12 @@ class _NewsPageState extends State { return SizedBox( height: MediaQuery.of(context).size.height * 0.64, child: ListView.separated( - // Use ListView.separated for easy spacing itemCount: snapshot.data!.length, itemBuilder: (context, index) => GestureDetector( onTap: () => _handleNewsTap(context, snapshot.data![index]), child: NewsCard(news: snapshot.data![index]), ), - separatorBuilder: (context, index) => - SizedBox(height: 10), // Spacing between items + separatorBuilder: (context, index) => SizedBox(height: 10), ), ); } else if (snapshot.hasError) { @@ -176,63 +135,3 @@ class _NewsPageState extends State { } } } - -class NewsCard extends StatelessWidget { - final News news; - - const NewsCard({Key? key, required this.news}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - decoration: BoxDecoration( - color: Palette.themeShadeColor, - borderRadius: const BorderRadius.all(Radius.circular(14)), - ), - child: Row( - children: [ - CachedNetworkImage( - width: MediaQuery.of(context).size.width * 0.4, - height: 120, - imageUrl: news.images, - imageBuilder: (context, imageProvider) => Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(14), - image: - DecorationImage(image: imageProvider, fit: BoxFit.contain), - ), - ), - placeholder: (context, url) => - const Center(child: CircularProgressIndicator()), - errorWidget: (context, url, error) => const Icon(Icons.error), - ), - Expanded( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - news.title, - maxLines: 2, - overflow: TextOverflow.ellipsis, - style: TextStyle( - color: Palette.indigo, fontWeight: FontWeight.bold), - ), - const SizedBox(height: 5), - Text( - news.description, - maxLines: 4, - overflow: TextOverflow.ellipsis, - style: TextStyle(color: Palette.grey), - ), - ], - ), - ), - ), - ], - ), - ); - } -} diff --git a/lib/features/news/presentation/pages/non_pdf_news.dart b/lib/features/news/presentation/pages/non_pdf_news.dart index 9474652a..5d83514e 100644 --- a/lib/features/news/presentation/pages/non_pdf_news.dart +++ b/lib/features/news/presentation/pages/non_pdf_news.dart @@ -1,13 +1,12 @@ -// 🎯 Dart imports: +// 🐦 Flutter imports: import 'dart:io'; -// 🐦 Flutter imports: +import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; // 📦 Package imports: -import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:percent_indicator/circular_percent_indicator.dart'; import 'package:share_plus/share_plus.dart'; @@ -23,11 +22,12 @@ import 'package:rotary_nl_rye/features/news/presentation/widgets/pdf_viewer.dart import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; class NonPDFPage extends StatefulWidget { - @override - _NonPDFPageState createState() => _NonPDFPageState(); final News data; NonPDFPage({required this.data}); + + @override + _NonPDFPageState createState() => _NonPDFPageState(); } class _NonPDFPageState extends State { @@ -47,213 +47,151 @@ class _NonPDFPageState extends State { FirebaseDynamicLinks dynamicLinks = FirebaseDynamicLinks.instance; + @override void dispose() { + super.dispose(); isTranslating = false; translate.clear(); index = 0; - translationIndex = 0; // TODO: implement dispose - _linkMessage; - - // TODO: implement dispose - - super.dispose(); + translationIndex = 0; + _linkMessage = null; } @override void initState() { super.initState(); - this._createDynamicLink(id = widget.data.id.toString()); + _createDynamicLink(id = widget.data.id.toString()); _removeBadge(); } void _removeBadge() async { SharedPreferences prefs = await SharedPreferences.getInstance(); - setState(() { - prefs.setInt('newsBadge', 0); - }); + prefs.setInt('newsBadge', 0); } @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - systemOverlayStyle: SystemUiOverlayStyle( - statusBarBrightness: MediaQuery.of(context).platformBrightness, - ), - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - actions: [ - Container( - margin: EdgeInsets.only(right: 10, top: 5), - width: 50, - height: 50, - decoration: BoxDecoration( - color: Palette.themeShadeColor, - borderRadius: BorderRadius.circular(40.0), - ), - child: Platform.localeName == 'NL' - ? PopupMenuButton( - // color: Colors.black, - itemBuilder: (context) => [ - PopupMenuItem( - value: 0, - child: Row( - children: [ - Icon( - CupertinoIcons.share, - color: Palette.lightIndigo, - ), - const SizedBox( - width: 7, - ), - Text('Share') - ], - )), - ], - onSelected: (item) => selectedItem(context, item), - ) - : PopupMenuButton( - // color: Colors.black, - itemBuilder: (context) => [ - PopupMenuItem( - value: 0, - child: Row( - children: [ - Icon( - CupertinoIcons.share, - color: Palette.lightIndigo, - ), - const SizedBox( - width: 7, - ), - Text('Share') - ], - )), - PopupMenuDivider(), - PopupMenuItem( - value: 1, - child: Row( - children: [ - FaIcon( - FontAwesomeIcons.language, - color: Palette.lightIndigo, - ), - const SizedBox( - width: 7, - ), - Text('Translate') - ], - )), + appBar: AppBar( + systemOverlayStyle: SystemUiOverlayStyle( + statusBarBrightness: MediaQuery.of(context).platformBrightness, + ), + backgroundColor: Colors.transparent, + elevation: 0.0, + leading: UniformBackButton(), + actions: [ + Container( + margin: EdgeInsets.only(right: 10, top: 5), + width: 50, + height: 50, + decoration: BoxDecoration( + color: Palette.themeShadeColor, + borderRadius: BorderRadius.circular(40.0), + ), + child: PopupMenuButton( + itemBuilder: (context) => [ + PopupMenuItem( + value: 0, + child: Row( + children: [ + Icon( + CupertinoIcons.share, + color: Palette.lightIndigo, + ), + const SizedBox(width: 7), + Text('Share') ], - onSelected: (item) => selectedItem(context, item), - icon: FaIcon( - FontAwesomeIcons.list, - color: Palette.accentColor, - size: 22.0, - ), - ), + )), + if (Platform.localeName != 'NL') PopupMenuDivider(), + if (Platform.localeName != 'NL') + PopupMenuItem( + value: 1, + child: Row( + children: [ + FaIcon( + FontAwesomeIcons.language, + color: Palette.lightIndigo, + ), + const SizedBox(width: 7), + Text('Translate') + ], + )), + ], + onSelected: (item) => selectedItem(context, item), + icon: FaIcon( + FontAwesomeIcons.list, + color: Palette.accentColor, + size: 22.0, + ), ), - ], - title: Text( - widget.data.title, - textScaler: TextScaler.linear(1.4), - style: - TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), ), + ], + title: Text( + widget.data.title, + textScaler: TextScaler.linear(1.4), + style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), ), - body: _isLoading - ? Center( - child: Stack( - alignment: Alignment.center, - children: [ - CircularPercentIndicator( - animation: true, - animateFromLastPercent: true, - radius: 80.0, - lineWidth: 8.0, - percent: this.progressPercent, - center: new Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - '${(this.progressPercent * 100).round()}%', - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.black, - fontSize: 30.0, - fontWeight: FontWeight.bold), - ), - Text( - 'COMPLETED', - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.black, - fontSize: 15.0, - fontWeight: FontWeight.bold), - ), - ], - ), - progressColor: Colors.green, - ) - // Container( - // width: 200, - // child: Padding( - // padding: const EdgeInsets.all(20.0), - // child: CircleProgressBar( - // backgroundColor: background, - // foregroundColor: foreground, - // value: this.progressPercent, - // ), - // ), - // ), - // Column( - // mainAxisAlignment: MainAxisAlignment.center, - // children: [ - // Text( - // '${(this.progressPercent * 100).round()}%', - // textAlign: TextAlign.center, - // style: TextStyle( - // color: Colors.black, - // fontSize: 30.0, - // fontWeight: FontWeight.bold), - // ), - // Text( - // 'COMPLETED', - // textAlign: TextAlign.center, - // style: TextStyle( - // color: Colors.black, - // fontSize: 15.0, - // fontWeight: FontWeight.bold), - // ), - // ], - // ), - ], - ), - ) - : Padding( - padding: const EdgeInsets.all(16.0), - child: ListView( - children: [ - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: Text( - (isTranslating) - ? heading - : (widget.data.text![0]['heading']), - style: TextStyle( - color: Palette.titleText, - fontSize: 25.0, - fontWeight: FontWeight.bold), - ), + ), + body: _isLoading + ? Center( + child: Stack( + alignment: Alignment.center, + children: [ + CircularPercentIndicator( + animation: true, + animateFromLastPercent: true, + radius: 80.0, + lineWidth: 8.0, + percent: this.progressPercent, + center: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + '${(this.progressPercent * 100).round()}%', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.black, + fontSize: 30.0, + fontWeight: FontWeight.bold), + ), + Text( + 'COMPLETED', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.black, + fontSize: 15.0, + fontWeight: FontWeight.bold), + ), + ], ), - ...((isTranslating) - ? translate - : (_text(widget.data.text![1]['body']))) - ], - ), - ) // NativeVideo(url: "https://www.youtube.com/watch?v=ClpPvpbYBpY"), - ); + progressColor: Colors.green, + ), + ], + ), + ) + : Padding( + padding: const EdgeInsets.all(16.0), + child: ListView( + children: [ + Padding( + padding: const EdgeInsets.only(top: 20.0), + child: Text( + (isTranslating) + ? heading + : (widget.data.text![0]['heading']), + style: TextStyle( + color: Palette.titleText, + fontSize: 25.0, + fontWeight: FontWeight.bold), + ), + ), + ...((isTranslating) + ? translate + : (_text(widget.data.text![1]['body']))), + ], + ), + ), + ); } List _text(List newsBody) { @@ -355,43 +293,25 @@ class _NonPDFPageState extends State { Widget pdfButton({required String pdfUrl}) { return Padding( - padding: const EdgeInsets.only(top: 40.0, bottom: 30), - child: Container( - child: Center( - child: CupertinoButton.filled( - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => PDFPage( - pdfUrl: pdfUrl, - data: widget.data, - )), - ); - }, - child: - // Row( - // children: [ - // Padding( - // padding: const EdgeInsets.only(left: 25.0), - // child: FaIcon( - // FontAwesomeIcons.phone, - // color: Colors.white, - // ), - // ), - // Padding( - // padding: const EdgeInsets.only(left: 20.0), - // child: Text( - // 'Call me ', - // style: TextStyle(color: Colors.white, fontSize: 18.0), - // ), - // ) - // ], - // ), - Text('Open PDF'), - ), + padding: const EdgeInsets.only(top: 40.0, bottom: 30), + child: Container( + child: Center( + child: CupertinoButton.filled( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => PDFPage( + pdfUrl: pdfUrl, + data: widget.data, + )), + ); + }, + child: Text('Open PDF'), ), - )); + ), + ), + ); } Widget imageItem({required String url}) { @@ -427,15 +347,13 @@ class _NonPDFPageState extends State { Future selectedItem(BuildContext context, item) async { switch (item) { case 0: - _createDynamicLink( - id = widget.data.id.toString()); //TODO add the parameters here + _createDynamicLink(id = widget.data.id.toString()); if (await canLaunchUrlString(_linkMessage!)) { await Share.share( Platform.isIOS - ? 'Hier moet nog een leuk stukje komen. + de link naar de juiste pagina $_linkMessage' // iOS + ? 'Hier moet nog een leuk stukje komen. + de link naar de juiste pagina $_linkMessage' : 'Hier moet nog een leuk stukje komen. + de link naar de juiste pagina $_linkMessage', - //android subject: 'look at this nice app :)'); } else { throw 'Could not launch $_linkMessage'; @@ -443,7 +361,6 @@ class _NonPDFPageState extends State { break; case 1: - print('platform ${Platform.localeName}'); setState(() { _isLoading = true; isTranslating = !isTranslating; @@ -451,7 +368,6 @@ class _NonPDFPageState extends State { future: translated(widget.data.text![1]['body']), builder: (BuildContext context, AsyncSnapshot snapshot) { if (!translationSuccess && isTranslating) { - print('show dialog'); showDialog( context: context, builder: (BuildContext context) { @@ -473,18 +389,14 @@ class _NonPDFPageState extends State { }, ); }); - break; } } Future _createDynamicLink(String id) async { - setState(() {}); - final DynamicLinkParameters parameters = DynamicLinkParameters( uriPrefix: 'https://rotarynl.page.link', - link: Uri.parse( - 'https://rotarynl.page.link/news?id=$id'), //change this to the url in the main.dart + link: Uri.parse('https://rotarynl.page.link/news?id=$id'), androidParameters: AndroidParameters( packageName: 'com.caelitechnologies.rotary_nl_rye', minimumVersion: 1, @@ -494,18 +406,11 @@ class _NonPDFPageState extends State { minimumVersion: '1.0.0', appStoreId: '1567096118', ), - // socialMetaTagParameters: SocialMetaTagParameters( - // title: 'Example of a Dynamic Link', - // description: 'This link works whether app is installed or not!', - // imageUrl: Uri.parse( - // 'https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/6e/21/e4/6e21e45b-49cb-fa52-83c2-bb56ab288b49/AppIcon-0-0-1x_U007emarketing-0-0-0-4-0-0-sRGB-0-0-0-GLES2_U002c0-512MB-85-220-0-0.jpeg/1200x630wa.png'), - // ), ); - Uri url; final ShortDynamicLink shortLink = await dynamicLinks.buildShortLink(parameters); - url = shortLink.shortUrl; + final Uri url = shortLink.shortUrl; setState(() { _linkMessage = url.toString(); diff --git a/lib/features/news/presentation/widgets/news_card.dart b/lib/features/news/presentation/widgets/news_card.dart new file mode 100644 index 00000000..9f61d114 --- /dev/null +++ b/lib/features/news/presentation/widgets/news_card.dart @@ -0,0 +1,69 @@ +// 🐦 Flutter imports: +import 'package:flutter/material.dart'; + +// 📦 Package imports: +import 'package:cached_network_image/cached_network_image.dart'; + +// 🌎 Project imports: +import 'package:rotary_nl_rye/core/domain/entities/news.dart'; +import 'package:rotary_nl_rye/core/prop.dart'; + +class NewsCard extends StatelessWidget { + final News news; + + const NewsCard({Key? key, required this.news}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + color: Palette.themeShadeColor, + borderRadius: const BorderRadius.all(Radius.circular(14)), + ), + child: Row( + children: [ + CachedNetworkImage( + width: MediaQuery.of(context).size.width * 0.4, + height: 120, + imageUrl: news.images, + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(14), + image: + DecorationImage(image: imageProvider, fit: BoxFit.contain), + ), + ), + placeholder: (context, url) => + const Center(child: CircularProgressIndicator()), + errorWidget: (context, url, error) => const Icon(Icons.error), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + news.title, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: Palette.indigo, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 5), + Text( + news.description, + maxLines: 4, + overflow: TextOverflow.ellipsis, + style: TextStyle(color: Palette.grey), + ), + ], + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/features/news/presentation/widgets/pdf_viewer.dart b/lib/features/news/presentation/widgets/pdf_viewer.dart index 7ffc0fc6..8d58f756 100644 --- a/lib/features/news/presentation/widgets/pdf_viewer.dart +++ b/lib/features/news/presentation/widgets/pdf_viewer.dart @@ -1,8 +1,7 @@ -// 🎯 Dart imports: +// 🐦 Flutter imports: import 'dart:async'; import 'dart:io'; -// 🐦 Flutter imports: import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -20,13 +19,12 @@ import 'package:rotary_nl_rye/core/domain/entities/news.dart'; import 'package:rotary_nl_rye/core/prop.dart'; import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; -// ignore: import_of_legacy_library_into_null_safe - class PDFPage extends StatefulWidget { final News data; final String pdfUrl; PDFPage({required this.data, required this.pdfUrl}); + @override _PDFPageState createState() => _PDFPageState(pdfUrl: pdfUrl, data: data); } @@ -37,26 +35,21 @@ class _PDFPageState extends State { _PDFPageState({required this.pdfUrl, required this.data}); - String title = 'Loading'; - - FirebaseDynamicLinks dynamicLinks = FirebaseDynamicLinks.instance; + String? _linkMessage; + String? id; final Completer _pdfViewController = Completer(); final StreamController _pageCountController = StreamController(); - String? _linkMessage; - String? id; + FirebaseDynamicLinks dynamicLinks = FirebaseDynamicLinks.instance; @override void initState() { super.initState(); - // loadDocument(); - this._createDynamicLink(id = widget.data.id.toString()); - + _createDynamicLink(id = widget.data.id.toString()); _removeBadge(); - print(pdfUrl); SystemChrome.setPreferredOrientations([ DeviceOrientation.landscapeRight, DeviceOrientation.landscapeLeft, @@ -66,9 +59,7 @@ class _PDFPageState extends State { void _removeBadge() async { SharedPreferences prefs = await SharedPreferences.getInstance(); - setState(() { - prefs.setInt('newsBadge', 0); - }); + prefs.setInt('newsBadge', 0); } @override @@ -117,13 +108,13 @@ class _PDFPageState extends State { child: Stack( alignment: Alignment.center, children: [ - new CircularPercentIndicator( + CircularPercentIndicator( animation: true, animateFromLastPercent: true, radius: 80.0, lineWidth: 8.0, percent: (progress / 100), - center: new Column( + center: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( @@ -146,40 +137,6 @@ class _PDFPageState extends State { ), progressColor: Colors.green, ) - - // Container( - // width: 200, - // child: Padding( - // padding: const EdgeInsets.all(20.0), - // child: CircleProgressBar( - // foregroundColor: - // (progress >= 0.8) ? Colors.green : Colors.orange, - // backgroundColor: foreground.withOpacity(0.2), - // value: (progress / 100), - // ), - // ), - // ), - // Column( - // mainAxisAlignment: MainAxisAlignment.center, - // children: [ - // Text( - // '$progress%', - // textAlign: TextAlign.center, - // style: TextStyle( - // color: Palette.bodyText, - // fontSize: 30.0, - // fontWeight: FontWeight.bold), - // ), - // Text( - // 'COMPLETED', - // textAlign: TextAlign.center, - // style: TextStyle( - // color: Palette.bodyText, - // fontSize: 15.0, - // fontWeight: FontWeight.bold), - // ), - // ], - // ), ], ), ), @@ -204,7 +161,6 @@ class _PDFPageState extends State { fontSize: 16.0, fontWeight: FontWeight.w400)))); } - return const SizedBox(); }), ], @@ -212,12 +168,9 @@ class _PDFPageState extends State { } Future _createDynamicLink(String id) async { - setState(() {}); - final DynamicLinkParameters parameters = DynamicLinkParameters( uriPrefix: 'https://rotarynl.page.link', - link: Uri.parse( - 'https://rotarynl.page.link/news?id=$id'), //change this to the url in the main.dart + link: Uri.parse('https://rotarynl.page.link/news?id=$id'), androidParameters: AndroidParameters( packageName: 'com.caelitechnologies.rotary_nl_rye', minimumVersion: 1, @@ -227,18 +180,11 @@ class _PDFPageState extends State { minimumVersion: '1', appStoreId: '1567096118', ), - // socialMetaTagParameters: SocialMetaTagParameters( - // title: 'Example of a Dynamic Link', - // description: 'This link works whether app is installed or not!', - // imageUrl: Uri.parse( - // 'https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/6e/21/e4/6e21e45b-49cb-fa52-83c2-bb56ab288b49/AppIcon-0-0-1x_U007emarketing-0-0-0-4-0-0-sRGB-0-0-0-GLES2_U002c0-512MB-85-220-0-0.jpeg/1200x630wa.png'), - // ), ); - Uri url; final ShortDynamicLink shortLink = await dynamicLinks.buildShortLink(parameters); - url = shortLink.shortUrl; + final Uri url = shortLink.shortUrl; setState(() { _linkMessage = url.toString(); @@ -251,8 +197,8 @@ class _PDFPageState extends State { if (await canLaunchUrlString(_linkMessage!)) { await Share.share( Platform.isIOS - ? 'Hier mot nog een leuk stukje komen. + de link naar de juiste pagina $_linkMessage' // iOS - : 'Hier mot nog een leuk stukje komen. + de link naar de juiste pagina $_linkMessage', //android + ? 'Hier mot nog een leuk stukje komen. + de link naar de juiste pagina $_linkMessage' + : 'Hier mot nog een leuk stukje komen. + de link naar de juiste pagina $_linkMessage', subject: 'look at this nice app :)'); } else { throw 'Could not launch $_linkMessage'; diff --git a/lib/features/outbound/data/outbound_list.dart b/lib/features/outbound/data/outbound_list.dart index 9d8e9b89..472b6c8e 100644 --- a/lib/features/outbound/data/outbound_list.dart +++ b/lib/features/outbound/data/outbound_list.dart @@ -2,13 +2,13 @@ import 'package:rotary_nl_rye/features/outbound/presentation/models/ClassOf.dart'; List outboundList = [ - // Norah van de Vegte + // Fien ten Hoeve Outbounds( - name: 'Norah van de Vegte', + name: 'Fien ten Hoeve', bio: - 'Hey! My name is Norah van der Vegte and I am currently 17 years old. I live in Zwolle (for now) and once I am back from my exchange I would love to study Creative Writing at Artez.\n\n My exchange year will be in Vichy, the south of France! I am as curious as excited and I am very much looking forward to my year in France. Not only the language, but the customs and people are what drawn me to the country.\n\nI think it will be a totally different world from my own, not just because of the language and customs I mentioned just now, but also the idea of living with new people and creating new connections with people I otherwise never would have met.', + 'Hiii, \nIk ben Fien uit Franeker in Friesland en ik ga dit jaar op uitwisseling met Rotary. Ik ben nu 17 jaar en word in de zomer 18, waarna ik een jaar naar de prachtige stad Rome ga in Italië. \nIk zal vanaf september in jaar 4 zitten in Rome. Volgens mijn gastbroer kom ik gelukkig in een klas met leerlingen van ongeveer dezelfde leeftijd. Ik heb in Italië een vakkenpakket dat aardig aansluit op het vakkenpakket dat ik nu ook heb, wat voornamelijk beta vakken zijn. \nAangezien er weinig mensen goed Engels spreken in Italië, zullen de eerste paar maanden vast wat pittiger worden, maar toch kijk ik er heel erg naar uit om de cultuur te leren kennen, de taal te leren en vooral om heel veel Italiaanse gerechten te eten!!', imageUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/norah-van-de-vegte.jpg', + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', email: null, phoneNumber: null, snapchatUrl: null, @@ -18,16 +18,17 @@ List outboundList = [ linkedinUrl: null, from: 'Nederland', fromFlag: 'nl', - to: 'France', - toFlag: 'fr', + to: 'Italië', + toFlag: 'it', ), - // Jesse Talens + + // Fien Theewen Outbounds( - name: 'Jesse Talens', + name: 'Fien Theewen', bio: - 'Hoi! Ik ben Jesse en ik ga volgend jaar naar Finland!\n\nMijn nieuwe woonplaats is Klaukkala, een dorp 20 kilometer ten noorden van Helsinki. Ik houd van avontuur en dingen ontdekken en ik hoop dat veel te kunnen doen volgend jaar! De Finse taal is best moeilijk, dus ik ben al begonnen met leren, en ik hoop dat ik het snel onder de knie krijg! Verder hoop ik volgend jaar nog veel andere dingen te leren, zoals ijshockey en hoe je van een sauna kan genieten!', + 'Hey! \nIk ben Fien Theewen, ik ben 16 jaar oud en ik woon in Venlo. Voor mijn exchange year ga ik naar Jacksonville Florida, in het stadje Fernandina beach! \nMijn ouders kwamen vorig jaar bij mij met het idee om een exchange year te gaan doen. Het sprak mij meteen aan, en ben meteen gaan kijken naar de eerste meeting met rotary voor zo’n exhange year. \nIk kijk heel erg naar dit jaar uit. Ik hoop veel vrienden te maken, veel dingen te leren en het beste uit mezelf te halen, en een echte Amerikaanse high school ervaring mee te maken. En natuurlijk genieten van alle avonturen!', imageUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/jesse-talens.jpg', + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', email: null, phoneNumber: null, snapchatUrl: null, @@ -37,16 +38,17 @@ List outboundList = [ linkedinUrl: null, from: 'Nederland', fromFlag: 'nl', - to: 'Finland', - toFlag: 'fi', + to: 'USA', + toFlag: 'us', ), - // Sander van Dam + + // Jasper Verhofstad Outbounds( - name: 'Sander van Dam', + name: 'Jasper Verhofstad', bio: - 'Ik ben Sander van Dam, ik ben 17 jaar en woon in Lochem. \n\n Mijn hobby’s zijn sporten, zoals naar de sportschool en mountainbiken, met vrienden afspreken en reizen. \n\n Ik ga op exchange naar Argentinië! Ik hoop dat ik een goede band opbouw met de gastfamillies en vrienden die ik daar maak. Ook heb ik heel veel zin om de Argentijnse cultuur te leren kennen en vloeiend Spaans te leren spreken.\n\nIk heb er heel veel zin in en kan niet wachten om in het vliegtuig te stappen en dit avontuur te beginnen!', + 'Hoi! \nIk ben Jasper Verhofstad, 17 jaar oud en woon in Baarlo. \nIk ga op exchange naar Finland! Ik hoop dat ik een goede band opbouw met mijn gastgezinnen en vrienden die ik daar maak. \nOok hoop ik de Finse cultuur en taal te leren. \nIk kan niet wachten om het grootste avontuur van mijn leven aan te gaan en in augustus het vliegtuig op te stappen!', imageUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/sander-van-dam.jpg', + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', email: null, phoneNumber: null, snapchatUrl: null, @@ -56,16 +58,17 @@ List outboundList = [ linkedinUrl: null, from: 'Nederland', fromFlag: 'nl', - to: 'Argentina', - toFlag: 'ar', + to: 'Finland', + toFlag: 'fi', ), - // Leonie Poland + + // Vincent Kemper Outbounds( - name: 'Leonie Poland', + name: 'Vincent Kemper', bio: - 'Hi there, \n\n Mijn naam is Leonie Poland. Ik ben 17 jaar oud. Ik woon in Wervershoof en zit in het 2 de jaar van mijn mbo opleiding.\n\n Ik ga op uitwisseling naar Amerika! Ik ga wonen in de staat Kansas dat is in het bijna het middelste punt van Amerika. Mijn dorpje heet Council grove en ligt een uur rijden van de hoofdstad Topeka. Ik heb contact met mijn gastgezin en met mijn district de mensen zijn allemaal heel lief en verwelkomend en zijn super enthousiast om een Nederlands iemand te hosten aangezien ik de eerst ooit uit Nederland zal zijn.\n\n Ik kijk uit naar de hele ervaring en om zoveel nieuwe mensen te ontmoeten en vriendschapen voor het leven te sluiten. Ik heb de selectie procedure twee keer mogen doorlopen en voel mij helemaal klaar voor dit te gekke avontuur. Ik vind het natuurlijk ook spannend maar ik ben al zo welkom ontvangen dat moet wel goedkomen. Ik vind het ook heel leuk om nu al het proces van de andere uitwisselingsstudenten te volgen van zowel die uit Nederland als de uitwisselingstudenten uit mijn district. Ik heb er zin in!', + 'Hoi, \nIk ben Vincent en ik ben nu nog 15 jaar oud maar 16 jaar als ik op exchange ga. Ik heb geen broertjes of zusjes. Ik woon in Venlo, Limburg. Ik ga op exchange naar Centraal Amerika, district 6110. \nIk heb nog geen contact met mijn gastouders daar. Ik hoop dat ik een geweldige exchange ervaring zal hebben en een hoop leuke dingen ga meemaken. \nIk spreek al vloeiend Engels maar maak nog veel fouten en heb nog een flink Nederlands accent als ik Engels spreek. Ik kijk enorm uit om naar high school te gaan. Ik speel basketbal en ik hoop dat ik daar in het basketbal team kom. \nIk heb er enorm veel zin in!', imageUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/leonie-poland.jpg', + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', email: null, phoneNumber: null, snapchatUrl: null, @@ -78,13 +81,14 @@ List outboundList = [ to: 'USA', toFlag: 'us', ), - // Mirthe Vereecken + + // Carleen Bruining Outbounds( - name: 'Mirthe Vereecken', + name: 'Carleen Bruining', bio: - 'Hoi ik ben Mirthe Vereecken 15 jaar oud en ik mag in 2023/2024 Rotary Nederland vertegenwoordigen.\n Ik ga naar de plaats Campbell River op Vancouver Island in Canada. \n\n Behalve naar de highschool kan ik hier mijn 2 grote hobby’s beoefenen, veld hockey en skiën. \n\n Ik kom uit Zwolle maar mijn sponsor club is Rotary Club Dronten. \n\n Ik kan niet wachten om naar Canada te gaan. Ik hoop dat ik daar veel vrienden maak en een jaar heb om nooit meer te vergeten. \n\n Het selectie weekend en de trainingsdag in Utrecht was ook super leuk en leerzaam.', + 'Hoi, \nIk ben Carleen, ik ben momenteel 18 jaar oud. Ik ga over twee maanden naar Mexico! Ik heb al contact gehad met mijn gastgezin, ze waren heel aardig. Ze leken super enthousiast om mij als gastkind te hebben en ze hebben veel katten, dus mijn enthousiasme is enorm! Ik verblijf in een vrij kleine stad tussen Toluca en Mexico-Stad. Mijn stad ligt ook bovenop een berg, wat betekent dat ik altijd minstens 2800 meter hoog zal zijn. Ik heb dit programma gekozen om mijn horizon echt te verbreden en een totaal nieuwe cultuur te leren kennen en er hopelijk deel van uit te maken. Ik wilde ook een nieuwe taal leren en Spaans leek me de beste optie vanwege de veelzijdigheid ervan. Ik kijk er vooral naar uit om nieuwe mensen te ontmoeten en de natuur, culturele gebruiken, nieuwe gerechten enz. te ontdekken. Op dit moment ben ik nog steeds bezig met het verkrijgen van mijn visum en hopelijk land ik over ongeveer twee maanden in Mexico!', imageUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/mirthe-vereecken.png', + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', email: null, phoneNumber: null, snapchatUrl: null, @@ -94,16 +98,17 @@ List outboundList = [ linkedinUrl: null, from: 'Nederland', fromFlag: 'nl', - to: 'Canada', - toFlag: 'ca', + to: 'Mexico', + toFlag: 'mx', ), - // Sophie Linssen + + // Tim Hilderink Outbounds( - name: 'Sophie Linssen', + name: 'Tim Hilderink', bio: - 'Hee! Ik ben Sophie, ik ben 17 jaar en ik woon in Maarssen. In mijn vrije tijd doe ik graag dingen met vrienden, werk ik in de horeca en volg ik danslessen. \n\n Dit jaar ga ik naar Santos in Brazilië. Santos ligt aan de kust in de buurt van de stad Sao Paulo. Ik heb super veel zin om de Braziliaanse cultuur te ontdekken. Ik kijk er naar uit om nieuwe mensen te leren kennen en hopelijk heel snel Portugees te kunnen spreken. Ook lijkt het me super leuk om de nationale dansen te leren en Brazilië feesten mee te maken. Ik heb inmiddels contact met mijn eerste gastgezin en daardoor krijg ik extra veel zin om te gaan. In het voortraject heb al veel leuke mensen ontmoet en wens iedereen een heel tof uitwisselingsjaar!!\n\n Groetjes van Sophie!', + 'Hallo!! \nIk ben Tim Hilderink, ik ben 17 jaar en ik ga naar Brazilië op Exchange in het jaar 2024-2025 naar het dorpje Canela in de buurt van Porto Alegre. \nIk woon in Haaksbergen een dorpje in de buurt van Enschede met mijn ouders, broer en mijn hond Sepp. Ik heb dit jaar 5 havo gedaan en ik ben hopelijk geslaagd, wat ik hier na wil doen weet ik nog niet zo goed maar daar heb ik nu genoeg tijd voor gekregen om even goed over na te denken. In mijn vrije tijd speel ik hockey en padel. \nIk kijk met heel veel plezier uit naar het aankomende jaar en al helemaal na alle leuke activiteiten die ik met de Rotary en Rotex heb gedaan. Het lijkt me ook heel leuk om het Portugees onder de knie te hebben maar het is wel een hele lastige taal ook heb ik zin om alle nieuwe mensen van de school daar te ontmoeten. Ik ben echt super blij dat ik dit ga doen en ik ben heel dankbaar voor de kans die mij geboden is.', imageUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/sophie-linssen.jpg', + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', email: null, phoneNumber: null, snapchatUrl: null, @@ -113,16 +118,17 @@ List outboundList = [ linkedinUrl: null, from: 'Nederland', fromFlag: 'nl', - to: 'Brazil', + to: 'Brazilië', toFlag: 'br', ), - // Esmyra Waar + + // Izak van Os Outbounds( - name: 'Esmyra Waar', + name: 'Izak van Os', bio: - 'Hii ik ben Esmyra Waar, 18 jaar oud en woon in Harlingen Friesland.\n\n Ik verhuis dit jaar voor een jaar lang naar Sandpoint Idaho in de Verenigde Staten, bij de grens van Canada. Het is een heel mooi plekje, met een strand en skipiste.\n Sandpoint is erg sportief, ze doen er graag aan onderandere wandelen door de bergen, kajakken, zwemmen en skiën/ snowboarden dus ik hoop daar het sportieve meer op te pakken. \n\n Ik ben super benieuwd naar het avontuur dat staat te wachten op mij en alle nieuwe mensen die ik ga ontmoeten!', + 'Hoi, \nIk ben Izak van Os. \nIk ben 16 jaar oud en ik ga op exchange naar Brazilië. Daar verblijf ik in Assis, een stadje in het zuidwesten van de staat Sao Paulo. \nOm eerlijk te zijn weet ik nog helemaal niet wat ik moet verwachten. Van verschillende leden van de Rotex moet ik geloven dat het als een blonde en lange buitenlander niet moeilijk is om vrienden te maken. Dus daar verheug ik wel op. \nMijn gastmoeder had al vroeg contact opgezocht met mijn ouders via Whatsapp. Ik daarentegen heb alleen contact met het nichtje van mijn hostouders die in hetzelfde huis woont. Veel mensen uit Assis zijn me al gaan volgen op Insta, dus ik verwacht een warm welkom.', imageUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/esmyra-waar.png', + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', email: null, phoneNumber: null, snapchatUrl: null, @@ -132,16 +138,17 @@ List outboundList = [ linkedinUrl: null, from: 'Nederland', fromFlag: 'nl', - to: 'USA', - toFlag: 'us', + to: 'Brazilië', + toFlag: 'br', ), - // Philipien van Waveren Hogervorst + + // Myrthe de Jong Outbounds( - name: 'Philipien van Waveren Hogervorst', + name: 'Myrthe de Jong', bio: - 'Hoi allemaal! \n Ik ben Philipien.\n Ik ben 17 jaar oud, ik zit nu in 5 havo. \n En ik ga in 2023/2024 naar Mexico!!! \n Ik ga naar district 4170, wat in de omgeving van Mexico-stad ligt. \n\n In 2012 heb ik al voor 3 weken rondgereisd in Mexico. Ik heb heel veel gezien maar omdat ik zo jong was weet ik daar niet alles meer van. Dus nu, 11 jaar later, hoop ik heel wat nieuwe avonturen aan mijn Mexico herinneringen toe te kunnen voegen. \n\n Ik vind het heel leuk dat ik daar zoveel nieuwe dingen ga meemaken en mensen ga ontmoeten. Ook heb ik heel veel zin in het lekkere Mexicaanse eten! En het spaans leren natuurlijk. \n\n Wel vind ik het gek om straks opeens een jaar geen nederlands te spreken maar hoe kan je leuker een nieuwe taal leren dan via een uitwisseling! Dus ook daar kijk ik erg naar uit.\n\n Alles bij elkaar heb ik er super veel zin in en kan ik niet wachten tot het avontuur begint.\n\n Adiósss!', + 'Hiii, \nIk ben Myrthe de Jong, \nik ben nu 17 jaar. Nu woon ik nog in Alphen a/d Rijn maar over een paar maandjes ga ik naar Poulsbo North kitsap in de USA!! \nIk heb een hele leuke sponsor club, deze club is in Neede , dat is praktisch gezien aan de andere kant van het land. Ik ben daar wel al op een hele leuke kennismaking geweest en ben dankbaar dat ze mijn sponsorclub willen zijn. \nIk ben heel erg benieuwd hoe het in de USA zal gaan en hoe verschillend het van Nederland is. Ik heb heel veel zin om daar achter te komen en vindt het stiekem toch wel spannend nu het steeds dichterbij komt. \n“Lifetime in a year” \nI am looking forward to it!', imageUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/philipien-van-waveren-hogervorst.jpg', + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', email: null, phoneNumber: null, snapchatUrl: null, @@ -151,16 +158,17 @@ List outboundList = [ linkedinUrl: null, from: 'Nederland', fromFlag: 'nl', - to: 'Mexico', - toFlag: 'mx', + to: 'USA', + toFlag: 'us', ), - // Zomer Dijkstra + + // Lysanne Smits Outbounds( - name: 'Zomer Dijkstra', + name: 'Lysanne Smits', bio: - 'Hallo allemaal! Ik ben Zomer Dijkstra en ik ben 17 jaar oud. \n Tijdens het leren voor mijn examens van havo 5 ben ik ook al druk bezig met mijn vertrek naar Brazilië! \n\n De eerste woordjes worden met Duolingo al geleerd en als ik terug kom kan ik natuurlijk een goed gesprek voeren in het Portugees! Ik ga in Brazilië heel veel mensen leren kennen en natuurlijk ontzettend veel leren over van alles. Van andere gewoontes en eten tot aan zelfstandig dingen regelen en volwassen worden. Ik verwacht vooral dat ik het heel erg leuk ga hebben en een tweede thuis van Brazilië kan maken. \n\n Naast dat ik toch wel een beetje zenuwachtig ben om aan het eind van dit jaar te gaan, heb ik er ook echt ontzettend veel zin in en ben benieuwd wat er allemaal op mijn pad zal komen!', + 'Heyhoi! \nIk ben Lysanne Smits en ben op dit moment 17 jaar. Ik kom uit het kleine stadje Franeker in Friesland. Sporten is mijn grootste hobby! Ook speel ik de klarinet. \nIn 2024-2025 ga ik op uitwisseling naar Italië! Ik kom terecht in de stad Cremona. De stad van Stradivarius. Als muziekliefhebber vind ik dit enorm leuk! \nIk ga naar een scientifico school met voornamelijk beta-vakken. Dit gaat pittig worden in het italiaans maar het komt goed overeen met mijn vakkenpakket in Nederland dus dat is handig :) \nIk kijk enorm uit naar dit jaar. Het zal zeker niet makkelijk worden maar heb zin om de uitdaging uit te gaan! Het zal een leuk avontuur worden.', imageUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/zomer-dijkstra.png', + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', email: null, phoneNumber: null, snapchatUrl: null, @@ -170,16 +178,17 @@ List outboundList = [ linkedinUrl: null, from: 'Nederland', fromFlag: 'nl', - to: 'Brazil', - toFlag: 'br', + to: 'Italië', + toFlag: 'it', ), - // Annefleur Derksen + + // Emily Odink Outbounds( - name: 'Annefleur Derksen', + name: 'Emily Odink', bio: - 'Hoi!\n\n Ik ben Annefleur, 15 jaar en zit in HAVO 5. Voor mijn exchange mag ik naar district 5060! Dit is een 2-landen district. Dit houdt in dat ik of in Washington state, Amerika terechtkom of in het zuiden van British Columbia, Canada.\n\n Ik wilde al op exchange sinds dat ik 10 ben en kan daarom ook niet wachten om dit leuke avontuur te laten beginnen. Tijdens mijn exchange hoop ik nieuwe mensen te ontmoeten, veel kennis op te doen en mooie plekken te mogen bezoeken. Ook ben ik erg benieuwd naar het schoolleven.\n\n Kortom, ik heb enorm veel zin in ‘my lifetime in a year’.', + 'Hoi, \nIk ben Emily Odink 16 jaar oud en ik woon in Lelystad. Dit jaar ga ik naar Rossland een klein stadje in British Colombia, Canada. Het ligt tussen de bergen, dus in de zomer wordt er gemountainbiked en in de winter geskied hier kijk ik erg naar uit. \nDit jaar hoop ik veel nieuwe mensen te leren kennen en levenslange vriendschappen te sluiten. Ook ben ik benieuwd naar het Canadese school leven. Ik kan niet wachten tot het zover is :)', imageUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/annefleur-derksen.png', + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', email: null, phoneNumber: null, snapchatUrl: null, @@ -192,13 +201,14 @@ List outboundList = [ to: 'Canada', toFlag: 'ca', ), - // Paco Dijkstra + + // Rinske Baarda Outbounds( - name: 'Paco Dijkstra', + name: 'Rinske Baarda', bio: - 'Hallo ik ben Paco Dijkstra ik zit op hockey. Ik ben 16 jaar oud en ik word 17 in Spanje, het land waar ik op exchange ga. Ik hoop dat ik veel nieuwe dingen ga leren, waaronder de cultuur en de taal, maar hopelijk nog veel meer. Ik wil graag in Spanje veel nieuwe mensen leren kennen en nieuwe vriendschappen aangaan.\n\n De weg naar de Exchange toe was leuk waaronder de activiteiten. Bij de activiteiten hebben we eigenlijk alleen maar leuke dingen gedaan en heb ik de kans gekregen om al veel nieuwe kinderen te leren kennen in Nederland.', + 'Ciao! \nIk ben Rinske Baarda en ik ben 17 jaar oud. Ik ga komend schooljaar naar Lecco in Italië. Dat is een stad boven Milaan in district 2042. \nIk heb er heel veel zin in! Mij lijkt het heel interessant om over de cultuur te leren en het leven daar te ervaren. Ook hoop ik de taal goed te leren. Daar ben ik als voorbereiding al een beetje mee bezig. Ik heb al contact met mijn eerste gastgezin en ik kan niet wachten om ze te ontmoeten en een geweldige tijd met de gastgezinnen te beleven. \nIk heb tot nu toe veel plezier beleefd tijdens de selectie- en trainingsdagen en ik vond het heel leuk om de andere prebounds beter te leren kennen. Nu zijn we een hele leuke, hechte groep. Dit hoop ik ook te krijgen met mijn nieuwe vrienden en de andere exchangestudenten in Italië. \nIk heb heel veel zin in mijn avontuur :) \nArrivederci!', imageUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/paco-dijkstra.jpg', + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', email: null, phoneNumber: null, snapchatUrl: null, @@ -208,16 +218,17 @@ List outboundList = [ linkedinUrl: null, from: 'Nederland', fromFlag: 'nl', - to: 'Spain', - toFlag: 'es', + to: 'Italië', + toFlag: 'it', ), - // Jackie-Li Molenaar + + // Marcella Jorge Vaz Outbounds( - name: 'Jackie-Li Molenaar', + name: 'Marcella Jorge Vaz', bio: - 'Hii, ik ben Jackie-Li Molenaar en ik woon in Utrecht. En ik ben 17 jaar oud. Ik ga op Exchange naar Florida, de verenigde Staten. \n\n Het was al een droom van kinds af aan om naar Amerika toe te gaan en dit mag ik nu gaan doen!\n\n Ik hoop dat ik een heel leuk jaar zal hebben en ook nieuwe vrienden ga maken met wie ik voor heel lang nog contact mee zal houden. En daarnaast kijk ik er naar uit om nog zelfstandiger te worden en mezelf wat beter te leren kennen.', + 'Hi! \nIk ben Marcella, ik ben 17 jaar en ik ga voor mijn exchange year 24/25 naar Amerika, New York state. En ik heb hier natuurlijk super veel zin in! Het lijkt me sinds ik een jaar of 12 ben al echt super leuk om naar een Amerikaanse High School te gaan, dus het is echt een droom voor mij die uitkomt. En dit is ook echt iets wat je maar 1 keer in je leven kan doen, dus ik vind het heel leuk dat ik dit mag meemaken aankomend schooljaar. \nHet district waar ik heenga is district 7120, en ik kom in een van de plaatsjes Palymra of Macedon terecht dichtbij Rochester, ook ligt het dichtbij Canada en bij de waterval Niagara Falls. De school waar ik heenga heet Pal-Mac high school en ik heb hier natuurlijk al van alles opgezocht op internet en het ziet er uit als een hele leuke school. De school waar ik naartoe ga weet ik dus al wel, maar mijn gastfamilie heb ik nog niet dus dat is nog even afwachten wie dat zullen gaan worden. \nIk heb er in ieder geval heel veel zin in en ik hoop dat ik een heel leuk jaar ga hebben in Amerika. En ook hoop ik dat ik veel nieuwe dingen zal leren en ontdekken over de Amerikaanse cultuur. \nAls je mijn tijd daar wilt volgen kun je mijn Instagram volgen: @Marcellaa.jv', imageUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/jackie-li-molenaar.jpg', + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', email: null, phoneNumber: null, snapchatUrl: null, @@ -230,13 +241,14 @@ List outboundList = [ to: 'USA', toFlag: 'us', ), - // Rachel van Dijk + + // Mathilde van den Berg Outbounds( - name: 'Rachel van Dijk', + name: 'Mathilde van den Berg', bio: - 'Hoii, ik ben Rachel, ik ben 17 jaar en ik kom uit Gouda. Ik hou erg van dansen (modern/jazz) en afspreken met vrienden. \n\n Volgend jaar ga ik in mijn tussenjaar op Exchange naar district 2042 in Italië. Dat is het district boven Milaan. Ik heb heel veel zin om naar Italië te gaan en om de Italiaanse cultuur te leren kennen en de taal te leren. \n\n De voorbereiding van het Exchange jaar is tot nu toe erg leuk. We hebben laatst ook een erg gezellige dag gehad in Utrecht met alle toekomstige Exchange studenten. Iedereen is erg aardig en erg enthousiast. \n\n Arrivederci!', + 'Heyy \nIk ben Mathilde en ik ben 17 jaar. Ik kom uit Leiden en ik hou van shoppen met vrienden, leuke dingen doen en lekker eten! \nIk ga dit jaar naar District 2032 in Italië! Dat ligt vlak bij Genua. Ik hoop dat ik mijn bucketlist kan voltooien, zoals een Italiaanse bruiloft bijwonen, Italiaans leren koken en natuurlijk de cultuur ontdekken als een echte Italiaanse! \nIk ben vooral benieuwd wat dit jaar mij gaat brengen hoe mijn gastouders gaan zijn en of ik daadwerkelijk ga veranderen zoals mensen zeggen. \nIk hoop dat dit het jaar van mijn leven wordt! \nSaluti -groetjes-', imageUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/rachel-van-dijk.jpg', + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', email: null, phoneNumber: null, snapchatUrl: null, @@ -246,35 +258,37 @@ List outboundList = [ linkedinUrl: null, from: 'Nederland', fromFlag: 'nl', - to: 'Italy', + to: 'Italië', toFlag: 'it', ), - // Taco van Hooijdonk + + // Xavier Peters Outbounds( - name: 'Taco van Hooijdonk', + name: 'Xavier Peters', bio: - 'Ik ben Taco van Hooijdonk, 16 jaar uit Etten-Leur. \n\n Binnenkort vertrek ik naar Curitiba, Brazilië, voor een uitwisselingsjaar! Ik kijk ernaar uit om nieuwe ervaringen op te doen, de Braziliaanse cultuur te ontdekken en het lokale sportleven te verkennen. Het traject om hier te komen verliep soepel en ik heb al leuke tijd gehad met mijn mede "prebounds". Ik wens hen allemaal een fantastisch jaar vol mooie avonturen toe.\n\n Wil je mijn tijd daar volgen? Neem dan een kijkje op mijn Instagram-account @taco_vh\n\n Groetjes,\n Taco van Hooijdonk', + 'Hoi! \nIk ben Xavier Peters, ik ben 17 jaar oud en ik woon in Roosendaal. \nIk ga komend jaar met mijn exchange naar Argentinië in het district 4945. Dit is een multi district bestaande uit Uruguay en Argentinië. Hier zal ik verblijven in het prachtige Santa Fe! \nIk heb enorm veel zin in komend jaar om nieuwe mensen te leren kennen, een nieuwe taal te leren en om met name zelfvoorzienend te worden!', imageUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/taco-van-hooijdonk.png', + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', email: null, phoneNumber: null, snapchatUrl: null, facebookUrl: null, - instagramUrl: 'https://www.instagram.com/taco_vh/', + instagramUrl: null, websiteUrl: null, linkedinUrl: null, from: 'Nederland', fromFlag: 'nl', - to: 'Brazil', - toFlag: 'br', + to: 'Argentinië', + toFlag: 'ar', ), - // Pepijn Kimmels + + // Cathelijne van der Pluijm Outbounds( - name: 'Pepijn Kimmels', + name: 'Cathelijne van der Pluijm', bio: - 'Ik ben Pepijn Kimmels en ik ben 18 jaar oud. Ik woon in Winterswijk, een dorp in het oosten van Gelderland, hier woon ik met mijn ouders, oudere zus Sennah en tweelingbroer Julian. Ik zit op dit moment nog op het Gerrit Komrij College, waar ik de HAVO volg. Ook speel ik voetbal, dit doe ik al bijna 12 jaar en ik hoop dat ik dat in mijn Exchange jaar kan blijven doen maar het lijkt me ook leuk om iets anders te proberen. \n\n Toen ik 12 was hadden wij een meisje uit India in huis via de Rotary Youth Exchange. Dit vond ik heel leuk en interessant en daardoor ben ik mij er ook in gaan verdiepen. Nu, bijna 6 jaar later ben ik erg blij om te zeggen dat ik ook via de Rotary op Exchange mag. \n\n Ik ga in Augustus naar de Verenigde Staten, naar het zuiden van de staat Californië naar de kleine stad genaamd Carlsbad, gelegen aan de kust. De afgelopen weken bestonden voor mij vooral uit het ontdekken op Google van de regio waar ik kom te wonen en het regelen van mijn visum. Dit heb ik nu ook bijna afgerond en dat betekent dat ik zo goed als klaar ben om op het vliegtuig te stappen en een compleet nieuwe ervaring op te doen.\n\n Ik krijg vaak de vraag of ik het spannend vind om een jaar weg te gaan maar op dit moment ben ik vooral enthousiast maar wie weet komt de spanning nog wel.', + 'Hoi hoi, \nIk ben Cathelijne van der Pluijm, 17 jaar oud en ik kom uit Waalwijk, Brabant. \nIk ga een jaar lang naar de Verenigde Staten. Ik zit in de buurt van Syracuse in de staat New York. Ik heb hier natuurlijk heel veel zin in en kan niet wachten om vele mooie herinningen te maken! \nIn de winter van 2019 had mijn gezin Colton, een jongen uit Amerika in huis via de Rotary Youth Exchange. Dit was zo’n gave ervaring dat ook ik nu bijna 5 jaar later op Exchange naar Amerika mag gaan via Rotary. \nVeel mensen vragen of ik het niet spannend vind om een jaar weg te gaan, maar ik kan zeggen dat ik op dit moment er vooral veel zin in heb om op dit grote avontuur te gaan!', imageUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/pepijn-kimmels.jpg', + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', email: null, phoneNumber: null, snapchatUrl: null, @@ -287,13 +301,74 @@ List outboundList = [ to: 'USA', toFlag: 'us', ), - // Sem Weenk + + // Jasmijn Peterse + Outbounds( + name: 'Jasmijn Peterse', + bio: + 'Hoii \nIk ben Jasmijn Peterse, ik ben 16 jaar oud en ik kom uit Den Hout in Noord Brabant. \nIk ga volgend jaar naar Brazilië. Ik verblijf dan in de stad Curitiba. Ik heb er voor gekozen om een jaar naar het buitenland te gaan omdat ik meer van de wereld wilde zien en niet op een toeristische manier. Ik wilde de cultuur van een ander land leren kennen. \nIk heb niet echt verwachtingen voor dit jaar zodat alles een verrassing wordt. Ik heb heel veel zin om allemaal nieuwe mensen en culturen te leren kennen. \nIk heb nu al een tijdje contact met mijn gastouders. Ze zijn super aardig en hebben me al een paar handige tips gegeven voor volgend jaar.', + imageUrl: + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: null, + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'Brazilië', + toFlag: 'br', + ), + + // Bo Heijns Outbounds( - name: 'Sem Weenk', + name: 'Bo Heijns', bio: - 'Hoi, ik ben Sem en ik ben 17 jaar oud. Ik zit nu in 5 havo en ik ga na dit schooljaar een tussenjaar nemen om een exchange student te worden. \n\n Ik ga op exchange naar de Verenigde Staten waar ik kom te wonen in het plaatsje Middlebury in Vermont. Ik heb al twee van mijn komende gastgezinnen ontmoet via Zoom. Het was heel leuk om ze zo alvast even te kunnen ontmoeten en ik kijk erna uit om ze in het echt te kunnen gaan zien. \n\n Ik kijk heel erg uit naar dit onvergetelijke avontuur en ik hoop in dit jaar allemaal geweldige vrienden en herinneringen te gaan maken. Ik hoop ook veel nieuwe dingen te gaan leren en om mezelf als persoon verder te gaan ontwikkelen. \n\n Ik heb tot nu toe al veel plezier gehad tijdens alle voorbereidingen en ik kan niet wachten tot dat het echte avontuur gaat beginnen.', + 'Hi, \nIk ben Bo, 15 jaar en ik ga 24/25 naar Frankrijk op Exchange. Ik zit nu in Vwo 4 en woon in Delft, zodra ik terug ben maar ik mijn Vwo af. \nIk ga naar Bellerive-sur-Allier, dit ligt dichtbij Vichy en ergens in het midden van Frankrijk. Ik kijk er erg naar uit om een nieuwe taal te leren, nieuwe ervaringen op te doen, nieuwe vrienden maken en veel te leren.', imageUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/sem-weenk.png', + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: null, + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'Frankrijk', + toFlag: 'fr', + ), + + // Britt Groeneboer + Outbounds( + name: 'Britt Groeneboer', + bio: + 'Hoi! \nMijn naam is Britt, ik woon in Nunspeet en ik ben 18 jaar oud. Ik ga komend schooljaar op Exchange naar Canada in de provincie New Brunswick. \nIk kijk al een lange tijd uit naar dit Exchange avontuur en ik heb enorm veel zin om deze zomer aan het jaar van mijn leven te beginnen. Ik hoop op een enorm leuk jaar waarin ik nieuwe vrienden voor het leven maak en veel nieuwe ervaringen op zal doen. \nIn Canada mag ik naar een echte high school en het lijkt mij heel leuk om de Engelse taal straks vloeiend te kunnen spreken. Daarnaast kijk ik uit naar de reis die ik met mede Exchange student kan maken in Noord-Amerika en natuurlijk alle andere ervaringen die mij te wachten staan! \nAl met al ben erg benieuwd hoe het is om een jaar lang weg van huis te zijn, maar ik kijk vooral heel erg uit naar het jaar wat mij te wachten staat in Canada!', + imageUrl: + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: null, + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'Canada', + toFlag: 'ca', + ), + + // Madyke de Groot + Outbounds( + name: 'Madyke de Groot', + bio: + 'Hoi! \nMijn naam is Madyke de Groot, ik ben 17 jaar oud en woon samen met mijn ouders in Nunspeet. \nKomend jaar ga ik op uitwisseling naar de Verenigde Staten. Ik ga wonen in Arlington, een dorpje in de staat Washington. \nArlington ligt tussen Seattle en Vancouver en is omgeven door mooie natuurgebieden. \nHet wonen bij gastgezinnen is voor mij een hele nieuwe ervaring en dat zal vast even wennen zijn. \nKomend schooljaar volg ik het junior jaar op de highschool van Arlington. In de ochtend lessen volgen en ‘s middag tijd voor sport en cultuur. \nHet wordt vast een spannende tijd waarin ik hoop veel mensen te leren kennen en door alle ervaringen als persoon te groeien. \nIk heb er ontzettend veel zin in!', + imageUrl: + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', email: null, phoneNumber: null, snapchatUrl: null, @@ -306,18 +381,79 @@ List outboundList = [ to: 'USA', toFlag: 'us', ), - // Marre Kroese + + // Tom Pellicaan Outbounds( - name: 'Marre Kroese', + name: 'Tom Pellicaan', bio: - 'Hallo, ik ben Marre Kroese en ik ga komend schooljaar naar Mexico!! Ik heb er super veel zin in en kijk er erg naar uit om nieuwe mensen te leren kennen en leuke herinneringen te maken. \n\n Ik heb vanaf kleins af aan al gezegd dat ik high school wil gaan doen, want eigenlijk wilde ik altijd naar Amerika. Op de informatiedag van Rotary in september heb ik mij meer laten vertellen over Mexico en vanaf dat moment wist ik het zeker dat ik naar Mexico wilde.\n\n Ik wil heel graag Spaans kunnen spreken, dus dit is een geweldige kans om deze taal te gaan leren. Ik kan niet wachten om naar Mexico te gaan!\n\n Ik zal vast veel gaan delen op mijn instagram, dus als je mij wilt volgen: marre.kroese.', + 'Grüezi Mitenand! \nMijn naam is Tom Pellicaan, ik ben 15 jaar, zit in 4 VWO en woon in Brabant. Ik heb ontzettend veel zin in mijn exchange jaar in Fribourg, Zwitserland, maar ik voel ook grote spanning. \nIn mijn vrije tijd ben ik behulpzaam bij jongerenorganisaties, hierdoor weet ik hoe krachtig het is als jongeren samenkomen, samenwerken en samen iets creëren en ondernemen. En dat doe je ook als uitwisselingsstudent! \nUitwisseling is voor mij een kans om mijzelf verder te ontwikkelen, tegelijk doe je zooo veel meer. Je bouwt internationale kenniskringen op en leert nieuwe culturen. Ik weet zeker dat dit gaat gebeuren en hoop verder Frans en Duits te leren (Fribourg is tweetalig) en een prachtjaar te hebben met prachtige mensen. \nMisschien kan ik als ik terugkom ook nog eens jodelen! \np.s. een tussenjaar op de middelbare kan gewoon! Als dit jou is: DOEN! Het gaat om de ontdekking en ervaring en dat is het zeker weten waar, maakt niet uit waar. \nÀ bientôt!', imageUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/marre-kroese.jpg', + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', email: null, phoneNumber: null, snapchatUrl: null, facebookUrl: null, - instagramUrl: 'https://www.instagram.com/marre.kroese/', + instagramUrl: null, + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'Zwitserland', + toFlag: 'ch', + ), + + // Zora Linde de Valck + Outbounds( + name: 'Zora Linde de Valck', + bio: + 'Hai! \nMijn naam is Zora Linde de Valck, ik ben 16 jaar en ik kom uit Roosendaal. \nIk ga op uitwisseling naar Thailand! Ik ga naar de stad Nakhon Sawan, in district 3350. Dit ligt op zo’n 3 uur rijden naar het noorden vanaf Bangkok. Ik heb al een tijd contact met mijn gastgezin, ze zijn super vriendelijk en verwelkomend en ik kijk er naar uit om ze in het echt te kunnen ontmoeten. \nTijdens mijn exchange hoop ik veel nieuwe mensen te ontmoeten, veel nieuwe dingen te proberen en beleven en veel plekken te mogen bezoeken. Ik ben erg benieuwd naar het leven daar. Ik vind het spannend maar heb er ook heel erg veel zin in.', + imageUrl: + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: null, + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'Thailand', + toFlag: 'th', + ), + + // Jens Hoppzak + Outbounds( + name: 'Jens Hoppzak', + bio: + 'Hallo allemaal, \nIk ben Jens Hoppzak, ik ben 16 jaar oud en ik woon in Sevenum. \nMijn hobby’s zijn: chillen met vrienden en sportief bezig zijn. Ik heb mijn gastouders al ontmoet en het is ook een sportief en gezellig gezin. \nIk ga op exchange naar Argentinië in het plaatsje Santa Lucia. Ik heb er veel zin in en kijk er naar uit om nieuwe mensen te leren kennen, cultuur te ontdekken en vloeiend Spaans te kunnen leren. Ik heb gekozen voor een jaar exchange omdat ik altijd al veel van de wereld wou zien en culturen ontdekken en omdat ik nog niet wist wat ik na de middelbare wou doen dit een perfecte keuze vond. \nIk kan niet wachten tot ik op het vliegtuig stap en het avontuur mag gaan beginnen.', + imageUrl: + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: null, + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'Argentinië', + toFlag: 'ar', + ), + + // Charlotte van Witteloostuijn + Outbounds( + name: 'Charlotte van Witteloostuijn', + bio: + 'Hola! \nIk ben Charlotte van Witteloostuijn en ik ben 17 jaar oud. Ik woon in Breda en ik ga volgend schooljaar naar Mexico toe! \nIk ben geplaatst in de stad Ensenada, Baja Calafornia in district 4100. Dit ligt helemaal aan de Westkust van Mexico en onder California. Het staat bekend om de mooie surfstranden en het lekkere eten. Zoals je wel begrijpt heb ik er suuuper veel zin in dus! \nIk hoop vooral veel nieuwe ervaringen op te doen, nieuwe sporten te leren, Spaans te leren, veel van de Mexicaanse cultuur te leren en natuurlijk een fantastisch jaar te hebben! \nGroetjes Charlotte', + imageUrl: + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: null, websiteUrl: null, linkedinUrl: null, from: 'Nederland', @@ -326,13 +462,13 @@ List outboundList = [ toFlag: 'mx', ), - // Boet Mostert + // Ella Klumpenhouwer Outbounds( - name: 'Boet Mostert', + name: 'Ella Klumpenhouwer', bio: - 'Hallo ik ben Boet Mostert en ik ben 17 jaar oud.\n Ik woon al mijn hele leven in Weesp. Daar ga ik ook naar school en sport ik.\n\n Mijn favoriete sport is voetbal dat doe ik nu al zo\'n 10 jaar. Ik vind mijn sociale leven ook erg belangrijk dus ben ik vaak met vrienden iets aan het doen.\n\n Ik ga dit jaar naar Indonesië en daar heb ik erg veel zin in. Ik kijk uit nar de prachtige cultuur, landschap en mensen maar ook naar het gewone dagelijks leven daar.', + 'Holaa!! \nIk ben Ella Klumpenhouwer. Ik ben 17 jaar oud en ik zit op VWO 5. Ik ga voor mijn exchange naar Chile🇨🇱, en daar kom ik terecht in district 4320. \nIk heb voor Chile gekozen, omdat het me heel leuk leek om naar Zuid-Amerika te gaan en daar de cultuur te ontdekken. Ik wist al een paar jaar dat ik dit wou gaan doen, omdat me vader het op mijn 12de al aan mij vroeg of dit mij leuk leek. Eerst was ik van plan om naar Japan te gaan, omdat dat mij een heel ander en bijzonder land leek. Maar na de informatiedag, had ik veel goede verhalen over Zuid-Amerika gehoord, en wist ik gelijk al dat ik naar Chile wou. Ook ben ik nog nooit in Zuid-Amerika geweest, dus ik heb zin om heen heel nieuw land/continent te ontdekken. \nIk wil in dit jaar de Chileense cultuur ontdekken en meemaken. Ook wil ik veel mensen ontmoeten en veel nieuwe vrienden maken. Ik wil ook veel nieuwe plekken zien en heel het land gaan ontdekken en ik wil Spaans gaan leren. \nIk heb contact met mijn eerste gastgezin en hierdoor heb ik nog meer zin om op uitwisseling te gaan. Ik heb er super veel zin in en ik hoop op een heel leuk jaar!❤', imageUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/boet-mostert.png', + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', email: null, phoneNumber: null, snapchatUrl: null, @@ -342,7 +478,67 @@ List outboundList = [ linkedinUrl: null, from: 'Nederland', fromFlag: 'nl', - to: 'Indonesia', - toFlag: 'id', - ) + to: 'Chili', + toFlag: 'cl', + ), + + // Robin van Gorp + Outbounds( + name: 'Robin van Gorp', + bio: + 'Hi! \nIk ben Robin, ik ben 16 jaar oud en woon in Heeze. Ik zit in havo 5 en ben niet klaar met mijn examens. \nDit jaar ga ik naar São Bernardo do Campo in Brazilië. Het is een stad ongeveer een half uurtje van São Paulo vandaan. Ik heb super veel zin om naar Brazilië te gaan en nieuwe culturen te ontdekken en mensen te ontmoeten. Zoals mijn eerste gast gezin waar ik al contact mee heb en die ook heel blij zijn dat ik kom. Ik hoop dat ik het Portugees snel onder de knie krijg en een heel leuk jaar ga hebben. \nIk heb mijn vlucht al geboekt en heb er heel veel zin in! \nGroetjes, \nRobin', + imageUrl: + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: null, + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'Brazilië', + toFlag: 'br', + ), + + // Jesper Koornstra + Outbounds( + name: 'Jesper Koornstra', + bio: + 'Ik ben Jesper en ik ben 17 jaar oud. \nIk woon in Harlingen, een havenstad in Friesland. Ik ben bijna klaar met mijn vijfde jaar op het Stedelijk Gymnasium Leeuwarden en zal na mijn exchange beginnen aan het examenjaar in de zesde. \nIk ga deze zomer naar Leavenworth in de staat Washington in de Verenigde Staten. Deze staat ligt helemaal in het Noord-Westen van de VS en is daarom omringd door bergen. Leavenworth is een klein stadje in het midden van Washington. Het heeft ongeveer 2.500 inwoners en is voornamelijk op tourisme gefocust. De hele stad is namelijk in een Bavarisch thema gebouwd. Het ligt tussen de bergen in en geeft daarom een groot aanbod in natuursporten. Ik heb zelf nog nooit iets van wintersport gedaan, maar ik hoop er hier kennis mee te maken. \nIn Nederland hockey ik, maar dat is in Leavenworth geen optie, daarom kijk ik er zeer naar uit om andere sporten te proberen. Omdat ik al contact heb met mensen van mijn toekomstige school heb ik mij al kunnen inschrijven voor het voetbalteam. En kijk ik er naar uit om met het team door Washington te reizen.', + imageUrl: + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: null, + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'USA', + toFlag: 'us', + ), + + // Marit Tusveld + Outbounds( + name: 'Marit Tusveld', + bio: + 'Hoi, \nIk ben Marit, ik ben 18 jaar en ik woon in Eemnes, Utrecht. Ik verhuis komend jaar naar district 4921 in Argentinië, naar het stadje San Antonio Oeste in de provincie Río Negro!! \nOp uitwisseling gaan is al heel lang een droom van mij. Ik ben al mijn hele leven geïnteresseerd geweest in het leren over andere talen en culturen. \nIk wil ontzettend graag Spaans leren en deze uitwisseling is echt een geweldige kans om dat te doen. Ik kan niet wachten tot mijn uitwisseling van start gaat en ik hoop mooie ervaringen op te doen en vrienden voor het leven te maken!', + imageUrl: + 'https://upload.wikimedia.org/wikipedia/commons/7/7c/Profile_avatar_placeholder_large.png', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: null, + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'Argentinië', + toFlag: 'ar', + ), ]; diff --git a/lib/features/outbound/data/outbound_list_23_24.dart b/lib/features/outbound/data/outbound_list_23_24.dart new file mode 100644 index 00000000..9d8e9b89 --- /dev/null +++ b/lib/features/outbound/data/outbound_list_23_24.dart @@ -0,0 +1,348 @@ +// 🌎 Project imports: +import 'package:rotary_nl_rye/features/outbound/presentation/models/ClassOf.dart'; + +List outboundList = [ + // Norah van de Vegte + Outbounds( + name: 'Norah van de Vegte', + bio: + 'Hey! My name is Norah van der Vegte and I am currently 17 years old. I live in Zwolle (for now) and once I am back from my exchange I would love to study Creative Writing at Artez.\n\n My exchange year will be in Vichy, the south of France! I am as curious as excited and I am very much looking forward to my year in France. Not only the language, but the customs and people are what drawn me to the country.\n\nI think it will be a totally different world from my own, not just because of the language and customs I mentioned just now, but also the idea of living with new people and creating new connections with people I otherwise never would have met.', + imageUrl: + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/norah-van-de-vegte.jpg', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: null, + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'France', + toFlag: 'fr', + ), + // Jesse Talens + Outbounds( + name: 'Jesse Talens', + bio: + 'Hoi! Ik ben Jesse en ik ga volgend jaar naar Finland!\n\nMijn nieuwe woonplaats is Klaukkala, een dorp 20 kilometer ten noorden van Helsinki. Ik houd van avontuur en dingen ontdekken en ik hoop dat veel te kunnen doen volgend jaar! De Finse taal is best moeilijk, dus ik ben al begonnen met leren, en ik hoop dat ik het snel onder de knie krijg! Verder hoop ik volgend jaar nog veel andere dingen te leren, zoals ijshockey en hoe je van een sauna kan genieten!', + imageUrl: + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/jesse-talens.jpg', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: null, + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'Finland', + toFlag: 'fi', + ), + // Sander van Dam + Outbounds( + name: 'Sander van Dam', + bio: + 'Ik ben Sander van Dam, ik ben 17 jaar en woon in Lochem. \n\n Mijn hobby’s zijn sporten, zoals naar de sportschool en mountainbiken, met vrienden afspreken en reizen. \n\n Ik ga op exchange naar Argentinië! Ik hoop dat ik een goede band opbouw met de gastfamillies en vrienden die ik daar maak. Ook heb ik heel veel zin om de Argentijnse cultuur te leren kennen en vloeiend Spaans te leren spreken.\n\nIk heb er heel veel zin in en kan niet wachten om in het vliegtuig te stappen en dit avontuur te beginnen!', + imageUrl: + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/sander-van-dam.jpg', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: null, + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'Argentina', + toFlag: 'ar', + ), + // Leonie Poland + Outbounds( + name: 'Leonie Poland', + bio: + 'Hi there, \n\n Mijn naam is Leonie Poland. Ik ben 17 jaar oud. Ik woon in Wervershoof en zit in het 2 de jaar van mijn mbo opleiding.\n\n Ik ga op uitwisseling naar Amerika! Ik ga wonen in de staat Kansas dat is in het bijna het middelste punt van Amerika. Mijn dorpje heet Council grove en ligt een uur rijden van de hoofdstad Topeka. Ik heb contact met mijn gastgezin en met mijn district de mensen zijn allemaal heel lief en verwelkomend en zijn super enthousiast om een Nederlands iemand te hosten aangezien ik de eerst ooit uit Nederland zal zijn.\n\n Ik kijk uit naar de hele ervaring en om zoveel nieuwe mensen te ontmoeten en vriendschapen voor het leven te sluiten. Ik heb de selectie procedure twee keer mogen doorlopen en voel mij helemaal klaar voor dit te gekke avontuur. Ik vind het natuurlijk ook spannend maar ik ben al zo welkom ontvangen dat moet wel goedkomen. Ik vind het ook heel leuk om nu al het proces van de andere uitwisselingsstudenten te volgen van zowel die uit Nederland als de uitwisselingstudenten uit mijn district. Ik heb er zin in!', + imageUrl: + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/leonie-poland.jpg', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: null, + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'USA', + toFlag: 'us', + ), + // Mirthe Vereecken + Outbounds( + name: 'Mirthe Vereecken', + bio: + 'Hoi ik ben Mirthe Vereecken 15 jaar oud en ik mag in 2023/2024 Rotary Nederland vertegenwoordigen.\n Ik ga naar de plaats Campbell River op Vancouver Island in Canada. \n\n Behalve naar de highschool kan ik hier mijn 2 grote hobby’s beoefenen, veld hockey en skiën. \n\n Ik kom uit Zwolle maar mijn sponsor club is Rotary Club Dronten. \n\n Ik kan niet wachten om naar Canada te gaan. Ik hoop dat ik daar veel vrienden maak en een jaar heb om nooit meer te vergeten. \n\n Het selectie weekend en de trainingsdag in Utrecht was ook super leuk en leerzaam.', + imageUrl: + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/mirthe-vereecken.png', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: null, + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'Canada', + toFlag: 'ca', + ), + // Sophie Linssen + Outbounds( + name: 'Sophie Linssen', + bio: + 'Hee! Ik ben Sophie, ik ben 17 jaar en ik woon in Maarssen. In mijn vrije tijd doe ik graag dingen met vrienden, werk ik in de horeca en volg ik danslessen. \n\n Dit jaar ga ik naar Santos in Brazilië. Santos ligt aan de kust in de buurt van de stad Sao Paulo. Ik heb super veel zin om de Braziliaanse cultuur te ontdekken. Ik kijk er naar uit om nieuwe mensen te leren kennen en hopelijk heel snel Portugees te kunnen spreken. Ook lijkt het me super leuk om de nationale dansen te leren en Brazilië feesten mee te maken. Ik heb inmiddels contact met mijn eerste gastgezin en daardoor krijg ik extra veel zin om te gaan. In het voortraject heb al veel leuke mensen ontmoet en wens iedereen een heel tof uitwisselingsjaar!!\n\n Groetjes van Sophie!', + imageUrl: + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/sophie-linssen.jpg', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: null, + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'Brazil', + toFlag: 'br', + ), + // Esmyra Waar + Outbounds( + name: 'Esmyra Waar', + bio: + 'Hii ik ben Esmyra Waar, 18 jaar oud en woon in Harlingen Friesland.\n\n Ik verhuis dit jaar voor een jaar lang naar Sandpoint Idaho in de Verenigde Staten, bij de grens van Canada. Het is een heel mooi plekje, met een strand en skipiste.\n Sandpoint is erg sportief, ze doen er graag aan onderandere wandelen door de bergen, kajakken, zwemmen en skiën/ snowboarden dus ik hoop daar het sportieve meer op te pakken. \n\n Ik ben super benieuwd naar het avontuur dat staat te wachten op mij en alle nieuwe mensen die ik ga ontmoeten!', + imageUrl: + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/esmyra-waar.png', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: null, + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'USA', + toFlag: 'us', + ), + // Philipien van Waveren Hogervorst + Outbounds( + name: 'Philipien van Waveren Hogervorst', + bio: + 'Hoi allemaal! \n Ik ben Philipien.\n Ik ben 17 jaar oud, ik zit nu in 5 havo. \n En ik ga in 2023/2024 naar Mexico!!! \n Ik ga naar district 4170, wat in de omgeving van Mexico-stad ligt. \n\n In 2012 heb ik al voor 3 weken rondgereisd in Mexico. Ik heb heel veel gezien maar omdat ik zo jong was weet ik daar niet alles meer van. Dus nu, 11 jaar later, hoop ik heel wat nieuwe avonturen aan mijn Mexico herinneringen toe te kunnen voegen. \n\n Ik vind het heel leuk dat ik daar zoveel nieuwe dingen ga meemaken en mensen ga ontmoeten. Ook heb ik heel veel zin in het lekkere Mexicaanse eten! En het spaans leren natuurlijk. \n\n Wel vind ik het gek om straks opeens een jaar geen nederlands te spreken maar hoe kan je leuker een nieuwe taal leren dan via een uitwisseling! Dus ook daar kijk ik erg naar uit.\n\n Alles bij elkaar heb ik er super veel zin in en kan ik niet wachten tot het avontuur begint.\n\n Adiósss!', + imageUrl: + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/philipien-van-waveren-hogervorst.jpg', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: null, + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'Mexico', + toFlag: 'mx', + ), + // Zomer Dijkstra + Outbounds( + name: 'Zomer Dijkstra', + bio: + 'Hallo allemaal! Ik ben Zomer Dijkstra en ik ben 17 jaar oud. \n Tijdens het leren voor mijn examens van havo 5 ben ik ook al druk bezig met mijn vertrek naar Brazilië! \n\n De eerste woordjes worden met Duolingo al geleerd en als ik terug kom kan ik natuurlijk een goed gesprek voeren in het Portugees! Ik ga in Brazilië heel veel mensen leren kennen en natuurlijk ontzettend veel leren over van alles. Van andere gewoontes en eten tot aan zelfstandig dingen regelen en volwassen worden. Ik verwacht vooral dat ik het heel erg leuk ga hebben en een tweede thuis van Brazilië kan maken. \n\n Naast dat ik toch wel een beetje zenuwachtig ben om aan het eind van dit jaar te gaan, heb ik er ook echt ontzettend veel zin in en ben benieuwd wat er allemaal op mijn pad zal komen!', + imageUrl: + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/zomer-dijkstra.png', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: null, + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'Brazil', + toFlag: 'br', + ), + // Annefleur Derksen + Outbounds( + name: 'Annefleur Derksen', + bio: + 'Hoi!\n\n Ik ben Annefleur, 15 jaar en zit in HAVO 5. Voor mijn exchange mag ik naar district 5060! Dit is een 2-landen district. Dit houdt in dat ik of in Washington state, Amerika terechtkom of in het zuiden van British Columbia, Canada.\n\n Ik wilde al op exchange sinds dat ik 10 ben en kan daarom ook niet wachten om dit leuke avontuur te laten beginnen. Tijdens mijn exchange hoop ik nieuwe mensen te ontmoeten, veel kennis op te doen en mooie plekken te mogen bezoeken. Ook ben ik erg benieuwd naar het schoolleven.\n\n Kortom, ik heb enorm veel zin in ‘my lifetime in a year’.', + imageUrl: + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/annefleur-derksen.png', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: null, + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'Canada', + toFlag: 'ca', + ), + // Paco Dijkstra + Outbounds( + name: 'Paco Dijkstra', + bio: + 'Hallo ik ben Paco Dijkstra ik zit op hockey. Ik ben 16 jaar oud en ik word 17 in Spanje, het land waar ik op exchange ga. Ik hoop dat ik veel nieuwe dingen ga leren, waaronder de cultuur en de taal, maar hopelijk nog veel meer. Ik wil graag in Spanje veel nieuwe mensen leren kennen en nieuwe vriendschappen aangaan.\n\n De weg naar de Exchange toe was leuk waaronder de activiteiten. Bij de activiteiten hebben we eigenlijk alleen maar leuke dingen gedaan en heb ik de kans gekregen om al veel nieuwe kinderen te leren kennen in Nederland.', + imageUrl: + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/paco-dijkstra.jpg', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: null, + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'Spain', + toFlag: 'es', + ), + // Jackie-Li Molenaar + Outbounds( + name: 'Jackie-Li Molenaar', + bio: + 'Hii, ik ben Jackie-Li Molenaar en ik woon in Utrecht. En ik ben 17 jaar oud. Ik ga op Exchange naar Florida, de verenigde Staten. \n\n Het was al een droom van kinds af aan om naar Amerika toe te gaan en dit mag ik nu gaan doen!\n\n Ik hoop dat ik een heel leuk jaar zal hebben en ook nieuwe vrienden ga maken met wie ik voor heel lang nog contact mee zal houden. En daarnaast kijk ik er naar uit om nog zelfstandiger te worden en mezelf wat beter te leren kennen.', + imageUrl: + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/jackie-li-molenaar.jpg', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: null, + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'USA', + toFlag: 'us', + ), + // Rachel van Dijk + Outbounds( + name: 'Rachel van Dijk', + bio: + 'Hoii, ik ben Rachel, ik ben 17 jaar en ik kom uit Gouda. Ik hou erg van dansen (modern/jazz) en afspreken met vrienden. \n\n Volgend jaar ga ik in mijn tussenjaar op Exchange naar district 2042 in Italië. Dat is het district boven Milaan. Ik heb heel veel zin om naar Italië te gaan en om de Italiaanse cultuur te leren kennen en de taal te leren. \n\n De voorbereiding van het Exchange jaar is tot nu toe erg leuk. We hebben laatst ook een erg gezellige dag gehad in Utrecht met alle toekomstige Exchange studenten. Iedereen is erg aardig en erg enthousiast. \n\n Arrivederci!', + imageUrl: + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/rachel-van-dijk.jpg', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: null, + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'Italy', + toFlag: 'it', + ), + // Taco van Hooijdonk + Outbounds( + name: 'Taco van Hooijdonk', + bio: + 'Ik ben Taco van Hooijdonk, 16 jaar uit Etten-Leur. \n\n Binnenkort vertrek ik naar Curitiba, Brazilië, voor een uitwisselingsjaar! Ik kijk ernaar uit om nieuwe ervaringen op te doen, de Braziliaanse cultuur te ontdekken en het lokale sportleven te verkennen. Het traject om hier te komen verliep soepel en ik heb al leuke tijd gehad met mijn mede "prebounds". Ik wens hen allemaal een fantastisch jaar vol mooie avonturen toe.\n\n Wil je mijn tijd daar volgen? Neem dan een kijkje op mijn Instagram-account @taco_vh\n\n Groetjes,\n Taco van Hooijdonk', + imageUrl: + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/taco-van-hooijdonk.png', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: 'https://www.instagram.com/taco_vh/', + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'Brazil', + toFlag: 'br', + ), + // Pepijn Kimmels + Outbounds( + name: 'Pepijn Kimmels', + bio: + 'Ik ben Pepijn Kimmels en ik ben 18 jaar oud. Ik woon in Winterswijk, een dorp in het oosten van Gelderland, hier woon ik met mijn ouders, oudere zus Sennah en tweelingbroer Julian. Ik zit op dit moment nog op het Gerrit Komrij College, waar ik de HAVO volg. Ook speel ik voetbal, dit doe ik al bijna 12 jaar en ik hoop dat ik dat in mijn Exchange jaar kan blijven doen maar het lijkt me ook leuk om iets anders te proberen. \n\n Toen ik 12 was hadden wij een meisje uit India in huis via de Rotary Youth Exchange. Dit vond ik heel leuk en interessant en daardoor ben ik mij er ook in gaan verdiepen. Nu, bijna 6 jaar later ben ik erg blij om te zeggen dat ik ook via de Rotary op Exchange mag. \n\n Ik ga in Augustus naar de Verenigde Staten, naar het zuiden van de staat Californië naar de kleine stad genaamd Carlsbad, gelegen aan de kust. De afgelopen weken bestonden voor mij vooral uit het ontdekken op Google van de regio waar ik kom te wonen en het regelen van mijn visum. Dit heb ik nu ook bijna afgerond en dat betekent dat ik zo goed als klaar ben om op het vliegtuig te stappen en een compleet nieuwe ervaring op te doen.\n\n Ik krijg vaak de vraag of ik het spannend vind om een jaar weg te gaan maar op dit moment ben ik vooral enthousiast maar wie weet komt de spanning nog wel.', + imageUrl: + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/pepijn-kimmels.jpg', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: null, + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'USA', + toFlag: 'us', + ), + // Sem Weenk + Outbounds( + name: 'Sem Weenk', + bio: + 'Hoi, ik ben Sem en ik ben 17 jaar oud. Ik zit nu in 5 havo en ik ga na dit schooljaar een tussenjaar nemen om een exchange student te worden. \n\n Ik ga op exchange naar de Verenigde Staten waar ik kom te wonen in het plaatsje Middlebury in Vermont. Ik heb al twee van mijn komende gastgezinnen ontmoet via Zoom. Het was heel leuk om ze zo alvast even te kunnen ontmoeten en ik kijk erna uit om ze in het echt te kunnen gaan zien. \n\n Ik kijk heel erg uit naar dit onvergetelijke avontuur en ik hoop in dit jaar allemaal geweldige vrienden en herinneringen te gaan maken. Ik hoop ook veel nieuwe dingen te gaan leren en om mezelf als persoon verder te gaan ontwikkelen. \n\n Ik heb tot nu toe al veel plezier gehad tijdens alle voorbereidingen en ik kan niet wachten tot dat het echte avontuur gaat beginnen.', + imageUrl: + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/sem-weenk.png', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: null, + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'USA', + toFlag: 'us', + ), + // Marre Kroese + Outbounds( + name: 'Marre Kroese', + bio: + 'Hallo, ik ben Marre Kroese en ik ga komend schooljaar naar Mexico!! Ik heb er super veel zin in en kijk er erg naar uit om nieuwe mensen te leren kennen en leuke herinneringen te maken. \n\n Ik heb vanaf kleins af aan al gezegd dat ik high school wil gaan doen, want eigenlijk wilde ik altijd naar Amerika. Op de informatiedag van Rotary in september heb ik mij meer laten vertellen over Mexico en vanaf dat moment wist ik het zeker dat ik naar Mexico wilde.\n\n Ik wil heel graag Spaans kunnen spreken, dus dit is een geweldige kans om deze taal te gaan leren. Ik kan niet wachten om naar Mexico te gaan!\n\n Ik zal vast veel gaan delen op mijn instagram, dus als je mij wilt volgen: marre.kroese.', + imageUrl: + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/marre-kroese.jpg', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: 'https://www.instagram.com/marre.kroese/', + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'Mexico', + toFlag: 'mx', + ), + + // Boet Mostert + Outbounds( + name: 'Boet Mostert', + bio: + 'Hallo ik ben Boet Mostert en ik ben 17 jaar oud.\n Ik woon al mijn hele leven in Weesp. Daar ga ik ook naar school en sport ik.\n\n Mijn favoriete sport is voetbal dat doe ik nu al zo\'n 10 jaar. Ik vind mijn sociale leven ook erg belangrijk dus ben ik vaak met vrienden iets aan het doen.\n\n Ik ga dit jaar naar Indonesië en daar heb ik erg veel zin in. Ik kijk uit nar de prachtige cultuur, landschap en mensen maar ook naar het gewone dagelijks leven daar.', + imageUrl: + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/outbound/long-term/23-24/boet-mostert.png', + email: null, + phoneNumber: null, + snapchatUrl: null, + facebookUrl: null, + instagramUrl: null, + websiteUrl: null, + linkedinUrl: null, + from: 'Nederland', + fromFlag: 'nl', + to: 'Indonesia', + toFlag: 'id', + ) +]; diff --git a/lib/features/outbound/presentation/pages/long_term/class_of/class_of.dart b/lib/features/outbound/presentation/pages/long_term/class_of/class_of.dart index 495d53f3..7aa21e66 100644 --- a/lib/features/outbound/presentation/pages/long_term/class_of/class_of.dart +++ b/lib/features/outbound/presentation/pages/long_term/class_of/class_of.dart @@ -3,10 +3,10 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; // 🌎 Project imports: -import 'package:rotary_nl_rye/core/presentation/widgets/image_list_tile.dart'; import 'package:rotary_nl_rye/core/prop.dart'; import 'package:rotary_nl_rye/features/outbound/data/outbound_list.dart'; import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; +import 'package:rotary_nl_rye/features/widgets/list_tiles.dart'; import 'class_of_details_page.dart'; class ClassOfPage extends StatefulWidget { @@ -28,24 +28,24 @@ class _ClassOfPageState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - systemOverlayStyle: SystemUiOverlayStyle( - statusBarBrightness: MediaQuery.of(context).platformBrightness, - ), - backgroundColor: Colors.transparent, - elevation: 0.0, - // centerTitle: false, - leading: UniformBackButton(), - title: Text( - 'Class Of 2023-24', - textScaler: TextScaler.linear(1.2), - style: - TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - )), + systemOverlayStyle: SystemUiOverlayStyle( + statusBarBrightness: MediaQuery.of(context).platformBrightness, + ), + backgroundColor: Colors.transparent, + elevation: 0.0, + leading: UniformBackButton(), + title: Text( + 'Class Of 2024-25', + textScaler: TextScaler.linear(1.2), + style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), + ), + ), body: ListView.builder( shrinkWrap: false, itemBuilder: (context, index) => OutboundStudentListTile( - item: outboundList[index], - classOfDetailsPage: ClassOfDetails(person: outboundList[index])), + item: outboundList[index], + classOfDetailsPage: ClassOfDetails(person: outboundList[index]), + ), itemCount: outboundList.length, ), ); diff --git a/lib/features/outbound/presentation/pages/long_term/class_of/class_of_details_page.dart b/lib/features/outbound/presentation/pages/long_term/class_of/class_of_details_page.dart index 5f83f246..d2394076 100644 --- a/lib/features/outbound/presentation/pages/long_term/class_of/class_of_details_page.dart +++ b/lib/features/outbound/presentation/pages/long_term/class_of/class_of_details_page.dart @@ -17,6 +17,7 @@ import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; class ClassOfDetails extends StatelessWidget { final Outbounds person; + ClassOfDetails({required this.person}); @override @@ -38,357 +39,254 @@ class ClassOfDetails extends StatelessWidget { ), body: ListView( shrinkWrap: true, - scrollDirection: Axis.vertical, children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, + buildProfileHeader(context), + if (hasSocialMediaLinks() || person.phoneNumber != null) + buildDivider(), + if (hasSocialMediaLinks()) buildSocialMediaLinks(), + if (hasSocialMediaLinks()) buildDivider(), + buildAboutSection(), + buildContactOptions(context), + SizedBox(height: 40), + ], + ), + ); + } + + Widget buildProfileHeader(BuildContext context) { + return Padding( + padding: EdgeInsets.all(20.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( children: [ - Padding( - padding: EdgeInsets.only( - left: 20, - right: 20, - top: 15, - bottom: 16, - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - InkWell( - borderRadius: BorderRadius.circular(60), - onTap: () { - Navigator.of(context).push(PageRouteBuilder( - opaque: false, - pageBuilder: (BuildContext context, _, __) => - FullScreenImage(url: person.imageUrl))); - }, - child: CachedNetworkImage( - height: 60, - width: 60, - imageUrl: person.imageUrl, - imageBuilder: (context, imageProvider) => - Container( - decoration: BoxDecoration( - shape: BoxShape.circle, - image: DecorationImage( - image: imageProvider, - fit: BoxFit.cover, - ), - ), - ), - placeholder: (context, url) => - CircularProgressIndicator(), - errorWidget: (context, url, error) => - Icon(Icons.error), - )), - SizedBox( - width: 12, - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - width: Device.width - 150, - child: Text(person.name, - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - inherit: true, - fontSize: 22.0, - fontWeight: FontWeight.bold, - )), - ), - SizedBox( - height: 4, - ), - SizedBox( - width: Device.width - 150, - child: Row( - children: [ - Text(person.from, - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - fontWeight: FontWeight.w500, - inherit: true, - fontSize: 14.0, - color: Colors.grey[600], - )), - SizedBox( - width: 2, - ), - SvgPicture.asset( - 'assets/icons/flags/${person.fromFlag}.svg', - height: 15), - SizedBox( - width: 5, - ), - FaIcon( - FontAwesomeIcons.arrowRightLong, - color: Colors.grey, - ), - SizedBox( - width: 5, - ), - Text(person.to, - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - fontWeight: FontWeight.w500, - inherit: true, - fontSize: 14.0, - color: Colors.grey[600], - )), - SizedBox( - width: 2, - ), - person.toFlag == null - ? SizedBox.shrink() - : SvgPicture.asset( - 'assets/icons/flags/${person.toFlag}.svg', - height: 15) - ], - ), - ), - ], - ) - ], - ), - // SvgPicture.asset('assets/icons/flags/${person.flag}.svg', - // height: 20) - ], - ), - ), - person.websiteUrl == null && - person.facebookUrl == null && - person.instagramUrl == null && - person.snapchatUrl == null && - person.phoneNumber == null - ? SizedBox.shrink() - : Padding( - padding: const EdgeInsets.only( - top: 0.0, left: 20.0, bottom: 0.0, right: 20), - child: Divider( - height: 15, - thickness: 2, + InkWell( + borderRadius: BorderRadius.circular(60), + onTap: () { + Navigator.of(context).push(PageRouteBuilder( + opaque: false, + pageBuilder: (BuildContext context, _, __) => + FullScreenImage(url: person.imageUrl))); + }, + child: CachedNetworkImage( + height: 60, + width: 60, + imageUrl: person.imageUrl, + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + shape: BoxShape.circle, + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, ), ), - //TODO if he has one of the socials not. then it doen't need to show up! - Padding( - padding: const EdgeInsets.only(left: 15.0, right: 15), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - person.instagramUrl == null - ? SizedBox.shrink() - : Padding( - padding: - const EdgeInsets.only(right: 10.0, left: 10.0), - child: Stack( - children: [ - TextButton( - child: FaIcon( - FontAwesomeIcons.instagram, - color: Color(0xFFbc2a8d), - ), - onPressed: () => - launchUrlString('${person.instagramUrl}'), - ), - ], - ), - ), - person.snapchatUrl == null - ? SizedBox.shrink() - : Padding( - padding: - const EdgeInsets.only(right: 10.0, left: 10.0), - child: Stack( - children: [ - TextButton( - child: FaIcon( - FontAwesomeIcons.snapchat, - color: Color.fromARGB(221, 201, 198, 8), - ), - onPressed: () => - launchUrlString('${person.snapchatUrl}'), - ), - ], - ), - ), - person.linkedinUrl == null - ? SizedBox.shrink() - : Padding( - padding: - const EdgeInsets.only(right: 10.0, left: 10.0), - child: Stack( - children: [ - TextButton( - child: FaIcon( - FontAwesomeIcons.linkedinIn, - color: Color(0xFF0e76a8), - ), - onPressed: () => - launchUrlString('${person.linkedinUrl}'), - ), - ], - ), - ), - person.facebookUrl == null - ? SizedBox.shrink() - : Padding( - padding: - const EdgeInsets.only(right: 10.0, left: 10.0), - child: Stack( - children: [ - TextButton( - child: FaIcon( - FontAwesomeIcons.facebookF, - color: Color(0xFF3b5998), - ), - onPressed: () => - launchUrlString('${person.facebookUrl}'), - ), - ], - ), - ), - person.websiteUrl == null - ? SizedBox.shrink() - : Padding( - padding: - const EdgeInsets.only(right: 10.0, left: 10.0), - child: Stack( - children: [ - TextButton( - child: FaIcon( - FontAwesomeIcons.globe, - color: Color(0xFF0e76a8), - ), - onPressed: () => - launchUrlString('${person.websiteUrl}'), - ), - ], - ), - ), - ], + ), + placeholder: (context, url) => CircularProgressIndicator(), + errorWidget: (context, url, error) => Icon(Icons.error), ), ), + SizedBox(width: 12), + buildPersonInfo(context), + ], + ), + ], + ), + ); + } - person.websiteUrl == null && - person.linkedinUrl == null && - person.facebookUrl == null && - person.instagramUrl == null && - person.snapchatUrl == null - ? SizedBox.shrink() - : Padding( - padding: const EdgeInsets.only( - top: 0.0, left: 20.0, bottom: 10.0, right: 20), - child: Divider( - height: 15, - thickness: 2, - ), - ), + Widget buildPersonInfo(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + width: Device.width - 150, + child: Text( + person.name, + maxLines: 2, + overflow: TextOverflow.ellipsis, + softWrap: false, + style: TextStyle( + fontSize: 22.0, + fontWeight: FontWeight.bold, + ), + ), + ), + SizedBox(height: 4), + buildLocationInfo(), + ], + ); + } - Padding( - padding: - const EdgeInsets.only(top: 20.0, left: 30.0, bottom: 0.0), - child: Text( - 'About me', - style: TextStyle( - color: Colors.grey[600], - fontSize: 18.0, - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only( - top: 0.0, left: 30.0, bottom: 0.0, right: 300), - child: Divider( - height: 15, - thickness: 2, - ), - ), - Padding( - padding: - const EdgeInsets.only(left: 30.0, right: 30.0, top: 5.0), - child: Text( - person.bio, - style: TextStyle(fontSize: 16.0), - ), - ), - person.websiteUrl == null && - person.linkedinUrl == null && - person.facebookUrl == null && - person.instagramUrl == null && - person.snapchatUrl == null - ? SizedBox( - height: 40, - ) - : SizedBox.shrink(), + Widget buildLocationInfo() { + return Row( + children: [ + Text( + person.from, + maxLines: 2, + overflow: TextOverflow.ellipsis, + softWrap: false, + style: TextStyle( + fontWeight: FontWeight.w500, + fontSize: 14.0, + color: Colors.grey[600], + ), + ), + SizedBox(width: 2), + SvgPicture.asset( + 'assets/icons/flags/${person.fromFlag}.svg', + height: 15, + ), + SizedBox(width: 5), + FaIcon( + FontAwesomeIcons.arrowRightLong, + color: Colors.grey, + ), + SizedBox(width: 5), + Text( + person.to, + maxLines: 2, + overflow: TextOverflow.ellipsis, + softWrap: false, + style: TextStyle( + fontWeight: FontWeight.w500, + fontSize: 14.0, + color: Colors.grey[600], + ), + ), + SizedBox(width: 2), + if (person.toFlag != null) + SvgPicture.asset( + 'assets/icons/flags/${person.toFlag}.svg', + height: 15, + ), + ], + ); + } - Padding( - padding: - const EdgeInsets.only(top: 15.0, left: 30.0, right: 20.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - person.email == null - ? SizedBox.shrink() - : Container( - height: 70.0, - width: 70.0, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(30.0), - color: Colors.grey[200], - ), - child: RawMaterialButton( - onPressed: () { - launchUrlString('mailto:${person.email}'); - }, - shape: new RoundedRectangleBorder( - borderRadius: BorderRadius.circular(30.0)), - child: FaIcon( - FontAwesomeIcons.envelope, - color: Colors.black, - size: 30, - ))), - person.phoneNumber == null - ? SizedBox.shrink() - : Container( - height: 70.0, - width: 70.0, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(30.0), - color: Colors.grey[200], - ), - child: RawMaterialButton( - onPressed: () => - openwhatsapp(context, person.phoneNumber!), - shape: new RoundedRectangleBorder( - borderRadius: BorderRadius.circular(30.0)), - child: FaIcon( - FontAwesomeIcons.whatsapp, - color: Color( - 0xFF25D366, - ), - size: 40, - ), - )), - ], - ), - ), + Widget buildDivider() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0), + child: Divider( + height: 15, + thickness: 2, + ), + ); + } - SizedBox( - height: 40, - ), - ], - ) + Widget buildSocialMediaLinks() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 15.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + if (person.instagramUrl != null) + buildSocialMediaIcon(FontAwesomeIcons.instagram, Color(0xFFbc2a8d), + person.instagramUrl), + if (person.snapchatUrl != null) + buildSocialMediaIcon(FontAwesomeIcons.snapchat, + Color.fromARGB(221, 201, 198, 8), person.snapchatUrl), + if (person.linkedinUrl != null) + buildSocialMediaIcon(FontAwesomeIcons.linkedinIn, Color(0xFF0e76a8), + person.linkedinUrl), + if (person.facebookUrl != null) + buildSocialMediaIcon(FontAwesomeIcons.facebookF, Color(0xFF3b5998), + person.facebookUrl), + if (person.websiteUrl != null) + buildSocialMediaIcon( + FontAwesomeIcons.globe, Color(0xFF0e76a8), person.websiteUrl), ], ), ); } + + Widget buildSocialMediaIcon(IconData icon, Color color, String? url) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 10.0), + child: TextButton( + child: FaIcon(icon, color: color), + onPressed: () => launchUrlString('$url'), + ), + ); + } + + Widget buildAboutSection() { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only( + top: 20.0, + left: 20.0, + ), + child: Text( + 'About me', + style: TextStyle( + color: Colors.grey[600], + fontSize: 18.0, + fontWeight: FontWeight.bold, + ), + ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0), + child: Divider(height: 15, thickness: 2, endIndent: 250), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0), + child: Text( + person.bio, + style: TextStyle(fontSize: 16.0), + ), + ), + ], + ); + } + + Widget buildContactOptions(context) { + return Padding( + padding: const EdgeInsets.only(top: 15.0, left: 30.0, right: 20.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + if (person.email != null) + buildContactIcon(FontAwesomeIcons.envelope, Colors.black, + 'mailto:${person.email}'), + if (person.phoneNumber != null) + buildContactIcon(FontAwesomeIcons.whatsapp, Color(0xFF25D366), + () => openwhatsapp(context, person.phoneNumber!)), + ], + ), + ); + } + + Widget buildContactIcon(IconData icon, Color color, dynamic onTap) { + return Container( + height: 70.0, + width: 70.0, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(30.0), + color: Colors.grey[200], + ), + child: RawMaterialButton( + onPressed: onTap is String ? () => launchUrlString(onTap) : onTap, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30.0), + ), + child: FaIcon( + icon, + color: color, + size: 30, + ), + ), + ); + } + + bool hasSocialMediaLinks() { + return person.instagramUrl != null || + person.snapchatUrl != null || + person.linkedinUrl != null || + person.facebookUrl != null || + person.websiteUrl != null; + } } diff --git a/lib/features/outbound/presentation/pages/long_term/information/comply_with.dart b/lib/features/outbound/presentation/pages/long_term/information/comply_with.dart index fb1c4de9..9d66dbc5 100644 --- a/lib/features/outbound/presentation/pages/long_term/information/comply_with.dart +++ b/lib/features/outbound/presentation/pages/long_term/information/comply_with.dart @@ -12,11 +12,6 @@ class ComplyWithPage extends StatefulWidget { } class _ComplyWithPageState extends State { - @override - initState() { - super.initState(); - } - @override Widget build(BuildContext context) { return Scaffold( @@ -34,70 +29,46 @@ class _ComplyWithPageState extends State { style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), ), ), - body: ListView( - padding: EdgeInsets.only(left: 20, top: 15, right: 20), - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'Zit je op het VMBO, HAVO of VWO dan kun je na selectie voor deze uitwisseling in aanmerking komen. Je hebt wel een Rotaryclub nodig die jou wil voordragen: een Sponsorclub. Dat betekent niet dat de club jouw kosten betaalt., maar de club is verantwoordelijk voor de terug ontvangst van een jaarkind uit het buitenland. Als jij weggaat komt er ook een buitenlandse scholier terug. Een diploma is geen vereiste om je op te geven; je kunt nl ook je schoolprogramma onderbreken. Soms is dat zelfs een voordeel. In het buitenland worden namelijk vaak strenge leeftijdsgrenzen gesteld om tot een school te worden toegelaten. En om deel te kunnen nemen aan de schoolsporten is het soms beter om nog geen diploma te hebben.', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'Voor de uitzending gelden indicatieve leeftijdsgrenzen, in principe 15-18 jaar. De leeftijdsgrens geldt voor overheidsscholen, soms is er enige rek mogelijk.', - style: TextStyle(fontSize: 14.0), - ), - ), - - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), + body: Padding( + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), + child: ListView( + shrinkWrap: true, + children: [ + buildInfoText( + 'Zit je op het VMBO, HAVO of VWO dan kun je na selectie voor deze uitwisseling in aanmerking komen. Je hebt wel een Rotaryclub nodig die jou wil voordragen: een Sponsorclub. Dat betekent niet dat de club jouw kosten betaalt., maar de club is verantwoordelijk voor de terug ontvangst van een jaarkind uit het buitenland. Als jij weggaat komt er ook een buitenlandse scholier terug. Een diploma is geen vereiste om je op te geven; je kunt nl ook je schoolprogramma onderbreken. Soms is dat zelfs een voordeel. In het buitenland worden namelijk vaak strenge leeftijdsgrenzen gesteld om tot een school te worden toegelaten. En om deel te kunnen nemen aan de schoolsporten is het soms beter om nog geen diploma te hebben.', + ), + SizedBox(height: 10), + buildInfoText( + 'Voor de uitzending gelden indicatieve leeftijdsgrenzen, in principe 15-18 jaar. De leeftijdsgrens geldt voor overheidsscholen, soms is er enige rek mogelijk.', + ), + SizedBox(height: 30), + Center( + child: Image.asset( + 'assets/image/rotary_blue.png', + height: 55.0, ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), + ), + SizedBox(height: 15), + Center( + child: Text( + 'Update: 31 May 2021', + style: TextStyle(color: Color(0xFF777777)), ), - SizedBox( - height: 60, - ), - ], - ) - ], + ), + SizedBox(height: 60), + ], + ), ), ); } - @override - void dispose() { - super.dispose(); + Widget buildInfoText(String text) { + return Padding( + padding: const EdgeInsets.only(top: 10.0), + child: Text( + text, + style: TextStyle(fontSize: 14.0), + ), + ); } } diff --git a/lib/features/outbound/presentation/pages/long_term/information/how_to_sign_up.dart b/lib/features/outbound/presentation/pages/long_term/information/how_to_sign_up.dart index 46dfe4d9..366bc209 100644 --- a/lib/features/outbound/presentation/pages/long_term/information/how_to_sign_up.dart +++ b/lib/features/outbound/presentation/pages/long_term/information/how_to_sign_up.dart @@ -17,11 +17,6 @@ class HowToSignUpPage extends StatefulWidget { } class _HowToSignUpPageState extends State { - @override - initState() { - super.initState(); - } - @override Widget build(BuildContext context) { return Scaffold( @@ -40,115 +35,64 @@ class _HowToSignUpPageState extends State { ), ), body: ListView( - padding: EdgeInsets.only(left: 20, top: 15, right: 20), - shrinkWrap: false, - scrollDirection: Axis.vertical, + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: 'Je stuurt een gezellig email bericht naar: ', - ), - TextSpan( - text: 'interesse@rotaryyep.nl.', - style: TextStyle(color: Colors.blue), - recognizer: TapGestureRecognizer() - ..onTap = () { - launchUrlString( - 'mailto:interesse@rotaryyep.nl?subject=interrese%20in%20LongTerm%20Exchange'); - }, - ), - TextSpan( - text: - ' Dan krijg je van ons een bevestiging dat we je mail hebben ontvangen. ', - ), - ])), - ), - - Padding( - padding: const EdgeInsets.only(top: 40.0, bottom: 30), - child: Container( - child: Center( - child: CupertinoButton.filled( - onPressed: () { - launchUrlString( - 'mailto:interesse@rotaryyep.nl?subject=interrese%20in%20LongTerm%20Exchange'); - }, - child: - // Row( - // children: [ - // Padding( - // padding: const EdgeInsets.only(left: 25.0), - // child: FaIcon( - // FontAwesomeIcons.phone, - // color: Colors.white, - // ), - // ), - // Padding( - // padding: const EdgeInsets.only(left: 20.0), - // child: Text( - // 'Call me ', - // style: TextStyle(color: Colors.white, fontSize: 18.0), - // ), - // ) - // ], - // ), - Text('Verstuur een Email'), - ), - ), - )), - - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, + Padding( + padding: const EdgeInsets.only(top: 20.0), + child: RichText( + text: TextSpan( + style: Theme.of(context) + .textTheme + .bodyMedium! + .copyWith(fontSize: 14), + children: [ + TextSpan( + text: 'Je stuurt een gezellig email bericht naar: ', ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), + TextSpan( + text: 'interesse@rotaryyep.nl.', + style: TextStyle(color: Colors.blue), + recognizer: TapGestureRecognizer() + ..onTap = () { + launchUrlString( + 'mailto:interesse@rotaryyep.nl?subject=interesse%20in%20LongTerm%20Exchange'); + }, ), - ), - ), - SizedBox( - height: 60, + TextSpan( + text: + ' Dan krijg je van ons een bevestiging dat we je mail hebben ontvangen.', + ), + ], ), - ], - ) + ), + ), + SizedBox(height: 40), + Center( + child: CupertinoButton.filled( + onPressed: () { + launchUrlString( + 'mailto:interesse@rotaryyep.nl?subject=interesse%20in%20LongTerm%20Exchange'); + }, + child: Text('Verstuur een Email'), + ), + ), + SizedBox(height: 30), + Center( + child: Image.asset( + 'assets/image/rotary_blue.png', + height: 55.0, + ), + ), + SizedBox(height: 15), + Center( + child: Text( + 'Update: 31 May 2021', + style: TextStyle(color: Color(0xFF777777)), + ), + ), + SizedBox(height: 60), ], ), ); } - - @override - void dispose() { - super.dispose(); - } } diff --git a/lib/features/outbound/presentation/pages/long_term/information/selection_day.dart b/lib/features/outbound/presentation/pages/long_term/information/selection_day.dart index d9b52a5b..2f524b98 100644 --- a/lib/features/outbound/presentation/pages/long_term/information/selection_day.dart +++ b/lib/features/outbound/presentation/pages/long_term/information/selection_day.dart @@ -12,11 +12,6 @@ class SelectionDayPage extends StatefulWidget { } class _SelectionDayPageState extends State { - @override - initState() { - super.initState(); - } - @override Widget build(BuildContext context) { return Scaffold( @@ -35,122 +30,72 @@ class _SelectionDayPageState extends State { ), ), body: ListView( - padding: EdgeInsets.only(left: 20, top: 15, right: 20), - shrinkWrap: false, - scrollDirection: Axis.vertical, + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'Wat moet ik doen voor de selectie dag:', - style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - '- Ik zou gewoon je best en doen en jezelf zijn.', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'Dit is wat je deze dag kan verwachten:', - style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- Je krijgt een interview, een groepsgesprek, een discussie en een test over je kennis van Nederland.', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- Dit zijn een paar voorbeeld vragen uit het interview tijdens de selectie dag. We gaan je niet alles vertellen, maar zo krijg je een beetje een idee.', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'Voorbeeld vragen:', - style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- Wat betekent volgens jou het zijn van Ambassadeur voor Rotary', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- Wie is je rolmodel, voor wie heb je bewondering', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- Wat was de gelukkigste/mooiste dag in je leven', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- Op welke eigenschap ben je het meest trots', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- Wat denk je dat het moeilijkste is als je een jaar in het buitenland bent', - style: TextStyle(fontSize: 14.0), - ), - ), - - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) + buildSectionTitle('Wat moet ik doen voor de selectie dag:'), + buildContentText('- Ik zou gewoon je best en doen en jezelf zijn.'), + buildSectionTitle('Dit is wat je deze dag kan verwachten:'), + buildContentText( + '- Je krijgt een interview, een groepsgesprek, een discussie en een test over je kennis van Nederland.'), + buildContentText( + '- Dit zijn een paar voorbeeld vragen uit het interview tijdens de selectie dag. We gaan je niet alles vertellen, maar zo krijg je een beetje een idee.'), + buildSectionTitle('Voorbeeld vragen:'), + buildContentText( + '- Wat betekent volgens jou het zijn van Ambassadeur voor Rotary'), + buildContentText('- Wie is je rolmodel, voor wie heb je bewondering'), + buildContentText('- Wat was de gelukkigste/mooiste dag in je leven'), + buildContentText('- Op welke eigenschap ben je het meest trots'), + buildContentText( + '- Wat denk je dat het moeilijkste is als je een jaar in het buitenland bent'), + buildFooter(), ], ), ); } - @override - void dispose() { - super.dispose(); + Widget buildSectionTitle(String text) { + return Padding( + padding: const EdgeInsets.only(top: 25.0), + child: Text( + text, + style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold), + ), + ); + } + + Widget buildContentText(String text) { + return Padding( + padding: const EdgeInsets.only(top: 10.0), + child: Text( + text, + style: TextStyle(fontSize: 14.0), + ), + ); + } + + Widget buildFooter() { + return Column( + children: [ + Padding( + padding: const EdgeInsets.only(top: 30.0), + child: Center( + child: Image.asset( + 'assets/image/rotary_blue.png', + height: 55.0, + ), + ), + ), + Padding( + padding: const EdgeInsets.only(top: 15.0), + child: Center( + child: Text( + 'Update: 31 May 2021', + style: TextStyle(color: Color(0xFF777777)), + ), + ), + ), + SizedBox(height: 60), + ], + ); } } diff --git a/lib/features/outbound/presentation/pages/long_term/information/selection_weekend.dart b/lib/features/outbound/presentation/pages/long_term/information/selection_weekend.dart index 904dba43..986660ec 100644 --- a/lib/features/outbound/presentation/pages/long_term/information/selection_weekend.dart +++ b/lib/features/outbound/presentation/pages/long_term/information/selection_weekend.dart @@ -12,11 +12,6 @@ class SelectionWeekendPage extends StatefulWidget { } class _SelectionWeekendPageState extends State { - @override - initState() { - super.initState(); - } - @override Widget build(BuildContext context) { return Scaffold( @@ -35,152 +30,116 @@ class _SelectionWeekendPageState extends State { ), ), body: ListView( - padding: EdgeInsets.only(left: 20, top: 15, right: 20), - shrinkWrap: false, - scrollDirection: Axis.vertical, + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'Het weekend dient een aantal doelen:', - style: TextStyle( - color: Colors.red, - fontSize: 15.0, - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: '1. ', - ), - TextSpan( - text: 'Elkaar beter leren kennen.', - style: TextStyle(decoration: TextDecoration.underline), - ), - TextSpan( - text: - ' De groep leert elkaar beter kennen en wij leren jullie beter ', - ), - TextSpan( - text: 'kennen.', - style: TextStyle(decoration: TextDecoration.underline), - ), - TextSpan( - text: - ' Wij kunnen zó beter inschatten waar jullie als toekomstige Outbounds naar toe zouden kunnen gaan.', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: '2. ', - ), - TextSpan( - text: 'Jezelf presenteren.', - style: TextStyle(decoration: TextDecoration.underline), - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: '3. ', - ), - TextSpan( - text: 'Je oriënteren op een top-drie van landen', - style: TextStyle(decoration: TextDecoration.underline), - ), - TextSpan( - text: - ' waarnaar je het liefst wilt worden uitgezonden. Zowel Internationaal als Europees.', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: '4. ', - ), - TextSpan( - text: 'Selectie:', - style: TextStyle(decoration: TextDecoration.underline), - ), - TextSpan( - text: - ' Je kunt laten zien dat je uit het goede “uitwisselingshout” bent gesneden. Aanwezigheid is verplicht. Het weekend is dan ook onderdeel van de uiteindelijke selectie.', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - '*Je krijgt een mail van ons voor het weekend waarin staat wat je moet meenemen, en wat je moet voorbereiden. Het is altijd een topweekend. ', - style: TextStyle(fontSize: 12.5), - ), - ), - - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) + buildSectionTitle('Het weekend dient een aantal doelen:', Colors.red), + buildContentRichText([ + TextSpan(text: '1. '), + TextSpan( + text: 'Elkaar beter leren kennen.', + style: TextStyle(decoration: TextDecoration.underline)), + TextSpan( + text: + ' De groep leert elkaar beter kennen en wij leren jullie beter '), + TextSpan( + text: 'kennen.', + style: TextStyle(decoration: TextDecoration.underline)), + TextSpan( + text: + ' Wij kunnen zó beter inschatten waar jullie als toekomstige Outbounds naar toe zouden kunnen gaan.'), + ]), + buildContentRichText([ + TextSpan(text: '2. '), + TextSpan( + text: 'Jezelf presenteren.', + style: TextStyle(decoration: TextDecoration.underline)), + ]), + buildContentRichText([ + TextSpan(text: '3. '), + TextSpan( + text: 'Je oriënteren op een top-drie van landen', + style: TextStyle(decoration: TextDecoration.underline)), + TextSpan( + text: + ' waarnaar je het liefst wilt worden uitgezonden. Zowel Internationaal als Europees.'), + ]), + buildContentRichText([ + TextSpan(text: '4. '), + TextSpan( + text: 'Selectie:', + style: TextStyle(decoration: TextDecoration.underline)), + TextSpan( + text: + ' Je kunt laten zien dat je uit het goede “uitwisselingshout” bent gesneden. Aanwezigheid is verplicht. Het weekend is dan ook onderdeel van de uiteindelijke selectie.'), + ]), + buildContentText( + '*Je krijgt een mail van ons voor het weekend waarin staat wat je moet meenemen, en wat je moet voorbereiden. Het is altijd een topweekend.', + fontSize: 12.5), + buildFooter(), ], ), ); } + Widget buildSectionTitle(String text, Color color) { + return Padding( + padding: const EdgeInsets.only(top: 25.0), + child: Text( + text, + style: TextStyle( + color: color, fontSize: 15.0, fontWeight: FontWeight.bold), + ), + ); + } + + Widget buildContentRichText(List children) { + return Padding( + padding: const EdgeInsets.only(top: 10.0), + child: RichText( + text: TextSpan( + style: Theme.of(context).textTheme.bodyMedium!.copyWith(fontSize: 14), + children: children, + ), + ), + ); + } + + Widget buildContentText(String text, {double fontSize = 14.0}) { + return Padding( + padding: const EdgeInsets.only(top: 10.0), + child: Text( + text, + style: TextStyle(fontSize: fontSize), + ), + ); + } + + Widget buildFooter() { + return Column( + children: [ + Padding( + padding: const EdgeInsets.only(top: 30.0), + child: Center( + child: Image.asset( + 'assets/image/rotary_blue.png', + height: 55.0, + ), + ), + ), + Padding( + padding: const EdgeInsets.only(top: 15.0), + child: Center( + child: Text( + 'Update: 31 May 2021', + style: TextStyle(color: Color(0xFF777777)), + ), + ), + ), + SizedBox(height: 60), + ], + ); + } + @override void dispose() { super.dispose(); diff --git a/lib/features/outbound/presentation/pages/long_term/information/top_3_countries.dart b/lib/features/outbound/presentation/pages/long_term/information/top_3_countries.dart index 5a633f5a..85749059 100644 --- a/lib/features/outbound/presentation/pages/long_term/information/top_3_countries.dart +++ b/lib/features/outbound/presentation/pages/long_term/information/top_3_countries.dart @@ -15,7 +15,7 @@ class Top3CountriesPage extends StatefulWidget { class _Top3CountriesPageState extends State { @override - initState() { + void initState() { super.initState(); } @@ -37,115 +37,34 @@ class _Top3CountriesPageState extends State { ), ), body: ListView( - padding: EdgeInsets.only(left: 20, top: 15, right: 20), - shrinkWrap: false, - scrollDirection: Axis.vertical, + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 15), - children: [ - TextSpan( - text: '1. ', - ), - TextSpan( - text: - ' Lees in deze app de verhalen van exchange studenten', - ), - ])), + buildRichTextSection( + '1. ', + 'Lees in deze app de verhalen van exchange studenten', ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 15), - children: [ - TextSpan( - text: '2. ', - ), - TextSpan( - text: ' Kijk de video: ', - ), - TextSpan( - text: 'Proud to be European', - style: TextStyle(color: Colors.blue), - recognizer: TapGestureRecognizer() - ..onTap = () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - LongTermExchangeProgramPage()), - ); - }, - ), - TextSpan( - text: ' (Onderaan de pagina)', - style: TextStyle(fontSize: 14)), - ])), + buildRichTextSection( + '2. ', + 'Kijk de video: ', + linkText: 'Proud to be European', + linkAction: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => LongTermExchangeProgramPage(), + ), + ); + }, + suffixText: ' (Onderaan de pagina)', ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 15), - children: [ - TextSpan( - text: '3. ', - ), - TextSpan( - text: - 'Kijk op YouTube en google "Rotary Youth Exchange" dan kom je ook heel veel te weten. ', - ), - ])), - ), - - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, + buildRichTextSection( + '3. ', + 'Kijk op YouTube en google "Rotary Youth Exchange" dan kom je ook heel veel te weten.', ), + buildFooter(), ], ) ], @@ -153,6 +72,55 @@ class _Top3CountriesPageState extends State { ); } + Widget buildRichTextSection(String prefixText, String mainText, + {String? linkText, VoidCallback? linkAction, String? suffixText}) { + return Padding( + padding: const EdgeInsets.only(top: 10.0), + child: RichText( + text: TextSpan( + style: Theme.of(context).textTheme.bodyMedium!.copyWith(fontSize: 15), + children: [ + TextSpan(text: prefixText), + TextSpan(text: mainText), + if (linkText != null && linkAction != null) + TextSpan( + text: linkText, + style: TextStyle(color: Colors.blue), + recognizer: TapGestureRecognizer()..onTap = linkAction, + ), + if (suffixText != null) TextSpan(text: suffixText), + ], + ), + ), + ); + } + + Widget buildFooter() { + return Column( + children: [ + Padding( + padding: const EdgeInsets.only(top: 30.0), + child: Center( + child: Image.asset( + 'assets/image/rotary_blue.png', + height: 55.0, + ), + ), + ), + Padding( + padding: const EdgeInsets.only(top: 15.0), + child: Center( + child: Text( + 'Update: 31 May 2021', + style: TextStyle(color: Color(0xFF777777)), + ), + ), + ), + SizedBox(height: 60), + ], + ); + } + @override void dispose() { super.dispose(); diff --git a/lib/features/outbound/presentation/pages/long_term/long_term_outbound_page.dart b/lib/features/outbound/presentation/pages/long_term/long_term_outbound_page.dart index ad1aa6f6..69d13628 100644 --- a/lib/features/outbound/presentation/pages/long_term/long_term_outbound_page.dart +++ b/lib/features/outbound/presentation/pages/long_term/long_term_outbound_page.dart @@ -42,130 +42,102 @@ class _LongTermExchangeOutboundPageState ), ), body: ListView( - shrinkWrap: true, - scrollDirection: Axis.vertical, + padding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 20.0), children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: - const EdgeInsets.only(left: 20.0, right: 20.0, top: 20.0), - child: Text( - 'Kandidaten \n\nWat leuk dat je geïnteresseerd in de mogelijkheden van Rotary voor jaaruitwisseling. Wereldwijd gaan er jaarlijks zo\'n 8.000 studenten via Rotary op jaaruitwisseling, een hele organisatie. Wie weet ben jij komend schooljaar een van die studenten.', - style: TextStyle(fontSize: 16.0), - ), - ), - SizedBox( - height: 10, - ), - Padding( - padding: const EdgeInsets.only( - left: 20.0, - right: 20.0, - ), - child: ClipRRect( - borderRadius: BorderRadius.circular(15), - child: SizedBox.fromSize( - // size: Size.fromRadius(48), // Image radius - child: Image( - image: AssetImage('assets/image/classOff22.jpeg'), - fit: BoxFit.cover), - ), - ), - ), - SizedBox( - height: 20, - ), - Divider( - height: 15, - thickness: 2, - ), - buildOutboundOptionRow(context, 'Class of 2023-2024', - FontAwesomeIcons.peopleGroup, ClassOfPage()), - Divider( - height: 15, - thickness: 2, - ), - buildOutboundOptionRow(context, 'Hoe schrijf ik mezelf in', - FontAwesomeIcons.pencil, HowToSignUpPage()), - Divider( - height: 15, - thickness: 2, - ), - buildOutboundOptionRow(context, 'Waar moet ik aan voldoen', - FontAwesomeIcons.exclamation, ComplyWithPage()), - Divider( - height: 15, - thickness: 2, - ), - buildOutboundOptionRow( - context, - 'Wat moet ik doen voor de selectiedag', - FontAwesomeIcons.checkToSlot, - SelectionDayPage()), - Divider( - height: 15, - thickness: 2, - ), - buildOutboundOptionRow( - context, - 'Wat moet ik doen voor het selectieweekend', - FontAwesomeIcons.clipboardCheck, - SelectionWeekendPage()), - Divider( - height: 15, - thickness: 2, - ), - buildOutboundOptionRow( - context, - 'Hoe maak ik een goede top 3 van landen waar ik naar toe wil ', - FontAwesomeIcons.globe, - Top3CountriesPage()), - Divider( - height: 15, - thickness: 2, - ), - buildOutboundOptionRow(context, 'Hoe bereid ik me voor', - FontAwesomeIcons.suitcase, null), - - // the end - SizedBox( - height: 20, - ), - ], - ) + Text( + 'Kandidaten \n\nWat leuk dat je geïnteresseerd in de mogelijkheden van Rotary voor jaaruitwisseling. Wereldwijd gaan er jaarlijks zo\'n 8.000 studenten via Rotary op jaaruitwisseling, een hele organisatie. Wie weet ben jij komend schooljaar een van die studenten.', + style: TextStyle(fontSize: 16.0), + ), + SizedBox(height: 10), + ClipRRect( + borderRadius: BorderRadius.circular(15), + child: Image.asset( + 'assets/image/classOff22.jpeg', + fit: BoxFit.cover, + ), + ), + SizedBox(height: 20), + Divider(height: 15, thickness: 2), + buildOutboundOptionRow( + context, + 'Class of 2024-2025', + FontAwesomeIcons.peopleGroup, + ClassOfPage(), + ), + Divider(height: 15, thickness: 2), + buildOutboundOptionRow( + context, + 'Hoe schrijf ik mezelf in', + FontAwesomeIcons.pencil, + HowToSignUpPage(), + ), + Divider(height: 15, thickness: 2), + buildOutboundOptionRow( + context, + 'Waar moet ik aan voldoen', + FontAwesomeIcons.exclamation, + ComplyWithPage(), + ), + Divider(height: 15, thickness: 2), + buildOutboundOptionRow( + context, + 'Wat moet ik doen voor de selectiedag', + FontAwesomeIcons.checkToSlot, + SelectionDayPage(), + ), + Divider(height: 15, thickness: 2), + buildOutboundOptionRow( + context, + 'Wat moet ik doen voor het selectieweekend', + FontAwesomeIcons.clipboardCheck, + SelectionWeekendPage(), + ), + Divider(height: 15, thickness: 2), + buildOutboundOptionRow( + context, + 'Hoe maak ik een goede top 3 van landen waar ik naar toe wil', + FontAwesomeIcons.globe, + Top3CountriesPage(), + ), + Divider(height: 15, thickness: 2), + buildOutboundOptionRow( + context, + 'Hoe bereid ik me voor', + FontAwesomeIcons.suitcase, + null, + ), + SizedBox(height: 20), ], ), ); } GestureDetector buildOutboundOptionRow( - BuildContext context, - String title, - IconData icon, - pushTo, - ) { + BuildContext context, String title, IconData icon, Widget? pushTo) { return GestureDetector( - child: Padding( - padding: EdgeInsets.only(top: 8.0, bottom: 8.0, left: 8.0), - child: ListTile( - leading: Padding( - padding: EdgeInsets.zero, - child: Container( - child: FaIcon( - icon, - color: Palette.lightIndigo, - size: 27, - ), + onTap: () { + if (pushTo != null) { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => pushTo), + ); + } else { + showMaterialDialog( + context, 'Coming soon', 'This page is not yet ready', null); + } + }, + child: Padding( + padding: EdgeInsets.symmetric(vertical: 8.0), + child: ListTile( + leading: FaIcon( + icon, + color: Palette.lightIndigo, + size: 27, ), - ), - title: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: Container( - constraints: BoxConstraints(maxWidth: Device.width - 150), + title: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( child: Text( title, maxLines: 2, @@ -177,26 +149,14 @@ class _LongTermExchangeOutboundPageState ), ), ), - ), - Icon( - Icons.arrow_forward_ios, - color: Palette.grey, - ), - ], + Icon( + Icons.arrow_forward_ios, + color: Palette.grey, + ), + ], + ), ), - onTap: () { - if (pushTo != null) { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => pushTo), - ); - } else { - String title = 'Comming soon'; - String message = 'This page is not yet ready'; - showMaterialDialog(context, title, message, null); - } - }, ), - )); + ); } } diff --git a/lib/features/outbound/presentation/pages/outbound_page.dart b/lib/features/outbound/presentation/pages/outbound_page.dart index e69ff15a..3aa2d0a4 100644 --- a/lib/features/outbound/presentation/pages/outbound_page.dart +++ b/lib/features/outbound/presentation/pages/outbound_page.dart @@ -38,113 +38,102 @@ class _OutboundPageState extends State { ), ), body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: true, - scrollDirection: Axis.vertical, + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 15), children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Padding( - padding: EdgeInsets.only(top: 20.0), - child: Text( - 'Kandidaten \n\nWat leuk dat je geïnteresseerd in de mogelijkheden van Rotary voor uitwisseling. Wereldwijd gaan er jaarlijks zo’n 8.000 studenten via Rotary op uitwisseling, een hele organisatie. Wie weet ben jij komend schooljaar een van die studenten.', - style: TextStyle(fontSize: 16.0), - ), - ), - SizedBox( - height: 40, - ), - Row( - children: [ - Text( - 'Long Term Exchange Program', - style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - ), - ], - ), - Divider( - height: 15, - thickness: 2, - ), - + buildIntroText(), + SizedBox(height: 40), + buildSectionTitle('Long Term Exchange Program'), + Divider(height: 15, thickness: 2), buildProgramOptionRow( - context, - 'Long Term Exchange Program', - 'Year Exchange', - FontAwesomeIcons.hashtag, - LongTermExchangeOutboundPage()), - SizedBox( - height: 10, - ), - Row( - children: [ - Text( - 'Short Term Exchange Program', - style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - ), - ], + context, + 'Long Term Exchange Program', + 'Year Exchange', + FontAwesomeIcons.hashtag, + LongTermExchangeOutboundPage(), ), - Divider( - height: 15, - thickness: 2, + SizedBox(height: 10), + buildSectionTitle('Short Term Exchange Program'), + Divider(height: 15, thickness: 2), + buildProgramOptionRow( + context, + 'NGSE', + 'New Generations Service Exchange', + FontAwesomeIcons.hashtag, + // TODO not yet ready + null, ), buildProgramOptionRow( - context, - 'NGSE', - 'New Generations Service Exchange', - FontAwesomeIcons.hashtag, - // TODO not yet ready - // NGSEOutboundPage() - null), + context, + 'FAMILY TO FAMILY', + 'Exchange between families', + FontAwesomeIcons.hashtag, + FamilyToFamilyOutboundPage(), + ), buildProgramOptionRow( - context, - 'FAMILY TO FAMILY', - 'Exchange between families', - FontAwesomeIcons.hashtag, - FamilyToFamilyOutboundPage()), - buildProgramOptionRow(context, 'CAMPS & TOURS', 'Summer Camps', - FontAwesomeIcons.hashtag, CampsAndToursOutboundPage()), - - // the end - SizedBox( - height: 40, + context, + 'CAMPS & TOURS', + 'Summer Camps', + FontAwesomeIcons.hashtag, + CampsAndToursOutboundPage(), ), + SizedBox(height: 40), ], - ) + ), ], ), ); } - Container buildProgramOptionRow( + Widget buildIntroText() { + return Padding( + padding: const EdgeInsets.only(top: 20.0), + child: Text( + 'Kandidaten \n\nWat leuk dat je geïnteresseerd in de mogelijkheden van Rotary voor uitwisseling. ' + 'Wereldwijd gaan er jaarlijks zo\'n 8.000 studenten via Rotary op uitwisseling, een hele organisatie. ' + 'Wie weet ben jij komend schooljaar een van die studenten.', + style: TextStyle(fontSize: 16.0), + ), + ); + } + + Widget buildSectionTitle(String title) { + return Row( + children: [ + Text( + title, + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + ], + ); + } + + Widget buildProgramOptionRow( BuildContext context, String title, - subtitle, + String subtitle, IconData icon, - pushTo, + Widget? pushTo, ) { return Container( padding: EdgeInsets.all(8.0), child: ListTile( - leading: Padding( - padding: const EdgeInsets.symmetric(horizontal: 0.0), - child: Container( - child: CachedNetworkImage( - height: 50, - width: 50, - imageUrl: - 'https://www.rotary.org/sites/all/themes/rotary_rotaryorg/images/favicons/favicon-194x194.png', - imageBuilder: (context, imageProvider) => Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - image: DecorationImage(image: imageProvider, fit: BoxFit.cover), - ), + leading: CachedNetworkImage( + height: 50, + width: 50, + imageUrl: + 'https://www.rotary.org/sites/all/themes/rotary_rotaryorg/images/favicons/favicon-194x194.png', + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + image: DecorationImage(image: imageProvider, fit: BoxFit.cover), ), - placeholder: (context, url) => - Center(child: CircularProgressIndicator()), - errorWidget: (context, url, error) => Icon(Icons.error), - )), + ), + placeholder: (context, url) => + Center(child: CircularProgressIndicator()), + errorWidget: (context, url, error) => Icon(Icons.error), ), title: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -196,12 +185,10 @@ class _OutboundPageState extends State { MaterialPageRoute(builder: (context) => pushTo), ); } else { - String title = 'Comming soon'; - String message = 'This page is not yet ready'; showMaterialDialog( context, - title, - message, + 'Coming soon', + 'This page is not yet ready', null, ); } diff --git a/lib/features/outbound/presentation/pages/short_term/camps_and_tours/camps_and_tours_outbound_page.dart b/lib/features/outbound/presentation/pages/short_term/camps_and_tours/camps_and_tours_outbound_page.dart index 1a49c064..07915d9f 100644 --- a/lib/features/outbound/presentation/pages/short_term/camps_and_tours/camps_and_tours_outbound_page.dart +++ b/lib/features/outbound/presentation/pages/short_term/camps_and_tours/camps_and_tours_outbound_page.dart @@ -41,110 +41,74 @@ class _CampsAndToursOutboundPageState extends State { shrinkWrap: true, scrollDirection: Axis.vertical, children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: - const EdgeInsets.only(left: 20.0, right: 20.0, top: 20.0), - child: SelectableText( - 'Kandidaten \n\nWat leuk dat je geïnteresseerd in de mogelijkheden van Rotary voor uitwisseling. Wereldwijd gaan er jaarlijks zo’n 8.000 studenten via Rotary op jaaruitwisseling, een hele organisatie. Wie weet ben jij komend schooljaar een van die studenten.', - style: TextStyle(fontSize: 16.0), - ), - ), - SizedBox( - height: 20, - ), - Divider( - height: 15, - thickness: 2, - ), - buildOutboundOptionRow(context, 'Hoe schrijf ik mezelf in', - FontAwesomeIcons.pencil, HowToSignUpPage()), - Divider( - height: 15, - thickness: 2, - ), - buildOutboundOptionRow(context, 'Voor wie?', - FontAwesomeIcons.exclamation, ComplyWithPage()), - Divider( - height: 15, - thickness: 2, - ), - buildOutboundOptionRow(context, 'Met welke landen?', - FontAwesomeIcons.earthEurope, WhichCountriesPage()), - Divider( - height: 15, - thickness: 2, - ), - buildOutboundOptionRow( - context, 'Landen Lijst', FontAwesomeIcons.list, LoadCsv()), - Divider( - height: 15, - thickness: 2, - ), - - // the end - SizedBox( - height: 20, - ), - ], - ) + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 20.0, vertical: 20.0), + child: SelectableText( + 'Kandidaten \n\nWat leuk dat je geïnteresseerd in de mogelijkheden van Rotary voor uitwisseling. Wereldwijd gaan er jaarlijks zo’n 8.000 studenten via Rotary op jaaruitwisseling, een hele organisatie. Wie weet ben jij komend schooljaar een van die studenten.', + style: TextStyle(fontSize: 16.0), + ), + ), + Divider(height: 15, thickness: 2), + buildOutboundOptionRow(context, 'Hoe schrijf ik mezelf in', + FontAwesomeIcons.pencil, HowToSignUpPage()), + Divider(height: 15, thickness: 2), + buildOutboundOptionRow(context, 'Voor wie?', + FontAwesomeIcons.exclamation, ComplyWithPage()), + Divider(height: 15, thickness: 2), + buildOutboundOptionRow(context, 'Met welke landen?', + FontAwesomeIcons.earthEurope, WhichCountriesPage()), + Divider(height: 15, thickness: 2), + buildOutboundOptionRow( + context, 'Landen Lijst', FontAwesomeIcons.list, LoadCsv()), + Divider(height: 15, thickness: 2), + SizedBox(height: 20), ], ), ); } GestureDetector buildOutboundOptionRow( - BuildContext context, - String title, - IconData icon, - pushTo, - ) { + BuildContext context, String title, IconData icon, Widget pushTo) { return GestureDetector( - child: Padding( - padding: EdgeInsets.only(top: 8.0, bottom: 8.0, left: 8.0), - child: ListTile( - leading: Padding( - padding: EdgeInsets.zero, - child: Container( - child: FaIcon( - icon, - color: Palette.lightIndigo, - size: 27, - ), + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => pushTo), + ); + }, + child: Padding( + padding: const EdgeInsets.only(top: 8.0, bottom: 8.0, left: 8.0), + child: ListTile( + leading: FaIcon( + icon, + color: Palette.lightIndigo, + size: 27, ), - ), - title: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - SizedBox( - width: Device.width - 120, - child: Text(title, + title: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + width: Device.width - 120, + child: Text( + title, maxLines: 2, overflow: TextOverflow.ellipsis, - softWrap: false, style: TextStyle( fontSize: 15, color: Palette.grey, fontWeight: FontWeight.w500, - )), - ), - Icon( - Icons.arrow_forward_ios, - color: Palette.grey, - ), - ], + ), + ), + ), + Icon( + Icons.arrow_forward_ios, + color: Palette.grey, + ), + ], + ), ), - onTap: () { - if (pushTo != null) { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => pushTo), - ); - } - }, ), - )); + ); } } diff --git a/lib/features/outbound/presentation/pages/short_term/camps_and_tours/information/comply_with.dart b/lib/features/outbound/presentation/pages/short_term/camps_and_tours/information/comply_with.dart index 58660469..04b05372 100644 --- a/lib/features/outbound/presentation/pages/short_term/camps_and_tours/information/comply_with.dart +++ b/lib/features/outbound/presentation/pages/short_term/camps_and_tours/information/comply_with.dart @@ -13,7 +13,7 @@ class ComplyWithPage extends StatefulWidget { class _ComplyWithPageState extends State { @override - initState() { + void initState() { super.initState(); } @@ -35,23 +35,11 @@ class _ComplyWithPageState extends State { ), ), body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 15), children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), Padding( padding: const EdgeInsets.only(top: 10.0), child: Text( @@ -59,8 +47,6 @@ class _ComplyWithPageState extends State { style: TextStyle(fontSize: 14.0), ), ), - - // the end dont touch XD Padding( padding: const EdgeInsets.only(top: 30.0), child: Center( @@ -79,11 +65,9 @@ class _ComplyWithPageState extends State { ), ), ), - SizedBox( - height: 60, - ), + SizedBox(height: 60), ], - ) + ), ], ), ); diff --git a/lib/features/outbound/presentation/pages/short_term/camps_and_tours/information/how_to_sign_up.dart b/lib/features/outbound/presentation/pages/short_term/camps_and_tours/information/how_to_sign_up.dart index 579fe92c..5ad26a1f 100644 --- a/lib/features/outbound/presentation/pages/short_term/camps_and_tours/information/how_to_sign_up.dart +++ b/lib/features/outbound/presentation/pages/short_term/camps_and_tours/information/how_to_sign_up.dart @@ -40,106 +40,67 @@ class _HowToSignUpPageState extends State { ), ), body: ListView( - padding: EdgeInsets.only(left: 30, top: 15, right: 30), - shrinkWrap: false, - scrollDirection: Axis.vertical, + padding: EdgeInsets.symmetric(horizontal: 30, vertical: 15), children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: 'Je stuurt een gezellig email bericht naar: ', - ), - TextSpan( - text: 'zomerkamp@rotaryyep.nl.', - style: TextStyle(color: Colors.blue), - recognizer: TapGestureRecognizer() - ..onTap = () { - launchUrlString('mailto:zomerkamp@rotaryyep.nl'); - }, - ), - TextSpan( - text: - ' Dan krijg je van ons een bevestiging dat we je mail hebben ontvangen. ', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 40.0, bottom: 30), - child: Container( - child: Center( - child: CupertinoButton.filled( - onPressed: () { - launchUrlString( - 'mailto:interesse@rotaryyep.nl?subject=interrese%20in%20Camps%20and%20Tours'); - }, - child: - // Row( - // children: [ - // Padding( - // padding: const EdgeInsets.only(left: 25.0), - // child: FaIcon( - // FontAwesomeIcons.phone, - // color: Colors.white, - // ), - // ), - // Padding( - // padding: const EdgeInsets.only(left: 20.0), - // child: Text( - // 'Call me ', - // style: TextStyle(color: Colors.white, fontSize: 18.0), - // ), - // ) - // ], - // ), - Text('Verstuur een Email'), - ), - ), - )), - - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, + Padding( + padding: const EdgeInsets.only(top: 20.0), + child: RichText( + text: TextSpan( + style: Theme.of(context) + .textTheme + .bodyMedium! + .copyWith(fontSize: 14), + children: [ + TextSpan( + text: 'Je stuurt een gezellig email bericht naar: ', ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), + TextSpan( + text: 'zomerkamp@rotaryyep.nl.', + style: TextStyle(color: Colors.blue), + recognizer: TapGestureRecognizer() + ..onTap = () { + launchUrlString('mailto:zomerkamp@rotaryyep.nl'); + }, ), - ), + TextSpan( + text: + ' Dan krijg je van ons een bevestiging dat we je mail hebben ontvangen. ', + ), + ])), + ), + Padding( + padding: const EdgeInsets.only(top: 40.0, bottom: 30), + child: Center( + child: CupertinoButton.filled( + onPressed: () { + launchUrlString( + 'mailto:interesse@rotaryyep.nl?subject=interrese%20in%20Camps%20and%20Tours'); + }, + child: Text('Verstuur een Email'), + ), + ), + ), + Padding( + padding: const EdgeInsets.only(top: 30.0), + child: Center( + child: Image.asset( + 'assets/image/rotary_blue.png', + height: 55.0, ), - SizedBox( - height: 60, + ), + ), + Padding( + padding: const EdgeInsets.only(top: 15.0), + child: Center( + child: Text( + 'Update: 31 May 2021', + style: TextStyle(color: Color(0xFF777777)), ), - ], - ) + ), + ), + SizedBox( + height: 60, + ), ], ), ); diff --git a/lib/features/outbound/presentation/pages/short_term/camps_and_tours/information/which_countries.dart b/lib/features/outbound/presentation/pages/short_term/camps_and_tours/information/which_countries.dart index 314636c3..903fbac8 100644 --- a/lib/features/outbound/presentation/pages/short_term/camps_and_tours/information/which_countries.dart +++ b/lib/features/outbound/presentation/pages/short_term/camps_and_tours/information/which_countries.dart @@ -39,23 +39,11 @@ class _WhichCountriesPageState extends State { ), ), body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 15), children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), Padding( padding: const EdgeInsets.only(top: 20.0), child: Text( @@ -66,14 +54,14 @@ class _WhichCountriesPageState extends State { Padding( padding: const EdgeInsets.only(top: 10.0), child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ + text: TextSpan( + style: Theme.of(context) + .textTheme + .bodyMedium! + .copyWith(fontSize: 14), + children: [ TextSpan( - text: 'aanmelden via het emailadres ', + text: 'Aanmelden via het emailadres ', ), TextSpan( text: 'interesse@rotaryyep.nl.', @@ -82,11 +70,11 @@ class _WhichCountriesPageState extends State { ..onTap = () { launchUrlString('mailto:interesse@rotaryyep.nl'); }, - ) - ])), + ), + ], + ), + ), ), - - // the end dont touch XD Padding( padding: const EdgeInsets.only(top: 30.0), child: Center( @@ -114,9 +102,4 @@ class _WhichCountriesPageState extends State { ), ); } - - @override - void dispose() { - super.dispose(); - } } diff --git a/lib/features/outbound/presentation/pages/short_term/camps_and_tours/widgets/loadCsv.dart b/lib/features/outbound/presentation/pages/short_term/camps_and_tours/widgets/loadCsv.dart index b15c1be6..f66d0f0b 100644 --- a/lib/features/outbound/presentation/pages/short_term/camps_and_tours/widgets/loadCsv.dart +++ b/lib/features/outbound/presentation/pages/short_term/camps_and_tours/widgets/loadCsv.dart @@ -28,9 +28,11 @@ class _LoadCsvState extends State { Future>> getData() async { final response = await http.get( - Uri.parse( - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/outbounds/camps-and-tours/zomerkampen.csv'), - headers: {'Content-Type': 'application/json', 'Charset': 'utf-8'}); + Uri.parse( + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/outbounds/camps-and-tours/zomerkampen.csv', + ), + headers: {'Content-Type': 'application/json', 'Charset': 'utf-8'}, + ); if (response.statusCode == 200) { return CsvToListConverter(eol: '\r\n', fieldDelimiter: ';') .convert(response.body); @@ -44,23 +46,24 @@ class _LoadCsvState extends State { return Scaffold( appBar: AppBar( systemOverlayStyle: SystemUiOverlayStyle.light.copyWith( - statusBarColor: Colors.transparent, // iOS - statusBarBrightness: Brightness.light, // Android + statusBarColor: Colors.transparent, + statusBarBrightness: Brightness.light, ), backgroundColor: Colors.transparent, elevation: 0.0, - title: Text('Camps & Tours List', - textScaler: TextScaler.linear(1.2), - style: - TextStyle(color: Colors.indigo, fontWeight: FontWeight.bold)), + title: Text( + 'Camps & Tours List', + textScaler: TextScaler.linear(1.2), + style: TextStyle(color: Colors.indigo, fontWeight: FontWeight.bold), + ), ), body: FutureBuilder>>( future: _futureData, builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { - return CircularProgressIndicator(); // Placeholder widget like a loading spinner + return Center(child: CircularProgressIndicator()); } else if (snapshot.hasError) { - return Text('Error: ${snapshot.error}'); + return Center(child: Text('Error: ${snapshot.error}')); } else if (snapshot.hasData) { return ListView.builder( itemCount: snapshot.data!.length, @@ -82,7 +85,7 @@ class _LoadCsvState extends State { }, ); } else { - return SizedBox.shrink(); // Fallback placeholder + return SizedBox.shrink(); } }, ), @@ -123,108 +126,79 @@ class TravelCard extends StatelessWidget { List hostCountryCodes = hostCountryCode.split('/'); return GestureDetector( - onTap: () { - print('Tapped on: $title'); - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => PDFPageViewer( - title: title, - pdfURL: invitation, - ), + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => PDFPageViewer( + title: title, + pdfURL: invitation, ), - ); - }, - child: Card( - elevation: 4.0, - margin: const EdgeInsets.all(8.0), - color: Palette.themeShadeColor, - shape: - RoundedRectangleBorder(borderRadius: BorderRadius.circular(14)), - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - if (full.isNotEmpty) // Check if 'full' is not empty - Container( - padding: const EdgeInsets.symmetric( - horizontal: 6.0, vertical: 2.0), - margin: const EdgeInsets.only( - right: - 8.0), // Add some space between the "FULL" label and the title - decoration: BoxDecoration( - color: Colors.red, - borderRadius: BorderRadius.circular(14), - ), - child: Text( - 'FULL', - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 12), - ), + ), + ); + }, + child: Card( + elevation: 4.0, + margin: const EdgeInsets.all(8.0), + color: Palette.themeShadeColor, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(14)), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + if (full.isNotEmpty) + Container( + padding: const EdgeInsets.symmetric( + horizontal: 6.0, vertical: 2.0), + margin: const EdgeInsets.only(right: 8.0), + decoration: BoxDecoration( + color: Colors.red, + borderRadius: BorderRadius.circular(14), ), - Expanded( - // Use Expanded to ensure the title can take up the remaining space child: Text( - title, + 'FULL', style: TextStyle( - color: Palette.indigo, - fontWeight: FontWeight.bold, - fontSize: 20, - ), + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 12), ), ), - ], - ), - - // if (full.isNotEmpty) - // Align( - // alignment: Alignment.topRight, - // child: Container( - // padding: const EdgeInsets.all(6.0), - // decoration: BoxDecoration( - // color: Colors.red, - // borderRadius: BorderRadius.circular(14), - // ), - // child: Text( - // 'FULL', - // style: TextStyle( - // color: Colors.white, fontWeight: FontWeight.bold), - // ), - // ), - // ), - // Text( - // title, - // style: TextStyle( - // color: Palette.indigo, - // fontWeight: FontWeight.bold, - // fontSize: 20, - // ), - // ), - SizedBox(height: 10), - buildInfoRow( - context, 'Host Country: ', hostCountries, hostCountryCodes), - SizedBox(height: 10), - buildSimpleInfoRow('Host District: ', hostDistrict, - FontAwesomeIcons.locationDot), - SizedBox(height: 10), - buildSimpleInfoRow('Age Range: ', '$ageMin - $ageMax years', - FontAwesomeIcons.cakeCandles), - SizedBox(height: 10), - buildSimpleInfoRow( - 'Contribution: ', contribution, FontAwesomeIcons.euroSign), - SizedBox(height: 10), - buildSimpleInfoRow('Date: ', '$startDate - $endDate', - FontAwesomeIcons.calendarDays), - ], - ), + Expanded( + child: Text( + title, + style: TextStyle( + color: Palette.indigo, + fontWeight: FontWeight.bold, + fontSize: 20, + ), + ), + ), + ], + ), + SizedBox(height: 10), + buildInfoRow( + context, 'Host Country: ', hostCountries, hostCountryCodes), + SizedBox(height: 10), + buildSimpleInfoRow('Host District: ', hostDistrict, + FontAwesomeIcons.locationDot), + SizedBox(height: 10), + buildSimpleInfoRow('Age Range: ', '$ageMin - $ageMax years', + FontAwesomeIcons.cakeCandles), + SizedBox(height: 10), + buildSimpleInfoRow( + 'Contribution: ', contribution, FontAwesomeIcons.euroSign), + SizedBox(height: 10), + buildSimpleInfoRow('Date: ', '$startDate - $endDate', + FontAwesomeIcons.calendarDays), + ], ), - )); + ), + ), + ); } Widget buildInfoRow(BuildContext context, String label, List values, @@ -234,38 +208,28 @@ class TravelCard extends StatelessWidget { children: [ Icon(FontAwesomeIcons.solidFlag, size: 16, color: Palette.lightIndigo), SizedBox(width: 8), + Text(label, + style: + TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold)), + SizedBox(width: 8), Expanded( - child: Text(label, - style: TextStyle( - color: Palette.indigo, fontWeight: FontWeight.bold)), - ), - Expanded( - child: Row( - mainAxisAlignment: - MainAxisAlignment.end, // Aligns the flags to the right - children: [ - for (int i = 0; i < codes.length; i++) - Row( - children: [ - if (i > 0) ...[ - // Adds a separator if there's more than one flag - SizedBox(width: 10), - Text('/', - style: TextStyle( - color: Palette.indigo, - fontWeight: FontWeight.bold)), - SizedBox(width: 10), - ], - SvgPicture.asset( - 'assets/icons/flags/${codes[i]}.svg', - width: 30, - height: 20, - ), - SizedBox(width: 5), - Text(values[i], style: TextStyle(color: Palette.indigo)), - ], - ), - ], + child: Wrap( + alignment: WrapAlignment.end, + spacing: 8, + children: List.generate(values.length, (int index) { + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + SvgPicture.asset( + 'assets/icons/flags/${codes[index]}.svg', + width: 30, + height: 20, + ), + SizedBox(width: 5), + Text(values[index], style: TextStyle(color: Palette.indigo)), + ], + ); + }), ), ), ], diff --git a/lib/features/outbound/presentation/pages/short_term/camps_and_tours/widgets/pdf_viewer.dart b/lib/features/outbound/presentation/pages/short_term/camps_and_tours/widgets/pdf_viewer.dart index 38218f13..2fbdfd63 100644 --- a/lib/features/outbound/presentation/pages/short_term/camps_and_tours/widgets/pdf_viewer.dart +++ b/lib/features/outbound/presentation/pages/short_term/camps_and_tours/widgets/pdf_viewer.dart @@ -1,6 +1,5 @@ // 🎯 Dart imports: import 'dart:async'; -import 'dart:io'; // 🐦 Flutter imports: import 'package:dio/dio.dart'; @@ -12,13 +11,11 @@ import 'package:flutter_cached_pdfview/flutter_cached_pdfview.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:path_provider/path_provider.dart'; import 'package:percent_indicator/circular_percent_indicator.dart'; +import 'package:share_plus/share_plus.dart'; // 🌎 Project imports: import 'package:rotary_nl_rye/core/prop.dart'; import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; -import 'package:share_plus/share_plus.dart'; - -// ignore: import_of_legacy_library_into_null_safe class PDFPageViewer extends StatefulWidget { final String title; @@ -28,16 +25,12 @@ class PDFPageViewer extends StatefulWidget { required this.pdfURL, required this.title, }); + @override - _PDFPageViewerState createState() => _PDFPageViewerState(pdfURL: pdfURL); + _PDFPageViewerState createState() => _PDFPageViewerState(); } class _PDFPageViewerState extends State { - final String pdfURL; - _PDFPageViewerState({required this.pdfURL}); - - String title = 'Loading'; - final Completer _pdfViewController = Completer(); final StreamController _pageCountController = @@ -46,7 +39,6 @@ class _PDFPageViewerState extends State { @override void initState() { super.initState(); - SystemChrome.setPreferredOrientations([ DeviceOrientation.landscapeRight, DeviceOrientation.landscapeLeft, @@ -59,118 +51,144 @@ class _PDFPageViewerState extends State { SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, ]); + _pageCountController.close(); super.dispose(); } + Future _sharePDF() async { + try { + final tempDir = await getTemporaryDirectory(); + final fileName = widget.pdfURL.split('/').last; + final filePath = '${tempDir.path}/$fileName'; + + await Dio().download(widget.pdfURL, filePath); + + await Share.shareXFiles([XFile(filePath)], subject: fileName); + } catch (e) { + // Handle the error + print('Error sharing PDF: $e'); + } + } + @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - systemOverlayStyle: SystemUiOverlayStyle( - statusBarBrightness: MediaQuery.of(context).platformBrightness, + appBar: AppBar( + systemOverlayStyle: SystemUiOverlayStyle( + statusBarBrightness: MediaQuery.of(context).platformBrightness, + ), + backgroundColor: Colors.transparent, + elevation: 0.0, + leading: UniformBackButton(), + actions: [ + IconButton( + icon: FaIcon( + FontAwesomeIcons.filePdf, + color: Palette.indigo, + ), + onPressed: _sharePDF, ), - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - actions: [ - IconButton( - icon: FaIcon( - FontAwesomeIcons.filePdf, - color: Palette.indigo, - ), - onPressed: () async { - Directory tempDir = await getTemporaryDirectory(); - String fielName = pdfURL.split('/').last; - - final path = '${tempDir.path}/${fielName}'; - - await Dio().download(pdfURL, path); - - await Share.shareXFiles([XFile(path)], subject: fielName); - }) - ], - title: Text( - widget.title, - textScaler: TextScaler.linear(1), - style: - TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), + ], + title: Text( + widget.title, + textScaler: TextScaler.linear(1), + style: TextStyle( + color: Palette.indigo, + fontWeight: FontWeight.bold, ), ), - body: Stack( - children: [ - PDF( - onPageChanged: (int? current, int? total) => - _pageCountController.add('${current! + 1} / $total'), - onViewCreated: (PDFViewController pdfViewController) async { - _pdfViewController.complete(pdfViewController); - final int currentPage = - await pdfViewController.getCurrentPage() ?? 0; - final int? pageCount = await pdfViewController.getPageCount(); + ), + body: Stack( + children: [ + PDF( + onPageChanged: (int? current, int? total) { + if (current != null && total != null) { + _pageCountController.add('${current + 1} / $total'); + } + }, + onViewCreated: (PDFViewController pdfViewController) async { + _pdfViewController.complete(pdfViewController); + final int currentPage = + await pdfViewController.getCurrentPage() ?? 0; + final int? pageCount = await pdfViewController.getPageCount(); + if (pageCount != null) { _pageCountController.add('${currentPage + 1} / $pageCount'); - }, - ).cachedFromUrl( - pdfURL, - placeholder: (progress) => Center( - child: Stack( - alignment: Alignment.center, - children: [ - CircularPercentIndicator( - animation: true, - animateFromLastPercent: true, - radius: 80.0, - lineWidth: 8.0, - percent: (progress / 100), - center: new Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - '$progress %', - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.black, - fontSize: 30.0, - fontWeight: FontWeight.bold), + } + }, + ).cachedFromUrl( + widget.pdfURL, + placeholder: (progress) => Center( + child: Stack( + alignment: Alignment.center, + children: [ + CircularPercentIndicator( + animation: true, + animateFromLastPercent: true, + radius: 80.0, + lineWidth: 8.0, + percent: (progress / 100), + center: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + '$progress %', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.black, + fontSize: 30.0, + fontWeight: FontWeight.bold, ), - Text( - 'COMPLETED', - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.black, - fontSize: 15.0, - fontWeight: FontWeight.bold), + ), + Text( + 'COMPLETED', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.black, + fontSize: 15.0, + fontWeight: FontWeight.bold, ), - ], - ), - progressColor: Colors.green, - ) - ], - ), + ), + ], + ), + progressColor: Colors.green, + ), + ], ), - errorWidget: (error) => Center(child: Text(error.toString())), - maxAgeCacheObject: const Duration(days: 10), ), - StreamBuilder( - stream: _pageCountController.stream, - builder: (_, AsyncSnapshot snapshot) { - if (snapshot.hasData) { - return Positioned( - top: 20, - right: 20, - child: Container( - padding: EdgeInsets.only( - top: 4.0, left: 16.0, bottom: 4.0, right: 16.0), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(4.0), - color: Colors.grey[400]), - child: Text(snapshot.data!, - style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.w400)))); - } - - return const SizedBox(); - }), - ], - )); + errorWidget: (error) => Center(child: Text(error.toString())), + maxAgeCacheObject: const Duration(days: 10), + ), + StreamBuilder( + stream: _pageCountController.stream, + builder: (_, AsyncSnapshot snapshot) { + if (snapshot.hasData) { + return Positioned( + top: 20, + right: 20, + child: Container( + padding: EdgeInsets.symmetric( + horizontal: 16.0, + vertical: 4.0, + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4.0), + color: Colors.grey[400], + ), + child: Text( + snapshot.data!, + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.w400, + ), + ), + ), + ); + } + return const SizedBox(); + }, + ), + ], + ), + ); } } diff --git a/lib/features/outbound/presentation/pages/short_term/family_to_family/family_to_family_outbound_page.dart b/lib/features/outbound/presentation/pages/short_term/family_to_family/family_to_family_outbound_page.dart index 025f8a19..f6daaa0f 100644 --- a/lib/features/outbound/presentation/pages/short_term/family_to_family/family_to_family_outbound_page.dart +++ b/lib/features/outbound/presentation/pages/short_term/family_to_family/family_to_family_outbound_page.dart @@ -38,126 +38,60 @@ class _FamilyToFamilyOutboundPageState ), ), body: ListView( - shrinkWrap: true, - scrollDirection: Axis.vertical, + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Padding( - padding: - const EdgeInsets.only(left: 20.0, right: 20.0, top: 20.0), - child: Text( - 'Kandidaten \n\nWat leuk dat je geïnteresseerd in de mogelijkheden van Rotary voor uitwisseling. Wereldwijd gaan er jaarlijks zo’n 8.000 studenten via Rotary op jaaruitwisseling, een hele organisatie.', - style: TextStyle(fontSize: 16.0), - ), + Text( + 'Kandidaten \n\nWat leuk dat je geïnteresseerd in de mogelijkheden van Rotary voor uitwisseling. Wereldwijd gaan er jaarlijks zo’n 8.000 studenten via Rotary op jaaruitwisseling, een hele organisatie.', + style: TextStyle(fontSize: 16.0), ), - SizedBox( - height: 20, - ), - Divider( - height: 15, - thickness: 2, - ), - buildOutboundOptionRow(context, 'Hoe schrijf ik mezelf in', + SizedBox(height: 20), + Divider(height: 15, thickness: 2), + _buildOutboundOptionRow(context, 'Hoe schrijf ik mezelf in', FontAwesomeIcons.pencil, HowToSignUpPage()), - Divider( - height: 15, - thickness: 2, - ), - buildOutboundOptionRow(context, 'Waar moet ik aan voldoen', + Divider(height: 15, thickness: 2), + _buildOutboundOptionRow(context, 'Waar moet ik aan voldoen', FontAwesomeIcons.exclamation, ComplyWithPage()), - Divider( - height: 15, - thickness: 2, - ), - buildOutboundOptionRow(context, 'Landenvoorkeur', + Divider(height: 15, thickness: 2), + _buildOutboundOptionRow(context, 'Landenvoorkeur', FontAwesomeIcons.flag, CountriesPreferencePage()), - // Divider( - // height: 15, - // thickness: 2, - // ), - // buildOutboundOptionRow( - // context, - // "Wat moet ik doen voor het selectieweekend", - // FontAwesomeIcons.clipboardCheck, - // SelectionWeekendPage()), - // Divider( - // height: 15, - // thickness: 2, - // ), - // buildOutboundOptionRow( - // context, - // "Hoe maak ik een goede top 3 van landen waar ik naar toe wil ", - // FontAwesomeIcons.globe, - // Top3CountriesPage()), - // Divider( - // height: 15, - // thickness: 2, - // ), - // buildOutboundOptionRow(context, "Hoe bereid ik me voor", - // FontAwesomeIcons.suitcase, null), - // // the end - // SizedBox( - // height: 20, - // ), ], - ) + ), ], ), ); } - GestureDetector buildOutboundOptionRow( + Widget _buildOutboundOptionRow( BuildContext context, String title, IconData icon, - pushTo, + Widget pushTo, ) { return GestureDetector( - child: Padding( - padding: EdgeInsets.only(top: 8.0, bottom: 8.0, left: 8.0), + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => pushTo), + ); + }, child: ListTile( - leading: Padding( - padding: EdgeInsets.zero, - child: Container( - child: FaIcon( - icon, - color: Palette.lightIndigo, - size: 27, - ), + contentPadding: EdgeInsets.symmetric(vertical: 8.0, horizontal: 8.0), + leading: FaIcon(icon, color: Palette.lightIndigo, size: 27), + title: Text( + title, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 15, + color: Palette.grey, + fontWeight: FontWeight.w500, ), ), - title: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - SizedBox( - width: Device.width - 120, - child: Text(title, - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - fontSize: 15, - color: Palette.grey, - fontWeight: FontWeight.w500, - )), - ), - Icon( - Icons.arrow_forward_ios, - color: Palette.grey, - ), - ], - ), - onTap: () { - if (pushTo != null) { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => pushTo), - ); - } - }, + trailing: Icon(Icons.arrow_forward_ios, color: Palette.grey), ), - )); + ); } } diff --git a/lib/features/outbound/presentation/pages/short_term/family_to_family/information/comply_with.dart b/lib/features/outbound/presentation/pages/short_term/family_to_family/information/comply_with.dart index f5279f60..7aa29548 100644 --- a/lib/features/outbound/presentation/pages/short_term/family_to_family/information/comply_with.dart +++ b/lib/features/outbound/presentation/pages/short_term/family_to_family/information/comply_with.dart @@ -6,17 +6,7 @@ import 'package:flutter/services.dart'; import 'package:rotary_nl_rye/core/prop.dart'; import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; -class ComplyWithPage extends StatefulWidget { - @override - _ComplyWithPageState createState() => _ComplyWithPageState(); -} - -class _ComplyWithPageState extends State { - @override - initState() { - super.initState(); - } - +class ComplyWithPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( @@ -35,62 +25,29 @@ class _ComplyWithPageState extends State { ), ), body: ListView( - padding: EdgeInsets.only(left: 20, top: 15, right: 20), - shrinkWrap: false, - scrollDirection: Axis.vertical, + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'Alle jongens en meisjes in de leeftijd van 15 t/m 19* jaar, die open staan voor anderen, van hen willen leren, met hen ervaringen willen uitwisselen, die uit hun eigen vertrouwde omgeving willen stappen en die anderen zonder vooroordelen willen ontmoeten zijn geschikt om aan dit programma deel te nemen. ', - style: TextStyle(fontSize: 15.0), - ), - ), - - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 8 Sep 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) + Text( + 'Alle jongens en meisjes in de leeftijd van 15 t/m 19* jaar, die open staan voor anderen, van hen willen leren, met hen ervaringen willen uitwisselen, die uit hun eigen vertrouwde omgeving willen stappen en die anderen zonder vooroordelen willen ontmoeten zijn geschikt om aan dit programma deel te nemen.', + style: TextStyle(fontSize: 15.0), + ), + SizedBox(height: 30), + Center( + child: Image.asset( + 'assets/image/rotary_blue.png', + height: 55.0, + ), + ), + SizedBox(height: 15), + Center( + child: Text( + 'Update: 8 Sep 2021', + style: TextStyle(color: Color(0xFF777777)), + ), + ), + SizedBox(height: 60), ], ), ); } - - @override - void dispose() { - super.dispose(); - } } diff --git a/lib/features/outbound/presentation/pages/short_term/family_to_family/information/countries_preference.dart b/lib/features/outbound/presentation/pages/short_term/family_to_family/information/countries_preference.dart index a8a67221..547b2909 100644 --- a/lib/features/outbound/presentation/pages/short_term/family_to_family/information/countries_preference.dart +++ b/lib/features/outbound/presentation/pages/short_term/family_to_family/information/countries_preference.dart @@ -6,18 +6,7 @@ import 'package:flutter/services.dart'; import 'package:rotary_nl_rye/core/prop.dart'; import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; -class CountriesPreferencePage extends StatefulWidget { - @override - _CountriesPreferencePageState createState() => - _CountriesPreferencePageState(); -} - -class _CountriesPreferencePageState extends State { - @override - initState() { - super.initState(); - } - +class CountriesPreferencePage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( @@ -36,109 +25,34 @@ class _CountriesPreferencePageState extends State { ), ), body: ListView( - padding: EdgeInsets.only(left: 20, top: 15, right: 20), - shrinkWrap: false, - scrollDirection: Axis.vertical, + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "header", - // style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold), - // ), - // ), - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'Als je mee wilt doen aan het Family to Family programma geef je op of je voor het noordelijk of zuidelijk halfrond gaat. Bij de landenkeuze dien je drie landen op 2 continenten op te geven. Hierbij gelden de Verenigde Staten en Canada als één bestemming. De reden hiervoor is dat we niet alle kandidaten in de VS en Canada kunnen plaatsen. Daarbij komt dat als jij de juiste instelling hebt voor een Family to Family uitwisseling het uiteindelijk niet uitmaakt naar welk land je gaat.', - style: TextStyle(fontSize: 15.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Text( - 'Kies voor Europa! Binnen Europa, ook al ligt dit naast de deur, vinden de mooiste uitwisselingen plaats en ontstaan de mooiste vriendschappen met het voordeel dat je deze vrienden makkelijker kunt herbezoeken. De reiskosten zijn veel lager.', - style: TextStyle(fontSize: 15.0), - ), - ), - - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "Voorbeeld vragen:", - // style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold), - // ), - // ), - // Padding( - // padding: const EdgeInsets.only(top: 5.0), - // child: Text( - // "- Wat betekent volgens jou het zijn van Ambassadeur voor Rotary", - // style: TextStyle(fontSize: 14.0), - // ), - // ), - // Padding( - // padding: const EdgeInsets.only(top: 5.0), - // child: Text( - // "- Wie is je rolmodel, voor wie heb je bewondering", - // style: TextStyle(fontSize: 14.0), - // ), - // ), - // Padding( - // padding: const EdgeInsets.only(top: 5.0), - // child: Text( - // "- Wat was de gelukkigste/mooiste dag in je leven", - // style: TextStyle(fontSize: 14.0), - // ), - // ), - // Padding( - // padding: const EdgeInsets.only(top: 5.0), - // child: Text( - // "- Op welke eigenschap ben je het meest trots", - // style: TextStyle(fontSize: 14.0), - // ), - // ), - // Padding( - // padding: const EdgeInsets.only(top: 5.0), - // child: Text( - // "- Wat denk je dat het moeilijkste is als je een jaar in het buitenland bent", - // style: TextStyle(fontSize: 14.0), - // ), - // ), - - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 8 Sep 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) + Text( + 'Als je mee wilt doen aan het Family to Family programma geef je op of je voor het noordelijk of zuidelijk halfrond gaat. Bij de landenkeuze dien je drie landen op 2 continenten op te geven. Hierbij gelden de Verenigde Staten en Canada als één bestemming. De reden hiervoor is dat we niet alle kandidaten in de VS en Canada kunnen plaatsen. Daarbij komt dat als jij de juiste instelling hebt voor een Family to Family uitwisseling het uiteindelijk niet uitmaakt naar welk land je gaat.', + style: TextStyle(fontSize: 15.0), + ), + SizedBox(height: 15), + Text( + 'Kies voor Europa! Binnen Europa, ook al ligt dit naast de deur, vinden de mooiste uitwisselingen plaats en ontstaan de mooiste vriendschappen met het voordeel dat je deze vrienden makkelijker kunt herbezoeken. De reiskosten zijn veel lager.', + style: TextStyle(fontSize: 15.0), + ), + SizedBox(height: 30), + Center( + child: Image.asset( + 'assets/image/rotary_blue.png', + height: 55.0, + ), + ), + SizedBox(height: 15), + Center( + child: Text( + 'Update: 8 Sep 2021', + style: TextStyle(color: Color(0xFF777777)), + ), + ), + SizedBox(height: 60), ], ), ); } - - @override - void dispose() { - super.dispose(); - } } diff --git a/lib/features/outbound/presentation/pages/short_term/family_to_family/information/how_to_sign_up.dart b/lib/features/outbound/presentation/pages/short_term/family_to_family/information/how_to_sign_up.dart index d8f855a0..35934b44 100644 --- a/lib/features/outbound/presentation/pages/short_term/family_to_family/information/how_to_sign_up.dart +++ b/lib/features/outbound/presentation/pages/short_term/family_to_family/information/how_to_sign_up.dart @@ -11,17 +11,7 @@ import 'package:url_launcher/url_launcher_string.dart'; import 'package:rotary_nl_rye/core/prop.dart'; import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; -class HowToSignUpPage extends StatefulWidget { - @override - _HowToSignUpPageState createState() => _HowToSignUpPageState(); -} - -class _HowToSignUpPageState extends State { - @override - initState() { - super.initState(); - } - +class HowToSignUpPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( @@ -40,114 +30,63 @@ class _HowToSignUpPageState extends State { ), ), body: ListView( - padding: EdgeInsets.only(left: 20, top: 15, right: 20), - shrinkWrap: false, - scrollDirection: Axis.vertical, + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 16), - children: [ - TextSpan( - text: 'Je stuurt een gezellig email bericht naar: ', - ), - TextSpan( - text: 'interesse@rotaryyep.nl.', - style: TextStyle(color: Colors.blue), - recognizer: TapGestureRecognizer() - ..onTap = () { - launchUrlString( - 'mailto:interesse@rotaryyep.nl?subject=interrese%20in%20F2F'); - }, - ), - TextSpan( - text: - ' Dan krijg je van ons een bevestiging dat we je mail hebben ontvangen. ', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 40.0, bottom: 30), - child: Container( - child: Center( - child: CupertinoButton.filled( - onPressed: () { - launchUrlString( - 'mailto:interesse@rotaryyep.nl?subject=interrese%20in%20F2F'); - }, - child: - // Row( - // children: [ - // Padding( - // padding: const EdgeInsets.only(left: 25.0), - // child: FaIcon( - // FontAwesomeIcons.phone, - // color: Colors.white, - // ), - // ), - // Padding( - // padding: const EdgeInsets.only(left: 20.0), - // child: Text( - // 'Call me ', - // style: TextStyle(color: Colors.white, fontSize: 18.0), - // ), - // ) - // ], - // ), - Text('Verstuur een Email'), - ), - ), - )), - - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), + Text( + 'Je stuurt een gezellig email bericht naar:', + style: + Theme.of(context).textTheme.bodyMedium!.copyWith(fontSize: 16), + ), + RichText( + text: TextSpan( + style: Theme.of(context) + .textTheme + .bodyMedium! + .copyWith(fontSize: 16), + children: [ + TextSpan( + text: 'interesse@rotaryyep.nl.', + style: TextStyle(color: Colors.blue), + recognizer: TapGestureRecognizer() + ..onTap = () { + launchUrlString( + 'mailto:interesse@rotaryyep.nl?subject=interrese%20in%20F2F'); + }, ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), + TextSpan( + text: + ' Dan krijg je van ons een bevestiging dat we je mail hebben ontvangen.', ), - ), - SizedBox( - height: 60, - ), - ], - ) + ], + ), + ), + SizedBox(height: 40), + Center( + child: CupertinoButton.filled( + onPressed: () { + launchUrlString( + 'mailto:interesse@rotaryyep.nl?subject=interrese%20in%20F2F'); + }, + child: Text('Verstuur een Email'), + ), + ), + SizedBox(height: 30), + Center( + child: Image.asset( + 'assets/image/rotary_blue.png', + height: 55.0, + ), + ), + SizedBox(height: 15), + Center( + child: Text( + 'Update: 31 May 2021', + style: TextStyle(color: Color(0xFF777777)), + ), + ), + SizedBox(height: 60), ], ), ); } - - @override - void dispose() { - super.dispose(); - } } diff --git a/lib/features/outbound/presentation/pages/short_term/ngse/information/comply_with.dart b/lib/features/outbound/presentation/pages/short_term/ngse/information/comply_with.dart deleted file mode 100644 index 521224ad..00000000 --- a/lib/features/outbound/presentation/pages/short_term/ngse/information/comply_with.dart +++ /dev/null @@ -1,103 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -class ComplyWithPage extends StatefulWidget { - @override - _ComplyWithPageState createState() => _ComplyWithPageState(); -} - -class _ComplyWithPageState extends State { - @override - initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Waar moet ik aan voldoen?', - textScaler: TextScaler.linear(1), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'Zit je op het VMBO, HAVO of VWO dan kun je na selectie voor deze uitwisseling in aanmerking komen. Je hebt wel een Rotaryclub nodig die jou wil voordragen: een Sponsorclub. Dat betekent niet dat de club jouw kosten betaalt., maar de club is verantwoordelijk voor de terug ontvangst van een jaarkind uit het buitenland. Als jij weggaat komt er ook een buitenlandse scholier terug. Een diploma is geen vereiste om je op te geven; je kunt nl ook je schoolprogramma onderbreken. Soms is dat zelfs een voordeel. In het buitenland worden namelijk vaak strenge leeftijdsgrenzen gesteld om tot een school te worden toegelaten. En om deel te kunnen nemen aan de schoolsporten is het soms beter om nog geen diploma te hebben.', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'Voor de uitzending gelden indicatieve leeftijdsgrenzen, in principe 15-18 jaar. De leeftijdsgrens geldt voor overheidsscholen, soms is er enige rek mogelijk.', - style: TextStyle(fontSize: 14.0), - ), - ), - - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], - ), - ); - } - - @override - void dispose() { - super.dispose(); - } -} diff --git a/lib/features/outbound/presentation/pages/short_term/ngse/information/how_do_i_prepare.dart b/lib/features/outbound/presentation/pages/short_term/ngse/information/how_do_i_prepare.dart deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/features/outbound/presentation/pages/short_term/ngse/information/how_to_sign_up.dart b/lib/features/outbound/presentation/pages/short_term/ngse/information/how_to_sign_up.dart deleted file mode 100644 index d9004ae5..00000000 --- a/lib/features/outbound/presentation/pages/short_term/ngse/information/how_to_sign_up.dart +++ /dev/null @@ -1,119 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 📦 Package imports: -import 'package:url_launcher/url_launcher_string.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -class HowToSignUpPage extends StatefulWidget { - @override - _HowToSignUpPageState createState() => _HowToSignUpPageState(); -} - -class _HowToSignUpPageState extends State { - @override - initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Hoe schrijf ik mezelf in', - textScaler: TextScaler.linear(1), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: 'Je stuurt een gezellig email bericht naar: ', - ), - TextSpan( - text: 'interesse@rotaryyep.nl.', - style: TextStyle(color: Colors.blue), - recognizer: TapGestureRecognizer() - ..onTap = () { - launchUrlString('mailto:interesse@rotaryyep.nl'); - }, - ), - TextSpan( - text: - ' Dan krijg je van ons een bevestiging dat we je mail hebben ontvangen. ', - ), - ])), - ), - - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], - ), - ); - } - - @override - void dispose() { - super.dispose(); - } -} diff --git a/lib/features/outbound/presentation/pages/short_term/ngse/information/selection_day.dart b/lib/features/outbound/presentation/pages/short_term/ngse/information/selection_day.dart deleted file mode 100644 index 9d6b5f90..00000000 --- a/lib/features/outbound/presentation/pages/short_term/ngse/information/selection_day.dart +++ /dev/null @@ -1,156 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -class SelectionDayPage extends StatefulWidget { - @override - _SelectionDayPageState createState() => _SelectionDayPageState(); -} - -class _SelectionDayPageState extends State { - @override - initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Selectie dag', - textScaler: TextScaler.linear(1), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'Wat moet ik doen voor de selectie dag:', - style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - '- Ik zou gewoon je best en doen en jezelf zijn.', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'Dit is wat je deze dag kan verwachten:', - style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- Je krijgt een interview, een groepsgesprek, een discussie en een test over je kennis van Nederland.', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- Dit zijn een paar voorbeeld vragen uit het interview tijdens de selectie dag. We gaan je niet alles vertellen, maar zo krijg je een beetje een idee.', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'Voorbeeld vragen:', - style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- Wat betekent volgens jou het zijn van Ambassadeur voor Rotary', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- Wie is je rolmodel, voor wie heb je bewondering', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- Wat was de gelukkigste/mooiste dag in je leven', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- Op welke eigenschap ben je het meest trots', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- Wat denk je dat het moeilijkste is als je een jaar in het buitenland bent', - style: TextStyle(fontSize: 14.0), - ), - ), - - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], - ), - ); - } - - @override - void dispose() { - super.dispose(); - } -} diff --git a/lib/features/outbound/presentation/pages/short_term/ngse/information/selection_weekend.dart b/lib/features/outbound/presentation/pages/short_term/ngse/information/selection_weekend.dart deleted file mode 100644 index 588fd4aa..00000000 --- a/lib/features/outbound/presentation/pages/short_term/ngse/information/selection_weekend.dart +++ /dev/null @@ -1,188 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -class SelectionWeekendPage extends StatefulWidget { - @override - _SelectionWeekendPageState createState() => _SelectionWeekendPageState(); -} - -class _SelectionWeekendPageState extends State { - @override - initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Selectie weekend', - textScaler: TextScaler.linear(1), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'Het weekend dient een aantal doelen:', - style: TextStyle( - color: Colors.red, - fontSize: 15.0, - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: '1. ', - ), - TextSpan( - text: 'Elkaar beter leren kennen.', - style: TextStyle(decoration: TextDecoration.underline), - ), - TextSpan( - text: - ' De groep leert elkaar beter kennen en wij leren jullie beter ', - ), - TextSpan( - text: 'kennen.', - style: TextStyle(decoration: TextDecoration.underline), - ), - TextSpan( - text: - ' Wij kunnen zó beter inschatten waar jullie als toekomstige Outbounds naar toe zouden kunnen gaan.', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: '2. ', - ), - TextSpan( - text: 'Jezelf presenteren.', - style: TextStyle(decoration: TextDecoration.underline), - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: '3. ', - ), - TextSpan( - text: 'Je oriënteren op een top-drie van landen', - style: TextStyle(decoration: TextDecoration.underline), - ), - TextSpan( - text: - ' waarnaar je het liefst wilt worden uitgezonden. Zowel Internationaal als Europees.', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: '4. ', - ), - TextSpan( - text: 'Selectie:', - style: TextStyle(decoration: TextDecoration.underline), - ), - TextSpan( - text: - ' Je kunt laten zien dat je uit het goede “uitwisselingshout” bent gesneden. Aanwezigheid is verplicht. Het weekend is dan ook onderdeel van de uiteindelijke selectie.', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - '*Je krijgt een mail van ons voor het weekend waarin staat wat je moet meenemen, en wat je moet voorbereiden. Het is altijd een topweekend. ', - style: TextStyle(fontSize: 12.5), - ), - ), - - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], - ), - ); - } - - @override - void dispose() { - super.dispose(); - } -} diff --git a/lib/features/outbound/presentation/pages/short_term/ngse/information/top_3_countries.dart b/lib/features/outbound/presentation/pages/short_term/ngse/information/top_3_countries.dart deleted file mode 100644 index 8a1e5aa5..00000000 --- a/lib/features/outbound/presentation/pages/short_term/ngse/information/top_3_countries.dart +++ /dev/null @@ -1,160 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/programs/presentation/pages/information/long_term_exchange.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -class Top3CountriesPage extends StatefulWidget { - @override - _Top3CountriesPageState createState() => _Top3CountriesPageState(); -} - -class _Top3CountriesPageState extends State { - @override - initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Goede top 3 van landen', - textScaler: TextScaler.linear(1), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "AANMELDEN?", - // style: TextStyle( - // color: Colors.black, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: '1. ', - ), - TextSpan( - text: - ' Lees in deze app de verhalen van exchange studenten', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: '2. ', - ), - TextSpan( - text: ' Kijk de video: ', - ), - TextSpan( - text: 'Proud to be European', - style: TextStyle(color: Colors.blue), - recognizer: TapGestureRecognizer() - ..onTap = () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - LongTermExchangeProgramPage()), - ); - }, - ), - TextSpan( - text: ' (Onderaan de pagina)', - style: TextStyle(fontSize: 12.5)), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: '3. ', - ), - TextSpan( - text: - 'Kijk op YouTube en google "Rotary Youth Exchange" dan kom je ook heel veel te weten. ', - ), - ])), - ), - - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 31 May 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], - ), - ); - } - - @override - void dispose() { - super.dispose(); - } -} diff --git a/lib/features/outbound/presentation/pages/short_term/ngse/ngse_outbound_page.dart b/lib/features/outbound/presentation/pages/short_term/ngse/ngse_outbound_page.dart index 8d1fbe0a..ffca8692 100644 --- a/lib/features/outbound/presentation/pages/short_term/ngse/ngse_outbound_page.dart +++ b/lib/features/outbound/presentation/pages/short_term/ngse/ngse_outbound_page.dart @@ -10,12 +10,7 @@ import 'package:rotary_nl_rye/core/presentation/widgets/show_alert_dialog.dart'; import 'package:rotary_nl_rye/core/prop.dart'; import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; -class NGSEOutboundPage extends StatefulWidget { - @override - _NGSEOutboundPageState createState() => _NGSEOutboundPageState(); -} - -class _NGSEOutboundPageState extends State { +class NGSEOutboundPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( @@ -40,99 +35,64 @@ class _NGSEOutboundPageState extends State { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ + // Uncomment and update the code below to add content // Padding( - // padding: - // const EdgeInsets.only(left: 20.0, right: 20.0, top: 20.0), + // padding: const EdgeInsets.symmetric(horizontal: 20.0, vertical: 20.0), // child: Text( // "Kandidaten \n\nWat leuk dat je geïnteresseerd in de mogelijkheden van Rotary voor jaaruitwisseling. Wereldwijd gaan er jaarlijks zo’n 8.000 studenten via Rotary op jaaruitwisseling, een hele organisatie. Wie weet ben jij komend schooljaar een van die studenten.", // style: TextStyle(fontSize: 16.0), // ), // ), - // SizedBox( - // height: 20, - // ), - // Divider( - // height: 15, - // thickness: 2, - // ), - // buildOutboundOptionRow(context, "Hoe schrijf ik mezelf in", - // FontAwesomeIcons.pencilAlt, HowToSignUpPage()), - // Divider( - // height: 15, - // thickness: 2, - // ), - // buildOutboundOptionRow(context, "Waar moet ik aan voldoen", - // FontAwesomeIcons.exclamation, ComplyWithPage()), - // Divider( - // height: 15, - // thickness: 2, - // ), - // buildOutboundOptionRow( - // context, - // "Wat moet ik doen voor de selectiedag", - // FontAwesomeIcons.voteYea, - // SelectionDayPage()), - // Divider( - // height: 15, - // thickness: 2, - // ), - // buildOutboundOptionRow( - // context, - // "Wat moet ik doen voor het selectieweekend", - // FontAwesomeIcons.clipboardCheck, - // SelectionWeekendPage()), - // Divider( - // height: 15, - // thickness: 2, - // ), - // buildOutboundOptionRow( - // context, - // "Hoe maak ik een goede top 3 van landen waar ik naar toe wil ", - // FontAwesomeIcons.globe, - // Top3CountriesPage()), - // Divider( - // height: 15, - // thickness: 2, - // ), - // buildOutboundOptionRow(context, "Hoe bereid ik me voor", - // FontAwesomeIcons.suitcase, null), - // // the end - // SizedBox( - // height: 20, - // ), + // SizedBox(height: 20), + // Divider(height: 15, thickness: 2), + // buildOutboundOptionRow(context, "Hoe schrijf ik mezelf in", FontAwesomeIcons.pencilAlt, HowToSignUpPage()), + // Divider(height: 15, thickness: 2), + // buildOutboundOptionRow(context, "Waar moet ik aan voldoen", FontAwesomeIcons.exclamation, ComplyWithPage()), + // Divider(height: 15, thickness: 2), + // buildOutboundOptionRow(context, "Wat moet ik doen voor de selectiedag", FontAwesomeIcons.voteYea, SelectionDayPage()), + // Divider(height: 15, thickness: 2), + // buildOutboundOptionRow(context, "Wat moet ik doen voor het selectieweekend", FontAwesomeIcons.clipboardCheck, SelectionWeekendPage()), + // Divider(height: 15, thickness: 2), + // buildOutboundOptionRow(context, "Hoe maak ik een goede top 3 van landen waar ik naar toe wil", FontAwesomeIcons.globe, Top3CountriesPage()), + // Divider(height: 15, thickness: 2), + // buildOutboundOptionRow(context, "Hoe bereid ik me voor", FontAwesomeIcons.suitcase, null), + // SizedBox(height: 20), ], - ) + ), ], ), ); } GestureDetector buildOutboundOptionRow( - BuildContext context, - String title, - IconData icon, - pushTo, - ) { + BuildContext context, String title, IconData icon, Widget? pushTo) { return GestureDetector( - child: Padding( - padding: EdgeInsets.only(top: 8.0, bottom: 8.0, left: 8.0), - child: ListTile( - leading: Padding( - padding: EdgeInsets.zero, - child: Container( - child: FaIcon( - icon, - color: Palette.lightIndigo, - size: 27, - ), + onTap: () { + if (pushTo != null) { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => pushTo), + ); + } else { + showMaterialDialog( + context, 'Coming soon', 'This page is not yet ready', null); + } + }, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 8.0), + child: ListTile( + leading: FaIcon( + icon, + color: Palette.lightIndigo, + size: 27, ), - ), - title: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - SizedBox( - width: Device.width - 120, - child: Text(title, + title: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + width: Device.width - 120, + child: Text( + title, maxLines: 2, overflow: TextOverflow.ellipsis, softWrap: false, @@ -140,27 +100,17 @@ class _NGSEOutboundPageState extends State { fontSize: 15, color: Palette.grey, fontWeight: FontWeight.w500, - )), - ), - Icon( - Icons.arrow_forward_ios, - color: Palette.grey, - ), - ], + ), + ), + ), + Icon( + Icons.arrow_forward_ios, + color: Palette.grey, + ), + ], + ), ), - onTap: () { - if (pushTo != null) { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => pushTo), - ); - } else { - String title = 'Comming soon'; - String message = 'This page is not yet ready'; - showMaterialDialog(context, title, message, null); - } - }, ), - )); + ); } } diff --git a/lib/features/programs/presentation/pages/information/camps_tours.dart b/lib/features/programs/presentation/pages/information/camps_tours.dart index 9dab22d7..b05551ba 100644 --- a/lib/features/programs/presentation/pages/information/camps_tours.dart +++ b/lib/features/programs/presentation/pages/information/camps_tours.dart @@ -24,7 +24,7 @@ class _CampsAndToursProgramPageState extends State { int _current2 = 0; int _current3 = 0; - List localimages1 = [ + final List localImages1 = [ CarouselModel( image: 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/programs/outbound_summercamp/Picture1-1.png', @@ -57,10 +57,10 @@ class _CampsAndToursProgramPageState extends State { CarouselModel( image: 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/programs/outbound_summercamp/Picture5.png', - text: 'OUT-BOUND zomerkamp: Zuid-Italië') + text: 'OUTBOUND zomerkamp: Zuid-Italië') ]; - List localimages2 = [ + final List localImages2 = [ CarouselModel( image: 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/programs/inbound_summercamp/Picture1.png', @@ -91,7 +91,7 @@ class _CampsAndToursProgramPageState extends State { 'INBOUND zomerkamp: Buitenlandse jongeren maken kennis met de Nederlandse cultuur') ]; - List localimages3 = [ + final List localImages3 = [ CarouselModel( image: 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/programs/inbound_summercamp/Picture7.png', @@ -119,14 +119,6 @@ class _CampsAndToursProgramPageState extends State { text: 'Inbound Zomerkamp in Nederland ‘Afscheids- of BONTE avond') ]; - List map(List list, Function handler) { - List result = []; - for (var i = 0; i < list.length; i++) { - result.add(handler(i, list[i])); - } - return result; - } - @override Widget build(BuildContext context) { return Scaffold( @@ -145,665 +137,298 @@ class _CampsAndToursProgramPageState extends State { ), ), body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 15), children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: Text( - 'CAMPS & TOURS: deelnemen', - style: TextStyle( - // color: Colors.black, - fontSize: 17.0, - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'OUTBOUND zomerkamp: ', - style: TextStyle( - // color: Colors.black, - fontSize: 14.0, - fontWeight: FontWeight.bold), - ), - ), - -// CarouselModel 1 - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Container( - width: MediaQuery.of(context).size.width, - // height: 220, - child: CarouselSlider.builder( - itemCount: localimages1.length, - options: CarouselOptions( - autoPlay: true, - aspectRatio: 1.0, - enlargeCenterPage: true, - onPageChanged: (index, reason) { - setState(() { - _current1 = index; - }); - }), - itemBuilder: (context, index, realIdx) { - return CachedNetworkImage( - imageUrl: localimages1[index].image, - imageBuilder: (context, imageProvider) => Container( - decoration: BoxDecoration( - // color: Colors.grey, - borderRadius: BorderRadius.circular(8), - image: DecorationImage( - image: imageProvider, fit: BoxFit.cover), - ), - ), - placeholder: (context, url) => - Center(child: CircularProgressIndicator()), - errorWidget: (context, url, error) => - Icon(Icons.error), - ); - }, - ), - ), - SizedBox( - height: 12, - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Row( - children: map( - localimages1, - (index, image) { - return Container( - alignment: Alignment.centerLeft, - child: _current1 == index - ? Padding( - padding: const EdgeInsets.only( - // right: 30.0, left: 30 - ), - child: SizedBox( - width: MediaQuery.of(context) - .size - .width * - 0.8, - child: Text( - localimages1[index].text, - textScaler: - TextScaler.linear(1), - maxLines: 100, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - fontStyle: FontStyle.italic, - color: Palette.grey)), - ), - ) - : SizedBox.shrink()); - }, - ), - ), - ], - ), - SizedBox( - height: 12, - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Row( - children: map( - localimages1, - (index, image) { - return Container( - alignment: Alignment.centerLeft, - height: 6, - width: 6, - margin: EdgeInsets.only(right: 8), - decoration: BoxDecoration( - shape: BoxShape.circle, - color: _current1 == index - ? Palette.accentColor - : Palette.lightIndigo), - ); - }, - ), - ), - ], - ), - ], - ), - ), - -//end - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'INBOUND zomerkamp: ', - style: TextStyle( - // color: Colors.black, - fontSize: 14.0, - fontWeight: FontWeight.bold), - ), - ), -// CarouselModel 2 - - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Container( - width: MediaQuery.of(context).size.width, - // height: 250, - child: CarouselSlider.builder( - itemCount: localimages2.length, - options: CarouselOptions( - autoPlay: true, - aspectRatio: 1.0, - enlargeCenterPage: true, - onPageChanged: (index, reason) { - setState(() { - _current2 = index; - }); - }), - itemBuilder: (context, index, realIdx) { - return CachedNetworkImage( - imageUrl: localimages2[index].image, - imageBuilder: (context, imageProvider) => Container( - decoration: BoxDecoration( - // color: Colors.grey, - borderRadius: BorderRadius.circular(8), - image: DecorationImage( - image: imageProvider, fit: BoxFit.cover), - ), - ), - placeholder: (context, url) => - Center(child: CircularProgressIndicator()), - errorWidget: (context, url, error) => - Icon(Icons.error), - ); - }, - ), - ), - SizedBox( - height: 12, - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Row( - children: map( - localimages2, - (index, image) { - return Container( - alignment: Alignment.centerLeft, - child: _current2 == index - ? Padding( - padding: const EdgeInsets.only( - // right: 30.0, left: 30 - ), - child: SizedBox( - width: MediaQuery.of(context) - .size - .width * - 0.8, - child: Text( - localimages2[index].text, - textScaler: - TextScaler.linear(1), - maxLines: 100, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - fontStyle: FontStyle.italic, - color: Palette.grey)), - ), - ) - : SizedBox.shrink()); - }, - ), - ), - ], - ), - SizedBox( - height: 12, - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Row( - children: map( - localimages2, - (index, image) { - return Container( - alignment: Alignment.centerLeft, - height: 6, - width: 6, - margin: EdgeInsets.only(right: 8), - decoration: BoxDecoration( - shape: BoxShape.circle, - color: _current2 == index - ? Palette.accentColor - : Palette.lightIndigo), - ); - }, - ), - ), - ], - ), - ], - ), - ), - -//end - -// CarouselModel 3 - - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Container( - width: MediaQuery.of(context).size.width, - // height: 250, - child: CarouselSlider.builder( - itemCount: localimages3.length, - options: CarouselOptions( - autoPlay: true, - aspectRatio: 1.0, - enlargeCenterPage: true, - onPageChanged: (index, reason) { - setState(() { - _current3 = index; - }); - }), - itemBuilder: (context, index, realIdx) { - return CachedNetworkImage( - imageUrl: localimages3[index].image, - imageBuilder: (context, imageProvider) => Container( - decoration: BoxDecoration( - // color: Colors.grey, - borderRadius: BorderRadius.circular(8), - image: DecorationImage( - image: imageProvider, fit: BoxFit.cover), - ), - ), - placeholder: (context, url) => - Center(child: CircularProgressIndicator()), - errorWidget: (context, url, error) => - Icon(Icons.error), - ); - }, - ), - ), - SizedBox( - height: 12, - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Row( - children: map( - localimages3, - (index, image) { - return Container( - alignment: Alignment.centerLeft, - child: _current3 == index - ? Padding( - padding: const EdgeInsets.only( - // right: 30.0, left: 30 - ), - child: SizedBox( - width: MediaQuery.of(context) - .size - .width * - 0.8, - child: Text( - localimages3[index].text, - textScaler: - TextScaler.linear(1), - maxLines: 100, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - fontStyle: FontStyle.italic, - color: Palette.grey)), - ), - ) - : SizedBox.shrink()); - }, - ), - ), - ], - ), - SizedBox( - height: 12, - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Row( - children: map( - localimages3, - (index, image) { - return Container( - alignment: Alignment.centerLeft, - height: 6, - width: 6, - margin: EdgeInsets.only(right: 8), - decoration: BoxDecoration( - shape: BoxShape.circle, - color: _current3 == index - ? Palette.accentColor - : Palette.lightIndigo), - ); - }, - ), - ), - ], - ), - ], - ), - ), + buildSectionTitle('CAMPS & TOURS: deelnemen'), + buildSubsectionTitle('OUTBOUND zomerkamp: '), + buildCarousel(localImages1, _current1, (index) { + setState(() { + _current1 = index; + }); + }), + buildSubsectionTitle('INBOUND zomerkamp: '), + buildCarousel(localImages2, _current2, (index) { + setState(() { + _current2 = index; + }); + }), + buildCarousel(localImages3, _current3, (index) { + setState(() { + _current3 = index; + }); + }), + buildSectionTitle('Wat houdt dat in?'), + buildParagraph( + 'Heel veel Europese landen organiseren in de periode van juni t/m september Zomer Tours en speciale kampen, zoals zeil-, ski- en sportkampen. De laatste jaren worden er ook Zomerkampen in Canada, V.S. en Taiwan georganiseerd. Er worden groepen van 10 à 20 deelnemers gevormd met een zo groot mogelijke spreiding van nationaliteiten. Deze groepen zijn te gast bij Rotaryclubs die een informatief, toeristisch of sportief programma organiseren. Meestal verblijft men in (Rotary)gezinnen of hostels waarbij Rotarians de leiding hebben. De belangstelling is doorgaans groter dan het aantal beschikbare plaatsen, dus stuur z.s.m. jouw aanmelding in!.'), + buildSectionTitle('Voor wie?'), + buildParagraph( + 'De leeftijd van de deelnemers varieert van 15 - 21 jaar. Deelname is mogelijk voor jongeren van Rotarians en van niet-Rotarians.'), + buildSectionTitle('Met welke landen?'), + buildParagraph('Europese landen, maar ook Canada, VS en Taiwan.'), + buildSectionTitle('Aanmelden?'), + buildRichText( + 'Door de buitenlandse organisator worden uitnodigingen aan de MDJC (= Multi District Jeugdzaken Commissie van Rotary) gestuurd om een jongen of meisje van een bepaalde leeftijd en in een speciale periode aan hun Camp of Tour te laten deelnemen. Deze uitnodigingen worden direct na ontvangst op de site ', + 'Summer Camps', + LoadCsv()), + buildParagraph( + ' geplaatst ter info. Je treft deze op de site aan vanaf half januari t/m begin mei. Dus hier vind je steeds het meest actuele aanbod over de Camps & Tours uit de deelnemende landen. Je kunt de coördinator ook direct laten weten als je interesse hebt om deel te nemen aan een bepaald Camp of Tour. Aanmelden via deze email: '), + buildLinkText( + 'zomerkamp@rotaryyep.nl', 'mailto:zomerkamp@rotaryyep.nl'), + buildParagraph('Hierop moet duidelijk worden:'), + buildBulletPoint('Wie jouw sponsor-Rotary Club is;'), + buildBulletPoint('De periode waarin je beschikbaar bent;'), + buildBulletPoint( + 'De landen waarnaar je voorkeur uitgaat. (Als er geen specifieke voorkeur is en elk Europees land goed is, kan dit vermeld worden.)'), + buildParagraph( + 'De coördinator koppelt de aanmeldingen aan de uitnodigingen en stuurt de deelnemers bericht.'), + buildBoldText('Dringend verzoek: ', + 'gelieve bij aanmelding op te geven of men zich ook heeft aangemeld voor andere reizen of kampen'), + buildRichText( + 'De CJC van de sponsorclub stuurt het aanmeldingsformulier naar de outboundcoördinator: ', + 'zomerkamp@rotaryyep.nl', + null), + buildSectionTitle('Kosten?'), + buildParagraph( + 'De kosten voor aanmelding zijn 100,-- ex BTW (121 euro incl. BTW) (kosten kunnen per jaar verschillen) \n\nDe aanmelding staat open tot mei. \n\nNaast het inschrijfgeld moet men rekening houden met de volgende kosten:'), + buildBulletPoint( + 'Reiskosten naar de plaats waar het kamp wordt gehouden.'), + buildBulletPoint('Zakgeld ter plaatse.'), + buildBulletPoint( + 'Een enkele Rotary Club in het buitenland vraagt wel eens een klein deelnamebedrag (dit staat steeds in de uitnodiging vermeld.)'), + buildSectionTitle('Waarom doen we dit?'), + buildBulletPoint('Het opbouwen van goede relaties met andere landen'), + buildBulletPoint('Het houdt de club jong'), + buildBulletPoint( + 'De jongere ontwikkelt zichzelf en zijn/haar omgeving'), + buildEndSection(), + ], + ), + ); + } -//end - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'Wat houdt dat in?', - style: TextStyle( - // color: Colors.black, - fontSize: 14.0, - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'Heel veel Europese landen organiseren in de periode van juni t/m september Zomer Tours en speciale kampen, zoals zeil-, ski- en sportkampen. De laatste jaren worden er ook Zomerkampen in Canada, V.S. en Taiwan georganiseerd. Er worden groepen van 10 à 20 deelnemers gevormd met een zo groot mogelijke spreiding van nationaliteiten. Deze groepen zijn te gast bij Rotaryclubs die een informatief, toeristisch of sportief programma organiseren. Meestal verblijft men in (Rotary)gezinnen of hostels waarbij Rotarians de leiding hebben. De belangstelling is doorgaans groter dan het aantal beschikbare plaatsen, dus stuur z.s.m. jouw aanmelding in!.', - style: TextStyle( - // color: Colors.black, - fontSize: 14.0), - ), - ), + Widget buildSectionTitle(String title) { + return Padding( + padding: const EdgeInsets.only(top: 20.0), + child: Text( + title, + style: TextStyle(fontSize: 17.0, fontWeight: FontWeight.bold), + ), + ); + } - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'Voor wie?', - style: TextStyle( - // color: Colors.black, - fontSize: 14.0, - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'De leeftijd van de deelnemers varieert van 15 - 21 jaar. Deelname is mogelijk voor jongeren van Rotarians en van niet-Rotarians.', - style: TextStyle( - // color: Colors.black, - fontSize: 14.0), - ), - ), + Widget buildSubsectionTitle(String title) { + return Padding( + padding: const EdgeInsets.only(top: 25.0), + child: Text( + title, + style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold), + ), + ); + } - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'Met welke landen?', - style: TextStyle( - // color: Colors.black, - fontSize: 14.0, - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'Europese landen, maar ook Canada, VS en Taiwan.', - style: TextStyle( - // color: Colors.black, - fontSize: 14.0), - ), - ), + Widget buildParagraph(String text) { + return Padding( + padding: const EdgeInsets.only(top: 10.0), + child: Text( + text, + style: TextStyle(fontSize: 14.0), + ), + ); + } - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'Aanmelden?', - style: TextStyle( - // color: Colors.black, - fontSize: 14.0, - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'Door de buitenlandse organisator worden uitnodigingen aan de MDJC (= Multi District Jeugdzaken Commissie van Rotary) gestuurd om een jongen of meisje van een bepaalde leeftijd en in een speciale periode aan hun Camp of Tour te laten deelnemen. Deze uitnodigingen worden direct na ontvangst op de site ', - ), - TextSpan( - text: 'Summer Camps', - style: TextStyle(color: Colors.blue), - recognizer: TapGestureRecognizer() - ..onTap = () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => LoadCsv()), - ); - }, - ), - TextSpan( - text: - ' geplaatst ter info. Je treft deze op de site aan vanaf half januari t/m begin mei. Dus hier vind je steeds het meest actuele aanbod over de Camps & Tours uit de deelnemende landen. Je kunt de coördinator ook direct laten weten als je interesse hebt om deel te nemen aan een bepaald Camp of Tour. Aanmelden via deze email: ', - ), - TextSpan( - text: 'zomerkamp@rotaryyep.nl', - style: TextStyle(color: Colors.blue), - recognizer: TapGestureRecognizer() - ..onTap = () { - launchUrlString('mailto:zomerkamp@rotaryyep.nl'); - }, - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'Hierop moet duidelijk worden:', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - '- Wie jouw sponsor-Rotary Club is;', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- De periode waarin je beschikbaar bent;', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- De landen waarnaar je voorkeur uitgaat. (Als er geen speci­fieke voor­keur is en elk Europees land goed is, kan dit vermeld worden.)', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'De coördinator koppelt de aanmeldingen aan de uitnodigingen en stuurt de deelnemers bericht.', - style: TextStyle(fontSize: 14.0), - ), - ), + Widget buildBulletPoint(String text) { + return Padding( + padding: const EdgeInsets.only(top: 5.0), + child: Text( + text, + style: TextStyle(fontSize: 14.0), + ), + ); + } - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: 'Dringend verzoek: ', - style: TextStyle(fontWeight: FontWeight.bold), - ), - TextSpan( - text: - 'gelieve bij aanmelding op te geven of men zich ook heeft aangemeld voor andere reizen of kampen', - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'De CJC van de sponsorclub stuurt het aanmeldingsformulier naar de outboundcoördinator: ', - ), - TextSpan( - text: 'zomerkamp@rotaryyep.nl', - style: TextStyle(color: Colors.blue), - recognizer: TapGestureRecognizer() - ..onTap = () { - launchUrlString('mailto:zomerkamp@rotaryyep.nl'); - }, - ), - ])), - ), + Widget buildRichText(String text1, String text2, Widget? page) { + return Padding( + padding: const EdgeInsets.only(top: 10.0), + child: RichText( + text: TextSpan( + style: Theme.of(context).textTheme.bodyMedium!.copyWith(fontSize: 14), + children: [ + TextSpan(text: text1), + TextSpan( + text: text2, + style: TextStyle(color: Colors.blue), + recognizer: TapGestureRecognizer() + ..onTap = () { + if (page != null) { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => page), + ); + } else { + launchUrlString('mailto:zomerkamp@rotaryyep.nl'); + } + }, + ), + ], + ), + ), + ); + } - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'Aanmelden?', - style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'de kosten voor aanmelding zijn 100,-- ex BTW (121 euro incl. BTW) (kosten kunnen per jaar verschillen) \n\nDe aanmelding staat open tot mei. \n\nNaast het inschrijfgeld moet men rekening houden met de volgende kosten:', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - '- Reiskosten naar de plaats waar het kamp wordt gehouden.', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- Zakgeld ter plaatse.', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- Een enkele Rotary Club in het buitenland vraagt wel eens een klein deelnamebedrag (dit staat steeds in de uitnodiging vermeld.)', - style: TextStyle(fontSize: 14.0), - ), - ), + Widget buildLinkText(String text, String url) { + return Padding( + padding: const EdgeInsets.only(top: 10.0), + child: RichText( + text: TextSpan( + style: Theme.of(context).textTheme.bodyMedium!.copyWith(fontSize: 14), + children: [ + TextSpan( + text: text, + style: TextStyle(color: Colors.blue), + recognizer: TapGestureRecognizer() + ..onTap = () { + launchUrlString(url); + }, + ), + ], + ), + ), + ); + } - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Text( - 'Waarom doen we dit?', - style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - '- Het opbouwen van goede relaties met andere landen', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- Het houdt de club jong', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- De jongere ontwikkelt zichzelf en zijn/haar omgeving', - style: TextStyle(fontSize: 14.0), - ), - ), + Widget buildBoldText(String boldText, String normalText) { + return Padding( + padding: const EdgeInsets.only(top: 10.0), + child: RichText( + text: TextSpan( + style: Theme.of(context).textTheme.bodyMedium!.copyWith(fontSize: 14), + children: [ + TextSpan( + text: boldText, + style: TextStyle(fontWeight: FontWeight.bold), + ), + TextSpan(text: normalText), + ], + ), + ), + ); + } - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, + Widget buildCarousel( + List images, int currentIndex, Function onPageChanged) { + return Padding( + padding: const EdgeInsets.only(top: 20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + CarouselSlider.builder( + itemCount: images.length, + options: CarouselOptions( + autoPlay: true, + aspectRatio: 1.0, + enlargeCenterPage: true, + onPageChanged: (index, reason) { + onPageChanged(index); + }, + ), + itemBuilder: (context, index, realIdx) { + return CachedNetworkImage( + imageUrl: images[index].image, + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + image: DecorationImage( + image: imageProvider, fit: BoxFit.cover), ), ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 26 augustus 2019', - style: TextStyle(color: Color(0xFF777777)), + placeholder: (context, url) => + Center(child: CircularProgressIndicator()), + errorWidget: (context, url, error) => Icon(Icons.error), + ); + }, + ), + SizedBox(height: 12), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + alignment: Alignment.centerLeft, + child: Padding( + padding: const EdgeInsets.only(), + child: SizedBox( + width: MediaQuery.of(context).size.width * 0.8, + child: Text( + images[currentIndex].text, + textScaler: TextScaler.linear(1), + maxLines: 100, + overflow: TextOverflow.ellipsis, + softWrap: false, + style: TextStyle( + fontStyle: FontStyle.italic, color: Palette.grey), + ), ), ), ), - SizedBox( - height: 60, + ], + ), + SizedBox(height: 12), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + children: images.map((image) { + int index = images.indexOf(image); + return Container( + alignment: Alignment.centerLeft, + height: 6, + width: 6, + margin: EdgeInsets.only(right: 8), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: currentIndex == index + ? Palette.accentColor + : Palette.lightIndigo), + ); + }).toList(), ), ], - ) + ), ], ), ); } + + Widget buildEndSection() { + return Column( + children: [ + Padding( + padding: const EdgeInsets.only(top: 30.0), + child: Center( + child: Image.asset( + 'assets/image/rotary_blue.png', + height: 55.0, + ), + ), + ), + Padding( + padding: const EdgeInsets.only(top: 15.0), + child: Center( + child: Text( + 'Update: 26 augustus 2019', + style: TextStyle(color: Color(0xFF777777)), + ), + ), + ), + SizedBox(height: 60), + ], + ); + } } class CarouselModel { - final String image, text; + final String image; + final String text; CarouselModel({required this.image, required this.text}); } diff --git a/lib/features/programs/presentation/pages/information/family_to_family.dart b/lib/features/programs/presentation/pages/information/family_to_family.dart index 116dc581..73fa44c1 100644 --- a/lib/features/programs/presentation/pages/information/family_to_family.dart +++ b/lib/features/programs/presentation/pages/information/family_to_family.dart @@ -58,11 +58,11 @@ class _FamilyToFamilyProgramPageState extends State { image: 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/programs/f_to_f/Picture7.png', text: - 'Lutra haar familie maken met Lot een trip door ‘de Gouden Driehoek in Noord India: Delhi, Jaipur en Agra (foto met de Thai Mahal op de achtergrond. Lutra woont in Nagpur.'), + 'Lutra haar familie maken met Lot een trip door \'de Gouden Driehoek\' in Noord India: Delhi, Jaipur en Agra (foto met de Thai Mahal op de achtergrond. Lutra woont in Nagpur.)'), CarouselModel( image: 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/programs/f_to_f/Picture8-1.png', - text: '‘EVEN VERWISSELD VAN NATIONAL COSTUME’'), + text: '\'EVEN VERWISSELD VAN NATIONAL COSTUME\''), CarouselModel( image: 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/images/programs/f_to_f/Picture8-2.png', @@ -160,8 +160,8 @@ class _FamilyToFamilyProgramPageState extends State { ], ), DataRow( - color: MaterialStateColor.resolveWith( - (states) => Palette.themeCardShadeColor), + color: + WidgetStateColor.resolveWith((states) => Palette.themeCardShadeColor), cells: [ DataCell(Text('Totaal')), DataCell(Text('€1.300.- tot 2.050.-')), diff --git a/lib/features/programs/presentation/pages/information/long_term_exchange.dart b/lib/features/programs/presentation/pages/information/long_term_exchange.dart index 4a15bc1d..88fb97c7 100644 --- a/lib/features/programs/presentation/pages/information/long_term_exchange.dart +++ b/lib/features/programs/presentation/pages/information/long_term_exchange.dart @@ -20,11 +20,6 @@ class LongTermExchangeProgramPage extends StatefulWidget { class _LongTermExchangeProgramPageState extends State { - @override - initState() { - super.initState(); - } - @override Widget build(BuildContext context) { return Scaffold( @@ -43,284 +38,148 @@ class _LongTermExchangeProgramPageState ), ), body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 15), children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: Text( - 'WAT HOUDT DAT IN?', - style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'Dit programma van Rotary International is bestemd voor alle hierin geïnteresseerde scholieren uit het Voortgezet Onderwijs. Het is de bedoeling dat je in het buitenland een jaar High School volgt. Omgekeerd komen buitenlandse scholieren hier om gedurende een jaar samen met leeftijdgenoten naar school te gaan.', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'Zit je op VWO, HAVO of VMBO dan kun je na selectie voor deze uitwisseling in aanmerking komen. Je hebt wel een Rotaryclub nodig die jou wil voordragen: een Sponsorclub. Dat betekent uiteraard niet dat de club jouw kosten betaalt. Nee, de club is verantwoordelijk voor de terug ontvangst van een jaarkind uit het buitenland.', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0, bottom: 10.0), - child: Text( - 'Een diploma is geen vereiste om je op te geven; je kunt ook je schoolprogramma onderbreken. Soms is dat zelfs een voordeel. In het buitenland worden namelijk vaak strenge leeftijdsgrenzen gesteld om tot een school te worden toegelaten. En om deel te kunnen nemen aan de schoolsporten is het soms beter om nog geen diploma te hebben.', - style: TextStyle(fontSize: 14.0), - ), - ), + buildSectionTitle('WAT HOUDT DAT IN?'), + buildParagraph( + 'Dit programma van Rotary International is bestemd voor alle hierin geïnteresseerde scholieren uit het Voortgezet Onderwijs. Het is de bedoeling dat je in het buitenland een jaar High School volgt. Omgekeerd komen buitenlandse scholieren hier om gedurende een jaar samen met leeftijdgenoten naar school te gaan.'), + buildParagraph( + 'Zit je op VWO, HAVO of VMBO dan kun je na selectie voor deze uitwisseling in aanmerking komen. Je hebt wel een Rotaryclub nodig die jou wil voordragen: een Sponsorclub. Dat betekent uiteraard niet dat de club jouw kosten betaalt. Nee, de club is verantwoordelijk voor de terug ontvangst van een jaarkind uit het buitenland.'), + buildParagraph( + 'Een diploma is geen vereiste om je op te geven; je kunt ook je schoolprogramma onderbreken. Soms is dat zelfs een voordeel. In het buitenland worden namelijk vaak strenge leeftijdsgrenzen gesteld om tot een school te worden toegelaten. En om deel te kunnen nemen aan de schoolsporten is het soms beter om nog geen diploma te hebben.'), + buildVideo( + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/videos/promo/Rotary_Promo_Short.mp4'), + buildSectionTitle('VOOR WIE?'), + buildParagraph( + 'Voor de uitzending gelden indicatieve leeftijdsgrenzen, in principe 15,5-18,5 jaar. De leeftijdsgrens geldt voor overheidsscholen, soms is er enige rek mogelijk.'), + buildParagraph( + 'Als je ouder bent zijn de mogelijkheden kleiner; je kunt het echter altijd vragen.'), + buildParagraph( + 'Kandidaten dienen deel te nemen aan een selectiedag in oktober en een selectieweekend in november.'), + buildRichText('Voor de datum van deze dagen zie de ', 'agenda', () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => CalendarPage()), + ); + }), + buildParagraph( + 'Op basis van de beoordeling na de selectiedagen wordt uitgenodigd aan het programma deel te nemen. Er is een verplichte informatiedag in april en juni, waarbij ook je ouders aanwezig dienen te zijn.'), + buildSectionTitle('MET WELKE LANDEN?'), + buildParagraph( + 'De commissie jaaruitwisseling probeert een zo groot mogelijke spreiding in de bestemmingen te realiseren omdat daardoor ook de groep scholieren in Nederland een grote spreiding in nationaliteiten en culturen zal hebben.'), + buildParagraph( + 'In de hieronder genoemde landen wordt uitgewisseld met één of meer districten. Van jaar tot jaar kunnen die districten veranderen. De informatie per land is nog niet ingevuld.'), + buildSectionTitle('NOORDELIJK HALFROND'), + buildParagraph( + 'USA, Canada, India, Indonesie, Japan, Thailand, Taiwan'), + buildParagraph( + 'Europa: Frankrijk. Italie, Finland en Zweden, Spanje, Turkije'), + buildParagraph( + 'Op exchange dicht bij huis, duurzaam reizen en toch een andere cultuur & taal? Geniet van wat Europa jou kan bieden!'), + buildVideo( + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/videos/promo/proud_to_be_European.mp4'), + buildSectionTitle('ZUIDELIJK HALFROND'), + buildParagraph( + 'Brazilie, Chili, Argentinie, Mexico, Ecuador, Peru, Mexico, Australie, Nieuw Zeeland, Zuid Afrika'), + buildSectionTitle('AANMELDEN?'), + buildRichText( + 'Zie aanmelden (zie menu balk bovenaan deze pagina). Inlichtingen bij de coördinator van het programma Barbara Tusveld ', + 'longtermchair@rotaryyep.nl.', () { + launchUrlString('mailto:longtermchair@rotaryyep.nl'); + }), + buildSectionTitle('KOSTEN?'), + buildParagraph( + 'De kosten voor de jongere bedragen vanaf € 2.400,-- Exclusief BTW. zakgeld exclusief ticket en andere onkosten.'), + buildSectionTitle('Waarom doen we dit?'), + buildBulletPoint('Het opbouwen van goede relaties met andere landen'), + buildBulletPoint('Het houdt de club jong'), + buildBulletPoint( + 'De jongere ontwikkelt zichzelf en zijn/haar omgeving'), + buildEndSection(), + ], + ), + ); + } - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: NativeVideo( - url: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/videos/promo/Rotary_Promo_Short.mp4'), - ), - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'VOOR WIE?', - style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'Voor de uitzending gelden indicatieve leeftijdsgrenzen, in principe 15,5-18,5 jaar. De leeftijdsgrens geldt voor overheidsscholen, soms is er enige rek mogelijk.', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'Als je ouder bent zijn de mogelijkheden kleiner; je kunt het echter altijd vragen.', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'Kandidaten dienen deel te nemen aan een selectiedag in oktober en een selectieweekend in november.', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: 'Voor de datum van deze dagen zie de ', - ), - TextSpan( - text: 'agenda', - style: TextStyle(color: Colors.blue), - recognizer: TapGestureRecognizer() - ..onTap = () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => CalendarPage()), - ); - }, - ), - ])), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'Op basis van de beoordeling na de selectiedagen wordt uitgenodigd aan het programma deel te nemen. Er is een verplichte informatiedag in april en juni, waarbij ook je ouders aanwezig dienen te zijn.', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'MET WELKE LANDEN?', - style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'De commissie jaaruitwisseling probeert een zo groot mogelijke spreiding in de bestemmingen te realiseren omdat daardoor ook de groep scholieren in Nederland een grote spreiding in nationaliteiten en culturen zal hebben.', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'In de hieronder genoemde landen wordt uitgewisseld met één of meer districten. Van jaar tot jaar kunnen die districten veranderen. De informatie per land is nog niet ingevuld.', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'NOORDELIJK HALFROND', - style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'USA, Canada, India, Indonesie, Japan, Thailand, Taiwan', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'Europa: Frankrijk. Italie, Finland en Zweden, Spanje, Turkije', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 20.0, bottom: 10), - child: Text( - 'Op exchange dicht bij huis, duurzaam reizen en toch een andere cultuur & taal? Geniet van wat Europa jou kan bieden!', - style: TextStyle(fontSize: 14.0), - ), - ), - //video Europa - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: NativeVideo( - url: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/videos/promo/proud_to_be_European.mp4'), - ), - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'ZUIDELIJK HALFROND', - style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'Brazilie, Chili, Argentinie, Mexico, Ecuador, Peru, Mexico, Australie, Nieuw Zeeland, Zuid Afrika', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'AANMELDEN?', - style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'Zie aanmelden (zie menu balk bovenaan deze pagina). Inlichtingen bij de coördinator van het programma Barbara Tusveld ', - ), - TextSpan( - text: 'longtermchair@rotaryyep.nl.', - style: TextStyle(color: Colors.blue), - recognizer: TapGestureRecognizer() - ..onTap = () { - launchUrlString( - 'mailto:longtermchair@rotaryyep.nl'); - }, - ), - ])), - ), + Widget buildSectionTitle(String title) { + return Padding( + padding: const EdgeInsets.only(top: 20.0), + child: Text( + title, + style: TextStyle(fontSize: 17.0, fontWeight: FontWeight.bold), + ), + ); + } - Padding( - padding: const EdgeInsets.only(top: 25.0), - child: Text( - 'KOSTEN?', - style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'De kosten voor de jongere bedragen vanaf € 2.400,-- Exclusief BTW. zakgeld exclusief ticket en andere onkosten.', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Text( - 'Waarom doen we dit?', - style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - '- Het opbouwen van goede relaties met andere landen', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- Het houdt de club jong', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- De jongere ontwikkelt zichzelf en zijn/haar omgeving', - style: TextStyle(fontSize: 14.0), - ), - ), - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 20 juli 2020', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], + Widget buildParagraph(String text) { + return Padding( + padding: const EdgeInsets.only(top: 10.0), + child: Text( + text, + style: TextStyle(fontSize: 14.0), ), ); } - @override - void dispose() { - super.dispose(); + Widget buildBulletPoint(String text) { + return Padding( + padding: const EdgeInsets.only(top: 5.0), + child: Text( + '- $text', + style: TextStyle(fontSize: 14.0), + ), + ); + } + + Widget buildRichText(String text1, String text2, VoidCallback onTap) { + return Padding( + padding: const EdgeInsets.only(top: 10.0), + child: RichText( + text: TextSpan( + style: Theme.of(context).textTheme.bodyMedium!.copyWith(fontSize: 14), + children: [ + TextSpan(text: text1), + TextSpan( + text: text2, + style: TextStyle(color: Colors.blue), + recognizer: TapGestureRecognizer()..onTap = onTap, + ), + ], + ), + ), + ); + } + + Widget buildVideo(String url) { + return Padding( + padding: const EdgeInsets.only(top: 10.0), + child: NativeVideo(url: url), + ); + } + + Widget buildEndSection() { + return Column( + children: [ + Padding( + padding: const EdgeInsets.only(top: 30.0), + child: Center( + child: Image.asset( + 'assets/image/rotary_blue.png', + height: 55.0, + ), + ), + ), + Padding( + padding: const EdgeInsets.only(top: 15.0), + child: Center( + child: Text( + 'Update: 20 juli 2020', + style: TextStyle(color: Color(0xFF777777)), + ), + ), + ), + SizedBox(height: 60), + ], + ); } } diff --git a/lib/features/programs/presentation/pages/information/ngse.dart b/lib/features/programs/presentation/pages/information/ngse.dart index f6fc50f3..4606d8bb 100644 --- a/lib/features/programs/presentation/pages/information/ngse.dart +++ b/lib/features/programs/presentation/pages/information/ngse.dart @@ -30,106 +30,74 @@ class _NGSEProgramPageState extends State { ), ), body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 15), children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: Text( - 'NGSE: deelnemen', - style: TextStyle(fontSize: 17.0, fontWeight: FontWeight.bold), - ), - ), - - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: Text( - 'NGSE behoort tot de vijfde service avenue van Rotary International, net als de Internationale Jeugduitwisselingen, Interact, Rotaract en RYLA.', - style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'NGSE (New Generations Service Exchange) is een relatief nieuw Rotary uitwisselingsprogramma voor jonge volwassenen tussen de 18 en 30 jaar. Het is bedoeld voor jongeren die graag ervaring willen opdoen in het buitenland. Dit kan zijn als onderdeel van hun studie of als (meekijk) stage. Maar ook kan het worden ingezet om werkervaring op te doen buiten Nederland. De nadruk bij NGSE ligt op vocational en service-activiteiten. Deze kunnen ook via de clubactiviteiten van de Rotary Club ter plaatse (hostclub) worden uitgeoefend. Dankzij de NGSE leert de uitgezonden jongere over het leven in een ander land, over andere onderwijssystemen en andere arbeidsculturen. Voor jonge volwassenen vergroot dit hun wereld en hun netwerk. Door ideeën uit te wisselen en geïnspireerd te raken ontwikkelen zij ook hun kijk op de wereld (en op hun eigen zelfbeeld.) Zelfstandigheid, zelfvertrouwen en leiderschap kunnen hierdoor groeien.', - style: TextStyle(fontSize: 14.0), - ), - ), - - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: Text( - 'AANMELDEN - UITZENDEN EN ONTVANGEN DOOR NGSE & ROTARY CLUBS', - style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'Voor deze vorm van uitwisseling is geen wederkerigheid vereist. Een kandidaat kan zich bij een Rotary Club (sponsorclub) in zijn buurt aanmelden of rechtstreeks bij de NGSE-coördinator. De uitzendende Rotary Club mag financieel bijdragen, maar hoeft dat niet te doen. De NGSEcoördinator gaat op zoek naar een passende gastclub (hostclub) in het buitenland. Die hostclub en de kandidaat gaan samen op zoek naar een passend gastgezin of passende woonruimte en indien van toepassing, ook een passende onderwijsinstelling of werkgever. Als tegenprestatie houdt de uitgezonden jongere contact met de hostclub en helpt die club bij serviceprojecten, vocational projecten of andere humanitaire acties. Zo ontstaan soms wel levenslange contacten en vriendschappen. De hostclub kan natuurlijk ook zelf een jongvolwassene uitsturen naar Nederland en rekenen op de gastvrijheid van de sponsorclub van de uitgezonden Nederlandse NGSE-jongere. Maar dit is geen vanzelfsprekende zaak.', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'Iedere Rotary Club kan zichzelf ook aanmelden om als ‘host’ of gastclub te fungeren, ook al is er nog geen aanmelding vanuit het buitenland.', - style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold), - ), - ), + buildSectionTitle('NGSE: deelnemen'), + buildSectionTitle('NGSE: deelnemen', fontSize: 17.0), + buildParagraph( + 'NGSE behoort tot de vijfde service avenue van Rotary International, net als de Internationale Jeugduitwisselingen, Interact, Rotaract en RYLA.'), + buildParagraph( + 'NGSE (New Generations Service Exchange) is een relatief nieuw Rotary uitwisselingsprogramma voor jonge volwassenen tussen de 18 en 30 jaar. Het is bedoeld voor jongeren die graag ervaring willen opdoen in het buitenland. Dit kan zijn als onderdeel van hun studie of als (meekijk) stage. Maar ook kan het worden ingezet om werkervaring op te doen buiten Nederland. De nadruk bij NGSE ligt op vocational en service-activiteiten. Deze kunnen ook via de clubactiviteiten van de Rotary Club ter plaatse (hostclub) worden uitgeoefend. Dankzij de NGSE leert de uitgezonden jongere over het leven in een ander land, over andere onderwijssystemen en andere arbeidsculturen. Voor jonge volwassenen vergroot dit hun wereld en hun netwerk. Door ideeën uit te wisselen en geïnspireerd te raken ontwikkelen zij ook hun kijk op de wereld (en op hun eigen zelfbeeld.) Zelfstandigheid, zelfvertrouwen en leiderschap kunnen hierdoor groeien.'), + buildSectionTitle( + 'AANMELDEN - UITZENDEN EN ONTVANGEN DOOR NGSE & ROTARY CLUBS'), + buildParagraph( + 'Voor deze vorm van uitwisseling is geen wederkerigheid vereist. Een kandidaat kan zich bij een Rotary Club (sponsorclub) in zijn buurt aanmelden of rechtstreeks bij de NGSE-coördinator. De uitzendende Rotary Club mag financieel bijdragen, maar hoeft dat niet te doen. De NGSEcoördinator gaat op zoek naar een passende gastclub (hostclub) in het buitenland. Die hostclub en de kandidaat gaan samen op zoek naar een passend gastgezin of passende woonruimte en indien van toepassing, ook een passende onderwijsinstelling of werkgever. Als tegenprestatie houdt de uitgezonden jongere contact met de hostclub en helpt die club bij serviceprojecten, vocational projecten of andere humanitaire acties. Zo ontstaan soms wel levenslange contacten en vriendschappen. De hostclub kan natuurlijk ook zelf een jongvolwassene uitsturen naar Nederland en rekenen op de gastvrijheid van de sponsorclub van de uitgezonden Nederlandse NGSE-jongere. Maar dit is geen vanzelfsprekende zaak.'), + buildParagraph( + 'Iedere Rotary Club kan zichzelf ook aanmelden om als \'host\' of gastclub te fungeren, ook al is er nog geen aanmelding vanuit het buitenland.'), + buildSectionTitle('DUUR VAN UITWISSELING & KOSTEN'), + buildParagraph( + 'De duur van deze NGSE uitwisseling is variabel, maar bij werkervaringsstages geldt een maximum van drie maanden. Een visumaanvraag is veelal niet nodig of eenvoudig. Langere periodes (tot maximaal 6 maanden) zijn bespreekbaar afhankelijk van het gastland. De studie of stageplek voor de kandidaat moet geregeld zijn vóór de aankomst van de kandidaat in het gastland. Alle kosten zijn voor de kandidaat: reis, visum, inentingen, studie en verzekeringen.'), + buildParagraph( + 'Bij inschrijving betaalt de kandidaat aan NGSE €150,00 ex BTW (€181,50 incl. BTW) inschrijfkosten.'), + buildEndSection(), + ], + ), + ); + } - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: Text( - 'DUUR VAN UITWISSELING & KOSTEN', - style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'De duur van deze NGSE uitwisseling is variabel, maar bij werkervaringsstages geldt een maximum van drie maanden. Een visumaanvraag is veelal niet nodig of eenvoudig. Langere periodes (tot maximaal 6 maanden) zijn bespreekbaar afhankelijk van het gastland. De studie of stageplek voor de kandidaat moet geregeld zijn vóór de aankomst van de kandidaat in het gastland. Alle kosten zijn voor de kandidaat: reis, visum, inentingen, studie en verzekeringen.', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'bij inschrijving betaalt de kandidaat aan NGSE €150,00 ex BTW (€181,50 incl. BTW) inschrijfkosten.', - style: TextStyle(fontSize: 14.0), - ), - ), + Widget buildSectionTitle(String title, {double fontSize = 14.0}) { + return Padding( + padding: const EdgeInsets.only(top: 20.0), + child: Text( + title, + style: TextStyle(fontSize: fontSize, fontWeight: FontWeight.bold), + ), + ); + } - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 20 oktober 2020', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) - ], + Widget buildParagraph(String text) { + return Padding( + padding: const EdgeInsets.only(top: 10.0), + child: Text( + text, + style: TextStyle(fontSize: 14.0), ), ); } + + Widget buildEndSection() { + return Column( + children: [ + Padding( + padding: const EdgeInsets.only(top: 30.0), + child: Center( + child: Image.asset( + 'assets/image/rotary_blue.png', + height: 55.0, + ), + ), + ), + Padding( + padding: const EdgeInsets.only(top: 15.0), + child: Center( + child: Text( + 'Update: 20 oktober 2020', + style: TextStyle(color: Color(0xFF777777)), + ), + ), + ), + SizedBox(height: 60), + ], + ); + } } diff --git a/lib/features/programs/presentation/pages/program_page.dart b/lib/features/programs/presentation/pages/program_page.dart index 2734a553..25419c81 100644 --- a/lib/features/programs/presentation/pages/program_page.dart +++ b/lib/features/programs/presentation/pages/program_page.dart @@ -6,7 +6,6 @@ import 'package:flutter/services.dart'; // 📦 Package imports: import 'package:cached_network_image/cached_network_image.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:rotary_nl_rye/features/programs/presentation/pages/promo/podcast_page.dart'; import 'package:url_launcher/url_launcher_string.dart'; // 🌎 Project imports: @@ -16,14 +15,10 @@ import 'information/camps_tours.dart'; import 'information/family_to_family.dart'; import 'information/long_term_exchange.dart'; import 'information/ngse.dart'; +import 'promo/podcast_page.dart'; import 'promo/video_page.dart'; -class ProgramPage extends StatefulWidget { - @override - _ProgramPageState createState() => _ProgramPageState(); -} - -class _ProgramPageState extends State { +class ProgramPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( @@ -42,235 +37,156 @@ class _ProgramPageState extends State { ), ), body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: true, - scrollDirection: Axis.vertical, + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 15), children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - 'Interesse?', - style: TextStyle( - color: Palette.titleText, - fontSize: 20.0, - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - 'Wil je:', - style: TextStyle( - color: Palette.bodyText, - fontSize: 15.0, - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- Andere culturen leren?', - style: TextStyle(color: Palette.bodyText, fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 2.0), - child: Text( - '- Een andere taal leren,', - style: TextStyle(color: Palette.bodyText, fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 2.0), - child: Text( - '- Vrienden krijgen over de hele wereld', - style: TextStyle(color: Palette.bodyText, fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 2.0), - child: Text( - '- Ambasseur van Nederland zijn voor Rotary', - style: TextStyle(color: Palette.bodyText, fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 6.0), - child: Text( - 'Ben je tussen 15 en 18½ jaar oud op het moment van vertrek. \nSociaal en avontuurlijk, flexibel en klaar om het bekende achter je te laten en nieuwe dingen te ontdekken?', - style: TextStyle(color: Palette.bodyText, fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 6.0), - child: Text( - 'Dan zit je bij ons goed! Met de steun van Rotary kunnen gemiddeld meer dan 40 jongeren deelnemen aan de jaarlijkse uitwisseling en ruim 50 jongeren aan onze zomerkampen en korte uitwisselingen.', - style: TextStyle(color: Palette.bodyText, fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 6.0), - child: Text( - 'Ben je ouder maakt niet uit. Met de New Generation Service Exchange kun je deelnemen tussen de 18 en 30 jaar.', - style: TextStyle(color: Palette.bodyText, fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: - 'Deelname aan ons exchange programma is niet gebonden aan het Rotary clublidmaatschap van een ouder. Jongeren die willen deelnemen aan een uitwisseling kunnen zich opgeven via het emailadres: ', - ), - TextSpan( - text: 'interesse@rotaryyep.nl', - style: TextStyle(color: Colors.blue), - recognizer: TapGestureRecognizer() - ..onTap = () { - launchUrlString('mailto:interesse@rotaryyep.nl'); - }, - ), - TextSpan( - text: - ' Er is wel een selectieprocedure. Van de ouders wordt gevraagd om hun huis op te stellen om jonge buitenlanders voor minimaal 3- maanden in hun gezin op te nemen.', - ), - ])), - ), - SizedBox( - height: 10, - ), - Row( - children: [ - Text( - 'Promo', - style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - ), - ], - ), - Divider( - height: 15, - thickness: 2, - ), - buildProgramOptionRow(context, 'Podcast', 'For everyone', - FontAwesomeIcons.hashtag, PodcastPage()), - buildProgramOptionRow(context, 'Video', 'For everyone', - FontAwesomeIcons.hashtag, VideoPage()), - SizedBox( - height: 20, - ), - Row( - children: [ - Text( - 'Long Term Exchange Program', - style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - ), - ], - ), - Divider( - height: 15, - thickness: 2, - ), + _buildHeader('Interesse?'), + _buildText( + 'Wil je:\n- Andere culturen leren?\n- Een andere taal leren,\n- Vrienden krijgen over de hele wereld\n- Ambasseur van Nederland zijn voor Rotary\n' + '\n' + 'Ben je tussen 15 en 18½ jaar oud op het moment van vertrek. Sociaal en avontuurlijk, flexibel en klaar om het bekende achter je te laten en nieuwe dingen te ontdekken? ' + 'Dan zit je bij ons goed! Met de steun van Rotary kunnen gemiddeld meer dan 40 jongeren deelnemen aan de jaarlijkse uitwisseling en ruim 50 jongeren aan onze zomerkampen en korte uitwisselingen.' + 'Ben je ouder maakt niet uit. Met de New Generation Service Exchange kun je deelnemen tussen de 18 en 30 jaar.'), + _buildRichText(context), + SizedBox(height: 10), + _buildSectionHeader('Promo'), + Divider(height: 15, thickness: 2), + _buildProgramOptionRow(context, 'Podcast', 'For everyone', + FontAwesomeIcons.hashtag, PodcastPage()), + _buildProgramOptionRow(context, 'Video', 'For everyone', + FontAwesomeIcons.hashtag, VideoPage()), + SizedBox(height: 20), + _buildSectionHeader('Long Term Exchange Program'), + Divider(height: 15, thickness: 2), + _buildProgramOptionRow( + context, + 'Long Term Exchange Program', + 'Year Exchange', + FontAwesomeIcons.hashtag, + LongTermExchangeProgramPage()), + SizedBox(height: 10), + _buildSectionHeader('Short Term Exchange Program'), + Divider(height: 15, thickness: 2), + _buildProgramOptionRow( + context, + 'NGSE', + 'New Generations Service Exchange', + FontAwesomeIcons.hashtag, + NGSEProgramPage()), + _buildProgramOptionRow( + context, + 'FAMILY TO FAMILY', + 'Exchange between families', + FontAwesomeIcons.hashtag, + FamilyToFamilyProgramPage()), + _buildProgramOptionRow(context, 'CAMPS & TOURS', 'Summer Camps', + FontAwesomeIcons.hashtag, CampsAndToursProgramPage()), + SizedBox(height: 40), + ], + ), + ); + } - buildProgramOptionRow( - context, - 'Long Term Exchange Program', - 'Year Exchange', - FontAwesomeIcons.hashtag, - LongTermExchangeProgramPage()), - SizedBox( - height: 10, - ), - Row( - children: [ - Text( - 'Short Term Exchange Program', - style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - ), - ], - ), - Divider( - height: 15, - thickness: 2, - ), - buildProgramOptionRow( - context, - 'NGSE', - 'New Generations Service Exchange', - FontAwesomeIcons.hashtag, - NGSEProgramPage()), - buildProgramOptionRow( - context, - 'FAMILY TO FAMILY', - 'Exchange between families', - FontAwesomeIcons.hashtag, - FamilyToFamilyProgramPage()), - buildProgramOptionRow(context, 'CAMPS & TOURS', 'Summer Camps', - FontAwesomeIcons.hashtag, CampsAndToursProgramPage()), + Widget _buildHeader(String text) { + return Padding( + padding: const EdgeInsets.only(top: 5.0), + child: Text( + text, + style: TextStyle( + color: Palette.titleText, + fontSize: 20.0, + fontWeight: FontWeight.bold), + ), + ); + } - // the end - SizedBox( - height: 40, - ), - ], - ) - ], + Widget _buildText(String text) { + return Padding( + padding: const EdgeInsets.only(top: 5.0), + child: Text( + text, + style: TextStyle(color: Palette.bodyText, fontSize: 14.0), ), ); } - Container buildProgramOptionRow( + Widget _buildRichText(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(top: 10.0), + child: RichText( + text: TextSpan( + style: Theme.of(context) + .textTheme + .bodyMedium! + .copyWith(fontSize: 14), + children: [ + TextSpan( + text: + 'Deelname aan ons exchange programma is niet gebonden aan het Rotary clublidmaatschap van een ouder. Jongeren die willen deelnemen aan een uitwisseling kunnen zich opgeven via het emailadres: ', + ), + TextSpan( + text: 'interesse@rotaryyep.nl', + style: TextStyle(color: Colors.blue), + recognizer: TapGestureRecognizer() + ..onTap = () { + launchUrlString('mailto:interesse@rotaryyep.nl'); + }, + ), + TextSpan( + text: + ' Er is wel een selectieprocedure. Van de ouders wordt gevraagd om hun huis op te stellen om jonge buitenlanders voor minimaal 3- maanden in hun gezin op te nemen.', + ), + ])), + ); + } + + Widget _buildSectionHeader(String text) { + return Row( + children: [ + Text( + text, + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + ], + ); + } + + Widget _buildProgramOptionRow( BuildContext context, String title, - subtitle, + String subtitle, IconData icon, - pushTo, + Widget pushTo, ) { return Container( padding: EdgeInsets.all(8.0), child: ListTile( - leading: Padding( - padding: const EdgeInsets.symmetric(horizontal: 0.0), - child: Container( - child: CachedNetworkImage( - height: 50, - width: 50, - imageUrl: - 'https://www.rotary.org/sites/all/themes/rotary_rotaryorg/images/favicons/favicon-194x194.png', - imageBuilder: (context, imageProvider) => Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - image: DecorationImage(image: imageProvider, fit: BoxFit.cover), - ), + leading: CachedNetworkImage( + height: 50, + width: 50, + imageUrl: + 'https://www.rotary.org/sites/all/themes/rotary_rotaryorg/images/favicons/favicon-194x194.png', + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + image: DecorationImage(image: imageProvider, fit: BoxFit.cover), ), - placeholder: (context, url) => - Center(child: CircularProgressIndicator()), - errorWidget: (context, url, error) => Icon(Icons.error), - )), + ), + placeholder: (context, url) => + Center(child: CircularProgressIndicator()), + errorWidget: (context, url, error) => Icon(Icons.error), ), title: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( - child: Container( - constraints: BoxConstraints(maxWidth: Device.width - 150), - child: Text( - title, - maxLines: 2, - overflow: TextOverflow.ellipsis, - style: TextStyle( - inherit: true, - fontWeight: FontWeight.w700, - fontSize: 16.0, - ), + child: Text( + title, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + inherit: true, + fontWeight: FontWeight.w700, + fontSize: 16.0, ), ), ), @@ -282,17 +198,14 @@ class _ProgramPageState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( - child: Container( - constraints: BoxConstraints(maxWidth: Device.width - 150), - child: Text( - subtitle, - maxLines: 2, - overflow: TextOverflow.ellipsis, - style: TextStyle( - inherit: true, - fontSize: 14.0, - color: Palette.descriptionText, - ), + child: Text( + subtitle, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + inherit: true, + fontSize: 14.0, + color: Palette.descriptionText, ), ), ), @@ -300,12 +213,10 @@ class _ProgramPageState extends State { ), ), onTap: () { - if (pushTo != null) { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => pushTo), - ); - } + Navigator.push( + context, + MaterialPageRoute(builder: (context) => pushTo), + ); }, ), ); diff --git a/lib/features/programs/presentation/pages/promo/podcast_page.dart b/lib/features/programs/presentation/pages/promo/podcast_page.dart index d9d2887e..c5d81b27 100644 --- a/lib/features/programs/presentation/pages/promo/podcast_page.dart +++ b/lib/features/programs/presentation/pages/promo/podcast_page.dart @@ -18,20 +18,23 @@ class _PodcastPageState extends State { List podcasts = [ Podcast( - title: 'Episode 1: Rotary Sharon en Michel Teunissen', - duration: '23:04', - audioUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/podcast/rotary-sharon-en-michel-teunissen.mp3'), + title: 'Episode 1: Rotary Sharon en Michel Teunissen', + duration: '23:04', + audioUrl: + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/podcast/rotary-sharon-en-michel-teunissen.mp3', + ), Podcast( - title: 'Episode 2: Rotary Ellen en Steven Stolp', - duration: '26:03', - audioUrl: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/podcast/rotary-ellen-en-steven-stolp.mp3'), + title: 'Episode 2: Rotary Ellen en Steven Stolp', + duration: '26:03', + audioUrl: + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/podcast/rotary-ellen-en-steven-stolp.mp3', + ), ]; @override - initState() { - super.initState(); + void dispose() { + audioPlayer.dispose(); + super.dispose(); } @override @@ -52,9 +55,7 @@ class _PodcastPageState extends State { ), ), body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 15), children: [ Text( 'Podcast - wat zijn de ervaringen van een tweetal gastouders?', @@ -70,64 +71,60 @@ class _PodcastPageState extends State { style: TextStyle(color: Palette.bodyText, fontSize: 14.0), ), ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ListView.builder( - shrinkWrap: true, - physics: NeverScrollableScrollPhysics(), - itemCount: podcasts.length, - itemBuilder: (context, index) { - return ListTile( - leading: IconButton( - icon: currentlyPlayingIndex == index - ? Icon(Icons.pause_circle_filled) - : Icon(Icons.play_circle_fill), - onPressed: () async { - if (currentlyPlayingIndex == index) { - await audioPlayer.pause(); - setState(() { - currentlyPlayingIndex = null; - }); - } else { - await audioPlayer.play( - UrlSource(podcasts[index].audioUrl), - mode: PlayerMode.mediaPlayer); - - setState(() { - currentlyPlayingIndex = index; - }); - } - }, - ), - title: Text(podcasts[index].title), - subtitle: Text(podcasts[index].duration), - trailing: Icon(Icons.more_vert), - onTap: null, - ); - }, - ), - Padding( - padding: const EdgeInsets.only(top: 0), - child: Text( - 'Let op: deze podcasts worden gestreamed dan kan het zijn dat jouw provider je hiervoor kosten in rekening brengt.', - style: TextStyle( - fontStyle: FontStyle.italic, color: Palette.grey), - ), - ), - SizedBox( - height: 60, - ), - ], - ) + _buildPodcastList(), + Padding( + padding: const EdgeInsets.only(top: 10), + child: Text( + 'Let op: deze podcasts worden gestreamed dan kan het zijn dat jouw provider je hiervoor kosten in rekening brengt.', + style: + TextStyle(fontStyle: FontStyle.italic, color: Palette.grey), + ), + ), + SizedBox(height: 60), ], ), ); } - @override - void dispose() { - super.dispose(); + Widget _buildPodcastList() { + return ListView.builder( + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: podcasts.length, + itemBuilder: (context, index) { + return ListTile( + leading: IconButton( + icon: Icon( + currentlyPlayingIndex == index + ? Icons.pause_circle_filled + : Icons.play_circle_fill, + ), + onPressed: () => _onPlayPauseButtonPressed(index), + ), + title: Text(podcasts[index].title), + subtitle: Text(podcasts[index].duration), + trailing: Icon(Icons.more_vert), + onTap: null, + ); + }, + ); + } + + Future _onPlayPauseButtonPressed(int index) async { + if (currentlyPlayingIndex == index) { + await audioPlayer.pause(); + setState(() { + currentlyPlayingIndex = null; + }); + } else { + await audioPlayer.play( + UrlSource(podcasts[index].audioUrl), + mode: PlayerMode.mediaPlayer, + ); + setState(() { + currentlyPlayingIndex = index; + }); + } } } @@ -136,6 +133,9 @@ class Podcast { final String duration; final String audioUrl; - Podcast( - {required this.title, required this.duration, required this.audioUrl}); + Podcast({ + required this.title, + required this.duration, + required this.audioUrl, + }); } diff --git a/lib/features/programs/presentation/pages/promo/video_page.dart b/lib/features/programs/presentation/pages/promo/video_page.dart index b2114177..8bb512be 100644 --- a/lib/features/programs/presentation/pages/promo/video_page.dart +++ b/lib/features/programs/presentation/pages/promo/video_page.dart @@ -13,11 +13,6 @@ class VideoPage extends StatefulWidget { } class _VideoPageState extends State { - @override - initState() { - super.initState(); - } - @override Widget build(BuildContext context) { return Scaffold( @@ -36,106 +31,49 @@ class _VideoPageState extends State { ), ), body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - shrinkWrap: false, - scrollDirection: Axis.vertical, + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 15), children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Padding( - // padding: const EdgeInsets.only(top: 20.0), - // child: Text( - // "moet nog text komen", - // style: TextStyle( - // color: Colors.red, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - // Padding( - // padding: const EdgeInsets.only(top: 10.0), - // child: Text( - // "moet nog text voor worden gemaakt", - // style: TextStyle(color: Colors.black, fontSize: 14.0), - // ), - // ), - // Padding( - // padding: const EdgeInsets.only(top: 25.0), - // child: Text( - // "Algemene video", - // style: TextStyle( - // color: Colors.red, - // fontSize: 14.0, - // fontWeight: FontWeight.bold), - // ), - // ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: NativeVideo( - url: - 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/videos/promo/5th-avenue-jeugd.mp4'), - ), - - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Text( - 'Waarom doen we dit?', - style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - '- Het opbouwen van goede relaties met andere landen', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- Het houdt de club jong', - style: TextStyle(fontSize: 14.0), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - '- De jongere ontwikkelt zichzelf en zijn/haar omgeving', - style: TextStyle(fontSize: 14.0), - ), - ), - // the end dont touch XD - Padding( - padding: const EdgeInsets.only(top: 30.0), - child: Center( - child: Image.asset( - 'assets/image/rotary_blue.png', - height: 55.0, - ), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Center( - child: Text( - 'Update: 27 mei 2021', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - ), - SizedBox( - height: 60, - ), - ], - ) + NativeVideo( + url: + 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/videos/promo/5th-avenue-jeugd.mp4', + ), + SizedBox(height: 30), + Text( + 'Waarom doen we dit?', + style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold), + ), + SizedBox(height: 10), + buildInfoText('- Het opbouwen van goede relaties met andere landen'), + buildInfoText('- Het houdt de club jong'), + buildInfoText( + '- De jongere ontwikkelt zichzelf en zijn/haar omgeving'), + SizedBox(height: 30), + Center( + child: Image.asset( + 'assets/image/rotary_blue.png', + height: 55.0, + ), + ), + SizedBox(height: 15), + Center( + child: Text( + 'Update: 27 mei 2021', + style: TextStyle(color: Color(0xFF777777)), + ), + ), + SizedBox(height: 60), ], ), ); } - @override - void dispose() { - super.dispose(); + Widget buildInfoText(String text) { + return Padding( + padding: const EdgeInsets.only(top: 5.0), + child: Text( + text, + style: TextStyle(fontSize: 14.0), + ), + ); } } diff --git a/lib/features/stories/models/country.dart b/lib/features/rebounds/models/country.dart similarity index 92% rename from lib/features/stories/models/country.dart rename to lib/features/rebounds/models/country.dart index f372dc65..cbb0b6aa 100644 --- a/lib/features/stories/models/country.dart +++ b/lib/features/rebounds/models/country.dart @@ -1,10 +1,10 @@ -// 🌎 Project imports: import 'package:rotary_nl_rye/core/presentation/models/image_list_tile_item.dart'; class Country extends ImageListTileItem { final String name; final String imageUrl; final String description; + Country( {required this.name, required this.imageUrl, required this.description}); } diff --git a/lib/features/rebounds/presentation/pages/CountriesPage.dart b/lib/features/rebounds/presentation/pages/CountriesPage.dart new file mode 100644 index 00000000..0eb08565 --- /dev/null +++ b/lib/features/rebounds/presentation/pages/CountriesPage.dart @@ -0,0 +1,141 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:rotary_nl_rye/core/domain/StudentsBloc.dart'; +import 'package:rotary_nl_rye/core/domain/entities/exchange_student.dart'; +import 'package:rotary_nl_rye/core/prop.dart'; +import 'package:rotary_nl_rye/features/rebounds/models/country.dart'; +import 'package:rotary_nl_rye/features/rebounds/presentation/pages/ExchangeStudentsList.dart'; +import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; +import 'package:rotary_nl_rye/features/widgets/list_tiles.dart'; + +class CountriesPage extends StatefulWidget { + @override + _CountriesPageState createState() => _CountriesPageState(); +} + +class _CountriesPageState extends State { + final studentBloc = StudentsBloc(); + + @override + void initState() { + super.initState(); + studentBloc.getExchangeStudentList(); + } + + @override + void dispose() { + studentBloc.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + systemOverlayStyle: + MediaQuery.of(context).platformBrightness == Brightness.light + ? SystemUiOverlayStyle.dark + : SystemUiOverlayStyle.light, + backgroundColor: Colors.transparent, + elevation: 0.0, + leading: UniformBackButton(), + title: Text( + 'Countries', + style: TextStyle( + color: Palette.indigo, fontWeight: FontWeight.bold, fontSize: 20), + ), + ), + body: StreamBuilder>( + stream: studentBloc.studentList, + builder: (context, snapshot) { + if (snapshot.hasError) { + return Center(child: Text(snapshot.error.toString())); + } else if (!snapshot.hasData) { + return Center(child: CircularProgressIndicator()); + } else { + final sortedCountries = countries + ..sort((a, b) => a.name.compareTo(b.name)); + return ListView.builder( + padding: EdgeInsets.symmetric(horizontal: 20), + itemCount: sortedCountries.length, + itemBuilder: (context, index) { + final country = sortedCountries[index]; + final students = snapshot.data! + .where((student) => student.to == country.name) + .toList(); + return CountryListTile( + country: country, + descriptionPage: ExchangeStudentsList( + country: country, students: students), + ); + }, + ); + } + }, + ), + ); + } +} + +final List countries = [ + Country( + name: 'Argentina', + imageUrl: 'assets/icons/flags/ar.svg', + description: ''), + Country( + name: 'Australia', + imageUrl: 'assets/icons/flags/au.svg', + description: ''), + Country( + name: 'Brazil', imageUrl: 'assets/icons/flags/br.svg', description: ''), + Country( + name: 'Canada', imageUrl: 'assets/icons/flags/ca.svg', description: ''), + Country( + name: 'Chili', imageUrl: 'assets/icons/flags/cl.svg', description: ''), + Country( + name: 'Colombia', imageUrl: 'assets/icons/flags/co.svg', description: ''), + Country( + name: 'Ecuador', imageUrl: 'assets/icons/flags/ec.svg', description: ''), + Country( + name: 'Finland', imageUrl: 'assets/icons/flags/fi.svg', description: ''), + Country( + name: 'India', imageUrl: 'assets/icons/flags/in.svg', description: ''), + Country( + name: 'Indonesia', + imageUrl: 'assets/icons/flags/id.svg', + description: ''), + Country( + name: 'Italy', imageUrl: 'assets/icons/flags/it.svg', description: ''), + Country( + name: 'Japan', imageUrl: 'assets/icons/flags/jp.svg', description: ''), + Country( + name: 'Mexico', imageUrl: 'assets/icons/flags/mx.svg', description: ''), + Country( + name: 'New Zealand', + imageUrl: 'assets/icons/flags/nz.svg', + description: ''), + Country(name: 'Peru', imageUrl: 'assets/icons/flags/pe.svg', description: ''), + Country( + name: 'South Africa', + imageUrl: 'assets/icons/flags/za.svg', + description: ''), + Country( + name: 'South Korea', + imageUrl: 'assets/icons/flags/kr.svg', + description: ''), + Country( + name: 'Taiwan', imageUrl: 'assets/icons/flags/tw.svg', description: ''), + Country( + name: 'Thailand', imageUrl: 'assets/icons/flags/th.svg', description: ''), + Country(name: 'USA', imageUrl: 'assets/icons/flags/us.svg', description: ''), + Country( + name: 'Spain', imageUrl: 'assets/icons/flags/es.svg', description: ''), + Country( + name: 'Europa', imageUrl: 'assets/icons/flags/eu.svg', description: ''), + Country( + name: 'Switzerland', + imageUrl: 'assets/icons/flags/ch.svg', + description: ''), + Country( + name: 'France', imageUrl: 'assets/icons/flags/fr.svg', description: ''), +]; diff --git a/lib/features/rebounds/presentation/pages/ExchangeStudentsDetails.dart b/lib/features/rebounds/presentation/pages/ExchangeStudentsDetails.dart new file mode 100644 index 00000000..bb163256 --- /dev/null +++ b/lib/features/rebounds/presentation/pages/ExchangeStudentsDetails.dart @@ -0,0 +1,125 @@ +// 🐦 Flutter imports: +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; + +// 🌎 Project imports: +import 'package:rotary_nl_rye/core/domain/entities/exchange_student.dart'; +import 'package:rotary_nl_rye/core/presentation/widgets/full_screen_image.dart'; +import 'package:rotary_nl_rye/core/presentation/widgets/native_video.dart'; +import 'package:rotary_nl_rye/core/prop.dart'; +import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; + +class StoriesDisplay extends StatelessWidget { + final ExchangeStudent student; + + StoriesDisplay({required this.student}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + systemOverlayStyle: + MediaQuery.of(context).platformBrightness == Brightness.light + ? SystemUiOverlayStyle.dark + : SystemUiOverlayStyle.light, + backgroundColor: Colors.transparent, + elevation: 0.0, + leading: UniformBackButton(), + title: Text( + 'Rebounds', + style: TextStyle( + color: Palette.indigo, fontWeight: FontWeight.bold, fontSize: 20), + ), + ), + body: ListView( + padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 30), + children: [ + _buildStudentHeader(context), + const SizedBox(height: 20), + _buildSectionTitle('About me'), + const Divider(height: 15, thickness: 2), + const SizedBox(height: 5), + Text(student.bio, style: TextStyle(fontSize: 16.0)), + if (student.video != null) ...[ + const SizedBox(height: 40), + _buildSectionTitle('Dutchie'), + const SizedBox(height: 10), + NativeVideo(url: student.video!), + ], + const SizedBox(height: 40), + ], + ), + ); + } + + Widget _buildStudentHeader(BuildContext context) { + return Row( + children: [ + InkWell( + borderRadius: BorderRadius.circular(60), + onTap: () { + Navigator.of(context).push(PageRouteBuilder( + opaque: false, + pageBuilder: (BuildContext context, _, __) => + FullScreenImage(url: student.imageUrl), + )); + }, + child: CachedNetworkImage( + height: 60, + width: 60, + imageUrl: student.imageUrl, + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + shape: BoxShape.circle, + image: DecorationImage(image: imageProvider, fit: BoxFit.cover), + ), + ), + placeholder: (context, url) => CircularProgressIndicator(), + errorWidget: (context, url, error) => Icon(Icons.error), + ), + ), + const SizedBox(width: 12), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + student.name, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle(fontSize: 22.0, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 4), + Row( + children: [ + Text(student.from, + style: TextStyle(fontSize: 14.0, color: Colors.grey[600])), + const SizedBox(width: 2), + SvgPicture.asset('assets/icons/flags/${student.fromFlag}.svg', + height: 15), + const SizedBox(width: 5), + FaIcon(FontAwesomeIcons.arrowRightLong, color: Colors.grey), + const SizedBox(width: 5), + Text(student.to, + style: TextStyle(fontSize: 14.0, color: Colors.grey[600])), + const SizedBox(width: 2), + SvgPicture.asset('assets/icons/flags/${student.toFlag}.svg', + height: 15), + ], + ), + ], + ), + ], + ); + } + + Widget _buildSectionTitle(String title) { + return Text( + title, + style: TextStyle( + color: Colors.grey[600], fontSize: 18.0, fontWeight: FontWeight.bold), + ); + } +} diff --git a/lib/features/stories/presentation/pages/exchange_students_List.dart b/lib/features/rebounds/presentation/pages/ExchangeStudentsList.dart similarity index 63% rename from lib/features/stories/presentation/pages/exchange_students_List.dart rename to lib/features/rebounds/presentation/pages/ExchangeStudentsList.dart index 010045e3..23e84c20 100644 --- a/lib/features/stories/presentation/pages/exchange_students_List.dart +++ b/lib/features/rebounds/presentation/pages/ExchangeStudentsList.dart @@ -1,23 +1,18 @@ -// 🐦 Flutter imports: import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; - -// 📦 Package imports: -import 'package:flutter_svg/svg.dart'; - -// 🌎 Project imports: +import 'package:flutter_svg/flutter_svg.dart'; import 'package:rotary_nl_rye/core/domain/entities/exchange_student.dart'; -import 'package:rotary_nl_rye/core/presentation/widgets/image_list_tile.dart'; import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/stories/models/country.dart'; -import 'package:rotary_nl_rye/features/stories/presentation/pages/student_details.dart'; +import 'package:rotary_nl_rye/features/rebounds/models/country.dart'; +import 'package:rotary_nl_rye/features/rebounds/presentation/pages/ExchangeStudentsDetails.dart'; import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; +import 'package:rotary_nl_rye/features/widgets/list_tiles.dart'; -class ExchangeStudentsPage extends StatelessWidget { +class ExchangeStudentsList extends StatelessWidget { final Country country; final List students; - ExchangeStudentsPage({required this.country, required this.students}) { + ExchangeStudentsList({required this.country, required this.students}) { students.sort((a, b) { final yearRegExp = RegExp(r'\b\d{4}-\d{4}\b'); final aYear = yearRegExp.firstMatch(a.description)?.group(0) ?? ''; @@ -39,16 +34,15 @@ class ExchangeStudentsPage extends StatelessWidget { leading: UniformBackButton(), title: Text( country.name, - textScaler: TextScaler.linear(1.5), style: TextStyle( color: Palette.indigo, fontWeight: FontWeight.bold, - fontSize: 15, + fontSize: 20, ), ), - actions: [ + actions: [ Padding( - padding: EdgeInsets.only(right: 16.0), + padding: const EdgeInsets.only(right: 16.0), child: SvgPicture.asset( country.imageUrl, height: 30, @@ -58,12 +52,13 @@ class ExchangeStudentsPage extends StatelessWidget { ], ), body: ListView.builder( - shrinkWrap: false, - itemBuilder: (context, index) => ReboundsStudentsListTile( - item: students[index], - reboundsStudentsListPage: StoriesDisplay(student: students[index]), - ), itemCount: students.length, + itemBuilder: (context, index) { + return ReboundsStudentsListTile( + item: students[index], + reboundsStudentsListPage: StoriesDisplay(student: students[index]), + ); + }, ), ); } diff --git a/lib/features/settings/presentation/pages/SettingsPage.dart b/lib/features/settings/presentation/pages/SettingsPage.dart new file mode 100644 index 00000000..9ee6a9eb --- /dev/null +++ b/lib/features/settings/presentation/pages/SettingsPage.dart @@ -0,0 +1,274 @@ +// 🐦 Flutter imports: +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +// 📦 Package imports: +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:package_info_plus/package_info_plus.dart'; +import 'package:share_plus/share_plus.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + +// 🌎 Project imports: +import 'package:rotary_nl_rye/core/lang/languages.dart'; +import 'package:rotary_nl_rye/core/presentation/widgets/photo_gallery/gallery_view.dart'; +import 'package:rotary_nl_rye/core/prop.dart'; +import 'package:rotary_nl_rye/features/settings/presentation/pages/contributors_page.dart'; +import 'package:rotary_nl_rye/features/settings/presentation/pages/SocialPage.dart'; + +class SettingsPage extends StatefulWidget { + @override + _SettingsPageState createState() => _SettingsPageState(); +} + +class _SettingsPageState extends State { + bool isSwitchedFT = false; + + PackageInfo _packageInfo = PackageInfo( + appName: 'Unknown', + packageName: 'Unknown', + version: 'Unknown', + buildNumber: 'Unknown', + buildSignature: 'Unknown', + ); + + @override + void initState() { + super.initState(); + _initPackageInfo(); + _loadSwitchValue(); + } + + Future _initPackageInfo() async { + final info = await PackageInfo.fromPlatform(); + setState(() { + _packageInfo = info; + }); + } + + Future _loadSwitchValue() async { + final prefs = await SharedPreferences.getInstance(); + setState(() { + isSwitchedFT = prefs.getBool('autoInitializeState') ?? false; + }); + } + + Future _saveSwitchState(bool value) async { + final prefs = await SharedPreferences.getInstance(); + await prefs.setBool('autoInitializeState', value); + setState(() { + isSwitchedFT = value; + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + backgroundColor: Colors.transparent, + toolbarHeight: 80, + systemOverlayStyle: + MediaQuery.of(context).platformBrightness == Brightness.light + ? SystemUiOverlayStyle.dark + : SystemUiOverlayStyle.light, + elevation: 0.0, + title: Text( + DemoLocalizations.of(context)!.trans('settingsTitle'), + style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), + ), + actions: [ + IconButton( + icon: Icon( + CupertinoIcons.share, + color: Palette.indigo, + ), + onPressed: () { + Share.share( + Platform.isIOS + ? 'https://apps.apple.com/app/rotary-youth-exchange-nl/id1567096118' + : 'https://play.google.com/store/apps/details?id=com.caelitechnologies.rotary_nl_rye', + subject: 'Look at this nice app :)', + ); + }, + ) + ], + ), + body: ListView( + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 15), + children: [ + _buildSectionTitle(context, 'account'), + SizedBox(height: 10), + _buildSettingsContainer([ + _buildAccountOptionRow(context, 'Pictures', FontAwesomeIcons.images, + GalleryViewPage()), + _buildAccountOptionRow( + context, + DemoLocalizations.of(context)!.trans('social'), + FontAwesomeIcons.hashtag, + SocialPage()), + _buildSwitchOptionRow( + context, + 'Auto load videos', + FontAwesomeIcons.wifi, + Platform.isIOS + ? CupertinoSwitch( + activeColor: Palette.accentColor, + value: isSwitchedFT, + onChanged: _saveSwitchState, + ) + : Switch( + activeColor: Palette.accentColor, + value: isSwitchedFT, + onChanged: _saveSwitchState, + )), + ]), + SizedBox(height: 30), + _buildSectionTitle(context, 'Development'), + SizedBox(height: 10), + _buildSettingsContainer([ + ListTile( + leading: FaIcon(FontAwesomeIcons.code, color: Palette.indigo), + title: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Contributors', + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.w500, + color: Palette.grey), + ), + Icon(Icons.arrow_forward_ios, color: Palette.grey), + ], + ), + onTap: () => Navigator.push(context, + MaterialPageRoute(builder: (context) => ContributorsPage())), + ), + ]), + SizedBox(height: 20), + _buildFooter(context), + Center( + child: Text( + 'App version: ${_packageInfo.version} (${_packageInfo.buildNumber})', + style: TextStyle(color: Color(0xFF777777)), + ), + ), + SizedBox(height: 20), + ], + ), + ); + } + + Padding _buildSectionTitle(BuildContext context, String key) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Text( + DemoLocalizations.of(context)!.trans(key), + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + ); + } + + Container _buildSettingsContainer(List children) { + return Container( + decoration: BoxDecoration( + color: kSecondaryBgColor, + borderRadius: BorderRadius.circular(kBorderRadius), + boxShadow: [kBoxShadow], + ), + child: Column(children: children), + ); + } + + Container _buildSwitchOptionRow( + BuildContext context, String title, IconData icon, Widget switchWidget) { + return Container( + padding: EdgeInsets.zero, + child: ListTile( + leading: Padding( + padding: const EdgeInsets.symmetric(horizontal: 0.0), + child: FaIcon(icon, color: Palette.indigo), + ), + title: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + title, + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.w500, + color: Palette.grey), + ), + switchWidget, + ], + ), + ), + ); + } + + GestureDetector _buildAccountOptionRow( + BuildContext context, String title, IconData icon, Widget pushTo) { + return GestureDetector( + child: Container( + padding: EdgeInsets.zero, + child: ListTile( + leading: FaIcon(icon, color: Palette.indigo), + title: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + title, + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.w500, + color: Palette.grey), + ), + Icon(Icons.arrow_forward_ios, color: Palette.grey), + ], + ), + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => pushTo), + ); + }, + ), + ), + ); + } + + Padding _buildFooter(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(top: 10.0, bottom: 20), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _buildFooterLink(context, 'Privacy Policy', + 'https://www.rotary.nl/yep/yep-app/privacy-policy.html'), + _buildFooterLink(context, 'Terms & Conditions', + 'https://www.rotary.nl/yep/yep-app/terms-and-conditions.html'), + ], + ), + ); + } + + RichText _buildFooterLink(BuildContext context, String text, String url) { + return RichText( + text: TextSpan( + style: Theme.of(context).textTheme.bodyMedium!.copyWith(fontSize: 14), + children: [ + TextSpan( + text: text, + style: TextStyle(color: Colors.blue), + recognizer: TapGestureRecognizer() + ..onTap = () => launchUrlString(url), + ), + ], + ), + ); + } +} diff --git a/lib/features/settings/presentation/pages/SocialPage.dart b/lib/features/settings/presentation/pages/SocialPage.dart new file mode 100644 index 00000000..7c257f33 --- /dev/null +++ b/lib/features/settings/presentation/pages/SocialPage.dart @@ -0,0 +1,124 @@ +// 🐦 Flutter imports: +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +// 📦 Package imports: +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + +// 🌎 Project imports: +import 'package:rotary_nl_rye/core/prop.dart'; +import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; + +class SocialPage extends StatelessWidget { + final int? id; + + const SocialPage({Key? key, this.id}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + systemOverlayStyle: + MediaQuery.of(context).platformBrightness == Brightness.light + ? SystemUiOverlayStyle.dark + : SystemUiOverlayStyle.light, + backgroundColor: Colors.transparent, + elevation: 0.0, + leading: const UniformBackButton(), + title: Text( + 'Socials', + style: TextStyle( + color: Palette.indigo, + fontWeight: FontWeight.bold, + fontSize: 18, + ), + ), + ), + body: ListView( + padding: const EdgeInsets.symmetric(vertical: 8.0), + children: [ + buildLinkOptionRow( + context, + 'www.rotary.nl', + Palette.socialBlue, + 'https://www.rotary.org/sites/all/themes/rotary_rotaryorg/images/favicons/favicon-194x194.png', + 'http://www.rotary.nl/', + ), + const Divider(height: 15, thickness: 2), + buildLinkOptionRow( + context, + 'www.rotaryyep.nl', + Palette.grey, + 'https://www.rotary.org/sites/all/themes/rotary_rotaryorg/images/favicons/favicon-194x194.png', + 'http://www.rotaryyep.nl/', + ), + const Divider(height: 15, thickness: 2), + ], + ), + ); + } + + Widget buildLinkOptionRow( + BuildContext context, + String title, + Color colour, + String imageUrl, + String linkUrl, + ) { + return GestureDetector( + onTap: () async { + if (await canLaunchUrlString(linkUrl)) { + await launchUrlString(linkUrl); + } else { + throw 'Could not launch $linkUrl'; + } + }, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: ListTile( + leading: CachedNetworkImage( + height: 55, + width: 55, + imageUrl: imageUrl, + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), + ), + ), + placeholder: (context, url) => + const Center(child: CircularProgressIndicator()), + errorWidget: (context, url, error) => const Icon(Icons.error), + ), + title: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Text( + title, + maxLines: 3, + overflow: TextOverflow.ellipsis, + softWrap: false, + style: TextStyle( + fontSize: 18.0, + fontWeight: FontWeight.w500, + color: colour, + ), + ), + ), + Icon( + Icons.arrow_forward_ios, + size: 15, + color: Palette.grey, + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/features/settings/presentation/pages/contributors_page.dart b/lib/features/settings/presentation/pages/contributors_page.dart index 68d11f5c..2441439b 100644 --- a/lib/features/settings/presentation/pages/contributors_page.dart +++ b/lib/features/settings/presentation/pages/contributors_page.dart @@ -4,10 +4,10 @@ import 'package:flutter/services.dart'; // 🌎 Project imports: import 'package:rotary_nl_rye/core/presentation/pages/contributors_details_page.dart'; -import 'package:rotary_nl_rye/core/presentation/widgets/image_list_tile.dart'; import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/settings/presentation/pages/models/contributor.dart'; import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; +import 'package:rotary_nl_rye/features/settings/presentation/pages/models/contributor.dart'; +import 'package:rotary_nl_rye/features/widgets/list_tiles.dart'; class ContributorsPage extends StatefulWidget { @override @@ -17,40 +17,37 @@ class ContributorsPage extends StatefulWidget { class _ContributorsPageState extends State { @override Widget build(BuildContext context) { - { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: SystemUiOverlayStyle( - statusBarBrightness: MediaQuery.of(context).platformBrightness, - ), - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Contributors', - textScaler: TextScaler.linear(1.4), - style: - TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), + return Scaffold( + appBar: AppBar( + systemOverlayStyle: + MediaQuery.of(context).platformBrightness == Brightness.light + ? SystemUiOverlayStyle.dark + : SystemUiOverlayStyle.light, + backgroundColor: Colors.transparent, + elevation: 0.0, + leading: UniformBackButton(), + title: Text( + 'Contributors', + style: TextStyle( + color: Palette.indigo, fontWeight: FontWeight.bold, fontSize: 20), ), - body: Container( - // height: Device.height - 277, - margin: EdgeInsets.only(left: 20, right: 20), - child: ListView.builder( - shrinkWrap: true, - itemBuilder: (context, index) => ContributorsListTile( - item: contributors[index], - contributorsDetailsPage: - ContributorsDetails(person: contributors[index])), - itemCount: contributors.length, + ), + body: Container( + margin: EdgeInsets.symmetric(horizontal: 20), + child: ListView.builder( + itemBuilder: (context, index) => ContributorsListTile( + item: contributors[index], + contributorsDetailsPage: + ContributorsDetails(person: contributors[index]), ), + itemCount: contributors.length, ), - ); - } + ), + ); } } -List contributors = [ +final List contributors = [ Contributor( name: 'Ruben Talstra', description: 'Flutter Dev', @@ -110,5 +107,5 @@ List contributors = [ linkedinUrl: '', email: 'frostedfox@example.com', phoneNumber: '888 444 7676', - ) + ), ]; diff --git a/lib/features/settings/presentation/pages/settings_page.dart b/lib/features/settings/presentation/pages/settings_page.dart deleted file mode 100644 index 8435dd29..00000000 --- a/lib/features/settings/presentation/pages/settings_page.dart +++ /dev/null @@ -1,429 +0,0 @@ -// 🎯 Dart imports: -import 'dart:io'; - -// 🐦 Flutter imports: -import 'package:flutter/cupertino.dart'; -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 📦 Package imports: -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:package_info_plus/package_info_plus.dart'; -import 'package:share_plus/share_plus.dart'; -import 'package:shared_preferences/shared_preferences.dart'; -import 'package:url_launcher/url_launcher_string.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/lang/languages.dart'; -import 'package:rotary_nl_rye/core/presentation/widgets/photo_gallery/gallery_view.dart'; -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/settings/presentation/pages/contributors_page.dart'; -import 'package:rotary_nl_rye/features/settings/presentation/pages/social.dart'; - -class SettingsPage extends StatefulWidget { - @override - _SettingsPageState createState() => _SettingsPageState(); -} - -class _SettingsPageState extends State { - bool isSwitchedFT = false; - - PackageInfo _packageInfo = PackageInfo( - appName: 'Unknown', - packageName: 'Unknown', - version: 'Unknown', - buildNumber: 'Unknown', - buildSignature: 'Unknown', - ); - - @override - initState() { - super.initState(); - _initPackageInfo(); - getSwitchValues(); - } - - Future _initPackageInfo() async { - final info = await PackageInfo.fromPlatform(); - setState(() { - _packageInfo = info; - }); - } - - getSwitchValues() async { - isSwitchedFT = (await getSwitchState())!; - setState(() {}); - } - - Future saveSwitchState(bool value) async { - SharedPreferences prefs = await SharedPreferences.getInstance(); - prefs.setBool('autoInitializeState', value); - print('Switch Value saved $value'); - return prefs.setBool('autoInitializeState', value); - } - - Future getSwitchState() async { - SharedPreferences prefs = await SharedPreferences.getInstance(); - bool isSwitchedFT = prefs.getBool('autoInitializeState') ?? false; - print(isSwitchedFT); - - return isSwitchedFT; - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - backgroundColor: Colors.transparent, - toolbarHeight: 80, - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - elevation: 0.0, - centerTitle: false, - title: Text( - DemoLocalizations.of(context)!.trans('settingsTitle'), - textScaler: TextScaler.linear(1.7), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - actions: [ - IconButton( - icon: Icon( - CupertinoIcons.share, - color: Palette.indigo, - ), - onPressed: () { - Share.share( - Platform.isIOS - ? 'https://apps.apple.com/app/rotary-youth-exchange-nl/id1567096118' - : 'https://play.google.com/store/apps/details?id=com.caelitechnologies.rotary_nl_rye', - subject: 'look at this nice app :)'); - }, - ) - ], - ), - body: ListView( - padding: EdgeInsets.only(left: 16, top: 15, right: 16), - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: Text( - DemoLocalizations.of(context)!.trans('account'), - style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - ), - ), - SizedBox( - height: 10, - ), - Container( - decoration: BoxDecoration( - color: kSecondaryBgColor, - borderRadius: BorderRadius.circular(kBorderRadius), - boxShadow: [kBoxShadow]), - child: Column( - children: [ - //TODO maybe add later a "Auto load video's on cellular" Switch - buildAccountOptionRow(context, 'Pictures', - FontAwesomeIcons.images, GalleryViewPage()), - // buildAccountOptionRow( - // context, - // 'Bestuur / Team RYE', - // FontAwesomeIcons.users, - // PDFPageWithShare( - // pdfUrl: - // 'https://www.rotary.nl/yep/yep-app/tu4w6b3-6436ie5-63h0jf-9i639i4-t3mf67-uhdrs/pdf/r.i.-multidistrict-youth-exchange-program-the-netherlands-2021-2022.pdf', - // ), - // ), - buildAccountOptionRow( - context, - DemoLocalizations.of(context)!.trans('social'), - FontAwesomeIcons.hashtag, - SocialPage()), - buildNotificationOptionRow( - "Auto load video's", - FontAwesomeIcons.wifi, - Platform.isIOS - ? CupertinoSwitch( - activeColor: Palette.accentColor, - value: isSwitchedFT, - onChanged: (bool value) { - setState(() { - isSwitchedFT = value; - saveSwitchState(value); - print('Saved state is $isSwitchedFT'); - }); - print(isSwitchedFT); - }, - ) - : Switch( - activeColor: Palette.accentColor, - value: isSwitchedFT, - onChanged: (bool value) { - setState(() { - isSwitchedFT = value; - saveSwitchState(value); - print('Saved state is $isSwitchedFT'); - }); - print(isSwitchedFT); - }, - )), - - // buildNotificationOptionRow( - // DemoLocalizations.of(context).trans('new4You'), - // Platform.isIOS - // ? CupertinoSwitch( - // activeColor: Palette.accentColor, - // value: slider1, - // onChanged: (value) { - // setState(() { - // slider1 = value; - // }); - // }, - // ) - // : Switch( - // activeColor: Palette.accentColor, - // value: slider1, - // onChanged: (value) { - // setState(() { - // slider1 = value; - // }); - // }, - // )), - ], - ), - ), - SizedBox( - height: 30, - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: Text( - 'Development', - style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - ), - ), - SizedBox( - height: 10, - ), - Container( - decoration: BoxDecoration( - color: kSecondaryBgColor, - borderRadius: BorderRadius.circular(kBorderRadius), - boxShadow: [kBoxShadow]), - child: ListTile( - leading: Padding( - padding: const EdgeInsets.symmetric(horizontal: 0.0), - child: Container( - child: FaIcon( - FontAwesomeIcons.code, - color: Palette.indigo, - ), - ), - ), - title: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - 'Contributors', - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.w500, - color: Palette.grey, - ), - ), - Icon( - Icons.arrow_forward_ios, - color: Palette.grey, - ), - ], - ), - onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => ContributorsPage()), - ); - }, - ), - ), - SizedBox( - height: 20, - ), - Padding( - padding: const EdgeInsets.only(top: 10.0, bottom: 20), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: 'Privacy Policy', - style: TextStyle(color: Colors.blue), - recognizer: TapGestureRecognizer() - ..onTap = () { - launchUrlString( - 'https://www.rotary.nl/yep/yep-app/privacy-policy.html', - ); - }, - ), - ])), - RichText( - text: TextSpan( - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(fontSize: 14), - children: [ - TextSpan( - text: 'Terms & Conditions', - style: TextStyle(color: Colors.blue), - recognizer: TapGestureRecognizer() - ..onTap = () { - launchUrlString( - 'https://www.rotary.nl/yep/yep-app/terms-and-conditions.html', - ); - }, - ), - ])), - ], - ), - ), - Center( - child: Text( - 'App version: ${_packageInfo.version} (${_packageInfo.buildNumber})', - style: TextStyle(color: Color(0xFF777777)), - ), - ), - SizedBox( - height: 20, - ), - ], - ), - ); - } - - Container buildNotificationOptionRow( - String title, - IconData icon, - Widget aSwitch, - ) { - return Container( - padding: EdgeInsets.zero, - child: ListTile( - leading: Padding( - padding: const EdgeInsets.symmetric(horizontal: 0.0), - child: Container( - child: FaIcon( - icon, - color: Palette.indigo, - ), - ), - ), - title: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - title, - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.w500, - color: Palette.grey, - ), - ), - Transform.scale(scale: 1, child: aSwitch) - ], - ), - ), - ); - } - - GestureDetector buildAccountOptionRow( - BuildContext context, - String title, - IconData icon, - pushTo, - ) { - return GestureDetector( - child: Container( - padding: EdgeInsets.zero, - // color: Palette.themeCardShadeColor, - child: ListTile( - leading: FaIcon( - icon, - color: Palette.indigo, - ), - title: Container( - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - title, - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.w500, - color: Palette.grey, - ), - ), - Icon( - Icons.arrow_forward_ios, - color: Palette.grey, - ), - ], - ), - Transform.translate( - offset: Offset(0, 15), - child: Divider( - thickness: 0.1, - height: 0.1, - ), - ), - ], - ), - ), - /* - onTap: () { - showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - title: Text(title), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text("Option 1"), - Text("Option 2"), - Text("Option 3"), - ], - ), - actions: [ - TextButton( - onPressed: () { - Navigator.of(context).pop(); - }, - child: Text("Close")), - ], - ); - }); - }, -*/ - onTap: () { - if (pushTo != null) { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => pushTo), - ); - } - }, - ), - )); - } -} diff --git a/lib/features/settings/presentation/pages/social.dart b/lib/features/settings/presentation/pages/social.dart deleted file mode 100644 index cb6599d3..00000000 --- a/lib/features/settings/presentation/pages/social.dart +++ /dev/null @@ -1,144 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 📦 Package imports: -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:url_launcher/url_launcher_string.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; - -class SocialPage extends StatefulWidget { - final int? id; - - SocialPage({this.id}); - - @override - _SocialPageState createState() => _SocialPageState(id: id); -} - -class _SocialPageState extends State { - final int? id; - _SocialPageState({this.id}); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Socials', - textScaler: TextScaler.linear(1.4), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - shrinkWrap: false, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - buildLinkOptionRow( - context, - 'www.rotary.nl', - Palette.socialBlue, - 'https://www.rotary.org/sites/all/themes/rotary_rotaryorg/images/favicons/favicon-194x194.png', - 'http://www.rotary.nl/'), - Divider( - height: 15, - thickness: 2, - ), - buildLinkOptionRow( - context, - 'www.rotaryyep.nl', - Palette.grey, - 'https://www.rotary.org/sites/all/themes/rotary_rotaryorg/images/favicons/favicon-194x194.png', - 'http://www.rotaryyep.nl/'), - Divider( - height: 15, - thickness: 2, - ), - // buildLinkOptionRow( - // context, - // 'test3 ', - // Palette.socialBlue, - // 'https://www.rotary.org/sites/all/themes/rotary_rotaryorg/images/favicons/favicon-194x194.png', - // ''), - ], - ) - ], - ), - ); - } - - GestureDetector buildLinkOptionRow(BuildContext context, String title, colour, - String imageUrl, String linkUrl) { - return GestureDetector( - child: Container( - padding: EdgeInsets.all(8.0), - child: ListTile( - leading: Padding( - padding: const EdgeInsets.symmetric(horizontal: 4.0), - child: Container( - child: CachedNetworkImage( - height: 55, - width: 55, - imageUrl: imageUrl, - imageBuilder: (context, imageProvider) => Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - image: DecorationImage( - image: imageProvider, fit: BoxFit.cover), - ), - ), - placeholder: (context, url) => - Center(child: CircularProgressIndicator()), - errorWidget: (context, url, error) => Icon(Icons.error), - ), - ), - ), - title: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - SizedBox( - width: Device.width - 150, - child: Text(title, - maxLines: 3, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - inherit: true, - fontSize: 18.0, - fontWeight: FontWeight.w500, - color: colour)), - ), - Icon( - Icons.arrow_forward_ios, - size: 15, - color: Palette.grey, - ), - ], - ), - onTap: () async { - final url = linkUrl; - if (await canLaunchUrlString(url)) { - await launchUrlString( - url, - ); - } else { - throw 'Could not launch $url'; - } - }), - ), - ); - } -} diff --git a/lib/features/settings/presentation/widgets/settings_card_item.dart b/lib/features/settings/presentation/widgets/settings_card_item.dart deleted file mode 100644 index 24d9cfb7..00000000 --- a/lib/features/settings/presentation/widgets/settings_card_item.dart +++ /dev/null @@ -1,37 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; - -/// still need to add here the cards from settings to make settings cleaner :) - -class SettingsCardItem extends StatelessWidget { - final String title, subtitle, cardTitle, cardText; - final IconData icon; - - SettingsCardItem( - {required this.title, - required this.icon, - required this.subtitle, - required this.cardTitle, - required this.cardText}); - - @override - Widget build(BuildContext context) { - return ExpansionTile( - leading: Icon(icon), - title: Text(title), - subtitle: Text(subtitle), - children: [ - Text( - cardTitle, - style: TextStyle(fontSize: 20), - ), - SizedBox( - height: 20, - ), - Center( - child: Text(cardText), - ) - ], - ); - } -} diff --git a/lib/features/stories/data/utils.dart b/lib/features/stories/data/utils.dart deleted file mode 100644 index dae27526..00000000 --- a/lib/features/stories/data/utils.dart +++ /dev/null @@ -1,45 +0,0 @@ -// Future getDataStories(String url) async { -// http.Response? response; -// try { -// response = await http.get( -// Uri.parse(url), -// headers: { -// 'Content-Type': 'application/json', -// }, -// ); -// } catch (e) { -// print(e); -// throw 'unable to fetch stories json'; -// } -// if (response.statusCode != 200) { -// return null; -// } -// var data = json.decode(response.body); -// List? stories; -// try { -// stories = StoryResult.fromJson(data).stories; -// } catch (e) { -// print(e); -// return null; -// } -// -// return stories; -// } -// -// Future getDataStudents(String url) async { -// http.Response? response; -// try { -// response = await http.get( -// Uri.parse(url), -// headers: { -// 'Content-Type': 'application/json', -// }, -// ); -// } catch (e) { -// print(e); -// throw 'unable to fetch stories json'; -// } -// var data = json.decode(response.body); -// List students = ExchangeResult.fromJson(data).students; -// return students; -// } diff --git a/lib/features/stories/presentation/pages/countries_page.dart b/lib/features/stories/presentation/pages/countries_page.dart deleted file mode 100644 index c393961f..00000000 --- a/lib/features/stories/presentation/pages/countries_page.dart +++ /dev/null @@ -1,220 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/domain/entities/exchange_student.dart'; -import 'package:rotary_nl_rye/core/domain/exchangeStudents.dart'; -import 'package:rotary_nl_rye/core/presentation/widgets/image_list_tile.dart'; -import 'package:rotary_nl_rye/core/prop.dart'; -import 'package:rotary_nl_rye/features/stories/models/country.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; -import 'exchange_students_List.dart'; - -class CountriesPage extends StatefulWidget { - // final List students; - // - // const CountriesPage({required this.students}); - - @override - _CountriesPageState createState() => _CountriesPageState(); -} - -//TODO preload-svgs -// -//https://kangabru.xyz/2020/05/29/zero-to-hero-2.html#preload-svgs - -class _CountriesPageState extends State { - final studentBloc = new StudentsBloc(); - - @override - void initState() { - studentBloc.getExchangeStudentList(); - super.initState(); - } - - @override - void dispose() { - studentBloc.disposeStudent(); // TODO: implement dispose - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Countries', - textScaler: TextScaler.linear(1.4), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: Container( - child: StreamBuilder>( - stream: studentBloc.studentList, - builder: (context, snapshot) { - if (snapshot.hasError) { - print(snapshot.error.toString()); - return Center( - child: Text(snapshot.error.toString()), - ); - } else if (snapshot.hasData) { - return ListView.builder( - padding: EdgeInsets.only(left: 20, right: 20), - itemBuilder: (context, index) { - var sortedCountries = countries - ..sort((a, b) => a.name.compareTo(b.name)); - - return CountryListTile( - country: sortedCountries[index], - descriptionPage: ExchangeStudentsPage( - country: sortedCountries[index], - students: snapshot.data! - .where((element) => - element.to == sortedCountries[index].name) - .toList(), - ), - ); - }, - itemCount: countries.length, - ); - } else { - return Center( - child: CircularProgressIndicator(), - ); - } - }), - ), - ); - } -} - -List countries = [ - Country( - name: 'Argentina', - imageUrl: 'assets/icons/flags/ar.svg', - description: '', - ), - Country( - name: 'Australia', - imageUrl: 'assets/icons/flags/au.svg', - description: '', - ), - Country( - name: 'Brazil', - imageUrl: 'assets/icons/flags/br.svg', - description: '', - ), - Country( - name: 'Canada', - imageUrl: 'assets/icons/flags/ca.svg', - description: '', - ), - Country( - name: 'Chili', - imageUrl: 'assets/icons/flags/cl.svg', - description: '', - ), - Country( - name: 'Colombia', - imageUrl: 'assets/icons/flags/co.svg', - description: '', - ), - Country( - name: 'Ecuador', - imageUrl: 'assets/icons/flags/ec.svg', - description: '', - ), - Country( - name: 'Finland', - imageUrl: 'assets/icons/flags/fi.svg', - description: '', - ), - Country( - name: 'India', - imageUrl: 'assets/icons/flags/in.svg', - description: '', - ), - Country( - name: 'Indonesia', - imageUrl: 'assets/icons/flags/id.svg', - description: '', - ), - Country( - name: 'Italy', - imageUrl: 'assets/icons/flags/it.svg', - description: '', - ), - Country( - name: 'Japan', - imageUrl: 'assets/icons/flags/jp.svg', - description: '', - ), - Country( - name: 'Mexico', - imageUrl: 'assets/icons/flags/mx.svg', - description: '', - ), - Country( - name: 'New Zealand', - imageUrl: 'assets/icons/flags/nz.svg', - description: '', - ), - Country( - name: 'Peru', - imageUrl: 'assets/icons/flags/pe.svg', - description: '', - ), - Country( - name: 'South Africa', - imageUrl: 'assets/icons/flags/za.svg', - description: '', - ), - Country( - name: 'South Korea', - imageUrl: 'assets/icons/flags/kr.svg', - description: '', - ), - Country( - name: 'Taiwan', - imageUrl: 'assets/icons/flags/tw.svg', - description: '', - ), - Country( - name: 'Thailand', - imageUrl: 'assets/icons/flags/th.svg', - description: '', - ), - Country( - name: 'USA', - imageUrl: 'assets/icons/flags/us.svg', - description: '', - ), - Country( - name: 'Spain', - imageUrl: 'assets/icons/flags/es.svg', - description: '', - ), - Country( - name: 'Europa', - imageUrl: 'assets/icons/flags/eu.svg', - description: '', - ), - Country( - name: 'Switzerland', - imageUrl: 'assets/icons/flags/ch.svg', - description: '', - ), - Country( - name: 'France', - imageUrl: 'assets/icons/flags/fr.svg', - description: '', - ), -]; diff --git a/lib/features/stories/presentation/pages/student_details.dart b/lib/features/stories/presentation/pages/student_details.dart deleted file mode 100644 index 782bd5e1..00000000 --- a/lib/features/stories/presentation/pages/student_details.dart +++ /dev/null @@ -1,248 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// 📦 Package imports: -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; - -// 🌎 Project imports: -import 'package:rotary_nl_rye/core/domain/entities/exchange_student.dart'; -import 'package:rotary_nl_rye/core/presentation/widgets/full_screen_image.dart'; -import 'package:rotary_nl_rye/core/presentation/widgets/native_video.dart'; -import 'package:rotary_nl_rye/features/uniform_widgets/back_button.dart'; -import '../../../../core/prop.dart'; - -class StoriesDisplay extends StatefulWidget { - final ExchangeStudent student; - - StoriesDisplay({required this.student}); - - @override - _StoriesDisplayState createState() => _StoriesDisplayState(student: student); -} - -class _StoriesDisplayState extends State { - _StoriesDisplayState({required this.student}); - - final ExchangeStudent student; - - @override - void initState() { - super.initState(); - } - - @override - void dispose() { - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - systemOverlayStyle: - MediaQuery.of(context).platformBrightness == Brightness.light - ? SystemUiOverlayStyle.dark - : SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0.0, - leading: UniformBackButton(), - title: Text( - 'Rebounds', - textScaler: TextScaler.linear(1.4), - style: TextStyle(color: Palette.indigo, fontWeight: FontWeight.bold), - ), - ), - body: ListView( - shrinkWrap: true, - scrollDirection: Axis.vertical, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: EdgeInsets.only( - left: 20, - right: 20, - top: 15, - bottom: 16, - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - InkWell( - borderRadius: BorderRadius.circular(60), - onTap: () { - Navigator.of(context).push(PageRouteBuilder( - opaque: false, - pageBuilder: (BuildContext context, _, __) => - FullScreenImage(url: student.imageUrl))); - }, - child: CachedNetworkImage( - height: 60, - width: 60, - imageUrl: student.imageUrl, - imageBuilder: (context, imageProvider) => - Container( - decoration: BoxDecoration( - shape: BoxShape.circle, - image: DecorationImage( - image: imageProvider, - fit: BoxFit.cover, - ), - ), - ), - placeholder: (context, url) => - CircularProgressIndicator(), - errorWidget: (context, url, error) => - Icon(Icons.error), - )), - SizedBox( - width: 12, - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - width: Device.width - 150, - child: Text(student.name, - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - inherit: true, - fontSize: 22.0, - fontWeight: FontWeight.bold, - )), - ), - SizedBox( - height: 4, - ), - SizedBox( - width: Device.width - 150, - child: Row( - children: [ - Text(student.from, - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - fontWeight: FontWeight.w500, - inherit: true, - fontSize: 14.0, - color: Colors.grey[600], - )), - SizedBox( - width: 2, - ), - SvgPicture.asset( - 'assets/icons/flags/${student.fromFlag}.svg', - height: 15), - SizedBox( - width: 5, - ), - FaIcon( - FontAwesomeIcons.arrowRightLong, - color: Colors.grey, - ), - SizedBox( - width: 5, - ), - Text(student.to, - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - fontWeight: FontWeight.w500, - inherit: true, - fontSize: 14.0, - color: Colors.grey[600], - )), - SizedBox( - width: 2, - ), - SvgPicture.asset( - 'assets/icons/flags/${student.toFlag}.svg', - height: 15) - ], - ), - ), - ], - ) - ], - ), - ], - ), - ), - - Padding( - padding: - const EdgeInsets.only(top: 20.0, left: 30.0, bottom: 0.0), - child: Text( - 'About me', - style: TextStyle( - color: Colors.grey[600], - fontSize: 18.0, - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only( - top: 0.0, left: 30.0, bottom: 0.0, right: 300), - child: Divider( - height: 15, - thickness: 2, - ), - ), - Padding( - padding: - const EdgeInsets.only(left: 30.0, right: 30.0, top: 5.0), - child: Text( - student.bio, - style: TextStyle(fontSize: 16.0), - ), - ), - - student.video == null - ? SizedBox.shrink() - : SizedBox( - height: 40, - ), - - student.video == null - ? SizedBox.shrink() - : Padding( - padding: const EdgeInsets.only( - top: 20.0, left: 30.0, bottom: 0.0), - child: Text( - 'Dutchie', - style: TextStyle( - color: Colors.grey[600], - fontSize: 18.0, - fontWeight: FontWeight.bold), - ), - ), - - //video Europa - - student.video == null - ? SizedBox.shrink() - : Padding( - padding: const EdgeInsets.only(top: 10.0), - child: NativeVideo(url: student.video!), - ), - - SizedBox( - height: 40, - ), - ], - ) - ], - ), - ); - } -} diff --git a/lib/features/uniform_widgets/back_button.dart b/lib/features/uniform_widgets/back_button.dart index d0cedc87..17190bc5 100644 --- a/lib/features/uniform_widgets/back_button.dart +++ b/lib/features/uniform_widgets/back_button.dart @@ -5,17 +5,13 @@ import 'package:flutter/material.dart'; import 'package:rotary_nl_rye/core/prop.dart'; class UniformBackButton extends StatelessWidget { - const UniformBackButton({ - Key? key, - }) : super(key: key); + const UniformBackButton({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return IconButton( - onPressed: () { - Navigator.pop(context); - }, - icon: Icon(Icons.arrow_back), + onPressed: () => Navigator.pop(context), + icon: const Icon(Icons.arrow_back), color: Palette.indigo, ); } diff --git a/lib/features/uniform_widgets/info_list_tile.dart b/lib/features/uniform_widgets/info_list_tile.dart new file mode 100644 index 00000000..e00fc47d --- /dev/null +++ b/lib/features/uniform_widgets/info_list_tile.dart @@ -0,0 +1,39 @@ +// 🐦 Flutter imports: +import 'package:flutter/material.dart'; + +// 📦 Package imports: +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; + +// 🌎 Project imports: +import 'package:rotary_nl_rye/core/prop.dart'; + +class InfoListTile extends StatelessWidget { + final String title; + final IconData icon; + final Widget page; + + const InfoListTile({ + required this.title, + required this.icon, + required this.page, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + ListTile( + leading: FaIcon(icon, color: Palette.lightIndigo), + title: Text(title, style: TextStyle(color: Palette.grey)), + onTap: () => Navigator.push( + context, + MaterialPageRoute(builder: (context) => page), + ), + trailing: Icon(Icons.arrow_forward_ios, color: Palette.grey), + ), + Divider(height: 20, thickness: 2), + ], + ); + } +} diff --git a/lib/features/uniform_widgets/uniform_circle_avatar.dart b/lib/features/uniform_widgets/uniform_circle_avatar.dart index dacfff15..9afea48f 100644 --- a/lib/features/uniform_widgets/uniform_circle_avatar.dart +++ b/lib/features/uniform_widgets/uniform_circle_avatar.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; // 📦 Package imports: import 'package:cached_network_image/cached_network_image.dart'; -import 'package:skeletons/skeletons.dart'; +import 'package:flutter_skeleton_ui/flutter_skeleton_ui.dart'; class UniformCircleAvatar extends StatelessWidget { const UniformCircleAvatar({ diff --git a/lib/features/widgets/contact_list_tile.dart b/lib/features/widgets/contact_list_tile.dart new file mode 100644 index 00000000..57e6fd4b --- /dev/null +++ b/lib/features/widgets/contact_list_tile.dart @@ -0,0 +1,54 @@ +// 🐦 Flutter imports: +import 'package:flutter/material.dart'; + +// 🌎 Project imports: +import 'package:rotary_nl_rye/core/prop.dart'; +import 'package:rotary_nl_rye/features/uniform_widgets/uniform_circle_avatar.dart'; +import 'package:rotary_nl_rye/features/contact/presentation/models/organization.dart'; + +class ContactListTile extends StatelessWidget { + final Widget contactDetailsPage; + final Organization item; + + const ContactListTile({ + required this.contactDetailsPage, + required this.item, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 18, vertical: 8), + child: ListTile( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => contactDetailsPage), + ); + }, + contentPadding: EdgeInsets.all(0), + leading: UniformCircleAvatar(imageUrl: item.imageUrl), + title: Text( + item.name, + style: TextStyle( + color: Palette.indigo, + fontWeight: FontWeight.w600, + ), + ), + subtitle: Text( + item.functions[0], + style: TextStyle( + fontWeight: FontWeight.w500, + color: Palette.grey, + ), + ), + trailing: Icon( + Icons.keyboard_arrow_right, + size: 30, + color: Palette.indigo, + ), + ), + ); + } +} diff --git a/lib/features/widgets/contributors_list_tile.dart b/lib/features/widgets/contributors_list_tile.dart new file mode 100644 index 00000000..7bc7d4d2 --- /dev/null +++ b/lib/features/widgets/contributors_list_tile.dart @@ -0,0 +1,53 @@ +// 🐦 Flutter imports: +import 'package:flutter/material.dart'; + +// 🌎 Project imports: +import 'package:rotary_nl_rye/core/prop.dart'; +import 'package:rotary_nl_rye/features/uniform_widgets/uniform_circle_avatar.dart'; + +class ContributorsListTile extends StatelessWidget { + final Widget contributorsDetailsPage; + final dynamic item; + + const ContributorsListTile({ + required this.contributorsDetailsPage, + required this.item, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 18, vertical: 8), + child: ListTile( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => contributorsDetailsPage), + ); + }, + contentPadding: EdgeInsets.all(0), + leading: UniformCircleAvatar(imageUrl: item.imageUrl), + title: Text( + item.name, + style: TextStyle( + color: Palette.indigo, + fontWeight: FontWeight.w600, + ), + ), + subtitle: Text( + item.description, + style: TextStyle( + fontWeight: FontWeight.w500, + color: Palette.grey, + ), + ), + trailing: Icon( + Icons.keyboard_arrow_right, + size: 30, + color: Palette.indigo, + ), + ), + ); + } +} diff --git a/lib/features/widgets/counselor_list_tile.dart b/lib/features/widgets/counselor_list_tile.dart new file mode 100644 index 00000000..e16892e9 --- /dev/null +++ b/lib/features/widgets/counselor_list_tile.dart @@ -0,0 +1,68 @@ +// 🐦 Flutter imports: +import 'package:flutter/material.dart'; +import 'package:cached_network_image/cached_network_image.dart'; + +// 🌎 Project imports: +import 'package:rotary_nl_rye/core/prop.dart'; + +class CounselorListTile extends StatelessWidget { + final Widget counselorDetailsPage; + final dynamic item; + + const CounselorListTile({ + required this.counselorDetailsPage, + required this.item, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 18, vertical: 8), + child: ListTile( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => counselorDetailsPage), + ); + }, + contentPadding: EdgeInsets.all(0), + leading: CachedNetworkImage( + height: 55, + width: 55, + imageUrl: item.imageUrl, + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + shape: BoxShape.circle, + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), + ), + ), + placeholder: (context, url) => CircularProgressIndicator(), + errorWidget: (context, url, error) => Icon(Icons.error), + ), + title: Text( + item.name, + style: TextStyle( + color: Palette.indigo, + fontWeight: FontWeight.w600, + ), + ), + subtitle: Text( + item.functions, + style: TextStyle( + fontWeight: FontWeight.w500, + color: Palette.grey, + ), + ), + trailing: Icon( + Icons.keyboard_arrow_right, + size: 30, + color: Palette.indigo, + ), + ), + ); + } +} diff --git a/lib/features/widgets/country_list_tile.dart b/lib/features/widgets/country_list_tile.dart new file mode 100644 index 00000000..8962082f --- /dev/null +++ b/lib/features/widgets/country_list_tile.dart @@ -0,0 +1,50 @@ +// 🐦 Flutter imports: +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +// 🌎 Project imports: +import 'package:rotary_nl_rye/core/prop.dart'; +import 'package:rotary_nl_rye/features/rebounds/models/country.dart'; +import 'package:rotary_nl_rye/features/rebounds/presentation/pages/ExchangeStudentsList.dart'; + +class CountryListTile extends StatelessWidget { + final ExchangeStudentsList descriptionPage; + final Country country; + + const CountryListTile({ + required this.descriptionPage, + required this.country, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 18, vertical: 8), + child: ListTile( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => descriptionPage), + ); + }, + contentPadding: EdgeInsets.all(0), + leading: SvgPicture.asset( + country.imageUrl, + // height: 55, + width: 65, + fit: BoxFit.contain, + ), + title: Text( + country.name, + style: TextStyle(color: Palette.indigo), + ), + trailing: Icon( + Icons.keyboard_arrow_right, + size: 30, + color: Palette.indigo, + ), + ), + ); + } +} diff --git a/lib/features/widgets/image_list_tile.dart b/lib/features/widgets/image_list_tile.dart new file mode 100644 index 00000000..f7e09943 --- /dev/null +++ b/lib/features/widgets/image_list_tile.dart @@ -0,0 +1,59 @@ +// 🐦 Flutter imports: +import 'package:flutter/material.dart'; + +// 🌎 Project imports: +import 'package:rotary_nl_rye/core/prop.dart'; + +class ImageListTile extends StatelessWidget { + final Widget descriptionPage; + final dynamic item; + + const ImageListTile({ + required this.descriptionPage, + required this.item, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 18, vertical: 8), + child: ListTile( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => descriptionPage), + ); + }, + contentPadding: EdgeInsets.all(0), + leading: Container( + height: 55, + width: 55, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(40), + color: Palette.imageBackgroundColor, + ), + child: Image.asset( + item.imageUrl, + height: 50, + width: 50, + fit: BoxFit.contain, + ), + ), + title: Text( + item.name, + style: TextStyle(color: Palette.indigo), + ), + subtitle: Text( + item.description, + style: TextStyle(color: Palette.indigo), + ), + trailing: Icon( + Icons.keyboard_arrow_right, + size: 30, + color: Palette.indigo, + ), + ), + ); + } +} diff --git a/lib/features/widgets/inbound_student_list_tile.dart b/lib/features/widgets/inbound_student_list_tile.dart new file mode 100644 index 00000000..e0797614 --- /dev/null +++ b/lib/features/widgets/inbound_student_list_tile.dart @@ -0,0 +1,83 @@ +// 🐦 Flutter imports: +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; + +// 🌎 Project imports: +import 'package:rotary_nl_rye/core/prop.dart'; +import 'package:rotary_nl_rye/features/inbound/presentation/models/ClassOf.dart'; +import 'package:rotary_nl_rye/features/uniform_widgets/uniform_circle_avatar.dart'; + +class InboundStudentListTile extends StatelessWidget { + final Widget classOfDetailsPage; + final Inbounds item; + + const InboundStudentListTile({ + required this.classOfDetailsPage, + required this.item, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 18, vertical: 8), + child: ListTile( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => classOfDetailsPage), + ); + }, + contentPadding: EdgeInsets.all(0), + leading: UniformCircleAvatar(imageUrl: item.imageUrl), + title: Text( + item.name, + style: TextStyle( + color: Palette.indigo, + fontWeight: FontWeight.w600, + ), + ), + subtitle: Row( + children: [ + Text( + item.from, + style: TextStyle( + fontWeight: FontWeight.w500, + color: Colors.grey[600], + ), + ), + SizedBox(width: 2), + SvgPicture.asset( + 'assets/icons/flags/${item.fromFlag}.svg', + height: 15, + ), + SizedBox(width: 5), + FaIcon( + FontAwesomeIcons.arrowRightLong, + color: Colors.grey, + ), + SizedBox(width: 5), + Text( + item.to, + style: TextStyle( + fontWeight: FontWeight.w500, + color: Colors.grey[600], + ), + ), + SizedBox(width: 2), + SvgPicture.asset( + 'assets/icons/flags/${item.toFlag}.svg', + height: 15, + ), + ], + ), + trailing: Icon( + Icons.keyboard_arrow_right, + size: 30, + color: Palette.indigo, + ), + ), + ); + } +} diff --git a/lib/features/widgets/inbounds_students_list_tile.dart b/lib/features/widgets/inbounds_students_list_tile.dart new file mode 100644 index 00000000..5897c9c6 --- /dev/null +++ b/lib/features/widgets/inbounds_students_list_tile.dart @@ -0,0 +1,68 @@ +// 🐦 Flutter imports: +import 'package:flutter/material.dart'; +import 'package:cached_network_image/cached_network_image.dart'; + +// 🌎 Project imports: +import 'package:rotary_nl_rye/core/prop.dart'; + +class InboundsStudentsListTile extends StatelessWidget { + final Widget inboundsStudentsListPage; + final dynamic item; + + const InboundsStudentsListTile({ + required this.inboundsStudentsListPage, + required this.item, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 18, vertical: 8), + child: ListTile( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => inboundsStudentsListPage), + ); + }, + contentPadding: EdgeInsets.all(0), + leading: CachedNetworkImage( + height: 55, + width: 55, + imageUrl: item.imageUrl, + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + shape: BoxShape.circle, + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), + ), + ), + placeholder: (context, url) => CircularProgressIndicator(), + errorWidget: (context, url, error) => Icon(Icons.error), + ), + title: Text( + item.name, + style: TextStyle( + color: Palette.indigo, + fontWeight: FontWeight.w600, + ), + ), + subtitle: Text( + 'From: ${item.place}', + style: TextStyle( + fontWeight: FontWeight.w500, + color: Palette.grey, + ), + ), + trailing: Icon( + Icons.keyboard_arrow_right, + size: 30, + color: Palette.indigo, + ), + ), + ); + } +} diff --git a/lib/features/widgets/list_tiles.dart b/lib/features/widgets/list_tiles.dart new file mode 100644 index 00000000..5723929f --- /dev/null +++ b/lib/features/widgets/list_tiles.dart @@ -0,0 +1,11 @@ +export 'package:rotary_nl_rye/features/widgets/svg_list_tile.dart'; +export 'package:rotary_nl_rye/features/widgets/country_list_tile.dart'; +export 'package:rotary_nl_rye/features/widgets/image_list_tile.dart'; +export 'package:rotary_nl_rye/features/widgets/contact_list_tile.dart'; +export 'package:rotary_nl_rye/features/widgets/rotex_contact_list_tile.dart'; +export 'package:rotary_nl_rye/features/widgets/outbound_student_list_tile.dart'; +export 'package:rotary_nl_rye/features/widgets/inbound_student_list_tile.dart'; +export 'package:rotary_nl_rye/features/widgets/inbounds_students_list_tile.dart'; +export 'package:rotary_nl_rye/features/widgets/rebounds_students_list_tile.dart'; +export 'package:rotary_nl_rye/features/widgets/counselor_list_tile.dart'; +export 'package:rotary_nl_rye/features/widgets/contributors_list_tile.dart'; diff --git a/lib/features/widgets/outbound_student_list_tile.dart b/lib/features/widgets/outbound_student_list_tile.dart new file mode 100644 index 00000000..16959504 --- /dev/null +++ b/lib/features/widgets/outbound_student_list_tile.dart @@ -0,0 +1,83 @@ +// 🐦 Flutter imports: +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; + +// 🌎 Project imports: +import 'package:rotary_nl_rye/core/prop.dart'; +import 'package:rotary_nl_rye/features/outbound/presentation/models/ClassOf.dart'; +import 'package:rotary_nl_rye/features/uniform_widgets/uniform_circle_avatar.dart'; + +class OutboundStudentListTile extends StatelessWidget { + final Widget classOfDetailsPage; + final Outbounds item; + + const OutboundStudentListTile({ + required this.classOfDetailsPage, + required this.item, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 18, vertical: 8), + child: ListTile( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => classOfDetailsPage), + ); + }, + contentPadding: EdgeInsets.all(0), + leading: UniformCircleAvatar(imageUrl: item.imageUrl), + title: Text( + item.name, + style: TextStyle( + color: Palette.indigo, + fontWeight: FontWeight.w600, + ), + ), + subtitle: Row( + children: [ + Text( + item.from, + style: TextStyle( + fontWeight: FontWeight.w500, + color: Colors.grey[600], + ), + ), + SizedBox(width: 2), + SvgPicture.asset( + 'assets/icons/flags/${item.fromFlag}.svg', + height: 15, + ), + SizedBox(width: 5), + FaIcon( + FontAwesomeIcons.arrowRightLong, + color: Colors.grey, + ), + SizedBox(width: 5), + Text( + item.to, + style: TextStyle( + fontWeight: FontWeight.w500, + color: Colors.grey[600], + ), + ), + SizedBox(width: 2), + SvgPicture.asset( + 'assets/icons/flags/${item.toFlag}.svg', + height: 15, + ), + ], + ), + trailing: Icon( + Icons.keyboard_arrow_right, + size: 30, + color: Palette.indigo, + ), + ), + ); + } +} diff --git a/lib/features/widgets/rebounds_students_list_tile.dart b/lib/features/widgets/rebounds_students_list_tile.dart new file mode 100644 index 00000000..9a75df9e --- /dev/null +++ b/lib/features/widgets/rebounds_students_list_tile.dart @@ -0,0 +1,72 @@ +// 🐦 Flutter imports: +import 'package:flutter/material.dart'; +import 'package:cached_network_image/cached_network_image.dart'; + +// 🌎 Project imports: +import 'package:rotary_nl_rye/core/prop.dart'; +import 'package:rotary_nl_rye/core/domain/entities/exchange_student.dart'; + +class ReboundsStudentsListTile extends StatelessWidget { + final Widget reboundsStudentsListPage; + final ExchangeStudent item; + + const ReboundsStudentsListTile({ + required this.reboundsStudentsListPage, + required this.item, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 18, vertical: 8), + child: ListTile( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => reboundsStudentsListPage), + ); + }, + contentPadding: EdgeInsets.all(0), + leading: ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(40)), + child: CachedNetworkImage( + height: 55, + width: 55, + imageUrl: item.imageUrl, + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + shape: BoxShape.circle, + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), + ), + ), + placeholder: (context, url) => CircularProgressIndicator(), + errorWidget: (context, url, error) => Icon(Icons.error), + ), + ), + title: Text( + item.name, + style: TextStyle( + color: Palette.indigo, + fontWeight: FontWeight.w600, + ), + ), + subtitle: Text( + item.description, + style: TextStyle( + fontWeight: FontWeight.w500, + color: Palette.grey, + ), + ), + trailing: Icon( + Icons.keyboard_arrow_right, + size: 30, + color: Palette.indigo, + ), + ), + ); + } +} diff --git a/lib/features/widgets/rotex_contact_list_tile.dart b/lib/features/widgets/rotex_contact_list_tile.dart new file mode 100644 index 00000000..4bd0272b --- /dev/null +++ b/lib/features/widgets/rotex_contact_list_tile.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:rotary_nl_rye/core/prop.dart'; +import 'package:rotary_nl_rye/features/contact/presentation/models/rotex.dart'; +import 'package:rotary_nl_rye/features/uniform_widgets/uniform_circle_avatar.dart'; + +class RotexContactListTile extends StatelessWidget { + final Widget rotexContactDetailsPage; + final Rotex item; + + const RotexContactListTile({ + required this.rotexContactDetailsPage, + required this.item, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 18, vertical: 8), + child: ListTile( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => rotexContactDetailsPage), + ); + }, + contentPadding: EdgeInsets.all(0), + leading: UniformCircleAvatar(imageUrl: item.imageUrl), + title: Text(item.name, + style: TextStyle( + color: Palette.indigo, + fontWeight: FontWeight.w600, + )), + subtitle: Text( + item.role, + style: TextStyle( + fontWeight: FontWeight.w500, + color: Palette.grey, + ), + ), + trailing: Icon( + Icons.keyboard_arrow_right, + size: 30, + color: Palette.indigo, + ), + ), + ); + } +} diff --git a/lib/features/widgets/svg_list_tile.dart b/lib/features/widgets/svg_list_tile.dart new file mode 100644 index 00000000..5a055716 --- /dev/null +++ b/lib/features/widgets/svg_list_tile.dart @@ -0,0 +1,48 @@ +// 🐦 Flutter imports: +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +// 🌎 Project imports: +import 'package:rotary_nl_rye/core/prop.dart'; + +class SVGListTile extends StatelessWidget { + final Widget descriptionPage; + final dynamic item; + + const SVGListTile({ + required this.descriptionPage, + required this.item, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 18, vertical: 8), + child: ListTile( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => descriptionPage), + ); + }, + contentPadding: EdgeInsets.all(0), + leading: SvgPicture.asset( + item.imageUrl, + height: 55, + width: 55, + fit: BoxFit.contain, + ), + title: Text( + item.name, + style: TextStyle(color: Palette.indigo), + ), + trailing: Icon( + Icons.keyboard_arrow_right, + size: 30, + color: Palette.indigo, + ), + ), + ); + } +} diff --git a/lib/main.dart b/lib/main.dart index b79b8331..c0f57cdb 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -13,7 +13,6 @@ import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_native_splash/flutter_native_splash.dart'; - import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -24,50 +23,22 @@ import 'core/lang/languages.dart'; import 'core/presentation/widgets/page_navigator.dart'; import 'injection_container.dart' as di; -// void main() async { -// runZonedGuarded>(() async { -// WidgetsFlutterBinding.ensureInitialized(); -// await Firebase.initializeApp(); -// FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError; -// await di.init(); -// SystemChrome.setPreferredOrientations( -// [DeviceOrientation.portraitDown, DeviceOrientation.portraitUp]); - -// runApp(new MyApp()); -// }, FirebaseCrashlytics.instance.recordError); -// } - Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { - if (Firebase.apps.isEmpty) await Firebase.initializeApp(); - - print('Got a message whilst in the BACKGROUND or TERMINATED!'); + await Firebase.initializeApp(); + print('Handling a background message: ${message.messageId}'); - // test final prefs = await SharedPreferences.getInstance(); prefs.setInt('newsBadge', 1); - // end test } -// Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { -// await Firebase.initializeApp(); -// print("Handling a background message ${message.data}"); -// } - -/// Create a [AndroidNotificationChannel] for heads up notifications late AndroidNotificationChannel channel; - -/// Initialize the [FlutterLocalNotificationsPlugin] package. late FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin; void main() async { WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized(); - // Initialize Firebase as the first thing await Firebase.initializeApp(); - - // Now Firebase features can be used FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterFatalError; - FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding); if (Platform.isAndroid) { @@ -75,38 +46,10 @@ void main() async { } if (!kIsWeb) { - channel = const AndroidNotificationChannel( - 'high_importance_channel', // id - 'High Importance Notifications', // title - description: - 'This channel is used for important notifications.', // description - importance: Importance.high, - ); - - flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); - - /// Create an Android Notification Channel. - /// - /// We use this channel in the `AndroidManifest.xml` file to override the - /// default FCM channel to enable heads up notifications. - await flutterLocalNotificationsPlugin - .resolvePlatformSpecificImplementation< - AndroidFlutterLocalNotificationsPlugin>() - ?.createNotificationChannel(channel); - - /// Update the iOS foreground notification presentation options to allow - /// heads up notifications. - await FirebaseMessaging.instance - .setForegroundNotificationPresentationOptions( - alert: true, - badge: true, - sound: true, - ); + _initializeNotifications(); } if (kDebugMode) { - // Force disable Crashlytics collection while doing every day development. - // Temporarily toggle this to true if you want to test crash reporting in your app. await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(false); } @@ -114,62 +57,74 @@ void main() async { SystemChrome.setPreferredOrientations( [DeviceOrientation.portraitDown, DeviceOrientation.portraitUp]); - runApp(new MyApp()); - // FlutterNativeSplash.remove(); + runApp(MyApp()); - // Assuming _repo is an instance of a class that requires initialization after runApp final _repo = Repo(); _repo.initData('', ''); } +Future _initializeNotifications() async { + channel = const AndroidNotificationChannel( + 'high_importance_channel', + 'High Importance Notifications', + description: 'This channel is used for important notifications.', + importance: Importance.high, + ); + + flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); + + await flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< + AndroidFlutterLocalNotificationsPlugin>() + ?.createNotificationChannel(channel); + + await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions( + alert: true, + badge: true, + sound: true, + ); +} + class MyApp extends StatelessWidget { - // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( - localizationsDelegates: [ - const DemoLocalizationsDelegate(), + localizationsDelegates: const [ + DemoLocalizationsDelegate(), GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], - supportedLocales: [ - const Locale('en', 'US'), - const Locale('en', 'GB'), - const Locale('nl', ''), - const Locale('de', ''), - const Locale('pt', 'PT'), - const Locale('pt', 'BR'), - const Locale.fromSubtags( - languageCode: 'zh', - scriptCode: 'Hans', - countryCode: 'CN'), // 'zh_Hans_CN' - const Locale.fromSubtags( - languageCode: 'zh', - scriptCode: 'Hant', - countryCode: 'TW'), // 'zh_Hant_TW' - const Locale('es', ''), + supportedLocales: const [ + Locale('en', 'US'), + Locale('en', 'GB'), + Locale('nl', ''), + Locale('de', ''), + Locale('pt', 'PT'), + Locale('pt', 'BR'), + Locale.fromSubtags( + languageCode: 'zh', scriptCode: 'Hans', countryCode: 'CN'), + Locale.fromSubtags( + languageCode: 'zh', scriptCode: 'Hant', countryCode: 'TW'), + Locale('es', ''), ], localeResolutionCallback: (locale, supportedLocales) { if (locale == null) { return supportedLocales.first; } for (var supportedLocale in supportedLocales) { - if (supportedLocale.countryCode == locale.countryCode) { + if (supportedLocale.languageCode == locale.languageCode) { return supportedLocale; } } return supportedLocales.first; }, theme: ThemeData.light(useMaterial3: true), - // Provide light theme. darkTheme: ThemeData.dark(useMaterial3: true), - // Provide dark theme. themeMode: ThemeMode.system, - title: 'Rotary youth Exchange', + title: 'Rotary Youth Exchange', debugShowCheckedModeBanner: false, home: PageNavigator(), - //routing in "lib/core/custom_routes.dart" routes: customRoutes, ); } diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index 26843503..cc10c4da 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -7,16 +7,12 @@ #include "generated_plugin_registrant.h" #include -#include #include void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) audioplayers_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "AudioplayersLinuxPlugin"); audioplayers_linux_plugin_register_with_registrar(audioplayers_linux_registrar); - g_autoptr(FlPluginRegistrar) maps_launcher_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "MapsLauncherPlugin"); - maps_launcher_plugin_register_with_registrar(maps_launcher_registrar); g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 59ae871f..8e2a1900 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -4,7 +4,6 @@ list(APPEND FLUTTER_PLUGIN_LIST audioplayers_linux - maps_launcher url_launcher_linux ) diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index bc5abbdf..48e20c2a 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -7,6 +7,7 @@ import Foundation import audioplayers_darwin import cloud_firestore +import connectivity_plus import firebase_analytics import firebase_auth import firebase_core @@ -15,7 +16,6 @@ import firebase_messaging import firebase_remote_config import flutter_app_badger import flutter_local_notifications -import maps_launcher import package_info_plus import path_provider_foundation import share_plus @@ -28,6 +28,7 @@ import wakelock_plus func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { AudioplayersDarwinPlugin.register(with: registry.registrar(forPlugin: "AudioplayersDarwinPlugin")) FLTFirebaseFirestorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseFirestorePlugin")) + ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin")) FLTFirebaseAnalyticsPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAnalyticsPlugin")) FLTFirebaseAuthPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAuthPlugin")) FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) @@ -36,7 +37,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FLTFirebaseRemoteConfigPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseRemoteConfigPlugin")) FlutterAppBadgerPlugin.register(with: registry.registrar(forPlugin: "FlutterAppBadgerPlugin")) FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) - MapsLauncherPlugin.register(with: registry.registrar(forPlugin: "MapsLauncherPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) diff --git a/pubspec.yaml b/pubspec.yaml index d206ece3..844d02b1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,69 +15,76 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 8.0.0+93 +version: 8.0.2+95 # authors: # - Ruben Talstra # - Jannik Norden environment: - sdk: ">=3.1.0 <4.0.0" + sdk: ">=3.3.0 <4.0.0" dependencies: badges: ^3.1.2 - dio: ^5.4.0 - cached_network_image: ^3.3.1 - carousel_slider: ^4.2.1 - chewie: ^1.7.5 - cloud_firestore: ^4.15.4 - csv: ^5.1.1 - cupertino_icons: ^1.0.6 + dio: ^5.6.0 + cached_network_image: ^3.4.1 + carousel_slider: ^5.0.0 + chewie: ^1.8.3 + cloud_firestore: ^5.2.1 + csv: ^6.0.0 + cupertino_icons: ^1.0.8 dartz: ^0.10.1 equatable: ^2.0.5 - firebase_analytics: ^10.8.5 - firebase_auth: ^4.17.4 - firebase_core: ^2.25.4 - firebase_crashlytics: ^3.4.14 - firebase_dynamic_links: ^5.4.13 - firebase_messaging: ^14.7.15 - firebase_remote_config: ^4.3.13 + firebase_analytics: ^11.2.1 + firebase_auth: ^5.1.4 + firebase_core: ^3.3.0 + firebase_crashlytics: ^4.0.4 + firebase_dynamic_links: ^6.0.4 + firebase_messaging: ^15.0.4 + firebase_remote_config: ^5.0.4 flutter: sdk: flutter - flutter_app_badger: ^1.5.0 + flutter_app_badger: + git: + url: https://github.com/g123k/flutter_app_badger.git flutter_cached_pdfview: ^0.4.2 - flutter_local_notifications: ^16.3.2 + flutter_local_notifications: ^17.2.2 flutter_localizations: sdk: flutter flutter_staggered_grid_view: ^0.7.0 - flutter_svg: ^2.0.9 + flutter_svg: ^2.0.10 flutter_swiper_null_safety: ^1.0.2 font_awesome_flutter: ^10.7.0 - get_it: ^7.6.7 - internet_connection_checker: ^1.0.0+1 - maps_launcher: ^2.2.0 + get_it: ^7.7.0 + internet_connection_checker: ^2.0.0 + # maps_launcher: ^2.2.1 + map_launcher: ^3.4.0 + geocoding: ^3.0.0 mockito: ^5.4.4 - package_info_plus: ^5.0.1 - path_provider: ^2.1.2 - photo_view: ^0.14.0 - share_plus: ^7.2.2 - shared_preferences: ^2.2.2 - skeletons: ^0.0.3 - table_calendar: ^3.1.0 + package_info_plus: ^8.0.2 + path_provider: ^2.1.4 + photo_view: ^0.15.0 + share_plus: ^10.0.2 + shared_preferences: ^2.3.2 + flutter_skeleton_ui: ^0.0.6 + table_calendar: ^3.1.2 translator: ^1.0.0 transparent_image: ^2.0.1 - url_launcher: ^6.2.4 - video_player: ^2.8.2 + url_launcher: ^6.3.0 + video_player: ^2.9.1 percent_indicator: ^4.2.3 - audioplayers: ^5.2.1 + audioplayers: ^6.0.0 + http: ^1.2.2 + flutter_cache_manager: ^3.4.1 + flutter_native_splash: ^2.4.1 + dependency_overrides: - intl: ^0.19.0 + web: ^1.0.0 dev_dependencies: - dependency_validator: ^3.2.3 + dependency_validator: ^4.1.0 flutter_launcher_icons: ^0.13.1 - flutter_lints: ^3.0.1 - flutter_native_splash: ^2.3.10 + flutter_lints: ^4.0.0 import_sorter: ^4.6.0 flutter_test: sdk: flutter diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 735f53f4..04c78a73 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -8,9 +8,9 @@ #include #include +#include #include #include -#include #include #include @@ -19,12 +19,12 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("AudioplayersWindowsPlugin")); CloudFirestorePluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("CloudFirestorePluginCApi")); + ConnectivityPlusWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin")); FirebaseAuthPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("FirebaseAuthPluginCApi")); FirebaseCorePluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("FirebaseCorePluginCApi")); - MapsLauncherPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("MapsLauncherPlugin")); SharePlusWindowsPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); UrlLauncherWindowsRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 9654f246..ddf39b14 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -5,9 +5,9 @@ list(APPEND FLUTTER_PLUGIN_LIST audioplayers_windows cloud_firestore + connectivity_plus firebase_auth firebase_core - maps_launcher share_plus url_launcher_windows )