diff --git a/wien_talks/Makefile b/Makefile similarity index 100% rename from wien_talks/Makefile rename to Makefile diff --git a/README.md b/README.md new file mode 100644 index 0000000..45d3621 --- /dev/null +++ b/README.md @@ -0,0 +1,46 @@ +# Wien Talks + +**An app developed during the [2nd Flutter Vienna Hackathon](https://www.meetup.com/fluttervienna/events/310014357/).** + +## Team + +_Grätzel-Goblins_ — Timo, Max & Mike + +## Description + +_Wien Talks_ is an app to share the iconic and quotable lines you hear Viennese +people drop throughout their day. It doesn't matter if it's a U6 train +conductor's insults that he made during an announcement or the Spar cashier's +funny retort to "Zweite Kassa bitte!", _Wien Talks_ is made to record, preserve +and share Viennese quotes with others. + +Quotes are community-moderated—users can up- or down-vote posts. Additionally, +when creating a new quote, the location from which the user made it is added, +too. This allows you to see what's going on near you. + +## Screenshots + + + + + + + + + + +
+ Default quotes list +
Default quotes view
+
+ Filtered quotes list +
Filtered quotes
+
+ Reuse location from quote +
Tap a card → create with same location
+
+ Custom location picker +
Set a custom location
+
+ +--- diff --git a/wien_talks/defines.mk b/defines.mk similarity index 100% rename from wien_talks/defines.mk rename to defines.mk diff --git a/wien_talks/FunMap_Presentation.pptx b/unicorn/FunMap_Presentation.pptx similarity index 100% rename from wien_talks/FunMap_Presentation.pptx rename to unicorn/FunMap_Presentation.pptx diff --git a/unicorn/Screenshot_1755421875.png b/unicorn/Screenshot_1755421875.png new file mode 100644 index 0000000..779eea3 Binary files /dev/null and b/unicorn/Screenshot_1755421875.png differ diff --git a/unicorn/Screenshot_1755421892.png b/unicorn/Screenshot_1755421892.png new file mode 100644 index 0000000..b1fcf11 Binary files /dev/null and b/unicorn/Screenshot_1755421892.png differ diff --git a/unicorn/Screenshot_1755421897.png b/unicorn/Screenshot_1755421897.png new file mode 100644 index 0000000..246d10d Binary files /dev/null and b/unicorn/Screenshot_1755421897.png differ diff --git a/unicorn/Screenshot_1755421907.png b/unicorn/Screenshot_1755421907.png new file mode 100644 index 0000000..f02fcf6 Binary files /dev/null and b/unicorn/Screenshot_1755421907.png differ diff --git a/wien_talks/.github/workflows/deployment-aws.yml b/wien_talks/.github/workflows/deployment-aws.yml deleted file mode 100644 index ea95cd7..0000000 --- a/wien_talks/.github/workflows/deployment-aws.yml +++ /dev/null @@ -1,75 +0,0 @@ -name: Deploy to AWS -on: - push: - branches: [ deployment-aws-production, deployment-aws-staging ] - workflow_dispatch: - inputs: - target: - description: 'Target' - required: true - default: 'production' - type: choice - options: - - 'staging' - - 'production' -jobs: - deploy: - name: Deploy to AWS - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - submodules: recursive - - - name: Setup Dart SDK - uses: dart-lang/setup-dart@v1.6.5 - with: - sdk: 3.5 - - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v1 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: us-west-2 - - - name: Create passwords file - working-directory: wien_talks_server - shell: bash - env: - SERVERPOD_PASSWORDS: ${{ secrets.SERVERPOD_PASSWORDS }} - run: | - pwd - echo "$SERVERPOD_PASSWORDS" > config/passwords.yaml - ls config/ - - - name: Get Dart packages - working-directory: wien_talks_server - run: dart pub get - - - name: Compile server - working-directory: wien_talks_server - run: dart compile kernel bin/main.dart - - - name: Create CodeDeploy Deployment - id: deploy - env: - PROJECT_NAME: wien_talks - AWS_NAME: wien-talks - DEPLOYMENT_BUCKET: wien-talks-deployment-6559518 - TARGET: ${{ github.event.inputs.target }} - run: | - # Deploy server to AWS - TARGET="${TARGET:=${GITHUB_REF##*-}}" - echo "Deploying to target: $TARGET" - mkdir -p vendor - cp "${PROJECT_NAME}_server/deploy/aws/scripts/appspec.yml" appspec.yml - zip -r deployment.zip . - aws s3 cp deployment.zip "s3://${DEPLOYMENT_BUCKET}/deployment.zip" - aws deploy create-deployment \ - --application-name "${AWS_NAME}-app" \ - --deployment-group-name "${AWS_NAME}-${TARGET}-group" \ - --deployment-config-name CodeDeployDefault.OneAtATime \ - --s3-location "bucket=${DEPLOYMENT_BUCKET},key=deployment.zip,bundleType=zip" diff --git a/wien_talks/.github/workflows/deployment-gcp.yml b/wien_talks/.github/workflows/deployment-gcp.yml deleted file mode 100644 index 6ceedf2..0000000 --- a/wien_talks/.github/workflows/deployment-gcp.yml +++ /dev/null @@ -1,99 +0,0 @@ -name: Deploy to GCP -on: - push: - branches: [ deployment-gcp-production, deployment-gcp-staging ] - workflow_dispatch: - inputs: - target: - description: 'Target' - required: true - default: 'production' - type: choice - options: - - 'staging' - - 'production' - -env: - # TODO: Update with your Google Cloud project id. If you have changed the - # region and zone in your Terraform configuration, you will need to change - # it here too. - PROJECT: "" - REGION: us-central1 - ZONE: us-central1-c - -jobs: - deploy: - name: Deploy to Google Cloud Run - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - submodules: recursive - - - name: Setting Target Mode from Input - if: ${{ github.event.inputs.target != '' }} - run: echo "TARGET=${{ github.event.inputs.target }}" >> $GITHUB_ENV - - - name: Setting Target mode based on branch - if: ${{ github.event.inputs.target == '' }} - run: echo "TARGET=${GITHUB_REF##*-}" >> $GITHUB_ENV - - - name: Set repository - run: echo "REPOSITORY=serverpod-${{ env.TARGET }}-container" >> $GITHUB_ENV - - - name: Set Image Name - run: echo "IMAGE_NAME=serverpod" >> $GITHUB_ENV - - - name: Set Service Name - run: echo "SERVICE_NAME=$(echo $IMAGE_NAME | sed 's/[^a-zA-Z0-9]/-/g')" >> $GITHUB_ENV - - - name: Test - run: echo $SERVICE_NAME - - - - id: "auth" - name: "Authenticate to Google Cloud" - uses: "google-github-actions/auth@v1" - with: - credentials_json: "${{ secrets.GOOGLE_CREDENTIALS }}" - - - name: Create passwords file - working-directory: wien_talks_server - shell: bash - env: - SERVERPOD_PASSWORDS: ${{ secrets.SERVERPOD_PASSWORDS }} - run: | - pwd - echo "$SERVERPOD_PASSWORDS" > config/passwords.yaml - ls config/ - - - name: Configure Docker - working-directory: wien_talks_server - run: gcloud auth configure-docker ${{ env.REGION }}-docker.pkg.dev - - - name: Build the Docker image - working-directory: wien_talks_server - run: "docker build -t $IMAGE_NAME ." - - - name: Tag the Docker image - working-directory: wien_talks_server - run: docker tag $IMAGE_NAME ${{ env.REGION }}-docker.pkg.dev/${{ env.PROJECT }}/${{ env.REPOSITORY }}/$IMAGE_NAME - - - name: Push Docker image - working-directory: wien_talks_server - run: docker push ${{ env.REGION }}-docker.pkg.dev/${{ env.PROJECT }}/${{ env.REPOSITORY }}/$IMAGE_NAME - - # Uncomment the following code to automatically restart the servers in the - # instance group when you push a new version of your code. Before doing - # this, make sure that you have successfully deployed a first version. - # - # - name: Restart servers in instance group - # run: | - # gcloud compute instance-groups managed rolling-action replace serverpod-${{ env.TARGET }}-group \ - # --project=${{ env.PROJECT }} \ - # --replacement-method='substitute' \ - # --max-surge=1 \ - # --max-unavailable=1 \ - # --zone=${{ env.ZONE }} diff --git a/wien_talks/wien_talks_flutter/android/app/build.gradle.kts b/wien_talks/wien_talks_flutter/android/app/build.gradle.kts deleted file mode 100644 index c8f71fe..0000000 --- a/wien_talks/wien_talks_flutter/android/app/build.gradle.kts +++ /dev/null @@ -1,44 +0,0 @@ -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") -} - -android { - namespace = "com.wien_talks" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_11.toString() - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.wien_talks" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - 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.getByName("debug") - } - } -} - -flutter { - source = "../.." -} diff --git a/wien_talks/wien_talks_flutter/lib/helper/go_router.dart b/wien_talks/wien_talks_flutter/lib/helper/go_router.dart deleted file mode 100644 index 679cd7e..0000000 --- a/wien_talks/wien_talks_flutter/lib/helper/go_router.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:go_router/go_router.dart'; -import 'package:wien_talks_flutter/screens/create_event_screen.dart'; -import 'package:wien_talks_flutter/screens/login_page.dart'; -import 'package:wien_talks_flutter/screens/news_screen.dart'; - -final router = GoRouter( - routes: [ - GoRoute(path: '/login', builder: (c, s) => const LoginScreen()), - GoRoute(path: '/', builder: (c, s) => NewsScreen()), - GoRoute( - path: '/create_event', - name: 'create_event', - builder: (c, s) => CreateEventScreen()), - ], -); diff --git a/wien_talks/wien_talks_flutter/lib/screens/create_event_screen.dart b/wien_talks/wien_talks_flutter/lib/screens/create_event_screen.dart deleted file mode 100644 index d31166f..0000000 --- a/wien_talks/wien_talks_flutter/lib/screens/create_event_screen.dart +++ /dev/null @@ -1,40 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:location/location.dart'; -import 'package:wien_talks_client/wien_talks_client.dart'; -import 'package:wien_talks_flutter/widgets/get_location_widget.dart'; -import 'package:wien_talks_flutter/helper/funmap_mgr.dart'; -import 'package:wien_talks_flutter/mapfile_widget.dart'; -import 'package:wien_talks_flutter/widgets/news_input_form.dart'; -import 'package:wien_talks_flutter/widgets/screen_widget.dart'; - -import '../helper/location_mgr.dart'; - -class CreateEventScreen extends StatelessWidget { - const CreateEventScreen({super.key}); - - @override - Widget build(BuildContext context) { - return ScreenWidget( - child: Column( - children: [ - NewsInputForm( - onSubmit: (CreateQuoteRequest request) async { - await FunmapMgr().client.quote.createQuote(request); - }, - ), - StreamBuilder( - stream: LocationMgr().stream, - builder: - (BuildContext context, AsyncSnapshot snapshot) => - snapshot.data != null - ? Text(snapshot.data.toString()) - : SizedBox()), - Expanded( - child: GetLocationWidget( - child: MapfileWidget(), - ), - ), - ], - )); - } -} diff --git a/wien_talks/wien_talks_flutter/lib/screens/login_page.dart b/wien_talks/wien_talks_flutter/lib/screens/login_page.dart deleted file mode 100644 index 1eff639..0000000 --- a/wien_talks/wien_talks_flutter/lib/screens/login_page.dart +++ /dev/null @@ -1,50 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; -import 'package:wien_talks_flutter/helper/auth_service.dart'; - -class LoginScreen extends StatelessWidget { - const LoginScreen({super.key}); - - @override - Widget build(BuildContext context) { - return Scaffold( - body: Container( - decoration: const BoxDecoration( - gradient: LinearGradient( - colors: [Color(0xff2193b0), Color(0xff6dd5ed)], - begin: Alignment.topLeft, - end: Alignment.bottomRight, - ), - ), - alignment: Alignment.center, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text('Wien Talks', - style: GoogleFonts.poppins( - fontSize: 42, - fontWeight: FontWeight.bold, - color: Colors.white)), - const SizedBox(height: 60), - FilledButton.icon( - onPressed: () async => await AuthService.signIn(), - style: FilledButton.styleFrom( - backgroundColor: Colors.white, - foregroundColor: Colors.black87, - padding: - const EdgeInsets.symmetric(horizontal: 24, vertical: 12), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(30)), - elevation: 6, - ), - icon: Icon( - Icons.lock, - ), - label: const Text('Sign in with Google'), - ), - ], - ), - ), - ); - } -} diff --git a/wien_talks/wien_talks_flutter/lib/screens/show_latest_news_widget.dart b/wien_talks/wien_talks_flutter/lib/screens/show_latest_news_widget.dart deleted file mode 100644 index 062b24b..0000000 --- a/wien_talks/wien_talks_flutter/lib/screens/show_latest_news_widget.dart +++ /dev/null @@ -1,132 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; -import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; -import 'package:wien_talks_client/wien_talks_client.dart'; -import 'package:wien_talks_flutter/helper/funmap_mgr.dart'; -import 'package:wien_talks_flutter/helper/location_util.dart'; -import 'package:wien_talks_flutter/helper/time_util.dart'; -import 'package:wien_talks_flutter/widgets/flamboyant_quote_card.dart'; - -class LatestQuotesScreen extends StatefulWidget { - const LatestQuotesScreen({super.key}); - - @override - State createState() => _LatestQuotesScreenState(); -} - -class _LatestQuotesScreenState extends State { - final List _quotes = []; - StreamSubscription? _sub; - - Object? _error; - - @override - void initState() { - super.initState(); - _connectStream(); - } - - @override - void dispose() { - _sub?.cancel(); - super.dispose(); - } - - void _connectStream() { - _sub?.cancel(); - _sub = FunmapMgr().client.quote.streamAllQuotes(limit: 50).listen( - (q) => setState(() => _upsert(q)), - onError: (e) => setState(() => _error = e), - onDone: () => Future.delayed(const Duration(seconds: 2), () { - if (mounted) _connectStream(); - }), - cancelOnError: false, - ); - } - - void _upsert(Quote q) { - final i = _quotes.indexWhere((x) => x.id == q.id); - if (i >= 0) { - _quotes[i] = q; - } else { - _quotes.add(q); - } - _quotes.sort((a, b) => b.createdAt.compareTo(a.createdAt)); - } - - void _sortDesc() { - _quotes.sort((a, b) => b.createdAt.compareTo(a.createdAt)); - } - - Future _vote(Quote quote, bool up) async { - final idx = _quotes.indexWhere((q) => q.id == quote.id); - if (idx < 0) return; - - final original = _quotes[idx]; - final updated = original.copyWith( - upvotes: up ? original.upvotes + 1 : original.upvotes, - downvotes: up ? original.downvotes : original.downvotes + 1, - ); - - setState(() { - _quotes[idx] = updated; - _sortDesc(); - }); - - try { - await FunmapMgr().client.quote.updateQuote(updated); - } catch (e) { - if (!mounted) return; - setState(() => _quotes[idx] = original); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text('Vote failed: $e')), - ); - } - } - - @override - Widget build(BuildContext context) { - if (_quotes.isEmpty && _error == null) { - return const Center(child: CircularProgressIndicator()); - } - if (_error != null && _quotes.isEmpty) { - return Center( - child: Padding( - padding: const EdgeInsets.all(16), - child: Text('Error: $_error'), - ), - ); - } - if (_quotes.isEmpty) { - return const Center(child: Text('Nix da. Sag halt was')); - } - - return LayoutBuilder( - builder: (context, constraints) { - return MasonryGridView.count( - crossAxisCount: 2, - mainAxisSpacing: 8, - crossAxisSpacing: 8, - padding: const EdgeInsets.fromLTRB(12, 8, 12, 12), - itemCount: _quotes.length, - itemBuilder: (context, i) { - final q = _quotes[i]; - final author = (q.authorName ?? '').trim(); - final meta = [ - if (author.isNotEmpty) author, - timeAgo(q.createdAt), - ].join(' · '); - - return FlamboyantQuoteCard( - quote: q, - meta: meta, - onVoteUp: () => _vote(q, true), - onVoteDown: () => _vote(q, false), - staticMapUrlBuilder: gStaticMap); - }, - ); - }, - ); - } -} diff --git a/wien_talks/wien_talks_flutter/lib/widgets/carousel_widget.dart b/wien_talks/wien_talks_flutter/lib/widgets/carousel_widget.dart deleted file mode 100644 index 087b75d..0000000 --- a/wien_talks/wien_talks_flutter/lib/widgets/carousel_widget.dart +++ /dev/null @@ -1,26 +0,0 @@ -import 'package:carousel_slider/carousel_slider.dart'; -import 'package:flutter/material.dart'; - -class CarouselWidget extends StatelessWidget { - const CarouselWidget({super.key}); - - @override - Widget build(BuildContext context) { - return IgnorePointer( - child: CarouselSlider( - options: CarouselOptions(height: 300.0, autoPlay: true), - items: ["houses.jpg", "kangaroos.jpg", "sightseeing.jpg", "tram.jpg", "fiaker.jpg", "falco.jpg", "wastebin.jpg"].map((i) { - return Builder( - builder: (BuildContext context) { - return Container( - width: MediaQuery.of(context).size.width, - margin: EdgeInsets.symmetric(horizontal: 5.0), - //decoration: BoxDecoration(color: Colors.amber), - child: Image(image: AssetImage("assets/funny_images/$i"))); - }, - ); - }).toList(), - ), - ); - } -} diff --git a/wien_talks/wien_talks_client/.gitignore b/wien_talks_client/.gitignore similarity index 100% rename from wien_talks/wien_talks_client/.gitignore rename to wien_talks_client/.gitignore diff --git a/wien_talks/wien_talks_client/.idea/.gitignore b/wien_talks_client/.idea/.gitignore similarity index 100% rename from wien_talks/wien_talks_client/.idea/.gitignore rename to wien_talks_client/.idea/.gitignore diff --git a/wien_talks/wien_talks_client/.idea/caches/deviceStreaming.xml b/wien_talks_client/.idea/caches/deviceStreaming.xml similarity index 100% rename from wien_talks/wien_talks_client/.idea/caches/deviceStreaming.xml rename to wien_talks_client/.idea/caches/deviceStreaming.xml diff --git a/wien_talks/wien_talks_client/.idea/misc.xml b/wien_talks_client/.idea/misc.xml similarity index 100% rename from wien_talks/wien_talks_client/.idea/misc.xml rename to wien_talks_client/.idea/misc.xml diff --git a/wien_talks/wien_talks_client/.idea/modules.xml b/wien_talks_client/.idea/modules.xml similarity index 100% rename from wien_talks/wien_talks_client/.idea/modules.xml rename to wien_talks_client/.idea/modules.xml diff --git a/wien_talks/wien_talks_client/.idea/vcs.xml b/wien_talks_client/.idea/vcs.xml similarity index 100% rename from wien_talks/wien_talks_client/.idea/vcs.xml rename to wien_talks_client/.idea/vcs.xml diff --git a/wien_talks/wien_talks_client/.idea/wien_talks_client.iml b/wien_talks_client/.idea/wien_talks_client.iml similarity index 100% rename from wien_talks/wien_talks_client/.idea/wien_talks_client.iml rename to wien_talks_client/.idea/wien_talks_client.iml diff --git a/wien_talks/wien_talks_client/CHANGELOG.md b/wien_talks_client/CHANGELOG.md similarity index 100% rename from wien_talks/wien_talks_client/CHANGELOG.md rename to wien_talks_client/CHANGELOG.md diff --git a/wien_talks/wien_talks_client/README.md b/wien_talks_client/README.md similarity index 100% rename from wien_talks/wien_talks_client/README.md rename to wien_talks_client/README.md diff --git a/wien_talks/wien_talks_client/analysis_options.yaml b/wien_talks_client/analysis_options.yaml similarity index 100% rename from wien_talks/wien_talks_client/analysis_options.yaml rename to wien_talks_client/analysis_options.yaml diff --git a/wien_talks/wien_talks_client/dartdoc_options.yaml b/wien_talks_client/dartdoc_options.yaml similarity index 100% rename from wien_talks/wien_talks_client/dartdoc_options.yaml rename to wien_talks_client/dartdoc_options.yaml diff --git a/wien_talks/wien_talks_client/doc/endpoint.md b/wien_talks_client/doc/endpoint.md similarity index 100% rename from wien_talks/wien_talks_client/doc/endpoint.md rename to wien_talks_client/doc/endpoint.md diff --git a/wien_talks/wien_talks_client/lib/src/protocol/client.dart b/wien_talks_client/lib/src/protocol/client.dart similarity index 100% rename from wien_talks/wien_talks_client/lib/src/protocol/client.dart rename to wien_talks_client/lib/src/protocol/client.dart diff --git a/wien_talks/wien_talks_client/lib/src/protocol/create_quote.dart b/wien_talks_client/lib/src/protocol/create_quote.dart similarity index 100% rename from wien_talks/wien_talks_client/lib/src/protocol/create_quote.dart rename to wien_talks_client/lib/src/protocol/create_quote.dart diff --git a/wien_talks/wien_talks_client/lib/src/protocol/health.dart b/wien_talks_client/lib/src/protocol/health.dart similarity index 100% rename from wien_talks/wien_talks_client/lib/src/protocol/health.dart rename to wien_talks_client/lib/src/protocol/health.dart diff --git a/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart b/wien_talks_client/lib/src/protocol/protocol.dart similarity index 100% rename from wien_talks/wien_talks_client/lib/src/protocol/protocol.dart rename to wien_talks_client/lib/src/protocol/protocol.dart diff --git a/wien_talks/wien_talks_client/lib/src/protocol/quote.dart b/wien_talks_client/lib/src/protocol/quote.dart similarity index 100% rename from wien_talks/wien_talks_client/lib/src/protocol/quote.dart rename to wien_talks_client/lib/src/protocol/quote.dart diff --git a/wien_talks/wien_talks_client/lib/src/protocol/vote.dart b/wien_talks_client/lib/src/protocol/vote.dart similarity index 100% rename from wien_talks/wien_talks_client/lib/src/protocol/vote.dart rename to wien_talks_client/lib/src/protocol/vote.dart diff --git a/wien_talks/wien_talks_client/lib/wien_talks_client.dart b/wien_talks_client/lib/wien_talks_client.dart similarity index 100% rename from wien_talks/wien_talks_client/lib/wien_talks_client.dart rename to wien_talks_client/lib/wien_talks_client.dart diff --git a/wien_talks/wien_talks_client/pubspec.yaml b/wien_talks_client/pubspec.yaml similarity index 100% rename from wien_talks/wien_talks_client/pubspec.yaml rename to wien_talks_client/pubspec.yaml diff --git a/wien_talks/wien_talks_flutter/.gitignore b/wien_talks_flutter/.gitignore similarity index 96% rename from wien_talks/wien_talks_flutter/.gitignore rename to wien_talks_flutter/.gitignore index 734b7b3..9b5948a 100644 --- a/wien_talks/wien_talks_flutter/.gitignore +++ b/wien_talks_flutter/.gitignore @@ -44,6 +44,7 @@ app.*.map.json /android/app/debug /android/app/profile /android/app/release +android/key.properties .env \ No newline at end of file diff --git a/wien_talks/wien_talks_flutter/.metadata b/wien_talks_flutter/.metadata similarity index 100% rename from wien_talks/wien_talks_flutter/.metadata rename to wien_talks_flutter/.metadata diff --git a/wien_talks/wien_talks_flutter/README.md b/wien_talks_flutter/README.md similarity index 100% rename from wien_talks/wien_talks_flutter/README.md rename to wien_talks_flutter/README.md diff --git a/wien_talks/wien_talks_flutter/analysis_options.yaml b/wien_talks_flutter/analysis_options.yaml similarity index 100% rename from wien_talks/wien_talks_flutter/analysis_options.yaml rename to wien_talks_flutter/analysis_options.yaml diff --git a/wien_talks/wien_talks_flutter/android/.gitignore b/wien_talks_flutter/android/.gitignore similarity index 100% rename from wien_talks/wien_talks_flutter/android/.gitignore rename to wien_talks_flutter/android/.gitignore diff --git a/wien_talks_flutter/android/app/build.gradle.kts b/wien_talks_flutter/android/app/build.gradle.kts new file mode 100644 index 0000000..22acb25 --- /dev/null +++ b/wien_talks_flutter/android/app/build.gradle.kts @@ -0,0 +1,72 @@ +import java.util.Properties +import java.io.FileInputStream + +plugins { + id("com.android.application") + id("kotlin-android") + id("dev.flutter.flutter-gradle-plugin") +} + + +dependencies { + implementation("com.google.android.play:core:1.10.3") +} + +val keystoreProperties = Properties() +val keystorePropertiesFile = rootProject.file("key.properties") +if (keystorePropertiesFile.exists()) { + FileInputStream(keystorePropertiesFile).use { keystoreProperties.load(it) } +} + +android { + namespace = "com.wien_talks" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + kotlinOptions { jvmTarget = "17" } + + signingConfigs { + if (keystorePropertiesFile.exists()) { + create("release") { + keyAlias = keystoreProperties["keyAlias"] as String + keyPassword = keystoreProperties["keyPassword"] as String + val storePath = keystoreProperties["storeFile"] as String? + storeFile = storePath?.let { file(it) } + storePassword = keystoreProperties["storePassword"] as String + } + } + } + + defaultConfig { + applicationId = "com.wien_talks" + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + signingConfig = signingConfigs.findByName("release") + ?: signingConfigs.getByName("debug") + + isMinifyEnabled = true + isShrinkResources = true + + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + debug { + } + } +} + +flutter { + source = "../.." +} diff --git a/wien_talks_flutter/android/app/proguard-rules.pro b/wien_talks_flutter/android/app/proguard-rules.pro new file mode 100644 index 0000000..e2119a7 --- /dev/null +++ b/wien_talks_flutter/android/app/proguard-rules.pro @@ -0,0 +1,8 @@ +-keep class io.flutter.embedding.** { *; } +-keep class io.flutter.plugins.** { *; } +-keep class io.flutter.** { *; } + +-keep class com.google.android.gms.** { *; } +-dontwarn com.google.android.gms.** + +-dontwarn kotlinx.coroutines.** \ No newline at end of file diff --git a/wien_talks/wien_talks_flutter/android/app/src/debug/AndroidManifest.xml b/wien_talks_flutter/android/app/src/debug/AndroidManifest.xml similarity index 100% rename from wien_talks/wien_talks_flutter/android/app/src/debug/AndroidManifest.xml rename to wien_talks_flutter/android/app/src/debug/AndroidManifest.xml diff --git a/wien_talks/wien_talks_flutter/android/app/src/main/AndroidManifest.xml b/wien_talks_flutter/android/app/src/main/AndroidManifest.xml similarity index 100% rename from wien_talks/wien_talks_flutter/android/app/src/main/AndroidManifest.xml rename to wien_talks_flutter/android/app/src/main/AndroidManifest.xml diff --git a/wien_talks/wien_talks_flutter/android/app/src/main/kotlin/com/example/wien_talks_flutter/MainActivity.kt b/wien_talks_flutter/android/app/src/main/kotlin/com/example/wien_talks_flutter/MainActivity.kt similarity index 100% rename from wien_talks/wien_talks_flutter/android/app/src/main/kotlin/com/example/wien_talks_flutter/MainActivity.kt rename to wien_talks_flutter/android/app/src/main/kotlin/com/example/wien_talks_flutter/MainActivity.kt diff --git a/wien_talks/wien_talks_flutter/android/app/src/main/res/drawable-v21/launch_background.xml b/wien_talks_flutter/android/app/src/main/res/drawable-v21/launch_background.xml similarity index 100% rename from wien_talks/wien_talks_flutter/android/app/src/main/res/drawable-v21/launch_background.xml rename to wien_talks_flutter/android/app/src/main/res/drawable-v21/launch_background.xml diff --git a/wien_talks/wien_talks_flutter/android/app/src/main/res/drawable/launch_background.xml b/wien_talks_flutter/android/app/src/main/res/drawable/launch_background.xml similarity index 100% rename from wien_talks/wien_talks_flutter/android/app/src/main/res/drawable/launch_background.xml rename to wien_talks_flutter/android/app/src/main/res/drawable/launch_background.xml diff --git a/wien_talks/wien_talks_flutter/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/wien_talks_flutter/android/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from wien_talks/wien_talks_flutter/android/app/src/main/res/mipmap-hdpi/ic_launcher.png rename to wien_talks_flutter/android/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/wien_talks/wien_talks_flutter/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/wien_talks_flutter/android/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from wien_talks/wien_talks_flutter/android/app/src/main/res/mipmap-mdpi/ic_launcher.png rename to wien_talks_flutter/android/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/wien_talks/wien_talks_flutter/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/wien_talks_flutter/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from wien_talks/wien_talks_flutter/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to wien_talks_flutter/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/wien_talks/wien_talks_flutter/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/wien_talks_flutter/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from wien_talks/wien_talks_flutter/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to wien_talks_flutter/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/wien_talks/wien_talks_flutter/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/wien_talks_flutter/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from wien_talks/wien_talks_flutter/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to wien_talks_flutter/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/wien_talks/wien_talks_flutter/android/app/src/main/res/values-night/styles.xml b/wien_talks_flutter/android/app/src/main/res/values-night/styles.xml similarity index 100% rename from wien_talks/wien_talks_flutter/android/app/src/main/res/values-night/styles.xml rename to wien_talks_flutter/android/app/src/main/res/values-night/styles.xml diff --git a/wien_talks/wien_talks_flutter/android/app/src/main/res/values/styles.xml b/wien_talks_flutter/android/app/src/main/res/values/styles.xml similarity index 100% rename from wien_talks/wien_talks_flutter/android/app/src/main/res/values/styles.xml rename to wien_talks_flutter/android/app/src/main/res/values/styles.xml diff --git a/wien_talks/wien_talks_flutter/android/app/src/profile/AndroidManifest.xml b/wien_talks_flutter/android/app/src/profile/AndroidManifest.xml similarity index 100% rename from wien_talks/wien_talks_flutter/android/app/src/profile/AndroidManifest.xml rename to wien_talks_flutter/android/app/src/profile/AndroidManifest.xml diff --git a/wien_talks/wien_talks_flutter/android/build.gradle.kts b/wien_talks_flutter/android/build.gradle.kts similarity index 100% rename from wien_talks/wien_talks_flutter/android/build.gradle.kts rename to wien_talks_flutter/android/build.gradle.kts diff --git a/wien_talks/wien_talks_flutter/android/gradle.properties b/wien_talks_flutter/android/gradle.properties similarity index 100% rename from wien_talks/wien_talks_flutter/android/gradle.properties rename to wien_talks_flutter/android/gradle.properties diff --git a/wien_talks/wien_talks_flutter/android/gradle/wrapper/gradle-wrapper.properties b/wien_talks_flutter/android/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from wien_talks/wien_talks_flutter/android/gradle/wrapper/gradle-wrapper.properties rename to wien_talks_flutter/android/gradle/wrapper/gradle-wrapper.properties diff --git a/wien_talks/wien_talks_flutter/android/settings.gradle.kts b/wien_talks_flutter/android/settings.gradle.kts similarity index 100% rename from wien_talks/wien_talks_flutter/android/settings.gradle.kts rename to wien_talks_flutter/android/settings.gradle.kts diff --git a/wien_talks/wien_talks_flutter/assets/funny_images/falco.jpg b/wien_talks_flutter/assets/funny_images/falco.jpg similarity index 100% rename from wien_talks/wien_talks_flutter/assets/funny_images/falco.jpg rename to wien_talks_flutter/assets/funny_images/falco.jpg diff --git a/wien_talks/wien_talks_flutter/assets/funny_images/fiaker.jpg b/wien_talks_flutter/assets/funny_images/fiaker.jpg similarity index 100% rename from wien_talks/wien_talks_flutter/assets/funny_images/fiaker.jpg rename to wien_talks_flutter/assets/funny_images/fiaker.jpg diff --git a/wien_talks/wien_talks_flutter/assets/funny_images/houses.jpg b/wien_talks_flutter/assets/funny_images/houses.jpg similarity index 100% rename from wien_talks/wien_talks_flutter/assets/funny_images/houses.jpg rename to wien_talks_flutter/assets/funny_images/houses.jpg diff --git a/wien_talks/wien_talks_flutter/assets/funny_images/kangaroos.jpg b/wien_talks_flutter/assets/funny_images/kangaroos.jpg similarity index 100% rename from wien_talks/wien_talks_flutter/assets/funny_images/kangaroos.jpg rename to wien_talks_flutter/assets/funny_images/kangaroos.jpg diff --git a/wien_talks/wien_talks_flutter/assets/funny_images/sightseeing.jpg b/wien_talks_flutter/assets/funny_images/sightseeing.jpg similarity index 100% rename from wien_talks/wien_talks_flutter/assets/funny_images/sightseeing.jpg rename to wien_talks_flutter/assets/funny_images/sightseeing.jpg diff --git a/wien_talks/wien_talks_flutter/assets/funny_images/tram.jpg b/wien_talks_flutter/assets/funny_images/tram.jpg similarity index 100% rename from wien_talks/wien_talks_flutter/assets/funny_images/tram.jpg rename to wien_talks_flutter/assets/funny_images/tram.jpg diff --git a/wien_talks/wien_talks_flutter/assets/funny_images/wastebin.jpg b/wien_talks_flutter/assets/funny_images/wastebin.jpg similarity index 100% rename from wien_talks/wien_talks_flutter/assets/funny_images/wastebin.jpg rename to wien_talks_flutter/assets/funny_images/wastebin.jpg diff --git a/wien_talks/wien_talks_flutter/assets/render_themes/defaultrender.xml b/wien_talks_flutter/assets/render_themes/defaultrender.xml similarity index 100% rename from wien_talks/wien_talks_flutter/assets/render_themes/defaultrender.xml rename to wien_talks_flutter/assets/render_themes/defaultrender.xml diff --git a/wien_talks/wien_talks_flutter/devtools_options.yaml b/wien_talks_flutter/devtools_options.yaml similarity index 100% rename from wien_talks/wien_talks_flutter/devtools_options.yaml rename to wien_talks_flutter/devtools_options.yaml diff --git a/wien_talks/wien_talks_flutter/ios/.gitignore b/wien_talks_flutter/ios/.gitignore similarity index 100% rename from wien_talks/wien_talks_flutter/ios/.gitignore rename to wien_talks_flutter/ios/.gitignore diff --git a/wien_talks/wien_talks_flutter/ios/Flutter/AppFrameworkInfo.plist b/wien_talks_flutter/ios/Flutter/AppFrameworkInfo.plist similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Flutter/AppFrameworkInfo.plist rename to wien_talks_flutter/ios/Flutter/AppFrameworkInfo.plist diff --git a/wien_talks/wien_talks_flutter/ios/Flutter/Debug.xcconfig b/wien_talks_flutter/ios/Flutter/Debug.xcconfig similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Flutter/Debug.xcconfig rename to wien_talks_flutter/ios/Flutter/Debug.xcconfig diff --git a/wien_talks/wien_talks_flutter/ios/Flutter/Release.xcconfig b/wien_talks_flutter/ios/Flutter/Release.xcconfig similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Flutter/Release.xcconfig rename to wien_talks_flutter/ios/Flutter/Release.xcconfig diff --git a/wien_talks/wien_talks_flutter/ios/Runner.xcodeproj/project.pbxproj b/wien_talks_flutter/ios/Runner.xcodeproj/project.pbxproj similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner.xcodeproj/project.pbxproj rename to wien_talks_flutter/ios/Runner.xcodeproj/project.pbxproj diff --git a/wien_talks/wien_talks_flutter/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/wien_talks_flutter/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to wien_talks_flutter/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/wien_talks/wien_talks_flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/wien_talks_flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to wien_talks_flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/wien_talks/wien_talks_flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/wien_talks_flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to wien_talks_flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/wien_talks/wien_talks_flutter/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/wien_talks_flutter/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to wien_talks_flutter/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/wien_talks/wien_talks_flutter/ios/Runner.xcworkspace/contents.xcworkspacedata b/wien_talks_flutter/ios/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner.xcworkspace/contents.xcworkspacedata rename to wien_talks_flutter/ios/Runner.xcworkspace/contents.xcworkspacedata diff --git a/wien_talks/wien_talks_flutter/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/wien_talks_flutter/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to wien_talks_flutter/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/wien_talks/wien_talks_flutter/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/wien_talks_flutter/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to wien_talks_flutter/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/wien_talks/wien_talks_flutter/ios/Runner/AppDelegate.swift b/wien_talks_flutter/ios/Runner/AppDelegate.swift similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner/AppDelegate.swift rename to wien_talks_flutter/ios/Runner/AppDelegate.swift diff --git a/wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png rename to wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png diff --git a/wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png rename to wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png diff --git a/wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png rename to wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png diff --git a/wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png rename to wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png diff --git a/wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png rename to wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png diff --git a/wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png rename to wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png diff --git a/wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png rename to wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png diff --git a/wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png rename to wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png diff --git a/wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png rename to wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png diff --git a/wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png rename to wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png diff --git a/wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png rename to wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png diff --git a/wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png rename to wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png diff --git a/wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png rename to wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png diff --git a/wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png rename to wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png diff --git a/wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png rename to wien_talks_flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png diff --git a/wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/wien_talks_flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json rename to wien_talks_flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json diff --git a/wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/wien_talks_flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png rename to wien_talks_flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png diff --git a/wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/wien_talks_flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png rename to wien_talks_flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png diff --git a/wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/wien_talks_flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png rename to wien_talks_flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png diff --git a/wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/wien_talks_flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md rename to wien_talks_flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md diff --git a/wien_talks/wien_talks_flutter/ios/Runner/Base.lproj/LaunchScreen.storyboard b/wien_talks_flutter/ios/Runner/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner/Base.lproj/LaunchScreen.storyboard rename to wien_talks_flutter/ios/Runner/Base.lproj/LaunchScreen.storyboard diff --git a/wien_talks/wien_talks_flutter/ios/Runner/Base.lproj/Main.storyboard b/wien_talks_flutter/ios/Runner/Base.lproj/Main.storyboard similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner/Base.lproj/Main.storyboard rename to wien_talks_flutter/ios/Runner/Base.lproj/Main.storyboard diff --git a/wien_talks/wien_talks_flutter/ios/Runner/Info.plist b/wien_talks_flutter/ios/Runner/Info.plist similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner/Info.plist rename to wien_talks_flutter/ios/Runner/Info.plist diff --git a/wien_talks/wien_talks_flutter/ios/Runner/Runner-Bridging-Header.h b/wien_talks_flutter/ios/Runner/Runner-Bridging-Header.h similarity index 100% rename from wien_talks/wien_talks_flutter/ios/Runner/Runner-Bridging-Header.h rename to wien_talks_flutter/ios/Runner/Runner-Bridging-Header.h diff --git a/wien_talks/wien_talks_flutter/ios/RunnerTests/RunnerTests.swift b/wien_talks_flutter/ios/RunnerTests/RunnerTests.swift similarity index 100% rename from wien_talks/wien_talks_flutter/ios/RunnerTests/RunnerTests.swift rename to wien_talks_flutter/ios/RunnerTests/RunnerTests.swift diff --git a/wien_talks/wien_talks_flutter/lib/helper/auth_service.dart b/wien_talks_flutter/lib/helper/auth_service.dart similarity index 100% rename from wien_talks/wien_talks_flutter/lib/helper/auth_service.dart rename to wien_talks_flutter/lib/helper/auth_service.dart diff --git a/wien_talks/wien_talks_flutter/lib/helper/funmap_mgr.dart b/wien_talks_flutter/lib/helper/funmap_mgr.dart similarity index 90% rename from wien_talks/wien_talks_flutter/lib/helper/funmap_mgr.dart rename to wien_talks_flutter/lib/helper/funmap_mgr.dart index 846e1ad..c39639d 100644 --- a/wien_talks/wien_talks_flutter/lib/helper/funmap_mgr.dart +++ b/wien_talks_flutter/lib/helper/funmap_mgr.dart @@ -26,8 +26,9 @@ class FunmapMgr { // E.g. `flutter run --dart-define=SERVER_URL=https://api.example.com/` const serverUrlFromEnv = String.fromEnvironment('SERVER_URL'); - serverUrl = - serverUrlFromEnv.isEmpty ? 'http://$localhost:8080/' : serverUrlFromEnv; + serverUrl = serverUrlFromEnv.isEmpty + ? 'https://wien-talks-api.aequito.sh/' + : serverUrlFromEnv; client = Client(serverUrl, connectionTimeout: const Duration(seconds: 2)) ..connectivityMonitor = FlutterConnectivityMonitor(); diff --git a/wien_talks_flutter/lib/helper/go_router.dart b/wien_talks_flutter/lib/helper/go_router.dart new file mode 100644 index 0000000..2266340 --- /dev/null +++ b/wien_talks_flutter/lib/helper/go_router.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:wien_talks_client/wien_talks_client.dart'; +import 'package:wien_talks_flutter/screens/create_event_screen.dart'; +import 'package:wien_talks_flutter/screens/news_screen.dart'; + +double? _qpDouble(GoRouterState s, String key) { + final v = s.uri.queryParameters[key]; + return v == null || v.isEmpty ? null : double.tryParse(v); +} + +final router = GoRouter( + initialLocation: '/', + routes: [ + GoRoute( + path: '/', + name: 'news', + builder: (c, s) => NewsScreen(), + ), + GoRoute( + path: '/create_event', + name: 'create_event', + pageBuilder: (c, s) { + final quote = s.extra as Quote?; + final lat = _qpDouble(s, 'lat'); + final lon = _qpDouble(s, 'lon'); + + return CustomTransitionPage( + key: s.pageKey, + child: CreateEventScreen( + contextQuote: quote, + initialLat: lat, + initialLon: lon, + ), + transitionsBuilder: (context, anim, secAnim, child) { + final curve = + CurvedAnimation(parent: anim, curve: Curves.easeOutCubic); + return FadeTransition( + opacity: curve, + child: SlideTransition( + position: Tween(begin: const Offset(0, 0.08), end: Offset.zero) + .animate(curve), + child: child, + ), + ); + }, + ); + }, + ), + ], +); diff --git a/wien_talks_flutter/lib/helper/location_filter.dart b/wien_talks_flutter/lib/helper/location_filter.dart new file mode 100644 index 0000000..f523921 --- /dev/null +++ b/wien_talks_flutter/lib/helper/location_filter.dart @@ -0,0 +1,28 @@ +import 'dart:math' as math; + +class LocationFilter { + final double centerLat; + final double centerLon; + final double radiusMeters; + const LocationFilter({ + required this.centerLat, + required this.centerLon, + required this.radiusMeters, + }); + + bool contains(double lat, double lon) => + _haversineMeters(centerLat, centerLon, lat, lon) <= radiusMeters; + + static double _haversineMeters( + double lat1, double lon1, double lat2, double lon2) { + const R = 6371000.0; + final dLat = (lat2 - lat1) * (math.pi / 180.0); + final dLon = (lon2 - lon1) * (math.pi / 180.0); + final a = math.sin(dLat / 2) * math.sin(dLat / 2) + + math.cos(lat1 * (math.pi / 180.0)) * + math.cos(lat2 * (math.pi / 180.0)) * + math.sin(dLon / 2) * + math.sin(dLon / 2); + return R * 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)); + } +} diff --git a/wien_talks_flutter/lib/helper/location_filter_controller.dart b/wien_talks_flutter/lib/helper/location_filter_controller.dart new file mode 100644 index 0000000..f188986 --- /dev/null +++ b/wien_talks_flutter/lib/helper/location_filter_controller.dart @@ -0,0 +1,12 @@ +import 'package:flutter/foundation.dart'; + +import 'location_filter.dart'; + +class FilterController extends ValueNotifier { + FilterController([super.initial]); + void clear() => value = null; + void setLocation(double lat, double lon, double radiusMeters) { + value = LocationFilter( + centerLat: lat, centerLon: lon, radiusMeters: radiusMeters); + } +} diff --git a/wien_talks/wien_talks_flutter/lib/helper/location_mgr.dart b/wien_talks_flutter/lib/helper/location_mgr.dart similarity index 100% rename from wien_talks/wien_talks_flutter/lib/helper/location_mgr.dart rename to wien_talks_flutter/lib/helper/location_mgr.dart diff --git a/wien_talks/wien_talks_flutter/lib/helper/location_util.dart b/wien_talks_flutter/lib/helper/location_util.dart similarity index 100% rename from wien_talks/wien_talks_flutter/lib/helper/location_util.dart rename to wien_talks_flutter/lib/helper/location_util.dart diff --git a/wien_talks/wien_talks_flutter/lib/helper/time_util.dart b/wien_talks_flutter/lib/helper/time_util.dart similarity index 100% rename from wien_talks/wien_talks_flutter/lib/helper/time_util.dart rename to wien_talks_flutter/lib/helper/time_util.dart diff --git a/wien_talks/wien_talks_flutter/lib/main.dart b/wien_talks_flutter/lib/main.dart similarity index 84% rename from wien_talks/wien_talks_flutter/lib/main.dart rename to wien_talks_flutter/lib/main.dart index 1f585ca..00d95ca 100644 --- a/wien_talks/wien_talks_flutter/lib/main.dart +++ b/wien_talks_flutter/lib/main.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:wien_talks_flutter/helper/go_router.dart'; +import 'package:wien_talks_flutter/theme.dart'; Future main() async { await dotenv.load(fileName: '.env'); @@ -14,7 +15,7 @@ class MyApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp.router( title: 'Wien Talks', - theme: ThemeData(primarySwatch: Colors.green), + theme: GemeindeBauTheme.light(), routerConfig: router, ); } diff --git a/wien_talks/wien_talks_flutter/lib/models/news_event_model.dart b/wien_talks_flutter/lib/models/news_event_model.dart similarity index 100% rename from wien_talks/wien_talks_flutter/lib/models/news_event_model.dart rename to wien_talks_flutter/lib/models/news_event_model.dart diff --git a/wien_talks_flutter/lib/screens/create_event_screen.dart b/wien_talks_flutter/lib/screens/create_event_screen.dart new file mode 100644 index 0000000..a0695c6 --- /dev/null +++ b/wien_talks_flutter/lib/screens/create_event_screen.dart @@ -0,0 +1,195 @@ +import 'package:flutter/material.dart'; +import 'package:location/location.dart'; +import 'package:wien_talks_client/wien_talks_client.dart'; +import 'package:wien_talks_flutter/helper/funmap_mgr.dart'; +import 'package:wien_talks_flutter/widgets/carousel_widget.dart'; +import 'package:wien_talks_flutter/widgets/get_location_widget.dart'; +import 'package:wien_talks_flutter/widgets/mapfile_widget.dart'; +import 'package:wien_talks_flutter/widgets/news_input_form.dart'; +import 'package:wien_talks_flutter/widgets/screen_widget.dart'; + +class CreateEventScreen extends StatefulWidget { + const CreateEventScreen({ + super.key, + this.contextQuote, + this.initialLat, + this.initialLon, + }); + + final Quote? contextQuote; + final double? initialLat; + final double? initialLon; + + @override + State createState() => _CreateEventScreenState(); +} + +class _CreateEventScreenState extends State { + double? _lat; + double? _lon; + bool _submitting = false; + + @override + void initState() { + super.initState(); + _lat = widget.contextQuote?.lat ?? widget.initialLat; + _lon = widget.contextQuote?.long ?? widget.initialLon; + } + + Future _useMyLocation() async { + try { + final loc = await Location().getLocation(); + if (!mounted) return; + setState(() { + _lat = loc.latitude; + _lon = loc.longitude; + }); + } catch (_) { + if (!mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Couldn`’t get your location.')), + ); + } + } + + Future _submit(CreateQuoteRequest req) async { + final lat = _lat ?? widget.contextQuote?.lat; + final lon = _lon ?? widget.contextQuote?.long; + + if (lat == null || lon == null) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text(' location first.')), + ); + return; + } + + final toSend = CreateQuoteRequest( + text: req.text, + authorName: req.authorName, + lat: lat, + lng: lon, + ); + + setState(() => _submitting = true); + try { + await FunmapMgr().client.quote.createQuote(toSend); + if (!mounted) { + return; + } + + Navigator.pop(context); + } catch (e) { + if (!mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Posting failed: $e')), + ); + } finally { + if (mounted) setState(() => _submitting = false); + } + } + + @override + Widget build(BuildContext context) { + final hasContextQuote = widget.contextQuote != null; + final quote = widget.contextQuote; + + return ScreenWidget( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + if (hasContextQuote) ...[ + Card( + margin: const EdgeInsets.fromLTRB(12, 12, 12, 6), + child: Padding( + padding: const EdgeInsets.all(12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(quote!.text, + style: Theme.of(context).textTheme.bodyLarge), + const SizedBox(height: 6), + Text( + [ + if ((quote.authorName ?? '').trim().isNotEmpty) + quote.authorName!.trim() + ].join(' · '), + style: Theme.of(context).textTheme.labelMedium, + ), + ], + ), + ), + ), + ], + Padding( + padding: const EdgeInsets.fromLTRB(12, 8, 12, 4), + child: Row( + children: [ + Expanded( + child: Text( + _lat != null && _lon != null + ? 'Location: ${_lat!.toStringAsFixed(5)}, ${_lon!.toStringAsFixed(5)}' + : 'Pick an alt location', + style: Theme.of(context).textTheme.labelMedium, + ), + ), + const SizedBox(width: 8), + FilledButton.icon( + onPressed: _useMyLocation, + icon: const Icon(Icons.my_location, size: 18), + label: const Text('My location'), + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.fromLTRB(12, 4, 12, 8), + child: NewsInputForm( + // enabled: !_submitting, + onSubmit: _submit, + ), + ), + Expanded( + child: Stack( + children: [ + GetLocationWidget( + child: MapfileWidget(), + ), + Positioned( + left: 0, + right: 0, + bottom: 0, + child: LocationCarousel( + suggestions: [ + if (widget.contextQuote?.lat != null && + widget.contextQuote?.long != null) + LocationSuggestion( + label: 'Quote location', + lat: widget.contextQuote!.lat, + lon: widget.contextQuote!.long, + assetImage: 'assets/funny_images/tram.jpg', + ), + const LocationSuggestion( + label: 'Stephansplatz', + lat: 48.2085, + lon: 16.3731, + assetImage: 'assets/funny_images/sightseeing.jpg'), + const LocationSuggestion( + label: 'Naschmarkt', + lat: 48.1970, + lon: 16.3615, + assetImage: 'assets/funny_images/houses.jpg'), + ], + onPick: (lat, lon) => setState(() { + _lat = lat; + _lon = lon; + }), + ), + ), + ], + ), + ), + ], + ), + ); + } +} diff --git a/wien_talks/wien_talks_flutter/lib/screens/home_screen.dart b/wien_talks_flutter/lib/screens/home_screen.dart similarity index 92% rename from wien_talks/wien_talks_flutter/lib/screens/home_screen.dart rename to wien_talks_flutter/lib/screens/home_screen.dart index 7b56d8d..7cbbfc6 100644 --- a/wien_talks/wien_talks_flutter/lib/screens/home_screen.dart +++ b/wien_talks_flutter/lib/screens/home_screen.dart @@ -1,12 +1,10 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:wien_talks_flutter/helper/funmap_mgr.dart'; -import 'package:wien_talks_flutter/screens/show_latest_news_widget.dart'; +import 'package:wien_talks_flutter/screens/latest_quotes_screen.dart'; import 'package:wien_talks_flutter/widgets/intro_text_widget.dart'; import 'package:wien_talks_flutter/widgets/screen_widget.dart'; -import '../widgets/carousel_widget.dart'; - class HomeScreen extends StatelessWidget { const HomeScreen({ super.key, @@ -43,7 +41,6 @@ class HomeScreen extends StatelessWidget { SizedBox( height: 30, ), - CarouselWidget(), Row( children: [ Spacer(), diff --git a/wien_talks_flutter/lib/screens/latest_quotes_screen.dart b/wien_talks_flutter/lib/screens/latest_quotes_screen.dart new file mode 100644 index 0000000..ca63f40 --- /dev/null +++ b/wien_talks_flutter/lib/screens/latest_quotes_screen.dart @@ -0,0 +1,230 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; +import 'package:go_router/go_router.dart'; +import 'package:wien_talks_client/wien_talks_client.dart'; +import 'package:wien_talks_flutter/helper/funmap_mgr.dart'; +import 'package:wien_talks_flutter/helper/location_filter.dart'; +import 'package:wien_talks_flutter/helper/location_util.dart'; +import 'package:wien_talks_flutter/helper/time_util.dart'; +import 'package:wien_talks_flutter/widgets/filter_chips_bar.dart'; +import 'package:wien_talks_flutter/widgets/filter_overlay.dart'; +import 'package:wien_talks_flutter/widgets/flamboyant_quote_card.dart'; + +class LatestQuotesScreen extends StatefulWidget { + const LatestQuotesScreen({super.key}); + + @override + State createState() => _LatestQuotesScreenState(); +} + +class _LatestQuotesScreenState extends State { + final List _quotes = []; + StreamSubscription? _sub; + LocationFilter? _locationFilter; + String _sort = 'new'; + bool _today = false; + bool _nearby = false; + Object? _error; + + @override + void initState() { + super.initState(); + _connectStream(); + } + + @override + void dispose() { + _sub?.cancel(); + super.dispose(); + } + + void _connectStream() { + _sub?.cancel(); + _sub = FunmapMgr().client.quote.streamAllQuotes(limit: 50).listen( + (q) => setState(() => _upsert(q)), + onError: (e) => setState(() => _error = e), + onDone: () => Future.delayed(const Duration(seconds: 2), () { + if (mounted) _connectStream(); + }), + cancelOnError: false, + ); + } + + void _upsert(Quote q) { + final i = _quotes.indexWhere((x) => x.id == q.id); + if (i >= 0) { + _quotes[i] = q; + } else { + _quotes.add(q); + } + _applyFilters(); + } + + Future _vote(Quote quote, bool up) async { + final idx = _quotes.indexWhere((q) => q.id == quote.id); + if (idx < 0) return; + + final original = _quotes[idx]; + final updated = original.copyWith( + upvotes: up ? original.upvotes + 1 : original.upvotes, + downvotes: up ? original.downvotes : original.downvotes + 1, + ); + + setState(() { + _quotes[idx] = updated; + }); + + try { + await FunmapMgr().client.quote.updateQuote(updated); + } catch (e) { + if (!mounted) return; + setState(() => _quotes[idx] = original); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Vote failed: $e')), + ); + } + } + + List get _view { + final now = DateTime.now(); + + bool isToday(DateTime t) { + final lt = t.toLocal(); + final ln = now.toLocal(); + return lt.year == ln.year && lt.month == ln.month && lt.day == ln.day; + } + + Iterable it = _quotes; + + if (_today) { + it = it.where((q) => isToday(q.createdAt)); + } + if (_nearby && _locationFilter != null) { + final f = _locationFilter!; + it = it.where((q) => f.contains(q.lat, q.long)); + } + + final list = it.toList() + ..sort((a, b) { + if (_sort == 'top') { + final as = (a.upvotes - a.downvotes); + final bs = (b.upvotes - b.downvotes); + final cmp = bs.compareTo(as); + if (cmp != 0) return cmp; + } + return b.createdAt.compareTo(a.createdAt); + }); + + return list; + } + + Future _pickLocationFilter() async { + final picked = await showModalBottomSheet( + context: context, + isScrollControlled: true, + builder: (_) => LocationFilterSheet(current: _locationFilter), + ); + if (picked != null) { + setState(() { + _locationFilter = picked; + _nearby = true; + }); + _applyFilters(); + } + } + + void _applyFilters() => setState(() {}); + + void _clearFilters() { + setState(() { + _today = false; + _nearby = false; + _locationFilter = null; + }); + _applyFilters(); + } + + @override + Widget build(BuildContext context) { + if (_quotes.isEmpty && _error == null) { + return const Center(child: CircularProgressIndicator()); + } + if (_error != null && _quotes.isEmpty) { + return Center( + child: Padding( + padding: const EdgeInsets.all(16), + child: Text('Error: $_error'), + ), + ); + } + if (_quotes.isEmpty) { + return const Center(child: Text('Nix da. Sag halt was')); + } + return CustomScrollView( + slivers: [ + SliverAppBar( + automaticallyImplyLeading: false, + pinned: false, + floating: false, + toolbarHeight: 56, + titleSpacing: 12, + title: FilterChipsBar( + sort: _sort, + today: _today, + nearby: _nearby, + onSortChanged: (s) { + setState(() => _sort = s); + _applyFilters(); + }, + onTodayChanged: (v) { + setState(() => _today = v); + _applyFilters(); + }, + onNearbyPressed: _pickLocationFilter, + onClear: (_today || _nearby) ? _clearFilters : null, + ), + elevation: 4, + ), + SliverPadding( + padding: const EdgeInsets.fromLTRB(12, 8, 12, 12), + sliver: SliverMasonryGrid.count( + crossAxisCount: 2, + mainAxisSpacing: 8, + crossAxisSpacing: 8, + childCount: _view.length, + itemBuilder: (context, i) { + final q = _view[i]; + final author = (q.authorName ?? '').trim(); + final meta = [ + if (author.isNotEmpty) author, + timeAgo(q.createdAt), + ].join(' · '); + return FlamboyantQuoteCard( + quote: q, + meta: meta, + onVoteUp: () async { + await _vote(q, true); + _applyFilters(); + }, + onVoteDown: () async { + await _vote(q, false); + _applyFilters(); + }, + staticMapUrlBuilder: gStaticMap, + onTap: () => context.pushNamed( + 'create_event', + extra: q, + queryParameters: { + 'lat': q.lat.toString(), + 'lon': q.long.toString(), + }, + ), + ); + }, + )), + ], + ); + } +} diff --git a/wien_talks/wien_talks_flutter/lib/screens/news_screen.dart b/wien_talks_flutter/lib/screens/news_screen.dart similarity index 91% rename from wien_talks/wien_talks_flutter/lib/screens/news_screen.dart rename to wien_talks_flutter/lib/screens/news_screen.dart index 79d2c14..5a7ea23 100644 --- a/wien_talks/wien_talks_flutter/lib/screens/news_screen.dart +++ b/wien_talks_flutter/lib/screens/news_screen.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:wien_talks_flutter/screens/show_latest_news_widget.dart'; +import 'package:wien_talks_flutter/screens/latest_quotes_screen.dart'; import 'package:wien_talks_flutter/widgets/heading_text.dart'; import 'package:wien_talks_flutter/widgets/screen_widget.dart'; diff --git a/wien_talks_flutter/lib/theme.dart b/wien_talks_flutter/lib/theme.dart new file mode 100644 index 0000000..80dcb07 --- /dev/null +++ b/wien_talks_flutter/lib/theme.dart @@ -0,0 +1,79 @@ +import 'package:flutter/material.dart'; + +class GemeindeBauTheme { + static const _brand = Color(0xFFE20613); + static const _accent = Color(0xFF009640); + static const _radius = 14.0; + + static ThemeData light() => _base( + ColorScheme.fromSeed( + seedColor: _brand, + brightness: Brightness.light, + ).copyWith( + secondary: _accent, + ), + ); + + static ThemeData _base( + ColorScheme scheme, + ) { + return ThemeData( + useMaterial3: true, + colorScheme: scheme, + scaffoldBackgroundColor: scheme.surface, + appBarTheme: AppBarTheme( + backgroundColor: scheme.surface, + foregroundColor: scheme.onSurface, + elevation: 0.5, + // surfaceTintColor: Colors.transparent, + centerTitle: false, + ), + bottomSheetTheme: BottomSheetThemeData( + backgroundColor: scheme.surface, + shape: RoundedRectangleBorder( + borderRadius: + const BorderRadius.vertical(top: Radius.circular(_radius)), + ), + ), + floatingActionButtonTheme: FloatingActionButtonThemeData( + backgroundColor: scheme.primary, + foregroundColor: scheme.onPrimary, + elevation: 3, + shape: const StadiumBorder(), + ), + inputDecorationTheme: InputDecorationTheme( + filled: true, + fillColor: scheme.surfaceContainerHighest, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: scheme.outlineVariant), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: scheme.outlineVariant), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: scheme.primary, width: 2), + ), + contentPadding: + const EdgeInsets.symmetric(horizontal: 12, vertical: 10), + ), + listTileTheme: ListTileThemeData( + iconColor: scheme.onSurfaceVariant, + textColor: scheme.onSurface, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), + snackBarTheme: SnackBarThemeData( + backgroundColor: scheme.inverseSurface, + contentTextStyle: TextStyle(color: scheme.onInverseSurface), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), + dividerColor: scheme.outlineVariant, + ); + } +} diff --git a/wien_talks/wien_talks_flutter/lib/widgets/add_quote_fab.dart b/wien_talks_flutter/lib/widgets/add_quote_fab.dart similarity index 100% rename from wien_talks/wien_talks_flutter/lib/widgets/add_quote_fab.dart rename to wien_talks_flutter/lib/widgets/add_quote_fab.dart diff --git a/wien_talks/wien_talks_flutter/lib/widgets/card_contenty.dart b/wien_talks_flutter/lib/widgets/card_contenty.dart similarity index 100% rename from wien_talks/wien_talks_flutter/lib/widgets/card_contenty.dart rename to wien_talks_flutter/lib/widgets/card_contenty.dart diff --git a/wien_talks_flutter/lib/widgets/carousel_widget.dart b/wien_talks_flutter/lib/widgets/carousel_widget.dart new file mode 100644 index 0000000..5b383a4 --- /dev/null +++ b/wien_talks_flutter/lib/widgets/carousel_widget.dart @@ -0,0 +1,111 @@ +import 'package:carousel_slider/carousel_slider.dart'; +import 'package:flutter/material.dart'; + +class LocationSuggestion { + final String label; + final double lat; + final double lon; + final String? subtitle; + final String? assetImage; + const LocationSuggestion({ + required this.label, + required this.lat, + required this.lon, + this.subtitle, + this.assetImage, + }); +} + +class LocationCarousel extends StatelessWidget { + const LocationCarousel({ + super.key, + required this.suggestions, + required this.onPick, + this.height = 96, + }); + + final List suggestions; + final void Function(double lat, double lon) onPick; + final double height; + + @override + Widget build(BuildContext context) { + if (suggestions.isEmpty) return const SizedBox.shrink(); + + return SafeArea( + top: false, + child: Card( + margin: const EdgeInsets.fromLTRB(12, 0, 12, 12), + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: CarouselSlider( + options: CarouselOptions( + height: height, + viewportFraction: 0.72, + enlargeCenterPage: true, + enableInfiniteScroll: suggestions.length > 1, + ), + items: suggestions.map((s) { + return InkWell( + borderRadius: BorderRadius.circular(12), + onTap: () => onPick(s.lat, s.lon), + child: Container( + margin: const EdgeInsets.symmetric(horizontal: 6), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + border: Border.all( + color: Theme.of(context).colorScheme.outlineVariant, + ), + ), + child: Row( + children: [ + if (s.assetImage != null) + ClipRRect( + borderRadius: const BorderRadius.horizontal( + left: Radius.circular(12)), + child: Image.asset( + s.assetImage!, + width: 90, + height: double.infinity, + fit: BoxFit.cover, + ), + ) + else + const SizedBox(width: 12), + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 12, vertical: 8), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(s.label, + style: Theme.of(context).textTheme.labelLarge, + maxLines: 1, + overflow: TextOverflow.ellipsis), + if (s.subtitle != null) + Text(s.subtitle!, + style: + Theme.of(context).textTheme.labelSmall, + maxLines: 1, + overflow: TextOverflow.ellipsis), + Text( + '${s.lat.toStringAsFixed(4)}, ${s.lon.toStringAsFixed(4)}', + style: Theme.of(context).textTheme.labelSmall, + ), + ], + ), + ), + ), + ], + ), + ), + ); + }).toList(), + ), + ), + ), + ); + } +} diff --git a/wien_talks/wien_talks_flutter/lib/widgets/error_snackbar.dart b/wien_talks_flutter/lib/widgets/error_snackbar.dart similarity index 100% rename from wien_talks/wien_talks_flutter/lib/widgets/error_snackbar.dart rename to wien_talks_flutter/lib/widgets/error_snackbar.dart diff --git a/wien_talks_flutter/lib/widgets/filter_chips_bar.dart b/wien_talks_flutter/lib/widgets/filter_chips_bar.dart new file mode 100644 index 0000000..bfec5f5 --- /dev/null +++ b/wien_talks_flutter/lib/widgets/filter_chips_bar.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; +import 'package:wien_talks_client/wien_talks_client.dart'; + +class FilterChipsBar extends StatelessWidget { + const FilterChipsBar({ + super.key, + required this.sort, + required this.today, + required this.nearby, + required this.onSortChanged, + required this.onTodayChanged, + required this.onNearbyPressed, + this.onClear, + }); + + final String sort; + final bool today; + final bool nearby; + + final ValueChanged onSortChanged; + final ValueChanged onTodayChanged; + final VoidCallback onNearbyPressed; + final VoidCallback? onClear; + + @override + Widget build(BuildContext context) { + return ConstrainedBox( + constraints: const BoxConstraints.tightFor(height: 40), + child: ListView( + padding: const EdgeInsets.symmetric(horizontal: 8), + scrollDirection: Axis.horizontal, + children: [ + ChoiceChip( + label: const Text('New'), + selected: sort == 'new', + onSelected: (_) => onSortChanged('new'), + ), + const SizedBox(width: 8), + ChoiceChip( + label: const Text('Loved'), + selected: sort == 'top', + onSelected: (_) => onSortChanged('top'), + ), + const SizedBox(width: 8), + FilterChip( + label: const Text('Today'), + selected: today, + onSelected: (v) => onTodayChanged(v), + ), + const SizedBox(width: 8), + FilterChip( + label: Text('Close by'), + selected: nearby, + onSelected: (_) => onNearbyPressed(), + ), + if (onClear != null && (today || nearby)) ...[ + const SizedBox(width: 8), + ActionChip( + label: const Text('Clear'), + onPressed: onClear, + ), + ], + ], + ), + ); + } +} diff --git a/wien_talks_flutter/lib/widgets/filter_overlay.dart b/wien_talks_flutter/lib/widgets/filter_overlay.dart new file mode 100644 index 0000000..b3043e0 --- /dev/null +++ b/wien_talks_flutter/lib/widgets/filter_overlay.dart @@ -0,0 +1,142 @@ +import 'package:flutter/material.dart'; +import 'package:wien_talks_flutter/helper/location_filter.dart'; + +class LocationFilterSheet extends StatefulWidget { + const LocationFilterSheet({super.key, this.current}); + final LocationFilter? current; + + @override + State createState() => _LocationFilterSheetState(); +} + +class _LocationFilterSheetState extends State { + final _latCtrl = TextEditingController(); + final _lonCtrl = TextEditingController(); + + double? _lat; + double? _lon; + double _radius = 1000; + + @override + void initState() { + super.initState(); + final c = widget.current; + _lat = c?.centerLat; + _lon = c?.centerLon; + _radius = c?.radiusMeters ?? _radius; + _latCtrl.text = _lat?.toStringAsFixed(6) ?? ''; + _lonCtrl.text = _lon?.toStringAsFixed(6) ?? ''; + _latCtrl.addListener(() => _lat = double.tryParse(_latCtrl.text)); + _lonCtrl.addListener(() => _lon = double.tryParse(_lonCtrl.text)); + } + + @override + void dispose() { + _latCtrl.dispose(); + _lonCtrl.dispose(); + super.dispose(); + } + + bool get _coordsValid { + final lat = _lat, lon = _lon; + return lat != null && + lon != null && + lat >= -90 && + lat <= 90 && + lon >= -180 && + lon <= 180; + } + + @override + Widget build(BuildContext context) { + final bottomInset = MediaQuery.of(context).viewInsets.bottom; + + return SafeArea( + child: SingleChildScrollView( + padding: EdgeInsets.fromLTRB(16, 16, 16, 16 + bottomInset), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Text('Location filter', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.w600)), + const SizedBox(height: 12), + + //todo(timo) fix decimal point display + TextField( + controller: _latCtrl, + decoration: InputDecoration( + labelText: 'Center latitude', + errorText: (_lat == null || (_lat! >= -90 && _lat! <= 90)) + ? null + : ' between −90 and 90', + ), + keyboardType: const TextInputType.numberWithOptions( + signed: true, decimal: true), + ), + const SizedBox(height: 8), + TextField( + controller: _lonCtrl, + decoration: InputDecoration( + labelText: 'Center longitude', + errorText: (_lon == null || (_lon! >= -180 && _lon! <= 180)) + ? null + : ' between −180 and 180', + ), + keyboardType: const TextInputType.numberWithOptions( + signed: true, decimal: true), + ), + const SizedBox(height: 12), + Row( + children: [ + const Text('Radius'), + Expanded( + child: Slider( + value: _radius, + min: 200, + max: 5000, + divisions: 24, + label: + '${(_radius / 1000).toStringAsFixed(_radius < 1000 ? 1 : 0)} km', + onChanged: (v) => setState(() => _radius = v), + ), + ), + SizedBox( + width: 72, + child: Text('${(_radius / 1000).toStringAsFixed(1)} km'), + ), + ], + ), + const SizedBox(height: 8), + Row( + children: [ + Expanded( + child: OutlinedButton( + onPressed: () => + Navigator.pop(context, null), + child: const Text('Cancel'), + ), + ), + const SizedBox(width: 12), + Expanded( + child: FilledButton( + onPressed: _coordsValid + ? () => Navigator.pop( + context, + LocationFilter( + centerLat: _lat!, + centerLon: _lon!, + radiusMeters: _radius, + ), + ) + : null, + child: const Text('Apply'), + ), + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/wien_talks/wien_talks_flutter/lib/widgets/flamboyant_quote_card.dart b/wien_talks_flutter/lib/widgets/flamboyant_quote_card.dart similarity index 55% rename from wien_talks/wien_talks_flutter/lib/widgets/flamboyant_quote_card.dart rename to wien_talks_flutter/lib/widgets/flamboyant_quote_card.dart index 5ac0f3b..8d9c740 100644 --- a/wien_talks/wien_talks_flutter/lib/widgets/flamboyant_quote_card.dart +++ b/wien_talks_flutter/lib/widgets/flamboyant_quote_card.dart @@ -21,6 +21,7 @@ class FlamboyantQuoteCard extends StatelessWidget { required this.onVoteUp, required this.onVoteDown, this.staticMapUrlBuilder, + this.onTap, }); final Quote quote; @@ -28,21 +29,20 @@ class FlamboyantQuoteCard extends StatelessWidget { final VoidCallback onVoteUp; final VoidCallback onVoteDown; final StaticMapUrlBuilder? staticMapUrlBuilder; + final VoidCallback? onTap; @override Widget build(BuildContext context) { final seed = (quote.id ?? quote.text.hashCode) & 0x7fffffff; final rng = math.Random(seed); - final variant = (rng.nextInt(3)); - - // Subtle tilt and accent + final variant = rng.nextInt(3); final tiltDeg = [-2.2, -1.4, -0.6, 0, 0.6, 1.2, 2.0][rng.nextInt(7)]; final tiltRad = tiltDeg * math.pi / 180.0; final accents = [ - const Color(0xFFE53935), // red - const Color(0xFF3949AB), // indigo - const Color(0xFF00897B), // teal + const Color(0xFFE53935), + const Color(0xFF3949AB), + const Color(0xFF00897B), ]; final accent = accents[seed % accents.length]; @@ -52,29 +52,41 @@ class FlamboyantQuoteCard extends StatelessWidget { .withValues(alpha: 0.70), ); - final card = Container( - decoration: BoxDecoration( - color: t.colorScheme.surface, - borderRadius: BorderRadius.circular(14), - boxShadow: const [ - BoxShadow( - color: Color(0x14000000), - blurRadius: 12, - offset: Offset(0, 6), - ), - ], - border: Border.all(color: accent.withValues(alpha: 0.25), width: 1), + final borderRadius = BorderRadius.circular(14); + + final cardContent = CardContenty( + quote: quote, + staticMapUrlBuilder: staticMapUrlBuilder, + meta: meta, + onVoteUp: onVoteUp, + onVoteDown: onVoteDown, + context: context, + variant: variant, + accent: accent, + metaStyle: metaStyle, + ); + + final tappableCard = Material( + type: MaterialType.transparency, + child: Ink( + decoration: BoxDecoration( + color: t.colorScheme.surface, + borderRadius: borderRadius, + boxShadow: const [ + BoxShadow( + color: Color(0x14000000), + blurRadius: 12, + offset: Offset(0, 6), + ), + ], + border: Border.all(color: accent.withValues(alpha: 0.25), width: 1), + ), + child: InkWell( + borderRadius: borderRadius, + onTap: onTap, + child: cardContent, + ), ), - child: CardContenty( - quote: quote, - staticMapUrlBuilder: staticMapUrlBuilder, - meta: meta, - onVoteUp: onVoteUp, - onVoteDown: onVoteDown, - context: context, - variant: variant, - accent: accent, - metaStyle: metaStyle), ); return Padding( @@ -84,14 +96,17 @@ class FlamboyantQuoteCard extends StatelessWidget { children: [ Transform.rotate( angle: tiltRad, - child: card, + transformHitTests: false, + child: tappableCard, ), Positioned( top: -8, right: 16, - child: UbahnTape( - lat: quote.lat, - lon: quote.long, + child: IgnorePointer( + child: UbahnTape( + lat: quote.lat, + lon: quote.long, + ), ), ), ], diff --git a/wien_talks/wien_talks_flutter/lib/widgets/get_location_widget.dart b/wien_talks_flutter/lib/widgets/get_location_widget.dart similarity index 100% rename from wien_talks/wien_talks_flutter/lib/widgets/get_location_widget.dart rename to wien_talks_flutter/lib/widgets/get_location_widget.dart diff --git a/wien_talks/wien_talks_flutter/lib/widgets/heading_text.dart b/wien_talks_flutter/lib/widgets/heading_text.dart similarity index 100% rename from wien_talks/wien_talks_flutter/lib/widgets/heading_text.dart rename to wien_talks_flutter/lib/widgets/heading_text.dart diff --git a/wien_talks/wien_talks_flutter/lib/widgets/intro_text_widget.dart b/wien_talks_flutter/lib/widgets/intro_text_widget.dart similarity index 100% rename from wien_talks/wien_talks_flutter/lib/widgets/intro_text_widget.dart rename to wien_talks_flutter/lib/widgets/intro_text_widget.dart diff --git a/wien_talks/wien_talks_flutter/lib/widgets/map_preview_widget.dart b/wien_talks_flutter/lib/widgets/map_preview_widget.dart similarity index 100% rename from wien_talks/wien_talks_flutter/lib/widgets/map_preview_widget.dart rename to wien_talks_flutter/lib/widgets/map_preview_widget.dart diff --git a/wien_talks/wien_talks_flutter/lib/mapfile_widget.dart b/wien_talks_flutter/lib/widgets/mapfile_widget.dart similarity index 100% rename from wien_talks/wien_talks_flutter/lib/mapfile_widget.dart rename to wien_talks_flutter/lib/widgets/mapfile_widget.dart diff --git a/wien_talks/wien_talks_flutter/lib/widgets/news_input_form.dart b/wien_talks_flutter/lib/widgets/news_input_form.dart similarity index 100% rename from wien_talks/wien_talks_flutter/lib/widgets/news_input_form.dart rename to wien_talks_flutter/lib/widgets/news_input_form.dart diff --git a/wien_talks/wien_talks_flutter/lib/widgets/quote_card.dart b/wien_talks_flutter/lib/widgets/quote_card.dart similarity index 100% rename from wien_talks/wien_talks_flutter/lib/widgets/quote_card.dart rename to wien_talks_flutter/lib/widgets/quote_card.dart diff --git a/wien_talks/wien_talks_flutter/lib/widgets/rail_divider.dart b/wien_talks_flutter/lib/widgets/rail_divider.dart similarity index 100% rename from wien_talks/wien_talks_flutter/lib/widgets/rail_divider.dart rename to wien_talks_flutter/lib/widgets/rail_divider.dart diff --git a/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart b/wien_talks_flutter/lib/widgets/screen_widget.dart similarity index 100% rename from wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart rename to wien_talks_flutter/lib/widgets/screen_widget.dart diff --git a/wien_talks/wien_talks_flutter/lib/widgets/ubahn_tape.dart b/wien_talks_flutter/lib/widgets/ubahn_tape.dart similarity index 100% rename from wien_talks/wien_talks_flutter/lib/widgets/ubahn_tape.dart rename to wien_talks_flutter/lib/widgets/ubahn_tape.dart diff --git a/wien_talks/wien_talks_flutter/lib/widgets/vote_button.dart b/wien_talks_flutter/lib/widgets/vote_button.dart similarity index 100% rename from wien_talks/wien_talks_flutter/lib/widgets/vote_button.dart rename to wien_talks_flutter/lib/widgets/vote_button.dart diff --git a/wien_talks/wien_talks_flutter/linux/.gitignore b/wien_talks_flutter/linux/.gitignore similarity index 100% rename from wien_talks/wien_talks_flutter/linux/.gitignore rename to wien_talks_flutter/linux/.gitignore diff --git a/wien_talks/wien_talks_flutter/linux/CMakeLists.txt b/wien_talks_flutter/linux/CMakeLists.txt similarity index 100% rename from wien_talks/wien_talks_flutter/linux/CMakeLists.txt rename to wien_talks_flutter/linux/CMakeLists.txt diff --git a/wien_talks/wien_talks_flutter/linux/flutter/CMakeLists.txt b/wien_talks_flutter/linux/flutter/CMakeLists.txt similarity index 100% rename from wien_talks/wien_talks_flutter/linux/flutter/CMakeLists.txt rename to wien_talks_flutter/linux/flutter/CMakeLists.txt diff --git a/wien_talks/wien_talks_flutter/linux/flutter/generated_plugin_registrant.cc b/wien_talks_flutter/linux/flutter/generated_plugin_registrant.cc similarity index 100% rename from wien_talks/wien_talks_flutter/linux/flutter/generated_plugin_registrant.cc rename to wien_talks_flutter/linux/flutter/generated_plugin_registrant.cc diff --git a/wien_talks/wien_talks_flutter/linux/flutter/generated_plugin_registrant.h b/wien_talks_flutter/linux/flutter/generated_plugin_registrant.h similarity index 100% rename from wien_talks/wien_talks_flutter/linux/flutter/generated_plugin_registrant.h rename to wien_talks_flutter/linux/flutter/generated_plugin_registrant.h diff --git a/wien_talks/wien_talks_flutter/linux/flutter/generated_plugins.cmake b/wien_talks_flutter/linux/flutter/generated_plugins.cmake similarity index 100% rename from wien_talks/wien_talks_flutter/linux/flutter/generated_plugins.cmake rename to wien_talks_flutter/linux/flutter/generated_plugins.cmake diff --git a/wien_talks/wien_talks_flutter/linux/runner/CMakeLists.txt b/wien_talks_flutter/linux/runner/CMakeLists.txt similarity index 100% rename from wien_talks/wien_talks_flutter/linux/runner/CMakeLists.txt rename to wien_talks_flutter/linux/runner/CMakeLists.txt diff --git a/wien_talks/wien_talks_flutter/linux/runner/main.cc b/wien_talks_flutter/linux/runner/main.cc similarity index 100% rename from wien_talks/wien_talks_flutter/linux/runner/main.cc rename to wien_talks_flutter/linux/runner/main.cc diff --git a/wien_talks/wien_talks_flutter/linux/runner/my_application.cc b/wien_talks_flutter/linux/runner/my_application.cc similarity index 100% rename from wien_talks/wien_talks_flutter/linux/runner/my_application.cc rename to wien_talks_flutter/linux/runner/my_application.cc diff --git a/wien_talks/wien_talks_flutter/linux/runner/my_application.h b/wien_talks_flutter/linux/runner/my_application.h similarity index 100% rename from wien_talks/wien_talks_flutter/linux/runner/my_application.h rename to wien_talks_flutter/linux/runner/my_application.h diff --git a/wien_talks/wien_talks_flutter/macos/.gitignore b/wien_talks_flutter/macos/.gitignore similarity index 100% rename from wien_talks/wien_talks_flutter/macos/.gitignore rename to wien_talks_flutter/macos/.gitignore diff --git a/wien_talks/wien_talks_flutter/macos/Flutter/Flutter-Debug.xcconfig b/wien_talks_flutter/macos/Flutter/Flutter-Debug.xcconfig similarity index 100% rename from wien_talks/wien_talks_flutter/macos/Flutter/Flutter-Debug.xcconfig rename to wien_talks_flutter/macos/Flutter/Flutter-Debug.xcconfig diff --git a/wien_talks/wien_talks_flutter/macos/Flutter/Flutter-Release.xcconfig b/wien_talks_flutter/macos/Flutter/Flutter-Release.xcconfig similarity index 100% rename from wien_talks/wien_talks_flutter/macos/Flutter/Flutter-Release.xcconfig rename to wien_talks_flutter/macos/Flutter/Flutter-Release.xcconfig diff --git a/wien_talks/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift b/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift similarity index 100% rename from wien_talks/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift rename to wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift diff --git a/wien_talks/wien_talks_flutter/macos/Runner.xcodeproj/project.pbxproj b/wien_talks_flutter/macos/Runner.xcodeproj/project.pbxproj similarity index 100% rename from wien_talks/wien_talks_flutter/macos/Runner.xcodeproj/project.pbxproj rename to wien_talks_flutter/macos/Runner.xcodeproj/project.pbxproj diff --git a/wien_talks/wien_talks_flutter/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/wien_talks_flutter/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from wien_talks/wien_talks_flutter/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to wien_talks_flutter/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/wien_talks/wien_talks_flutter/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/wien_talks_flutter/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from wien_talks/wien_talks_flutter/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to wien_talks_flutter/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/wien_talks/wien_talks_flutter/macos/Runner.xcworkspace/contents.xcworkspacedata b/wien_talks_flutter/macos/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from wien_talks/wien_talks_flutter/macos/Runner.xcworkspace/contents.xcworkspacedata rename to wien_talks_flutter/macos/Runner.xcworkspace/contents.xcworkspacedata diff --git a/wien_talks/wien_talks_flutter/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/wien_talks_flutter/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from wien_talks/wien_talks_flutter/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to wien_talks_flutter/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/wien_talks/wien_talks_flutter/macos/Runner/AppDelegate.swift b/wien_talks_flutter/macos/Runner/AppDelegate.swift similarity index 100% rename from wien_talks/wien_talks_flutter/macos/Runner/AppDelegate.swift rename to wien_talks_flutter/macos/Runner/AppDelegate.swift diff --git a/wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png similarity index 100% rename from wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png rename to wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png diff --git a/wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png similarity index 100% rename from wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png rename to wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png diff --git a/wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png similarity index 100% rename from wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png rename to wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png diff --git a/wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png similarity index 100% rename from wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png rename to wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png diff --git a/wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png similarity index 100% rename from wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png rename to wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png diff --git a/wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png similarity index 100% rename from wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png rename to wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png diff --git a/wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png similarity index 100% rename from wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png rename to wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png diff --git a/wien_talks/wien_talks_flutter/macos/Runner/Base.lproj/MainMenu.xib b/wien_talks_flutter/macos/Runner/Base.lproj/MainMenu.xib similarity index 100% rename from wien_talks/wien_talks_flutter/macos/Runner/Base.lproj/MainMenu.xib rename to wien_talks_flutter/macos/Runner/Base.lproj/MainMenu.xib diff --git a/wien_talks/wien_talks_flutter/macos/Runner/Configs/AppInfo.xcconfig b/wien_talks_flutter/macos/Runner/Configs/AppInfo.xcconfig similarity index 100% rename from wien_talks/wien_talks_flutter/macos/Runner/Configs/AppInfo.xcconfig rename to wien_talks_flutter/macos/Runner/Configs/AppInfo.xcconfig diff --git a/wien_talks/wien_talks_flutter/macos/Runner/Configs/Debug.xcconfig b/wien_talks_flutter/macos/Runner/Configs/Debug.xcconfig similarity index 100% rename from wien_talks/wien_talks_flutter/macos/Runner/Configs/Debug.xcconfig rename to wien_talks_flutter/macos/Runner/Configs/Debug.xcconfig diff --git a/wien_talks/wien_talks_flutter/macos/Runner/Configs/Release.xcconfig b/wien_talks_flutter/macos/Runner/Configs/Release.xcconfig similarity index 100% rename from wien_talks/wien_talks_flutter/macos/Runner/Configs/Release.xcconfig rename to wien_talks_flutter/macos/Runner/Configs/Release.xcconfig diff --git a/wien_talks/wien_talks_flutter/macos/Runner/Configs/Warnings.xcconfig b/wien_talks_flutter/macos/Runner/Configs/Warnings.xcconfig similarity index 100% rename from wien_talks/wien_talks_flutter/macos/Runner/Configs/Warnings.xcconfig rename to wien_talks_flutter/macos/Runner/Configs/Warnings.xcconfig diff --git a/wien_talks/wien_talks_flutter/macos/Runner/DebugProfile.entitlements b/wien_talks_flutter/macos/Runner/DebugProfile.entitlements similarity index 100% rename from wien_talks/wien_talks_flutter/macos/Runner/DebugProfile.entitlements rename to wien_talks_flutter/macos/Runner/DebugProfile.entitlements diff --git a/wien_talks/wien_talks_flutter/macos/Runner/Info.plist b/wien_talks_flutter/macos/Runner/Info.plist similarity index 100% rename from wien_talks/wien_talks_flutter/macos/Runner/Info.plist rename to wien_talks_flutter/macos/Runner/Info.plist diff --git a/wien_talks/wien_talks_flutter/macos/Runner/MainFlutterWindow.swift b/wien_talks_flutter/macos/Runner/MainFlutterWindow.swift similarity index 100% rename from wien_talks/wien_talks_flutter/macos/Runner/MainFlutterWindow.swift rename to wien_talks_flutter/macos/Runner/MainFlutterWindow.swift diff --git a/wien_talks/wien_talks_flutter/macos/Runner/Release.entitlements b/wien_talks_flutter/macos/Runner/Release.entitlements similarity index 100% rename from wien_talks/wien_talks_flutter/macos/Runner/Release.entitlements rename to wien_talks_flutter/macos/Runner/Release.entitlements diff --git a/wien_talks/wien_talks_flutter/macos/RunnerTests/RunnerTests.swift b/wien_talks_flutter/macos/RunnerTests/RunnerTests.swift similarity index 100% rename from wien_talks/wien_talks_flutter/macos/RunnerTests/RunnerTests.swift rename to wien_talks_flutter/macos/RunnerTests/RunnerTests.swift diff --git a/wien_talks/wien_talks_flutter/pubspec.yaml b/wien_talks_flutter/pubspec.yaml similarity index 100% rename from wien_talks/wien_talks_flutter/pubspec.yaml rename to wien_talks_flutter/pubspec.yaml diff --git a/wien_talks/wien_talks_flutter/test/widget_test.dart b/wien_talks_flutter/test/widget_test.dart similarity index 100% rename from wien_talks/wien_talks_flutter/test/widget_test.dart rename to wien_talks_flutter/test/widget_test.dart diff --git a/wien_talks/wien_talks_flutter/web/favicon.png b/wien_talks_flutter/web/favicon.png similarity index 100% rename from wien_talks/wien_talks_flutter/web/favicon.png rename to wien_talks_flutter/web/favicon.png diff --git a/wien_talks/wien_talks_flutter/web/icons/Icon-192.png b/wien_talks_flutter/web/icons/Icon-192.png similarity index 100% rename from wien_talks/wien_talks_flutter/web/icons/Icon-192.png rename to wien_talks_flutter/web/icons/Icon-192.png diff --git a/wien_talks/wien_talks_flutter/web/icons/Icon-512.png b/wien_talks_flutter/web/icons/Icon-512.png similarity index 100% rename from wien_talks/wien_talks_flutter/web/icons/Icon-512.png rename to wien_talks_flutter/web/icons/Icon-512.png diff --git a/wien_talks/wien_talks_flutter/web/icons/Icon-maskable-192.png b/wien_talks_flutter/web/icons/Icon-maskable-192.png similarity index 100% rename from wien_talks/wien_talks_flutter/web/icons/Icon-maskable-192.png rename to wien_talks_flutter/web/icons/Icon-maskable-192.png diff --git a/wien_talks/wien_talks_flutter/web/icons/Icon-maskable-512.png b/wien_talks_flutter/web/icons/Icon-maskable-512.png similarity index 100% rename from wien_talks/wien_talks_flutter/web/icons/Icon-maskable-512.png rename to wien_talks_flutter/web/icons/Icon-maskable-512.png diff --git a/wien_talks/wien_talks_flutter/web/index.html b/wien_talks_flutter/web/index.html similarity index 100% rename from wien_talks/wien_talks_flutter/web/index.html rename to wien_talks_flutter/web/index.html diff --git a/wien_talks/wien_talks_flutter/web/manifest.json b/wien_talks_flutter/web/manifest.json similarity index 100% rename from wien_talks/wien_talks_flutter/web/manifest.json rename to wien_talks_flutter/web/manifest.json diff --git a/wien_talks/wien_talks_flutter/windows/.gitignore b/wien_talks_flutter/windows/.gitignore similarity index 100% rename from wien_talks/wien_talks_flutter/windows/.gitignore rename to wien_talks_flutter/windows/.gitignore diff --git a/wien_talks/wien_talks_flutter/windows/CMakeLists.txt b/wien_talks_flutter/windows/CMakeLists.txt similarity index 100% rename from wien_talks/wien_talks_flutter/windows/CMakeLists.txt rename to wien_talks_flutter/windows/CMakeLists.txt diff --git a/wien_talks/wien_talks_flutter/windows/flutter/CMakeLists.txt b/wien_talks_flutter/windows/flutter/CMakeLists.txt similarity index 100% rename from wien_talks/wien_talks_flutter/windows/flutter/CMakeLists.txt rename to wien_talks_flutter/windows/flutter/CMakeLists.txt diff --git a/wien_talks/wien_talks_flutter/windows/flutter/generated_plugin_registrant.cc b/wien_talks_flutter/windows/flutter/generated_plugin_registrant.cc similarity index 100% rename from wien_talks/wien_talks_flutter/windows/flutter/generated_plugin_registrant.cc rename to wien_talks_flutter/windows/flutter/generated_plugin_registrant.cc diff --git a/wien_talks/wien_talks_flutter/windows/flutter/generated_plugin_registrant.h b/wien_talks_flutter/windows/flutter/generated_plugin_registrant.h similarity index 100% rename from wien_talks/wien_talks_flutter/windows/flutter/generated_plugin_registrant.h rename to wien_talks_flutter/windows/flutter/generated_plugin_registrant.h diff --git a/wien_talks/wien_talks_flutter/windows/flutter/generated_plugins.cmake b/wien_talks_flutter/windows/flutter/generated_plugins.cmake similarity index 100% rename from wien_talks/wien_talks_flutter/windows/flutter/generated_plugins.cmake rename to wien_talks_flutter/windows/flutter/generated_plugins.cmake diff --git a/wien_talks/wien_talks_flutter/windows/runner/CMakeLists.txt b/wien_talks_flutter/windows/runner/CMakeLists.txt similarity index 100% rename from wien_talks/wien_talks_flutter/windows/runner/CMakeLists.txt rename to wien_talks_flutter/windows/runner/CMakeLists.txt diff --git a/wien_talks/wien_talks_flutter/windows/runner/Runner.rc b/wien_talks_flutter/windows/runner/Runner.rc similarity index 100% rename from wien_talks/wien_talks_flutter/windows/runner/Runner.rc rename to wien_talks_flutter/windows/runner/Runner.rc diff --git a/wien_talks/wien_talks_flutter/windows/runner/flutter_window.cpp b/wien_talks_flutter/windows/runner/flutter_window.cpp similarity index 100% rename from wien_talks/wien_talks_flutter/windows/runner/flutter_window.cpp rename to wien_talks_flutter/windows/runner/flutter_window.cpp diff --git a/wien_talks/wien_talks_flutter/windows/runner/flutter_window.h b/wien_talks_flutter/windows/runner/flutter_window.h similarity index 100% rename from wien_talks/wien_talks_flutter/windows/runner/flutter_window.h rename to wien_talks_flutter/windows/runner/flutter_window.h diff --git a/wien_talks/wien_talks_flutter/windows/runner/main.cpp b/wien_talks_flutter/windows/runner/main.cpp similarity index 100% rename from wien_talks/wien_talks_flutter/windows/runner/main.cpp rename to wien_talks_flutter/windows/runner/main.cpp diff --git a/wien_talks/wien_talks_flutter/windows/runner/resource.h b/wien_talks_flutter/windows/runner/resource.h similarity index 100% rename from wien_talks/wien_talks_flutter/windows/runner/resource.h rename to wien_talks_flutter/windows/runner/resource.h diff --git a/wien_talks/wien_talks_flutter/windows/runner/resources/app_icon.ico b/wien_talks_flutter/windows/runner/resources/app_icon.ico similarity index 100% rename from wien_talks/wien_talks_flutter/windows/runner/resources/app_icon.ico rename to wien_talks_flutter/windows/runner/resources/app_icon.ico diff --git a/wien_talks/wien_talks_flutter/windows/runner/runner.exe.manifest b/wien_talks_flutter/windows/runner/runner.exe.manifest similarity index 100% rename from wien_talks/wien_talks_flutter/windows/runner/runner.exe.manifest rename to wien_talks_flutter/windows/runner/runner.exe.manifest diff --git a/wien_talks/wien_talks_flutter/windows/runner/utils.cpp b/wien_talks_flutter/windows/runner/utils.cpp similarity index 100% rename from wien_talks/wien_talks_flutter/windows/runner/utils.cpp rename to wien_talks_flutter/windows/runner/utils.cpp diff --git a/wien_talks/wien_talks_flutter/windows/runner/utils.h b/wien_talks_flutter/windows/runner/utils.h similarity index 100% rename from wien_talks/wien_talks_flutter/windows/runner/utils.h rename to wien_talks_flutter/windows/runner/utils.h diff --git a/wien_talks/wien_talks_flutter/windows/runner/win32_window.cpp b/wien_talks_flutter/windows/runner/win32_window.cpp similarity index 100% rename from wien_talks/wien_talks_flutter/windows/runner/win32_window.cpp rename to wien_talks_flutter/windows/runner/win32_window.cpp diff --git a/wien_talks/wien_talks_flutter/windows/runner/win32_window.h b/wien_talks_flutter/windows/runner/win32_window.h similarity index 100% rename from wien_talks/wien_talks_flutter/windows/runner/win32_window.h rename to wien_talks_flutter/windows/runner/win32_window.h diff --git a/wien_talks/wien_talks_server/.env.template b/wien_talks_server/.env.template similarity index 100% rename from wien_talks/wien_talks_server/.env.template rename to wien_talks_server/.env.template diff --git a/wien_talks/wien_talks_server/.gcloudignore b/wien_talks_server/.gcloudignore similarity index 100% rename from wien_talks/wien_talks_server/.gcloudignore rename to wien_talks_server/.gcloudignore diff --git a/wien_talks/wien_talks_server/.gitignore b/wien_talks_server/.gitignore similarity index 100% rename from wien_talks/wien_talks_server/.gitignore rename to wien_talks_server/.gitignore diff --git a/wien_talks/wien_talks_server/CHANGELOG.md b/wien_talks_server/CHANGELOG.md similarity index 100% rename from wien_talks/wien_talks_server/CHANGELOG.md rename to wien_talks_server/CHANGELOG.md diff --git a/wien_talks/wien_talks_server/Dockerfile b/wien_talks_server/Dockerfile similarity index 100% rename from wien_talks/wien_talks_server/Dockerfile rename to wien_talks_server/Dockerfile diff --git a/wien_talks/wien_talks_server/Makefile b/wien_talks_server/Makefile similarity index 100% rename from wien_talks/wien_talks_server/Makefile rename to wien_talks_server/Makefile diff --git a/wien_talks/wien_talks_server/README.md b/wien_talks_server/README.md similarity index 100% rename from wien_talks/wien_talks_server/README.md rename to wien_talks_server/README.md diff --git a/wien_talks/wien_talks_server/analysis_options.yaml b/wien_talks_server/analysis_options.yaml similarity index 100% rename from wien_talks/wien_talks_server/analysis_options.yaml rename to wien_talks_server/analysis_options.yaml diff --git a/wien_talks/wien_talks_server/bin/main.dart b/wien_talks_server/bin/main.dart similarity index 100% rename from wien_talks/wien_talks_server/bin/main.dart rename to wien_talks_server/bin/main.dart diff --git a/wien_talks/wien_talks_server/config/development.yaml b/wien_talks_server/config/development.yaml similarity index 100% rename from wien_talks/wien_talks_server/config/development.yaml rename to wien_talks_server/config/development.yaml diff --git a/wien_talks/wien_talks_server/config/generator.yaml b/wien_talks_server/config/generator.yaml similarity index 100% rename from wien_talks/wien_talks_server/config/generator.yaml rename to wien_talks_server/config/generator.yaml diff --git a/wien_talks/wien_talks_server/config/production.yaml b/wien_talks_server/config/production.yaml similarity index 100% rename from wien_talks/wien_talks_server/config/production.yaml rename to wien_talks_server/config/production.yaml diff --git a/wien_talks/wien_talks_server/config/staging.yaml b/wien_talks_server/config/staging.yaml similarity index 100% rename from wien_talks/wien_talks_server/config/staging.yaml rename to wien_talks_server/config/staging.yaml diff --git a/wien_talks/wien_talks_server/config/test.yaml b/wien_talks_server/config/test.yaml similarity index 100% rename from wien_talks/wien_talks_server/config/test.yaml rename to wien_talks_server/config/test.yaml diff --git a/wien_talks/wien_talks_server/dart_test.yaml b/wien_talks_server/dart_test.yaml similarity index 100% rename from wien_talks/wien_talks_server/dart_test.yaml rename to wien_talks_server/dart_test.yaml diff --git a/wien_talks/wien_talks_server/deploy/aws/scripts/appspec.yml b/wien_talks_server/deploy/aws/scripts/appspec.yml similarity index 100% rename from wien_talks/wien_talks_server/deploy/aws/scripts/appspec.yml rename to wien_talks_server/deploy/aws/scripts/appspec.yml diff --git a/wien_talks/wien_talks_server/deploy/aws/scripts/install_dependencies b/wien_talks_server/deploy/aws/scripts/install_dependencies similarity index 100% rename from wien_talks/wien_talks_server/deploy/aws/scripts/install_dependencies rename to wien_talks_server/deploy/aws/scripts/install_dependencies diff --git a/wien_talks/wien_talks_server/deploy/aws/scripts/run_serverpod b/wien_talks_server/deploy/aws/scripts/run_serverpod similarity index 100% rename from wien_talks/wien_talks_server/deploy/aws/scripts/run_serverpod rename to wien_talks_server/deploy/aws/scripts/run_serverpod diff --git a/wien_talks/wien_talks_server/deploy/aws/scripts/start_server b/wien_talks_server/deploy/aws/scripts/start_server similarity index 100% rename from wien_talks/wien_talks_server/deploy/aws/scripts/start_server rename to wien_talks_server/deploy/aws/scripts/start_server diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/balancers-staging.tf b/wien_talks_server/deploy/aws/terraform/balancers-staging.tf similarity index 100% rename from wien_talks/wien_talks_server/deploy/aws/terraform/balancers-staging.tf rename to wien_talks_server/deploy/aws/terraform/balancers-staging.tf diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/balancers.tf b/wien_talks_server/deploy/aws/terraform/balancers.tf similarity index 100% rename from wien_talks/wien_talks_server/deploy/aws/terraform/balancers.tf rename to wien_talks_server/deploy/aws/terraform/balancers.tf diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/cloudfront-web-staging.tf b/wien_talks_server/deploy/aws/terraform/cloudfront-web-staging.tf similarity index 100% rename from wien_talks/wien_talks_server/deploy/aws/terraform/cloudfront-web-staging.tf rename to wien_talks_server/deploy/aws/terraform/cloudfront-web-staging.tf diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/cloudfront-web.tf b/wien_talks_server/deploy/aws/terraform/cloudfront-web.tf similarity index 100% rename from wien_talks/wien_talks_server/deploy/aws/terraform/cloudfront-web.tf rename to wien_talks_server/deploy/aws/terraform/cloudfront-web.tf diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/code-deploy.tf b/wien_talks_server/deploy/aws/terraform/code-deploy.tf similarity index 100% rename from wien_talks/wien_talks_server/deploy/aws/terraform/code-deploy.tf rename to wien_talks_server/deploy/aws/terraform/code-deploy.tf diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/config.auto.tfvars b/wien_talks_server/deploy/aws/terraform/config.auto.tfvars similarity index 100% rename from wien_talks/wien_talks_server/deploy/aws/terraform/config.auto.tfvars rename to wien_talks_server/deploy/aws/terraform/config.auto.tfvars diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/database.tf b/wien_talks_server/deploy/aws/terraform/database.tf similarity index 100% rename from wien_talks/wien_talks_server/deploy/aws/terraform/database.tf rename to wien_talks_server/deploy/aws/terraform/database.tf diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/init-script.sh b/wien_talks_server/deploy/aws/terraform/init-script.sh similarity index 100% rename from wien_talks/wien_talks_server/deploy/aws/terraform/init-script.sh rename to wien_talks_server/deploy/aws/terraform/init-script.sh diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/instances.tf b/wien_talks_server/deploy/aws/terraform/instances.tf similarity index 100% rename from wien_talks/wien_talks_server/deploy/aws/terraform/instances.tf rename to wien_talks_server/deploy/aws/terraform/instances.tf diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/main.tf b/wien_talks_server/deploy/aws/terraform/main.tf similarity index 100% rename from wien_talks/wien_talks_server/deploy/aws/terraform/main.tf rename to wien_talks_server/deploy/aws/terraform/main.tf diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/redis.tf b/wien_talks_server/deploy/aws/terraform/redis.tf similarity index 100% rename from wien_talks/wien_talks_server/deploy/aws/terraform/redis.tf rename to wien_talks_server/deploy/aws/terraform/redis.tf diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/staging.tf b/wien_talks_server/deploy/aws/terraform/staging.tf similarity index 100% rename from wien_talks/wien_talks_server/deploy/aws/terraform/staging.tf rename to wien_talks_server/deploy/aws/terraform/staging.tf diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/storage.tf b/wien_talks_server/deploy/aws/terraform/storage.tf similarity index 100% rename from wien_talks/wien_talks_server/deploy/aws/terraform/storage.tf rename to wien_talks_server/deploy/aws/terraform/storage.tf diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/variables.tf b/wien_talks_server/deploy/aws/terraform/variables.tf similarity index 100% rename from wien_talks/wien_talks_server/deploy/aws/terraform/variables.tf rename to wien_talks_server/deploy/aws/terraform/variables.tf diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/vpc.tf b/wien_talks_server/deploy/aws/terraform/vpc.tf similarity index 100% rename from wien_talks/wien_talks_server/deploy/aws/terraform/vpc.tf rename to wien_talks_server/deploy/aws/terraform/vpc.tf diff --git a/wien_talks/wien_talks_server/deploy/gcp/console_gcr/cloud-run-deploy.sh b/wien_talks_server/deploy/gcp/console_gcr/cloud-run-deploy.sh similarity index 100% rename from wien_talks/wien_talks_server/deploy/gcp/console_gcr/cloud-run-deploy.sh rename to wien_talks_server/deploy/gcp/console_gcr/cloud-run-deploy.sh diff --git a/wien_talks/wien_talks_server/deploy/gcp/terraform_gce/config.auto.tfvars b/wien_talks_server/deploy/gcp/terraform_gce/config.auto.tfvars similarity index 100% rename from wien_talks/wien_talks_server/deploy/gcp/terraform_gce/config.auto.tfvars rename to wien_talks_server/deploy/gcp/terraform_gce/config.auto.tfvars diff --git a/wien_talks/wien_talks_server/deploy/gcp/terraform_gce/main.tf b/wien_talks_server/deploy/gcp/terraform_gce/main.tf similarity index 100% rename from wien_talks/wien_talks_server/deploy/gcp/terraform_gce/main.tf rename to wien_talks_server/deploy/gcp/terraform_gce/main.tf diff --git a/wien_talks/wien_talks_server/deploy/gcp/terraform_gce/variables.tf b/wien_talks_server/deploy/gcp/terraform_gce/variables.tf similarity index 100% rename from wien_talks/wien_talks_server/deploy/gcp/terraform_gce/variables.tf rename to wien_talks_server/deploy/gcp/terraform_gce/variables.tf diff --git a/wien_talks/wien_talks_server/docker-compose.deploy.yaml b/wien_talks_server/docker-compose.deploy.yaml similarity index 100% rename from wien_talks/wien_talks_server/docker-compose.deploy.yaml rename to wien_talks_server/docker-compose.deploy.yaml diff --git a/wien_talks/wien_talks_server/docker-compose.local.yaml b/wien_talks_server/docker-compose.local.yaml similarity index 100% rename from wien_talks/wien_talks_server/docker-compose.local.yaml rename to wien_talks_server/docker-compose.local.yaml diff --git a/wien_talks/wien_talks_server/env.d/postgres.env.template b/wien_talks_server/env.d/postgres.env.template similarity index 100% rename from wien_talks/wien_talks_server/env.d/postgres.env.template rename to wien_talks_server/env.d/postgres.env.template diff --git a/wien_talks/wien_talks_server/env.d/server.env.template b/wien_talks_server/env.d/server.env.template similarity index 100% rename from wien_talks/wien_talks_server/env.d/server.env.template rename to wien_talks_server/env.d/server.env.template diff --git a/wien_talks/wien_talks_server/lib/server.dart b/wien_talks_server/lib/server.dart similarity index 100% rename from wien_talks/wien_talks_server/lib/server.dart rename to wien_talks_server/lib/server.dart diff --git a/wien_talks/wien_talks_server/lib/src/generated/create_quote.dart b/wien_talks_server/lib/src/generated/create_quote.dart similarity index 100% rename from wien_talks/wien_talks_server/lib/src/generated/create_quote.dart rename to wien_talks_server/lib/src/generated/create_quote.dart diff --git a/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart b/wien_talks_server/lib/src/generated/endpoints.dart similarity index 100% rename from wien_talks/wien_talks_server/lib/src/generated/endpoints.dart rename to wien_talks_server/lib/src/generated/endpoints.dart diff --git a/wien_talks/wien_talks_server/lib/src/generated/health.dart b/wien_talks_server/lib/src/generated/health.dart similarity index 100% rename from wien_talks/wien_talks_server/lib/src/generated/health.dart rename to wien_talks_server/lib/src/generated/health.dart diff --git a/wien_talks/wien_talks_server/lib/src/generated/protocol.dart b/wien_talks_server/lib/src/generated/protocol.dart similarity index 100% rename from wien_talks/wien_talks_server/lib/src/generated/protocol.dart rename to wien_talks_server/lib/src/generated/protocol.dart diff --git a/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml b/wien_talks_server/lib/src/generated/protocol.yaml similarity index 100% rename from wien_talks/wien_talks_server/lib/src/generated/protocol.yaml rename to wien_talks_server/lib/src/generated/protocol.yaml diff --git a/wien_talks/wien_talks_server/lib/src/generated/quote.dart b/wien_talks_server/lib/src/generated/quote.dart similarity index 100% rename from wien_talks/wien_talks_server/lib/src/generated/quote.dart rename to wien_talks_server/lib/src/generated/quote.dart diff --git a/wien_talks/wien_talks_server/lib/src/generated/vote.dart b/wien_talks_server/lib/src/generated/vote.dart similarity index 100% rename from wien_talks/wien_talks_server/lib/src/generated/vote.dart rename to wien_talks_server/lib/src/generated/vote.dart diff --git a/wien_talks/wien_talks_server/lib/src/health/health-endpoint.dart b/wien_talks_server/lib/src/health/health-endpoint.dart similarity index 100% rename from wien_talks/wien_talks_server/lib/src/health/health-endpoint.dart rename to wien_talks_server/lib/src/health/health-endpoint.dart diff --git a/wien_talks/wien_talks_server/lib/src/models/create_quote.spy.yaml b/wien_talks_server/lib/src/models/create_quote.spy.yaml similarity index 100% rename from wien_talks/wien_talks_server/lib/src/models/create_quote.spy.yaml rename to wien_talks_server/lib/src/models/create_quote.spy.yaml diff --git a/wien_talks/wien_talks_server/lib/src/models/health.spy.yaml b/wien_talks_server/lib/src/models/health.spy.yaml similarity index 100% rename from wien_talks/wien_talks_server/lib/src/models/health.spy.yaml rename to wien_talks_server/lib/src/models/health.spy.yaml diff --git a/wien_talks/wien_talks_server/lib/src/models/quote.spy.yaml b/wien_talks_server/lib/src/models/quote.spy.yaml similarity index 100% rename from wien_talks/wien_talks_server/lib/src/models/quote.spy.yaml rename to wien_talks_server/lib/src/models/quote.spy.yaml diff --git a/wien_talks/wien_talks_server/lib/src/models/vote.spy.yaml b/wien_talks_server/lib/src/models/vote.spy.yaml similarity index 100% rename from wien_talks/wien_talks_server/lib/src/models/vote.spy.yaml rename to wien_talks_server/lib/src/models/vote.spy.yaml diff --git a/wien_talks/wien_talks_server/lib/src/quotes/quote_util.dart b/wien_talks_server/lib/src/quotes/quote_util.dart similarity index 100% rename from wien_talks/wien_talks_server/lib/src/quotes/quote_util.dart rename to wien_talks_server/lib/src/quotes/quote_util.dart diff --git a/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart b/wien_talks_server/lib/src/quotes/quotes_endpoint.dart similarity index 100% rename from wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart rename to wien_talks_server/lib/src/quotes/quotes_endpoint.dart diff --git a/wien_talks/wien_talks_server/lib/src/votes/votes_endpoint.dart b/wien_talks_server/lib/src/votes/votes_endpoint.dart similarity index 100% rename from wien_talks/wien_talks_server/lib/src/votes/votes_endpoint.dart rename to wien_talks_server/lib/src/votes/votes_endpoint.dart diff --git a/wien_talks/wien_talks_server/lib/src/web/routes/root.dart b/wien_talks_server/lib/src/web/routes/root.dart similarity index 100% rename from wien_talks/wien_talks_server/lib/src/web/routes/root.dart rename to wien_talks_server/lib/src/web/routes/root.dart diff --git a/wien_talks/wien_talks_server/lib/src/web/widgets/built_with_serverpod_page.dart b/wien_talks_server/lib/src/web/widgets/built_with_serverpod_page.dart similarity index 100% rename from wien_talks/wien_talks_server/lib/src/web/widgets/built_with_serverpod_page.dart rename to wien_talks_server/lib/src/web/widgets/built_with_serverpod_page.dart diff --git a/wien_talks/wien_talks_server/migrations/20250816212658542/definition.json b/wien_talks_server/migrations/20250816212658542/definition.json similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816212658542/definition.json rename to wien_talks_server/migrations/20250816212658542/definition.json diff --git a/wien_talks/wien_talks_server/migrations/20250816212658542/definition.sql b/wien_talks_server/migrations/20250816212658542/definition.sql similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816212658542/definition.sql rename to wien_talks_server/migrations/20250816212658542/definition.sql diff --git a/wien_talks/wien_talks_server/migrations/20250816212658542/definition_project.json b/wien_talks_server/migrations/20250816212658542/definition_project.json similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816212658542/definition_project.json rename to wien_talks_server/migrations/20250816212658542/definition_project.json diff --git a/wien_talks/wien_talks_server/migrations/20250816212658542/migration.json b/wien_talks_server/migrations/20250816212658542/migration.json similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816212658542/migration.json rename to wien_talks_server/migrations/20250816212658542/migration.json diff --git a/wien_talks/wien_talks_server/migrations/20250816212658542/migration.sql b/wien_talks_server/migrations/20250816212658542/migration.sql similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816212658542/migration.sql rename to wien_talks_server/migrations/20250816212658542/migration.sql diff --git a/wien_talks/wien_talks_server/migrations/20250816212959541/definition.json b/wien_talks_server/migrations/20250816212959541/definition.json similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816212959541/definition.json rename to wien_talks_server/migrations/20250816212959541/definition.json diff --git a/wien_talks/wien_talks_server/migrations/20250816212959541/definition.sql b/wien_talks_server/migrations/20250816212959541/definition.sql similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816212959541/definition.sql rename to wien_talks_server/migrations/20250816212959541/definition.sql diff --git a/wien_talks/wien_talks_server/migrations/20250816212959541/definition_project.json b/wien_talks_server/migrations/20250816212959541/definition_project.json similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816212959541/definition_project.json rename to wien_talks_server/migrations/20250816212959541/definition_project.json diff --git a/wien_talks/wien_talks_server/migrations/20250816212959541/migration.json b/wien_talks_server/migrations/20250816212959541/migration.json similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816212959541/migration.json rename to wien_talks_server/migrations/20250816212959541/migration.json diff --git a/wien_talks/wien_talks_server/migrations/20250816212959541/migration.sql b/wien_talks_server/migrations/20250816212959541/migration.sql similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816212959541/migration.sql rename to wien_talks_server/migrations/20250816212959541/migration.sql diff --git a/wien_talks/wien_talks_server/migrations/20250816214717668/definition.json b/wien_talks_server/migrations/20250816214717668/definition.json similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816214717668/definition.json rename to wien_talks_server/migrations/20250816214717668/definition.json diff --git a/wien_talks/wien_talks_server/migrations/20250816214717668/definition.sql b/wien_talks_server/migrations/20250816214717668/definition.sql similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816214717668/definition.sql rename to wien_talks_server/migrations/20250816214717668/definition.sql diff --git a/wien_talks/wien_talks_server/migrations/20250816214717668/definition_project.json b/wien_talks_server/migrations/20250816214717668/definition_project.json similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816214717668/definition_project.json rename to wien_talks_server/migrations/20250816214717668/definition_project.json diff --git a/wien_talks/wien_talks_server/migrations/20250816214717668/migration.json b/wien_talks_server/migrations/20250816214717668/migration.json similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816214717668/migration.json rename to wien_talks_server/migrations/20250816214717668/migration.json diff --git a/wien_talks/wien_talks_server/migrations/20250816214717668/migration.sql b/wien_talks_server/migrations/20250816214717668/migration.sql similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816214717668/migration.sql rename to wien_talks_server/migrations/20250816214717668/migration.sql diff --git a/wien_talks/wien_talks_server/migrations/20250816215043551/definition.json b/wien_talks_server/migrations/20250816215043551/definition.json similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816215043551/definition.json rename to wien_talks_server/migrations/20250816215043551/definition.json diff --git a/wien_talks/wien_talks_server/migrations/20250816215043551/definition.sql b/wien_talks_server/migrations/20250816215043551/definition.sql similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816215043551/definition.sql rename to wien_talks_server/migrations/20250816215043551/definition.sql diff --git a/wien_talks/wien_talks_server/migrations/20250816215043551/definition_project.json b/wien_talks_server/migrations/20250816215043551/definition_project.json similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816215043551/definition_project.json rename to wien_talks_server/migrations/20250816215043551/definition_project.json diff --git a/wien_talks/wien_talks_server/migrations/20250816215043551/migration.json b/wien_talks_server/migrations/20250816215043551/migration.json similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816215043551/migration.json rename to wien_talks_server/migrations/20250816215043551/migration.json diff --git a/wien_talks/wien_talks_server/migrations/20250816215043551/migration.sql b/wien_talks_server/migrations/20250816215043551/migration.sql similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816215043551/migration.sql rename to wien_talks_server/migrations/20250816215043551/migration.sql diff --git a/wien_talks/wien_talks_server/migrations/20250816215049795/definition.json b/wien_talks_server/migrations/20250816215049795/definition.json similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816215049795/definition.json rename to wien_talks_server/migrations/20250816215049795/definition.json diff --git a/wien_talks/wien_talks_server/migrations/20250816215049795/definition.sql b/wien_talks_server/migrations/20250816215049795/definition.sql similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816215049795/definition.sql rename to wien_talks_server/migrations/20250816215049795/definition.sql diff --git a/wien_talks/wien_talks_server/migrations/20250816215049795/definition_project.json b/wien_talks_server/migrations/20250816215049795/definition_project.json similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816215049795/definition_project.json rename to wien_talks_server/migrations/20250816215049795/definition_project.json diff --git a/wien_talks/wien_talks_server/migrations/20250816215049795/migration.json b/wien_talks_server/migrations/20250816215049795/migration.json similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816215049795/migration.json rename to wien_talks_server/migrations/20250816215049795/migration.json diff --git a/wien_talks/wien_talks_server/migrations/20250816215049795/migration.sql b/wien_talks_server/migrations/20250816215049795/migration.sql similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816215049795/migration.sql rename to wien_talks_server/migrations/20250816215049795/migration.sql diff --git a/wien_talks/wien_talks_server/migrations/20250816215102447/definition.json b/wien_talks_server/migrations/20250816215102447/definition.json similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816215102447/definition.json rename to wien_talks_server/migrations/20250816215102447/definition.json diff --git a/wien_talks/wien_talks_server/migrations/20250816215102447/definition.sql b/wien_talks_server/migrations/20250816215102447/definition.sql similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816215102447/definition.sql rename to wien_talks_server/migrations/20250816215102447/definition.sql diff --git a/wien_talks/wien_talks_server/migrations/20250816215102447/definition_project.json b/wien_talks_server/migrations/20250816215102447/definition_project.json similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816215102447/definition_project.json rename to wien_talks_server/migrations/20250816215102447/definition_project.json diff --git a/wien_talks/wien_talks_server/migrations/20250816215102447/migration.json b/wien_talks_server/migrations/20250816215102447/migration.json similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816215102447/migration.json rename to wien_talks_server/migrations/20250816215102447/migration.json diff --git a/wien_talks/wien_talks_server/migrations/20250816215102447/migration.sql b/wien_talks_server/migrations/20250816215102447/migration.sql similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816215102447/migration.sql rename to wien_talks_server/migrations/20250816215102447/migration.sql diff --git a/wien_talks/wien_talks_server/migrations/20250816220051483/definition.json b/wien_talks_server/migrations/20250816220051483/definition.json similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816220051483/definition.json rename to wien_talks_server/migrations/20250816220051483/definition.json diff --git a/wien_talks/wien_talks_server/migrations/20250816220051483/definition.sql b/wien_talks_server/migrations/20250816220051483/definition.sql similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816220051483/definition.sql rename to wien_talks_server/migrations/20250816220051483/definition.sql diff --git a/wien_talks/wien_talks_server/migrations/20250816220051483/definition_project.json b/wien_talks_server/migrations/20250816220051483/definition_project.json similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816220051483/definition_project.json rename to wien_talks_server/migrations/20250816220051483/definition_project.json diff --git a/wien_talks/wien_talks_server/migrations/20250816220051483/migration.json b/wien_talks_server/migrations/20250816220051483/migration.json similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816220051483/migration.json rename to wien_talks_server/migrations/20250816220051483/migration.json diff --git a/wien_talks/wien_talks_server/migrations/20250816220051483/migration.sql b/wien_talks_server/migrations/20250816220051483/migration.sql similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816220051483/migration.sql rename to wien_talks_server/migrations/20250816220051483/migration.sql diff --git a/wien_talks/wien_talks_server/migrations/migration_registry.txt b/wien_talks_server/migrations/migration_registry.txt similarity index 100% rename from wien_talks/wien_talks_server/migrations/migration_registry.txt rename to wien_talks_server/migrations/migration_registry.txt diff --git a/wien_talks/wien_talks_server/pubspec.lock b/wien_talks_server/pubspec.lock similarity index 100% rename from wien_talks/wien_talks_server/pubspec.lock rename to wien_talks_server/pubspec.lock diff --git a/wien_talks/wien_talks_server/pubspec.yaml b/wien_talks_server/pubspec.yaml similarity index 100% rename from wien_talks/wien_talks_server/pubspec.yaml rename to wien_talks_server/pubspec.yaml diff --git a/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart b/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart similarity index 100% rename from wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart rename to wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart diff --git a/wien_talks/wien_talks_server/web/static/css/style.css b/wien_talks_server/web/static/css/style.css similarity index 100% rename from wien_talks/wien_talks_server/web/static/css/style.css rename to wien_talks_server/web/static/css/style.css diff --git a/wien_talks/wien_talks_server/web/static/images/background.svg b/wien_talks_server/web/static/images/background.svg similarity index 100% rename from wien_talks/wien_talks_server/web/static/images/background.svg rename to wien_talks_server/web/static/images/background.svg diff --git a/wien_talks/wien_talks_server/web/static/images/serverpod-logo.svg b/wien_talks_server/web/static/images/serverpod-logo.svg similarity index 100% rename from wien_talks/wien_talks_server/web/static/images/serverpod-logo.svg rename to wien_talks_server/web/static/images/serverpod-logo.svg diff --git a/wien_talks/wien_talks_server/web/templates/built_with_serverpod.html b/wien_talks_server/web/templates/built_with_serverpod.html similarity index 100% rename from wien_talks/wien_talks_server/web/templates/built_with_serverpod.html rename to wien_talks_server/web/templates/built_with_serverpod.html