From 5398283d30e899834909362d77f8d76eb5e7783d Mon Sep 17 00:00:00 2001 From: CodeDoctorDE Date: Thu, 23 May 2024 17:14:57 +0200 Subject: [PATCH] Rename to quokka --- .github/workflows/build.yml | 180 +- .github/workflows/release.yml | 114 +- FLUTTER_VERSION | 2 +- README.md | 2 +- app/.metadata | 30 +- app/AppImageBuilder.yml | 6 +- app/DmgSetup.json | 6 +- app/{QeckSetup.iss => QuokkaSetup.iss} | 8 +- app/README.md | 2 +- app/android/app/build.gradle | 86 +- app/android/app/src/main/AndroidManifest.xml | 16 +- .../kotlin/dev/linwood/qeck/MainActivity.kt | 6 - .../kotlin/dev/linwood/quokka/MainActivity.kt | 5 + .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 402 -> 442 bytes app/android/build.gradle | 17 +- app/android/fastlane/Appfile | 2 +- app/android/fastlane/Screengrabfile | 2 +- app/android/gradle.properties | 5 +- app/android/settings.gradle | 30 +- ...eck.tiled-project => quokka.tiled-project} | 0 app/ios/Flutter/AppFrameworkInfo.plist | 2 +- app/ios/Runner.xcodeproj/project.pbxproj | 52 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- app/ios/Runner/AppDelegate.swift | 2 +- app/ios/Runner/Info.plist | 6 +- .../{open_release_notes.dart => open.dart} | 4 +- app/lib/cubits/settings.dart | 13 +- app/lib/cubits/settings.mapper.dart | 100 +- app/lib/game/world/game.dart | 8 +- app/lib/game/world/inventory.dart | 2 +- app/lib/game/world/player.dart | 8 +- app/lib/logic/connection/client.dart | 147 - app/lib/logic/connection/client.freezed.dart | 679 --- app/lib/logic/connection/client.g.dart | 56 - app/lib/logic/connection/logic.dart | 46 - app/lib/logic/connection/logic.freezed.dart | 769 ---- app/lib/logic/connection/logic.g.dart | 61 - app/lib/logic/connection/server.dart | 415 -- app/lib/logic/connection/server.freezed.dart | 3708 ----------------- app/lib/logic/connection/server.g.dart | 231 - app/lib/logic/state.dart | 207 - app/lib/logic/state.freezed.dart | 1677 -------- app/lib/logic/state.g.dart | 149 - app/lib/main.dart | 34 +- app/lib/models/deck.dart | 2 +- app/lib/models/message.dart | 2 +- app/lib/models/object.dart | 2 +- app/lib/models/pack.dart | 6 +- app/lib/pages/board/connect.dart | 2 +- app/lib/pages/board/create.dart | 2 +- app/lib/pages/board/page.dart | 18 +- app/lib/pages/board/servers.dart | 10 +- app/lib/pages/game/card.dart | 25 - app/lib/pages/game/cards.dart | 337 -- app/lib/pages/game/deck.dart | 437 -- app/lib/pages/game/page.dart | 56 - app/lib/pages/game/players.dart | 32 - app/lib/pages/game/seat.dart | 162 - app/lib/pages/game/view.dart | 133 - app/lib/pages/game/widget.dart | 1 - app/lib/pages/home/connect.dart | 68 - app/lib/pages/home/create.dart | 56 - app/lib/pages/home/page.dart | 48 +- app/lib/pages/settings/general.dart | 2 +- app/lib/pages/settings/packs.dart | 6 +- app/lib/pages/settings/page.dart | 2 +- app/lib/pages/settings/personalization.dart | 2 +- app/lib/services/client.dart | 4 +- app/lib/services/messenger.dart | 4 +- app/lib/services/network.dart | 8 +- app/lib/services/packs.dart | 2 +- app/lib/services/server.dart | 8 +- app/lib/setup_io.dart | 2 +- app/lib/widgets/window.dart | 4 +- app/linux/CMakeLists.txt | 4 +- app/linux/debian/DEBIAN/control | 6 +- ...eck.desktop => dev.linwood.quokka.desktop} | 6 +- ...ata.xml => dev.linwood.quokka.appdata.xml} | 18 +- app/linux/my_application.cc | 24 +- app/linux/rpm/linwood-qeck.desktop | 8 - app/linux/rpm/linwood-quokka.desktop | 8 + ...{linwood-qeck.spec => linwood-quokka.spec} | 4 +- app/macos/Runner.xcodeproj/project.pbxproj | 30 +- .../xcshareddata/xcschemes/Runner.xcscheme | 10 +- .../AppIcon.appiconset/app_icon_1024.png | Bin 57348 -> 102994 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 3965 -> 5680 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 359 -> 520 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 9586 -> 14142 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 751 -> 1066 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 22526 -> 36406 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 1461 -> 2218 bytes app/macos/Runner/Configs/AppInfo.xcconfig | 6 +- app/macos/RunnerTests/RunnerTests.swift | 2 +- app/package.json | 2 +- app/pubspec.lock | 121 +- app/pubspec.yaml | 17 +- app/scripts/build-rpm.sh | 30 +- app/scripts/build.sh | 4 +- app/scripts/start.bat | 2 +- app/scripts/start.sh | 2 +- app/web/favicon.png | Bin 435 -> 917 bytes app/web/icons/Icon-192.png | Bin 1759 -> 5292 bytes app/web/icons/Icon-512.png | Bin 4747 -> 8252 bytes app/web/icons/Icon-maskable-192.png | Bin 3620 -> 5594 bytes app/web/icons/Icon-maskable-512.png | Bin 10934 -> 20998 bytes app/web/index.html | 27 +- app/web/manifest.json | 4 +- app/windows/CMakeLists.txt | 4 +- app/windows/runner/Runner.rc | 8 +- app/windows/runner/main.cpp | 2 +- app/windows/runner/utils.cpp | 4 +- docs/community/branding.md | 2 +- docs/community/downloads/android.md | 16 +- docs/community/downloads/download.md | 8 +- docs/community/downloads/linux.md | 22 +- docs/community/downloads/macos.md | 6 +- docs/community/downloads/selfhosting.md | 10 +- docs/community/downloads/web.md | 10 +- docs/community/downloads/windows.md | 14 +- docs/community/intro.md | 2 +- docs/community/nightly.md | 2 +- docs/community/privacypolicy.md | 4 +- docs/docusaurus.config.js | 24 +- docs/generate_meta.mjs | 10 +- docs/sidebarsCommunity.js | 2 +- tools/pubspec.yaml | 2 +- 126 files changed, 654 insertions(+), 10173 deletions(-) rename app/{QeckSetup.iss => QuokkaSetup.iss} (92%) delete mode 100644 app/android/app/src/main/kotlin/dev/linwood/qeck/MainActivity.kt create mode 100644 app/android/app/src/main/kotlin/dev/linwood/quokka/MainActivity.kt rename app/assets/{qeck.tiled-project => quokka.tiled-project} (100%) rename app/lib/api/{open_release_notes.dart => open.dart} (69%) delete mode 100644 app/lib/logic/connection/client.dart delete mode 100644 app/lib/logic/connection/client.freezed.dart delete mode 100644 app/lib/logic/connection/client.g.dart delete mode 100644 app/lib/logic/connection/logic.dart delete mode 100644 app/lib/logic/connection/logic.freezed.dart delete mode 100644 app/lib/logic/connection/logic.g.dart delete mode 100644 app/lib/logic/connection/server.dart delete mode 100644 app/lib/logic/connection/server.freezed.dart delete mode 100644 app/lib/logic/connection/server.g.dart delete mode 100644 app/lib/logic/state.dart delete mode 100644 app/lib/logic/state.freezed.dart delete mode 100644 app/lib/logic/state.g.dart delete mode 100644 app/lib/pages/game/card.dart delete mode 100644 app/lib/pages/game/cards.dart delete mode 100644 app/lib/pages/game/deck.dart delete mode 100644 app/lib/pages/game/page.dart delete mode 100644 app/lib/pages/game/players.dart delete mode 100644 app/lib/pages/game/seat.dart delete mode 100644 app/lib/pages/game/view.dart delete mode 100644 app/lib/pages/game/widget.dart delete mode 100644 app/lib/pages/home/connect.dart delete mode 100644 app/lib/pages/home/create.dart rename app/linux/debian/usr/share/applications/{dev.linwood.qeck.desktop => dev.linwood.quokka.desktop} (64%) rename app/linux/debian/usr/share/metainfo/{dev.linwood.qeck.appdata.xml => dev.linwood.quokka.appdata.xml} (57%) delete mode 100644 app/linux/rpm/linwood-qeck.desktop create mode 100644 app/linux/rpm/linwood-quokka.desktop rename app/linux/rpm/{linwood-qeck.spec => linwood-quokka.spec} (90%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9c4a679..f17956a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -55,46 +55,46 @@ jobs: if: ${{ github.ref != 'refs/tags/stable' && (github.event_name != 'release' || github.event.prerelease) }} run: | flutter build apk -v --release --flavor nightly --dart-define=flavor=nightly - cp build/app/outputs/flutter-apk/app-nightly-release.apk linwood-qeck-android.apk + cp build/app/outputs/flutter-apk/app-nightly-release.apk linwood-quokka-android.apk - name: 🏭 Build production if: ${{ github.ref == 'refs/tags/stable' || (github.event_name == 'release' && !github.event.prerelease) }} run: | flutter build apk -v --release --flavor production - cp build/app/outputs/flutter-apk/app-production-release.apk linwood-qeck-android.apk + cp build/app/outputs/flutter-apk/app-production-release.apk linwood-quokka-android.apk - name: Archive uses: actions/upload-artifact@v4 with: name: apk-build - path: app/linwood-qeck-android.apk + path: app/linwood-quokka-android.apk - name: 🏭 Build architecture nightly if: ${{ github.ref != 'refs/tags/stable' && (github.event_name != 'release' || github.event.prerelease) }} run: | flutter build apk -v --release --target-platform android-arm,android-arm64,android-x64 --split-per-abi --flavor nightly --dart-define=flavor=nightly - cp build/app/outputs/flutter-apk/app-armeabi-v7a-nightly-release.apk linwood-qeck-android-arm.apk - cp build/app/outputs/flutter-apk/app-arm64-v8a-nightly-release.apk linwood-qeck-android-arm64.apk - cp build/app/outputs/flutter-apk/app-x86_64-nightly-release.apk linwood-qeck-android-x86_64.apk + cp build/app/outputs/flutter-apk/app-armeabi-v7a-nightly-release.apk linwood-quokka-android-arm.apk + cp build/app/outputs/flutter-apk/app-arm64-v8a-nightly-release.apk linwood-quokka-android-arm64.apk + cp build/app/outputs/flutter-apk/app-x86_64-nightly-release.apk linwood-quokka-android-x86_64.apk - name: 🏭 Build architecture production if: ${{ github.ref == 'refs/tags/stable' || (github.event_name == 'release' && !github.event.prerelease) }} run: | flutter build apk -v --release --target-platform android-arm,android-arm64,android-x64 --split-per-abi --flavor production - cp build/app/outputs/flutter-apk/app-armeabi-v7a-production-release.apk linwood-qeck-android-arm.apk - cp build/app/outputs/flutter-apk/app-arm64-v8a-production-release.apk linwood-qeck-android-arm64.apk - cp build/app/outputs/flutter-apk/app-x86_64-production-release.apk linwood-qeck-android-x86_64.apk + cp build/app/outputs/flutter-apk/app-armeabi-v7a-production-release.apk linwood-quokka-android-arm.apk + cp build/app/outputs/flutter-apk/app-arm64-v8a-production-release.apk linwood-quokka-android-arm64.apk + cp build/app/outputs/flutter-apk/app-x86_64-production-release.apk linwood-quokka-android-x86_64.apk - name: Archive uses: actions/upload-artifact@v4 with: name: apk-arm-build - path: app/linwood-qeck-android-arm.apk + path: app/linwood-quokka-android-arm.apk - name: Archive uses: actions/upload-artifact@v4 with: name: apk-arm64-build - path: app/linwood-qeck-android-arm64.apk + path: app/linwood-quokka-android-arm64.apk - name: Archive uses: actions/upload-artifact@v4 with: name: apk-x86_64-build - path: app/linwood-qeck-android-x86_64.apk + path: app/linwood-quokka-android-x86_64.apk build-windows: runs-on: windows-2022 defaults: @@ -136,13 +136,13 @@ jobs: - name: Build setup shell: pwsh run: | - Get-Content pubspec.yaml | Select-String -Pattern 'version:\s(.+)\+' | % {Set-Item -Path Env:QECK_VERSION -Value "$($_.matches.groups[1])"} - & 'C:/Program Files (x86)/Inno Setup 6/ISCC.exe' /DMyAppVersion=$Env:QECK_VERSION QeckSetup.iss + Get-Content pubspec.yaml | Select-String -Pattern 'version:\s(.+)\+' | % {Set-Item -Path Env:QUOKKA_VERSION -Value "$($_.matches.groups[1])"} + & 'C:/Program Files (x86)/Inno Setup 6/ISCC.exe' /DMyAppVersion=$Env:QUOKKA_VERSION QuokkaSetup.iss # flutter pub run msix:create - name: Copy portable start script run: | cp scripts/start.bat build/windows/x64/runner/Release/ - cp build/windows/x64/linwood-qeck-windows-setup.exe linwood-qeck-windows-setup-x86_64.exe + cp build/windows/x64/linwood-quokka-windows-setup.exe linwood-quokka-windows-setup-x86_64.exe - name: Archive uses: actions/upload-artifact@v4 with: @@ -154,7 +154,7 @@ jobs: with: name: windows-setup path: | - app/linwood-qeck-windows-setup-x86_64.exe + app/linwood-quokka-windows-setup-x86_64.exe build-linux: runs-on: ubuntu-22.04 defaults: @@ -218,12 +218,12 @@ jobs: flutter build linux -v --release --dart-define=flavor=production - name: 🏭 Make binary executable run: | - chmod +x build/linux/x64/release/bundle/qeck + chmod +x build/linux/x64/release/bundle/quokka - name: Build .deb executable run: | cp -fr build/linux/x64/release/bundle linux/debian/usr/bin dpkg-deb --build --root-owner-group linux/debian - cp linux/*.deb linwood-qeck-linux-x86_64.deb + cp linux/*.deb linwood-quokka-linux-x86_64.deb - name: Build .rpm executable run: | bash scripts/build-rpm.sh @@ -235,13 +235,13 @@ jobs: appimage-builder --recipe AppImageBuilder.yml --skip-test - name: Copy nessessary files run: | - cp assets/images/logo.svg build/linux/x64/release/bundle/dev.linwood.qeck.svg + cp assets/images/logo.svg build/linux/x64/release/bundle/dev.linwood.quokka.svg mkdir -p build/linux/x64/release/bundle/usr/share cp -r linux/debian/usr/share build/linux/x64/release/bundle/usr - name: Rename AppImage run: | ls - mv ./*.AppImage linwood-qeck-linux-x86_64.AppImage + mv ./*.AppImage linwood-quokka-linux-x86_64.AppImage - name: Copy portable start script run: | chmod +x scripts/start.sh @@ -257,19 +257,19 @@ jobs: with: name: linux-deb path: | - app/linwood-qeck-linux-x86_64.deb + app/linwood-quokka-linux-x86_64.deb - name: Archive .rpm uses: actions/upload-artifact@v4 with: name: linux-rpm path: | - app/build/linwood-qeck-linux-x86_64.rpm + app/build/linwood-quokka-linux-x86_64.rpm - name: Archive .AppImage uses: actions/upload-artifact@v4 with: name: linux-appimage path: | - app/linwood-qeck-linux-x86_64.AppImage + app/linwood-quokka-linux-x86_64.AppImage build-flatpak: name: build-flatpak runs-on: ubuntu-20.04 @@ -333,11 +333,11 @@ jobs: flutter build linux -v --release --dart-define=flavor=production - name: Copy nessessary files run: | - cp assets/images/logo.svg build/linux/x64/release/bundle/dev.linwood.qeck.svg + cp assets/images/logo.svg build/linux/x64/release/bundle/dev.linwood.quokka.svg mkdir -p build/linux/x64/release/bundle/usr/share cp -r linux/debian/usr/share build/linux/x64/release/bundle/usr - name: Compress Flutter build - run: tar -C build/linux/x64/release/bundle -czf linwood-qeck-linux-portable-x86_64.tar.gz . + run: tar -C build/linux/x64/release/bundle -czf linwood-quokka-linux-portable-x86_64.tar.gz . # - name: Install flatpak # run: | # sudo apt-get update @@ -351,12 +351,12 @@ jobs: # run: | # flatpak run org.flatpak.Builder -v --force-clean --sandbox --delete-build-dirs --user --install-deps-from=flathub --arch=x86_64 flatpak_app flatpak.json --bundle-sources # flatpak build-export export flatpak_app -v - # flatpak build-bundle export linwood-qeck-linux.flatpak dev.linwood.qeck -v + # flatpak build-bundle export linwood-quokka-linux.flatpak dev.linwood.quokka -v # - name: Upload .flatpak artifact to workflow # uses: actions/upload-artifact@v4 # with: # name: linux-flatpak - # path: app/linwood-qeck-linux.flatpak + # path: app/linwood-quokka-linux.flatpak - name: Archive old portable uses: actions/upload-artifact@v4 with: @@ -397,7 +397,7 @@ jobs: flutter build macos -v --release - name: Zip file working-directory: app/build/macos/Build/Products/Release - run: zip --symlinks -qr linwood-qeck-macos.zip qeck.app + run: zip --symlinks -qr linwood-quokka-macos.zip quokka.app - name: Setup node uses: actions/setup-node@v4 with: @@ -406,19 +406,19 @@ jobs: run: npm install -g appdmg - name: Create dmg run: | - appdmg DmgSetup.json linwood-qeck-macos.dmg + appdmg DmgSetup.json linwood-quokka-macos.dmg - name: Archive uses: actions/upload-artifact@v4 with: name: macos-build path: | - app/build/macos/Build/Products/Release/linwood-qeck-macos.zip + app/build/macos/Build/Products/Release/linwood-quokka-macos.zip - name: Archive uses: actions/upload-artifact@v4 with: name: macos-dmg path: | - app/linwood-qeck-macos.dmg + app/linwood-quokka-macos.dmg build-ipa: name: build-ipa (iOS) @@ -455,14 +455,14 @@ jobs: rm -rf Payload mkdir Payload cp -R Runner.app Payload/ - rm -f linwood-qeck-ios.ipa - zip -vr linwood-qeck-ios.ipa Payload/ -# ls -l linwood-qeck-ios.ipa + rm -f linwood-quokka-ios.ipa + zip -vr linwood-quokka-ios.ipa Payload/ +# ls -l linwood-quokka-ios.ipa - name: Archive uses: actions/upload-artifact@v4 with: name: ipa-build - path: app/build/ios/iphoneos/linwood-qeck-ios.ipa + path: app/build/ios/iphoneos/linwood-quokka-ios.ipa compression-level: 0 #ipa is already compressed # build-snap: @@ -483,14 +483,14 @@ jobs: # architecture: ${{ matrix.architecture }} # - uses: actions/upload-artifact@v4 # with: - # name: qeck-snap + # name: quokka-snap # path: ${{ steps.build.outputs.snap }} deploy: runs-on: ubuntu-22.04 if: github.event_name != 'pull_request' outputs: - version: ${{ steps.setup.outputs.QECK_VERSION }} - build_number: ${{ steps.setup.outputs.QECK_BUILD_NUMBER }} + version: ${{ steps.setup.outputs.QUOKKA_VERSION }} + build_number: ${{ steps.setup.outputs.QUOKKA_BUILD_NUMBER }} needs: - build-apk - build-windows @@ -508,14 +508,14 @@ jobs: - name: Setup git id: setup run: | - QECK_VERSION_REGEX="version:\s(.+)\+(.+)" - [[ $(grep -E "${QECK_VERSION_REGEX}" app/pubspec.yaml) =~ ${QECK_VERSION_REGEX} ]] - QECK_VERSION="${BASH_REMATCH[1]}" - echo "QECK_VERSION=${QECK_VERSION}" >> $GITHUB_ENV - echo "QECK_VERSION=${QECK_VERSION}" >> $GITHUB_OUTPUT - QECK_BUILD_NUMBER="${BASH_REMATCH[2]}" - echo "QECK_BUILD_NUMBER=${QECK_BUILD_NUMBER}" >> $GITHUB_ENV - echo "QECK_BUILD_NUMBER=${QECK_BUILD_NUMBER}" >> $GITHUB_OUTPUT + QUOKKA_VERSION_REGEX="version:\s(.+)\+(.+)" + [[ $(grep -E "${QUOKKA_VERSION_REGEX}" app/pubspec.yaml) =~ ${QUOKKA_VERSION_REGEX} ]] + QUOKKA_VERSION="${BASH_REMATCH[1]}" + echo "QUOKKA_VERSION=${QUOKKA_VERSION}" >> $GITHUB_ENV + echo "QUOKKA_VERSION=${QUOKKA_VERSION}" >> $GITHUB_OUTPUT + QUOKKA_BUILD_NUMBER="${BASH_REMATCH[2]}" + echo "QUOKKA_BUILD_NUMBER=${QUOKKA_BUILD_NUMBER}" >> $GITHUB_ENV + echo "QUOKKA_BUILD_NUMBER=${QUOKKA_BUILD_NUMBER}" >> $GITHUB_OUTPUT git config --global user.email "ci@linwood.dev" git config --global user.name "Linwood CI" - uses: actions/download-artifact@v4 @@ -565,9 +565,9 @@ jobs: name: ipa-build - name: 📦 Zip artifacts run: | - zip -r linwood-qeck-windows-x86_64.zip windows-build/* - tar -C linux-build -czf linwood-qeck-linux-x86_64.tar.gz . - tar -C linux-alternative-portable -czf linwood-qeck-linux-alternative-x86_64.tar.gz . + zip -r linwood-quokka-windows-x86_64.zip windows-build/* + tar -C linux-build -czf linwood-quokka-linux-x86_64.tar.gz . + tar -C linux-alternative-portable -czf linwood-quokka-linux-alternative-x86_64.tar.gz . - name: Configure git if: ${{ github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/main' }} run: | @@ -583,17 +583,17 @@ jobs: prerelease: true tag_name: stable files: | - linwood-qeck-windows-setup-x86_64.exe - linwood-qeck-windows-x86_64.zip - linwood-qeck-linux-x86_64.tar.gz - linwood-qeck-linux-alternative-x86_64.tar.gz - linwood-qeck-linux-x86_64.deb - linwood-qeck-linux-x86_64.rpm - linwood-qeck-linux-x86_64.AppImage - linwood-qeck-macos.zip - linwood-qeck-macos.dmg - linwood-qeck-android.apk - linwood-qeck-ios.ipa + linwood-quokka-windows-setup-x86_64.exe + linwood-quokka-windows-x86_64.zip + linwood-quokka-linux-x86_64.tar.gz + linwood-quokka-linux-alternative-x86_64.tar.gz + linwood-quokka-linux-x86_64.deb + linwood-quokka-linux-x86_64.rpm + linwood-quokka-linux-x86_64.AppImage + linwood-quokka-macos.zip + linwood-quokka-macos.dmg + linwood-quokka-android.apk + linwood-quokka-ios.ipa env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: 🚀 Deploy nightly @@ -604,20 +604,20 @@ jobs: prerelease: true tag_name: nightly files: | - linwood-qeck-windows-setup-x86_64.exe - linwood-qeck-windows-x86_64.zip - linwood-qeck-linux-x86_64.tar.gz - linwood-qeck-linux-alternative-x86_64.tar.gz - linwood-qeck-linux-x86_64.deb - linwood-qeck-linux-x86_64.rpm - linwood-qeck-linux-x86_64.AppImage - linwood-qeck-macos.zip - linwood-qeck-macos.dmg - linwood-qeck-android.apk - linwood-qeck-android-arm.apk - linwood-qeck-android-arm64.apk - linwood-qeck-android-x86_64.apk - linwood-qeck-ios.ipa + linwood-quokka-windows-setup-x86_64.exe + linwood-quokka-windows-x86_64.zip + linwood-quokka-linux-x86_64.tar.gz + linwood-quokka-linux-alternative-x86_64.tar.gz + linwood-quokka-linux-x86_64.deb + linwood-quokka-linux-x86_64.rpm + linwood-quokka-linux-x86_64.AppImage + linwood-quokka-macos.zip + linwood-quokka-macos.dmg + linwood-quokka-android.apk + linwood-quokka-android-arm.apk + linwood-quokka-android-arm64.apk + linwood-quokka-android-x86_64.apk + linwood-quokka-ios.ipa env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Release @@ -626,20 +626,20 @@ jobs: if: startsWith(github.ref, 'refs/tags/v') with: files: | - linwood-qeck-windows-setup-x86_64.exe - linwood-qeck-windows-x86_64.zip - linwood-qeck-linux-x86_64.tar.gz - linwood-qeck-linux-alternative-x86_64.tar.gz - linwood-qeck-linux-x86_64.deb - linwood-qeck-linux-x86_64.rpm - linwood-qeck-linux-x86_64.AppImage - linwood-qeck-macos.zip - linwood-qeck-macos.dmg - linwood-qeck-android.apk - linwood-qeck-android-arm.apk - linwood-qeck-android-arm64.apk - linwood-qeck-android-x86_64.apk - linwood-qeck-ios.ipa + linwood-quokka-windows-setup-x86_64.exe + linwood-quokka-windows-x86_64.zip + linwood-quokka-linux-x86_64.tar.gz + linwood-quokka-linux-alternative-x86_64.tar.gz + linwood-quokka-linux-x86_64.deb + linwood-quokka-linux-x86_64.rpm + linwood-quokka-linux-x86_64.AppImage + linwood-quokka-macos.zip + linwood-quokka-macos.dmg + linwood-quokka-android.apk + linwood-quokka-android-arm.apk + linwood-quokka-android-arm64.apk + linwood-quokka-android-x86_64.apk + linwood-quokka-ios.ipa env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} deploy-to-play-store: @@ -714,14 +714,14 @@ jobs: - if: ${{ github.ref == 'refs/tags/stable' || (github.event_name == 'release' && !github.event.prerelease) }} uses: vedantmgoyal2009/winget-releaser@v2 with: - identifier: LinwoodCloud.Qeck + identifier: LinwoodCloud.Quokka version: ${{ needs.deploy.outputs.version }} release-tag: v${{ needs.deploy.outputs.version }} token: ${{ secrets.CI_PAT }} - if: ${{ github.ref == 'refs/tags/nightly' }} uses: vedantmgoyal2009/winget-releaser@v2 with: - identifier: LinwoodCloud.Qeck.Nightly + identifier: LinwoodCloud.Quokka.Nightly version: ${{ needs.deploy.outputs.version }} release-tag: v${{ needs.deploy.outputs.version }} token: ${{ secrets.CI_PAT }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 10a58c6..3db0a8e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -32,12 +32,12 @@ jobs: - name: Setup git id: setup run: | - QECK_VERSION_REGEX="version:\s(.+)\+(.+)" - [[ $(grep -E "${QECK_VERSION_REGEX}" app/pubspec.yaml) =~ ${QECK_VERSION_REGEX} ]] - QECK_VERSION="${BASH_REMATCH[1]}" - echo "QECK_VERSION=${QECK_VERSION}" >> $GITHUB_ENV - QECK_BUILD_NUMBER="${BASH_REMATCH[2]}" - echo "QECK_BUILD_NUMBER=${QECK_BUILD_NUMBER}" >> $GITHUB_ENV + QUOKKA_VERSION_REGEX="version:\s(.+)\+(.+)" + [[ $(grep -E "${QUOKKA_VERSION_REGEX}" app/pubspec.yaml) =~ ${QUOKKA_VERSION_REGEX} ]] + QUOKKA_VERSION="${BASH_REMATCH[1]}" + echo "QUOKKA_VERSION=${QUOKKA_VERSION}" >> $GITHUB_ENV + QUOKKA_BUILD_NUMBER="${BASH_REMATCH[2]}" + echo "QUOKKA_BUILD_NUMBER=${QUOKKA_BUILD_NUMBER}" >> $GITHUB_ENV git config --global user.email "ci@linwood.dev" git config --global user.name "Linwood CI" - name: Update changelog @@ -45,9 +45,9 @@ jobs: git fetch git pull origin dart pub get -C tools - dart run tools/set_version.dart --build-number keep ${{ env.QECK_VERSION }} --changelog + dart run tools/set_version.dart --build-number keep ${{ env.QUOKKA_VERSION }} --changelog git add . - git commit -m "Add changelog of v${{ env.QECK_VERSION }}" + git commit -m "Add changelog of v${{ env.QUOKKA_VERSION }}" git push origin - name: Merge in develop if: ${{ github.ref == 'refs/heads/main' }} @@ -62,8 +62,8 @@ jobs: needs: - update-changelog outputs: - version: ${{ steps.setup.outputs.QECK_VERSION }} - build_number: ${{ steps.setup.outputs.QECK_BUILD_NUMBER }} + version: ${{ steps.setup.outputs.QUOKKA_VERSION }} + build_number: ${{ steps.setup.outputs.QUOKKA_BUILD_NUMBER }} steps: - uses: actions/checkout@v4 with: @@ -82,21 +82,21 @@ jobs: id: setup shell: bash run: | - QECK_VERSION_REGEX="version:\s(.+)\+(.+)" - [[ $(grep -E "${QECK_VERSION_REGEX}" app/pubspec.yaml) =~ ${QECK_VERSION_REGEX} ]] - QECK_VERSION="${BASH_REMATCH[1]}" - echo "QECK_VERSION=${QECK_VERSION}" >> $GITHUB_ENV - echo "QECK_VERSION=${QECK_VERSION}" >> $GITHUB_OUTPUT - QECK_BUILD_NUMBER="${BASH_REMATCH[2]}" - echo "QECK_BUILD_NUMBER=${QECK_BUILD_NUMBER}" >> $GITHUB_ENV - echo "QECK_BUILD_NUMBER=${QECK_BUILD_NUMBER}" >> $GITHUB_OUTPUT + QUOKKA_VERSION_REGEX="version:\s(.+)\+(.+)" + [[ $(grep -E "${QUOKKA_VERSION_REGEX}" app/pubspec.yaml) =~ ${QUOKKA_VERSION_REGEX} ]] + QUOKKA_VERSION="${BASH_REMATCH[1]}" + echo "QUOKKA_VERSION=${QUOKKA_VERSION}" >> $GITHUB_ENV + echo "QUOKKA_VERSION=${QUOKKA_VERSION}" >> $GITHUB_OUTPUT + QUOKKA_BUILD_NUMBER="${BASH_REMATCH[2]}" + echo "QUOKKA_BUILD_NUMBER=${QUOKKA_BUILD_NUMBER}" >> $GITHUB_ENV + echo "QUOKKA_BUILD_NUMBER=${QUOKKA_BUILD_NUMBER}" >> $GITHUB_OUTPUT git config --global user.email "ci@linwood.dev" git config --global user.name "Linwood CI" - name: Create tag run: | - QECK_VERSION="${{ env.QECK_VERSION }}" - git tag -fa v${{ env.QECK_VERSION }} -m "Release ${QECK_VERSION}" - git push origin v${QECK_VERSION} -f + QUOKKA_VERSION="${{ env.QUOKKA_VERSION }}" + git tag -fa v${{ env.QUOKKA_VERSION }} -m "Release ${QUOKKA_VERSION}" + git push origin v${QUOKKA_VERSION} -f - uses: actions/checkout@v4 with: token: ${{ secrets.CI_PAT }} @@ -105,10 +105,10 @@ jobs: uses: softprops/action-gh-release@v2 with: prerelease: ${{ github.event.inputs.stable != 'true' }} - tag_name: v${{ env.QECK_VERSION }} - name: v${{ env.QECK_VERSION }} + tag_name: v${{ env.QUOKKA_VERSION }} + name: v${{ env.QUOKKA_VERSION }} token: ${{ secrets.CI_PAT }} - body_path: fastlane/metadata/android/en-US/changelogs/${{ env.QECK_BUILD_NUMBER }}.txt + body_path: fastlane/metadata/android/en-US/changelogs/${{ env.QUOKKA_BUILD_NUMBER }}.txt - name: Retag stable if: ${{ github.event.inputs.stable == 'true' || github.ref == 'refs/heads/main' }} run: | @@ -148,12 +148,12 @@ jobs: - name: Setup git id: setup run: | - QECK_VERSION_REGEX="version:\s(.+)\+(.+)" - [[ $(grep -E "${QECK_VERSION_REGEX}" app/pubspec.yaml) =~ ${QECK_VERSION_REGEX} ]] - QECK_VERSION="${BASH_REMATCH[1]}" - echo "QECK_VERSION=${QECK_VERSION}" >> $GITHUB_ENV - QECK_BUILD_NUMBER="${BASH_REMATCH[2]}" - echo "QECK_BUILD_NUMBER=${QECK_BUILD_NUMBER}" >> $GITHUB_ENV + QUOKKA_VERSION_REGEX="version:\s(.+)\+(.+)" + [[ $(grep -E "${QUOKKA_VERSION_REGEX}" app/pubspec.yaml) =~ ${QUOKKA_VERSION_REGEX} ]] + QUOKKA_VERSION="${BASH_REMATCH[1]}" + echo "QUOKKA_VERSION=${QUOKKA_VERSION}" >> $GITHUB_ENV + QUOKKA_BUILD_NUMBER="${BASH_REMATCH[2]}" + echo "QUOKKA_BUILD_NUMBER=${QUOKKA_BUILD_NUMBER}" >> $GITHUB_ENV git config --global user.email "ci@linwood.dev" git config --global user.name "Linwood CI" - name: Set next version @@ -197,12 +197,12 @@ jobs: - name: Setup git id: setup run: | - QECK_VERSION_REGEX="version:\s(.+)\+(.+)" - [[ $(grep -E "${QECK_VERSION_REGEX}" app/pubspec.yaml) =~ ${QECK_VERSION_REGEX} ]] - QECK_VERSION="${BASH_REMATCH[1]}" - echo "QECK_VERSION=${QECK_VERSION}" >> $GITHUB_ENV - QECK_BUILD_NUMBER="${BASH_REMATCH[2]}" - echo "QECK_BUILD_NUMBER=${QECK_BUILD_NUMBER}" >> $GITHUB_ENV + QUOKKA_VERSION_REGEX="version:\s(.+)\+(.+)" + [[ $(grep -E "${QUOKKA_VERSION_REGEX}" app/pubspec.yaml) =~ ${QUOKKA_VERSION_REGEX} ]] + QUOKKA_VERSION="${BASH_REMATCH[1]}" + echo "QUOKKA_VERSION=${QUOKKA_VERSION}" >> $GITHUB_ENV + QUOKKA_BUILD_NUMBER="${BASH_REMATCH[2]}" + echo "QUOKKA_BUILD_NUMBER=${QUOKKA_BUILD_NUMBER}" >> $GITHUB_ENV git config --global user.email "ci@linwood.dev" git config --global user.name "Linwood CI" - name: Get flutter version @@ -224,7 +224,7 @@ jobs: git fetch git pull origin dart pub get -C tools - dart run tools/set_version.dart --build-number increment ${{ env.QECK_VERSION }} --no-changelog + dart run tools/set_version.dart --build-number increment ${{ env.QUOKKA_VERSION }} --no-changelog git add . git commit -m "Bump version" git push origin @@ -246,14 +246,14 @@ jobs: - name: Get information shell: bash run: | - QECK_VERSION_REGEX="version:\s(.+)\+(.+)" - [[ $(grep -E "${QECK_VERSION_REGEX}" app/pubspec.yaml) =~ ${QECK_VERSION_REGEX} ]] - QECK_VERSION="${BASH_REMATCH[1]}" - echo "QECK_VERSION=${QECK_VERSION}" >> $GITHUB_ENV - QECK_BUILD_NUMBER="${BASH_REMATCH[2]}" - echo "QECK_BUILD_NUMBER=${QECK_BUILD_NUMBER}" >> $GITHUB_ENV - echo 'QECK_CHANGELOG<> $GITHUB_ENV - cat fastlane/metadata/android/en-US/changelogs/${QECK_BUILD_NUMBER}.txt >> $GITHUB_ENV + QUOKKA_VERSION_REGEX="version:\s(.+)\+(.+)" + [[ $(grep -E "${QUOKKA_VERSION_REGEX}" app/pubspec.yaml) =~ ${QUOKKA_VERSION_REGEX} ]] + QUOKKA_VERSION="${BASH_REMATCH[1]}" + echo "QUOKKA_VERSION=${QUOKKA_VERSION}" >> $GITHUB_ENV + QUOKKA_BUILD_NUMBER="${BASH_REMATCH[2]}" + echo "QUOKKA_BUILD_NUMBER=${QUOKKA_BUILD_NUMBER}" >> $GITHUB_ENV + echo 'QUOKKA_CHANGELOG<> $GITHUB_ENV + cat fastlane/metadata/android/en-US/changelogs/${QUOKKA_BUILD_NUMBER}.txt >> $GITHUB_ENV echo '' >> $GITHUB_ENV echo 'EOF' >> $GITHUB_ENV - name: Discord Webhook Action @@ -261,23 +261,23 @@ jobs: if: ${{ github.event.inputs.stable == 'true' || github.ref == 'refs/heads/main' }} with: webhook-url: ${{ secrets.WEBHOOK_URL }} - embed-title: ${{ env.QECK_VERSION }} - embed-description: ${{ env.QECK_CHANGELOG }} - embed-url: https://github.com/LinwoodDev/qeck/releases/tag/v${{ env.QECK_VERSION }} + embed-title: ${{ env.QUOKKA_VERSION }} + embed-description: ${{ env.QUOKKA_CHANGELOG }} + embed-url: https://github.com/LinwoodDev/quokka/releases/tag/v${{ env.QUOKKA_VERSION }} content: | - Version ${{ env.QECK_VERSION }} released! - Download it here: https://qeck.linwood.dev/downloads - https://github.com/LinwoodDev/qeck/releases/tag/v${{ env.QECK_VERSION }} + Version ${{ env.QUOKKA_VERSION }} released! + Download it here: https://quokka.linwood.dev/downloads + https://github.com/LinwoodDev/quokka/releases/tag/v${{ env.QUOKKA_VERSION }} - name: Discord Webhook Action uses: tsickert/discord-webhook@v6.0.0 if: ${{ github.event.inputs.stable == 'false' && github.ref == 'refs/heads/develop' }} with: webhook-url: ${{ secrets.WEBHOOK_URL }} - embed-title: ${{ env.QECK_VERSION }} - embed-description: ${{ env.QECK_CHANGELOG }} - embed-url: https://github.com/LinwoodDev/qeck/releases/tag/v${{ env.QECK_VERSION }} + embed-title: ${{ env.QUOKKA_VERSION }} + embed-description: ${{ env.QUOKKA_CHANGELOG }} + embed-url: https://github.com/LinwoodDev/quokka/releases/tag/v${{ env.QUOKKA_VERSION }} content: | - Pre-release version ${{ env.QECK_VERSION }} released! - Download it here: https://qeck.linwood.dev/downloads + Pre-release version ${{ env.QUOKKA_VERSION }} released! + Download it here: https://quokka.linwood.dev/downloads Please note that this is a pre-release version and is not intended for production use. - Read more about it here: https://qeck.linwood.dev/nightly \ No newline at end of file + Read more about it here: https://quokka.linwood.dev/nightly \ No newline at end of file diff --git a/FLUTTER_VERSION b/FLUTTER_VERSION index ff6984e..50f12a4 100644 --- a/FLUTTER_VERSION +++ b/FLUTTER_VERSION @@ -1 +1 @@ -3.19.6 \ No newline at end of file +3.22.1 \ No newline at end of file diff --git a/README.md b/README.md index 1aff5bc..8a6cbea 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ -# Qeck +# Quokka > WIP: 🃏 Play games everywhere you like 🃏 diff --git a/app/.metadata b/app/.metadata index 32dc8a5..8ca14df 100644 --- a/app/.metadata +++ b/app/.metadata @@ -4,7 +4,7 @@ # This file should be version controlled and should not be manually edited. version: - revision: "300451adae589accbece3490f4396f10bdf15e6e" + revision: "5dcb86f68f239346676ceb1ed1ea385bd215fba1" channel: "stable" project_type: app @@ -13,26 +13,26 @@ project_type: app migration: platforms: - platform: root - create_revision: 300451adae589accbece3490f4396f10bdf15e6e - base_revision: 300451adae589accbece3490f4396f10bdf15e6e + create_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 + base_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 - platform: android - create_revision: 300451adae589accbece3490f4396f10bdf15e6e - base_revision: 300451adae589accbece3490f4396f10bdf15e6e + create_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 + base_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 - platform: ios - create_revision: 300451adae589accbece3490f4396f10bdf15e6e - base_revision: 300451adae589accbece3490f4396f10bdf15e6e + create_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 + base_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 - platform: linux - create_revision: 300451adae589accbece3490f4396f10bdf15e6e - base_revision: 300451adae589accbece3490f4396f10bdf15e6e + create_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 + base_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 - platform: macos - create_revision: 300451adae589accbece3490f4396f10bdf15e6e - base_revision: 300451adae589accbece3490f4396f10bdf15e6e + create_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 + base_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 - platform: web - create_revision: 300451adae589accbece3490f4396f10bdf15e6e - base_revision: 300451adae589accbece3490f4396f10bdf15e6e + create_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 + base_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 - platform: windows - create_revision: 300451adae589accbece3490f4396f10bdf15e6e - base_revision: 300451adae589accbece3490f4396f10bdf15e6e + create_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 + base_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 # User provided section diff --git a/app/AppImageBuilder.yml b/app/AppImageBuilder.yml index f5a4eec..35d337b 100644 --- a/app/AppImageBuilder.yml +++ b/app/AppImageBuilder.yml @@ -8,10 +8,10 @@ script: AppDir: path: ./AppDir app_info: - id: dev.linwood.qeck - name: Linwood Qeck + id: dev.linwood.quokka + name: Linwood Quokka version: 1.3.0-rc.0 - exec: qeck + exec: quokka exec_args: $@ apt: arch: amd64 diff --git a/app/DmgSetup.json b/app/DmgSetup.json index 2c45243..8b7f112 100644 --- a/app/DmgSetup.json +++ b/app/DmgSetup.json @@ -1,9 +1,9 @@ { - "title": "Linwood Qeck", - "icon": "build/macos/Build/Products/Release/qeck.app/Contents/Resources/AppIcon.icns", + "title": "Linwood Quokka", + "icon": "build/macos/Build/Products/Release/quokka.app/Contents/Resources/AppIcon.icns", "background-color": "#1b1b1d", "contents": [ { "x": 448, "y": 344, "type": "link", "path": "/Applications" }, - { "x": 192, "y": 344, "type": "file", "path": "build/macos/Build/Products/Release/qeck.app" } + { "x": 192, "y": 344, "type": "file", "path": "build/macos/Build/Products/Release/quokka.app" } ] } diff --git a/app/QeckSetup.iss b/app/QuokkaSetup.iss similarity index 92% rename from app/QeckSetup.iss rename to app/QuokkaSetup.iss index c7e9756..5782f98 100644 --- a/app/QeckSetup.iss +++ b/app/QuokkaSetup.iss @@ -1,13 +1,13 @@ ; Script generated by the Inno Setup Script Wizard. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! -#define MyAppName "Qeck" +#define MyAppName "Quokka" #ifndef MyAppVersion #define MyAppVersion "1.0" #endif #define MyAppPublisher "Linwood" #define MyAppURL "https://www.linwood.dev" -#define MyAppExeName "qeck.exe" +#define MyAppExeName "quokka.exe" #define BaseDirRelease "build\windows\x64\runner\Release" #define RunnerSourceDir "windows\runner" @@ -31,7 +31,7 @@ LicenseFile=..\LICENSE PrivilegesRequired=lowest PrivilegesRequiredOverridesAllowed=dialog OutputDir=build\windows\x64 -OutputBaseFilename=linwood-qeck-windows-setup +OutputBaseFilename=linwood-quokka-windows-setup SetupIconFile={#RunnerSourceDir}\resources\app_icon.ico UninstallDisplayIcon={app}\{#MyAppExeName} Compression=lzma @@ -57,7 +57,7 @@ Source: "{#BaseDirRelease}\*"; DestDir: "{app}"; Flags: ignoreversion recursesub [Icons] Name: "{group}\Visit Website"; Filename: "https://www.linwood.dev/" -Name: "{group}\Qeck Documentation"; Filename: "https://qeck.linwood.dev/" +Name: "{group}\Quokka Documentation"; Filename: "https://quokka.linwood.dev/" Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon diff --git a/app/README.md b/app/README.md index 80a757e..dcbe424 100644 --- a/app/README.md +++ b/app/README.md @@ -1,3 +1,3 @@ -# Linwood Qeck +# Linwood Quokka Read more about it [here](../README.md). diff --git a/app/android/app/build.gradle b/app/android/app/build.gradle index b8a5a7a..607f5cb 100644 --- a/app/android/app/build.gradle +++ b/app/android/app/build.gradle @@ -1,79 +1,69 @@ +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" +} + def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') +def localPropertiesFile = rootProject.file("local.properties") if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> + localPropertiesFile.withReader("UTF-8") { reader -> localProperties.load(reader) } } -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +def flutterVersionCode = localProperties.getProperty("flutter.versionCode") if (flutterVersionCode == null) { - flutterVersionCode = '1' + flutterVersionCode = "1" } -def flutterVersionName = localProperties.getProperty('flutter.versionName') +def flutterVersionName = localProperties.getProperty("flutter.versionName") if (flutterVersionName == null) { - flutterVersionName = '1.0' + flutterVersionName = "1.0" } - -def keystoreProperties = new Properties() -def keystorePropertiesFile = rootProject.file('key.properties') -if (keystorePropertiesFile.exists()) { - keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) -} - - -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - android { - compileSdk flutter.compileSdkVersion - ndkVersion flutter.ndkVersion + namespace = "dev.linwood.quokka" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = '1.8' + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 } defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "dev.linwood.qeck" - minSdkVersion 21 - targetSdkVersion flutter.targetSdkVersion - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + applicationId = "dev.linwood.quokka" + // You can update the following values to match your application needs. + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutterVersionCode.toInteger() + versionName = flutterVersionName } + flavorDimensions += "default" productFlavors { production { dimension "default" applicationIdSuffix "" - manifestPlaceholders = [appName: "Qeck"] + manifestPlaceholders = [appName: "Quokka"] } development { dimension "default" applicationIdSuffix "" - manifestPlaceholders = [appName: "Qeck Nightly"] + manifestPlaceholders = [appName: "Quokka Nightly"] } nightly { dimension "default" applicationIdSuffix ".nightly" - manifestPlaceholders = [appName: "Qeck Nightly"] + manifestPlaceholders = [appName: "Quokka Nightly"] } } + signingConfigs { release { keyAlias keystoreProperties['keyAlias'] @@ -82,8 +72,10 @@ android { storePassword keystoreProperties['storePassword'] } } + buildTypes { release { + // TODO: Add your own signing config for the release build. // Signing with the debug keys for now, so `flutter run --release` works. if (keystorePropertiesFile.exists()) { signingConfig signingConfigs.release @@ -92,20 +84,8 @@ android { } } } - namespace 'dev.linwood.qeck' } flutter { - source '../..' -} - - -dependencies { - testImplementation 'junit:junit:5.8.2' - testImplementation "com.google.truth:truth:1.1.3" - androidTestImplementation 'androidx.test:runner:1.5.2' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' - api 'androidx.test:core:1.5.0' - androidTestImplementation 'tools.fastlane:screengrab:2.1.1' - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + source = "../.." } diff --git a/app/android/app/src/main/AndroidManifest.xml b/app/android/app/src/main/AndroidManifest.xml index 2189d5e..000f4f0 100644 --- a/app/android/app/src/main/AndroidManifest.xml +++ b/app/android/app/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ - @@ -7,6 +7,7 @@ android:name=".MainActivity" android:exported="true" android:launchMode="singleTop" + android:taskAffinity="" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" @@ -36,4 +37,15 @@ android:name="flutterEmbedding" android:value="2" /> - \ No newline at end of file + + + + + + + + diff --git a/app/android/app/src/main/kotlin/dev/linwood/qeck/MainActivity.kt b/app/android/app/src/main/kotlin/dev/linwood/qeck/MainActivity.kt deleted file mode 100644 index 1417b2e..0000000 --- a/app/android/app/src/main/kotlin/dev/linwood/qeck/MainActivity.kt +++ /dev/null @@ -1,6 +0,0 @@ -package dev.linwood.qeck - -import io.flutter.embedding.android.FlutterActivity - -class MainActivity: FlutterActivity() { -} diff --git a/app/android/app/src/main/kotlin/dev/linwood/quokka/MainActivity.kt b/app/android/app/src/main/kotlin/dev/linwood/quokka/MainActivity.kt new file mode 100644 index 0000000..3402977 --- /dev/null +++ b/app/android/app/src/main/kotlin/dev/linwood/quokka/MainActivity.kt @@ -0,0 +1,5 @@ +package dev.linwood.quokka + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() diff --git a/app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 12a33dd636db5fa92a216fe4597f869faced133a..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be 100644 GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@U( z-A+#$5D}yIY8y_wb^!JakEF2CO+Lb@QY@W*_gDrRo;D3P!9(dq^2OfCffd?LV z;LpYLXKmiZU>|2agkQ!F48O@dm@hFH6y~qZ$+eZ@kb)U#|PaZd_Y9B@H-Kr@F||F8<2Tl(N(p*P}P3I zl5z~Qbs{poC3{_#>ZB@f!~xNYNO$HGFVsktJB;sn0nv%LZcQnkdm?q; properties.load(reader) } + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} -def flutterSdkPath = properties.getProperty("flutter.sdk") -assert flutterSdkPath != null, "flutter.sdk not set in local.properties" -apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "7.3.0" apply false + id "org.jetbrains.kotlin.android" version "1.7.10" apply false +} + +include ":app" diff --git a/app/assets/qeck.tiled-project b/app/assets/quokka.tiled-project similarity index 100% rename from app/assets/qeck.tiled-project rename to app/assets/quokka.tiled-project diff --git a/app/ios/Flutter/AppFrameworkInfo.plist b/app/ios/Flutter/AppFrameworkInfo.plist index 9625e10..7c56964 100644 --- a/app/ios/Flutter/AppFrameworkInfo.plist +++ b/app/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 11.0 + 12.0 diff --git a/app/ios/Runner.xcodeproj/project.pbxproj b/app/ios/Runner.xcodeproj/project.pbxproj index 4b34ad6..f40ae8d 100644 --- a/app/ios/Runner.xcodeproj/project.pbxproj +++ b/app/ios/Runner.xcodeproj/project.pbxproj @@ -8,12 +8,12 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,6 +42,8 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -53,8 +55,6 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; - 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -68,6 +68,14 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -79,14 +87,6 @@ name = Flutter; sourceTree = ""; }; - 331C8082294A63A400263BE5 /* RunnerTests */ = { - isa = PBXGroup; - children = ( - 331C807B294A618700263BE5 /* RunnerTests.swift */, - ); - path = RunnerTests; - sourceTree = ""; - }; 97C146E51CF9000F007C117D = { isa = PBXGroup; children = ( @@ -129,7 +129,6 @@ buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( 331C807D294A63A400263BE5 /* Sources */, - 331C807E294A63A400263BE5 /* Frameworks */, 331C807F294A63A400263BE5 /* Resources */, ); buildRules = ( @@ -169,7 +168,7 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; - LastUpgradeCheck = 1430; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 331C8080294A63A400263BE5 = { @@ -308,6 +307,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -337,6 +337,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -345,7 +346,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -367,7 +368,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = dev.linwood.qeck; + PRODUCT_BUNDLE_IDENTIFIER = dev.linwood.quokka; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -377,14 +378,13 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AE0B7B92F70575B8D7E0D07E /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = dev.linwood.qeck.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = dev.linwood.quokka.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -395,14 +395,13 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 89B67EB44CE7B6631473024E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = dev.linwood.qeck.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = dev.linwood.quokka.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; @@ -411,14 +410,13 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 640959BDD8F10B91D80A66BE /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = dev.linwood.qeck.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = dev.linwood.quokka.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; @@ -429,6 +427,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -458,6 +457,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -472,7 +472,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -484,6 +484,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -513,6 +514,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -521,7 +523,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -545,7 +547,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = dev.linwood.qeck; + PRODUCT_BUNDLE_IDENTIFIER = dev.linwood.quokka; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -567,7 +569,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = dev.linwood.qeck; + PRODUCT_BUNDLE_IDENTIFIER = dev.linwood.quokka; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 87131a0..8e3ca5d 100644 --- a/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName - Qeck + Quokka CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -13,7 +13,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleName - qeck + quokka CFBundlePackageType APPL CFBundleShortVersionString @@ -41,8 +41,6 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight - UIViewControllerBasedStatusBarAppearance - CADisableMinimumFrameDurationOnPhone UIApplicationSupportsIndirectInputEvents diff --git a/app/lib/api/open_release_notes.dart b/app/lib/api/open.dart similarity index 69% rename from app/lib/api/open_release_notes.dart rename to app/lib/api/open.dart index cb32d84..d10dedc 100644 --- a/app/lib/api/open_release_notes.dart +++ b/app/lib/api/open.dart @@ -1,4 +1,4 @@ -import 'package:qeck/main.dart'; +import 'package:quokka/main.dart'; import 'package:url_launcher/url_launcher.dart'; Future openReleaseNotes() { @@ -6,6 +6,6 @@ Future openReleaseNotes() { Uri( scheme: 'https', host: 'go.linwood.dev', - pathSegments: ['qeck', applicationMinorVersion]), + pathSegments: ['quokka', applicationMinorVersion]), mode: LaunchMode.externalApplication); } diff --git a/app/lib/cubits/settings.dart b/app/lib/cubits/settings.dart index ea446e2..2138ef9 100644 --- a/app/lib/cubits/settings.dart +++ b/app/lib/cubits/settings.dart @@ -2,20 +2,20 @@ import 'package:dart_mappable/dart_mappable.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:qeck/widgets/window.dart'; +import 'package:quokka/widgets/window.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:window_manager/window_manager.dart'; part 'settings.mapper.dart'; @MappableClass() -class QeckSettings with QeckSettingsMappable { +class QuokkaSettings with QuokkaSettingsMappable { final String localeTag; final ThemeMode theme; final String design; final bool nativeTitleBar; - const QeckSettings({ + const QuokkaSettings({ this.localeTag = '', this.theme = ThemeMode.system, this.design = '', @@ -32,7 +32,7 @@ class QeckSettings with QeckSettingsMappable { return Locale(localeTag); } - factory QeckSettings.fromPrefs(SharedPreferences prefs) => QeckSettings( + factory QuokkaSettings.fromPrefs(SharedPreferences prefs) => QuokkaSettings( theme: ThemeMode.values.byName(prefs.getString('theme') ?? 'system'), design: prefs.getString('design') ?? '', nativeTitleBar: prefs.getBool('nativeTitleBar') ?? false, @@ -48,8 +48,9 @@ class QeckSettings with QeckSettingsMappable { } } -class SettingsCubit extends Cubit { - SettingsCubit(SharedPreferences prefs) : super(QeckSettings.fromPrefs(prefs)); +class SettingsCubit extends Cubit { + SettingsCubit(SharedPreferences prefs) + : super(QuokkaSettings.fromPrefs(prefs)); Future changeTheme(ThemeMode theme) { emit(state.copyWith(theme: theme)); diff --git a/app/lib/cubits/settings.mapper.dart b/app/lib/cubits/settings.mapper.dart index 8621e0f..cb2f14c 100644 --- a/app/lib/cubits/settings.mapper.dart +++ b/app/lib/cubits/settings.mapper.dart @@ -6,43 +6,43 @@ part of 'settings.dart'; -class QeckSettingsMapper extends ClassMapperBase { - QeckSettingsMapper._(); +class QuokkaSettingsMapper extends ClassMapperBase { + QuokkaSettingsMapper._(); - static QeckSettingsMapper? _instance; - static QeckSettingsMapper ensureInitialized() { + static QuokkaSettingsMapper? _instance; + static QuokkaSettingsMapper ensureInitialized() { if (_instance == null) { - MapperContainer.globals.use(_instance = QeckSettingsMapper._()); + MapperContainer.globals.use(_instance = QuokkaSettingsMapper._()); } return _instance!; } @override - final String id = 'QeckSettings'; + final String id = 'QuokkaSettings'; - static String _$localeTag(QeckSettings v) => v.localeTag; - static const Field _f$localeTag = + static String _$localeTag(QuokkaSettings v) => v.localeTag; + static const Field _f$localeTag = Field('localeTag', _$localeTag, opt: true, def: ''); - static ThemeMode _$theme(QeckSettings v) => v.theme; - static const Field _f$theme = + static ThemeMode _$theme(QuokkaSettings v) => v.theme; + static const Field _f$theme = Field('theme', _$theme, opt: true, def: ThemeMode.system); - static String _$design(QeckSettings v) => v.design; - static const Field _f$design = + static String _$design(QuokkaSettings v) => v.design; + static const Field _f$design = Field('design', _$design, opt: true, def: ''); - static bool _$nativeTitleBar(QeckSettings v) => v.nativeTitleBar; - static const Field _f$nativeTitleBar = + static bool _$nativeTitleBar(QuokkaSettings v) => v.nativeTitleBar; + static const Field _f$nativeTitleBar = Field('nativeTitleBar', _$nativeTitleBar, opt: true, def: false); @override - final MappableFields fields = const { + final MappableFields fields = const { #localeTag: _f$localeTag, #theme: _f$theme, #design: _f$design, #nativeTitleBar: _f$nativeTitleBar, }; - static QeckSettings _instantiate(DecodingData data) { - return QeckSettings( + static QuokkaSettings _instantiate(DecodingData data) { + return QuokkaSettings( localeTag: data.dec(_f$localeTag), theme: data.dec(_f$theme), design: data.dec(_f$design), @@ -52,71 +52,73 @@ class QeckSettingsMapper extends ClassMapperBase { @override final Function instantiate = _instantiate; - static QeckSettings fromMap(Map map) { - return ensureInitialized().decodeMap(map); + static QuokkaSettings fromMap(Map map) { + return ensureInitialized().decodeMap(map); } - static QeckSettings fromJson(String json) { - return ensureInitialized().decodeJson(json); + static QuokkaSettings fromJson(String json) { + return ensureInitialized().decodeJson(json); } } -mixin QeckSettingsMappable { +mixin QuokkaSettingsMappable { String toJson() { - return QeckSettingsMapper.ensureInitialized() - .encodeJson(this as QeckSettings); + return QuokkaSettingsMapper.ensureInitialized() + .encodeJson(this as QuokkaSettings); } Map toMap() { - return QeckSettingsMapper.ensureInitialized() - .encodeMap(this as QeckSettings); + return QuokkaSettingsMapper.ensureInitialized() + .encodeMap(this as QuokkaSettings); } - QeckSettingsCopyWith get copyWith => - _QeckSettingsCopyWithImpl(this as QeckSettings, $identity, $identity); + QuokkaSettingsCopyWith + get copyWith => _QuokkaSettingsCopyWithImpl( + this as QuokkaSettings, $identity, $identity); @override String toString() { - return QeckSettingsMapper.ensureInitialized() - .stringifyValue(this as QeckSettings); + return QuokkaSettingsMapper.ensureInitialized() + .stringifyValue(this as QuokkaSettings); } @override bool operator ==(Object other) { - return QeckSettingsMapper.ensureInitialized() - .equalsValue(this as QeckSettings, other); + return QuokkaSettingsMapper.ensureInitialized() + .equalsValue(this as QuokkaSettings, other); } @override int get hashCode { - return QeckSettingsMapper.ensureInitialized() - .hashValue(this as QeckSettings); + return QuokkaSettingsMapper.ensureInitialized() + .hashValue(this as QuokkaSettings); } } -extension QeckSettingsValueCopy<$R, $Out> - on ObjectCopyWith<$R, QeckSettings, $Out> { - QeckSettingsCopyWith<$R, QeckSettings, $Out> get $asQeckSettings => - $base.as((v, t, t2) => _QeckSettingsCopyWithImpl(v, t, t2)); +extension QuokkaSettingsValueCopy<$R, $Out> + on ObjectCopyWith<$R, QuokkaSettings, $Out> { + QuokkaSettingsCopyWith<$R, QuokkaSettings, $Out> get $asQuokkaSettings => + $base.as((v, t, t2) => _QuokkaSettingsCopyWithImpl(v, t, t2)); } -abstract class QeckSettingsCopyWith<$R, $In extends QeckSettings, $Out> +abstract class QuokkaSettingsCopyWith<$R, $In extends QuokkaSettings, $Out> implements ClassCopyWith<$R, $In, $Out> { $R call( {String? localeTag, ThemeMode? theme, String? design, bool? nativeTitleBar}); - QeckSettingsCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); + QuokkaSettingsCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t); } -class _QeckSettingsCopyWithImpl<$R, $Out> - extends ClassCopyWithBase<$R, QeckSettings, $Out> - implements QeckSettingsCopyWith<$R, QeckSettings, $Out> { - _QeckSettingsCopyWithImpl(super.value, super.then, super.then2); +class _QuokkaSettingsCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, QuokkaSettings, $Out> + implements QuokkaSettingsCopyWith<$R, QuokkaSettings, $Out> { + _QuokkaSettingsCopyWithImpl(super.value, super.then, super.then2); @override - late final ClassMapperBase $mapper = - QeckSettingsMapper.ensureInitialized(); + late final ClassMapperBase $mapper = + QuokkaSettingsMapper.ensureInitialized(); @override $R call( {String? localeTag, @@ -130,14 +132,14 @@ class _QeckSettingsCopyWithImpl<$R, $Out> if (nativeTitleBar != null) #nativeTitleBar: nativeTitleBar })); @override - QeckSettings $make(CopyWithData data) => QeckSettings( + QuokkaSettings $make(CopyWithData data) => QuokkaSettings( localeTag: data.get(#localeTag, or: $value.localeTag), theme: data.get(#theme, or: $value.theme), design: data.get(#design, or: $value.design), nativeTitleBar: data.get(#nativeTitleBar, or: $value.nativeTitleBar)); @override - QeckSettingsCopyWith<$R2, QeckSettings, $Out2> $chain<$R2, $Out2>( + QuokkaSettingsCopyWith<$R2, QuokkaSettings, $Out2> $chain<$R2, $Out2>( Then<$Out2, $R2> t) => - _QeckSettingsCopyWithImpl($value, $cast, t); + _QuokkaSettingsCopyWithImpl($value, $cast, t); } diff --git a/app/lib/game/world/game.dart b/app/lib/game/world/game.dart index fe15a35..4e6c673 100644 --- a/app/lib/game/world/game.dart +++ b/app/lib/game/world/game.dart @@ -8,10 +8,10 @@ import 'package:flame/game.dart'; import 'package:flame_tiled/flame_tiled.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; -import 'package:qeck/game/world/inventory.dart'; -import 'package:qeck/game/world/player.dart'; -import 'package:qeck/game/world/wall.dart'; -import 'package:qeck/services/network.dart'; +import 'package:quokka/game/world/inventory.dart'; +import 'package:quokka/game/world/player.dart'; +import 'package:quokka/game/world/wall.dart'; +import 'package:quokka/services/network.dart'; class SpacedSpriteSheet { final ui.Image image; diff --git a/app/lib/game/world/inventory.dart b/app/lib/game/world/inventory.dart index 9f2b6dd..4ecf77d 100644 --- a/app/lib/game/world/inventory.dart +++ b/app/lib/game/world/inventory.dart @@ -4,7 +4,7 @@ import 'dart:ui'; import 'package:flame/components.dart'; import 'package:flame/events.dart'; import 'package:flame/flame.dart'; -import 'package:qeck/game/world/game.dart'; +import 'package:quokka/game/world/game.dart'; class HudSpriteSheet { final SpacedSpriteSheet _spriteSheet; diff --git a/app/lib/game/world/player.dart b/app/lib/game/world/player.dart index c603b48..9da6f51 100644 --- a/app/lib/game/world/player.dart +++ b/app/lib/game/world/player.dart @@ -8,10 +8,10 @@ import 'package:flame/effects.dart'; import 'package:flame/extensions.dart'; import 'package:flame/flame.dart'; import 'package:flame/text.dart'; -import 'package:qeck/game/world/game.dart'; -import 'package:qeck/game/world/wall.dart'; -import 'package:qeck/models/message.dart'; -import 'package:qeck/models/state.dart'; +import 'package:quokka/game/world/game.dart'; +import 'package:quokka/game/world/wall.dart'; +import 'package:quokka/models/message.dart'; +import 'package:quokka/models/state.dart'; class _PreviousPlayerPositionComponent extends ReadOnlyPositionProvider { final BoardPlayer player; diff --git a/app/lib/logic/connection/client.dart b/app/lib/logic/connection/client.dart deleted file mode 100644 index 4f5c428..0000000 --- a/app/lib/logic/connection/client.dart +++ /dev/null @@ -1,147 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; - -import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:qeck/logic/state.dart'; -import 'package:web_socket_channel/web_socket_channel.dart'; - -import 'logic.dart'; -import 'server.dart'; - -part 'client.freezed.dart'; -part 'client.g.dart'; - -@freezed -class ClientConnectionMessage with _$ClientConnectionMessage { - const factory ClientConnectionMessage.playersUpdated( - List players, - int playerId, - ) = FetchedPlayersClientConnectionMessage; - - const factory ClientConnectionMessage.chatMessage( - String message, - String from, - ) = ChatMessageClientConnectionMessage; - - const factory ClientConnectionMessage.stateChanged(GameState state) = - GameStateChangedClientConnectionMessage; - - factory ClientConnectionMessage.fromJson(Map json) => - _$ClientConnectionMessageFromJson(json); -} - -mixin ConnectedGameConnection on GameConnection {} - -class ClientGameConnection with GameConnection, ConnectedGameConnection { - final WebSocketChannel channel; - List _players = []; - int _playerId = -2; - - ClientGameConnection(this.channel) { - _setup(); - } - - factory ClientGameConnection.connect(Uri address) { - final channel = WebSocketChannel.connect(address); - return ClientGameConnection(channel); - } - - void onMessage(ClientConnectionMessage message) { - message.maybeWhen( - stateChanged: (state) { - stateSubject.add(state); - }, - playersUpdated: (players, playerId) { - _players = players; - _playerId = playerId; - }, - orElse: () {}); - } - - @override - int get playerId => _playerId; - - @override - List get players => _players; - - void _setup() { - channel.stream - .map((event) => ClientConnectionMessage.fromJson(jsonDecode(event))) - .listen(onMessage); - } - - void send(ServerConnectionMessage message) { - channel.sink.add(jsonEncode(message.toJson())); - } - - Future waitForResponse() async { - return await channel.stream - .map((event) => jsonDecode(event)) - .map((event) => ClientConnectionMessage.fromJson(event)) - .where((event) => event is T) - .first as T; - } - - @override - Future close() async { - await channel.sink.close(); - } - - List getMySeats() => state.seats - .where((element) => element.players.any((e) => e == playerId)) - .toList(); - - void addSeat(String name) { - send(ServerConnectionMessage.addSeat(name)); - } - - void leaveSeat(int key) { - send(ServerConnectionMessage.leaveSeat(key)); - } - - void joinSeat(int key) { - send(ServerConnectionMessage.joinSeat(key)); - } - - void removeSeat(int key) { - send(ServerConnectionMessage.removeSeat(key)); - } - - void addDeck(GameDeck deck, int? seatIndex) { - send(ServerConnectionMessage.addDeck(deck, seatIndex)); - } - - void addCards(List cards, int deckIndex, [int? seatIndex]) { - send(ServerConnectionMessage.addCards(cards, deckIndex, seatIndex)); - } - - void removeCards(List cards) { - send(ServerConnectionMessage.removeCards(cards)); - } - - void putCards(int deckIndex, int? seatIndex, PickLocation location, int count, - int movedDeckIndex, int? movedSeatIndex) { - send(ServerConnectionMessage.putCards( - deckIndex, - seatIndex, - location, - count, - movedDeckIndex, - movedSeatIndex, - )); - } - - void removeDeck(int deckIndex, int? seatIndex) { - send(ServerConnectionMessage.removeDeck(deckIndex, seatIndex)); - } - - void changeVisibility(int index, int? seatIndex, DeckVisibility visibility, - [DeckVisibility? ownVisibility]) { - send(ServerConnectionMessage.changeVisibility( - index, seatIndex, visibility, ownVisibility)); - } - - void shuffle(int index, int? seatIndex) { - send(ServerConnectionMessage.shuffle(index, seatIndex)); - } -} diff --git a/app/lib/logic/connection/client.freezed.dart b/app/lib/logic/connection/client.freezed.dart deleted file mode 100644 index 37d82c7..0000000 --- a/app/lib/logic/connection/client.freezed.dart +++ /dev/null @@ -1,679 +0,0 @@ -// coverage:ignore-file -// GENERATED CODE - DO NOT MODIFY BY HAND -// ignore_for_file: type=lint -// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark - -part of 'client.dart'; - -// ************************************************************************** -// FreezedGenerator -// ************************************************************************** - -T _$identity(T value) => value; - -final _privateConstructorUsedError = UnsupportedError( - 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); - -ClientConnectionMessage _$ClientConnectionMessageFromJson( - Map json) { - switch (json['type']) { - case 'playersUpdated': - return FetchedPlayersClientConnectionMessage.fromJson(json); - case 'chatMessage': - return ChatMessageClientConnectionMessage.fromJson(json); - case 'stateChanged': - return GameStateChangedClientConnectionMessage.fromJson(json); - - default: - throw CheckedFromJsonException(json, 'type', 'ClientConnectionMessage', - 'Invalid union type "${json['type']}"!'); - } -} - -/// @nodoc -mixin _$ClientConnectionMessage { - @optionalTypeArgs - TResult when({ - required TResult Function(List players, int playerId) - playersUpdated, - required TResult Function(String message, String from) chatMessage, - required TResult Function(GameState state) stateChanged, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(List players, int playerId)? playersUpdated, - TResult? Function(String message, String from)? chatMessage, - TResult? Function(GameState state)? stateChanged, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(List players, int playerId)? playersUpdated, - TResult Function(String message, String from)? chatMessage, - TResult Function(GameState state)? stateChanged, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(FetchedPlayersClientConnectionMessage value) - playersUpdated, - required TResult Function(ChatMessageClientConnectionMessage value) - chatMessage, - required TResult Function(GameStateChangedClientConnectionMessage value) - stateChanged, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FetchedPlayersClientConnectionMessage value)? - playersUpdated, - TResult? Function(ChatMessageClientConnectionMessage value)? chatMessage, - TResult? Function(GameStateChangedClientConnectionMessage value)? - stateChanged, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FetchedPlayersClientConnectionMessage value)? - playersUpdated, - TResult Function(ChatMessageClientConnectionMessage value)? chatMessage, - TResult Function(GameStateChangedClientConnectionMessage value)? - stateChanged, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - Map toJson() => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $ClientConnectionMessageCopyWith<$Res> { - factory $ClientConnectionMessageCopyWith(ClientConnectionMessage value, - $Res Function(ClientConnectionMessage) then) = - _$ClientConnectionMessageCopyWithImpl<$Res, ClientConnectionMessage>; -} - -/// @nodoc -class _$ClientConnectionMessageCopyWithImpl<$Res, - $Val extends ClientConnectionMessage> - implements $ClientConnectionMessageCopyWith<$Res> { - _$ClientConnectionMessageCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; -} - -/// @nodoc -abstract class _$$FetchedPlayersClientConnectionMessageImplCopyWith<$Res> { - factory _$$FetchedPlayersClientConnectionMessageImplCopyWith( - _$FetchedPlayersClientConnectionMessageImpl value, - $Res Function(_$FetchedPlayersClientConnectionMessageImpl) then) = - __$$FetchedPlayersClientConnectionMessageImplCopyWithImpl<$Res>; - @useResult - $Res call({List players, int playerId}); -} - -/// @nodoc -class __$$FetchedPlayersClientConnectionMessageImplCopyWithImpl<$Res> - extends _$ClientConnectionMessageCopyWithImpl<$Res, - _$FetchedPlayersClientConnectionMessageImpl> - implements _$$FetchedPlayersClientConnectionMessageImplCopyWith<$Res> { - __$$FetchedPlayersClientConnectionMessageImplCopyWithImpl( - _$FetchedPlayersClientConnectionMessageImpl _value, - $Res Function(_$FetchedPlayersClientConnectionMessageImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? players = null, - Object? playerId = null, - }) { - return _then(_$FetchedPlayersClientConnectionMessageImpl( - null == players - ? _value._players - : players // ignore: cast_nullable_to_non_nullable - as List, - null == playerId - ? _value.playerId - : playerId // ignore: cast_nullable_to_non_nullable - as int, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$FetchedPlayersClientConnectionMessageImpl - implements FetchedPlayersClientConnectionMessage { - const _$FetchedPlayersClientConnectionMessageImpl( - final List players, this.playerId, - {final String? $type}) - : _players = players, - $type = $type ?? 'playersUpdated'; - - factory _$FetchedPlayersClientConnectionMessageImpl.fromJson( - Map json) => - _$$FetchedPlayersClientConnectionMessageImplFromJson(json); - - final List _players; - @override - List get players { - if (_players is EqualUnmodifiableListView) return _players; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_players); - } - - @override - final int playerId; - - @JsonKey(name: 'type') - final String $type; - - @override - String toString() { - return 'ClientConnectionMessage.playersUpdated(players: $players, playerId: $playerId)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$FetchedPlayersClientConnectionMessageImpl && - const DeepCollectionEquality().equals(other._players, _players) && - (identical(other.playerId, playerId) || - other.playerId == playerId)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => Object.hash( - runtimeType, const DeepCollectionEquality().hash(_players), playerId); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$FetchedPlayersClientConnectionMessageImplCopyWith< - _$FetchedPlayersClientConnectionMessageImpl> - get copyWith => __$$FetchedPlayersClientConnectionMessageImplCopyWithImpl< - _$FetchedPlayersClientConnectionMessageImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(List players, int playerId) - playersUpdated, - required TResult Function(String message, String from) chatMessage, - required TResult Function(GameState state) stateChanged, - }) { - return playersUpdated(players, playerId); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(List players, int playerId)? playersUpdated, - TResult? Function(String message, String from)? chatMessage, - TResult? Function(GameState state)? stateChanged, - }) { - return playersUpdated?.call(players, playerId); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(List players, int playerId)? playersUpdated, - TResult Function(String message, String from)? chatMessage, - TResult Function(GameState state)? stateChanged, - required TResult orElse(), - }) { - if (playersUpdated != null) { - return playersUpdated(players, playerId); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(FetchedPlayersClientConnectionMessage value) - playersUpdated, - required TResult Function(ChatMessageClientConnectionMessage value) - chatMessage, - required TResult Function(GameStateChangedClientConnectionMessage value) - stateChanged, - }) { - return playersUpdated(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FetchedPlayersClientConnectionMessage value)? - playersUpdated, - TResult? Function(ChatMessageClientConnectionMessage value)? chatMessage, - TResult? Function(GameStateChangedClientConnectionMessage value)? - stateChanged, - }) { - return playersUpdated?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FetchedPlayersClientConnectionMessage value)? - playersUpdated, - TResult Function(ChatMessageClientConnectionMessage value)? chatMessage, - TResult Function(GameStateChangedClientConnectionMessage value)? - stateChanged, - required TResult orElse(), - }) { - if (playersUpdated != null) { - return playersUpdated(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$FetchedPlayersClientConnectionMessageImplToJson( - this, - ); - } -} - -abstract class FetchedPlayersClientConnectionMessage - implements ClientConnectionMessage { - const factory FetchedPlayersClientConnectionMessage( - final List players, final int playerId) = - _$FetchedPlayersClientConnectionMessageImpl; - - factory FetchedPlayersClientConnectionMessage.fromJson( - Map json) = - _$FetchedPlayersClientConnectionMessageImpl.fromJson; - - List get players; - int get playerId; - @JsonKey(ignore: true) - _$$FetchedPlayersClientConnectionMessageImplCopyWith< - _$FetchedPlayersClientConnectionMessageImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$ChatMessageClientConnectionMessageImplCopyWith<$Res> { - factory _$$ChatMessageClientConnectionMessageImplCopyWith( - _$ChatMessageClientConnectionMessageImpl value, - $Res Function(_$ChatMessageClientConnectionMessageImpl) then) = - __$$ChatMessageClientConnectionMessageImplCopyWithImpl<$Res>; - @useResult - $Res call({String message, String from}); -} - -/// @nodoc -class __$$ChatMessageClientConnectionMessageImplCopyWithImpl<$Res> - extends _$ClientConnectionMessageCopyWithImpl<$Res, - _$ChatMessageClientConnectionMessageImpl> - implements _$$ChatMessageClientConnectionMessageImplCopyWith<$Res> { - __$$ChatMessageClientConnectionMessageImplCopyWithImpl( - _$ChatMessageClientConnectionMessageImpl _value, - $Res Function(_$ChatMessageClientConnectionMessageImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? message = null, - Object? from = null, - }) { - return _then(_$ChatMessageClientConnectionMessageImpl( - null == message - ? _value.message - : message // ignore: cast_nullable_to_non_nullable - as String, - null == from - ? _value.from - : from // ignore: cast_nullable_to_non_nullable - as String, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$ChatMessageClientConnectionMessageImpl - implements ChatMessageClientConnectionMessage { - const _$ChatMessageClientConnectionMessageImpl(this.message, this.from, - {final String? $type}) - : $type = $type ?? 'chatMessage'; - - factory _$ChatMessageClientConnectionMessageImpl.fromJson( - Map json) => - _$$ChatMessageClientConnectionMessageImplFromJson(json); - - @override - final String message; - @override - final String from; - - @JsonKey(name: 'type') - final String $type; - - @override - String toString() { - return 'ClientConnectionMessage.chatMessage(message: $message, from: $from)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$ChatMessageClientConnectionMessageImpl && - (identical(other.message, message) || other.message == message) && - (identical(other.from, from) || other.from == from)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => Object.hash(runtimeType, message, from); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$ChatMessageClientConnectionMessageImplCopyWith< - _$ChatMessageClientConnectionMessageImpl> - get copyWith => __$$ChatMessageClientConnectionMessageImplCopyWithImpl< - _$ChatMessageClientConnectionMessageImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(List players, int playerId) - playersUpdated, - required TResult Function(String message, String from) chatMessage, - required TResult Function(GameState state) stateChanged, - }) { - return chatMessage(message, from); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(List players, int playerId)? playersUpdated, - TResult? Function(String message, String from)? chatMessage, - TResult? Function(GameState state)? stateChanged, - }) { - return chatMessage?.call(message, from); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(List players, int playerId)? playersUpdated, - TResult Function(String message, String from)? chatMessage, - TResult Function(GameState state)? stateChanged, - required TResult orElse(), - }) { - if (chatMessage != null) { - return chatMessage(message, from); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(FetchedPlayersClientConnectionMessage value) - playersUpdated, - required TResult Function(ChatMessageClientConnectionMessage value) - chatMessage, - required TResult Function(GameStateChangedClientConnectionMessage value) - stateChanged, - }) { - return chatMessage(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FetchedPlayersClientConnectionMessage value)? - playersUpdated, - TResult? Function(ChatMessageClientConnectionMessage value)? chatMessage, - TResult? Function(GameStateChangedClientConnectionMessage value)? - stateChanged, - }) { - return chatMessage?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FetchedPlayersClientConnectionMessage value)? - playersUpdated, - TResult Function(ChatMessageClientConnectionMessage value)? chatMessage, - TResult Function(GameStateChangedClientConnectionMessage value)? - stateChanged, - required TResult orElse(), - }) { - if (chatMessage != null) { - return chatMessage(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$ChatMessageClientConnectionMessageImplToJson( - this, - ); - } -} - -abstract class ChatMessageClientConnectionMessage - implements ClientConnectionMessage { - const factory ChatMessageClientConnectionMessage( - final String message, final String from) = - _$ChatMessageClientConnectionMessageImpl; - - factory ChatMessageClientConnectionMessage.fromJson( - Map json) = - _$ChatMessageClientConnectionMessageImpl.fromJson; - - String get message; - String get from; - @JsonKey(ignore: true) - _$$ChatMessageClientConnectionMessageImplCopyWith< - _$ChatMessageClientConnectionMessageImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$GameStateChangedClientConnectionMessageImplCopyWith<$Res> { - factory _$$GameStateChangedClientConnectionMessageImplCopyWith( - _$GameStateChangedClientConnectionMessageImpl value, - $Res Function(_$GameStateChangedClientConnectionMessageImpl) then) = - __$$GameStateChangedClientConnectionMessageImplCopyWithImpl<$Res>; - @useResult - $Res call({GameState state}); - - $GameStateCopyWith<$Res> get state; -} - -/// @nodoc -class __$$GameStateChangedClientConnectionMessageImplCopyWithImpl<$Res> - extends _$ClientConnectionMessageCopyWithImpl<$Res, - _$GameStateChangedClientConnectionMessageImpl> - implements _$$GameStateChangedClientConnectionMessageImplCopyWith<$Res> { - __$$GameStateChangedClientConnectionMessageImplCopyWithImpl( - _$GameStateChangedClientConnectionMessageImpl _value, - $Res Function(_$GameStateChangedClientConnectionMessageImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? state = null, - }) { - return _then(_$GameStateChangedClientConnectionMessageImpl( - null == state - ? _value.state - : state // ignore: cast_nullable_to_non_nullable - as GameState, - )); - } - - @override - @pragma('vm:prefer-inline') - $GameStateCopyWith<$Res> get state { - return $GameStateCopyWith<$Res>(_value.state, (value) { - return _then(_value.copyWith(state: value)); - }); - } -} - -/// @nodoc -@JsonSerializable() -class _$GameStateChangedClientConnectionMessageImpl - implements GameStateChangedClientConnectionMessage { - const _$GameStateChangedClientConnectionMessageImpl(this.state, - {final String? $type}) - : $type = $type ?? 'stateChanged'; - - factory _$GameStateChangedClientConnectionMessageImpl.fromJson( - Map json) => - _$$GameStateChangedClientConnectionMessageImplFromJson(json); - - @override - final GameState state; - - @JsonKey(name: 'type') - final String $type; - - @override - String toString() { - return 'ClientConnectionMessage.stateChanged(state: $state)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$GameStateChangedClientConnectionMessageImpl && - (identical(other.state, state) || other.state == state)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => Object.hash(runtimeType, state); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$GameStateChangedClientConnectionMessageImplCopyWith< - _$GameStateChangedClientConnectionMessageImpl> - get copyWith => - __$$GameStateChangedClientConnectionMessageImplCopyWithImpl< - _$GameStateChangedClientConnectionMessageImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(List players, int playerId) - playersUpdated, - required TResult Function(String message, String from) chatMessage, - required TResult Function(GameState state) stateChanged, - }) { - return stateChanged(state); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(List players, int playerId)? playersUpdated, - TResult? Function(String message, String from)? chatMessage, - TResult? Function(GameState state)? stateChanged, - }) { - return stateChanged?.call(state); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(List players, int playerId)? playersUpdated, - TResult Function(String message, String from)? chatMessage, - TResult Function(GameState state)? stateChanged, - required TResult orElse(), - }) { - if (stateChanged != null) { - return stateChanged(state); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(FetchedPlayersClientConnectionMessage value) - playersUpdated, - required TResult Function(ChatMessageClientConnectionMessage value) - chatMessage, - required TResult Function(GameStateChangedClientConnectionMessage value) - stateChanged, - }) { - return stateChanged(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FetchedPlayersClientConnectionMessage value)? - playersUpdated, - TResult? Function(ChatMessageClientConnectionMessage value)? chatMessage, - TResult? Function(GameStateChangedClientConnectionMessage value)? - stateChanged, - }) { - return stateChanged?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FetchedPlayersClientConnectionMessage value)? - playersUpdated, - TResult Function(ChatMessageClientConnectionMessage value)? chatMessage, - TResult Function(GameStateChangedClientConnectionMessage value)? - stateChanged, - required TResult orElse(), - }) { - if (stateChanged != null) { - return stateChanged(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$GameStateChangedClientConnectionMessageImplToJson( - this, - ); - } -} - -abstract class GameStateChangedClientConnectionMessage - implements ClientConnectionMessage { - const factory GameStateChangedClientConnectionMessage(final GameState state) = - _$GameStateChangedClientConnectionMessageImpl; - - factory GameStateChangedClientConnectionMessage.fromJson( - Map json) = - _$GameStateChangedClientConnectionMessageImpl.fromJson; - - GameState get state; - @JsonKey(ignore: true) - _$$GameStateChangedClientConnectionMessageImplCopyWith< - _$GameStateChangedClientConnectionMessageImpl> - get copyWith => throw _privateConstructorUsedError; -} diff --git a/app/lib/logic/connection/client.g.dart b/app/lib/logic/connection/client.g.dart deleted file mode 100644 index bb30caa..0000000 --- a/app/lib/logic/connection/client.g.dart +++ /dev/null @@ -1,56 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'client.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -_$FetchedPlayersClientConnectionMessageImpl - _$$FetchedPlayersClientConnectionMessageImplFromJson(Map json) => - _$FetchedPlayersClientConnectionMessageImpl( - (json['players'] as List) - .map((e) => - GamePlayer.fromJson(Map.from(e as Map))) - .toList(), - (json['playerId'] as num).toInt(), - $type: json['type'] as String?, - ); - -Map _$$FetchedPlayersClientConnectionMessageImplToJson( - _$FetchedPlayersClientConnectionMessageImpl instance) => - { - 'players': instance.players.map((e) => e.toJson()).toList(), - 'playerId': instance.playerId, - 'type': instance.$type, - }; - -_$ChatMessageClientConnectionMessageImpl - _$$ChatMessageClientConnectionMessageImplFromJson(Map json) => - _$ChatMessageClientConnectionMessageImpl( - json['message'] as String, - json['from'] as String, - $type: json['type'] as String?, - ); - -Map _$$ChatMessageClientConnectionMessageImplToJson( - _$ChatMessageClientConnectionMessageImpl instance) => - { - 'message': instance.message, - 'from': instance.from, - 'type': instance.$type, - }; - -_$GameStateChangedClientConnectionMessageImpl - _$$GameStateChangedClientConnectionMessageImplFromJson(Map json) => - _$GameStateChangedClientConnectionMessageImpl( - GameState.fromJson(Map.from(json['state'] as Map)), - $type: json['type'] as String?, - ); - -Map _$$GameStateChangedClientConnectionMessageImplToJson( - _$GameStateChangedClientConnectionMessageImpl instance) => - { - 'state': instance.state.toJson(), - 'type': instance.$type, - }; diff --git a/app/lib/logic/connection/logic.dart b/app/lib/logic/connection/logic.dart deleted file mode 100644 index 48198b1..0000000 --- a/app/lib/logic/connection/logic.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'dart:async'; - -import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:qeck/logic/state.dart'; -import 'package:rxdart/rxdart.dart'; - -part 'logic.freezed.dart'; -part 'logic.g.dart'; - -@freezed -class GamePlayer with _$GamePlayer { - const factory GamePlayer({ - required String name, - required int id, - }) = _GamePlayer; - - factory GamePlayer.fromJson(Map json) => - _$GamePlayerFromJson(json); -} - -mixin GameConnection { - @protected - final BehaviorSubject stateSubject = BehaviorSubject() - ..add(const GameState()); - - GameState get state => stateSubject.value; - - ValueStream get stateStream => stateSubject.stream; - - List get players; - - int get playerId; - - Future close(); -} - -@freezed -class CardIndex with _$CardIndex { - const factory CardIndex.custom(GameCard card) = AvailableCardIndex; - const factory CardIndex.deck(int cardIndex, int deckIndex) = DeckCardIndex; - const factory CardIndex.seat(int cardIndex, int deckIndex, int seatIndex) = - SeatCardIndex; - - factory CardIndex.fromJson(Map json) => - _$CardIndexFromJson(json); -} diff --git a/app/lib/logic/connection/logic.freezed.dart b/app/lib/logic/connection/logic.freezed.dart deleted file mode 100644 index c798a8e..0000000 --- a/app/lib/logic/connection/logic.freezed.dart +++ /dev/null @@ -1,769 +0,0 @@ -// coverage:ignore-file -// GENERATED CODE - DO NOT MODIFY BY HAND -// ignore_for_file: type=lint -// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark - -part of 'logic.dart'; - -// ************************************************************************** -// FreezedGenerator -// ************************************************************************** - -T _$identity(T value) => value; - -final _privateConstructorUsedError = UnsupportedError( - 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); - -GamePlayer _$GamePlayerFromJson(Map json) { - return _GamePlayer.fromJson(json); -} - -/// @nodoc -mixin _$GamePlayer { - String get name => throw _privateConstructorUsedError; - int get id => throw _privateConstructorUsedError; - - Map toJson() => throw _privateConstructorUsedError; - @JsonKey(ignore: true) - $GamePlayerCopyWith get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $GamePlayerCopyWith<$Res> { - factory $GamePlayerCopyWith( - GamePlayer value, $Res Function(GamePlayer) then) = - _$GamePlayerCopyWithImpl<$Res, GamePlayer>; - @useResult - $Res call({String name, int id}); -} - -/// @nodoc -class _$GamePlayerCopyWithImpl<$Res, $Val extends GamePlayer> - implements $GamePlayerCopyWith<$Res> { - _$GamePlayerCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? name = null, - Object? id = null, - }) { - return _then(_value.copyWith( - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - id: null == id - ? _value.id - : id // ignore: cast_nullable_to_non_nullable - as int, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$GamePlayerImplCopyWith<$Res> - implements $GamePlayerCopyWith<$Res> { - factory _$$GamePlayerImplCopyWith( - _$GamePlayerImpl value, $Res Function(_$GamePlayerImpl) then) = - __$$GamePlayerImplCopyWithImpl<$Res>; - @override - @useResult - $Res call({String name, int id}); -} - -/// @nodoc -class __$$GamePlayerImplCopyWithImpl<$Res> - extends _$GamePlayerCopyWithImpl<$Res, _$GamePlayerImpl> - implements _$$GamePlayerImplCopyWith<$Res> { - __$$GamePlayerImplCopyWithImpl( - _$GamePlayerImpl _value, $Res Function(_$GamePlayerImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? name = null, - Object? id = null, - }) { - return _then(_$GamePlayerImpl( - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - id: null == id - ? _value.id - : id // ignore: cast_nullable_to_non_nullable - as int, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$GamePlayerImpl implements _GamePlayer { - const _$GamePlayerImpl({required this.name, required this.id}); - - factory _$GamePlayerImpl.fromJson(Map json) => - _$$GamePlayerImplFromJson(json); - - @override - final String name; - @override - final int id; - - @override - String toString() { - return 'GamePlayer(name: $name, id: $id)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$GamePlayerImpl && - (identical(other.name, name) || other.name == name) && - (identical(other.id, id) || other.id == id)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => Object.hash(runtimeType, name, id); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$GamePlayerImplCopyWith<_$GamePlayerImpl> get copyWith => - __$$GamePlayerImplCopyWithImpl<_$GamePlayerImpl>(this, _$identity); - - @override - Map toJson() { - return _$$GamePlayerImplToJson( - this, - ); - } -} - -abstract class _GamePlayer implements GamePlayer { - const factory _GamePlayer( - {required final String name, required final int id}) = _$GamePlayerImpl; - - factory _GamePlayer.fromJson(Map json) = - _$GamePlayerImpl.fromJson; - - @override - String get name; - @override - int get id; - @override - @JsonKey(ignore: true) - _$$GamePlayerImplCopyWith<_$GamePlayerImpl> get copyWith => - throw _privateConstructorUsedError; -} - -CardIndex _$CardIndexFromJson(Map json) { - switch (json['type']) { - case 'custom': - return AvailableCardIndex.fromJson(json); - case 'deck': - return DeckCardIndex.fromJson(json); - case 'seat': - return SeatCardIndex.fromJson(json); - - default: - throw CheckedFromJsonException( - json, 'type', 'CardIndex', 'Invalid union type "${json['type']}"!'); - } -} - -/// @nodoc -mixin _$CardIndex { - @optionalTypeArgs - TResult when({ - required TResult Function(GameCard card) custom, - required TResult Function(int cardIndex, int deckIndex) deck, - required TResult Function(int cardIndex, int deckIndex, int seatIndex) seat, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(GameCard card)? custom, - TResult? Function(int cardIndex, int deckIndex)? deck, - TResult? Function(int cardIndex, int deckIndex, int seatIndex)? seat, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(GameCard card)? custom, - TResult Function(int cardIndex, int deckIndex)? deck, - TResult Function(int cardIndex, int deckIndex, int seatIndex)? seat, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(AvailableCardIndex value) custom, - required TResult Function(DeckCardIndex value) deck, - required TResult Function(SeatCardIndex value) seat, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(AvailableCardIndex value)? custom, - TResult? Function(DeckCardIndex value)? deck, - TResult? Function(SeatCardIndex value)? seat, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(AvailableCardIndex value)? custom, - TResult Function(DeckCardIndex value)? deck, - TResult Function(SeatCardIndex value)? seat, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - Map toJson() => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $CardIndexCopyWith<$Res> { - factory $CardIndexCopyWith(CardIndex value, $Res Function(CardIndex) then) = - _$CardIndexCopyWithImpl<$Res, CardIndex>; -} - -/// @nodoc -class _$CardIndexCopyWithImpl<$Res, $Val extends CardIndex> - implements $CardIndexCopyWith<$Res> { - _$CardIndexCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; -} - -/// @nodoc -abstract class _$$AvailableCardIndexImplCopyWith<$Res> { - factory _$$AvailableCardIndexImplCopyWith(_$AvailableCardIndexImpl value, - $Res Function(_$AvailableCardIndexImpl) then) = - __$$AvailableCardIndexImplCopyWithImpl<$Res>; - @useResult - $Res call({GameCard card}); - - $GameCardCopyWith<$Res> get card; -} - -/// @nodoc -class __$$AvailableCardIndexImplCopyWithImpl<$Res> - extends _$CardIndexCopyWithImpl<$Res, _$AvailableCardIndexImpl> - implements _$$AvailableCardIndexImplCopyWith<$Res> { - __$$AvailableCardIndexImplCopyWithImpl(_$AvailableCardIndexImpl _value, - $Res Function(_$AvailableCardIndexImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? card = null, - }) { - return _then(_$AvailableCardIndexImpl( - null == card - ? _value.card - : card // ignore: cast_nullable_to_non_nullable - as GameCard, - )); - } - - @override - @pragma('vm:prefer-inline') - $GameCardCopyWith<$Res> get card { - return $GameCardCopyWith<$Res>(_value.card, (value) { - return _then(_value.copyWith(card: value)); - }); - } -} - -/// @nodoc -@JsonSerializable() -class _$AvailableCardIndexImpl implements AvailableCardIndex { - const _$AvailableCardIndexImpl(this.card, {final String? $type}) - : $type = $type ?? 'custom'; - - factory _$AvailableCardIndexImpl.fromJson(Map json) => - _$$AvailableCardIndexImplFromJson(json); - - @override - final GameCard card; - - @JsonKey(name: 'type') - final String $type; - - @override - String toString() { - return 'CardIndex.custom(card: $card)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$AvailableCardIndexImpl && - (identical(other.card, card) || other.card == card)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => Object.hash(runtimeType, card); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$AvailableCardIndexImplCopyWith<_$AvailableCardIndexImpl> get copyWith => - __$$AvailableCardIndexImplCopyWithImpl<_$AvailableCardIndexImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(GameCard card) custom, - required TResult Function(int cardIndex, int deckIndex) deck, - required TResult Function(int cardIndex, int deckIndex, int seatIndex) seat, - }) { - return custom(card); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(GameCard card)? custom, - TResult? Function(int cardIndex, int deckIndex)? deck, - TResult? Function(int cardIndex, int deckIndex, int seatIndex)? seat, - }) { - return custom?.call(card); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(GameCard card)? custom, - TResult Function(int cardIndex, int deckIndex)? deck, - TResult Function(int cardIndex, int deckIndex, int seatIndex)? seat, - required TResult orElse(), - }) { - if (custom != null) { - return custom(card); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(AvailableCardIndex value) custom, - required TResult Function(DeckCardIndex value) deck, - required TResult Function(SeatCardIndex value) seat, - }) { - return custom(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(AvailableCardIndex value)? custom, - TResult? Function(DeckCardIndex value)? deck, - TResult? Function(SeatCardIndex value)? seat, - }) { - return custom?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(AvailableCardIndex value)? custom, - TResult Function(DeckCardIndex value)? deck, - TResult Function(SeatCardIndex value)? seat, - required TResult orElse(), - }) { - if (custom != null) { - return custom(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$AvailableCardIndexImplToJson( - this, - ); - } -} - -abstract class AvailableCardIndex implements CardIndex { - const factory AvailableCardIndex(final GameCard card) = - _$AvailableCardIndexImpl; - - factory AvailableCardIndex.fromJson(Map json) = - _$AvailableCardIndexImpl.fromJson; - - GameCard get card; - @JsonKey(ignore: true) - _$$AvailableCardIndexImplCopyWith<_$AvailableCardIndexImpl> get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$DeckCardIndexImplCopyWith<$Res> { - factory _$$DeckCardIndexImplCopyWith( - _$DeckCardIndexImpl value, $Res Function(_$DeckCardIndexImpl) then) = - __$$DeckCardIndexImplCopyWithImpl<$Res>; - @useResult - $Res call({int cardIndex, int deckIndex}); -} - -/// @nodoc -class __$$DeckCardIndexImplCopyWithImpl<$Res> - extends _$CardIndexCopyWithImpl<$Res, _$DeckCardIndexImpl> - implements _$$DeckCardIndexImplCopyWith<$Res> { - __$$DeckCardIndexImplCopyWithImpl( - _$DeckCardIndexImpl _value, $Res Function(_$DeckCardIndexImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? cardIndex = null, - Object? deckIndex = null, - }) { - return _then(_$DeckCardIndexImpl( - null == cardIndex - ? _value.cardIndex - : cardIndex // ignore: cast_nullable_to_non_nullable - as int, - null == deckIndex - ? _value.deckIndex - : deckIndex // ignore: cast_nullable_to_non_nullable - as int, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$DeckCardIndexImpl implements DeckCardIndex { - const _$DeckCardIndexImpl(this.cardIndex, this.deckIndex, - {final String? $type}) - : $type = $type ?? 'deck'; - - factory _$DeckCardIndexImpl.fromJson(Map json) => - _$$DeckCardIndexImplFromJson(json); - - @override - final int cardIndex; - @override - final int deckIndex; - - @JsonKey(name: 'type') - final String $type; - - @override - String toString() { - return 'CardIndex.deck(cardIndex: $cardIndex, deckIndex: $deckIndex)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$DeckCardIndexImpl && - (identical(other.cardIndex, cardIndex) || - other.cardIndex == cardIndex) && - (identical(other.deckIndex, deckIndex) || - other.deckIndex == deckIndex)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => Object.hash(runtimeType, cardIndex, deckIndex); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$DeckCardIndexImplCopyWith<_$DeckCardIndexImpl> get copyWith => - __$$DeckCardIndexImplCopyWithImpl<_$DeckCardIndexImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(GameCard card) custom, - required TResult Function(int cardIndex, int deckIndex) deck, - required TResult Function(int cardIndex, int deckIndex, int seatIndex) seat, - }) { - return deck(cardIndex, deckIndex); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(GameCard card)? custom, - TResult? Function(int cardIndex, int deckIndex)? deck, - TResult? Function(int cardIndex, int deckIndex, int seatIndex)? seat, - }) { - return deck?.call(cardIndex, deckIndex); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(GameCard card)? custom, - TResult Function(int cardIndex, int deckIndex)? deck, - TResult Function(int cardIndex, int deckIndex, int seatIndex)? seat, - required TResult orElse(), - }) { - if (deck != null) { - return deck(cardIndex, deckIndex); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(AvailableCardIndex value) custom, - required TResult Function(DeckCardIndex value) deck, - required TResult Function(SeatCardIndex value) seat, - }) { - return deck(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(AvailableCardIndex value)? custom, - TResult? Function(DeckCardIndex value)? deck, - TResult? Function(SeatCardIndex value)? seat, - }) { - return deck?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(AvailableCardIndex value)? custom, - TResult Function(DeckCardIndex value)? deck, - TResult Function(SeatCardIndex value)? seat, - required TResult orElse(), - }) { - if (deck != null) { - return deck(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$DeckCardIndexImplToJson( - this, - ); - } -} - -abstract class DeckCardIndex implements CardIndex { - const factory DeckCardIndex(final int cardIndex, final int deckIndex) = - _$DeckCardIndexImpl; - - factory DeckCardIndex.fromJson(Map json) = - _$DeckCardIndexImpl.fromJson; - - int get cardIndex; - int get deckIndex; - @JsonKey(ignore: true) - _$$DeckCardIndexImplCopyWith<_$DeckCardIndexImpl> get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$SeatCardIndexImplCopyWith<$Res> { - factory _$$SeatCardIndexImplCopyWith( - _$SeatCardIndexImpl value, $Res Function(_$SeatCardIndexImpl) then) = - __$$SeatCardIndexImplCopyWithImpl<$Res>; - @useResult - $Res call({int cardIndex, int deckIndex, int seatIndex}); -} - -/// @nodoc -class __$$SeatCardIndexImplCopyWithImpl<$Res> - extends _$CardIndexCopyWithImpl<$Res, _$SeatCardIndexImpl> - implements _$$SeatCardIndexImplCopyWith<$Res> { - __$$SeatCardIndexImplCopyWithImpl( - _$SeatCardIndexImpl _value, $Res Function(_$SeatCardIndexImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? cardIndex = null, - Object? deckIndex = null, - Object? seatIndex = null, - }) { - return _then(_$SeatCardIndexImpl( - null == cardIndex - ? _value.cardIndex - : cardIndex // ignore: cast_nullable_to_non_nullable - as int, - null == deckIndex - ? _value.deckIndex - : deckIndex // ignore: cast_nullable_to_non_nullable - as int, - null == seatIndex - ? _value.seatIndex - : seatIndex // ignore: cast_nullable_to_non_nullable - as int, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$SeatCardIndexImpl implements SeatCardIndex { - const _$SeatCardIndexImpl(this.cardIndex, this.deckIndex, this.seatIndex, - {final String? $type}) - : $type = $type ?? 'seat'; - - factory _$SeatCardIndexImpl.fromJson(Map json) => - _$$SeatCardIndexImplFromJson(json); - - @override - final int cardIndex; - @override - final int deckIndex; - @override - final int seatIndex; - - @JsonKey(name: 'type') - final String $type; - - @override - String toString() { - return 'CardIndex.seat(cardIndex: $cardIndex, deckIndex: $deckIndex, seatIndex: $seatIndex)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$SeatCardIndexImpl && - (identical(other.cardIndex, cardIndex) || - other.cardIndex == cardIndex) && - (identical(other.deckIndex, deckIndex) || - other.deckIndex == deckIndex) && - (identical(other.seatIndex, seatIndex) || - other.seatIndex == seatIndex)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => Object.hash(runtimeType, cardIndex, deckIndex, seatIndex); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$SeatCardIndexImplCopyWith<_$SeatCardIndexImpl> get copyWith => - __$$SeatCardIndexImplCopyWithImpl<_$SeatCardIndexImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(GameCard card) custom, - required TResult Function(int cardIndex, int deckIndex) deck, - required TResult Function(int cardIndex, int deckIndex, int seatIndex) seat, - }) { - return seat(cardIndex, deckIndex, seatIndex); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(GameCard card)? custom, - TResult? Function(int cardIndex, int deckIndex)? deck, - TResult? Function(int cardIndex, int deckIndex, int seatIndex)? seat, - }) { - return seat?.call(cardIndex, deckIndex, seatIndex); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(GameCard card)? custom, - TResult Function(int cardIndex, int deckIndex)? deck, - TResult Function(int cardIndex, int deckIndex, int seatIndex)? seat, - required TResult orElse(), - }) { - if (seat != null) { - return seat(cardIndex, deckIndex, seatIndex); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(AvailableCardIndex value) custom, - required TResult Function(DeckCardIndex value) deck, - required TResult Function(SeatCardIndex value) seat, - }) { - return seat(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(AvailableCardIndex value)? custom, - TResult? Function(DeckCardIndex value)? deck, - TResult? Function(SeatCardIndex value)? seat, - }) { - return seat?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(AvailableCardIndex value)? custom, - TResult Function(DeckCardIndex value)? deck, - TResult Function(SeatCardIndex value)? seat, - required TResult orElse(), - }) { - if (seat != null) { - return seat(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$SeatCardIndexImplToJson( - this, - ); - } -} - -abstract class SeatCardIndex implements CardIndex { - const factory SeatCardIndex( - final int cardIndex, final int deckIndex, final int seatIndex) = - _$SeatCardIndexImpl; - - factory SeatCardIndex.fromJson(Map json) = - _$SeatCardIndexImpl.fromJson; - - int get cardIndex; - int get deckIndex; - int get seatIndex; - @JsonKey(ignore: true) - _$$SeatCardIndexImplCopyWith<_$SeatCardIndexImpl> get copyWith => - throw _privateConstructorUsedError; -} diff --git a/app/lib/logic/connection/logic.g.dart b/app/lib/logic/connection/logic.g.dart deleted file mode 100644 index 44af1db..0000000 --- a/app/lib/logic/connection/logic.g.dart +++ /dev/null @@ -1,61 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'logic.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -_$GamePlayerImpl _$$GamePlayerImplFromJson(Map json) => _$GamePlayerImpl( - name: json['name'] as String, - id: (json['id'] as num).toInt(), - ); - -Map _$$GamePlayerImplToJson(_$GamePlayerImpl instance) => - { - 'name': instance.name, - 'id': instance.id, - }; - -_$AvailableCardIndexImpl _$$AvailableCardIndexImplFromJson(Map json) => - _$AvailableCardIndexImpl( - GameCard.fromJson(Map.from(json['card'] as Map)), - $type: json['type'] as String?, - ); - -Map _$$AvailableCardIndexImplToJson( - _$AvailableCardIndexImpl instance) => - { - 'card': instance.card.toJson(), - 'type': instance.$type, - }; - -_$DeckCardIndexImpl _$$DeckCardIndexImplFromJson(Map json) => - _$DeckCardIndexImpl( - (json['cardIndex'] as num).toInt(), - (json['deckIndex'] as num).toInt(), - $type: json['type'] as String?, - ); - -Map _$$DeckCardIndexImplToJson(_$DeckCardIndexImpl instance) => - { - 'cardIndex': instance.cardIndex, - 'deckIndex': instance.deckIndex, - 'type': instance.$type, - }; - -_$SeatCardIndexImpl _$$SeatCardIndexImplFromJson(Map json) => - _$SeatCardIndexImpl( - (json['cardIndex'] as num).toInt(), - (json['deckIndex'] as num).toInt(), - (json['seatIndex'] as num).toInt(), - $type: json['type'] as String?, - ); - -Map _$$SeatCardIndexImplToJson(_$SeatCardIndexImpl instance) => - { - 'cardIndex': instance.cardIndex, - 'deckIndex': instance.deckIndex, - 'seatIndex': instance.seatIndex, - 'type': instance.$type, - }; diff --git a/app/lib/logic/connection/server.dart b/app/lib/logic/connection/server.dart deleted file mode 100644 index 61473c7..0000000 --- a/app/lib/logic/connection/server.dart +++ /dev/null @@ -1,415 +0,0 @@ -import 'dart:convert'; -import 'dart:io'; - -import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:qeck/logic/state.dart'; -import 'package:qeck/services/network.dart'; -import 'package:web_socket_channel/web_socket_channel.dart'; - -import 'client.dart'; -import 'logic.dart'; - -part 'server.freezed.dart'; -part 'server.g.dart'; - -@freezed -class ServerConnectionMessage with _$ServerConnectionMessage { - const factory ServerConnectionMessage.fetchPlayers() = - FetchPlayersServerConnectionMessage; - - const factory ServerConnectionMessage.chatMessage(String message) = - ChatMessageServerConnectionMessage; - - const factory ServerConnectionMessage.addDeck(GameDeck deck, int? seatIndex) = - AddDeckServerConnectionMessage; - - const factory ServerConnectionMessage.removeDeck(int index, int? seatIndex) = - RemoveDeckServerConnectionMessage; - - const factory ServerConnectionMessage.addSeat(String name) = - AddSeatServerConnectionMessage; - - const factory ServerConnectionMessage.addCards( - List cards, int deckIndex, int? seatIndex) = - AddCardsServerConnectionMessage; - - const factory ServerConnectionMessage.putCards( - int deckIndex, - int? seatIndex, - PickLocation location, - int count, - int movedDeckIndex, - int? movedSeatIndex, - ) = PutCardsServerConnectionMessage; - - const factory ServerConnectionMessage.removeCards(List cards) = - RemoveCardsServerConnectionMessage; - - const factory ServerConnectionMessage.removeSeat(int index) = - RemoveSeatServerConnectionMessage; - - const factory ServerConnectionMessage.joinSeat(int index) = - JoinSeatServerConnectionMessage; - - const factory ServerConnectionMessage.leaveSeat(int index) = - LeaveSeatServerConnectionMessage; - - const factory ServerConnectionMessage.shuffle(int deckIndex, int? seatIndex) = - ShuffleServerConnectionMessage; - - const factory ServerConnectionMessage.changeVisibility( - int deckIndex, int? seatIndex, DeckVisibility visibility, - [DeckVisibility? ownVisibility]) = - ChangeVisibilityServerConnectionMessage; - - factory ServerConnectionMessage.fromJson(Map json) => - _$ServerConnectionMessageFromJson(json); -} - -class WebSocketClient { - final WebSocket socket; - final HttpConnectionInfo info; - - WebSocketClient(this.socket, this.info); - - int get id => socket.hashCode; -} - -class ServerGameConnection with GameConnection { - final HttpServer server; - final List clients = []; - - ServerGameConnection._(this.server) { - _setup(); - } - - static Future create() async { - final connection = ServerGameConnection._( - await HttpServer.bind( - InternetAddress.anyIPv4, - kDefaultPort, - ), - ); - return connection; - } - - @override - Future close() async { - await server.close(); - } - - Future _setup() async { - await for (HttpRequest request in server) { - final info = request.connectionInfo; - if (info == null) { - request.response.statusCode = HttpStatus.forbidden; - request.response.close(); - continue; - } - var socket = await WebSocketTransformer.upgrade(request); - final client = WebSocketClient(socket, info); - clients.add(client); - _sendPlayersUpdated(); - _sendState(client); - - // Listen for incoming messages from the client - socket.listen((event) => _onMessage(client, event), onDone: () { - clients.remove(client); - _sendPlayersUpdated(); - }); - } - } - - @override - List get players => clients - .map((e) => GamePlayer(name: e.info.remoteAddress.address, id: e.id)) - .toList(); - - @override - int get playerId => -1; - - void _send(WebSocketClient client, ClientConnectionMessage message) { - client.socket.add(jsonEncode(message)); - } - - void _sendPlayersUpdated() { - for (final client in clients) { - _send( - client, - ClientConnectionMessage.playersUpdated(players, client.id), - ); - } - } - - void _sendToAll(ClientConnectionMessage message) { - for (final client in clients) { - _send(client, message); - } - } - - void _changeState(GameState state) { - stateSubject.add(state); - clients.forEach(_sendState); - } - - void _sendState(WebSocketClient client) { - _send( - client, - ClientConnectionMessage.stateChanged( - state.onPlayer( - client.id, - ), - ), - ); - } - - List _removeCards(List cards) { - final deckIndexes = cards.whereType().toList(); - final seatIndexes = cards.whereType().toList(); - - final addingCards = - cards.whereType().map((e) => e.card).toList(); - _changeState(state.copyWith( - decks: state.decks.asMap().entries.map( - (de) { - final deck = de.value; - return deck.copyWith( - cards: deck.cards - .asMap() - .entries - .where((e) { - final found = deckIndexes.any((element) => - element.deckIndex == de.key && - element.cardIndex == e.key); - if (found) { - addingCards.add(e.value); - } - return !found; - }) - .map((e) => e.value) - .toList()); - }, - ).toList(), - seats: state.seats.asMap().entries.map((se) { - final seat = se.value; - return seat.copyWith( - decks: seat.decks.asMap().entries.map((de) { - final deck = de.value; - return deck.copyWith( - cards: deck.cards - .asMap() - .entries - .where((e) { - final found = seatIndexes.any((element) => - element.deckIndex == de.key && - element.seatIndex == se.key && - element.cardIndex == e.key); - if (found) { - addingCards.add(e.value); - } - return !found; - }) - .map((e) => e.value) - .toList()); - }).toList()); - }).toList())); - return addingCards; - } - - Future _onMessage(WebSocketClient client, event) async { - final message = ServerConnectionMessage.fromJson(jsonDecode(event)); - void sendBack(ClientConnectionMessage message) { - _send(client, message); - } - - message.when( - fetchPlayers: () => sendBack( - ClientConnectionMessage.playersUpdated(players, client.id), - ), - chatMessage: (message) => _sendToAll( - ClientConnectionMessage.chatMessage( - message, - client.info.remoteAddress.address, - ), - ), - addDeck: (deck, seatIndex) { - if (seatIndex != null) { - _changeState(state.copyWith( - seats: List.from(state.seats) - ..[seatIndex] = state.seats[seatIndex].copyWith( - decks: [...state.seats[seatIndex].decks, deck], - ))); - return; - } - _changeState(state.copyWith(decks: [...state.decks, deck])); - }, - removeDeck: (index, seatIndex) { - if (seatIndex != null) { - _changeState(state.copyWith( - seats: List.from(state.seats) - ..[seatIndex] = state.seats[seatIndex].copyWith( - decks: List.from(state.seats[seatIndex].decks) - ..removeAt(index), - ))); - return; - } - _changeState(state.copyWith( - decks: List.from(state.decks)..removeAt(index))); - }, - addSeat: (name) { - _changeState(state.copyWith(seats: [ - ...state.seats, - GameSeat( - name: name, - ), - ])); - }, - removeSeat: (index) { - _changeState(state.copyWith( - seats: List.from(state.seats)..removeAt(index))); - }, - joinSeat: (index) { - _changeState(state.copyWith( - seats: List.from(state.seats) - ..[index] = state.seats[index].copyWith( - players: [...state.seats[index].players, client.id], - ))); - }, - leaveSeat: (index) { - _changeState(state.copyWith( - seats: List.from(state.seats) - ..[index] = state.seats[index].copyWith( - players: List.from(state.seats[index].players) - ..remove(client.id), - ))); - }, - addCards: (cards, deckIndex, seatIndex) { - final addingCards = _removeCards(cards); - var newState = state; - if (seatIndex != null) { - newState = newState.copyWith( - seats: List.from(newState.seats) - ..[seatIndex] = newState.seats[seatIndex].copyWith( - decks: List.from(newState.seats[seatIndex].decks) - ..[deckIndex] = - newState.seats[seatIndex].decks[deckIndex].copyWith( - cards: [ - ...newState.seats[seatIndex].decks[deckIndex].cards, - ...addingCards - ], - ))); - } else { - newState = newState.copyWith( - decks: List.from(newState.decks) - ..[deckIndex] = newState.decks[deckIndex].copyWith( - cards: [...newState.decks[deckIndex].cards, ...addingCards], - )); - } - _changeState(newState); - }, - removeCards: (cards) { - _removeCards(cards); - _changeState(state); - }, - putCards: (deckIndex, seatIndex, location, count, movedDeckIndex, - movedSeatIndex) { - var cards = []; - var newState = state; - if (seatIndex != null) { - final removeState = state.seats[seatIndex].decks[deckIndex] - .removeCards(count, location); - newState = state.copyWith( - seats: List.from(state.seats) - ..[seatIndex] = state.seats[seatIndex].copyWith( - decks: List.from(state.seats[seatIndex].decks) - ..[deckIndex] = removeState.deck)); - cards.addAll(removeState.removedCards); - } else { - final removeState = - state.decks[deckIndex].removeCards(count, location); - newState = state.copyWith( - decks: List.from(state.decks) - ..[deckIndex] = removeState.deck); - cards.addAll(removeState.removedCards); - } - if (movedSeatIndex != null) { - newState = newState.copyWith( - seats: List.from(newState.seats) - ..[movedSeatIndex] = newState.seats[movedSeatIndex].copyWith( - decks: List.from( - newState.seats[movedSeatIndex].decks) - ..[movedDeckIndex] = newState - .seats[movedSeatIndex].decks[movedDeckIndex] - .copyWith( - cards: [ - ...newState.seats[movedSeatIndex] - .decks[movedDeckIndex].cards, - ...cards - ], - ))); - } else { - newState = newState.copyWith( - decks: List.from(newState.decks) - ..[movedDeckIndex] = newState.decks[movedDeckIndex].copyWith( - cards: [...newState.decks[movedDeckIndex].cards, ...cards], - )); - } - _changeState(newState); - }, - changeVisibility: (deckIndex, seatIndex, visibility, ownVisibility) { - if (seatIndex != null) { - _changeState(state.copyWith( - seats: List.from(state.seats) - ..[seatIndex] = state.seats[seatIndex].copyWith( - decks: List.from(state.seats[seatIndex].decks) - ..[deckIndex] = state.seats[seatIndex].decks[deckIndex] - .copyWith( - visibility: visibility, - ownVisibility: ownVisibility)))); - } else { - _changeState(state.copyWith( - decks: List.from(state.decks) - ..[deckIndex] = state.decks[deckIndex].copyWith( - visibility: visibility, ownVisibility: ownVisibility))); - } - }, - shuffle: (deckIndex, seatIndex) { - if (seatIndex != null) { - _changeState(state.copyWith( - seats: List.from(state.seats) - ..[seatIndex] = state.seats[seatIndex].copyWith( - decks: List.from(state.seats[seatIndex].decks) - ..[deckIndex] = - state.seats[seatIndex].decks[deckIndex].shuffle()))); - } else { - _changeState(state.copyWith( - decks: List.from(state.decks) - ..[deckIndex] = state.decks[deckIndex].shuffle())); - } - }, - ); - } -} - -class ClientServerGameConnection extends ClientGameConnection { - final ServerGameConnection server; - - ClientServerGameConnection(this.server, super.channel); - - static Future create() async { - final server = await ServerGameConnection.create(); - return ClientServerGameConnection( - server, - WebSocketChannel.connect(Uri( - scheme: 'ws', - host: 'localhost', - port: server.server.port, - ))); - } - - @override - Future close() async { - await super.close(); - await server.close(); - } -} diff --git a/app/lib/logic/connection/server.freezed.dart b/app/lib/logic/connection/server.freezed.dart deleted file mode 100644 index b73a26d..0000000 --- a/app/lib/logic/connection/server.freezed.dart +++ /dev/null @@ -1,3708 +0,0 @@ -// coverage:ignore-file -// GENERATED CODE - DO NOT MODIFY BY HAND -// ignore_for_file: type=lint -// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark - -part of 'server.dart'; - -// ************************************************************************** -// FreezedGenerator -// ************************************************************************** - -T _$identity(T value) => value; - -final _privateConstructorUsedError = UnsupportedError( - 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); - -ServerConnectionMessage _$ServerConnectionMessageFromJson( - Map json) { - switch (json['type']) { - case 'fetchPlayers': - return FetchPlayersServerConnectionMessage.fromJson(json); - case 'chatMessage': - return ChatMessageServerConnectionMessage.fromJson(json); - case 'addDeck': - return AddDeckServerConnectionMessage.fromJson(json); - case 'removeDeck': - return RemoveDeckServerConnectionMessage.fromJson(json); - case 'addSeat': - return AddSeatServerConnectionMessage.fromJson(json); - case 'addCards': - return AddCardsServerConnectionMessage.fromJson(json); - case 'putCards': - return PutCardsServerConnectionMessage.fromJson(json); - case 'removeCards': - return RemoveCardsServerConnectionMessage.fromJson(json); - case 'removeSeat': - return RemoveSeatServerConnectionMessage.fromJson(json); - case 'joinSeat': - return JoinSeatServerConnectionMessage.fromJson(json); - case 'leaveSeat': - return LeaveSeatServerConnectionMessage.fromJson(json); - case 'shuffle': - return ShuffleServerConnectionMessage.fromJson(json); - case 'changeVisibility': - return ChangeVisibilityServerConnectionMessage.fromJson(json); - - default: - throw CheckedFromJsonException(json, 'type', 'ServerConnectionMessage', - 'Invalid union type "${json['type']}"!'); - } -} - -/// @nodoc -mixin _$ServerConnectionMessage { - @optionalTypeArgs - TResult when({ - required TResult Function() fetchPlayers, - required TResult Function(String message) chatMessage, - required TResult Function(GameDeck deck, int? seatIndex) addDeck, - required TResult Function(int index, int? seatIndex) removeDeck, - required TResult Function(String name) addSeat, - required TResult Function( - List cards, int deckIndex, int? seatIndex) - addCards, - required TResult Function( - int deckIndex, - int? seatIndex, - PickLocation location, - int count, - int movedDeckIndex, - int? movedSeatIndex) - putCards, - required TResult Function(List cards) removeCards, - required TResult Function(int index) removeSeat, - required TResult Function(int index) joinSeat, - required TResult Function(int index) leaveSeat, - required TResult Function(int deckIndex, int? seatIndex) shuffle, - required TResult Function(int deckIndex, int? seatIndex, - DeckVisibility visibility, DeckVisibility? ownVisibility) - changeVisibility, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? fetchPlayers, - TResult? Function(String message)? chatMessage, - TResult? Function(GameDeck deck, int? seatIndex)? addDeck, - TResult? Function(int index, int? seatIndex)? removeDeck, - TResult? Function(String name)? addSeat, - TResult? Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult? Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult? Function(List cards)? removeCards, - TResult? Function(int index)? removeSeat, - TResult? Function(int index)? joinSeat, - TResult? Function(int index)? leaveSeat, - TResult? Function(int deckIndex, int? seatIndex)? shuffle, - TResult? Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? fetchPlayers, - TResult Function(String message)? chatMessage, - TResult Function(GameDeck deck, int? seatIndex)? addDeck, - TResult Function(int index, int? seatIndex)? removeDeck, - TResult Function(String name)? addSeat, - TResult Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult Function(List cards)? removeCards, - TResult Function(int index)? removeSeat, - TResult Function(int index)? joinSeat, - TResult Function(int index)? leaveSeat, - TResult Function(int deckIndex, int? seatIndex)? shuffle, - TResult Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(FetchPlayersServerConnectionMessage value) - fetchPlayers, - required TResult Function(ChatMessageServerConnectionMessage value) - chatMessage, - required TResult Function(AddDeckServerConnectionMessage value) addDeck, - required TResult Function(RemoveDeckServerConnectionMessage value) - removeDeck, - required TResult Function(AddSeatServerConnectionMessage value) addSeat, - required TResult Function(AddCardsServerConnectionMessage value) addCards, - required TResult Function(PutCardsServerConnectionMessage value) putCards, - required TResult Function(RemoveCardsServerConnectionMessage value) - removeCards, - required TResult Function(RemoveSeatServerConnectionMessage value) - removeSeat, - required TResult Function(JoinSeatServerConnectionMessage value) joinSeat, - required TResult Function(LeaveSeatServerConnectionMessage value) leaveSeat, - required TResult Function(ShuffleServerConnectionMessage value) shuffle, - required TResult Function(ChangeVisibilityServerConnectionMessage value) - changeVisibility, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult? Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult? Function(AddDeckServerConnectionMessage value)? addDeck, - TResult? Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult? Function(AddSeatServerConnectionMessage value)? addSeat, - TResult? Function(AddCardsServerConnectionMessage value)? addCards, - TResult? Function(PutCardsServerConnectionMessage value)? putCards, - TResult? Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult? Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult? Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult? Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult? Function(ShuffleServerConnectionMessage value)? shuffle, - TResult? Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult Function(AddDeckServerConnectionMessage value)? addDeck, - TResult Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult Function(AddSeatServerConnectionMessage value)? addSeat, - TResult Function(AddCardsServerConnectionMessage value)? addCards, - TResult Function(PutCardsServerConnectionMessage value)? putCards, - TResult Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult Function(ShuffleServerConnectionMessage value)? shuffle, - TResult Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - Map toJson() => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $ServerConnectionMessageCopyWith<$Res> { - factory $ServerConnectionMessageCopyWith(ServerConnectionMessage value, - $Res Function(ServerConnectionMessage) then) = - _$ServerConnectionMessageCopyWithImpl<$Res, ServerConnectionMessage>; -} - -/// @nodoc -class _$ServerConnectionMessageCopyWithImpl<$Res, - $Val extends ServerConnectionMessage> - implements $ServerConnectionMessageCopyWith<$Res> { - _$ServerConnectionMessageCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; -} - -/// @nodoc -abstract class _$$FetchPlayersServerConnectionMessageImplCopyWith<$Res> { - factory _$$FetchPlayersServerConnectionMessageImplCopyWith( - _$FetchPlayersServerConnectionMessageImpl value, - $Res Function(_$FetchPlayersServerConnectionMessageImpl) then) = - __$$FetchPlayersServerConnectionMessageImplCopyWithImpl<$Res>; -} - -/// @nodoc -class __$$FetchPlayersServerConnectionMessageImplCopyWithImpl<$Res> - extends _$ServerConnectionMessageCopyWithImpl<$Res, - _$FetchPlayersServerConnectionMessageImpl> - implements _$$FetchPlayersServerConnectionMessageImplCopyWith<$Res> { - __$$FetchPlayersServerConnectionMessageImplCopyWithImpl( - _$FetchPlayersServerConnectionMessageImpl _value, - $Res Function(_$FetchPlayersServerConnectionMessageImpl) _then) - : super(_value, _then); -} - -/// @nodoc -@JsonSerializable() -class _$FetchPlayersServerConnectionMessageImpl - implements FetchPlayersServerConnectionMessage { - const _$FetchPlayersServerConnectionMessageImpl({final String? $type}) - : $type = $type ?? 'fetchPlayers'; - - factory _$FetchPlayersServerConnectionMessageImpl.fromJson( - Map json) => - _$$FetchPlayersServerConnectionMessageImplFromJson(json); - - @JsonKey(name: 'type') - final String $type; - - @override - String toString() { - return 'ServerConnectionMessage.fetchPlayers()'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$FetchPlayersServerConnectionMessageImpl); - } - - @JsonKey(ignore: true) - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() fetchPlayers, - required TResult Function(String message) chatMessage, - required TResult Function(GameDeck deck, int? seatIndex) addDeck, - required TResult Function(int index, int? seatIndex) removeDeck, - required TResult Function(String name) addSeat, - required TResult Function( - List cards, int deckIndex, int? seatIndex) - addCards, - required TResult Function( - int deckIndex, - int? seatIndex, - PickLocation location, - int count, - int movedDeckIndex, - int? movedSeatIndex) - putCards, - required TResult Function(List cards) removeCards, - required TResult Function(int index) removeSeat, - required TResult Function(int index) joinSeat, - required TResult Function(int index) leaveSeat, - required TResult Function(int deckIndex, int? seatIndex) shuffle, - required TResult Function(int deckIndex, int? seatIndex, - DeckVisibility visibility, DeckVisibility? ownVisibility) - changeVisibility, - }) { - return fetchPlayers(); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? fetchPlayers, - TResult? Function(String message)? chatMessage, - TResult? Function(GameDeck deck, int? seatIndex)? addDeck, - TResult? Function(int index, int? seatIndex)? removeDeck, - TResult? Function(String name)? addSeat, - TResult? Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult? Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult? Function(List cards)? removeCards, - TResult? Function(int index)? removeSeat, - TResult? Function(int index)? joinSeat, - TResult? Function(int index)? leaveSeat, - TResult? Function(int deckIndex, int? seatIndex)? shuffle, - TResult? Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - }) { - return fetchPlayers?.call(); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? fetchPlayers, - TResult Function(String message)? chatMessage, - TResult Function(GameDeck deck, int? seatIndex)? addDeck, - TResult Function(int index, int? seatIndex)? removeDeck, - TResult Function(String name)? addSeat, - TResult Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult Function(List cards)? removeCards, - TResult Function(int index)? removeSeat, - TResult Function(int index)? joinSeat, - TResult Function(int index)? leaveSeat, - TResult Function(int deckIndex, int? seatIndex)? shuffle, - TResult Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - required TResult orElse(), - }) { - if (fetchPlayers != null) { - return fetchPlayers(); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(FetchPlayersServerConnectionMessage value) - fetchPlayers, - required TResult Function(ChatMessageServerConnectionMessage value) - chatMessage, - required TResult Function(AddDeckServerConnectionMessage value) addDeck, - required TResult Function(RemoveDeckServerConnectionMessage value) - removeDeck, - required TResult Function(AddSeatServerConnectionMessage value) addSeat, - required TResult Function(AddCardsServerConnectionMessage value) addCards, - required TResult Function(PutCardsServerConnectionMessage value) putCards, - required TResult Function(RemoveCardsServerConnectionMessage value) - removeCards, - required TResult Function(RemoveSeatServerConnectionMessage value) - removeSeat, - required TResult Function(JoinSeatServerConnectionMessage value) joinSeat, - required TResult Function(LeaveSeatServerConnectionMessage value) leaveSeat, - required TResult Function(ShuffleServerConnectionMessage value) shuffle, - required TResult Function(ChangeVisibilityServerConnectionMessage value) - changeVisibility, - }) { - return fetchPlayers(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult? Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult? Function(AddDeckServerConnectionMessage value)? addDeck, - TResult? Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult? Function(AddSeatServerConnectionMessage value)? addSeat, - TResult? Function(AddCardsServerConnectionMessage value)? addCards, - TResult? Function(PutCardsServerConnectionMessage value)? putCards, - TResult? Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult? Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult? Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult? Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult? Function(ShuffleServerConnectionMessage value)? shuffle, - TResult? Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - }) { - return fetchPlayers?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult Function(AddDeckServerConnectionMessage value)? addDeck, - TResult Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult Function(AddSeatServerConnectionMessage value)? addSeat, - TResult Function(AddCardsServerConnectionMessage value)? addCards, - TResult Function(PutCardsServerConnectionMessage value)? putCards, - TResult Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult Function(ShuffleServerConnectionMessage value)? shuffle, - TResult Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - required TResult orElse(), - }) { - if (fetchPlayers != null) { - return fetchPlayers(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$FetchPlayersServerConnectionMessageImplToJson( - this, - ); - } -} - -abstract class FetchPlayersServerConnectionMessage - implements ServerConnectionMessage { - const factory FetchPlayersServerConnectionMessage() = - _$FetchPlayersServerConnectionMessageImpl; - - factory FetchPlayersServerConnectionMessage.fromJson( - Map json) = - _$FetchPlayersServerConnectionMessageImpl.fromJson; -} - -/// @nodoc -abstract class _$$ChatMessageServerConnectionMessageImplCopyWith<$Res> { - factory _$$ChatMessageServerConnectionMessageImplCopyWith( - _$ChatMessageServerConnectionMessageImpl value, - $Res Function(_$ChatMessageServerConnectionMessageImpl) then) = - __$$ChatMessageServerConnectionMessageImplCopyWithImpl<$Res>; - @useResult - $Res call({String message}); -} - -/// @nodoc -class __$$ChatMessageServerConnectionMessageImplCopyWithImpl<$Res> - extends _$ServerConnectionMessageCopyWithImpl<$Res, - _$ChatMessageServerConnectionMessageImpl> - implements _$$ChatMessageServerConnectionMessageImplCopyWith<$Res> { - __$$ChatMessageServerConnectionMessageImplCopyWithImpl( - _$ChatMessageServerConnectionMessageImpl _value, - $Res Function(_$ChatMessageServerConnectionMessageImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? message = null, - }) { - return _then(_$ChatMessageServerConnectionMessageImpl( - null == message - ? _value.message - : message // ignore: cast_nullable_to_non_nullable - as String, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$ChatMessageServerConnectionMessageImpl - implements ChatMessageServerConnectionMessage { - const _$ChatMessageServerConnectionMessageImpl(this.message, - {final String? $type}) - : $type = $type ?? 'chatMessage'; - - factory _$ChatMessageServerConnectionMessageImpl.fromJson( - Map json) => - _$$ChatMessageServerConnectionMessageImplFromJson(json); - - @override - final String message; - - @JsonKey(name: 'type') - final String $type; - - @override - String toString() { - return 'ServerConnectionMessage.chatMessage(message: $message)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$ChatMessageServerConnectionMessageImpl && - (identical(other.message, message) || other.message == message)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => Object.hash(runtimeType, message); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$ChatMessageServerConnectionMessageImplCopyWith< - _$ChatMessageServerConnectionMessageImpl> - get copyWith => __$$ChatMessageServerConnectionMessageImplCopyWithImpl< - _$ChatMessageServerConnectionMessageImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() fetchPlayers, - required TResult Function(String message) chatMessage, - required TResult Function(GameDeck deck, int? seatIndex) addDeck, - required TResult Function(int index, int? seatIndex) removeDeck, - required TResult Function(String name) addSeat, - required TResult Function( - List cards, int deckIndex, int? seatIndex) - addCards, - required TResult Function( - int deckIndex, - int? seatIndex, - PickLocation location, - int count, - int movedDeckIndex, - int? movedSeatIndex) - putCards, - required TResult Function(List cards) removeCards, - required TResult Function(int index) removeSeat, - required TResult Function(int index) joinSeat, - required TResult Function(int index) leaveSeat, - required TResult Function(int deckIndex, int? seatIndex) shuffle, - required TResult Function(int deckIndex, int? seatIndex, - DeckVisibility visibility, DeckVisibility? ownVisibility) - changeVisibility, - }) { - return chatMessage(message); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? fetchPlayers, - TResult? Function(String message)? chatMessage, - TResult? Function(GameDeck deck, int? seatIndex)? addDeck, - TResult? Function(int index, int? seatIndex)? removeDeck, - TResult? Function(String name)? addSeat, - TResult? Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult? Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult? Function(List cards)? removeCards, - TResult? Function(int index)? removeSeat, - TResult? Function(int index)? joinSeat, - TResult? Function(int index)? leaveSeat, - TResult? Function(int deckIndex, int? seatIndex)? shuffle, - TResult? Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - }) { - return chatMessage?.call(message); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? fetchPlayers, - TResult Function(String message)? chatMessage, - TResult Function(GameDeck deck, int? seatIndex)? addDeck, - TResult Function(int index, int? seatIndex)? removeDeck, - TResult Function(String name)? addSeat, - TResult Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult Function(List cards)? removeCards, - TResult Function(int index)? removeSeat, - TResult Function(int index)? joinSeat, - TResult Function(int index)? leaveSeat, - TResult Function(int deckIndex, int? seatIndex)? shuffle, - TResult Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - required TResult orElse(), - }) { - if (chatMessage != null) { - return chatMessage(message); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(FetchPlayersServerConnectionMessage value) - fetchPlayers, - required TResult Function(ChatMessageServerConnectionMessage value) - chatMessage, - required TResult Function(AddDeckServerConnectionMessage value) addDeck, - required TResult Function(RemoveDeckServerConnectionMessage value) - removeDeck, - required TResult Function(AddSeatServerConnectionMessage value) addSeat, - required TResult Function(AddCardsServerConnectionMessage value) addCards, - required TResult Function(PutCardsServerConnectionMessage value) putCards, - required TResult Function(RemoveCardsServerConnectionMessage value) - removeCards, - required TResult Function(RemoveSeatServerConnectionMessage value) - removeSeat, - required TResult Function(JoinSeatServerConnectionMessage value) joinSeat, - required TResult Function(LeaveSeatServerConnectionMessage value) leaveSeat, - required TResult Function(ShuffleServerConnectionMessage value) shuffle, - required TResult Function(ChangeVisibilityServerConnectionMessage value) - changeVisibility, - }) { - return chatMessage(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult? Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult? Function(AddDeckServerConnectionMessage value)? addDeck, - TResult? Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult? Function(AddSeatServerConnectionMessage value)? addSeat, - TResult? Function(AddCardsServerConnectionMessage value)? addCards, - TResult? Function(PutCardsServerConnectionMessage value)? putCards, - TResult? Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult? Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult? Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult? Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult? Function(ShuffleServerConnectionMessage value)? shuffle, - TResult? Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - }) { - return chatMessage?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult Function(AddDeckServerConnectionMessage value)? addDeck, - TResult Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult Function(AddSeatServerConnectionMessage value)? addSeat, - TResult Function(AddCardsServerConnectionMessage value)? addCards, - TResult Function(PutCardsServerConnectionMessage value)? putCards, - TResult Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult Function(ShuffleServerConnectionMessage value)? shuffle, - TResult Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - required TResult orElse(), - }) { - if (chatMessage != null) { - return chatMessage(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$ChatMessageServerConnectionMessageImplToJson( - this, - ); - } -} - -abstract class ChatMessageServerConnectionMessage - implements ServerConnectionMessage { - const factory ChatMessageServerConnectionMessage(final String message) = - _$ChatMessageServerConnectionMessageImpl; - - factory ChatMessageServerConnectionMessage.fromJson( - Map json) = - _$ChatMessageServerConnectionMessageImpl.fromJson; - - String get message; - @JsonKey(ignore: true) - _$$ChatMessageServerConnectionMessageImplCopyWith< - _$ChatMessageServerConnectionMessageImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$AddDeckServerConnectionMessageImplCopyWith<$Res> { - factory _$$AddDeckServerConnectionMessageImplCopyWith( - _$AddDeckServerConnectionMessageImpl value, - $Res Function(_$AddDeckServerConnectionMessageImpl) then) = - __$$AddDeckServerConnectionMessageImplCopyWithImpl<$Res>; - @useResult - $Res call({GameDeck deck, int? seatIndex}); - - $GameDeckCopyWith<$Res> get deck; -} - -/// @nodoc -class __$$AddDeckServerConnectionMessageImplCopyWithImpl<$Res> - extends _$ServerConnectionMessageCopyWithImpl<$Res, - _$AddDeckServerConnectionMessageImpl> - implements _$$AddDeckServerConnectionMessageImplCopyWith<$Res> { - __$$AddDeckServerConnectionMessageImplCopyWithImpl( - _$AddDeckServerConnectionMessageImpl _value, - $Res Function(_$AddDeckServerConnectionMessageImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? deck = null, - Object? seatIndex = freezed, - }) { - return _then(_$AddDeckServerConnectionMessageImpl( - null == deck - ? _value.deck - : deck // ignore: cast_nullable_to_non_nullable - as GameDeck, - freezed == seatIndex - ? _value.seatIndex - : seatIndex // ignore: cast_nullable_to_non_nullable - as int?, - )); - } - - @override - @pragma('vm:prefer-inline') - $GameDeckCopyWith<$Res> get deck { - return $GameDeckCopyWith<$Res>(_value.deck, (value) { - return _then(_value.copyWith(deck: value)); - }); - } -} - -/// @nodoc -@JsonSerializable() -class _$AddDeckServerConnectionMessageImpl - implements AddDeckServerConnectionMessage { - const _$AddDeckServerConnectionMessageImpl(this.deck, this.seatIndex, - {final String? $type}) - : $type = $type ?? 'addDeck'; - - factory _$AddDeckServerConnectionMessageImpl.fromJson( - Map json) => - _$$AddDeckServerConnectionMessageImplFromJson(json); - - @override - final GameDeck deck; - @override - final int? seatIndex; - - @JsonKey(name: 'type') - final String $type; - - @override - String toString() { - return 'ServerConnectionMessage.addDeck(deck: $deck, seatIndex: $seatIndex)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$AddDeckServerConnectionMessageImpl && - (identical(other.deck, deck) || other.deck == deck) && - (identical(other.seatIndex, seatIndex) || - other.seatIndex == seatIndex)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => Object.hash(runtimeType, deck, seatIndex); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$AddDeckServerConnectionMessageImplCopyWith< - _$AddDeckServerConnectionMessageImpl> - get copyWith => __$$AddDeckServerConnectionMessageImplCopyWithImpl< - _$AddDeckServerConnectionMessageImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() fetchPlayers, - required TResult Function(String message) chatMessage, - required TResult Function(GameDeck deck, int? seatIndex) addDeck, - required TResult Function(int index, int? seatIndex) removeDeck, - required TResult Function(String name) addSeat, - required TResult Function( - List cards, int deckIndex, int? seatIndex) - addCards, - required TResult Function( - int deckIndex, - int? seatIndex, - PickLocation location, - int count, - int movedDeckIndex, - int? movedSeatIndex) - putCards, - required TResult Function(List cards) removeCards, - required TResult Function(int index) removeSeat, - required TResult Function(int index) joinSeat, - required TResult Function(int index) leaveSeat, - required TResult Function(int deckIndex, int? seatIndex) shuffle, - required TResult Function(int deckIndex, int? seatIndex, - DeckVisibility visibility, DeckVisibility? ownVisibility) - changeVisibility, - }) { - return addDeck(deck, seatIndex); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? fetchPlayers, - TResult? Function(String message)? chatMessage, - TResult? Function(GameDeck deck, int? seatIndex)? addDeck, - TResult? Function(int index, int? seatIndex)? removeDeck, - TResult? Function(String name)? addSeat, - TResult? Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult? Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult? Function(List cards)? removeCards, - TResult? Function(int index)? removeSeat, - TResult? Function(int index)? joinSeat, - TResult? Function(int index)? leaveSeat, - TResult? Function(int deckIndex, int? seatIndex)? shuffle, - TResult? Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - }) { - return addDeck?.call(deck, seatIndex); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? fetchPlayers, - TResult Function(String message)? chatMessage, - TResult Function(GameDeck deck, int? seatIndex)? addDeck, - TResult Function(int index, int? seatIndex)? removeDeck, - TResult Function(String name)? addSeat, - TResult Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult Function(List cards)? removeCards, - TResult Function(int index)? removeSeat, - TResult Function(int index)? joinSeat, - TResult Function(int index)? leaveSeat, - TResult Function(int deckIndex, int? seatIndex)? shuffle, - TResult Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - required TResult orElse(), - }) { - if (addDeck != null) { - return addDeck(deck, seatIndex); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(FetchPlayersServerConnectionMessage value) - fetchPlayers, - required TResult Function(ChatMessageServerConnectionMessage value) - chatMessage, - required TResult Function(AddDeckServerConnectionMessage value) addDeck, - required TResult Function(RemoveDeckServerConnectionMessage value) - removeDeck, - required TResult Function(AddSeatServerConnectionMessage value) addSeat, - required TResult Function(AddCardsServerConnectionMessage value) addCards, - required TResult Function(PutCardsServerConnectionMessage value) putCards, - required TResult Function(RemoveCardsServerConnectionMessage value) - removeCards, - required TResult Function(RemoveSeatServerConnectionMessage value) - removeSeat, - required TResult Function(JoinSeatServerConnectionMessage value) joinSeat, - required TResult Function(LeaveSeatServerConnectionMessage value) leaveSeat, - required TResult Function(ShuffleServerConnectionMessage value) shuffle, - required TResult Function(ChangeVisibilityServerConnectionMessage value) - changeVisibility, - }) { - return addDeck(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult? Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult? Function(AddDeckServerConnectionMessage value)? addDeck, - TResult? Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult? Function(AddSeatServerConnectionMessage value)? addSeat, - TResult? Function(AddCardsServerConnectionMessage value)? addCards, - TResult? Function(PutCardsServerConnectionMessage value)? putCards, - TResult? Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult? Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult? Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult? Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult? Function(ShuffleServerConnectionMessage value)? shuffle, - TResult? Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - }) { - return addDeck?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult Function(AddDeckServerConnectionMessage value)? addDeck, - TResult Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult Function(AddSeatServerConnectionMessage value)? addSeat, - TResult Function(AddCardsServerConnectionMessage value)? addCards, - TResult Function(PutCardsServerConnectionMessage value)? putCards, - TResult Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult Function(ShuffleServerConnectionMessage value)? shuffle, - TResult Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - required TResult orElse(), - }) { - if (addDeck != null) { - return addDeck(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$AddDeckServerConnectionMessageImplToJson( - this, - ); - } -} - -abstract class AddDeckServerConnectionMessage - implements ServerConnectionMessage { - const factory AddDeckServerConnectionMessage( - final GameDeck deck, final int? seatIndex) = - _$AddDeckServerConnectionMessageImpl; - - factory AddDeckServerConnectionMessage.fromJson(Map json) = - _$AddDeckServerConnectionMessageImpl.fromJson; - - GameDeck get deck; - int? get seatIndex; - @JsonKey(ignore: true) - _$$AddDeckServerConnectionMessageImplCopyWith< - _$AddDeckServerConnectionMessageImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$RemoveDeckServerConnectionMessageImplCopyWith<$Res> { - factory _$$RemoveDeckServerConnectionMessageImplCopyWith( - _$RemoveDeckServerConnectionMessageImpl value, - $Res Function(_$RemoveDeckServerConnectionMessageImpl) then) = - __$$RemoveDeckServerConnectionMessageImplCopyWithImpl<$Res>; - @useResult - $Res call({int index, int? seatIndex}); -} - -/// @nodoc -class __$$RemoveDeckServerConnectionMessageImplCopyWithImpl<$Res> - extends _$ServerConnectionMessageCopyWithImpl<$Res, - _$RemoveDeckServerConnectionMessageImpl> - implements _$$RemoveDeckServerConnectionMessageImplCopyWith<$Res> { - __$$RemoveDeckServerConnectionMessageImplCopyWithImpl( - _$RemoveDeckServerConnectionMessageImpl _value, - $Res Function(_$RemoveDeckServerConnectionMessageImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? index = null, - Object? seatIndex = freezed, - }) { - return _then(_$RemoveDeckServerConnectionMessageImpl( - null == index - ? _value.index - : index // ignore: cast_nullable_to_non_nullable - as int, - freezed == seatIndex - ? _value.seatIndex - : seatIndex // ignore: cast_nullable_to_non_nullable - as int?, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$RemoveDeckServerConnectionMessageImpl - implements RemoveDeckServerConnectionMessage { - const _$RemoveDeckServerConnectionMessageImpl(this.index, this.seatIndex, - {final String? $type}) - : $type = $type ?? 'removeDeck'; - - factory _$RemoveDeckServerConnectionMessageImpl.fromJson( - Map json) => - _$$RemoveDeckServerConnectionMessageImplFromJson(json); - - @override - final int index; - @override - final int? seatIndex; - - @JsonKey(name: 'type') - final String $type; - - @override - String toString() { - return 'ServerConnectionMessage.removeDeck(index: $index, seatIndex: $seatIndex)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$RemoveDeckServerConnectionMessageImpl && - (identical(other.index, index) || other.index == index) && - (identical(other.seatIndex, seatIndex) || - other.seatIndex == seatIndex)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => Object.hash(runtimeType, index, seatIndex); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$RemoveDeckServerConnectionMessageImplCopyWith< - _$RemoveDeckServerConnectionMessageImpl> - get copyWith => __$$RemoveDeckServerConnectionMessageImplCopyWithImpl< - _$RemoveDeckServerConnectionMessageImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() fetchPlayers, - required TResult Function(String message) chatMessage, - required TResult Function(GameDeck deck, int? seatIndex) addDeck, - required TResult Function(int index, int? seatIndex) removeDeck, - required TResult Function(String name) addSeat, - required TResult Function( - List cards, int deckIndex, int? seatIndex) - addCards, - required TResult Function( - int deckIndex, - int? seatIndex, - PickLocation location, - int count, - int movedDeckIndex, - int? movedSeatIndex) - putCards, - required TResult Function(List cards) removeCards, - required TResult Function(int index) removeSeat, - required TResult Function(int index) joinSeat, - required TResult Function(int index) leaveSeat, - required TResult Function(int deckIndex, int? seatIndex) shuffle, - required TResult Function(int deckIndex, int? seatIndex, - DeckVisibility visibility, DeckVisibility? ownVisibility) - changeVisibility, - }) { - return removeDeck(index, seatIndex); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? fetchPlayers, - TResult? Function(String message)? chatMessage, - TResult? Function(GameDeck deck, int? seatIndex)? addDeck, - TResult? Function(int index, int? seatIndex)? removeDeck, - TResult? Function(String name)? addSeat, - TResult? Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult? Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult? Function(List cards)? removeCards, - TResult? Function(int index)? removeSeat, - TResult? Function(int index)? joinSeat, - TResult? Function(int index)? leaveSeat, - TResult? Function(int deckIndex, int? seatIndex)? shuffle, - TResult? Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - }) { - return removeDeck?.call(index, seatIndex); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? fetchPlayers, - TResult Function(String message)? chatMessage, - TResult Function(GameDeck deck, int? seatIndex)? addDeck, - TResult Function(int index, int? seatIndex)? removeDeck, - TResult Function(String name)? addSeat, - TResult Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult Function(List cards)? removeCards, - TResult Function(int index)? removeSeat, - TResult Function(int index)? joinSeat, - TResult Function(int index)? leaveSeat, - TResult Function(int deckIndex, int? seatIndex)? shuffle, - TResult Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - required TResult orElse(), - }) { - if (removeDeck != null) { - return removeDeck(index, seatIndex); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(FetchPlayersServerConnectionMessage value) - fetchPlayers, - required TResult Function(ChatMessageServerConnectionMessage value) - chatMessage, - required TResult Function(AddDeckServerConnectionMessage value) addDeck, - required TResult Function(RemoveDeckServerConnectionMessage value) - removeDeck, - required TResult Function(AddSeatServerConnectionMessage value) addSeat, - required TResult Function(AddCardsServerConnectionMessage value) addCards, - required TResult Function(PutCardsServerConnectionMessage value) putCards, - required TResult Function(RemoveCardsServerConnectionMessage value) - removeCards, - required TResult Function(RemoveSeatServerConnectionMessage value) - removeSeat, - required TResult Function(JoinSeatServerConnectionMessage value) joinSeat, - required TResult Function(LeaveSeatServerConnectionMessage value) leaveSeat, - required TResult Function(ShuffleServerConnectionMessage value) shuffle, - required TResult Function(ChangeVisibilityServerConnectionMessage value) - changeVisibility, - }) { - return removeDeck(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult? Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult? Function(AddDeckServerConnectionMessage value)? addDeck, - TResult? Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult? Function(AddSeatServerConnectionMessage value)? addSeat, - TResult? Function(AddCardsServerConnectionMessage value)? addCards, - TResult? Function(PutCardsServerConnectionMessage value)? putCards, - TResult? Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult? Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult? Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult? Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult? Function(ShuffleServerConnectionMessage value)? shuffle, - TResult? Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - }) { - return removeDeck?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult Function(AddDeckServerConnectionMessage value)? addDeck, - TResult Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult Function(AddSeatServerConnectionMessage value)? addSeat, - TResult Function(AddCardsServerConnectionMessage value)? addCards, - TResult Function(PutCardsServerConnectionMessage value)? putCards, - TResult Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult Function(ShuffleServerConnectionMessage value)? shuffle, - TResult Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - required TResult orElse(), - }) { - if (removeDeck != null) { - return removeDeck(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$RemoveDeckServerConnectionMessageImplToJson( - this, - ); - } -} - -abstract class RemoveDeckServerConnectionMessage - implements ServerConnectionMessage { - const factory RemoveDeckServerConnectionMessage( - final int index, final int? seatIndex) = - _$RemoveDeckServerConnectionMessageImpl; - - factory RemoveDeckServerConnectionMessage.fromJson( - Map json) = - _$RemoveDeckServerConnectionMessageImpl.fromJson; - - int get index; - int? get seatIndex; - @JsonKey(ignore: true) - _$$RemoveDeckServerConnectionMessageImplCopyWith< - _$RemoveDeckServerConnectionMessageImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$AddSeatServerConnectionMessageImplCopyWith<$Res> { - factory _$$AddSeatServerConnectionMessageImplCopyWith( - _$AddSeatServerConnectionMessageImpl value, - $Res Function(_$AddSeatServerConnectionMessageImpl) then) = - __$$AddSeatServerConnectionMessageImplCopyWithImpl<$Res>; - @useResult - $Res call({String name}); -} - -/// @nodoc -class __$$AddSeatServerConnectionMessageImplCopyWithImpl<$Res> - extends _$ServerConnectionMessageCopyWithImpl<$Res, - _$AddSeatServerConnectionMessageImpl> - implements _$$AddSeatServerConnectionMessageImplCopyWith<$Res> { - __$$AddSeatServerConnectionMessageImplCopyWithImpl( - _$AddSeatServerConnectionMessageImpl _value, - $Res Function(_$AddSeatServerConnectionMessageImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? name = null, - }) { - return _then(_$AddSeatServerConnectionMessageImpl( - null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$AddSeatServerConnectionMessageImpl - implements AddSeatServerConnectionMessage { - const _$AddSeatServerConnectionMessageImpl(this.name, {final String? $type}) - : $type = $type ?? 'addSeat'; - - factory _$AddSeatServerConnectionMessageImpl.fromJson( - Map json) => - _$$AddSeatServerConnectionMessageImplFromJson(json); - - @override - final String name; - - @JsonKey(name: 'type') - final String $type; - - @override - String toString() { - return 'ServerConnectionMessage.addSeat(name: $name)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$AddSeatServerConnectionMessageImpl && - (identical(other.name, name) || other.name == name)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => Object.hash(runtimeType, name); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$AddSeatServerConnectionMessageImplCopyWith< - _$AddSeatServerConnectionMessageImpl> - get copyWith => __$$AddSeatServerConnectionMessageImplCopyWithImpl< - _$AddSeatServerConnectionMessageImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() fetchPlayers, - required TResult Function(String message) chatMessage, - required TResult Function(GameDeck deck, int? seatIndex) addDeck, - required TResult Function(int index, int? seatIndex) removeDeck, - required TResult Function(String name) addSeat, - required TResult Function( - List cards, int deckIndex, int? seatIndex) - addCards, - required TResult Function( - int deckIndex, - int? seatIndex, - PickLocation location, - int count, - int movedDeckIndex, - int? movedSeatIndex) - putCards, - required TResult Function(List cards) removeCards, - required TResult Function(int index) removeSeat, - required TResult Function(int index) joinSeat, - required TResult Function(int index) leaveSeat, - required TResult Function(int deckIndex, int? seatIndex) shuffle, - required TResult Function(int deckIndex, int? seatIndex, - DeckVisibility visibility, DeckVisibility? ownVisibility) - changeVisibility, - }) { - return addSeat(name); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? fetchPlayers, - TResult? Function(String message)? chatMessage, - TResult? Function(GameDeck deck, int? seatIndex)? addDeck, - TResult? Function(int index, int? seatIndex)? removeDeck, - TResult? Function(String name)? addSeat, - TResult? Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult? Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult? Function(List cards)? removeCards, - TResult? Function(int index)? removeSeat, - TResult? Function(int index)? joinSeat, - TResult? Function(int index)? leaveSeat, - TResult? Function(int deckIndex, int? seatIndex)? shuffle, - TResult? Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - }) { - return addSeat?.call(name); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? fetchPlayers, - TResult Function(String message)? chatMessage, - TResult Function(GameDeck deck, int? seatIndex)? addDeck, - TResult Function(int index, int? seatIndex)? removeDeck, - TResult Function(String name)? addSeat, - TResult Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult Function(List cards)? removeCards, - TResult Function(int index)? removeSeat, - TResult Function(int index)? joinSeat, - TResult Function(int index)? leaveSeat, - TResult Function(int deckIndex, int? seatIndex)? shuffle, - TResult Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - required TResult orElse(), - }) { - if (addSeat != null) { - return addSeat(name); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(FetchPlayersServerConnectionMessage value) - fetchPlayers, - required TResult Function(ChatMessageServerConnectionMessage value) - chatMessage, - required TResult Function(AddDeckServerConnectionMessage value) addDeck, - required TResult Function(RemoveDeckServerConnectionMessage value) - removeDeck, - required TResult Function(AddSeatServerConnectionMessage value) addSeat, - required TResult Function(AddCardsServerConnectionMessage value) addCards, - required TResult Function(PutCardsServerConnectionMessage value) putCards, - required TResult Function(RemoveCardsServerConnectionMessage value) - removeCards, - required TResult Function(RemoveSeatServerConnectionMessage value) - removeSeat, - required TResult Function(JoinSeatServerConnectionMessage value) joinSeat, - required TResult Function(LeaveSeatServerConnectionMessage value) leaveSeat, - required TResult Function(ShuffleServerConnectionMessage value) shuffle, - required TResult Function(ChangeVisibilityServerConnectionMessage value) - changeVisibility, - }) { - return addSeat(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult? Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult? Function(AddDeckServerConnectionMessage value)? addDeck, - TResult? Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult? Function(AddSeatServerConnectionMessage value)? addSeat, - TResult? Function(AddCardsServerConnectionMessage value)? addCards, - TResult? Function(PutCardsServerConnectionMessage value)? putCards, - TResult? Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult? Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult? Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult? Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult? Function(ShuffleServerConnectionMessage value)? shuffle, - TResult? Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - }) { - return addSeat?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult Function(AddDeckServerConnectionMessage value)? addDeck, - TResult Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult Function(AddSeatServerConnectionMessage value)? addSeat, - TResult Function(AddCardsServerConnectionMessage value)? addCards, - TResult Function(PutCardsServerConnectionMessage value)? putCards, - TResult Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult Function(ShuffleServerConnectionMessage value)? shuffle, - TResult Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - required TResult orElse(), - }) { - if (addSeat != null) { - return addSeat(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$AddSeatServerConnectionMessageImplToJson( - this, - ); - } -} - -abstract class AddSeatServerConnectionMessage - implements ServerConnectionMessage { - const factory AddSeatServerConnectionMessage(final String name) = - _$AddSeatServerConnectionMessageImpl; - - factory AddSeatServerConnectionMessage.fromJson(Map json) = - _$AddSeatServerConnectionMessageImpl.fromJson; - - String get name; - @JsonKey(ignore: true) - _$$AddSeatServerConnectionMessageImplCopyWith< - _$AddSeatServerConnectionMessageImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$AddCardsServerConnectionMessageImplCopyWith<$Res> { - factory _$$AddCardsServerConnectionMessageImplCopyWith( - _$AddCardsServerConnectionMessageImpl value, - $Res Function(_$AddCardsServerConnectionMessageImpl) then) = - __$$AddCardsServerConnectionMessageImplCopyWithImpl<$Res>; - @useResult - $Res call({List cards, int deckIndex, int? seatIndex}); -} - -/// @nodoc -class __$$AddCardsServerConnectionMessageImplCopyWithImpl<$Res> - extends _$ServerConnectionMessageCopyWithImpl<$Res, - _$AddCardsServerConnectionMessageImpl> - implements _$$AddCardsServerConnectionMessageImplCopyWith<$Res> { - __$$AddCardsServerConnectionMessageImplCopyWithImpl( - _$AddCardsServerConnectionMessageImpl _value, - $Res Function(_$AddCardsServerConnectionMessageImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? cards = null, - Object? deckIndex = null, - Object? seatIndex = freezed, - }) { - return _then(_$AddCardsServerConnectionMessageImpl( - null == cards - ? _value._cards - : cards // ignore: cast_nullable_to_non_nullable - as List, - null == deckIndex - ? _value.deckIndex - : deckIndex // ignore: cast_nullable_to_non_nullable - as int, - freezed == seatIndex - ? _value.seatIndex - : seatIndex // ignore: cast_nullable_to_non_nullable - as int?, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$AddCardsServerConnectionMessageImpl - implements AddCardsServerConnectionMessage { - const _$AddCardsServerConnectionMessageImpl( - final List cards, this.deckIndex, this.seatIndex, - {final String? $type}) - : _cards = cards, - $type = $type ?? 'addCards'; - - factory _$AddCardsServerConnectionMessageImpl.fromJson( - Map json) => - _$$AddCardsServerConnectionMessageImplFromJson(json); - - final List _cards; - @override - List get cards { - if (_cards is EqualUnmodifiableListView) return _cards; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_cards); - } - - @override - final int deckIndex; - @override - final int? seatIndex; - - @JsonKey(name: 'type') - final String $type; - - @override - String toString() { - return 'ServerConnectionMessage.addCards(cards: $cards, deckIndex: $deckIndex, seatIndex: $seatIndex)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$AddCardsServerConnectionMessageImpl && - const DeepCollectionEquality().equals(other._cards, _cards) && - (identical(other.deckIndex, deckIndex) || - other.deckIndex == deckIndex) && - (identical(other.seatIndex, seatIndex) || - other.seatIndex == seatIndex)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => Object.hash(runtimeType, - const DeepCollectionEquality().hash(_cards), deckIndex, seatIndex); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$AddCardsServerConnectionMessageImplCopyWith< - _$AddCardsServerConnectionMessageImpl> - get copyWith => __$$AddCardsServerConnectionMessageImplCopyWithImpl< - _$AddCardsServerConnectionMessageImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() fetchPlayers, - required TResult Function(String message) chatMessage, - required TResult Function(GameDeck deck, int? seatIndex) addDeck, - required TResult Function(int index, int? seatIndex) removeDeck, - required TResult Function(String name) addSeat, - required TResult Function( - List cards, int deckIndex, int? seatIndex) - addCards, - required TResult Function( - int deckIndex, - int? seatIndex, - PickLocation location, - int count, - int movedDeckIndex, - int? movedSeatIndex) - putCards, - required TResult Function(List cards) removeCards, - required TResult Function(int index) removeSeat, - required TResult Function(int index) joinSeat, - required TResult Function(int index) leaveSeat, - required TResult Function(int deckIndex, int? seatIndex) shuffle, - required TResult Function(int deckIndex, int? seatIndex, - DeckVisibility visibility, DeckVisibility? ownVisibility) - changeVisibility, - }) { - return addCards(cards, deckIndex, seatIndex); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? fetchPlayers, - TResult? Function(String message)? chatMessage, - TResult? Function(GameDeck deck, int? seatIndex)? addDeck, - TResult? Function(int index, int? seatIndex)? removeDeck, - TResult? Function(String name)? addSeat, - TResult? Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult? Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult? Function(List cards)? removeCards, - TResult? Function(int index)? removeSeat, - TResult? Function(int index)? joinSeat, - TResult? Function(int index)? leaveSeat, - TResult? Function(int deckIndex, int? seatIndex)? shuffle, - TResult? Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - }) { - return addCards?.call(cards, deckIndex, seatIndex); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? fetchPlayers, - TResult Function(String message)? chatMessage, - TResult Function(GameDeck deck, int? seatIndex)? addDeck, - TResult Function(int index, int? seatIndex)? removeDeck, - TResult Function(String name)? addSeat, - TResult Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult Function(List cards)? removeCards, - TResult Function(int index)? removeSeat, - TResult Function(int index)? joinSeat, - TResult Function(int index)? leaveSeat, - TResult Function(int deckIndex, int? seatIndex)? shuffle, - TResult Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - required TResult orElse(), - }) { - if (addCards != null) { - return addCards(cards, deckIndex, seatIndex); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(FetchPlayersServerConnectionMessage value) - fetchPlayers, - required TResult Function(ChatMessageServerConnectionMessage value) - chatMessage, - required TResult Function(AddDeckServerConnectionMessage value) addDeck, - required TResult Function(RemoveDeckServerConnectionMessage value) - removeDeck, - required TResult Function(AddSeatServerConnectionMessage value) addSeat, - required TResult Function(AddCardsServerConnectionMessage value) addCards, - required TResult Function(PutCardsServerConnectionMessage value) putCards, - required TResult Function(RemoveCardsServerConnectionMessage value) - removeCards, - required TResult Function(RemoveSeatServerConnectionMessage value) - removeSeat, - required TResult Function(JoinSeatServerConnectionMessage value) joinSeat, - required TResult Function(LeaveSeatServerConnectionMessage value) leaveSeat, - required TResult Function(ShuffleServerConnectionMessage value) shuffle, - required TResult Function(ChangeVisibilityServerConnectionMessage value) - changeVisibility, - }) { - return addCards(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult? Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult? Function(AddDeckServerConnectionMessage value)? addDeck, - TResult? Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult? Function(AddSeatServerConnectionMessage value)? addSeat, - TResult? Function(AddCardsServerConnectionMessage value)? addCards, - TResult? Function(PutCardsServerConnectionMessage value)? putCards, - TResult? Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult? Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult? Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult? Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult? Function(ShuffleServerConnectionMessage value)? shuffle, - TResult? Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - }) { - return addCards?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult Function(AddDeckServerConnectionMessage value)? addDeck, - TResult Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult Function(AddSeatServerConnectionMessage value)? addSeat, - TResult Function(AddCardsServerConnectionMessage value)? addCards, - TResult Function(PutCardsServerConnectionMessage value)? putCards, - TResult Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult Function(ShuffleServerConnectionMessage value)? shuffle, - TResult Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - required TResult orElse(), - }) { - if (addCards != null) { - return addCards(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$AddCardsServerConnectionMessageImplToJson( - this, - ); - } -} - -abstract class AddCardsServerConnectionMessage - implements ServerConnectionMessage { - const factory AddCardsServerConnectionMessage( - final List cards, - final int deckIndex, - final int? seatIndex) = _$AddCardsServerConnectionMessageImpl; - - factory AddCardsServerConnectionMessage.fromJson(Map json) = - _$AddCardsServerConnectionMessageImpl.fromJson; - - List get cards; - int get deckIndex; - int? get seatIndex; - @JsonKey(ignore: true) - _$$AddCardsServerConnectionMessageImplCopyWith< - _$AddCardsServerConnectionMessageImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$PutCardsServerConnectionMessageImplCopyWith<$Res> { - factory _$$PutCardsServerConnectionMessageImplCopyWith( - _$PutCardsServerConnectionMessageImpl value, - $Res Function(_$PutCardsServerConnectionMessageImpl) then) = - __$$PutCardsServerConnectionMessageImplCopyWithImpl<$Res>; - @useResult - $Res call( - {int deckIndex, - int? seatIndex, - PickLocation location, - int count, - int movedDeckIndex, - int? movedSeatIndex}); -} - -/// @nodoc -class __$$PutCardsServerConnectionMessageImplCopyWithImpl<$Res> - extends _$ServerConnectionMessageCopyWithImpl<$Res, - _$PutCardsServerConnectionMessageImpl> - implements _$$PutCardsServerConnectionMessageImplCopyWith<$Res> { - __$$PutCardsServerConnectionMessageImplCopyWithImpl( - _$PutCardsServerConnectionMessageImpl _value, - $Res Function(_$PutCardsServerConnectionMessageImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? deckIndex = null, - Object? seatIndex = freezed, - Object? location = null, - Object? count = null, - Object? movedDeckIndex = null, - Object? movedSeatIndex = freezed, - }) { - return _then(_$PutCardsServerConnectionMessageImpl( - null == deckIndex - ? _value.deckIndex - : deckIndex // ignore: cast_nullable_to_non_nullable - as int, - freezed == seatIndex - ? _value.seatIndex - : seatIndex // ignore: cast_nullable_to_non_nullable - as int?, - null == location - ? _value.location - : location // ignore: cast_nullable_to_non_nullable - as PickLocation, - null == count - ? _value.count - : count // ignore: cast_nullable_to_non_nullable - as int, - null == movedDeckIndex - ? _value.movedDeckIndex - : movedDeckIndex // ignore: cast_nullable_to_non_nullable - as int, - freezed == movedSeatIndex - ? _value.movedSeatIndex - : movedSeatIndex // ignore: cast_nullable_to_non_nullable - as int?, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$PutCardsServerConnectionMessageImpl - implements PutCardsServerConnectionMessage { - const _$PutCardsServerConnectionMessageImpl(this.deckIndex, this.seatIndex, - this.location, this.count, this.movedDeckIndex, this.movedSeatIndex, - {final String? $type}) - : $type = $type ?? 'putCards'; - - factory _$PutCardsServerConnectionMessageImpl.fromJson( - Map json) => - _$$PutCardsServerConnectionMessageImplFromJson(json); - - @override - final int deckIndex; - @override - final int? seatIndex; - @override - final PickLocation location; - @override - final int count; - @override - final int movedDeckIndex; - @override - final int? movedSeatIndex; - - @JsonKey(name: 'type') - final String $type; - - @override - String toString() { - return 'ServerConnectionMessage.putCards(deckIndex: $deckIndex, seatIndex: $seatIndex, location: $location, count: $count, movedDeckIndex: $movedDeckIndex, movedSeatIndex: $movedSeatIndex)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$PutCardsServerConnectionMessageImpl && - (identical(other.deckIndex, deckIndex) || - other.deckIndex == deckIndex) && - (identical(other.seatIndex, seatIndex) || - other.seatIndex == seatIndex) && - (identical(other.location, location) || - other.location == location) && - (identical(other.count, count) || other.count == count) && - (identical(other.movedDeckIndex, movedDeckIndex) || - other.movedDeckIndex == movedDeckIndex) && - (identical(other.movedSeatIndex, movedSeatIndex) || - other.movedSeatIndex == movedSeatIndex)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => Object.hash(runtimeType, deckIndex, seatIndex, location, - count, movedDeckIndex, movedSeatIndex); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$PutCardsServerConnectionMessageImplCopyWith< - _$PutCardsServerConnectionMessageImpl> - get copyWith => __$$PutCardsServerConnectionMessageImplCopyWithImpl< - _$PutCardsServerConnectionMessageImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() fetchPlayers, - required TResult Function(String message) chatMessage, - required TResult Function(GameDeck deck, int? seatIndex) addDeck, - required TResult Function(int index, int? seatIndex) removeDeck, - required TResult Function(String name) addSeat, - required TResult Function( - List cards, int deckIndex, int? seatIndex) - addCards, - required TResult Function( - int deckIndex, - int? seatIndex, - PickLocation location, - int count, - int movedDeckIndex, - int? movedSeatIndex) - putCards, - required TResult Function(List cards) removeCards, - required TResult Function(int index) removeSeat, - required TResult Function(int index) joinSeat, - required TResult Function(int index) leaveSeat, - required TResult Function(int deckIndex, int? seatIndex) shuffle, - required TResult Function(int deckIndex, int? seatIndex, - DeckVisibility visibility, DeckVisibility? ownVisibility) - changeVisibility, - }) { - return putCards( - deckIndex, seatIndex, location, count, movedDeckIndex, movedSeatIndex); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? fetchPlayers, - TResult? Function(String message)? chatMessage, - TResult? Function(GameDeck deck, int? seatIndex)? addDeck, - TResult? Function(int index, int? seatIndex)? removeDeck, - TResult? Function(String name)? addSeat, - TResult? Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult? Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult? Function(List cards)? removeCards, - TResult? Function(int index)? removeSeat, - TResult? Function(int index)? joinSeat, - TResult? Function(int index)? leaveSeat, - TResult? Function(int deckIndex, int? seatIndex)? shuffle, - TResult? Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - }) { - return putCards?.call( - deckIndex, seatIndex, location, count, movedDeckIndex, movedSeatIndex); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? fetchPlayers, - TResult Function(String message)? chatMessage, - TResult Function(GameDeck deck, int? seatIndex)? addDeck, - TResult Function(int index, int? seatIndex)? removeDeck, - TResult Function(String name)? addSeat, - TResult Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult Function(List cards)? removeCards, - TResult Function(int index)? removeSeat, - TResult Function(int index)? joinSeat, - TResult Function(int index)? leaveSeat, - TResult Function(int deckIndex, int? seatIndex)? shuffle, - TResult Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - required TResult orElse(), - }) { - if (putCards != null) { - return putCards(deckIndex, seatIndex, location, count, movedDeckIndex, - movedSeatIndex); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(FetchPlayersServerConnectionMessage value) - fetchPlayers, - required TResult Function(ChatMessageServerConnectionMessage value) - chatMessage, - required TResult Function(AddDeckServerConnectionMessage value) addDeck, - required TResult Function(RemoveDeckServerConnectionMessage value) - removeDeck, - required TResult Function(AddSeatServerConnectionMessage value) addSeat, - required TResult Function(AddCardsServerConnectionMessage value) addCards, - required TResult Function(PutCardsServerConnectionMessage value) putCards, - required TResult Function(RemoveCardsServerConnectionMessage value) - removeCards, - required TResult Function(RemoveSeatServerConnectionMessage value) - removeSeat, - required TResult Function(JoinSeatServerConnectionMessage value) joinSeat, - required TResult Function(LeaveSeatServerConnectionMessage value) leaveSeat, - required TResult Function(ShuffleServerConnectionMessage value) shuffle, - required TResult Function(ChangeVisibilityServerConnectionMessage value) - changeVisibility, - }) { - return putCards(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult? Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult? Function(AddDeckServerConnectionMessage value)? addDeck, - TResult? Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult? Function(AddSeatServerConnectionMessage value)? addSeat, - TResult? Function(AddCardsServerConnectionMessage value)? addCards, - TResult? Function(PutCardsServerConnectionMessage value)? putCards, - TResult? Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult? Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult? Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult? Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult? Function(ShuffleServerConnectionMessage value)? shuffle, - TResult? Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - }) { - return putCards?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult Function(AddDeckServerConnectionMessage value)? addDeck, - TResult Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult Function(AddSeatServerConnectionMessage value)? addSeat, - TResult Function(AddCardsServerConnectionMessage value)? addCards, - TResult Function(PutCardsServerConnectionMessage value)? putCards, - TResult Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult Function(ShuffleServerConnectionMessage value)? shuffle, - TResult Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - required TResult orElse(), - }) { - if (putCards != null) { - return putCards(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$PutCardsServerConnectionMessageImplToJson( - this, - ); - } -} - -abstract class PutCardsServerConnectionMessage - implements ServerConnectionMessage { - const factory PutCardsServerConnectionMessage( - final int deckIndex, - final int? seatIndex, - final PickLocation location, - final int count, - final int movedDeckIndex, - final int? movedSeatIndex) = _$PutCardsServerConnectionMessageImpl; - - factory PutCardsServerConnectionMessage.fromJson(Map json) = - _$PutCardsServerConnectionMessageImpl.fromJson; - - int get deckIndex; - int? get seatIndex; - PickLocation get location; - int get count; - int get movedDeckIndex; - int? get movedSeatIndex; - @JsonKey(ignore: true) - _$$PutCardsServerConnectionMessageImplCopyWith< - _$PutCardsServerConnectionMessageImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$RemoveCardsServerConnectionMessageImplCopyWith<$Res> { - factory _$$RemoveCardsServerConnectionMessageImplCopyWith( - _$RemoveCardsServerConnectionMessageImpl value, - $Res Function(_$RemoveCardsServerConnectionMessageImpl) then) = - __$$RemoveCardsServerConnectionMessageImplCopyWithImpl<$Res>; - @useResult - $Res call({List cards}); -} - -/// @nodoc -class __$$RemoveCardsServerConnectionMessageImplCopyWithImpl<$Res> - extends _$ServerConnectionMessageCopyWithImpl<$Res, - _$RemoveCardsServerConnectionMessageImpl> - implements _$$RemoveCardsServerConnectionMessageImplCopyWith<$Res> { - __$$RemoveCardsServerConnectionMessageImplCopyWithImpl( - _$RemoveCardsServerConnectionMessageImpl _value, - $Res Function(_$RemoveCardsServerConnectionMessageImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? cards = null, - }) { - return _then(_$RemoveCardsServerConnectionMessageImpl( - null == cards - ? _value._cards - : cards // ignore: cast_nullable_to_non_nullable - as List, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$RemoveCardsServerConnectionMessageImpl - implements RemoveCardsServerConnectionMessage { - const _$RemoveCardsServerConnectionMessageImpl(final List cards, - {final String? $type}) - : _cards = cards, - $type = $type ?? 'removeCards'; - - factory _$RemoveCardsServerConnectionMessageImpl.fromJson( - Map json) => - _$$RemoveCardsServerConnectionMessageImplFromJson(json); - - final List _cards; - @override - List get cards { - if (_cards is EqualUnmodifiableListView) return _cards; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_cards); - } - - @JsonKey(name: 'type') - final String $type; - - @override - String toString() { - return 'ServerConnectionMessage.removeCards(cards: $cards)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$RemoveCardsServerConnectionMessageImpl && - const DeepCollectionEquality().equals(other._cards, _cards)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => - Object.hash(runtimeType, const DeepCollectionEquality().hash(_cards)); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$RemoveCardsServerConnectionMessageImplCopyWith< - _$RemoveCardsServerConnectionMessageImpl> - get copyWith => __$$RemoveCardsServerConnectionMessageImplCopyWithImpl< - _$RemoveCardsServerConnectionMessageImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() fetchPlayers, - required TResult Function(String message) chatMessage, - required TResult Function(GameDeck deck, int? seatIndex) addDeck, - required TResult Function(int index, int? seatIndex) removeDeck, - required TResult Function(String name) addSeat, - required TResult Function( - List cards, int deckIndex, int? seatIndex) - addCards, - required TResult Function( - int deckIndex, - int? seatIndex, - PickLocation location, - int count, - int movedDeckIndex, - int? movedSeatIndex) - putCards, - required TResult Function(List cards) removeCards, - required TResult Function(int index) removeSeat, - required TResult Function(int index) joinSeat, - required TResult Function(int index) leaveSeat, - required TResult Function(int deckIndex, int? seatIndex) shuffle, - required TResult Function(int deckIndex, int? seatIndex, - DeckVisibility visibility, DeckVisibility? ownVisibility) - changeVisibility, - }) { - return removeCards(cards); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? fetchPlayers, - TResult? Function(String message)? chatMessage, - TResult? Function(GameDeck deck, int? seatIndex)? addDeck, - TResult? Function(int index, int? seatIndex)? removeDeck, - TResult? Function(String name)? addSeat, - TResult? Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult? Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult? Function(List cards)? removeCards, - TResult? Function(int index)? removeSeat, - TResult? Function(int index)? joinSeat, - TResult? Function(int index)? leaveSeat, - TResult? Function(int deckIndex, int? seatIndex)? shuffle, - TResult? Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - }) { - return removeCards?.call(cards); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? fetchPlayers, - TResult Function(String message)? chatMessage, - TResult Function(GameDeck deck, int? seatIndex)? addDeck, - TResult Function(int index, int? seatIndex)? removeDeck, - TResult Function(String name)? addSeat, - TResult Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult Function(List cards)? removeCards, - TResult Function(int index)? removeSeat, - TResult Function(int index)? joinSeat, - TResult Function(int index)? leaveSeat, - TResult Function(int deckIndex, int? seatIndex)? shuffle, - TResult Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - required TResult orElse(), - }) { - if (removeCards != null) { - return removeCards(cards); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(FetchPlayersServerConnectionMessage value) - fetchPlayers, - required TResult Function(ChatMessageServerConnectionMessage value) - chatMessage, - required TResult Function(AddDeckServerConnectionMessage value) addDeck, - required TResult Function(RemoveDeckServerConnectionMessage value) - removeDeck, - required TResult Function(AddSeatServerConnectionMessage value) addSeat, - required TResult Function(AddCardsServerConnectionMessage value) addCards, - required TResult Function(PutCardsServerConnectionMessage value) putCards, - required TResult Function(RemoveCardsServerConnectionMessage value) - removeCards, - required TResult Function(RemoveSeatServerConnectionMessage value) - removeSeat, - required TResult Function(JoinSeatServerConnectionMessage value) joinSeat, - required TResult Function(LeaveSeatServerConnectionMessage value) leaveSeat, - required TResult Function(ShuffleServerConnectionMessage value) shuffle, - required TResult Function(ChangeVisibilityServerConnectionMessage value) - changeVisibility, - }) { - return removeCards(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult? Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult? Function(AddDeckServerConnectionMessage value)? addDeck, - TResult? Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult? Function(AddSeatServerConnectionMessage value)? addSeat, - TResult? Function(AddCardsServerConnectionMessage value)? addCards, - TResult? Function(PutCardsServerConnectionMessage value)? putCards, - TResult? Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult? Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult? Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult? Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult? Function(ShuffleServerConnectionMessage value)? shuffle, - TResult? Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - }) { - return removeCards?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult Function(AddDeckServerConnectionMessage value)? addDeck, - TResult Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult Function(AddSeatServerConnectionMessage value)? addSeat, - TResult Function(AddCardsServerConnectionMessage value)? addCards, - TResult Function(PutCardsServerConnectionMessage value)? putCards, - TResult Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult Function(ShuffleServerConnectionMessage value)? shuffle, - TResult Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - required TResult orElse(), - }) { - if (removeCards != null) { - return removeCards(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$RemoveCardsServerConnectionMessageImplToJson( - this, - ); - } -} - -abstract class RemoveCardsServerConnectionMessage - implements ServerConnectionMessage { - const factory RemoveCardsServerConnectionMessage( - final List cards) = _$RemoveCardsServerConnectionMessageImpl; - - factory RemoveCardsServerConnectionMessage.fromJson( - Map json) = - _$RemoveCardsServerConnectionMessageImpl.fromJson; - - List get cards; - @JsonKey(ignore: true) - _$$RemoveCardsServerConnectionMessageImplCopyWith< - _$RemoveCardsServerConnectionMessageImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$RemoveSeatServerConnectionMessageImplCopyWith<$Res> { - factory _$$RemoveSeatServerConnectionMessageImplCopyWith( - _$RemoveSeatServerConnectionMessageImpl value, - $Res Function(_$RemoveSeatServerConnectionMessageImpl) then) = - __$$RemoveSeatServerConnectionMessageImplCopyWithImpl<$Res>; - @useResult - $Res call({int index}); -} - -/// @nodoc -class __$$RemoveSeatServerConnectionMessageImplCopyWithImpl<$Res> - extends _$ServerConnectionMessageCopyWithImpl<$Res, - _$RemoveSeatServerConnectionMessageImpl> - implements _$$RemoveSeatServerConnectionMessageImplCopyWith<$Res> { - __$$RemoveSeatServerConnectionMessageImplCopyWithImpl( - _$RemoveSeatServerConnectionMessageImpl _value, - $Res Function(_$RemoveSeatServerConnectionMessageImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? index = null, - }) { - return _then(_$RemoveSeatServerConnectionMessageImpl( - null == index - ? _value.index - : index // ignore: cast_nullable_to_non_nullable - as int, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$RemoveSeatServerConnectionMessageImpl - implements RemoveSeatServerConnectionMessage { - const _$RemoveSeatServerConnectionMessageImpl(this.index, - {final String? $type}) - : $type = $type ?? 'removeSeat'; - - factory _$RemoveSeatServerConnectionMessageImpl.fromJson( - Map json) => - _$$RemoveSeatServerConnectionMessageImplFromJson(json); - - @override - final int index; - - @JsonKey(name: 'type') - final String $type; - - @override - String toString() { - return 'ServerConnectionMessage.removeSeat(index: $index)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$RemoveSeatServerConnectionMessageImpl && - (identical(other.index, index) || other.index == index)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => Object.hash(runtimeType, index); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$RemoveSeatServerConnectionMessageImplCopyWith< - _$RemoveSeatServerConnectionMessageImpl> - get copyWith => __$$RemoveSeatServerConnectionMessageImplCopyWithImpl< - _$RemoveSeatServerConnectionMessageImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() fetchPlayers, - required TResult Function(String message) chatMessage, - required TResult Function(GameDeck deck, int? seatIndex) addDeck, - required TResult Function(int index, int? seatIndex) removeDeck, - required TResult Function(String name) addSeat, - required TResult Function( - List cards, int deckIndex, int? seatIndex) - addCards, - required TResult Function( - int deckIndex, - int? seatIndex, - PickLocation location, - int count, - int movedDeckIndex, - int? movedSeatIndex) - putCards, - required TResult Function(List cards) removeCards, - required TResult Function(int index) removeSeat, - required TResult Function(int index) joinSeat, - required TResult Function(int index) leaveSeat, - required TResult Function(int deckIndex, int? seatIndex) shuffle, - required TResult Function(int deckIndex, int? seatIndex, - DeckVisibility visibility, DeckVisibility? ownVisibility) - changeVisibility, - }) { - return removeSeat(index); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? fetchPlayers, - TResult? Function(String message)? chatMessage, - TResult? Function(GameDeck deck, int? seatIndex)? addDeck, - TResult? Function(int index, int? seatIndex)? removeDeck, - TResult? Function(String name)? addSeat, - TResult? Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult? Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult? Function(List cards)? removeCards, - TResult? Function(int index)? removeSeat, - TResult? Function(int index)? joinSeat, - TResult? Function(int index)? leaveSeat, - TResult? Function(int deckIndex, int? seatIndex)? shuffle, - TResult? Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - }) { - return removeSeat?.call(index); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? fetchPlayers, - TResult Function(String message)? chatMessage, - TResult Function(GameDeck deck, int? seatIndex)? addDeck, - TResult Function(int index, int? seatIndex)? removeDeck, - TResult Function(String name)? addSeat, - TResult Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult Function(List cards)? removeCards, - TResult Function(int index)? removeSeat, - TResult Function(int index)? joinSeat, - TResult Function(int index)? leaveSeat, - TResult Function(int deckIndex, int? seatIndex)? shuffle, - TResult Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - required TResult orElse(), - }) { - if (removeSeat != null) { - return removeSeat(index); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(FetchPlayersServerConnectionMessage value) - fetchPlayers, - required TResult Function(ChatMessageServerConnectionMessage value) - chatMessage, - required TResult Function(AddDeckServerConnectionMessage value) addDeck, - required TResult Function(RemoveDeckServerConnectionMessage value) - removeDeck, - required TResult Function(AddSeatServerConnectionMessage value) addSeat, - required TResult Function(AddCardsServerConnectionMessage value) addCards, - required TResult Function(PutCardsServerConnectionMessage value) putCards, - required TResult Function(RemoveCardsServerConnectionMessage value) - removeCards, - required TResult Function(RemoveSeatServerConnectionMessage value) - removeSeat, - required TResult Function(JoinSeatServerConnectionMessage value) joinSeat, - required TResult Function(LeaveSeatServerConnectionMessage value) leaveSeat, - required TResult Function(ShuffleServerConnectionMessage value) shuffle, - required TResult Function(ChangeVisibilityServerConnectionMessage value) - changeVisibility, - }) { - return removeSeat(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult? Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult? Function(AddDeckServerConnectionMessage value)? addDeck, - TResult? Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult? Function(AddSeatServerConnectionMessage value)? addSeat, - TResult? Function(AddCardsServerConnectionMessage value)? addCards, - TResult? Function(PutCardsServerConnectionMessage value)? putCards, - TResult? Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult? Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult? Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult? Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult? Function(ShuffleServerConnectionMessage value)? shuffle, - TResult? Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - }) { - return removeSeat?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult Function(AddDeckServerConnectionMessage value)? addDeck, - TResult Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult Function(AddSeatServerConnectionMessage value)? addSeat, - TResult Function(AddCardsServerConnectionMessage value)? addCards, - TResult Function(PutCardsServerConnectionMessage value)? putCards, - TResult Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult Function(ShuffleServerConnectionMessage value)? shuffle, - TResult Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - required TResult orElse(), - }) { - if (removeSeat != null) { - return removeSeat(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$RemoveSeatServerConnectionMessageImplToJson( - this, - ); - } -} - -abstract class RemoveSeatServerConnectionMessage - implements ServerConnectionMessage { - const factory RemoveSeatServerConnectionMessage(final int index) = - _$RemoveSeatServerConnectionMessageImpl; - - factory RemoveSeatServerConnectionMessage.fromJson( - Map json) = - _$RemoveSeatServerConnectionMessageImpl.fromJson; - - int get index; - @JsonKey(ignore: true) - _$$RemoveSeatServerConnectionMessageImplCopyWith< - _$RemoveSeatServerConnectionMessageImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$JoinSeatServerConnectionMessageImplCopyWith<$Res> { - factory _$$JoinSeatServerConnectionMessageImplCopyWith( - _$JoinSeatServerConnectionMessageImpl value, - $Res Function(_$JoinSeatServerConnectionMessageImpl) then) = - __$$JoinSeatServerConnectionMessageImplCopyWithImpl<$Res>; - @useResult - $Res call({int index}); -} - -/// @nodoc -class __$$JoinSeatServerConnectionMessageImplCopyWithImpl<$Res> - extends _$ServerConnectionMessageCopyWithImpl<$Res, - _$JoinSeatServerConnectionMessageImpl> - implements _$$JoinSeatServerConnectionMessageImplCopyWith<$Res> { - __$$JoinSeatServerConnectionMessageImplCopyWithImpl( - _$JoinSeatServerConnectionMessageImpl _value, - $Res Function(_$JoinSeatServerConnectionMessageImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? index = null, - }) { - return _then(_$JoinSeatServerConnectionMessageImpl( - null == index - ? _value.index - : index // ignore: cast_nullable_to_non_nullable - as int, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$JoinSeatServerConnectionMessageImpl - implements JoinSeatServerConnectionMessage { - const _$JoinSeatServerConnectionMessageImpl(this.index, {final String? $type}) - : $type = $type ?? 'joinSeat'; - - factory _$JoinSeatServerConnectionMessageImpl.fromJson( - Map json) => - _$$JoinSeatServerConnectionMessageImplFromJson(json); - - @override - final int index; - - @JsonKey(name: 'type') - final String $type; - - @override - String toString() { - return 'ServerConnectionMessage.joinSeat(index: $index)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$JoinSeatServerConnectionMessageImpl && - (identical(other.index, index) || other.index == index)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => Object.hash(runtimeType, index); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$JoinSeatServerConnectionMessageImplCopyWith< - _$JoinSeatServerConnectionMessageImpl> - get copyWith => __$$JoinSeatServerConnectionMessageImplCopyWithImpl< - _$JoinSeatServerConnectionMessageImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() fetchPlayers, - required TResult Function(String message) chatMessage, - required TResult Function(GameDeck deck, int? seatIndex) addDeck, - required TResult Function(int index, int? seatIndex) removeDeck, - required TResult Function(String name) addSeat, - required TResult Function( - List cards, int deckIndex, int? seatIndex) - addCards, - required TResult Function( - int deckIndex, - int? seatIndex, - PickLocation location, - int count, - int movedDeckIndex, - int? movedSeatIndex) - putCards, - required TResult Function(List cards) removeCards, - required TResult Function(int index) removeSeat, - required TResult Function(int index) joinSeat, - required TResult Function(int index) leaveSeat, - required TResult Function(int deckIndex, int? seatIndex) shuffle, - required TResult Function(int deckIndex, int? seatIndex, - DeckVisibility visibility, DeckVisibility? ownVisibility) - changeVisibility, - }) { - return joinSeat(index); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? fetchPlayers, - TResult? Function(String message)? chatMessage, - TResult? Function(GameDeck deck, int? seatIndex)? addDeck, - TResult? Function(int index, int? seatIndex)? removeDeck, - TResult? Function(String name)? addSeat, - TResult? Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult? Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult? Function(List cards)? removeCards, - TResult? Function(int index)? removeSeat, - TResult? Function(int index)? joinSeat, - TResult? Function(int index)? leaveSeat, - TResult? Function(int deckIndex, int? seatIndex)? shuffle, - TResult? Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - }) { - return joinSeat?.call(index); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? fetchPlayers, - TResult Function(String message)? chatMessage, - TResult Function(GameDeck deck, int? seatIndex)? addDeck, - TResult Function(int index, int? seatIndex)? removeDeck, - TResult Function(String name)? addSeat, - TResult Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult Function(List cards)? removeCards, - TResult Function(int index)? removeSeat, - TResult Function(int index)? joinSeat, - TResult Function(int index)? leaveSeat, - TResult Function(int deckIndex, int? seatIndex)? shuffle, - TResult Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - required TResult orElse(), - }) { - if (joinSeat != null) { - return joinSeat(index); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(FetchPlayersServerConnectionMessage value) - fetchPlayers, - required TResult Function(ChatMessageServerConnectionMessage value) - chatMessage, - required TResult Function(AddDeckServerConnectionMessage value) addDeck, - required TResult Function(RemoveDeckServerConnectionMessage value) - removeDeck, - required TResult Function(AddSeatServerConnectionMessage value) addSeat, - required TResult Function(AddCardsServerConnectionMessage value) addCards, - required TResult Function(PutCardsServerConnectionMessage value) putCards, - required TResult Function(RemoveCardsServerConnectionMessage value) - removeCards, - required TResult Function(RemoveSeatServerConnectionMessage value) - removeSeat, - required TResult Function(JoinSeatServerConnectionMessage value) joinSeat, - required TResult Function(LeaveSeatServerConnectionMessage value) leaveSeat, - required TResult Function(ShuffleServerConnectionMessage value) shuffle, - required TResult Function(ChangeVisibilityServerConnectionMessage value) - changeVisibility, - }) { - return joinSeat(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult? Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult? Function(AddDeckServerConnectionMessage value)? addDeck, - TResult? Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult? Function(AddSeatServerConnectionMessage value)? addSeat, - TResult? Function(AddCardsServerConnectionMessage value)? addCards, - TResult? Function(PutCardsServerConnectionMessage value)? putCards, - TResult? Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult? Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult? Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult? Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult? Function(ShuffleServerConnectionMessage value)? shuffle, - TResult? Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - }) { - return joinSeat?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult Function(AddDeckServerConnectionMessage value)? addDeck, - TResult Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult Function(AddSeatServerConnectionMessage value)? addSeat, - TResult Function(AddCardsServerConnectionMessage value)? addCards, - TResult Function(PutCardsServerConnectionMessage value)? putCards, - TResult Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult Function(ShuffleServerConnectionMessage value)? shuffle, - TResult Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - required TResult orElse(), - }) { - if (joinSeat != null) { - return joinSeat(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$JoinSeatServerConnectionMessageImplToJson( - this, - ); - } -} - -abstract class JoinSeatServerConnectionMessage - implements ServerConnectionMessage { - const factory JoinSeatServerConnectionMessage(final int index) = - _$JoinSeatServerConnectionMessageImpl; - - factory JoinSeatServerConnectionMessage.fromJson(Map json) = - _$JoinSeatServerConnectionMessageImpl.fromJson; - - int get index; - @JsonKey(ignore: true) - _$$JoinSeatServerConnectionMessageImplCopyWith< - _$JoinSeatServerConnectionMessageImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$LeaveSeatServerConnectionMessageImplCopyWith<$Res> { - factory _$$LeaveSeatServerConnectionMessageImplCopyWith( - _$LeaveSeatServerConnectionMessageImpl value, - $Res Function(_$LeaveSeatServerConnectionMessageImpl) then) = - __$$LeaveSeatServerConnectionMessageImplCopyWithImpl<$Res>; - @useResult - $Res call({int index}); -} - -/// @nodoc -class __$$LeaveSeatServerConnectionMessageImplCopyWithImpl<$Res> - extends _$ServerConnectionMessageCopyWithImpl<$Res, - _$LeaveSeatServerConnectionMessageImpl> - implements _$$LeaveSeatServerConnectionMessageImplCopyWith<$Res> { - __$$LeaveSeatServerConnectionMessageImplCopyWithImpl( - _$LeaveSeatServerConnectionMessageImpl _value, - $Res Function(_$LeaveSeatServerConnectionMessageImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? index = null, - }) { - return _then(_$LeaveSeatServerConnectionMessageImpl( - null == index - ? _value.index - : index // ignore: cast_nullable_to_non_nullable - as int, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$LeaveSeatServerConnectionMessageImpl - implements LeaveSeatServerConnectionMessage { - const _$LeaveSeatServerConnectionMessageImpl(this.index, - {final String? $type}) - : $type = $type ?? 'leaveSeat'; - - factory _$LeaveSeatServerConnectionMessageImpl.fromJson( - Map json) => - _$$LeaveSeatServerConnectionMessageImplFromJson(json); - - @override - final int index; - - @JsonKey(name: 'type') - final String $type; - - @override - String toString() { - return 'ServerConnectionMessage.leaveSeat(index: $index)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$LeaveSeatServerConnectionMessageImpl && - (identical(other.index, index) || other.index == index)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => Object.hash(runtimeType, index); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$LeaveSeatServerConnectionMessageImplCopyWith< - _$LeaveSeatServerConnectionMessageImpl> - get copyWith => __$$LeaveSeatServerConnectionMessageImplCopyWithImpl< - _$LeaveSeatServerConnectionMessageImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() fetchPlayers, - required TResult Function(String message) chatMessage, - required TResult Function(GameDeck deck, int? seatIndex) addDeck, - required TResult Function(int index, int? seatIndex) removeDeck, - required TResult Function(String name) addSeat, - required TResult Function( - List cards, int deckIndex, int? seatIndex) - addCards, - required TResult Function( - int deckIndex, - int? seatIndex, - PickLocation location, - int count, - int movedDeckIndex, - int? movedSeatIndex) - putCards, - required TResult Function(List cards) removeCards, - required TResult Function(int index) removeSeat, - required TResult Function(int index) joinSeat, - required TResult Function(int index) leaveSeat, - required TResult Function(int deckIndex, int? seatIndex) shuffle, - required TResult Function(int deckIndex, int? seatIndex, - DeckVisibility visibility, DeckVisibility? ownVisibility) - changeVisibility, - }) { - return leaveSeat(index); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? fetchPlayers, - TResult? Function(String message)? chatMessage, - TResult? Function(GameDeck deck, int? seatIndex)? addDeck, - TResult? Function(int index, int? seatIndex)? removeDeck, - TResult? Function(String name)? addSeat, - TResult? Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult? Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult? Function(List cards)? removeCards, - TResult? Function(int index)? removeSeat, - TResult? Function(int index)? joinSeat, - TResult? Function(int index)? leaveSeat, - TResult? Function(int deckIndex, int? seatIndex)? shuffle, - TResult? Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - }) { - return leaveSeat?.call(index); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? fetchPlayers, - TResult Function(String message)? chatMessage, - TResult Function(GameDeck deck, int? seatIndex)? addDeck, - TResult Function(int index, int? seatIndex)? removeDeck, - TResult Function(String name)? addSeat, - TResult Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult Function(List cards)? removeCards, - TResult Function(int index)? removeSeat, - TResult Function(int index)? joinSeat, - TResult Function(int index)? leaveSeat, - TResult Function(int deckIndex, int? seatIndex)? shuffle, - TResult Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - required TResult orElse(), - }) { - if (leaveSeat != null) { - return leaveSeat(index); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(FetchPlayersServerConnectionMessage value) - fetchPlayers, - required TResult Function(ChatMessageServerConnectionMessage value) - chatMessage, - required TResult Function(AddDeckServerConnectionMessage value) addDeck, - required TResult Function(RemoveDeckServerConnectionMessage value) - removeDeck, - required TResult Function(AddSeatServerConnectionMessage value) addSeat, - required TResult Function(AddCardsServerConnectionMessage value) addCards, - required TResult Function(PutCardsServerConnectionMessage value) putCards, - required TResult Function(RemoveCardsServerConnectionMessage value) - removeCards, - required TResult Function(RemoveSeatServerConnectionMessage value) - removeSeat, - required TResult Function(JoinSeatServerConnectionMessage value) joinSeat, - required TResult Function(LeaveSeatServerConnectionMessage value) leaveSeat, - required TResult Function(ShuffleServerConnectionMessage value) shuffle, - required TResult Function(ChangeVisibilityServerConnectionMessage value) - changeVisibility, - }) { - return leaveSeat(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult? Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult? Function(AddDeckServerConnectionMessage value)? addDeck, - TResult? Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult? Function(AddSeatServerConnectionMessage value)? addSeat, - TResult? Function(AddCardsServerConnectionMessage value)? addCards, - TResult? Function(PutCardsServerConnectionMessage value)? putCards, - TResult? Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult? Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult? Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult? Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult? Function(ShuffleServerConnectionMessage value)? shuffle, - TResult? Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - }) { - return leaveSeat?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult Function(AddDeckServerConnectionMessage value)? addDeck, - TResult Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult Function(AddSeatServerConnectionMessage value)? addSeat, - TResult Function(AddCardsServerConnectionMessage value)? addCards, - TResult Function(PutCardsServerConnectionMessage value)? putCards, - TResult Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult Function(ShuffleServerConnectionMessage value)? shuffle, - TResult Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - required TResult orElse(), - }) { - if (leaveSeat != null) { - return leaveSeat(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$LeaveSeatServerConnectionMessageImplToJson( - this, - ); - } -} - -abstract class LeaveSeatServerConnectionMessage - implements ServerConnectionMessage { - const factory LeaveSeatServerConnectionMessage(final int index) = - _$LeaveSeatServerConnectionMessageImpl; - - factory LeaveSeatServerConnectionMessage.fromJson(Map json) = - _$LeaveSeatServerConnectionMessageImpl.fromJson; - - int get index; - @JsonKey(ignore: true) - _$$LeaveSeatServerConnectionMessageImplCopyWith< - _$LeaveSeatServerConnectionMessageImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$ShuffleServerConnectionMessageImplCopyWith<$Res> { - factory _$$ShuffleServerConnectionMessageImplCopyWith( - _$ShuffleServerConnectionMessageImpl value, - $Res Function(_$ShuffleServerConnectionMessageImpl) then) = - __$$ShuffleServerConnectionMessageImplCopyWithImpl<$Res>; - @useResult - $Res call({int deckIndex, int? seatIndex}); -} - -/// @nodoc -class __$$ShuffleServerConnectionMessageImplCopyWithImpl<$Res> - extends _$ServerConnectionMessageCopyWithImpl<$Res, - _$ShuffleServerConnectionMessageImpl> - implements _$$ShuffleServerConnectionMessageImplCopyWith<$Res> { - __$$ShuffleServerConnectionMessageImplCopyWithImpl( - _$ShuffleServerConnectionMessageImpl _value, - $Res Function(_$ShuffleServerConnectionMessageImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? deckIndex = null, - Object? seatIndex = freezed, - }) { - return _then(_$ShuffleServerConnectionMessageImpl( - null == deckIndex - ? _value.deckIndex - : deckIndex // ignore: cast_nullable_to_non_nullable - as int, - freezed == seatIndex - ? _value.seatIndex - : seatIndex // ignore: cast_nullable_to_non_nullable - as int?, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$ShuffleServerConnectionMessageImpl - implements ShuffleServerConnectionMessage { - const _$ShuffleServerConnectionMessageImpl(this.deckIndex, this.seatIndex, - {final String? $type}) - : $type = $type ?? 'shuffle'; - - factory _$ShuffleServerConnectionMessageImpl.fromJson( - Map json) => - _$$ShuffleServerConnectionMessageImplFromJson(json); - - @override - final int deckIndex; - @override - final int? seatIndex; - - @JsonKey(name: 'type') - final String $type; - - @override - String toString() { - return 'ServerConnectionMessage.shuffle(deckIndex: $deckIndex, seatIndex: $seatIndex)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$ShuffleServerConnectionMessageImpl && - (identical(other.deckIndex, deckIndex) || - other.deckIndex == deckIndex) && - (identical(other.seatIndex, seatIndex) || - other.seatIndex == seatIndex)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => Object.hash(runtimeType, deckIndex, seatIndex); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$ShuffleServerConnectionMessageImplCopyWith< - _$ShuffleServerConnectionMessageImpl> - get copyWith => __$$ShuffleServerConnectionMessageImplCopyWithImpl< - _$ShuffleServerConnectionMessageImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() fetchPlayers, - required TResult Function(String message) chatMessage, - required TResult Function(GameDeck deck, int? seatIndex) addDeck, - required TResult Function(int index, int? seatIndex) removeDeck, - required TResult Function(String name) addSeat, - required TResult Function( - List cards, int deckIndex, int? seatIndex) - addCards, - required TResult Function( - int deckIndex, - int? seatIndex, - PickLocation location, - int count, - int movedDeckIndex, - int? movedSeatIndex) - putCards, - required TResult Function(List cards) removeCards, - required TResult Function(int index) removeSeat, - required TResult Function(int index) joinSeat, - required TResult Function(int index) leaveSeat, - required TResult Function(int deckIndex, int? seatIndex) shuffle, - required TResult Function(int deckIndex, int? seatIndex, - DeckVisibility visibility, DeckVisibility? ownVisibility) - changeVisibility, - }) { - return shuffle(deckIndex, seatIndex); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? fetchPlayers, - TResult? Function(String message)? chatMessage, - TResult? Function(GameDeck deck, int? seatIndex)? addDeck, - TResult? Function(int index, int? seatIndex)? removeDeck, - TResult? Function(String name)? addSeat, - TResult? Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult? Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult? Function(List cards)? removeCards, - TResult? Function(int index)? removeSeat, - TResult? Function(int index)? joinSeat, - TResult? Function(int index)? leaveSeat, - TResult? Function(int deckIndex, int? seatIndex)? shuffle, - TResult? Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - }) { - return shuffle?.call(deckIndex, seatIndex); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? fetchPlayers, - TResult Function(String message)? chatMessage, - TResult Function(GameDeck deck, int? seatIndex)? addDeck, - TResult Function(int index, int? seatIndex)? removeDeck, - TResult Function(String name)? addSeat, - TResult Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult Function(List cards)? removeCards, - TResult Function(int index)? removeSeat, - TResult Function(int index)? joinSeat, - TResult Function(int index)? leaveSeat, - TResult Function(int deckIndex, int? seatIndex)? shuffle, - TResult Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - required TResult orElse(), - }) { - if (shuffle != null) { - return shuffle(deckIndex, seatIndex); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(FetchPlayersServerConnectionMessage value) - fetchPlayers, - required TResult Function(ChatMessageServerConnectionMessage value) - chatMessage, - required TResult Function(AddDeckServerConnectionMessage value) addDeck, - required TResult Function(RemoveDeckServerConnectionMessage value) - removeDeck, - required TResult Function(AddSeatServerConnectionMessage value) addSeat, - required TResult Function(AddCardsServerConnectionMessage value) addCards, - required TResult Function(PutCardsServerConnectionMessage value) putCards, - required TResult Function(RemoveCardsServerConnectionMessage value) - removeCards, - required TResult Function(RemoveSeatServerConnectionMessage value) - removeSeat, - required TResult Function(JoinSeatServerConnectionMessage value) joinSeat, - required TResult Function(LeaveSeatServerConnectionMessage value) leaveSeat, - required TResult Function(ShuffleServerConnectionMessage value) shuffle, - required TResult Function(ChangeVisibilityServerConnectionMessage value) - changeVisibility, - }) { - return shuffle(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult? Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult? Function(AddDeckServerConnectionMessage value)? addDeck, - TResult? Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult? Function(AddSeatServerConnectionMessage value)? addSeat, - TResult? Function(AddCardsServerConnectionMessage value)? addCards, - TResult? Function(PutCardsServerConnectionMessage value)? putCards, - TResult? Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult? Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult? Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult? Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult? Function(ShuffleServerConnectionMessage value)? shuffle, - TResult? Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - }) { - return shuffle?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult Function(AddDeckServerConnectionMessage value)? addDeck, - TResult Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult Function(AddSeatServerConnectionMessage value)? addSeat, - TResult Function(AddCardsServerConnectionMessage value)? addCards, - TResult Function(PutCardsServerConnectionMessage value)? putCards, - TResult Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult Function(ShuffleServerConnectionMessage value)? shuffle, - TResult Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - required TResult orElse(), - }) { - if (shuffle != null) { - return shuffle(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$ShuffleServerConnectionMessageImplToJson( - this, - ); - } -} - -abstract class ShuffleServerConnectionMessage - implements ServerConnectionMessage { - const factory ShuffleServerConnectionMessage( - final int deckIndex, final int? seatIndex) = - _$ShuffleServerConnectionMessageImpl; - - factory ShuffleServerConnectionMessage.fromJson(Map json) = - _$ShuffleServerConnectionMessageImpl.fromJson; - - int get deckIndex; - int? get seatIndex; - @JsonKey(ignore: true) - _$$ShuffleServerConnectionMessageImplCopyWith< - _$ShuffleServerConnectionMessageImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$ChangeVisibilityServerConnectionMessageImplCopyWith<$Res> { - factory _$$ChangeVisibilityServerConnectionMessageImplCopyWith( - _$ChangeVisibilityServerConnectionMessageImpl value, - $Res Function(_$ChangeVisibilityServerConnectionMessageImpl) then) = - __$$ChangeVisibilityServerConnectionMessageImplCopyWithImpl<$Res>; - @useResult - $Res call( - {int deckIndex, - int? seatIndex, - DeckVisibility visibility, - DeckVisibility? ownVisibility}); -} - -/// @nodoc -class __$$ChangeVisibilityServerConnectionMessageImplCopyWithImpl<$Res> - extends _$ServerConnectionMessageCopyWithImpl<$Res, - _$ChangeVisibilityServerConnectionMessageImpl> - implements _$$ChangeVisibilityServerConnectionMessageImplCopyWith<$Res> { - __$$ChangeVisibilityServerConnectionMessageImplCopyWithImpl( - _$ChangeVisibilityServerConnectionMessageImpl _value, - $Res Function(_$ChangeVisibilityServerConnectionMessageImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? deckIndex = null, - Object? seatIndex = freezed, - Object? visibility = null, - Object? ownVisibility = freezed, - }) { - return _then(_$ChangeVisibilityServerConnectionMessageImpl( - null == deckIndex - ? _value.deckIndex - : deckIndex // ignore: cast_nullable_to_non_nullable - as int, - freezed == seatIndex - ? _value.seatIndex - : seatIndex // ignore: cast_nullable_to_non_nullable - as int?, - null == visibility - ? _value.visibility - : visibility // ignore: cast_nullable_to_non_nullable - as DeckVisibility, - freezed == ownVisibility - ? _value.ownVisibility - : ownVisibility // ignore: cast_nullable_to_non_nullable - as DeckVisibility?, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$ChangeVisibilityServerConnectionMessageImpl - implements ChangeVisibilityServerConnectionMessage { - const _$ChangeVisibilityServerConnectionMessageImpl( - this.deckIndex, this.seatIndex, this.visibility, - [this.ownVisibility, final String? $type]) - : $type = $type ?? 'changeVisibility'; - - factory _$ChangeVisibilityServerConnectionMessageImpl.fromJson( - Map json) => - _$$ChangeVisibilityServerConnectionMessageImplFromJson(json); - - @override - final int deckIndex; - @override - final int? seatIndex; - @override - final DeckVisibility visibility; - @override - final DeckVisibility? ownVisibility; - - @JsonKey(name: 'type') - final String $type; - - @override - String toString() { - return 'ServerConnectionMessage.changeVisibility(deckIndex: $deckIndex, seatIndex: $seatIndex, visibility: $visibility, ownVisibility: $ownVisibility)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$ChangeVisibilityServerConnectionMessageImpl && - (identical(other.deckIndex, deckIndex) || - other.deckIndex == deckIndex) && - (identical(other.seatIndex, seatIndex) || - other.seatIndex == seatIndex) && - (identical(other.visibility, visibility) || - other.visibility == visibility) && - (identical(other.ownVisibility, ownVisibility) || - other.ownVisibility == ownVisibility)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => - Object.hash(runtimeType, deckIndex, seatIndex, visibility, ownVisibility); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$ChangeVisibilityServerConnectionMessageImplCopyWith< - _$ChangeVisibilityServerConnectionMessageImpl> - get copyWith => - __$$ChangeVisibilityServerConnectionMessageImplCopyWithImpl< - _$ChangeVisibilityServerConnectionMessageImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() fetchPlayers, - required TResult Function(String message) chatMessage, - required TResult Function(GameDeck deck, int? seatIndex) addDeck, - required TResult Function(int index, int? seatIndex) removeDeck, - required TResult Function(String name) addSeat, - required TResult Function( - List cards, int deckIndex, int? seatIndex) - addCards, - required TResult Function( - int deckIndex, - int? seatIndex, - PickLocation location, - int count, - int movedDeckIndex, - int? movedSeatIndex) - putCards, - required TResult Function(List cards) removeCards, - required TResult Function(int index) removeSeat, - required TResult Function(int index) joinSeat, - required TResult Function(int index) leaveSeat, - required TResult Function(int deckIndex, int? seatIndex) shuffle, - required TResult Function(int deckIndex, int? seatIndex, - DeckVisibility visibility, DeckVisibility? ownVisibility) - changeVisibility, - }) { - return changeVisibility(deckIndex, seatIndex, visibility, ownVisibility); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? fetchPlayers, - TResult? Function(String message)? chatMessage, - TResult? Function(GameDeck deck, int? seatIndex)? addDeck, - TResult? Function(int index, int? seatIndex)? removeDeck, - TResult? Function(String name)? addSeat, - TResult? Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult? Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult? Function(List cards)? removeCards, - TResult? Function(int index)? removeSeat, - TResult? Function(int index)? joinSeat, - TResult? Function(int index)? leaveSeat, - TResult? Function(int deckIndex, int? seatIndex)? shuffle, - TResult? Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - }) { - return changeVisibility?.call( - deckIndex, seatIndex, visibility, ownVisibility); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? fetchPlayers, - TResult Function(String message)? chatMessage, - TResult Function(GameDeck deck, int? seatIndex)? addDeck, - TResult Function(int index, int? seatIndex)? removeDeck, - TResult Function(String name)? addSeat, - TResult Function(List cards, int deckIndex, int? seatIndex)? - addCards, - TResult Function(int deckIndex, int? seatIndex, PickLocation location, - int count, int movedDeckIndex, int? movedSeatIndex)? - putCards, - TResult Function(List cards)? removeCards, - TResult Function(int index)? removeSeat, - TResult Function(int index)? joinSeat, - TResult Function(int index)? leaveSeat, - TResult Function(int deckIndex, int? seatIndex)? shuffle, - TResult Function(int deckIndex, int? seatIndex, DeckVisibility visibility, - DeckVisibility? ownVisibility)? - changeVisibility, - required TResult orElse(), - }) { - if (changeVisibility != null) { - return changeVisibility(deckIndex, seatIndex, visibility, ownVisibility); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(FetchPlayersServerConnectionMessage value) - fetchPlayers, - required TResult Function(ChatMessageServerConnectionMessage value) - chatMessage, - required TResult Function(AddDeckServerConnectionMessage value) addDeck, - required TResult Function(RemoveDeckServerConnectionMessage value) - removeDeck, - required TResult Function(AddSeatServerConnectionMessage value) addSeat, - required TResult Function(AddCardsServerConnectionMessage value) addCards, - required TResult Function(PutCardsServerConnectionMessage value) putCards, - required TResult Function(RemoveCardsServerConnectionMessage value) - removeCards, - required TResult Function(RemoveSeatServerConnectionMessage value) - removeSeat, - required TResult Function(JoinSeatServerConnectionMessage value) joinSeat, - required TResult Function(LeaveSeatServerConnectionMessage value) leaveSeat, - required TResult Function(ShuffleServerConnectionMessage value) shuffle, - required TResult Function(ChangeVisibilityServerConnectionMessage value) - changeVisibility, - }) { - return changeVisibility(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult? Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult? Function(AddDeckServerConnectionMessage value)? addDeck, - TResult? Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult? Function(AddSeatServerConnectionMessage value)? addSeat, - TResult? Function(AddCardsServerConnectionMessage value)? addCards, - TResult? Function(PutCardsServerConnectionMessage value)? putCards, - TResult? Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult? Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult? Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult? Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult? Function(ShuffleServerConnectionMessage value)? shuffle, - TResult? Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - }) { - return changeVisibility?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FetchPlayersServerConnectionMessage value)? fetchPlayers, - TResult Function(ChatMessageServerConnectionMessage value)? chatMessage, - TResult Function(AddDeckServerConnectionMessage value)? addDeck, - TResult Function(RemoveDeckServerConnectionMessage value)? removeDeck, - TResult Function(AddSeatServerConnectionMessage value)? addSeat, - TResult Function(AddCardsServerConnectionMessage value)? addCards, - TResult Function(PutCardsServerConnectionMessage value)? putCards, - TResult Function(RemoveCardsServerConnectionMessage value)? removeCards, - TResult Function(RemoveSeatServerConnectionMessage value)? removeSeat, - TResult Function(JoinSeatServerConnectionMessage value)? joinSeat, - TResult Function(LeaveSeatServerConnectionMessage value)? leaveSeat, - TResult Function(ShuffleServerConnectionMessage value)? shuffle, - TResult Function(ChangeVisibilityServerConnectionMessage value)? - changeVisibility, - required TResult orElse(), - }) { - if (changeVisibility != null) { - return changeVisibility(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$ChangeVisibilityServerConnectionMessageImplToJson( - this, - ); - } -} - -abstract class ChangeVisibilityServerConnectionMessage - implements ServerConnectionMessage { - const factory ChangeVisibilityServerConnectionMessage(final int deckIndex, - final int? seatIndex, final DeckVisibility visibility, - [final DeckVisibility? ownVisibility]) = - _$ChangeVisibilityServerConnectionMessageImpl; - - factory ChangeVisibilityServerConnectionMessage.fromJson( - Map json) = - _$ChangeVisibilityServerConnectionMessageImpl.fromJson; - - int get deckIndex; - int? get seatIndex; - DeckVisibility get visibility; - DeckVisibility? get ownVisibility; - @JsonKey(ignore: true) - _$$ChangeVisibilityServerConnectionMessageImplCopyWith< - _$ChangeVisibilityServerConnectionMessageImpl> - get copyWith => throw _privateConstructorUsedError; -} diff --git a/app/lib/logic/connection/server.g.dart b/app/lib/logic/connection/server.g.dart deleted file mode 100644 index 662261f..0000000 --- a/app/lib/logic/connection/server.g.dart +++ /dev/null @@ -1,231 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'server.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -_$FetchPlayersServerConnectionMessageImpl - _$$FetchPlayersServerConnectionMessageImplFromJson(Map json) => - _$FetchPlayersServerConnectionMessageImpl( - $type: json['type'] as String?, - ); - -Map _$$FetchPlayersServerConnectionMessageImplToJson( - _$FetchPlayersServerConnectionMessageImpl instance) => - { - 'type': instance.$type, - }; - -_$ChatMessageServerConnectionMessageImpl - _$$ChatMessageServerConnectionMessageImplFromJson(Map json) => - _$ChatMessageServerConnectionMessageImpl( - json['message'] as String, - $type: json['type'] as String?, - ); - -Map _$$ChatMessageServerConnectionMessageImplToJson( - _$ChatMessageServerConnectionMessageImpl instance) => - { - 'message': instance.message, - 'type': instance.$type, - }; - -_$AddDeckServerConnectionMessageImpl - _$$AddDeckServerConnectionMessageImplFromJson(Map json) => - _$AddDeckServerConnectionMessageImpl( - GameDeck.fromJson(Map.from(json['deck'] as Map)), - (json['seatIndex'] as num?)?.toInt(), - $type: json['type'] as String?, - ); - -Map _$$AddDeckServerConnectionMessageImplToJson( - _$AddDeckServerConnectionMessageImpl instance) => - { - 'deck': instance.deck.toJson(), - 'seatIndex': instance.seatIndex, - 'type': instance.$type, - }; - -_$RemoveDeckServerConnectionMessageImpl - _$$RemoveDeckServerConnectionMessageImplFromJson(Map json) => - _$RemoveDeckServerConnectionMessageImpl( - (json['index'] as num).toInt(), - (json['seatIndex'] as num?)?.toInt(), - $type: json['type'] as String?, - ); - -Map _$$RemoveDeckServerConnectionMessageImplToJson( - _$RemoveDeckServerConnectionMessageImpl instance) => - { - 'index': instance.index, - 'seatIndex': instance.seatIndex, - 'type': instance.$type, - }; - -_$AddSeatServerConnectionMessageImpl - _$$AddSeatServerConnectionMessageImplFromJson(Map json) => - _$AddSeatServerConnectionMessageImpl( - json['name'] as String, - $type: json['type'] as String?, - ); - -Map _$$AddSeatServerConnectionMessageImplToJson( - _$AddSeatServerConnectionMessageImpl instance) => - { - 'name': instance.name, - 'type': instance.$type, - }; - -_$AddCardsServerConnectionMessageImpl - _$$AddCardsServerConnectionMessageImplFromJson(Map json) => - _$AddCardsServerConnectionMessageImpl( - (json['cards'] as List) - .map((e) => - CardIndex.fromJson(Map.from(e as Map))) - .toList(), - (json['deckIndex'] as num).toInt(), - (json['seatIndex'] as num?)?.toInt(), - $type: json['type'] as String?, - ); - -Map _$$AddCardsServerConnectionMessageImplToJson( - _$AddCardsServerConnectionMessageImpl instance) => - { - 'cards': instance.cards.map((e) => e.toJson()).toList(), - 'deckIndex': instance.deckIndex, - 'seatIndex': instance.seatIndex, - 'type': instance.$type, - }; - -_$PutCardsServerConnectionMessageImpl - _$$PutCardsServerConnectionMessageImplFromJson(Map json) => - _$PutCardsServerConnectionMessageImpl( - (json['deckIndex'] as num).toInt(), - (json['seatIndex'] as num?)?.toInt(), - $enumDecode(_$PickLocationEnumMap, json['location']), - (json['count'] as num).toInt(), - (json['movedDeckIndex'] as num).toInt(), - (json['movedSeatIndex'] as num?)?.toInt(), - $type: json['type'] as String?, - ); - -Map _$$PutCardsServerConnectionMessageImplToJson( - _$PutCardsServerConnectionMessageImpl instance) => - { - 'deckIndex': instance.deckIndex, - 'seatIndex': instance.seatIndex, - 'location': _$PickLocationEnumMap[instance.location]!, - 'count': instance.count, - 'movedDeckIndex': instance.movedDeckIndex, - 'movedSeatIndex': instance.movedSeatIndex, - 'type': instance.$type, - }; - -const _$PickLocationEnumMap = { - PickLocation.top: 'top', - PickLocation.bottom: 'bottom', - PickLocation.random: 'random', -}; - -_$RemoveCardsServerConnectionMessageImpl - _$$RemoveCardsServerConnectionMessageImplFromJson(Map json) => - _$RemoveCardsServerConnectionMessageImpl( - (json['cards'] as List) - .map((e) => - CardIndex.fromJson(Map.from(e as Map))) - .toList(), - $type: json['type'] as String?, - ); - -Map _$$RemoveCardsServerConnectionMessageImplToJson( - _$RemoveCardsServerConnectionMessageImpl instance) => - { - 'cards': instance.cards.map((e) => e.toJson()).toList(), - 'type': instance.$type, - }; - -_$RemoveSeatServerConnectionMessageImpl - _$$RemoveSeatServerConnectionMessageImplFromJson(Map json) => - _$RemoveSeatServerConnectionMessageImpl( - (json['index'] as num).toInt(), - $type: json['type'] as String?, - ); - -Map _$$RemoveSeatServerConnectionMessageImplToJson( - _$RemoveSeatServerConnectionMessageImpl instance) => - { - 'index': instance.index, - 'type': instance.$type, - }; - -_$JoinSeatServerConnectionMessageImpl - _$$JoinSeatServerConnectionMessageImplFromJson(Map json) => - _$JoinSeatServerConnectionMessageImpl( - (json['index'] as num).toInt(), - $type: json['type'] as String?, - ); - -Map _$$JoinSeatServerConnectionMessageImplToJson( - _$JoinSeatServerConnectionMessageImpl instance) => - { - 'index': instance.index, - 'type': instance.$type, - }; - -_$LeaveSeatServerConnectionMessageImpl - _$$LeaveSeatServerConnectionMessageImplFromJson(Map json) => - _$LeaveSeatServerConnectionMessageImpl( - (json['index'] as num).toInt(), - $type: json['type'] as String?, - ); - -Map _$$LeaveSeatServerConnectionMessageImplToJson( - _$LeaveSeatServerConnectionMessageImpl instance) => - { - 'index': instance.index, - 'type': instance.$type, - }; - -_$ShuffleServerConnectionMessageImpl - _$$ShuffleServerConnectionMessageImplFromJson(Map json) => - _$ShuffleServerConnectionMessageImpl( - (json['deckIndex'] as num).toInt(), - (json['seatIndex'] as num?)?.toInt(), - $type: json['type'] as String?, - ); - -Map _$$ShuffleServerConnectionMessageImplToJson( - _$ShuffleServerConnectionMessageImpl instance) => - { - 'deckIndex': instance.deckIndex, - 'seatIndex': instance.seatIndex, - 'type': instance.$type, - }; - -_$ChangeVisibilityServerConnectionMessageImpl - _$$ChangeVisibilityServerConnectionMessageImplFromJson(Map json) => - _$ChangeVisibilityServerConnectionMessageImpl( - (json['deckIndex'] as num).toInt(), - (json['seatIndex'] as num?)?.toInt(), - $enumDecode(_$DeckVisibilityEnumMap, json['visibility']), - $enumDecodeNullable(_$DeckVisibilityEnumMap, json['ownVisibility']), - json['type'] as String?, - ); - -Map _$$ChangeVisibilityServerConnectionMessageImplToJson( - _$ChangeVisibilityServerConnectionMessageImpl instance) => - { - 'deckIndex': instance.deckIndex, - 'seatIndex': instance.seatIndex, - 'visibility': _$DeckVisibilityEnumMap[instance.visibility]!, - 'ownVisibility': _$DeckVisibilityEnumMap[instance.ownVisibility], - 'type': instance.$type, - }; - -const _$DeckVisibilityEnumMap = { - DeckVisibility.hidden: 'hidden', - DeckVisibility.onlyTop: 'onlyTop', - DeckVisibility.visible: 'visible', -}; diff --git a/app/lib/logic/state.dart b/app/lib/logic/state.dart deleted file mode 100644 index 4fb4c5d..0000000 --- a/app/lib/logic/state.dart +++ /dev/null @@ -1,207 +0,0 @@ -import 'dart:math'; - -import 'package:freezed_annotation/freezed_annotation.dart'; - -part 'state.freezed.dart'; -part 'state.g.dart'; - -enum ClassicGameCardColor { - heart, - diamond, - spade, - club, -} - -@freezed -class GameCard with _$GameCard { - const factory GameCard.classic({ - @Default(ClassicGameCardColor.heart) ClassicGameCardColor color, - @Default(1) int number, - }) = ClassicGameCard; - - const factory GameCard.background() = BackgroundGameCard; - - factory GameCard.fromJson(Map json) => - _$GameCardFromJson(json); - - static List getClassicDeck() { - final cards = []; - for (final color in ClassicGameCardColor.values) { - for (var i = 1; i <= 13; i++) { - cards.add(ClassicGameCard(color: color, number: i)); - } - } - return cards; - } -} - -@freezed -class GameState with _$GameState { - const GameState._(); - - const factory GameState({ - @Default([]) List decks, - @Default([]) List seats, - }) = _GameState; - - factory GameState.fromJson(Map json) => - _$GameStateFromJson(json); - - Map toSaveJson() => - copyWith(seats: seats.map((e) => e.copyWith(players: [])).toList()) - .toJson(); - - GameState onPlayer(int player) { - final sentDecks = decks.map((e) => e.hideOutside()).toList(); - final sentSeats = seats.map((e) => e.forPlayer(player)).toList(); - return copyWith(decks: sentDecks, seats: sentSeats); - } -} - -@freezed -class GameSeat with _$GameSeat { - const GameSeat._(); - const factory GameSeat({ - @Default('') String name, - @Default([]) List decks, - @Default([]) List players, - DeckVisibility? ownDeckVisibility, - }) = _GameSeat; - - factory GameSeat.fromJson(Map json) => - _$GameSeatFromJson(json); - - GameSeat forPlayer(int player) { - if (players.contains(player)) { - return copyWith( - decks: decks.map((e) => e.hideOwn()).toList(), - ); - } else { - return copyWith( - decks: decks.map((e) => e.hideOutside()).toList(), - ); - } - } -} - -enum DeckVisibility { - hidden, - onlyTop, - visible, -} - -@freezed -class DeckRefill with _$DeckRefill { - const DeckRefill._(); - - const factory DeckRefill.none() = _DeckRefillNone; - - const factory DeckRefill.shuffle({ - int? count, - }) = _DeckRefillShuffle; - - const factory DeckRefill.first({ - int? count, - }) = _DeckRefillFirst; - - factory DeckRefill.fromJson(Map json) => - _$DeckRefillFromJson(json); -} - -enum PickLocation { top, bottom, random } - -@freezed -class CardsRemoveState with _$CardsRemoveState { - const factory CardsRemoveState({ - required GameDeck deck, - required List removedCards, - }) = _CardsRemoveState; -} - -@freezed -class GameDeck with _$GameDeck { - const GameDeck._(); - const factory GameDeck({ - @Default('') String name, - @Default(DeckVisibility.hidden) DeckVisibility visibility, - DeckVisibility? ownVisibility, - @Default([]) List cards, - }) = _GameDeck; - - factory GameDeck.fromJson(Map json) => - _$GameDeckFromJson(json); - - GameDeck hideOutside() => hide(visibility); - - GameDeck hideOwn() => hide(getOwnVisibility()); - - GameDeck hide(DeckVisibility visibility) { - switch (visibility) { - case DeckVisibility.visible: - return this; - case DeckVisibility.onlyTop: - if (cards.isEmpty) { - return this; - } - return copyWith( - cards: [ - cards.first, - ...cards.map((e) => const BackgroundGameCard()), - ], - ); - case DeckVisibility.hidden: - return copyWith( - cards: cards.map((e) => const BackgroundGameCard()).toList(), - ); - } - } - - DeckVisibility getOwnVisibility() => ownVisibility ?? visibility; - - GameDeck shuffle() { - final newCards = List.from(cards)..shuffle(); - return copyWith(cards: newCards); - } - - GameDeck putCards(List cards, - [PickLocation location = PickLocation.bottom]) { - final newCards = List.from(cards); - switch (location) { - case PickLocation.top: - newCards.insertAll(0, cards); - break; - case PickLocation.bottom: - newCards.addAll(cards); - break; - case PickLocation.random: - newCards.insertAll(Random().nextInt(newCards.length + 1), cards); - break; - } - return copyWith(cards: newCards); - } - - CardsRemoveState removeCards( - [int count = 1, PickLocation location = PickLocation.top]) { - final newCards = List.from(cards); - final removedCards = []; - switch (location) { - case PickLocation.top: - removedCards.addAll(newCards.getRange(0, count)); - newCards.removeRange(0, count); - break; - case PickLocation.bottom: - removedCards.addAll( - newCards.getRange(newCards.length - count, newCards.length)); - newCards.removeRange(newCards.length - count, newCards.length); - break; - case PickLocation.random: - final random = Random(); - for (var i = 0; i < count; i++) { - removedCards.add(newCards.removeAt(random.nextInt(newCards.length))); - } - break; - } - return CardsRemoveState( - deck: copyWith(cards: newCards), removedCards: removedCards); - } -} diff --git a/app/lib/logic/state.freezed.dart b/app/lib/logic/state.freezed.dart deleted file mode 100644 index 8a6033e..0000000 --- a/app/lib/logic/state.freezed.dart +++ /dev/null @@ -1,1677 +0,0 @@ -// coverage:ignore-file -// GENERATED CODE - DO NOT MODIFY BY HAND -// ignore_for_file: type=lint -// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark - -part of 'state.dart'; - -// ************************************************************************** -// FreezedGenerator -// ************************************************************************** - -T _$identity(T value) => value; - -final _privateConstructorUsedError = UnsupportedError( - 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); - -GameCard _$GameCardFromJson(Map json) { - switch (json['type']) { - case 'classic': - return ClassicGameCard.fromJson(json); - case 'background': - return BackgroundGameCard.fromJson(json); - - default: - throw CheckedFromJsonException( - json, 'type', 'GameCard', 'Invalid union type "${json['type']}"!'); - } -} - -/// @nodoc -mixin _$GameCard { - @optionalTypeArgs - TResult when({ - required TResult Function(ClassicGameCardColor color, int number) classic, - required TResult Function() background, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(ClassicGameCardColor color, int number)? classic, - TResult? Function()? background, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(ClassicGameCardColor color, int number)? classic, - TResult Function()? background, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(ClassicGameCard value) classic, - required TResult Function(BackgroundGameCard value) background, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(ClassicGameCard value)? classic, - TResult? Function(BackgroundGameCard value)? background, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(ClassicGameCard value)? classic, - TResult Function(BackgroundGameCard value)? background, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - Map toJson() => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $GameCardCopyWith<$Res> { - factory $GameCardCopyWith(GameCard value, $Res Function(GameCard) then) = - _$GameCardCopyWithImpl<$Res, GameCard>; -} - -/// @nodoc -class _$GameCardCopyWithImpl<$Res, $Val extends GameCard> - implements $GameCardCopyWith<$Res> { - _$GameCardCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; -} - -/// @nodoc -abstract class _$$ClassicGameCardImplCopyWith<$Res> { - factory _$$ClassicGameCardImplCopyWith(_$ClassicGameCardImpl value, - $Res Function(_$ClassicGameCardImpl) then) = - __$$ClassicGameCardImplCopyWithImpl<$Res>; - @useResult - $Res call({ClassicGameCardColor color, int number}); -} - -/// @nodoc -class __$$ClassicGameCardImplCopyWithImpl<$Res> - extends _$GameCardCopyWithImpl<$Res, _$ClassicGameCardImpl> - implements _$$ClassicGameCardImplCopyWith<$Res> { - __$$ClassicGameCardImplCopyWithImpl( - _$ClassicGameCardImpl _value, $Res Function(_$ClassicGameCardImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? color = null, - Object? number = null, - }) { - return _then(_$ClassicGameCardImpl( - color: null == color - ? _value.color - : color // ignore: cast_nullable_to_non_nullable - as ClassicGameCardColor, - number: null == number - ? _value.number - : number // ignore: cast_nullable_to_non_nullable - as int, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$ClassicGameCardImpl implements ClassicGameCard { - const _$ClassicGameCardImpl( - {this.color = ClassicGameCardColor.heart, - this.number = 1, - final String? $type}) - : $type = $type ?? 'classic'; - - factory _$ClassicGameCardImpl.fromJson(Map json) => - _$$ClassicGameCardImplFromJson(json); - - @override - @JsonKey() - final ClassicGameCardColor color; - @override - @JsonKey() - final int number; - - @JsonKey(name: 'type') - final String $type; - - @override - String toString() { - return 'GameCard.classic(color: $color, number: $number)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$ClassicGameCardImpl && - (identical(other.color, color) || other.color == color) && - (identical(other.number, number) || other.number == number)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => Object.hash(runtimeType, color, number); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$ClassicGameCardImplCopyWith<_$ClassicGameCardImpl> get copyWith => - __$$ClassicGameCardImplCopyWithImpl<_$ClassicGameCardImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(ClassicGameCardColor color, int number) classic, - required TResult Function() background, - }) { - return classic(color, number); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(ClassicGameCardColor color, int number)? classic, - TResult? Function()? background, - }) { - return classic?.call(color, number); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(ClassicGameCardColor color, int number)? classic, - TResult Function()? background, - required TResult orElse(), - }) { - if (classic != null) { - return classic(color, number); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(ClassicGameCard value) classic, - required TResult Function(BackgroundGameCard value) background, - }) { - return classic(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(ClassicGameCard value)? classic, - TResult? Function(BackgroundGameCard value)? background, - }) { - return classic?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(ClassicGameCard value)? classic, - TResult Function(BackgroundGameCard value)? background, - required TResult orElse(), - }) { - if (classic != null) { - return classic(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$ClassicGameCardImplToJson( - this, - ); - } -} - -abstract class ClassicGameCard implements GameCard { - const factory ClassicGameCard( - {final ClassicGameCardColor color, - final int number}) = _$ClassicGameCardImpl; - - factory ClassicGameCard.fromJson(Map json) = - _$ClassicGameCardImpl.fromJson; - - ClassicGameCardColor get color; - int get number; - @JsonKey(ignore: true) - _$$ClassicGameCardImplCopyWith<_$ClassicGameCardImpl> get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$BackgroundGameCardImplCopyWith<$Res> { - factory _$$BackgroundGameCardImplCopyWith(_$BackgroundGameCardImpl value, - $Res Function(_$BackgroundGameCardImpl) then) = - __$$BackgroundGameCardImplCopyWithImpl<$Res>; -} - -/// @nodoc -class __$$BackgroundGameCardImplCopyWithImpl<$Res> - extends _$GameCardCopyWithImpl<$Res, _$BackgroundGameCardImpl> - implements _$$BackgroundGameCardImplCopyWith<$Res> { - __$$BackgroundGameCardImplCopyWithImpl(_$BackgroundGameCardImpl _value, - $Res Function(_$BackgroundGameCardImpl) _then) - : super(_value, _then); -} - -/// @nodoc -@JsonSerializable() -class _$BackgroundGameCardImpl implements BackgroundGameCard { - const _$BackgroundGameCardImpl({final String? $type}) - : $type = $type ?? 'background'; - - factory _$BackgroundGameCardImpl.fromJson(Map json) => - _$$BackgroundGameCardImplFromJson(json); - - @JsonKey(name: 'type') - final String $type; - - @override - String toString() { - return 'GameCard.background()'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && other is _$BackgroundGameCardImpl); - } - - @JsonKey(ignore: true) - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(ClassicGameCardColor color, int number) classic, - required TResult Function() background, - }) { - return background(); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(ClassicGameCardColor color, int number)? classic, - TResult? Function()? background, - }) { - return background?.call(); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(ClassicGameCardColor color, int number)? classic, - TResult Function()? background, - required TResult orElse(), - }) { - if (background != null) { - return background(); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(ClassicGameCard value) classic, - required TResult Function(BackgroundGameCard value) background, - }) { - return background(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(ClassicGameCard value)? classic, - TResult? Function(BackgroundGameCard value)? background, - }) { - return background?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(ClassicGameCard value)? classic, - TResult Function(BackgroundGameCard value)? background, - required TResult orElse(), - }) { - if (background != null) { - return background(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$BackgroundGameCardImplToJson( - this, - ); - } -} - -abstract class BackgroundGameCard implements GameCard { - const factory BackgroundGameCard() = _$BackgroundGameCardImpl; - - factory BackgroundGameCard.fromJson(Map json) = - _$BackgroundGameCardImpl.fromJson; -} - -GameState _$GameStateFromJson(Map json) { - return _GameState.fromJson(json); -} - -/// @nodoc -mixin _$GameState { - List get decks => throw _privateConstructorUsedError; - List get seats => throw _privateConstructorUsedError; - - Map toJson() => throw _privateConstructorUsedError; - @JsonKey(ignore: true) - $GameStateCopyWith get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $GameStateCopyWith<$Res> { - factory $GameStateCopyWith(GameState value, $Res Function(GameState) then) = - _$GameStateCopyWithImpl<$Res, GameState>; - @useResult - $Res call({List decks, List seats}); -} - -/// @nodoc -class _$GameStateCopyWithImpl<$Res, $Val extends GameState> - implements $GameStateCopyWith<$Res> { - _$GameStateCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? decks = null, - Object? seats = null, - }) { - return _then(_value.copyWith( - decks: null == decks - ? _value.decks - : decks // ignore: cast_nullable_to_non_nullable - as List, - seats: null == seats - ? _value.seats - : seats // ignore: cast_nullable_to_non_nullable - as List, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$GameStateImplCopyWith<$Res> - implements $GameStateCopyWith<$Res> { - factory _$$GameStateImplCopyWith( - _$GameStateImpl value, $Res Function(_$GameStateImpl) then) = - __$$GameStateImplCopyWithImpl<$Res>; - @override - @useResult - $Res call({List decks, List seats}); -} - -/// @nodoc -class __$$GameStateImplCopyWithImpl<$Res> - extends _$GameStateCopyWithImpl<$Res, _$GameStateImpl> - implements _$$GameStateImplCopyWith<$Res> { - __$$GameStateImplCopyWithImpl( - _$GameStateImpl _value, $Res Function(_$GameStateImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? decks = null, - Object? seats = null, - }) { - return _then(_$GameStateImpl( - decks: null == decks - ? _value._decks - : decks // ignore: cast_nullable_to_non_nullable - as List, - seats: null == seats - ? _value._seats - : seats // ignore: cast_nullable_to_non_nullable - as List, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$GameStateImpl extends _GameState { - const _$GameStateImpl( - {final List decks = const [], - final List seats = const []}) - : _decks = decks, - _seats = seats, - super._(); - - factory _$GameStateImpl.fromJson(Map json) => - _$$GameStateImplFromJson(json); - - final List _decks; - @override - @JsonKey() - List get decks { - if (_decks is EqualUnmodifiableListView) return _decks; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_decks); - } - - final List _seats; - @override - @JsonKey() - List get seats { - if (_seats is EqualUnmodifiableListView) return _seats; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_seats); - } - - @override - String toString() { - return 'GameState(decks: $decks, seats: $seats)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$GameStateImpl && - const DeepCollectionEquality().equals(other._decks, _decks) && - const DeepCollectionEquality().equals(other._seats, _seats)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => Object.hash( - runtimeType, - const DeepCollectionEquality().hash(_decks), - const DeepCollectionEquality().hash(_seats)); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$GameStateImplCopyWith<_$GameStateImpl> get copyWith => - __$$GameStateImplCopyWithImpl<_$GameStateImpl>(this, _$identity); - - @override - Map toJson() { - return _$$GameStateImplToJson( - this, - ); - } -} - -abstract class _GameState extends GameState { - const factory _GameState( - {final List decks, - final List seats}) = _$GameStateImpl; - const _GameState._() : super._(); - - factory _GameState.fromJson(Map json) = - _$GameStateImpl.fromJson; - - @override - List get decks; - @override - List get seats; - @override - @JsonKey(ignore: true) - _$$GameStateImplCopyWith<_$GameStateImpl> get copyWith => - throw _privateConstructorUsedError; -} - -GameSeat _$GameSeatFromJson(Map json) { - return _GameSeat.fromJson(json); -} - -/// @nodoc -mixin _$GameSeat { - String get name => throw _privateConstructorUsedError; - List get decks => throw _privateConstructorUsedError; - List get players => throw _privateConstructorUsedError; - DeckVisibility? get ownDeckVisibility => throw _privateConstructorUsedError; - - Map toJson() => throw _privateConstructorUsedError; - @JsonKey(ignore: true) - $GameSeatCopyWith get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $GameSeatCopyWith<$Res> { - factory $GameSeatCopyWith(GameSeat value, $Res Function(GameSeat) then) = - _$GameSeatCopyWithImpl<$Res, GameSeat>; - @useResult - $Res call( - {String name, - List decks, - List players, - DeckVisibility? ownDeckVisibility}); -} - -/// @nodoc -class _$GameSeatCopyWithImpl<$Res, $Val extends GameSeat> - implements $GameSeatCopyWith<$Res> { - _$GameSeatCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? name = null, - Object? decks = null, - Object? players = null, - Object? ownDeckVisibility = freezed, - }) { - return _then(_value.copyWith( - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - decks: null == decks - ? _value.decks - : decks // ignore: cast_nullable_to_non_nullable - as List, - players: null == players - ? _value.players - : players // ignore: cast_nullable_to_non_nullable - as List, - ownDeckVisibility: freezed == ownDeckVisibility - ? _value.ownDeckVisibility - : ownDeckVisibility // ignore: cast_nullable_to_non_nullable - as DeckVisibility?, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$GameSeatImplCopyWith<$Res> - implements $GameSeatCopyWith<$Res> { - factory _$$GameSeatImplCopyWith( - _$GameSeatImpl value, $Res Function(_$GameSeatImpl) then) = - __$$GameSeatImplCopyWithImpl<$Res>; - @override - @useResult - $Res call( - {String name, - List decks, - List players, - DeckVisibility? ownDeckVisibility}); -} - -/// @nodoc -class __$$GameSeatImplCopyWithImpl<$Res> - extends _$GameSeatCopyWithImpl<$Res, _$GameSeatImpl> - implements _$$GameSeatImplCopyWith<$Res> { - __$$GameSeatImplCopyWithImpl( - _$GameSeatImpl _value, $Res Function(_$GameSeatImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? name = null, - Object? decks = null, - Object? players = null, - Object? ownDeckVisibility = freezed, - }) { - return _then(_$GameSeatImpl( - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - decks: null == decks - ? _value._decks - : decks // ignore: cast_nullable_to_non_nullable - as List, - players: null == players - ? _value._players - : players // ignore: cast_nullable_to_non_nullable - as List, - ownDeckVisibility: freezed == ownDeckVisibility - ? _value.ownDeckVisibility - : ownDeckVisibility // ignore: cast_nullable_to_non_nullable - as DeckVisibility?, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$GameSeatImpl extends _GameSeat { - const _$GameSeatImpl( - {this.name = '', - final List decks = const [], - final List players = const [], - this.ownDeckVisibility}) - : _decks = decks, - _players = players, - super._(); - - factory _$GameSeatImpl.fromJson(Map json) => - _$$GameSeatImplFromJson(json); - - @override - @JsonKey() - final String name; - final List _decks; - @override - @JsonKey() - List get decks { - if (_decks is EqualUnmodifiableListView) return _decks; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_decks); - } - - final List _players; - @override - @JsonKey() - List get players { - if (_players is EqualUnmodifiableListView) return _players; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_players); - } - - @override - final DeckVisibility? ownDeckVisibility; - - @override - String toString() { - return 'GameSeat(name: $name, decks: $decks, players: $players, ownDeckVisibility: $ownDeckVisibility)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$GameSeatImpl && - (identical(other.name, name) || other.name == name) && - const DeepCollectionEquality().equals(other._decks, _decks) && - const DeepCollectionEquality().equals(other._players, _players) && - (identical(other.ownDeckVisibility, ownDeckVisibility) || - other.ownDeckVisibility == ownDeckVisibility)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => Object.hash( - runtimeType, - name, - const DeepCollectionEquality().hash(_decks), - const DeepCollectionEquality().hash(_players), - ownDeckVisibility); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$GameSeatImplCopyWith<_$GameSeatImpl> get copyWith => - __$$GameSeatImplCopyWithImpl<_$GameSeatImpl>(this, _$identity); - - @override - Map toJson() { - return _$$GameSeatImplToJson( - this, - ); - } -} - -abstract class _GameSeat extends GameSeat { - const factory _GameSeat( - {final String name, - final List decks, - final List players, - final DeckVisibility? ownDeckVisibility}) = _$GameSeatImpl; - const _GameSeat._() : super._(); - - factory _GameSeat.fromJson(Map json) = - _$GameSeatImpl.fromJson; - - @override - String get name; - @override - List get decks; - @override - List get players; - @override - DeckVisibility? get ownDeckVisibility; - @override - @JsonKey(ignore: true) - _$$GameSeatImplCopyWith<_$GameSeatImpl> get copyWith => - throw _privateConstructorUsedError; -} - -DeckRefill _$DeckRefillFromJson(Map json) { - switch (json['type']) { - case 'none': - return _DeckRefillNone.fromJson(json); - case 'shuffle': - return _DeckRefillShuffle.fromJson(json); - case 'first': - return _DeckRefillFirst.fromJson(json); - - default: - throw CheckedFromJsonException( - json, 'type', 'DeckRefill', 'Invalid union type "${json['type']}"!'); - } -} - -/// @nodoc -mixin _$DeckRefill { - @optionalTypeArgs - TResult when({ - required TResult Function() none, - required TResult Function(int? count) shuffle, - required TResult Function(int? count) first, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? none, - TResult? Function(int? count)? shuffle, - TResult? Function(int? count)? first, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? none, - TResult Function(int? count)? shuffle, - TResult Function(int? count)? first, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(_DeckRefillNone value) none, - required TResult Function(_DeckRefillShuffle value) shuffle, - required TResult Function(_DeckRefillFirst value) first, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(_DeckRefillNone value)? none, - TResult? Function(_DeckRefillShuffle value)? shuffle, - TResult? Function(_DeckRefillFirst value)? first, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(_DeckRefillNone value)? none, - TResult Function(_DeckRefillShuffle value)? shuffle, - TResult Function(_DeckRefillFirst value)? first, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - Map toJson() => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $DeckRefillCopyWith<$Res> { - factory $DeckRefillCopyWith( - DeckRefill value, $Res Function(DeckRefill) then) = - _$DeckRefillCopyWithImpl<$Res, DeckRefill>; -} - -/// @nodoc -class _$DeckRefillCopyWithImpl<$Res, $Val extends DeckRefill> - implements $DeckRefillCopyWith<$Res> { - _$DeckRefillCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; -} - -/// @nodoc -abstract class _$$DeckRefillNoneImplCopyWith<$Res> { - factory _$$DeckRefillNoneImplCopyWith(_$DeckRefillNoneImpl value, - $Res Function(_$DeckRefillNoneImpl) then) = - __$$DeckRefillNoneImplCopyWithImpl<$Res>; -} - -/// @nodoc -class __$$DeckRefillNoneImplCopyWithImpl<$Res> - extends _$DeckRefillCopyWithImpl<$Res, _$DeckRefillNoneImpl> - implements _$$DeckRefillNoneImplCopyWith<$Res> { - __$$DeckRefillNoneImplCopyWithImpl( - _$DeckRefillNoneImpl _value, $Res Function(_$DeckRefillNoneImpl) _then) - : super(_value, _then); -} - -/// @nodoc -@JsonSerializable() -class _$DeckRefillNoneImpl extends _DeckRefillNone { - const _$DeckRefillNoneImpl({final String? $type}) - : $type = $type ?? 'none', - super._(); - - factory _$DeckRefillNoneImpl.fromJson(Map json) => - _$$DeckRefillNoneImplFromJson(json); - - @JsonKey(name: 'type') - final String $type; - - @override - String toString() { - return 'DeckRefill.none()'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && other is _$DeckRefillNoneImpl); - } - - @JsonKey(ignore: true) - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() none, - required TResult Function(int? count) shuffle, - required TResult Function(int? count) first, - }) { - return none(); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? none, - TResult? Function(int? count)? shuffle, - TResult? Function(int? count)? first, - }) { - return none?.call(); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? none, - TResult Function(int? count)? shuffle, - TResult Function(int? count)? first, - required TResult orElse(), - }) { - if (none != null) { - return none(); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(_DeckRefillNone value) none, - required TResult Function(_DeckRefillShuffle value) shuffle, - required TResult Function(_DeckRefillFirst value) first, - }) { - return none(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(_DeckRefillNone value)? none, - TResult? Function(_DeckRefillShuffle value)? shuffle, - TResult? Function(_DeckRefillFirst value)? first, - }) { - return none?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(_DeckRefillNone value)? none, - TResult Function(_DeckRefillShuffle value)? shuffle, - TResult Function(_DeckRefillFirst value)? first, - required TResult orElse(), - }) { - if (none != null) { - return none(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$DeckRefillNoneImplToJson( - this, - ); - } -} - -abstract class _DeckRefillNone extends DeckRefill { - const factory _DeckRefillNone() = _$DeckRefillNoneImpl; - const _DeckRefillNone._() : super._(); - - factory _DeckRefillNone.fromJson(Map json) = - _$DeckRefillNoneImpl.fromJson; -} - -/// @nodoc -abstract class _$$DeckRefillShuffleImplCopyWith<$Res> { - factory _$$DeckRefillShuffleImplCopyWith(_$DeckRefillShuffleImpl value, - $Res Function(_$DeckRefillShuffleImpl) then) = - __$$DeckRefillShuffleImplCopyWithImpl<$Res>; - @useResult - $Res call({int? count}); -} - -/// @nodoc -class __$$DeckRefillShuffleImplCopyWithImpl<$Res> - extends _$DeckRefillCopyWithImpl<$Res, _$DeckRefillShuffleImpl> - implements _$$DeckRefillShuffleImplCopyWith<$Res> { - __$$DeckRefillShuffleImplCopyWithImpl(_$DeckRefillShuffleImpl _value, - $Res Function(_$DeckRefillShuffleImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? count = freezed, - }) { - return _then(_$DeckRefillShuffleImpl( - count: freezed == count - ? _value.count - : count // ignore: cast_nullable_to_non_nullable - as int?, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$DeckRefillShuffleImpl extends _DeckRefillShuffle { - const _$DeckRefillShuffleImpl({this.count, final String? $type}) - : $type = $type ?? 'shuffle', - super._(); - - factory _$DeckRefillShuffleImpl.fromJson(Map json) => - _$$DeckRefillShuffleImplFromJson(json); - - @override - final int? count; - - @JsonKey(name: 'type') - final String $type; - - @override - String toString() { - return 'DeckRefill.shuffle(count: $count)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$DeckRefillShuffleImpl && - (identical(other.count, count) || other.count == count)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => Object.hash(runtimeType, count); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$DeckRefillShuffleImplCopyWith<_$DeckRefillShuffleImpl> get copyWith => - __$$DeckRefillShuffleImplCopyWithImpl<_$DeckRefillShuffleImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() none, - required TResult Function(int? count) shuffle, - required TResult Function(int? count) first, - }) { - return shuffle(count); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? none, - TResult? Function(int? count)? shuffle, - TResult? Function(int? count)? first, - }) { - return shuffle?.call(count); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? none, - TResult Function(int? count)? shuffle, - TResult Function(int? count)? first, - required TResult orElse(), - }) { - if (shuffle != null) { - return shuffle(count); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(_DeckRefillNone value) none, - required TResult Function(_DeckRefillShuffle value) shuffle, - required TResult Function(_DeckRefillFirst value) first, - }) { - return shuffle(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(_DeckRefillNone value)? none, - TResult? Function(_DeckRefillShuffle value)? shuffle, - TResult? Function(_DeckRefillFirst value)? first, - }) { - return shuffle?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(_DeckRefillNone value)? none, - TResult Function(_DeckRefillShuffle value)? shuffle, - TResult Function(_DeckRefillFirst value)? first, - required TResult orElse(), - }) { - if (shuffle != null) { - return shuffle(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$DeckRefillShuffleImplToJson( - this, - ); - } -} - -abstract class _DeckRefillShuffle extends DeckRefill { - const factory _DeckRefillShuffle({final int? count}) = - _$DeckRefillShuffleImpl; - const _DeckRefillShuffle._() : super._(); - - factory _DeckRefillShuffle.fromJson(Map json) = - _$DeckRefillShuffleImpl.fromJson; - - int? get count; - @JsonKey(ignore: true) - _$$DeckRefillShuffleImplCopyWith<_$DeckRefillShuffleImpl> get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$DeckRefillFirstImplCopyWith<$Res> { - factory _$$DeckRefillFirstImplCopyWith(_$DeckRefillFirstImpl value, - $Res Function(_$DeckRefillFirstImpl) then) = - __$$DeckRefillFirstImplCopyWithImpl<$Res>; - @useResult - $Res call({int? count}); -} - -/// @nodoc -class __$$DeckRefillFirstImplCopyWithImpl<$Res> - extends _$DeckRefillCopyWithImpl<$Res, _$DeckRefillFirstImpl> - implements _$$DeckRefillFirstImplCopyWith<$Res> { - __$$DeckRefillFirstImplCopyWithImpl( - _$DeckRefillFirstImpl _value, $Res Function(_$DeckRefillFirstImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? count = freezed, - }) { - return _then(_$DeckRefillFirstImpl( - count: freezed == count - ? _value.count - : count // ignore: cast_nullable_to_non_nullable - as int?, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$DeckRefillFirstImpl extends _DeckRefillFirst { - const _$DeckRefillFirstImpl({this.count, final String? $type}) - : $type = $type ?? 'first', - super._(); - - factory _$DeckRefillFirstImpl.fromJson(Map json) => - _$$DeckRefillFirstImplFromJson(json); - - @override - final int? count; - - @JsonKey(name: 'type') - final String $type; - - @override - String toString() { - return 'DeckRefill.first(count: $count)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$DeckRefillFirstImpl && - (identical(other.count, count) || other.count == count)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => Object.hash(runtimeType, count); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$DeckRefillFirstImplCopyWith<_$DeckRefillFirstImpl> get copyWith => - __$$DeckRefillFirstImplCopyWithImpl<_$DeckRefillFirstImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() none, - required TResult Function(int? count) shuffle, - required TResult Function(int? count) first, - }) { - return first(count); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? none, - TResult? Function(int? count)? shuffle, - TResult? Function(int? count)? first, - }) { - return first?.call(count); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? none, - TResult Function(int? count)? shuffle, - TResult Function(int? count)? first, - required TResult orElse(), - }) { - if (first != null) { - return first(count); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(_DeckRefillNone value) none, - required TResult Function(_DeckRefillShuffle value) shuffle, - required TResult Function(_DeckRefillFirst value) first, - }) { - return first(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(_DeckRefillNone value)? none, - TResult? Function(_DeckRefillShuffle value)? shuffle, - TResult? Function(_DeckRefillFirst value)? first, - }) { - return first?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(_DeckRefillNone value)? none, - TResult Function(_DeckRefillShuffle value)? shuffle, - TResult Function(_DeckRefillFirst value)? first, - required TResult orElse(), - }) { - if (first != null) { - return first(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$DeckRefillFirstImplToJson( - this, - ); - } -} - -abstract class _DeckRefillFirst extends DeckRefill { - const factory _DeckRefillFirst({final int? count}) = _$DeckRefillFirstImpl; - const _DeckRefillFirst._() : super._(); - - factory _DeckRefillFirst.fromJson(Map json) = - _$DeckRefillFirstImpl.fromJson; - - int? get count; - @JsonKey(ignore: true) - _$$DeckRefillFirstImplCopyWith<_$DeckRefillFirstImpl> get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -mixin _$CardsRemoveState { - GameDeck get deck => throw _privateConstructorUsedError; - List get removedCards => throw _privateConstructorUsedError; - - @JsonKey(ignore: true) - $CardsRemoveStateCopyWith get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $CardsRemoveStateCopyWith<$Res> { - factory $CardsRemoveStateCopyWith( - CardsRemoveState value, $Res Function(CardsRemoveState) then) = - _$CardsRemoveStateCopyWithImpl<$Res, CardsRemoveState>; - @useResult - $Res call({GameDeck deck, List removedCards}); - - $GameDeckCopyWith<$Res> get deck; -} - -/// @nodoc -class _$CardsRemoveStateCopyWithImpl<$Res, $Val extends CardsRemoveState> - implements $CardsRemoveStateCopyWith<$Res> { - _$CardsRemoveStateCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? deck = null, - Object? removedCards = null, - }) { - return _then(_value.copyWith( - deck: null == deck - ? _value.deck - : deck // ignore: cast_nullable_to_non_nullable - as GameDeck, - removedCards: null == removedCards - ? _value.removedCards - : removedCards // ignore: cast_nullable_to_non_nullable - as List, - ) as $Val); - } - - @override - @pragma('vm:prefer-inline') - $GameDeckCopyWith<$Res> get deck { - return $GameDeckCopyWith<$Res>(_value.deck, (value) { - return _then(_value.copyWith(deck: value) as $Val); - }); - } -} - -/// @nodoc -abstract class _$$CardsRemoveStateImplCopyWith<$Res> - implements $CardsRemoveStateCopyWith<$Res> { - factory _$$CardsRemoveStateImplCopyWith(_$CardsRemoveStateImpl value, - $Res Function(_$CardsRemoveStateImpl) then) = - __$$CardsRemoveStateImplCopyWithImpl<$Res>; - @override - @useResult - $Res call({GameDeck deck, List removedCards}); - - @override - $GameDeckCopyWith<$Res> get deck; -} - -/// @nodoc -class __$$CardsRemoveStateImplCopyWithImpl<$Res> - extends _$CardsRemoveStateCopyWithImpl<$Res, _$CardsRemoveStateImpl> - implements _$$CardsRemoveStateImplCopyWith<$Res> { - __$$CardsRemoveStateImplCopyWithImpl(_$CardsRemoveStateImpl _value, - $Res Function(_$CardsRemoveStateImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? deck = null, - Object? removedCards = null, - }) { - return _then(_$CardsRemoveStateImpl( - deck: null == deck - ? _value.deck - : deck // ignore: cast_nullable_to_non_nullable - as GameDeck, - removedCards: null == removedCards - ? _value._removedCards - : removedCards // ignore: cast_nullable_to_non_nullable - as List, - )); - } -} - -/// @nodoc - -class _$CardsRemoveStateImpl implements _CardsRemoveState { - const _$CardsRemoveStateImpl( - {required this.deck, required final List removedCards}) - : _removedCards = removedCards; - - @override - final GameDeck deck; - final List _removedCards; - @override - List get removedCards { - if (_removedCards is EqualUnmodifiableListView) return _removedCards; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_removedCards); - } - - @override - String toString() { - return 'CardsRemoveState(deck: $deck, removedCards: $removedCards)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$CardsRemoveStateImpl && - (identical(other.deck, deck) || other.deck == deck) && - const DeepCollectionEquality() - .equals(other._removedCards, _removedCards)); - } - - @override - int get hashCode => Object.hash( - runtimeType, deck, const DeepCollectionEquality().hash(_removedCards)); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$CardsRemoveStateImplCopyWith<_$CardsRemoveStateImpl> get copyWith => - __$$CardsRemoveStateImplCopyWithImpl<_$CardsRemoveStateImpl>( - this, _$identity); -} - -abstract class _CardsRemoveState implements CardsRemoveState { - const factory _CardsRemoveState( - {required final GameDeck deck, - required final List removedCards}) = _$CardsRemoveStateImpl; - - @override - GameDeck get deck; - @override - List get removedCards; - @override - @JsonKey(ignore: true) - _$$CardsRemoveStateImplCopyWith<_$CardsRemoveStateImpl> get copyWith => - throw _privateConstructorUsedError; -} - -GameDeck _$GameDeckFromJson(Map json) { - return _GameDeck.fromJson(json); -} - -/// @nodoc -mixin _$GameDeck { - String get name => throw _privateConstructorUsedError; - DeckVisibility get visibility => throw _privateConstructorUsedError; - DeckVisibility? get ownVisibility => throw _privateConstructorUsedError; - List get cards => throw _privateConstructorUsedError; - - Map toJson() => throw _privateConstructorUsedError; - @JsonKey(ignore: true) - $GameDeckCopyWith get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $GameDeckCopyWith<$Res> { - factory $GameDeckCopyWith(GameDeck value, $Res Function(GameDeck) then) = - _$GameDeckCopyWithImpl<$Res, GameDeck>; - @useResult - $Res call( - {String name, - DeckVisibility visibility, - DeckVisibility? ownVisibility, - List cards}); -} - -/// @nodoc -class _$GameDeckCopyWithImpl<$Res, $Val extends GameDeck> - implements $GameDeckCopyWith<$Res> { - _$GameDeckCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? name = null, - Object? visibility = null, - Object? ownVisibility = freezed, - Object? cards = null, - }) { - return _then(_value.copyWith( - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - visibility: null == visibility - ? _value.visibility - : visibility // ignore: cast_nullable_to_non_nullable - as DeckVisibility, - ownVisibility: freezed == ownVisibility - ? _value.ownVisibility - : ownVisibility // ignore: cast_nullable_to_non_nullable - as DeckVisibility?, - cards: null == cards - ? _value.cards - : cards // ignore: cast_nullable_to_non_nullable - as List, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$GameDeckImplCopyWith<$Res> - implements $GameDeckCopyWith<$Res> { - factory _$$GameDeckImplCopyWith( - _$GameDeckImpl value, $Res Function(_$GameDeckImpl) then) = - __$$GameDeckImplCopyWithImpl<$Res>; - @override - @useResult - $Res call( - {String name, - DeckVisibility visibility, - DeckVisibility? ownVisibility, - List cards}); -} - -/// @nodoc -class __$$GameDeckImplCopyWithImpl<$Res> - extends _$GameDeckCopyWithImpl<$Res, _$GameDeckImpl> - implements _$$GameDeckImplCopyWith<$Res> { - __$$GameDeckImplCopyWithImpl( - _$GameDeckImpl _value, $Res Function(_$GameDeckImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? name = null, - Object? visibility = null, - Object? ownVisibility = freezed, - Object? cards = null, - }) { - return _then(_$GameDeckImpl( - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - visibility: null == visibility - ? _value.visibility - : visibility // ignore: cast_nullable_to_non_nullable - as DeckVisibility, - ownVisibility: freezed == ownVisibility - ? _value.ownVisibility - : ownVisibility // ignore: cast_nullable_to_non_nullable - as DeckVisibility?, - cards: null == cards - ? _value._cards - : cards // ignore: cast_nullable_to_non_nullable - as List, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$GameDeckImpl extends _GameDeck { - const _$GameDeckImpl( - {this.name = '', - this.visibility = DeckVisibility.hidden, - this.ownVisibility, - final List cards = const []}) - : _cards = cards, - super._(); - - factory _$GameDeckImpl.fromJson(Map json) => - _$$GameDeckImplFromJson(json); - - @override - @JsonKey() - final String name; - @override - @JsonKey() - final DeckVisibility visibility; - @override - final DeckVisibility? ownVisibility; - final List _cards; - @override - @JsonKey() - List get cards { - if (_cards is EqualUnmodifiableListView) return _cards; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_cards); - } - - @override - String toString() { - return 'GameDeck(name: $name, visibility: $visibility, ownVisibility: $ownVisibility, cards: $cards)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$GameDeckImpl && - (identical(other.name, name) || other.name == name) && - (identical(other.visibility, visibility) || - other.visibility == visibility) && - (identical(other.ownVisibility, ownVisibility) || - other.ownVisibility == ownVisibility) && - const DeepCollectionEquality().equals(other._cards, _cards)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => Object.hash(runtimeType, name, visibility, ownVisibility, - const DeepCollectionEquality().hash(_cards)); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$GameDeckImplCopyWith<_$GameDeckImpl> get copyWith => - __$$GameDeckImplCopyWithImpl<_$GameDeckImpl>(this, _$identity); - - @override - Map toJson() { - return _$$GameDeckImplToJson( - this, - ); - } -} - -abstract class _GameDeck extends GameDeck { - const factory _GameDeck( - {final String name, - final DeckVisibility visibility, - final DeckVisibility? ownVisibility, - final List cards}) = _$GameDeckImpl; - const _GameDeck._() : super._(); - - factory _GameDeck.fromJson(Map json) = - _$GameDeckImpl.fromJson; - - @override - String get name; - @override - DeckVisibility get visibility; - @override - DeckVisibility? get ownVisibility; - @override - List get cards; - @override - @JsonKey(ignore: true) - _$$GameDeckImplCopyWith<_$GameDeckImpl> get copyWith => - throw _privateConstructorUsedError; -} diff --git a/app/lib/logic/state.g.dart b/app/lib/logic/state.g.dart deleted file mode 100644 index 112f9ed..0000000 --- a/app/lib/logic/state.g.dart +++ /dev/null @@ -1,149 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'state.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -_$ClassicGameCardImpl _$$ClassicGameCardImplFromJson(Map json) => - _$ClassicGameCardImpl( - color: - $enumDecodeNullable(_$ClassicGameCardColorEnumMap, json['color']) ?? - ClassicGameCardColor.heart, - number: (json['number'] as num?)?.toInt() ?? 1, - $type: json['type'] as String?, - ); - -Map _$$ClassicGameCardImplToJson( - _$ClassicGameCardImpl instance) => - { - 'color': _$ClassicGameCardColorEnumMap[instance.color]!, - 'number': instance.number, - 'type': instance.$type, - }; - -const _$ClassicGameCardColorEnumMap = { - ClassicGameCardColor.heart: 'heart', - ClassicGameCardColor.diamond: 'diamond', - ClassicGameCardColor.spade: 'spade', - ClassicGameCardColor.club: 'club', -}; - -_$BackgroundGameCardImpl _$$BackgroundGameCardImplFromJson(Map json) => - _$BackgroundGameCardImpl( - $type: json['type'] as String?, - ); - -Map _$$BackgroundGameCardImplToJson( - _$BackgroundGameCardImpl instance) => - { - 'type': instance.$type, - }; - -_$GameStateImpl _$$GameStateImplFromJson(Map json) => _$GameStateImpl( - decks: (json['decks'] as List?) - ?.map( - (e) => GameDeck.fromJson(Map.from(e as Map))) - .toList() ?? - const [], - seats: (json['seats'] as List?) - ?.map( - (e) => GameSeat.fromJson(Map.from(e as Map))) - .toList() ?? - const [], - ); - -Map _$$GameStateImplToJson(_$GameStateImpl instance) => - { - 'decks': instance.decks.map((e) => e.toJson()).toList(), - 'seats': instance.seats.map((e) => e.toJson()).toList(), - }; - -_$GameSeatImpl _$$GameSeatImplFromJson(Map json) => _$GameSeatImpl( - name: json['name'] as String? ?? '', - decks: (json['decks'] as List?) - ?.map( - (e) => GameDeck.fromJson(Map.from(e as Map))) - .toList() ?? - const [], - players: (json['players'] as List?) - ?.map((e) => (e as num).toInt()) - .toList() ?? - const [], - ownDeckVisibility: $enumDecodeNullable( - _$DeckVisibilityEnumMap, json['ownDeckVisibility']), - ); - -Map _$$GameSeatImplToJson(_$GameSeatImpl instance) => - { - 'name': instance.name, - 'decks': instance.decks.map((e) => e.toJson()).toList(), - 'players': instance.players, - 'ownDeckVisibility': _$DeckVisibilityEnumMap[instance.ownDeckVisibility], - }; - -const _$DeckVisibilityEnumMap = { - DeckVisibility.hidden: 'hidden', - DeckVisibility.onlyTop: 'onlyTop', - DeckVisibility.visible: 'visible', -}; - -_$DeckRefillNoneImpl _$$DeckRefillNoneImplFromJson(Map json) => - _$DeckRefillNoneImpl( - $type: json['type'] as String?, - ); - -Map _$$DeckRefillNoneImplToJson( - _$DeckRefillNoneImpl instance) => - { - 'type': instance.$type, - }; - -_$DeckRefillShuffleImpl _$$DeckRefillShuffleImplFromJson(Map json) => - _$DeckRefillShuffleImpl( - count: (json['count'] as num?)?.toInt(), - $type: json['type'] as String?, - ); - -Map _$$DeckRefillShuffleImplToJson( - _$DeckRefillShuffleImpl instance) => - { - 'count': instance.count, - 'type': instance.$type, - }; - -_$DeckRefillFirstImpl _$$DeckRefillFirstImplFromJson(Map json) => - _$DeckRefillFirstImpl( - count: (json['count'] as num?)?.toInt(), - $type: json['type'] as String?, - ); - -Map _$$DeckRefillFirstImplToJson( - _$DeckRefillFirstImpl instance) => - { - 'count': instance.count, - 'type': instance.$type, - }; - -_$GameDeckImpl _$$GameDeckImplFromJson(Map json) => _$GameDeckImpl( - name: json['name'] as String? ?? '', - visibility: - $enumDecodeNullable(_$DeckVisibilityEnumMap, json['visibility']) ?? - DeckVisibility.hidden, - ownVisibility: - $enumDecodeNullable(_$DeckVisibilityEnumMap, json['ownVisibility']), - cards: (json['cards'] as List?) - ?.map( - (e) => GameCard.fromJson(Map.from(e as Map))) - .toList() ?? - const [], - ); - -Map _$$GameDeckImplToJson(_$GameDeckImpl instance) => - { - 'name': instance.name, - 'visibility': _$DeckVisibilityEnumMap[instance.visibility]!, - 'ownVisibility': _$DeckVisibilityEnumMap[instance.ownVisibility], - 'cards': instance.cards.map((e) => e.toJson()).toList(), - }; diff --git a/app/lib/main.dart b/app/lib/main.dart index 8863e55..88ca336 100644 --- a/app/lib/main.dart +++ b/app/lib/main.dart @@ -7,12 +7,10 @@ import 'package:go_router/go_router.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_web_plugins/url_strategy.dart'; import 'package:material_leap/l10n/leap_localizations.dart'; -import 'package:qeck/logic/connection/client.dart'; -import 'package:qeck/pages/board/page.dart'; -import 'package:qeck/pages/game/page.dart'; -import 'package:qeck/pages/home/page.dart'; -import 'package:qeck/services/network.dart'; -import 'package:qeck/theme.dart'; +import 'package:quokka/pages/board/page.dart'; +import 'package:quokka/pages/home/page.dart'; +import 'package:quokka/services/network.dart'; +import 'package:quokka/theme.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter_localized_locales/flutter_localized_locales.dart'; import 'package:window_manager/window_manager.dart'; @@ -44,7 +42,7 @@ Future main(List args) async { value: settingsCubit, child: RepositoryProvider( create: (context) => NetworkingService(settingsCubit), - child: QeckApp(), + child: QuokkaApp(), ), ), ); @@ -74,8 +72,8 @@ List getLocales() => .where((l) => !kUnsupportedLanguages.contains(l.toString())) .toList(); -class QeckApp extends StatelessWidget { - QeckApp({super.key}); +class QuokkaApp extends StatelessWidget { + QuokkaApp({super.key}); @override Widget build(BuildContext context) { @@ -88,7 +86,7 @@ class QeckApp extends StatelessWidget { Widget _buildApp(ColorScheme? lightDynamic, ColorScheme? darkDynamic) { final virtualWindowFrameBuilder = VirtualWindowFrameInit(); - return BlocBuilder( + return BlocBuilder( buildWhen: (previous, current) => previous.design != current.design || previous.theme != current.theme || @@ -123,20 +121,6 @@ class QeckApp extends StatelessWidget { pageBuilder: _fadeTransitionBuilder((context, state) => const HomePage()), routes: [ - GoRoute( - path: 'game', - pageBuilder: _fadeTransitionBuilder( - (context, state) { - if (state.extra is! ClientGameConnection) { - context.go('/'); - return const SizedBox.shrink(); - } - return GamePage( - connection: state.extra as ClientGameConnection, - ); - }, - ), - ), GoRoute( path: 'board', pageBuilder: _fadeTransitionBuilder( @@ -158,6 +142,6 @@ class QeckApp extends StatelessWidget { const flavor = String.fromEnvironment('flavor'); const isNightly = flavor == 'nightly' || flavor == 'dev' || flavor == 'development'; -const shortApplicationName = isNightly ? 'Qeck Nightly' : 'Qeck'; +const shortApplicationName = isNightly ? 'Quokka Nightly' : 'Quokka'; const applicationName = 'Linwood $shortApplicationName'; const applicationMinorVersion = '1.0'; diff --git a/app/lib/models/deck.dart b/app/lib/models/deck.dart index e6d0a21..6938df2 100644 --- a/app/lib/models/deck.dart +++ b/app/lib/models/deck.dart @@ -1,5 +1,5 @@ import 'package:dart_mappable/dart_mappable.dart'; -import 'package:qeck/models/vector.dart'; +import 'package:quokka/models/vector.dart'; part 'deck.mapper.dart'; diff --git a/app/lib/models/message.dart b/app/lib/models/message.dart index 89f2c74..e3dd1df 100644 --- a/app/lib/models/message.dart +++ b/app/lib/models/message.dart @@ -1,5 +1,5 @@ import 'package:dart_mappable/dart_mappable.dart'; -import 'package:qeck/models/state.dart'; +import 'package:quokka/models/state.dart'; part 'message.mapper.dart'; diff --git a/app/lib/models/object.dart b/app/lib/models/object.dart index 0b9efa3..45a1cef 100644 --- a/app/lib/models/object.dart +++ b/app/lib/models/object.dart @@ -1,5 +1,5 @@ import 'package:dart_mappable/dart_mappable.dart'; -import 'package:qeck/models/vector.dart'; +import 'package:quokka/models/vector.dart'; part 'object.mapper.dart'; diff --git a/app/lib/models/pack.dart b/app/lib/models/pack.dart index f1ec3e9..029e124 100644 --- a/app/lib/models/pack.dart +++ b/app/lib/models/pack.dart @@ -3,9 +3,9 @@ import 'dart:convert'; import 'package:archive/archive.dart'; import 'package:flutter/services.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:qeck/models/deck.dart'; -import 'package:qeck/models/meta.dart'; -import 'package:qeck/models/object.dart'; +import 'package:quokka/models/deck.dart'; +import 'package:quokka/models/meta.dart'; +import 'package:quokka/models/object.dart'; const kPackMetadataPath = 'pack.json'; const kPackDecksPath = 'decks'; diff --git a/app/lib/pages/board/connect.dart b/app/lib/pages/board/connect.dart index 6f42ed1..8af482e 100644 --- a/app/lib/pages/board/connect.dart +++ b/app/lib/pages/board/connect.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:qeck/services/network.dart'; +import 'package:quokka/services/network.dart'; class ConnectGameDialog extends StatelessWidget { final TextEditingController _urlController = TextEditingController(); diff --git a/app/lib/pages/board/create.dart b/app/lib/pages/board/create.dart index 425036f..fe8a206 100644 --- a/app/lib/pages/board/create.dart +++ b/app/lib/pages/board/create.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:qeck/services/network.dart'; +import 'package:quokka/services/network.dart'; class CreateGameDialog extends StatelessWidget { final TextEditingController _portController = TextEditingController(); diff --git a/app/lib/pages/board/page.dart b/app/lib/pages/board/page.dart index eef3b3a..0f7807a 100644 --- a/app/lib/pages/board/page.dart +++ b/app/lib/pages/board/page.dart @@ -4,15 +4,15 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:go_router/go_router.dart'; import 'package:phosphor_flutter/phosphor_flutter.dart'; -import 'package:qeck/api/settings.dart'; -import 'package:qeck/game/world/game.dart'; -import 'package:qeck/main.dart'; -import 'package:qeck/pages/board/connect.dart'; -import 'package:qeck/pages/board/create.dart'; -import 'package:qeck/pages/board/servers.dart'; -import 'package:qeck/services/messenger.dart'; -import 'package:qeck/services/network.dart'; -import 'package:qeck/widgets/window.dart'; +import 'package:quokka/api/settings.dart'; +import 'package:quokka/game/world/game.dart'; +import 'package:quokka/main.dart'; +import 'package:quokka/pages/board/connect.dart'; +import 'package:quokka/pages/board/create.dart'; +import 'package:quokka/pages/board/servers.dart'; +import 'package:quokka/services/messenger.dart'; +import 'package:quokka/services/network.dart'; +import 'package:quokka/widgets/window.dart'; class BoardPage extends StatelessWidget { final GlobalKey _scaffoldKey = GlobalKey(); diff --git a/app/lib/pages/board/servers.dart b/app/lib/pages/board/servers.dart index 60c6ebe..b6418bb 100644 --- a/app/lib/pages/board/servers.dart +++ b/app/lib/pages/board/servers.dart @@ -1,21 +1,21 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:phosphor_flutter/phosphor_flutter.dart'; -import 'package:qeck/models/info.dart'; +import 'package:quokka/models/info.dart'; const ServersInfo serversInfo = ServersInfo( official: [ ServerInfo( name: 'Official Server', - description: 'The official Qeck server', - address: 'qeck.linwood.dev', + description: 'The official Quokka server', + address: 'quokka.linwood.dev', ), ], community: [ ServerInfo( name: 'Community Server', - description: 'The community Qeck server', - address: 'qeck.linwood.dev', + description: 'The community Quokka server', + address: 'quokka.linwood.dev', ), ], ); diff --git a/app/lib/pages/game/card.dart b/app/lib/pages/game/card.dart deleted file mode 100644 index 12dc6ea..0000000 --- a/app/lib/pages/game/card.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:qeck/logic/state.dart'; - -class CardView extends StatelessWidget { - final GameCard card; - - const CardView({required this.card, super.key}); - - @override - Widget build(BuildContext context) { - return Container( - height: 96, - width: 64, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - border: Border.all( - color: Theme.of(context).colorScheme.primaryContainer, - width: 2, - ), - ), - alignment: Alignment.center, - child: Text(card.toString(), style: const TextStyle(fontSize: 10)), - ); - } -} diff --git a/app/lib/pages/game/cards.dart b/app/lib/pages/game/cards.dart deleted file mode 100644 index d1a478e..0000000 --- a/app/lib/pages/game/cards.dart +++ /dev/null @@ -1,337 +0,0 @@ -import 'package:collection/collection.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:phosphor_flutter/phosphor_flutter.dart'; - -import '../../logic/connection/client.dart'; -import '../../logic/connection/logic.dart'; -import '../../logic/state.dart'; - -class CardsOperationDialog extends StatelessWidget { - final ClientGameConnection connection; - final List cards; - - const CardsOperationDialog( - {super.key, required this.cards, required this.connection}); - - @override - Widget build(BuildContext context) { - int? deckIndex, seatIndex; - bool showRemove = - cards.whereNot((element) => element is AvailableCardIndex).isNotEmpty; - return StatefulBuilder( - builder: (context, setState) => AlertDialog( - title: Text(AppLocalizations.of(context).cardsOperation), - content: SizedBox( - width: 500, - height: 500, - child: DefaultTabController( - length: showRemove ? 3 : 2, - child: Column( - children: [ - TabBar(tabs: [ - Tab( - text: AppLocalizations.of(context).moveToDeck, - ), - Tab( - text: AppLocalizations.of(context).moveToSeatDeck, - ), - if (showRemove) - Tab( - text: AppLocalizations.of(context).remove, - ), - ]), - Expanded( - child: TabBarView( - children: [ - ListView(children: [ - DropdownButtonFormField( - decoration: InputDecoration( - labelText: - AppLocalizations.of(context).deck, - filled: true, - icon: const PhosphorIcon( - PhosphorIconsLight.textT), - ), - items: connection.state.decks - .asMap() - .entries - .map((e) => DropdownMenuItem( - value: e.key, - child: Text(e.value.name))) - .toList(), - onChanged: (value) => setState(() { - deckIndex = value; - seatIndex = null; - }), - ), - ElevatedButton( - onPressed: () { - if (deckIndex == null) return; - connection.addCards(cards, deckIndex!); - Navigator.pop(context); - }, - child: Text( - AppLocalizations.of(context).move, - ), - ) - ]), - ListView(children: [ - DropdownButtonFormField( - decoration: InputDecoration( - labelText: - AppLocalizations.of(context).seat, - filled: true, - icon: const PhosphorIcon( - PhosphorIconsLight.user), - ), - items: connection.state.seats - .asMap() - .entries - .map((e) => DropdownMenuItem( - value: e.key, - child: Text(e.value.name))) - .toList(), - onChanged: (value) => setState(() { - seatIndex = value; - deckIndex = null; - }), - ), - DropdownButtonFormField( - decoration: InputDecoration( - labelText: - AppLocalizations.of(context).deck, - filled: true, - icon: const PhosphorIcon( - PhosphorIconsLight.textT), - ), - items: seatIndex == null - ? [] - : connection - .state.seats[seatIndex!].decks - .asMap() - .entries - .map((e) => DropdownMenuItem( - value: e.key, - child: Text(e.value.name))) - .toList(), - onChanged: (value) { - deckIndex = value; - }, - ), - ElevatedButton( - onPressed: () { - if (deckIndex == null || - seatIndex == null) { - return; - } - connection.addCards( - cards, deckIndex!, seatIndex!); - Navigator.pop(context); - }, - child: Text( - AppLocalizations.of(context).move, - ), - ) - ]), - if (showRemove) - ListView(children: [ - ElevatedButton( - onPressed: () { - connection.removeCards(cards); - Navigator.pop(context); - }, - child: Text( - AppLocalizations.of(context).remove, - ), - ) - ]), - ], - ), - ) - ], - ))), - )); - } -} - -class PutCardsDialog extends StatelessWidget { - final ClientGameConnection connection; - final int deckIndex; - final int? seatIndex; - - const PutCardsDialog( - {super.key, - required this.connection, - required this.deckIndex, - this.seatIndex}); - - @override - Widget build(BuildContext context) { - int? movedDeckIndex, movedSeatIndex; - var count = 1; - var location = PickLocation.top; - return StatefulBuilder( - builder: (context, setState) => AlertDialog( - title: Text(AppLocalizations.of(context).putCards), - content: SizedBox( - width: 500, - height: 500, - child: Column( - children: [ - DropdownButtonFormField( - decoration: InputDecoration( - labelText: AppLocalizations.of(context).location, - filled: true, - icon: const PhosphorIcon(PhosphorIconsLight.textT), - ), - items: PickLocation.values - .map((e) => - DropdownMenuItem(value: e, child: Text(e.name))) - .toList(), - onChanged: (value) => location = value ?? location, - ), - TextFormField( - decoration: InputDecoration( - labelText: AppLocalizations.of(context).count, - filled: true, - icon: const PhosphorIcon(PhosphorIconsLight.textT), - ), - initialValue: count.toString(), - onChanged: (value) => - count = int.tryParse(value) ?? count, - ), - Expanded( - child: DefaultTabController( - length: 2, - child: Column( - children: [ - TabBar(tabs: [ - Tab( - text: - AppLocalizations.of(context).moveToDeck, - ), - Tab( - text: AppLocalizations.of(context) - .moveToSeatDeck, - ), - ]), - Expanded( - child: TabBarView( - children: [ - ListView(children: [ - DropdownButtonFormField( - decoration: InputDecoration( - labelText: - AppLocalizations.of(context) - .deck, - filled: true, - icon: const PhosphorIcon( - PhosphorIconsLight.textT), - ), - items: connection.state.decks - .asMap() - .entries - .map((e) => DropdownMenuItem( - value: e.key, - child: Text(e.value.name))) - .toList(), - onChanged: (value) => setState(() { - movedDeckIndex = value; - movedSeatIndex = null; - }), - ), - ElevatedButton( - onPressed: () { - if (movedDeckIndex == null) return; - connection.putCards( - deckIndex, - seatIndex, - location, - count, - movedDeckIndex!, - null); - Navigator.pop(context); - }, - child: Text( - AppLocalizations.of(context).move, - ), - ) - ]), - ListView(children: [ - DropdownButtonFormField( - decoration: InputDecoration( - labelText: - AppLocalizations.of(context) - .seat, - filled: true, - icon: const PhosphorIcon( - PhosphorIconsLight.user), - ), - items: connection.state.seats - .asMap() - .entries - .map((e) => DropdownMenuItem( - value: e.key, - child: Text(e.value.name))) - .toList(), - onChanged: (value) => setState(() { - movedSeatIndex = value; - movedDeckIndex = null; - }), - ), - DropdownButtonFormField( - decoration: InputDecoration( - labelText: - AppLocalizations.of(context) - .deck, - filled: true, - icon: const PhosphorIcon( - PhosphorIconsLight.textT), - ), - items: movedSeatIndex == null - ? [] - : connection.state - .seats[movedSeatIndex!].decks - .asMap() - .entries - .map((e) => DropdownMenuItem( - value: e.key, - child: - Text(e.value.name))) - .toList(), - onChanged: (value) { - movedDeckIndex = value; - }, - ), - ElevatedButton( - onPressed: () { - if (movedDeckIndex == null || - movedSeatIndex == null) { - return; - } - connection.putCards( - deckIndex, - seatIndex, - location, - count, - movedDeckIndex!, - movedSeatIndex!); - Navigator.pop(context); - }, - child: Text( - AppLocalizations.of(context).move, - ), - ) - ]), - ], - ), - ) - ], - )), - ), - ], - )), - )); - } -} diff --git a/app/lib/pages/game/deck.dart b/app/lib/pages/game/deck.dart deleted file mode 100644 index f4c373e..0000000 --- a/app/lib/pages/game/deck.dart +++ /dev/null @@ -1,437 +0,0 @@ -import 'package:collection/collection.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:phosphor_flutter/phosphor_flutter.dart'; -import 'package:qeck/logic/connection/client.dart'; -import 'package:qeck/logic/connection/logic.dart'; -import 'package:qeck/logic/state.dart'; -import 'package:qeck/pages/game/card.dart'; - -import 'cards.dart'; - -class DeckLocation { - final GameDeck deck; - final int? index; - final int? seatIndex; - - DeckLocation(this.deck, this.index, this.seatIndex); -} - -class CardLocation { - final GameCard card; - final int index; - final DeckLocation location; - - CardLocation(this.card, this.index, this.location); -} - -class GameDeckView extends StatelessWidget { - final GameDeck deck; - final int? index; - final int? seatIndex; - final ClientGameConnection connection; - - const GameDeckView({ - super.key, - required this.deck, - required this.index, - required this.connection, - required this.seatIndex, - }); - - @override - Widget build(BuildContext context) { - final firstCard = deck.cards.firstOrNull; - return SizedBox( - width: 150, - child: Card( - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - if (firstCard != null) - Expanded( - child: InkWell( - onTap: () => showDialog( - context: context, - builder: (context) => CardDeckDialog( - deck: deck, - index: index, - connection: connection, - seatIndex: seatIndex)), - child: CardView( - card: firstCard, - ), - ), - ), - Row(children: [ - Expanded( - child: Text( - deck.name, - overflow: TextOverflow.ellipsis, - )), - MenuAnchor( - builder: (context, controller, child) => IconButton( - icon: const PhosphorIcon(PhosphorIconsLight.list), - onPressed: () => controller.isOpen - ? controller.close() - : controller.open(), - ), - menuChildren: [ - MenuItemButton( - child: Text(AppLocalizations.of(context).moveCards), - onPressed: () { - final indexes = deck.cards.asMap().entries.map((e) { - if (index == null) { - return AvailableCardIndex(e.value); - } - if (seatIndex == null) { - return DeckCardIndex(e.key, index!); - } - return SeatCardIndex(e.key, index!, seatIndex!); - }).toList(); - showDialog( - context: context, - builder: (context) => CardsOperationDialog( - cards: indexes, - connection: connection, - ), - ); - }, - ), - if (index != null) ...[ - MenuItemButton( - child: Text(AppLocalizations.of(context).shuffle), - onPressed: () { - connection.shuffle(index!, seatIndex); - }, - ), - MenuItemButton( - child: Text(AppLocalizations.of(context).putCards), - onPressed: () { - showDialog( - context: context, - builder: (context) => PutCardsDialog( - deckIndex: index!, - seatIndex: seatIndex, - connection: connection, - ), - ); - }, - ), - MenuItemButton( - child: - Text(AppLocalizations.of(context).changeVisibility), - onPressed: () { - showDialog( - context: context, - builder: (context) => ChangeVisibilityDeckDialog( - connection: connection, - index: index!, - seatIndex: seatIndex, - ), - ); - }, - ), - MenuItemButton( - child: Text(AppLocalizations.of(context).remove), - onPressed: () { - connection.removeDeck(index!, seatIndex); - }, - ), - ], - ], - ), - ]), - ], - ), - ), - ), - ); - } -} - -class CardDeckDialog extends StatelessWidget { - final GameDeck deck; - final int? index; - final int? seatIndex; - final ClientGameConnection connection; - - const CardDeckDialog({ - super.key, - required this.deck, - required this.index, - required this.connection, - required this.seatIndex, - }); - - @override - Widget build(BuildContext context) { - return Stack( - children: [ - Align( - child: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 500, maxHeight: 500), - child: Card( - child: Padding( - padding: const EdgeInsets.all(8.0), - child: SingleChildScrollView( - child: StreamBuilder( - stream: connection.stateStream, - builder: (context, snapshot) { - if (!snapshot.hasData) { - return const SizedBox(); - } - final state = snapshot.data; - var realDeck = deck; - if (seatIndex != null) { - realDeck = state!.seats[seatIndex!].decks[index!]; - } else if (index != null) { - realDeck = state!.decks[index!]; - } - return Wrap( - spacing: 8, - runSpacing: 8, - children: realDeck.cards - .asMap() - .entries - .map((e) => InkWell( - onTap: () { - CardIndex cardIndex; - if (index == null) { - cardIndex = AvailableCardIndex(e.value); - } else if (seatIndex == null) { - cardIndex = - DeckCardIndex(e.key, index!); - } else { - cardIndex = SeatCardIndex( - e.key, index!, seatIndex!); - } - showDialog( - context: context, - builder: (context) => - CardsOperationDialog( - cards: [cardIndex], - connection: connection)); - }, - child: CardView( - card: e.value, - ), - )) - .toList(), - ); - }), - ), - ), - ), - ), - ), - ], - ); - } -} - -class AddDeckView extends StatelessWidget { - final ClientGameConnection connection; - final int? seatIndex; - const AddDeckView({super.key, required this.connection, this.seatIndex}); - - @override - Widget build(BuildContext context) { - return SizedBox( - width: 150, - child: Card( - clipBehavior: Clip.antiAlias, - child: InkWell( - onTap: () => showDialog( - context: context, - builder: (context) => AddDeckDialog( - connection: connection, - seatIndex: seatIndex, - ), - ), - child: const Padding( - padding: EdgeInsets.all(8.0), - child: Align( - child: PhosphorIcon(PhosphorIconsLight.plus, size: 32), - ), - ), - ), - ), - ); - } -} - -class AddDeckDialog extends StatelessWidget { - final ClientGameConnection connection; - final int? seatIndex; - - const AddDeckDialog({super.key, required this.connection, this.seatIndex}); - - @override - Widget build(BuildContext context) { - GameDeck deck = const GameDeck(); - return AlertDialog( - title: Text(AppLocalizations.of(context).addDeck), - scrollable: true, - content: SizedBox( - width: 500, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - TextField( - decoration: InputDecoration( - labelText: AppLocalizations.of(context).name, - ), - onChanged: (value) => deck = deck.copyWith(name: value), - ), - DropdownButtonFormField( - decoration: InputDecoration( - labelText: AppLocalizations.of(context).visibility, - ), - value: deck.visibility, - items: DeckVisibility.values - .map((e) => DropdownMenuItem( - value: e, - child: Text(e.name), - )) - .toList(), - onChanged: (value) => - deck = deck.copyWith(visibility: value ?? deck.visibility), - ), - if (seatIndex != null) - StatefulBuilder( - builder: (context, setState) => Row( - children: [ - Expanded( - child: DropdownButtonFormField( - decoration: InputDecoration( - labelText: AppLocalizations.of(context).ownVisibility, - ), - value: deck.ownVisibility, - items: DeckVisibility.values - .map((e) => DropdownMenuItem( - value: e, - child: Text(e.name), - )) - .toList(), - onChanged: (value) => setState( - () => deck = deck.copyWith(ownVisibility: value)), - ), - ), - const SizedBox(width: 16), - IconButton( - icon: const PhosphorIcon(PhosphorIconsLight.trash), - onPressed: () => setState( - () => deck = deck.copyWith(ownVisibility: null)), - ), - ], - ), - ), - ], - ), - ), - actions: [ - TextButton( - onPressed: () => Navigator.of(context).pop(), - child: Text(AppLocalizations.of(context).cancel), - ), - ElevatedButton( - onPressed: () { - connection.addDeck(deck, seatIndex); - Navigator.of(context).pop(); - }, - child: Text(AppLocalizations.of(context).create), - ), - ], - ); - } -} - -class ChangeVisibilityDeckDialog extends StatelessWidget { - final ClientGameConnection connection; - final int index; - final int? seatIndex; - - const ChangeVisibilityDeckDialog({ - super.key, - required this.connection, - required this.index, - this.seatIndex, - }); - - @override - Widget build(BuildContext context) { - var deck = seatIndex == null - ? connection.state.decks[index] - : connection.state.seats[seatIndex!].decks[index]; - var visibility = deck.visibility; - var ownVisiblity = deck.ownVisibility; - return AlertDialog( - title: Text(AppLocalizations.of(context).changeVisibility), - scrollable: true, - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - DropdownButtonFormField( - decoration: InputDecoration( - labelText: AppLocalizations.of(context).visibility, - ), - value: visibility, - items: DeckVisibility.values - .map((e) => DropdownMenuItem( - value: e, - child: Text(e.name), - )) - .toList(), - onChanged: (value) { - visibility = value ?? visibility; - }, - ), - if (seatIndex != null) - StatefulBuilder( - builder: (context, setState) => Row( - children: [ - Expanded( - child: DropdownButtonFormField( - decoration: InputDecoration( - labelText: AppLocalizations.of(context).ownVisibility, - ), - value: ownVisiblity, - items: DeckVisibility.values - .map((e) => DropdownMenuItem( - value: e, - child: Text(e.name), - )) - .toList(), - onChanged: (value) => - setState(() => ownVisiblity = value), - ), - ), - const SizedBox(width: 16), - IconButton( - icon: const PhosphorIcon(PhosphorIconsLight.trash), - onPressed: () => setState(() => ownVisiblity = null), - ), - ], - ), - ), - ], - ), - actions: [ - TextButton( - onPressed: () => Navigator.of(context).pop(), - child: Text(AppLocalizations.of(context).cancel), - ), - ElevatedButton( - onPressed: () { - connection.changeVisibility(index, seatIndex, visibility); - Navigator.of(context).pop(); - }, - child: Text(AppLocalizations.of(context).change), - ), - ], - ); - } -} diff --git a/app/lib/pages/game/page.dart b/app/lib/pages/game/page.dart deleted file mode 100644 index 8aae3bf..0000000 --- a/app/lib/pages/game/page.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:phosphor_flutter/phosphor_flutter.dart'; -import 'package:qeck/pages/game/view.dart'; -import 'package:qeck/widgets/window.dart'; - -import '../../logic/connection/client.dart'; -import 'players.dart'; - -class GamePage extends StatefulWidget { - final ClientGameConnection connection; - - const GamePage({super.key, required this.connection}); - - @override - State createState() => _GamePageState(); -} - -class _GamePageState extends State { - @override - void initState() { - super.initState(); - } - - @override - void dispose() { - widget.connection.close(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: WindowTitleBar( - title: Text(AppLocalizations.of(context).game), - actions: [ - IconButton( - icon: const PhosphorIcon(PhosphorIconsLight.users), - onPressed: () => showDialog( - context: context, - builder: (context) => - PlayersDialog(connection: widget.connection), - ), - ), - IconButton( - icon: const PhosphorIcon(PhosphorIconsLight.door), - onPressed: () => Navigator.of(context).pop(), - ), - ], - ), - body: GameView( - connection: widget.connection, - ), - ); - } -} diff --git a/app/lib/pages/game/players.dart b/app/lib/pages/game/players.dart deleted file mode 100644 index 8d10c62..0000000 --- a/app/lib/pages/game/players.dart +++ /dev/null @@ -1,32 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; - -import '../../logic/connection/logic.dart'; - -class PlayersDialog extends StatelessWidget { - final GameConnection connection; - - const PlayersDialog({super.key, required this.connection}); - - @override - Widget build(BuildContext context) { - return AlertDialog( - title: Text(AppLocalizations.of(context).players), - scrollable: true, - content: SizedBox( - width: 500, - child: Column( - mainAxisSize: MainAxisSize.min, - children: connection.players - .map( - (player) => ListTile( - title: Text(player.name), - subtitle: Text(player.id.toString()), - ), - ) - .toList(), - ), - ), - ); - } -} diff --git a/app/lib/pages/game/seat.dart b/app/lib/pages/game/seat.dart deleted file mode 100644 index 1e9aec1..0000000 --- a/app/lib/pages/game/seat.dart +++ /dev/null @@ -1,162 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:phosphor_flutter/phosphor_flutter.dart'; -import 'package:qeck/logic/connection/client.dart'; -import 'package:qeck/logic/state.dart'; - -import 'deck.dart'; - -class SeatView extends StatelessWidget { - final ClientGameConnection connection; - final GameSeat seat; - final int index; - - const SeatView({ - super.key, - required this.connection, - required this.seat, - required this.index, - }); - - @override - Widget build(BuildContext context) { - return Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text(seat.name), - SizedBox( - height: 150, - child: ListView( - shrinkWrap: true, - scrollDirection: Axis.horizontal, - children: [ - ...seat.decks.asMap().entries.map((e) => GameDeckView( - connection: connection, - deck: e.value, - index: e.key, - seatIndex: index, - )), - AddDeckView(connection: connection, seatIndex: index), - ], - ), - ), - ], - ); - } -} - -class SeatsDialog extends StatelessWidget { - final ClientGameConnection connection; - - const SeatsDialog({super.key, required this.connection}); - - @override - Widget build(BuildContext context) { - return AlertDialog( - title: Text(AppLocalizations.of(context).seats), - scrollable: true, - content: SizedBox( - width: 300, - child: StreamBuilder( - stream: connection.stateStream, - builder: (context, snapshot) { - final state = snapshot.data; - return Column( - mainAxisSize: MainAxisSize.min, - children: [ - ...(state?.seats.asMap().entries.map( - (e) { - final seat = e.value; - final selected = - seat.players.contains(connection.playerId); - return ListTile( - title: Text(seat.name), - selected: selected, - leading: selected - ? IconButton( - icon: const PhosphorIcon( - PhosphorIconsLight.door), - onPressed: () => - connection.leaveSeat(e.key), - ) - : IconButton( - icon: const PhosphorIcon( - PhosphorIconsLight.doorOpen), - onPressed: () => connection.joinSeat(e.key), - ), - trailing: IconButton( - icon: - const PhosphorIcon(PhosphorIconsLight.trash), - onPressed: () => connection.removeSeat(e.key), - ), - ); - }, - ) ?? - []), - if (state?.seats.isNotEmpty ?? false) const Divider(), - ListTile( - title: Text(AppLocalizations.of(context).create), - trailing: const Icon(Icons.add), - onTap: () { - showDialog( - context: context, - builder: (context) => - CreateSeatDialog(connection: connection)); - }, - ), - ], - ); - }), - ), - actions: [ - TextButton( - onPressed: () => Navigator.of(context).pop(), - child: Text(AppLocalizations.of(context).close), - ), - ], - ); - } -} - -class CreateSeatDialog extends StatelessWidget { - final ClientGameConnection connection; - const CreateSeatDialog({super.key, required this.connection}); - - @override - Widget build(BuildContext context) { - String name = ''; - return AlertDialog( - title: Text(AppLocalizations.of(context).addSeat), - scrollable: true, - content: SizedBox( - width: 500, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - TextFormField( - decoration: InputDecoration( - labelText: AppLocalizations.of(context).name, - filled: true, - icon: const PhosphorIcon(PhosphorIconsLight.textT), - ), - onChanged: (value) => name = value, - ), - ], - ), - ), - actions: [ - TextButton( - onPressed: () => Navigator.of(context).pop(), - child: Text(AppLocalizations.of(context).cancel), - ), - ElevatedButton( - onPressed: () { - connection.addSeat(name); - Navigator.of(context).pop(); - }, - child: Text(AppLocalizations.of(context).create), - ), - ], - ); - } -} diff --git a/app/lib/pages/game/view.dart b/app/lib/pages/game/view.dart deleted file mode 100644 index 91fe8d5..0000000 --- a/app/lib/pages/game/view.dart +++ /dev/null @@ -1,133 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:phosphor_flutter/phosphor_flutter.dart'; -import 'package:qeck/logic/connection/client.dart'; -import 'package:qeck/logic/state.dart'; - -import 'deck.dart'; -import 'seat.dart'; - -class GameView extends StatelessWidget { - final ClientGameConnection connection; - - const GameView({super.key, required this.connection}); - - @override - Widget build(BuildContext context) { - bool showOtherSeats = false; - return StreamBuilder( - stream: connection.stateStream, - builder: (context, snapshot) { - final state = snapshot.data; - if (state == null) { - return const Align( - alignment: Alignment.center, - child: CircularProgressIndicator()); - } - return StatefulBuilder( - builder: (context, setState) => ListView( - shrinkWrap: true, - children: [ - Text(AppLocalizations.of(context).available, - style: Theme.of(context).textTheme.headlineSmall), - SizedBox( - height: 180, - child: ListView( - shrinkWrap: true, - scrollDirection: Axis.horizontal, - children: [ - GameDeckView( - connection: connection, - deck: GameDeck( - cards: GameCard.getClassicDeck(), - name: AppLocalizations.of(context).classic), - index: null, - seatIndex: null, - ), - ], - ), - ), - const SizedBox(height: 16), - Text(AppLocalizations.of(context).decks, - style: Theme.of(context).textTheme.headlineSmall), - SizedBox( - height: 150, - child: ListView( - shrinkWrap: true, - scrollDirection: Axis.horizontal, - children: [ - ...state.decks.asMap().entries.map((e) => GameDeckView( - connection: connection, - deck: e.value, - index: e.key, - seatIndex: null, - )), - AddDeckView(connection: connection), - ], - ), - ), - const SizedBox(height: 16), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text(AppLocalizations.of(context).seats, - style: Theme.of(context).textTheme.headlineSmall), - IconButton( - icon: const PhosphorIcon(PhosphorIconsLight.gear), - onPressed: () => showDialog( - context: context, - builder: (context) => SeatsDialog( - connection: connection, - )), - ), - ], - ), - ...connection.getMySeats().asMap().entries.expand((se) => [ - const SizedBox(height: 16), - SeatView( - connection: connection, - seat: se.value, - index: se.key, - ), - ]), - // Add other seats - ExpansionPanelList( - expansionCallback: (index, isExpanded) { - setState(() { - showOtherSeats = !showOtherSeats; - }); - }, - children: [ - ExpansionPanel( - headerBuilder: (context, isExpanded) => ListTile( - title: Text(AppLocalizations.of(context).otherSeats), - ), - body: ListView( - shrinkWrap: true, - children: [ - ...state.seats - .asMap() - .entries - .where((e) => !e.value.players - .contains(connection.playerId)) - .map((e) => Padding( - padding: const EdgeInsets.symmetric( - vertical: 8.0), - child: SeatView( - connection: connection, - seat: e.value, - index: e.key, - ), - )), - ], - ), - isExpanded: showOtherSeats, - ), - ], - ) - ], - ), - ); - }); - } -} diff --git a/app/lib/pages/game/widget.dart b/app/lib/pages/game/widget.dart deleted file mode 100644 index 8b13789..0000000 --- a/app/lib/pages/game/widget.dart +++ /dev/null @@ -1 +0,0 @@ - diff --git a/app/lib/pages/home/connect.dart b/app/lib/pages/home/connect.dart deleted file mode 100644 index 18d3cf9..0000000 --- a/app/lib/pages/home/connect.dart +++ /dev/null @@ -1,68 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:phosphor_flutter/phosphor_flutter.dart'; -import 'package:qeck/services/network.dart'; - -class ConnectGameDialog extends StatelessWidget { - const ConnectGameDialog({super.key}); - - @override - Widget build(BuildContext context) { - var currentAddress = ''; - var port = kDefaultPort; - bool secure = false; - return AlertDialog( - title: Text(AppLocalizations.of(context).create), - scrollable: true, - content: SizedBox( - width: 500, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - StatefulBuilder( - builder: (context, setState) => CheckboxListTile( - title: Text(AppLocalizations.of(context).secure), - value: secure, - onChanged: (value) => - setState(() => secure = value ?? secure), - )), - TextFormField( - decoration: InputDecoration( - labelText: AppLocalizations.of(context).address, - filled: true, - icon: const PhosphorIcon(PhosphorIconsLight.textT), - ), - initialValue: currentAddress, - onChanged: (value) => currentAddress = value, - ), - const SizedBox(height: 16), - TextFormField( - decoration: InputDecoration( - labelText: AppLocalizations.of(context).port, - filled: true, - icon: const PhosphorIcon(PhosphorIconsLight.textT), - ), - initialValue: port.toString(), - onChanged: (value) => port = int.tryParse(value) ?? port, - ), - ], - ), - ), - actions: [ - TextButton( - onPressed: () => Navigator.of(context).pop(), - child: Text(AppLocalizations.of(context).cancel), - ), - ElevatedButton( - onPressed: () => Navigator.of(context).pop(Uri( - scheme: secure ? 'wss' : 'ws', - host: currentAddress, - port: port, - path: '/connect', - )), - child: Text(AppLocalizations.of(context).create), - ), - ], - ); - } -} diff --git a/app/lib/pages/home/create.dart b/app/lib/pages/home/create.dart deleted file mode 100644 index 1c3971a..0000000 --- a/app/lib/pages/home/create.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:phosphor_flutter/phosphor_flutter.dart'; -import 'package:qeck/models/server.dart'; - -class CreateGameDialog extends StatelessWidget { - const CreateGameDialog({super.key}); - - @override - Widget build(BuildContext context) { - var currentProperty = const GameProperty(); - return AlertDialog( - title: Text(AppLocalizations.of(context).create), - scrollable: true, - content: SizedBox( - width: 500, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - TextFormField( - decoration: InputDecoration( - labelText: AppLocalizations.of(context).name, - filled: true, - icon: const PhosphorIcon(PhosphorIconsLight.textT), - ), - initialValue: currentProperty.name, - onChanged: (value) => - currentProperty = currentProperty.copyWith(name: value), - ), - const SizedBox(height: 16), - TextFormField( - decoration: InputDecoration( - labelText: AppLocalizations.of(context).description, - border: const OutlineInputBorder(), - icon: const PhosphorIcon(PhosphorIconsLight.fileText), - ), - initialValue: currentProperty.description, - onChanged: (value) => currentProperty = - currentProperty.copyWith(description: value), - ), - ], - ), - ), - actions: [ - TextButton( - onPressed: () => Navigator.of(context).pop(), - child: Text(AppLocalizations.of(context).cancel), - ), - ElevatedButton( - onPressed: () => Navigator.of(context).pop(currentProperty), - child: Text(AppLocalizations.of(context).create), - ), - ], - ); - } -} diff --git a/app/lib/pages/home/page.dart b/app/lib/pages/home/page.dart index 86f469d..05e35cf 100644 --- a/app/lib/pages/home/page.dart +++ b/app/lib/pages/home/page.dart @@ -1,19 +1,14 @@ -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:go_router/go_router.dart'; import 'package:phosphor_flutter/phosphor_flutter.dart'; -import 'package:qeck/main.dart'; -import 'package:qeck/models/server.dart'; -import 'package:qeck/services/network.dart'; -import 'package:qeck/widgets/window.dart'; +import 'package:quokka/main.dart'; +import 'package:quokka/models/server.dart'; +import 'package:quokka/services/network.dart'; +import 'package:quokka/widgets/window.dart'; import '../../api/settings.dart'; -import '../../logic/connection/client.dart'; -import '../../logic/connection/server.dart'; -import 'connect.dart'; -import 'create.dart'; class HomePage extends StatelessWidget { const HomePage({super.key}); @@ -52,41 +47,6 @@ class HomePage extends StatelessWidget { PhosphorIconsLight.gridNine, () => context.push('/board'), ), - ( - AppLocalizations.of(context).connect, - PhosphorIconsLight.globe, - () async { - final address = await showDialog( - context: context, - builder: (context) => const ConnectGameDialog(), - ); - if (address == null) return; - if (context.mounted) { - final connection = - ClientGameConnection.connect(address); - context.push('/game', extra: connection); - } - }, - ), - if (!kIsWeb) - ( - AppLocalizations.of(context).create, - PhosphorIconsLight.plus, - () async { - final property = await showDialog( - context: context, - builder: (context) => const CreateGameDialog(), - ); - if (property == null) return; - if (context.mounted) { - final connection = - await ClientServerGameConnection.create(); - if (context.mounted) { - context.push('/game', extra: connection); - } - } - }, - ), ] .map((e) => SizedBox( height: 200, diff --git a/app/lib/pages/settings/general.dart b/app/lib/pages/settings/general.dart index 852dbc1..f084301 100644 --- a/app/lib/pages/settings/general.dart +++ b/app/lib/pages/settings/general.dart @@ -5,10 +5,10 @@ import 'package:flutter/material.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:phosphor_flutter/phosphor_flutter.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:quokka/api/open.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:http/http.dart' as http; -import '../../api/open_release_notes.dart'; import '../../widgets/window.dart'; @immutable diff --git a/app/lib/pages/settings/packs.dart b/app/lib/pages/settings/packs.dart index e732b30..f5ea51c 100644 --- a/app/lib/pages/settings/packs.dart +++ b/app/lib/pages/settings/packs.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:qeck/cubits/settings.dart'; -import 'package:qeck/widgets/window.dart'; +import 'package:quokka/cubits/settings.dart'; +import 'package:quokka/widgets/window.dart'; class PacksSettingsPage extends StatelessWidget { final bool inView; @@ -21,7 +21,7 @@ class PacksSettingsPage extends StatelessWidget { backgroundColor: inView ? Colors.transparent : null, title: Text(AppLocalizations.of(context).packs), ), - body: BlocBuilder( + body: BlocBuilder( builder: (context, state) { return ListView(children: const []); }, diff --git a/app/lib/pages/settings/page.dart b/app/lib/pages/settings/page.dart index 7f8fd53..0b57463 100644 --- a/app/lib/pages/settings/page.dart +++ b/app/lib/pages/settings/page.dart @@ -5,7 +5,7 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; import 'package:material_leap/material_leap.dart'; import 'package:phosphor_flutter/phosphor_flutter.dart'; -import 'package:qeck/pages/settings/packs.dart'; +import 'package:quokka/pages/settings/packs.dart'; import 'package:url_launcher/url_launcher.dart'; import 'general.dart'; diff --git a/app/lib/pages/settings/personalization.dart b/app/lib/pages/settings/personalization.dart index 38723d7..0846890 100644 --- a/app/lib/pages/settings/personalization.dart +++ b/app/lib/pages/settings/personalization.dart @@ -37,7 +37,7 @@ class PersonalizationSettingsPage extends StatelessWidget { backgroundColor: inView ? Colors.transparent : null, title: Text(AppLocalizations.of(context).personalization), ), - body: BlocBuilder( + body: BlocBuilder( builder: (context, state) { final design = state.design; return ListView(children: [ diff --git a/app/lib/services/client.dart b/app/lib/services/client.dart index 0603d8c..324f78a 100644 --- a/app/lib/services/client.dart +++ b/app/lib/services/client.dart @@ -1,6 +1,6 @@ import 'package:networker/networker.dart'; -import 'package:qeck/models/message.dart'; -import 'package:qeck/services/messenger.dart'; +import 'package:quokka/models/message.dart'; +import 'package:quokka/services/messenger.dart'; mixin GenericClientMessenger on NetworkMessenger { void sendUpdate(NetworkUpdateMessage event) { diff --git a/app/lib/services/messenger.dart b/app/lib/services/messenger.dart index 4151525..eff141f 100644 --- a/app/lib/services/messenger.dart +++ b/app/lib/services/messenger.dart @@ -2,8 +2,8 @@ import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:networker/networker.dart'; -import 'package:qeck/models/message.dart'; -import 'package:qeck/models/state.dart'; +import 'package:quokka/models/message.dart'; +import 'package:quokka/models/state.dart'; import 'package:rxdart/rxdart.dart'; abstract class NetworkMessenger { diff --git a/app/lib/services/network.dart b/app/lib/services/network.dart index a49fe24..67c6160 100644 --- a/app/lib/services/network.dart +++ b/app/lib/services/network.dart @@ -4,10 +4,10 @@ import 'package:device_info_plus/device_info_plus.dart'; import 'package:flutter/foundation.dart'; import 'package:networker_socket/client.dart'; import 'package:networker_socket/server.dart'; -import 'package:qeck/cubits/settings.dart'; -import 'package:qeck/models/server.dart'; -import 'package:qeck/services/client.dart'; -import 'package:qeck/services/server.dart'; +import 'package:quokka/cubits/settings.dart'; +import 'package:quokka/models/server.dart'; +import 'package:quokka/services/client.dart'; +import 'package:quokka/services/server.dart'; import 'package:rxdart/rxdart.dart'; enum NetworkingSide { diff --git a/app/lib/services/packs.dart b/app/lib/services/packs.dart index d89e192..f195a04 100644 --- a/app/lib/services/packs.dart +++ b/app/lib/services/packs.dart @@ -1,5 +1,5 @@ import 'package:collection/collection.dart'; -import 'package:qeck/models/pack.dart'; +import 'package:quokka/models/pack.dart'; class PacksService { final PackData? _corePack; diff --git a/app/lib/services/server.dart b/app/lib/services/server.dart index 2f966f6..77b7d7b 100644 --- a/app/lib/services/server.dart +++ b/app/lib/services/server.dart @@ -1,8 +1,8 @@ import 'package:networker/networker.dart'; -import 'package:qeck/models/message.dart'; -import 'package:qeck/models/state.dart'; -import 'package:qeck/services/client.dart'; -import 'package:qeck/services/messenger.dart'; +import 'package:quokka/models/message.dart'; +import 'package:quokka/models/state.dart'; +import 'package:quokka/services/client.dart'; +import 'package:quokka/services/messenger.dart'; class ServerMessenger extends NetworkMessenger { @override diff --git a/app/lib/setup_io.dart b/app/lib/setup_io.dart index 2264368..79c1477 100644 --- a/app/lib/setup_io.dart +++ b/app/lib/setup_io.dart @@ -1,7 +1,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; -import 'package:qeck/main.dart'; +import 'package:quokka/main.dart'; import 'package:window_manager/window_manager.dart'; import 'cubits/settings.dart'; diff --git a/app/lib/widgets/window.dart b/app/lib/widgets/window.dart index cd5750b..d33c7bd 100644 --- a/app/lib/widgets/window.dart +++ b/app/lib/widgets/window.dart @@ -38,7 +38,7 @@ class WindowTitleBar extends StatelessWidget implements PreferredSizeWidget { @override Widget build(BuildContext context) { - return BlocBuilder( + return BlocBuilder( buildWhen: (previous, current) => previous.nativeTitleBar != current.nativeTitleBar, builder: (context, settings) { @@ -136,7 +136,7 @@ class _WindowButtonsState extends State with WindowListener { @override @override Widget build(BuildContext context) { - return BlocBuilder( + return BlocBuilder( buildWhen: (previous, current) => previous.nativeTitleBar != current.nativeTitleBar, builder: (context, settings) { diff --git a/app/linux/CMakeLists.txt b/app/linux/CMakeLists.txt index 9d1d91e..19a9552 100644 --- a/app/linux/CMakeLists.txt +++ b/app/linux/CMakeLists.txt @@ -4,10 +4,10 @@ project(runner LANGUAGES CXX) # The name of the executable created for the application. Change this to change # the on-disk name of your application. -set(BINARY_NAME "qeck") +set(BINARY_NAME "quokka") # The unique GTK application identifier for this application. See: # https://wiki.gnome.org/HowDoI/ChooseApplicationID -set(APPLICATION_ID "dev.linwood.qeck") +set(APPLICATION_ID "dev.linwood.quokka") # Explicitly opt in to modern CMake behaviors to avoid warnings with recent # versions of CMake. diff --git a/app/linux/debian/DEBIAN/control b/app/linux/debian/DEBIAN/control index 7e1126b..a089b93 100644 --- a/app/linux/debian/DEBIAN/control +++ b/app/linux/debian/DEBIAN/control @@ -1,9 +1,9 @@ -Package: linwood-qeck +Package: linwood-quokka Version: 1.0.0 Section: base Priority: optional -Homepage: https://github.com/LinwoodDev/Qeck +Homepage: https://github.com/LinwoodDev/Quokka Architecture: amd64 Maintainer: Linwood -Description: Linwood Qeck +Description: Linwood Quokka Play games everywhere you like diff --git a/app/linux/debian/usr/share/applications/dev.linwood.qeck.desktop b/app/linux/debian/usr/share/applications/dev.linwood.quokka.desktop similarity index 64% rename from app/linux/debian/usr/share/applications/dev.linwood.qeck.desktop rename to app/linux/debian/usr/share/applications/dev.linwood.quokka.desktop index bbb01fa..0dd77a0 100644 --- a/app/linux/debian/usr/share/applications/dev.linwood.qeck.desktop +++ b/app/linux/debian/usr/share/applications/dev.linwood.quokka.desktop @@ -1,8 +1,8 @@ [Desktop Entry] -Name=Linwood Qeck +Name=Linwood Quokka Comment=Play games everywhere you like -Exec=qeck %f -Icon=dev.linwood.qeck +Exec=quokka %f +Icon=dev.linwood.quokka Terminal=false Type=Application Categories=Game; diff --git a/app/linux/debian/usr/share/metainfo/dev.linwood.qeck.appdata.xml b/app/linux/debian/usr/share/metainfo/dev.linwood.quokka.appdata.xml similarity index 57% rename from app/linux/debian/usr/share/metainfo/dev.linwood.qeck.appdata.xml rename to app/linux/debian/usr/share/metainfo/dev.linwood.quokka.appdata.xml index f8dfdaa..a10cf9b 100644 --- a/app/linux/debian/usr/share/metainfo/dev.linwood.qeck.appdata.xml +++ b/app/linux/debian/usr/share/metainfo/dev.linwood.quokka.appdata.xml @@ -1,7 +1,7 @@ - dev.linwood.qeck - Linwood Qeck + dev.linwood.quokka + Linwood Quokka Linwood Play games everywhere you like CC0-1.0 @@ -15,18 +15,18 @@ #d0d0d0 #2f2f2f - https://qeck.linwood.dev/ - https://github.com/LinwoodDev/Qeck/issues - https://qeck.linwood.dev/docs/latest/intro - https://linwood.dev/qeck/crowdin - https://github.com/LinwoodDev/Qeck.git - https://github.com/LinwoodDev/Qeck/blob/develop/CONTRIBUTING.md + https://quokka.linwood.dev/ + https://github.com/LinwoodDev/Quokka/issues + https://quokka.linwood.dev/docs/latest/intro + https://linwood.dev/quokka/crowdin + https://github.com/LinwoodDev/Quokka.git + https://github.com/LinwoodDev/Quokka/blob/develop/CONTRIBUTING.md

Coming soon...

- dev.linwood.qeck.desktop + dev.linwood.quokka.desktop diff --git a/app/linux/my_application.cc b/app/linux/my_application.cc index 4e9fb30..cbc5697 100644 --- a/app/linux/my_application.cc +++ b/app/linux/my_application.cc @@ -40,11 +40,11 @@ static void my_application_activate(GApplication* application) { if (use_header_bar) { GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); gtk_widget_show(GTK_WIDGET(header_bar)); - gtk_header_bar_set_title(header_bar, "Qeck"); + gtk_header_bar_set_title(header_bar, "Quokka"); gtk_header_bar_set_show_close_button(header_bar, TRUE); gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); } else { - gtk_window_set_title(window, "Qeck"); + gtk_window_set_title(window, "Quokka"); } gtk_window_set_default_size(window, 1280, 720); @@ -81,6 +81,24 @@ static gboolean my_application_local_command_line(GApplication* application, gch return TRUE; } +// Implements GApplication::startup. +static void my_application_startup(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application startup. + + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); +} + +// Implements GApplication::shutdown. +static void my_application_shutdown(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application shutdown. + + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); +} + // Implements GObject::dispose. static void my_application_dispose(GObject* object) { MyApplication* self = MY_APPLICATION(object); @@ -91,6 +109,8 @@ static void my_application_dispose(GObject* object) { static void my_application_class_init(MyApplicationClass* klass) { G_APPLICATION_CLASS(klass)->activate = my_application_activate; G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; + G_APPLICATION_CLASS(klass)->startup = my_application_startup; + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; G_OBJECT_CLASS(klass)->dispose = my_application_dispose; } diff --git a/app/linux/rpm/linwood-qeck.desktop b/app/linux/rpm/linwood-qeck.desktop deleted file mode 100644 index 2461c0d..0000000 --- a/app/linux/rpm/linwood-qeck.desktop +++ /dev/null @@ -1,8 +0,0 @@ -[Desktop Entry] -Name=Linwood Qeck -Comment=Play games everywhere you like -Exec=/usr/bin/linwood-qeck %f -Icon=/usr/share/linwood-qeck/data/flutter_assets/images/logo.svg -Terminal=false -Type=Application -Categories=Game; diff --git a/app/linux/rpm/linwood-quokka.desktop b/app/linux/rpm/linwood-quokka.desktop new file mode 100644 index 0000000..68cb0ed --- /dev/null +++ b/app/linux/rpm/linwood-quokka.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Name=Linwood Quokka +Comment=Play games everywhere you like +Exec=/usr/bin/linwood-quokka %f +Icon=/usr/share/linwood-quokka/data/flutter_assets/images/logo.svg +Terminal=false +Type=Application +Categories=Game; diff --git a/app/linux/rpm/linwood-qeck.spec b/app/linux/rpm/linwood-quokka.spec similarity index 90% rename from app/linux/rpm/linwood-qeck.spec rename to app/linux/rpm/linwood-quokka.spec index 42540c1..d91aa2c 100644 --- a/app/linux/rpm/linwood-qeck.spec +++ b/app/linux/rpm/linwood-quokka.spec @@ -1,9 +1,9 @@ -Name: linwood-qeck +Name: linwood-quokka Version: 1.0.0 Release: 1%{?dist} Summary: Play games everywhere you like BuildArch: x86_64 -URL: https://github.com/LinwoodDev/Qeck +URL: https://github.com/LinwoodDev/Quokka License: AGPLv3 Source0: %{name}-%{version}.tar.gz diff --git a/app/macos/Runner.xcodeproj/project.pbxproj b/app/macos/Runner.xcodeproj/project.pbxproj index b2af3cd..c280228 100644 --- a/app/macos/Runner.xcodeproj/project.pbxproj +++ b/app/macos/Runner.xcodeproj/project.pbxproj @@ -64,7 +64,7 @@ 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; - 33CC10ED2044A3C60003C045 /* qeck.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "qeck.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10ED2044A3C60003C045 /* quokka.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "quokka.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; @@ -131,7 +131,7 @@ 33CC10EE2044A3C60003C045 /* Products */ = { isa = PBXGroup; children = ( - 33CC10ED2044A3C60003C045 /* qeck.app */, + 33CC10ED2044A3C60003C045 /* quokka.app */, 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, ); name = Products; @@ -217,7 +217,7 @@ ); name = Runner; productName = Runner; - productReference = 33CC10ED2044A3C60003C045 /* qeck.app */; + productReference = 33CC10ED2044A3C60003C045 /* quokka.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -226,8 +226,9 @@ 33CC10E52044A3C60003C045 /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1430; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 331C80D4294CF70F00263BE5 = { @@ -384,10 +385,10 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = dev.linwood.qeck.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = dev.linwood.quokka.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/qeck.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/qeck"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/quokka.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/quokka"; }; name = Debug; }; @@ -398,10 +399,10 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = dev.linwood.qeck.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = dev.linwood.quokka.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/qeck.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/qeck"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/quokka.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/quokka"; }; name = Release; }; @@ -412,10 +413,10 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = dev.linwood.qeck.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = dev.linwood.quokka.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/qeck.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/qeck"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/quokka.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/quokka"; }; name = Profile; }; @@ -424,6 +425,7 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -447,9 +449,11 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CODE_SIGN_IDENTITY = "-"; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -497,6 +501,7 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -520,9 +525,11 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CODE_SIGN_IDENTITY = "-"; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -550,6 +557,7 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -573,9 +581,11 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CODE_SIGN_IDENTITY = "-"; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; diff --git a/app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 3f1a2ab..021250e 100644 --- a/app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ @@ -31,7 +31,7 @@ @@ -65,7 +65,7 @@ @@ -82,7 +82,7 @@ diff --git a/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png index 0b62d3384ff87552cb615c48d51c2689ae910620..82b6f9d9a33e198f5747104729e1fcef999772a5 100644 GIT binary patch literal 102994 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ⅅ8MglG&ER{i5lN315cO?EdHNLrg? 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 z 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 Pe7HEdAEg|=c=LY&YVNkY literal 57348 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 literal 3965 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 delta 332 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 diff --git a/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png index e7dd5460d10adaa068c29bf8c9ddc9a96e78b395..f083318e09ca1b6b8484b1694a149f0c5d5cac1d 100644 GIT binary patch delta 1045 zcmV+w1nT?m1*!;;B!2;OQb$4nuFf3k0000)WmrjOO-%qQ0000800D<-00aO400961 z02%-Q00003paB2_0000100961paK8{000010000WpaTE|000010000W00000tcGIq z000A&Nkl_eXrXo-RW*y6RQ_qc-=H=A?c;3LR zPZqcs4|_FSX!f8&UYanliaOJh&A8eN3a@lv&cN+xB7e1F;n3pOaI8+t2hOH844FWg zn9S|TIUlC5GkB8nE>ho6q2efk2g@Dvo;{tK-H-{`2D1(MoxvEqcQ$U@@BxpClMx;M z?2|%vUT@nN$^_QU9Nq?^*2*~rEKDfuQ*pLQFBEpm!Qp>V1i0D+C`cd@RN$M}@H3uF6T(s$bi5v~_fWMfnE7Vn z%2*tqV|?~m;wSJEVGkNMD>+xCu#um(7}0soSEu7?_=Q64Q5D+fz~T=Rr=G_!L*P|( z-iOK*@X8r{-?oBlnxMNNgCVCN9Y~ocu+?XAjjovJ9F1W$Nf!{AEv%W~8oahwM}4Ru zcz@2sf9yd)fUc^kBbbA47zW0NMzQpMI%o1?I%EQ_5fGErRx0Q{;6bxbgF#XF`sy{7 z-cF#SX9&YDri59(rwv0UV87a2rm68OxV&G-o)6<#d^3gwZTjVef%fhpJbO7MHiV0} z?f%Ny1uJe|a(^|ExPGJ#k$^XKKJW+07k`RKXU`Li5Q#j(--#KKBfz_$XsN9VqVM8i z?9i>6;Dc&C(qvp!KnLV`>_^(pUv)vD$^P8%^A~@R2Uux+@eD|A*Qdtf7LXE!9FT9jr0N zNNMc@Vxb)d<{rNbLqU{zz+hbTOMc0OaOa%+ojZ5tHZ^V4|9@HlS_miMBf`XN83GZl zK&bf7G~p*)L@Qy@E4+^wfcZ5Ll?S?AHfXIrBndRIjABmL>R&B^d zH3Lo~;xcLY=4EsQ#5{JwM%;TZAthBE_FT=tTO$Tu$7FPkiN6_mFqK6*t2!*8W+0?T zm^at+UB=Dv41XMD2A)o5krbKM@Q9j$Sv{GL%$LMF74hD%goL&@FG0;fRCVTx_zer~e>p@~73x6A74d(FWCo{*uVw&ML2^3fR zlQ3U!g`0m{W4KG3j+K75juz;mn1odZX672;v%LR7qRb_%DsBIoWat^o9? zT9WHp146Y?%VZ)c7Oodk442=CI6JhCR`15<%yo!s8qnN`VwCMUkBBoQewsK%w2+Bt zLN?_o(0?=#r`*pEOL^gD;^fN|jy(3lAN*{Jfry?v@CfW98JrkM;aIO9d)xbP*zP71 zb9HaUA-&UBBomjOO<)g+@3y+I>zWIPZ2fpQIR{q9%gASBON;+VqPhD;UVP_OCw36W zJKT8_wZ4v>M)%d&LIOugl#6d~cVgR>J{+X$nNUx$nm$M_pz+nFX23!WHc;H7`FXB< zmJc>a{D9uGfkin?xQS8a@%-Ciq#A-UCcrc2ZP$G;*{XkCzW^@mxkeb&A(Q|B002ov JPDHLkV1mdrUS0qI diff --git a/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png index 908c19760439b40f1d5e1fb7181ecf596d27fee4..326c0e72c9d820600887813b3b98d0dd69c5d4e8 100644 GIT binary patch literal 36406 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 literal 22526 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 AkN^Mx diff --git a/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png index 714f8f3a01eb6121de05ff6c8957446b3eb5b633..2f1632cfddf3d9dade342351e627a0a75609fb46 100644 GIT binary patch delta 2206 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.3.0 <4.0.0" + dart: ">=3.4.0 <4.0.0" flutter: ">=3.19.0" diff --git a/app/pubspec.yaml b/app/pubspec.yaml index 99b5da6..cf569dc 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -1,4 +1,4 @@ -name: qeck +name: quokka description: Play games without internet # The following defines the version and build number for your application. @@ -24,20 +24,17 @@ dependencies: sdk: flutter flutter_web_plugins: sdk: flutter - intl: ^0.18.1 + intl: any flutter_localized_locales: ^2.0.5 # Engine flame: ^1.17.0 flame_tiled: ^1.20.1 # UI - phosphor_flutter: - git: - url: https://github.com/CodeDoctorDE/phosphor-flutter - ref: f370dd2c25d3ea51ffb8f1c7c183bc9f33889c82 + phosphor_flutter: ^2.1.0 material_leap: git: url: https://github.com/LinwoodDev/dart_pkgs.git - ref: 9338503df442df2e9a156511de1e93dfee8c4257 + ref: ff93bce26d1f8d5160cbfe66b548cf9286d0576d path: packages/material_leap flex_color_scheme: ^7.2.0 flutter_svg: ^2.0.10+1 @@ -64,9 +61,9 @@ dependencies: path: packages/networker/networker_socket # Information device_info_plus: ^10.1.0 - package_info_plus: ^7.0.0 + package_info_plus: ^8.0.0 path_provider: ^2.1.3 - go_router: ^13.2.4 + go_router: ^14.1.3 json_annotation: ^4.9.0 dynamic_color: ^1.7.0 rxdart: ^0.27.7 @@ -79,7 +76,7 @@ dev_dependencies: flutter_test: sdk: flutter build_runner: ^2.4.9 - flutter_lints: ^3.0.2 + flutter_lints: ^4.0.0 freezed: ^2.5.2 json_serializable: ^6.7.1 dart_mappable_builder: ^4.2.3 diff --git a/app/scripts/build-rpm.sh b/app/scripts/build-rpm.sh index 2dc1a96..22ba297 100644 --- a/app/scripts/build-rpm.sh +++ b/app/scripts/build-rpm.sh @@ -1,25 +1,25 @@ # Read version from pubspec -QECK_VERSION_REGEX="version:\s(.+)\+(.+)" -[[ $(grep -E "${QECK_VERSION_REGEX}" pubspec.yaml) =~ ${QECK_VERSION_REGEX} ]] -QECK_VERSION="${BASH_REMATCH[1]}" +QUOKKA_VERSION_REGEX="version:\s(.+)\+(.+)" +[[ $(grep -E "${QUOKKA_VERSION_REGEX}" pubspec.yaml) =~ ${QUOKKA_VERSION_REGEX} ]] +QUOKKA_VERSION="${BASH_REMATCH[1]}" # Replace - with ~ to match RPM versioning -RPM_VERSION=$(echo $QECK_VERSION | sed 's/-/~/g') +RPM_VERSION=$(echo $QUOKKA_VERSION | sed 's/-/~/g') CURRENT_DIR=$(pwd) -echo "Building Qeck $RPM_VERSION" +echo "Building Quokka $RPM_VERSION" rm -rf build/{BUILD,RPMS,SOURCES,SPECS,SRPMS} mkdir -p build/{BUILD,RPMS,SOURCES,SPECS,SRPMS} # Copy files -cp linux/rpm/linwood-qeck.spec build/SPECS/linwood-qeck.spec -cp -r build/linux/x64/release/bundle build/SOURCES/linwood-qeck-$RPM_VERSION -chmod 755 build/SOURCES/linwood-qeck-$RPM_VERSION/qeck -mv build/SOURCES/linwood-qeck-$RPM_VERSION/qeck build/SOURCES/linwood-qeck-$RPM_VERSION/linwood-qeck -cp linux/rpm/linwood-qeck.desktop build/SOURCES/linwood-qeck-$RPM_VERSION/linwood-qeck.desktop +cp linux/rpm/linwood-quokka.spec build/SPECS/linwood-quokka.spec +cp -r build/linux/x64/release/bundle build/SOURCES/linwood-quokka-$RPM_VERSION +chmod 755 build/SOURCES/linwood-quokka-$RPM_VERSION/quokka +mv build/SOURCES/linwood-quokka-$RPM_VERSION/quokka build/SOURCES/linwood-quokka-$RPM_VERSION/linwood-quokka +cp linux/rpm/linwood-quokka.desktop build/SOURCES/linwood-quokka-$RPM_VERSION/linwood-quokka.desktop # Change second line of spec file Version: to match version -sed -i "2s/.*/Version: $RPM_VERSION/" build/SPECS/linwood-qeck.spec +sed -i "2s/.*/Version: $RPM_VERSION/" build/SPECS/linwood-quokka.spec # Create tar cd build/SOURCES/ # Fix .so files using patchelf -cd linwood-qeck-$RPM_VERSION/lib +cd linwood-quokka-$RPM_VERSION/lib for file in *.so; do PATCHELF_OUTPUT=$(patchelf --print-rpath $file) echo "Checking $file: $PATCHELF_OUTPUT" @@ -32,9 +32,9 @@ for file in *.so; do patchelf --set-rpath '$ORIGIN' $file done cd ../../ -tar --create --file linwood-qeck-$RPM_VERSION.tar.gz linwood-qeck-$RPM_VERSION +tar --create --file linwood-quokka-$RPM_VERSION.tar.gz linwood-quokka-$RPM_VERSION cd ../../ # Build RPM -QA_RPATHS=$[ 0x0001|0x0010 ] rpmbuild -bb build/SPECS/linwood-qeck.spec --define "_topdir $(pwd)/build" +QA_RPATHS=$[ 0x0001|0x0010 ] rpmbuild -bb build/SPECS/linwood-quokka.spec --define "_topdir $(pwd)/build" # Copy RPM to build folder -cp build/RPMS/x86_64/linwood-qeck-*.rpm build/linwood-qeck-linux-x86_64.rpm \ No newline at end of file +cp build/RPMS/x86_64/linwood-quokka-*.rpm build/linwood-quokka-linux-x86_64.rpm \ No newline at end of file diff --git a/app/scripts/build.sh b/app/scripts/build.sh index 20f73b1..d291642 100644 --- a/app/scripts/build.sh +++ b/app/scripts/build.sh @@ -1,3 +1,3 @@ FLUTTER_VERSION=$(cat ../FLUTTER_VERSION) -QECK_FLAVOR=$([[ "$QECK_NIGHTLY" == "true" ]] && echo "nightly" || echo "stable") -if [ "$QECK_NIGHTLY" = "true" ]; then cp -r web_nightly/** web; fi && if cd flutter; then git pull && cd ..; else git clone https://github.com/flutter/flutter.git -b $FLUTTER_VERSION; fi && flutter/bin/flutter config --enable-web && flutter/bin/flutter pub get && flutter/bin/dart run build_runner build --delete-conflicting-outputs && flutter/bin/flutter build web --release --dart-define=FLUTTER_WEB_CANVASKIT_URL=/canvaskit/ --dart-define=flavor=$QECK_FLAVOR \ No newline at end of file +QUOKKA_FLAVOR=$([[ "$QUOKKA_NIGHTLY" == "true" ]] && echo "nightly" || echo "stable") +if [ "$QUOKKA_NIGHTLY" = "true" ]; then cp -r web_nightly/** web; fi && if cd flutter; then git pull && cd ..; else git clone https://github.com/flutter/flutter.git -b $FLUTTER_VERSION; fi && flutter/bin/flutter config --enable-web && flutter/bin/flutter pub get && flutter/bin/dart run build_runner build --delete-conflicting-outputs && flutter/bin/flutter build web --release --dart-define=FLUTTER_WEB_CANVASKIT_URL=/canvaskit/ --dart-define=flavor=$QUOKKA_FLAVOR \ No newline at end of file diff --git a/app/scripts/start.bat b/app/scripts/start.bat index 326e525..5559c8f 100644 --- a/app/scripts/start.bat +++ b/app/scripts/start.bat @@ -1,2 +1,2 @@ @ECHO OFF -START "" "%~dp0qeck.exe" --path "%~dp0UserData" +START "" "%~dp0quokka.exe" --path "%~dp0UserData" diff --git a/app/scripts/start.sh b/app/scripts/start.sh index 127befc..e29acc9 100644 --- a/app/scripts/start.sh +++ b/app/scripts/start.sh @@ -1,2 +1,2 @@ #!/bin/sh -./qeck --path ./UserData +./quokka --path ./UserData diff --git a/app/web/favicon.png b/app/web/favicon.png index 94e35ed805b1904d6fb83e820b4f8ed66e5ebeff..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 100644 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM delta 390 zcmV;10eSwF2eSi^B#|){e`QHTK~y-)jg!Ai!%z^%-_Xs`NpSKXa1!(n5OfrDauQLT zoZS?3bQ2UoCpTRL@h4hswWd@-9CQ#x5RDeaSZkWsm*l=4O@b|^Ngmvid!O&!eREGB z<`Dfw*b#AX+_$Czu7C03&B5}m!qSbx#=U~=CJ+eVyzZbYVhr>p3XfY49TY kF@>%{=~`Tzg` diff --git a/app/web/icons/Icon-192.png b/app/web/icons/Icon-192.png index 19521d694251741c724a7f6f8dbae3a3b2afb7e2..b749bfef07473333cf1dd31e9eed89862a5d52aa 100644 GIT binary patch literal 5292 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 literal 1759 zcmai#dsxz08pnS?k`|QBq$rJ!)+lD7tESFY2qTV{RY#me1ux?osEwLQnTj{EHniGA zQ_yOZYE{C*8AdaVWXIM}sl;Y5F|f^4@InseC8cc4%j}=~d_V7bpXYp^bI$j#_Y@Pp z@q=$dZUO)R9^miu?Q;M3$1(;luj)1fVY!(c^Cuk#0H<9a3zSuhJqZBN(g2^Y!m@uzHw&tr)h0Nn>y0 zs$jTPT>urW$^}>x)Mi}|f&Z+^f>Ee?arlxI;$c+&xk=Gm%?1Xn@7K5L$Z1v57aeASqe{2g*Vx_#yhT>DI7 zKi*asO`Gvy{rH{W>$oCXF@2jlGd13j-EH?(2qo>6!CQ&NL?CiY}nFX!CPaf++ z?9#ee5c<$>A_dh;Gp%k9S_%$c&9n#ON5|8{H8mcMJnEoKfoVuw6uCv?eJ9exb(}qv zLD#8~R?VcidJNTcfYNH6=w5I?&>sD!A^LocDa=Iv>ejS#CAp5;#!1$Hnk1uW)5AYR zsL%?bO}E*A)h9QkE<=GHh?c!~Y5$1xFSC}GH!l2;OfnwX)I@Ec`4XDfdpC#qeGfBC zz6 zl0FO>pNr}_N4AeGIfnCM?>T>fa@x9!K`#_xERjN=l1QBTmkClGbxvDq;vlD~r?-%5 z{cO0^KOXG~hAZp*kleIG+q6~5r1zW$cg9Mg+95^pMr<*ZAWqf_)K>TNB#_Q5{0=NU zs^_xcnyNLtc_A)8CTFU4JL6I8l;T9?*`b(-rs}7s`O_Gp`sBP|E8Q6m6tSswnx+O# z|5fYe=9pAn=ZoxaYkWM`A9jtJta^TEV*JRr71A)`75>p0D5b)-3)^knL|vRqNei_z z5IgSi$ItZr46qE5PhDSPgWxvj;*p?kUV*rBWtRzzsQru zMo|6ghBD%J<2)>cLx}F&6wki;<%oR@3P^71~;m~^FV zvvEeB&)hN`?#VaQ94Zm>tqTs#2SUE@YdmERCNCNXq*lc+gvnJ6sCrr>S%OdPzhRv! zPiyn|JQCo!<8eEuSQ(7)0by36WBog7v%pt9e_`Nl8FV<7`_!IzGSbc*ygxe-vlFf~ zc6h_?zy^(!>xyp&^V-R3X9S@)*^O~Wd>gxgpH#K@84vyG{+&??ySYK+(Q(mZ#c{v% zy^_C~^#z0Ip=LVbl|h1C+D$Ywv0zD2+OcbNi*j?)0(*=WJVClrWELjf$4#6~ws~(N zw@8?hm@J{&{WeOnGn`-+^FS5vn+*w4 zbGnv9r6-ucjD-ETd{5)PlT%Lb$*AmuHlFb?P*NLphZnLlz(dda5*U4m>!;7gxGCth9tv4DWDzwr@x#})noJMA8~ diff --git a/app/web/icons/Icon-512.png b/app/web/icons/Icon-512.png index 42c2b079728927d87c90540d20d5f125a4ab5d6c..88cfd48dff1169879ba46840804b412fe02fefd6 100644 GIT binary patch literal 8252 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 literal 4747 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 X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! literal 3620 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 MF0x1Ej!@=*04sLD{{R30 diff --git a/app/web/icons/Icon-maskable-512.png b/app/web/icons/Icon-maskable-512.png index f099852db4e68157cfceec50bf4e10605f011562..d69c56691fbdb0b7efa65097c7cc1edac12a6d3e 100644 GIT binary patch literal 20998 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 MPgg&ebxsLQ025IeI{*Lx literal 10934 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 - + - Linwood Qeck + quokka - - - - - + diff --git a/app/web/manifest.json b/app/web/manifest.json index 38ee7fd..2b4b6e6 100644 --- a/app/web/manifest.json +++ b/app/web/manifest.json @@ -1,6 +1,6 @@ { - "name": "Linwood Qeck", - "short_name": "Qeck", + "name": "Linwood Quokka", + "short_name": "Quokka", "start_url": ".", "display": "standalone", "background_color": "#0175C2", diff --git a/app/windows/CMakeLists.txt b/app/windows/CMakeLists.txt index cc9e0fa..d894616 100644 --- a/app/windows/CMakeLists.txt +++ b/app/windows/CMakeLists.txt @@ -1,10 +1,10 @@ # Project-level configuration. cmake_minimum_required(VERSION 3.14) -project(qeck LANGUAGES CXX) +project(quokka LANGUAGES CXX) # The name of the executable created for the application. Change this to change # the on-disk name of your application. -set(BINARY_NAME "qeck") +set(BINARY_NAME "quokka") # Explicitly opt in to modern CMake behaviors to avoid warnings with recent # versions of CMake. diff --git a/app/windows/runner/Runner.rc b/app/windows/runner/Runner.rc index b978de3..c8e2b43 100644 --- a/app/windows/runner/Runner.rc +++ b/app/windows/runner/Runner.rc @@ -90,12 +90,12 @@ BEGIN BLOCK "040904e4" BEGIN VALUE "CompanyName", "dev.linwood" "\0" - VALUE "FileDescription", "Linwood Qeck" "\0" + VALUE "FileDescription", "Linwood Quokka" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" - VALUE "InternalName", "Linwood Qeck" "\0" + VALUE "InternalName", "Linwood Quokka" "\0" VALUE "LegalCopyright", "Copyright (C) 2023 dev.linwood. All rights reserved." "\0" - VALUE "OriginalFilename", "qeck.exe" "\0" - VALUE "ProductName", "Linwood Qeck" "\0" + VALUE "OriginalFilename", "quokka.exe" "\0" + VALUE "ProductName", "Linwood Quokka" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" END END diff --git a/app/windows/runner/main.cpp b/app/windows/runner/main.cpp index b49896a..9ae83a6 100644 --- a/app/windows/runner/main.cpp +++ b/app/windows/runner/main.cpp @@ -27,7 +27,7 @@ int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, FlutterWindow window(project); Win32Window::Point origin(10, 10); Win32Window::Size size(1280, 720); - if (!window.Create(L"qeck", origin, size)) { + if (!window.Create(L"Quokka", origin, size)) { return EXIT_FAILURE; } window.SetQuitOnClose(true); diff --git a/app/windows/runner/utils.cpp b/app/windows/runner/utils.cpp index b2b0873..3a0b465 100644 --- a/app/windows/runner/utils.cpp +++ b/app/windows/runner/utils.cpp @@ -45,13 +45,13 @@ std::string Utf8FromUtf16(const wchar_t* utf16_string) { if (utf16_string == nullptr) { return std::string(); } - int target_length = ::WideCharToMultiByte( + unsigned int target_length = ::WideCharToMultiByte( CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, -1, nullptr, 0, nullptr, nullptr) -1; // remove the trailing null character int input_length = (int)wcslen(utf16_string); std::string utf8_string; - if (target_length <= 0 || target_length > utf8_string.max_size()) { + if (target_length == 0 || target_length > utf8_string.max_size()) { return utf8_string; } utf8_string.resize(target_length); diff --git a/docs/community/branding.md b/docs/community/branding.md index 889470d..6c3bc8b 100644 --- a/docs/community/branding.md +++ b/docs/community/branding.md @@ -2,7 +2,7 @@ title: Branding --- -These assets are licensed under the [CC-BY-4.0](https://github.com/LinwoodDev/Qeck/blob/develop/BRANDING_LICENSE). +These assets are licensed under the [CC-BY-4.0](https://github.com/LinwoodDev/Quokka/blob/develop/BRANDING_LICENSE). ## Fonts diff --git a/docs/community/downloads/android.md b/docs/community/downloads/android.md index 6790f9c..962d7ba 100644 --- a/docs/community/downloads/android.md +++ b/docs/community/downloads/android.md @@ -7,8 +7,8 @@ sidebar_position: 4 import DownloadButton from '@site/src/components/DownloadButton.tsx'; ``` -![Stable release version](https://img.shields.io/badge/dynamic/yaml?color=c4840d&label=Stable&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fstable%2Fapp%2Fpubspec.yaml&style=for-the-badge) -![Nightly release version](https://img.shields.io/badge/dynamic/yaml?color=f7d28c&label=Nightly&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fnightly%2Fapp%2Fpubspec.yaml&style=for-the-badge) +![Stable release version](https://img.shields.io/badge/dynamic/yaml?color=c4840d&label=Stable&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fquokka%2Fstable%2Fapp%2Fpubspec.yaml&style=for-the-badge) +![Nightly release version](https://img.shields.io/badge/dynamic/yaml?color=f7d28c&label=Nightly&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fquokka%2Fnightly%2Fapp%2Fpubspec.yaml&style=for-the-badge) ## Minimum system requirements @@ -17,27 +17,27 @@ import DownloadButton from '@site/src/components/DownloadButton.tsx'; ## Binaries
- + Stable - + Nightly
-Read more about the nightly version of Qeck [here](/nightly). +Read more about the nightly version of Quokka [here](/nightly). ## Stores
## The beta program on play store -Click on [this link](https://play.google.com/apps/testing/dev.linwood.qeck) to register for the [nightly](/nightly) version of the app. Please note that this version can have bugs. The play store version will automatically be updated when a new nightly version is released. +Click on [this link](https://play.google.com/apps/testing/dev.linwood.quokka) to register for the [nightly](/nightly) version of the app. Please note that this version can have bugs. The play store version will automatically be updated when a new nightly version is released. diff --git a/docs/community/downloads/download.md b/docs/community/downloads/download.md index 1eed86b..ec6820e 100644 --- a/docs/community/downloads/download.md +++ b/docs/community/downloads/download.md @@ -4,8 +4,8 @@ sidebar_position: 0 title: Downloads --- -![Stable release version](https://img.shields.io/badge/dynamic/yaml?color=c4840d&label=Stable&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fstable%2Fapp%2Fpubspec.yaml&style=for-the-badge) -![Nightly release version](https://img.shields.io/badge/dynamic/yaml?color=f7d28c&label=Nightly&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fnightly%2Fapp%2Fpubspec.yaml&style=for-the-badge) +![Stable release version](https://img.shields.io/badge/dynamic/yaml?color=c4840d&label=Stable&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fquokka%2Fstable%2Fapp%2Fpubspec.yaml&style=for-the-badge) +![Nightly release version](https://img.shields.io/badge/dynamic/yaml?color=f7d28c&label=Nightly&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fquokka%2Fnightly%2Fapp%2Fpubspec.yaml&style=for-the-badge) ## Choose your platform @@ -44,6 +44,6 @@ title: Downloads ## Useful links - [Changelog](changelog) -- [Older releases](https://github.com/LinwoodDev/qeck/releases) -- [Latest release](https://github.com/LinwoodDev/qeck/releases/latest) +- [Older releases](https://github.com/LinwoodDev/quokka/releases) +- [Latest release](https://github.com/LinwoodDev/quokka/releases/latest) - [Support](https://discord.linwood.dev) \ No newline at end of file diff --git a/docs/community/downloads/linux.md b/docs/community/downloads/linux.md index ca21986..d7fcff2 100644 --- a/docs/community/downloads/linux.md +++ b/docs/community/downloads/linux.md @@ -7,8 +7,8 @@ sidebar_position: 3 import DownloadButton from '@site/src/components/DownloadButton.tsx'; ``` -![Stable release version](https://img.shields.io/badge/dynamic/yaml?color=c4840d&label=Stable&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fstable%2Fapp%2Fpubspec.yaml&style=for-the-badge) -![Nightly release version](https://img.shields.io/badge/dynamic/yaml?color=f7d28c&label=Nightly&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fnightly%2Fapp%2Fpubspec.yaml&style=for-the-badge) +![Stable release version](https://img.shields.io/badge/dynamic/yaml?color=c4840d&label=Stable&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fquokka%2Fstable%2Fapp%2Fpubspec.yaml&style=for-the-badge) +![Nightly release version](https://img.shields.io/badge/dynamic/yaml?color=f7d28c&label=Nightly&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fquokka%2Fnightly%2Fapp%2Fpubspec.yaml&style=for-the-badge) :::note @@ -24,17 +24,17 @@ Otherwise you need to install `libsecret-1-dev` and `libjsoncpp-dev`.
  • - + Portable
  • - + DEB
  • - + AppImage
  • @@ -44,17 +44,17 @@ Otherwise you need to install `libsecret-1-dev` and `libjsoncpp-dev`.
    • - + Portable
    • - + DEB
    • - + AppImage
    • @@ -62,15 +62,15 @@ Otherwise you need to install `libsecret-1-dev` and `libjsoncpp-dev`. -Read more about the nightly version of Qeck [here](/nightly). +Read more about the nightly version of Quokka [here](/nightly). ## Stores diff --git a/docs/community/downloads/macos.md b/docs/community/downloads/macos.md index 78950e7..524e95f 100644 --- a/docs/community/downloads/macos.md +++ b/docs/community/downloads/macos.md @@ -3,13 +3,13 @@ title: "MacOS" sidebar_position: 5 --- -![Stable release version](https://img.shields.io/badge/dynamic/yaml?color=c4840d&label=Stable&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fstable%2Fapp%2Fpubspec.yaml&style=for-the-badge) -![Nightly release version](https://img.shields.io/badge/dynamic/yaml?color=f7d28c&label=Nightly&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fnightly%2Fapp%2Fpubspec.yaml&style=for-the-badge) +![Stable release version](https://img.shields.io/badge/dynamic/yaml?color=c4840d&label=Stable&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fquokka%2Fstable%2Fapp%2Fpubspec.yaml&style=for-the-badge) +![Nightly release version](https://img.shields.io/badge/dynamic/yaml?color=f7d28c&label=Nightly&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fquokka%2Fnightly%2Fapp%2Fpubspec.yaml&style=for-the-badge) ## Links diff --git a/docs/community/downloads/selfhosting.md b/docs/community/downloads/selfhosting.md index e1391a9..4270fa0 100644 --- a/docs/community/downloads/selfhosting.md +++ b/docs/community/downloads/selfhosting.md @@ -3,10 +3,10 @@ title: "Selfhosting" sidebar_position: 5 --- -![Stable release version](https://img.shields.io/badge/dynamic/yaml?color=c4840d&label=Stable&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fstable%2Fapp%2Fpubspec.yaml&style=for-the-badge) -![Nightly release version](https://img.shields.io/badge/dynamic/yaml?color=f7d28c&label=Nightly&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fnightly%2Fapp%2Fpubspec.yaml&style=for-the-badge) +![Stable release version](https://img.shields.io/badge/dynamic/yaml?color=c4840d&label=Stable&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fquokka%2Fstable%2Fapp%2Fpubspec.yaml&style=for-the-badge) +![Nightly release version](https://img.shields.io/badge/dynamic/yaml?color=f7d28c&label=Nightly&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fquokka%2Fnightly%2Fapp%2Fpubspec.yaml&style=for-the-badge) -It is very easy to host your own qeck web server. +It is very easy to host your own quokka web server. ## Simple server @@ -23,6 +23,6 @@ All the files are in the `app/build/web` directory. ## Docker -Clone the repository and build the `Dockerfile` using: `docker build -t linwood-qeck`. -Start the server using: `docker run -p 8080:8080 -d linwood-qeck`. +Clone the repository and build the `Dockerfile` using: `docker build -t linwood-quokka`. +Start the server using: `docker run -p 8080:8080 -d linwood-quokka`. diff --git a/docs/community/downloads/web.md b/docs/community/downloads/web.md index caf52bd..2d6d9eb 100644 --- a/docs/community/downloads/web.md +++ b/docs/community/downloads/web.md @@ -3,8 +3,8 @@ title: "Web" sidebar_position: 5 --- -![Stable release version](https://img.shields.io/badge/dynamic/yaml?color=c4840d&label=Stable&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fstable%2Fapp%2Fpubspec.yaml&style=for-the-badge) -![Nightly release version](https://img.shields.io/badge/dynamic/yaml?color=f7d28c&label=Nightly&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fnightly%2Fapp%2Fpubspec.yaml&style=for-the-badge) +![Stable release version](https://img.shields.io/badge/dynamic/yaml?color=c4840d&label=Stable&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fquokka%2Fstable%2Fapp%2Fpubspec.yaml&style=for-the-badge) +![Nightly release version](https://img.shields.io/badge/dynamic/yaml?color=f7d28c&label=Nightly&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fquokka%2Fnightly%2Fapp%2Fpubspec.yaml&style=for-the-badge) :::note @@ -17,15 +17,15 @@ All data is stored in your browser. ## Links ## Versions -The main and the preview (develop) versions of Qeck are not the same as the stable and nightly versions. +The main and the preview (develop) versions of Quokka are not the same as the stable and nightly versions. They are not directly associated with a release. They are updated as soon as a new commit is pushed to the repository. diff --git a/docs/community/downloads/windows.md b/docs/community/downloads/windows.md index f4de0d5..a34db0d 100644 --- a/docs/community/downloads/windows.md +++ b/docs/community/downloads/windows.md @@ -7,8 +7,8 @@ sidebar_position: 2 import DownloadButton from '@site/src/components/DownloadButton.tsx'; ``` -![Stable release version](https://img.shields.io/badge/dynamic/yaml?color=c4840d&label=Stable&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fstable%2Fapp%2Fpubspec.yaml&style=for-the-badge) -![Nightly release version](https://img.shields.io/badge/dynamic/yaml?color=f7d28c&label=Nightly&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fnightly%2Fapp%2Fpubspec.yaml&style=for-the-badge) +![Stable release version](https://img.shields.io/badge/dynamic/yaml?color=c4840d&label=Stable&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fquokka%2Fstable%2Fapp%2Fpubspec.yaml&style=for-the-badge) +![Nightly release version](https://img.shields.io/badge/dynamic/yaml?color=f7d28c&label=Nightly&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fquokka%2Fnightly%2Fapp%2Fpubspec.yaml&style=for-the-badge) ## Minimum system requirements @@ -21,12 +21,12 @@ import DownloadButton from '@site/src/components/DownloadButton.tsx';
      • - + Setup
      • - + Portable
      • @@ -36,12 +36,12 @@ import DownloadButton from '@site/src/components/DownloadButton.tsx';
        • - + Setup
        • - + Portable
        • @@ -49,4 +49,4 @@ import DownloadButton from '@site/src/components/DownloadButton.tsx'; -Read more about the nightly version of Qeck [here](/nightly). +Read more about the nightly version of Quokka [here](/nightly). diff --git a/docs/community/intro.md b/docs/community/intro.md index fdef2f3..71767c7 100644 --- a/docs/community/intro.md +++ b/docs/community/intro.md @@ -20,6 +20,6 @@ All other licenses can you found in the settings. ## Useful links -* [GitHub](https://github.com/LinwoodDev/Qeck) +* [GitHub](https://github.com/LinwoodDev/Quokka) * [Discord](https://go.linwood.dev/discord) * [Matrix](https://go.linwood.dev/matrix) diff --git a/docs/community/nightly.md b/docs/community/nightly.md index d1e9645..c81b851 100644 --- a/docs/community/nightly.md +++ b/docs/community/nightly.md @@ -5,7 +5,7 @@ slug: "/nightly" :::warning -Do not use the nightly version of Qeck for production. +Do not use the nightly version of Quokka for production. ::: diff --git a/docs/community/privacypolicy.md b/docs/community/privacypolicy.md index 1be53e3..94b6a7c 100644 --- a/docs/community/privacypolicy.md +++ b/docs/community/privacypolicy.md @@ -6,14 +6,14 @@ slug: /privacypolicy This is the privacy policy of the app. Please read it carefully. Click [here](https://go.linwood.dev/privacypolicy) to read the privacy policy of the website. -CodeDoctor built the Qeck app as an Open Source app. This SERVICE is provided by CodeDoctor at no cost and is intended for use as is. +CodeDoctor built the Quokka app as an Open Source app. This SERVICE is provided by CodeDoctor at no cost and is intended for use as is. This page is used to inform visitors regarding my policies with the collection, use, and disclosure of Personal Information if anyone decided to use my Service. If you choose to use my Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that I collect is used for providing and improving the Service. I will not use or share your information with anyone except as described in this Privacy Policy. -The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which is accessible at Qeck unless otherwise defined in this Privacy Policy. +The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which is accessible at Quokka unless otherwise defined in this Privacy Policy. **Information Collection and Use** diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 0ae6ceb..764e40c 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -2,15 +2,15 @@ const redirects = require('./redirects.js'); /** @type {import('@docusaurus/types').DocusaurusConfig} */ module.exports = { - title: 'Linwood Qeck', + title: 'Linwood Quokka', tagline: 'Play games everywhere you like ', - url: 'https://docs.qeck.linwood.dev', + url: 'https://docs.quokka.linwood.dev', baseUrl: '/', onBrokenLinks: 'throw', onBrokenMarkdownLinks: 'warn', favicon: 'img/favicon.ico', organizationName: 'LinwoodDev', // Usually your GitHub org/user name. - projectName: 'Qeck', // Usually your repo name. + projectName: 'Quokka', // Usually your repo name. themeConfig: { colorMode: { defaultMode: 'dark', @@ -18,9 +18,9 @@ module.exports = { respectPrefersColorScheme: true, }, navbar: { - title: 'Qeck', + title: 'Quokka', logo: { - alt: 'Qeck Logo', + alt: 'Quokka Logo', src: 'img/logo.svg', }, items: [ @@ -57,7 +57,7 @@ module.exports = { }, { label: 'GitHub', - href: 'https://github.com/LinwoodDev/Qeck', + href: 'https://github.com/LinwoodDev/Quokka', }, { label: 'Blog', @@ -65,7 +65,7 @@ module.exports = { }, { label: 'Crowdin', - href: 'https://go.linwood.dev/qeck/crowdin' + href: 'https://go.linwood.dev/quokka/crowdin' }, { label: 'Twitter', @@ -73,7 +73,7 @@ module.exports = { }, { label: 'License', - href: 'https://go.linwood.dev/qeck/license', + href: 'https://go.linwood.dev/quokka/license', } ], }, @@ -106,7 +106,7 @@ module.exports = { }, { label: 'Contribution guide', - href: 'https://github.com/LinwoodDev/Qeck/blob/develop/CONTRIBUTING.md', + href: 'https://github.com/LinwoodDev/Quokka/blob/develop/CONTRIBUTING.md', }, { html: ` @@ -122,11 +122,11 @@ module.exports = { items: [ { label: 'App', - href: 'https://github.com/LinwoodDev/Qeck/tree/develop/app', + href: 'https://github.com/LinwoodDev/Quokka/tree/develop/app', }, { label: 'Docs', - href: 'https://github.com/LinwoodDev/Qeck/tree/develop/docs', + href: 'https://github.com/LinwoodDev/Quokka/tree/develop/docs', } ], }, @@ -165,7 +165,7 @@ module.exports = { sidebarPath: require.resolve('./sidebars.js'), // Please change this to your repo. editUrl: - 'https://github.com/LinwoodDev/Qeck/edit/develop/docs/', + 'https://github.com/LinwoodDev/Quokka/edit/develop/docs/', }, blog: false, theme: { diff --git a/docs/generate_meta.mjs b/docs/generate_meta.mjs index 27588bd..c7a810e 100644 --- a/docs/generate_meta.mjs +++ b/docs/generate_meta.mjs @@ -1,8 +1,8 @@ import fetch from 'node-fetch'; import fs from 'fs'; -// Fetch version value fromy yaml file https://raw.githubusercontent.com/LinwoodDev/Qeck/nightly/app/pubspec.yaml -const nightlyUrl = 'https://raw.githubusercontent.com/LinwoodDev/Qeck/develop/app/pubspec.yaml'; +// Fetch version value fromy yaml file https://raw.githubusercontent.com/LinwoodDev/Quokka/nightly/app/pubspec.yaml +const nightlyUrl = 'https://raw.githubusercontent.com/LinwoodDev/Quokka/develop/app/pubspec.yaml'; const nightlyVersion = await fetch(nightlyUrl).then(res => res.text()).then(text => { const regex = /^version:\s(.+)\+(.+)$/gm; const match = regex.exec(text); @@ -11,7 +11,7 @@ const nightlyVersion = await fetch(nightlyUrl).then(res => res.text()).then(text ); // stable -const stableUrl = 'https://raw.githubusercontent.com/LinwoodDev/Qeck/develop/app/pubspec.yaml'; +const stableUrl = 'https://raw.githubusercontent.com/LinwoodDev/Quokka/develop/app/pubspec.yaml'; const stableVersion = await fetch(stableUrl).then(res => res.text()).then(text => { const regex = /^version:\s(.+)\+(.+)$/gm; const match = regex.exec(text); @@ -20,7 +20,7 @@ const stableVersion = await fetch(stableUrl).then(res => res.text()).then(text = ); // develop -const developUrl = 'https://raw.githubusercontent.com/LinwoodDev/Qeck/develop/app/pubspec.yaml'; +const developUrl = 'https://raw.githubusercontent.com/LinwoodDev/Quokka/develop/app/pubspec.yaml'; const developVersion = await fetch(developUrl).then(res => res.text()).then(text => { const regex = /^version:\s(.+)\+(.+)$/gm; const match = regex.exec(text); @@ -29,7 +29,7 @@ const developVersion = await fetch(developUrl).then(res => res.text()).then(text ); // main -const mainUrl = 'https://raw.githubusercontent.com/LinwoodDev/Qeck/main/app/pubspec.yaml'; +const mainUrl = 'https://raw.githubusercontent.com/LinwoodDev/Quokka/main/app/pubspec.yaml'; const mainVersion = await fetch(mainUrl).then(res => res.text()).then(text => { const regex = /^version:\s(.+)\+(.+)$/gm; const match = regex.exec(text); diff --git a/docs/sidebarsCommunity.js b/docs/sidebarsCommunity.js index bcb2272..6f46313 100644 --- a/docs/sidebarsCommunity.js +++ b/docs/sidebarsCommunity.js @@ -28,7 +28,7 @@ module.exports = { }, { type: 'link', - href: 'https://github.com/LinwoodDev/Qeck', + href: 'https://github.com/LinwoodDev/Quokka', label: 'GitHub' } ], diff --git a/tools/pubspec.yaml b/tools/pubspec.yaml index 4f16264..1719b8e 100644 --- a/tools/pubspec.yaml +++ b/tools/pubspec.yaml @@ -1,4 +1,4 @@ -name: qeck_tools +name: quokka_tools environment: sdk: ">=2.13.0 <3.0.0" dependencies: